diff --git a/README.md b/README.md index 97b8db0..3c9f8a0 100644 --- a/README.md +++ b/README.md @@ -10,19 +10,19 @@ A fancy, easy-to-use and reactive docker `compose.yaml` stack manager. ## ⭐ Features -- Focus on `compose.yaml` stack management -- Interactive editor for `compose.yaml` -- Interactive web terminal for containers and docker commands +- Manage `compose.yaml` +- Interactive Editor for `compose.yaml` +- Interactive Web Terminal - Reactive - - Everything is just responsive. Progress and terminal output are in real-time + - Everything is just responsive. Progress (Pull/Up/Down) and terminal output are in real-time - Easy-to-use & fancy UI - If you love Uptime Kuma's UI/UX, you will love this too -- Convert `docker run ...` command into `compose.yaml` file +- Convert `docker run ...` commands into `compose.yaml` ## 🔧 How to Install -1. Create a directory `./dockge/` -1. Create a `compose.yaml` file inside `./dockge` with the following content: +1. Create a directory `dockge` +1. Create a `compose.yaml` file inside `dockge` with the following content: ```yaml version: "3.8" diff --git a/backend/dockge-server.ts b/backend/dockge-server.ts index befad03..0a49525 100644 --- a/backend/dockge-server.ts +++ b/backend/dockge-server.ts @@ -27,7 +27,7 @@ import path from "path"; import { TerminalSocketHandler } from "./socket-handlers/terminal-socket-handler"; import { Stack } from "./stack"; import { Cron } from "croner"; -import childProcess from "child_process"; +import gracefulShutdown from "http-graceful-shutdown"; export class DockgeServer { app : Express; @@ -260,6 +260,16 @@ export class DockgeServer { }); }); + + gracefulShutdown(this.httpServer, { + signals: "SIGINT SIGTERM", + timeout: 30000, // timeout: 30 secs + development: false, // not in dev mode + forceExit: true, // triggers process.exit() at the end of shutdown process + onShutdown: this.shutdownFunction, // shutdown function (async) - e.g. for cleanup DB, ... + finally: this.finalFunction, // finally function (sync) - e.g. for logging + }); + } /** @@ -280,12 +290,12 @@ export class DockgeServer { } socket.emit("info", { - versionProperty, - latestVersionProperty, + version: versionProperty, + latestVersion: latestVersionProperty, isContainer, - primaryBaseURL: await Settings.get("primaryBaseURL"), - serverTimezone: await this.getTimezone(), - serverTimezoneOffset: this.getTimezoneOffset(), + //primaryBaseURL: await Settings.get("primaryBaseURL"), + //serverTimezone: await this.getTimezone(), + //serverTimezoneOffset: this.getTimezoneOffset(), }); } @@ -472,4 +482,26 @@ export class DockgeServer { get stackDirFullPath() { return path.resolve(this.stacksDir); } + + /** + * Shutdown the application + * Stops all monitors and closes the database connection. + * @param signal The signal that triggered this function to be called. + */ + async shutdownFunction(signal : string | undefined) { + log.info("server", "Shutdown requested"); + log.info("server", "Called signal: " + signal); + + // TODO: Close all terminals? + + await Database.close(); + Settings.stopCacheCleaner(); + } + + /** + * Final function called before application exits + */ + finalFunction() { + log.info("server", "Graceful shutdown successful!"); + } } diff --git a/backend/socket-handlers/main-socket-handler.ts b/backend/socket-handlers/main-socket-handler.ts index fa00f2b..601b2a2 100644 --- a/backend/socket-handlers/main-socket-handler.ts +++ b/backend/socket-handlers/main-socket-handler.ts @@ -6,9 +6,10 @@ import { R } from "redbean-node"; import { loginRateLimiter, twoFaRateLimiter } from "../rate-limiter"; import { generatePasswordHash, needRehashPassword, shake256, SHAKE256_LENGTH, verifyPassword } from "../password-hash"; import { User } from "../models/user"; -import { DockgeSocket } from "../util-server"; +import { checkLogin, DockgeSocket, doubleCheckPassword } from "../util-server"; import { passwordStrength } from "check-password-strength"; import jwt from "jsonwebtoken"; +import { Settings } from "../settings"; export class MainSocketHandler extends SocketHandler { create(socket : DockgeSocket, server : DockgeServer) { @@ -187,12 +188,63 @@ export class MainSocketHandler extends SocketHandler { } }); + + socket.on("getSettings", async (callback) => { + try { + checkLogin(socket); + const data = await Settings.getSettings("general"); + + callback({ + ok: true, + data: data, + }); + + } catch (e) { + callback({ + ok: false, + msg: e.message, + }); + } + }); + + socket.on("setSettings", async (data, currentPassword, callback) => { + try { + checkLogin(socket); + + // If currently is disabled auth, don't need to check + // Disabled Auth + Want to Disable Auth => No Check + // Disabled Auth + Want to Enable Auth => No Check + // Enabled Auth + Want to Disable Auth => Check!! + // Enabled Auth + Want to Enable Auth => No Check + const currentDisabledAuth = await Settings.get("disableAuth"); + if (!currentDisabledAuth && data.disableAuth) { + await doubleCheckPassword(socket, currentPassword); + } + + await Settings.setSettings("general", data); + + callback({ + ok: true, + msg: "Saved" + }); + + server.sendInfo(socket); + + } catch (e) { + callback({ + ok: false, + msg: e.message, + }); + } + }); } async afterLogin(server: DockgeServer, socket : DockgeSocket, user : User) { socket.userID = user.id; socket.join(user.id.toString()); + server.sendInfo(socket); + try { server.sendStackList(socket); } catch (e) { diff --git a/backend/stack.ts b/backend/stack.ts index 1944c3d..87ea305 100644 --- a/backend/stack.ts +++ b/backend/stack.ts @@ -198,6 +198,13 @@ export class Stack { let composeList = JSON.parse(res.toString()); for (let composeStack of composeList) { + + // Skip the dockge stack + // TODO: Could be self managed? + if (composeStack.Name === "dockge") { + continue; + } + let stack = stackList.get(composeStack.Name); // This stack probably is not managed by Dockge, but we still want to show it diff --git a/backend/util-server.ts b/backend/util-server.ts index 2da3f11..5dc12e9 100644 --- a/backend/util-server.ts +++ b/backend/util-server.ts @@ -3,6 +3,8 @@ import { Terminal } from "./terminal"; import { randomBytes } from "crypto"; import { log } from "./log"; import { ERROR_TYPE_VALIDATION } from "./util-common"; +import { R } from "redbean-node"; +import { verifyPassword } from "./password-hash"; export interface DockgeSocket extends Socket { userID: number; @@ -57,3 +59,19 @@ export function callbackError(error : unknown, callback : unknown) { log.debug("console", "Unknown error: " + error); } } + +export async function doubleCheckPassword(socket : DockgeSocket, currentPassword : unknown) { + if (typeof currentPassword !== "string") { + throw new Error("Wrong data type?"); + } + + let user = await R.findOne("user", " id = ? AND active = 1 ", [ + socket.userID, + ]); + + if (!user || !verifyPassword(currentPassword, user.password)) { + throw new Error("Incorrect current password"); + } + + return user; +} diff --git a/frontend/src/components/Container.vue b/frontend/src/components/Container.vue index 1e0bb68..ce1b936 100644 --- a/frontend/src/components/Container.vue +++ b/frontend/src/components/Container.vue @@ -12,7 +12,7 @@
- + Bash diff --git a/frontend/src/lang/en.json b/frontend/src/lang/en.json index 4ab9421..3aa0ce2 100644 --- a/frontend/src/lang/en.json +++ b/frontend/src/lang/en.json @@ -41,5 +41,7 @@ "addListItem": "Add {0}", "deleteContainer": "Delete", "addContainer": "Add Container", - "addNetwork": "Add Network" + "addNetwork": "Add Network", + "disableauth.message1": "Are you sure want to disable authentication?", + "disableauth.message2": "It is designed for scenarios where you intend to implement third-party authentication in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms." } diff --git a/frontend/src/mixins/socket.ts b/frontend/src/mixins/socket.ts index 83666f0..21d65bb 100644 --- a/frontend/src/mixins/socket.ts +++ b/frontend/src/mixins/socket.ts @@ -39,11 +39,41 @@ export default defineComponent({ return "🐻"; } }, + + /** + * Frontend Version + * It should be compiled to a static value while building the frontend. + * Please see ./frontend/vite.config.ts, it is defined via vite.js + * @returns {string} + */ + frontendVersion() { + // eslint-disable-next-line no-undef + return FRONTEND_VERSION; + }, + + /** + * Are both frontend and backend in the same version? + * @returns {boolean} + */ + isFrontendBackendVersionMatched() { + if (!this.info.version) { + return true; + } + return this.info.version === this.frontendVersion; + }, + }, watch: { remember() { localStorage.remember = (this.remember) ? "1" : "0"; }, + + // Reload the SPA if the server version is changed. + "info.version"(to, from) { + if (from && from !== to) { + window.location.reload(); + } + }, }, created() { this.initSocketIO(); @@ -247,6 +277,7 @@ export default defineComponent({ unbindTerminal(terminalName : string) { terminalMap.delete(terminalName); - } + }, + } }); diff --git a/frontend/src/pages/Settings.vue b/frontend/src/pages/Settings.vue index c5ac408..e25cac7 100644 --- a/frontend/src/pages/Settings.vue +++ b/frontend/src/pages/Settings.vue @@ -117,39 +117,9 @@ export default { loadSettings() { this.$root.getSocket().emit("getSettings", (res) => { this.settings = res.data; - if (this.settings.checkUpdate === undefined) { this.settings.checkUpdate = true; } - - if (this.settings.searchEngineIndex === undefined) { - this.settings.searchEngineIndex = false; - } - - if (this.settings.entryPage === undefined) { - this.settings.entryPage = "dashboard"; - } - - if (this.settings.nscd === undefined) { - this.settings.nscd = true; - } - - if (this.settings.dnsCache === undefined) { - this.settings.dnsCache = false; - } - - if (this.settings.keepDataPeriodDays === undefined) { - this.settings.keepDataPeriodDays = 180; - } - - if (this.settings.tlsExpiryNotifyDays === undefined) { - this.settings.tlsExpiryNotifyDays = [ 7, 14, 21 ]; - } - - if (this.settings.trustProxy === undefined) { - this.settings.trustProxy = false; - } - this.settingsLoaded = true; }); }, diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 5521b42..a640d82 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -12,6 +12,9 @@ export default defineConfig({ server: { port: 5000, }, + define: { + "FRONTEND_VERSION": JSON.stringify(process.env.npm_package_version), + }, root: "./frontend", build: { outDir: "../frontend-dist", diff --git a/package.json b/package.json index 638a775..f1a6a97 100644 --- a/package.json +++ b/package.json @@ -16,22 +16,23 @@ "mark-as-nightly": "tsx ./extra/mark-as-nightly.ts" }, "dependencies": { - "@homebridge/node-pty-prebuilt-multiarch": "~0.11.7", + "@homebridge/node-pty-prebuilt-multiarch": "~0.11.10", "@louislam/sqlite3": "~15.1.6", "bcryptjs": "~2.4.3", "check-password-strength": "~2.0.7", - "command-exists": "^1.2.9", + "command-exists": "~1.2.9", "compare-versions": "~6.1.0", - "composerize": "^1.4.1", - "croner": "^7.0.4", - "dayjs": "^1.11.10", + "composerize": "~1.4.1", + "croner": "~7.0.4", + "dayjs": "~1.11.10", "express": "~4.18.2", "express-static-gzip": "~2.1.7", + "http-graceful-shutdown": "~3.1.13", "jsonwebtoken": "~9.0.2", "jwt-decode": "~3.1.2", "knex": "~2.5.1", "limiter-es6-compat": "~2.1.2", - "mysql2": "^3.6.2", + "mysql2": "^3.6.3", "redbean-node": "0.3.1", "socket.io": "~4.7.2", "socket.io-client": "~4.7.2", @@ -39,7 +40,7 @@ "ts-command-line-args": "~2.5.1", "tsx": "~3.14.0", "type-fest": "~4.3.3", - "yaml": "~2.3.3" + "yaml": "~2.3.4" }, "optionalDependencies": { "pm2": "~5.3.0" @@ -50,8 +51,8 @@ "@fortawesome/free-solid-svg-icons": "6.4.2", "@fortawesome/vue-fontawesome": "3.0.3", "@types/bootstrap": "^5.2.8", - "@types/command-exists": "~1.2.2", - "@types/express": "~4.17.20", + "@types/command-exists": "~1.2.3", + "@types/express": "~4.17.21", "@types/jsonwebtoken": "~9.0.4", "@typescript-eslint/eslint-plugin": "~6.8.0", "@typescript-eslint/parser": "~6.8.0", @@ -70,13 +71,13 @@ "unplugin-vue-components": "^0.25.2", "vite": "~4.5.0", "vite-plugin-compression": "^0.5.1", - "vue": "~3.3.6", + "vue": "~3.3.8", "vue-eslint-parser": "^9.3.2", "vue-i18n": "~9.5.0", - "vue-prism-editor": "~2.0.0-alpha.2", + "vue-prism-editor": "2.0.0-alpha.2", "vue-qrcode": "^2.2.0", "vue-router": "~4.2.5", - "vue-toastification": "~2.0.0-rc.5", + "vue-toastification": "2.0.0-rc.5", "xterm": "~5.3.0", "xterm-addon-web-links": "~0.9.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c93895..315e13d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@homebridge/node-pty-prebuilt-multiarch': - specifier: ~0.11.7 - version: 0.11.7 + specifier: ~0.11.10 + version: 0.11.10 '@louislam/sqlite3': specifier: ~15.1.6 version: 15.1.6 @@ -18,19 +18,19 @@ dependencies: specifier: ~2.0.7 version: 2.0.7 command-exists: - specifier: ^1.2.9 + specifier: ~1.2.9 version: 1.2.9 compare-versions: specifier: ~6.1.0 version: 6.1.0 composerize: - specifier: ^1.4.1 + specifier: ~1.4.1 version: 1.4.1 croner: - specifier: ^7.0.4 + specifier: ~7.0.4 version: 7.0.4 dayjs: - specifier: ^1.11.10 + specifier: ~1.11.10 version: 1.11.10 express: specifier: ~4.18.2 @@ -38,6 +38,9 @@ dependencies: express-static-gzip: specifier: ~2.1.7 version: 2.1.7 + http-graceful-shutdown: + specifier: ~3.1.13 + version: 3.1.13 jsonwebtoken: specifier: ~9.0.2 version: 9.0.2 @@ -46,16 +49,16 @@ dependencies: version: 3.1.2 knex: specifier: ~2.5.1 - version: 2.5.1(mysql2@3.6.2) + version: 2.5.1(mysql2@3.6.3) limiter-es6-compat: specifier: ~2.1.2 version: 2.1.2 mysql2: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.6.3 + version: 3.6.3 redbean-node: specifier: 0.3.1 - version: 0.3.1(mysql2@3.6.2) + version: 0.3.1(mysql2@3.6.3) socket.io: specifier: ~4.7.2 version: 4.7.2 @@ -75,8 +78,8 @@ dependencies: specifier: ~4.3.3 version: 4.3.3 yaml: - specifier: ~2.3.3 - version: 2.3.3 + specifier: ~2.3.4 + version: 2.3.4 optionalDependencies: pm2: @@ -95,16 +98,16 @@ devDependencies: version: 6.4.2 '@fortawesome/vue-fontawesome': specifier: 3.0.3 - version: 3.0.3(@fortawesome/fontawesome-svg-core@6.4.2)(vue@3.3.6) + version: 3.0.3(@fortawesome/fontawesome-svg-core@6.4.2)(vue@3.3.8) '@types/bootstrap': specifier: ^5.2.8 version: 5.2.8 '@types/command-exists': - specifier: ~1.2.2 - version: 1.2.2 + specifier: ~1.2.3 + version: 1.2.3 '@types/express': - specifier: ~4.17.20 - version: 4.17.20 + specifier: ~4.17.21 + version: 4.17.21 '@types/jsonwebtoken': specifier: ~9.0.4 version: 9.0.4 @@ -116,13 +119,13 @@ devDependencies: version: 6.8.0(eslint@8.50.0)(typescript@5.2.2) '@vitejs/plugin-vue': specifier: ~4.3.4 - version: 4.3.4(vite@4.5.0)(vue@3.3.6) + version: 4.3.4(vite@4.5.0)(vue@3.3.8) bootstrap: specifier: 5.3.2 version: 5.3.2(@popperjs/core@2.11.8) bootstrap-vue-next: specifier: ~0.14.10 - version: 0.14.10(vue@3.3.6) + version: 0.14.10(vue@3.3.8) cross-env: specifier: ~7.0.3 version: 7.0.3 @@ -152,7 +155,7 @@ devDependencies: version: 5.2.2 unplugin-vue-components: specifier: ^0.25.2 - version: 0.25.2(vue@3.3.6) + version: 0.25.2(vue@3.3.8) vite: specifier: ~4.5.0 version: 4.5.0(sass@1.68.0) @@ -160,26 +163,26 @@ devDependencies: specifier: ^0.5.1 version: 0.5.1(vite@4.5.0) vue: - specifier: ~3.3.6 - version: 3.3.6(typescript@5.2.2) + specifier: ~3.3.8 + version: 3.3.8(typescript@5.2.2) vue-eslint-parser: specifier: ^9.3.2 version: 9.3.2(eslint@8.50.0) vue-i18n: specifier: ~9.5.0 - version: 9.5.0(vue@3.3.6) + version: 9.5.0(vue@3.3.8) vue-prism-editor: - specifier: ~2.0.0-alpha.2 - version: 2.0.0-alpha.2(vue@3.3.6) + specifier: 2.0.0-alpha.2 + version: 2.0.0-alpha.2(vue@3.3.8) vue-qrcode: specifier: ^2.2.0 - version: 2.2.0(qrcode@1.5.3)(vue@3.3.6) + version: 2.2.0(qrcode@1.5.3)(vue@3.3.8) vue-router: specifier: ~4.2.5 - version: 4.2.5(vue@3.3.6) + version: 4.2.5(vue@3.3.8) vue-toastification: - specifier: ~2.0.0-rc.5 - version: 2.0.0-rc.5(vue@3.3.6) + specifier: 2.0.0-rc.5 + version: 2.0.0-rc.5(vue@3.3.8) xterm: specifier: ~5.3.0 version: 5.3.0 @@ -420,13 +423,13 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.9.1: - resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -464,11 +467,11 @@ packages: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: true - /@floating-ui/vue@1.0.2(vue@3.3.6): + /@floating-ui/vue@1.0.2(vue@3.3.8): resolution: {integrity: sha512-sImlAl9mAoCKZLNlwWz2P2ZMJIDlOEDXrRD6aD2sIHAka1LPC+nWtB+D3lPe7IE7FGWSbwBPTnlSdlABa3Fr0A==} dependencies: '@floating-ui/dom': 1.5.3 - vue-demi: 0.14.6(vue@3.3.6) + vue-demi: 0.14.6(vue@3.3.8) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -504,14 +507,14 @@ packages: '@fortawesome/fontawesome-common-types': 6.4.2 dev: true - /@fortawesome/vue-fontawesome@3.0.3(@fortawesome/fontawesome-svg-core@6.4.2)(vue@3.3.6): + /@fortawesome/vue-fontawesome@3.0.3(@fortawesome/fontawesome-svg-core@6.4.2)(vue@3.3.8): resolution: {integrity: sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==} peerDependencies: '@fortawesome/fontawesome-svg-core': ~1 || ~6 vue: '>= 3.0.0 < 4' dependencies: '@fortawesome/fontawesome-svg-core': 6.4.2 - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true /@gar/promisify@1.1.3: @@ -520,8 +523,8 @@ packages: dev: false optional: true - /@homebridge/node-pty-prebuilt-multiarch@0.11.7: - resolution: {integrity: sha512-aaw66RDwHZ2Xs821U6hwEl2wPDyv9PAWEzNxS32YSRaoYmbie1AREehAfjbASGgpub+7d+3l98xft3oCCUKhSw==} + /@homebridge/node-pty-prebuilt-multiarch@0.11.10: + resolution: {integrity: sha512-ttOE8QQRq/aRXDoKD2rfYEF50AiDLM9LPTohqCog1Z78g8k3Zqk15R/EHfTl/8cfw4l0fxt3y0dWL56wq79p2A==} requiresBuild: true dependencies: nan: 2.18.0 @@ -709,7 +712,7 @@ packages: resolution: {integrity: sha512-xkqqCoTf5VsciMqN0vb9jthW7olVAi4KRFNddCc7ZkeJZ3i8QwZANr4NSH2H5DvseRFHq7MiPspRY/EWAFWWTg==} requiresBuild: true dependencies: - async: 3.2.4 + async: 3.2.5 chalk: 3.0.0 dayjs: 1.8.36 debug: 4.3.4 @@ -789,7 +792,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 dev: true @@ -811,11 +814,11 @@ packages: dev: false optional: true - /@types/body-parser@1.19.4: - resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: - '@types/connect': 3.4.37 - '@types/node': 20.8.7 + '@types/connect': 3.4.38 + '@types/node': 20.8.10 dev: true /@types/bootstrap@5.2.8: @@ -824,44 +827,44 @@ packages: '@popperjs/core': 2.11.8 dev: true - /@types/command-exists@1.2.2: - resolution: {integrity: sha512-1qKPTkjLmghE5C7UUHXGcLaG8MNftchOcLAIryUXNKahRO5beS+iJ9rIL8XD4+B8K2phjYUsPQDox1FRX4KMTQ==} + /@types/command-exists@1.2.3: + resolution: {integrity: sha512-PpbaE2XWLaWYboXD6k70TcXO/OdOyyRFq5TVpmlUELNxdkkmXU9fkImNosmXU1DtsNrqdUgWd/nJQYXgwmtdXQ==} dev: true - /@types/connect@3.4.37: - resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.8.7 + '@types/node': 20.8.10 dev: true /@types/cookie@0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} dev: false - /@types/cors@2.8.15: - resolution: {integrity: sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==} + /@types/cors@2.8.16: + resolution: {integrity: sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==} dependencies: - '@types/node': 20.8.7 + '@types/node': 20.8.10 dev: false - /@types/estree@1.0.3: - resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/express-serve-static-core@4.17.39: - resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} dependencies: - '@types/node': 20.8.7 + '@types/node': 20.8.10 '@types/qs': 6.9.9 '@types/range-parser': 1.2.6 '@types/send': 0.17.3 dev: true - /@types/express@4.17.20: - resolution: {integrity: sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==} + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: - '@types/body-parser': 1.19.4 - '@types/express-serve-static-core': 4.17.39 + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 '@types/qs': 6.9.9 '@types/serve-static': 1.15.4 dev: true @@ -877,7 +880,7 @@ packages: /@types/jsonwebtoken@9.0.4: resolution: {integrity: sha512-8UYapdmR0QlxgvJmyE8lP7guxD0UGVMfknsdtCFZh4ovShdBl3iOI4zdvqBHrB/IS+xUj3PSx73Qkey1fhWz+g==} dependencies: - '@types/node': 20.8.7 + '@types/node': 20.8.10 dev: true /@types/mime@1.3.4: @@ -892,10 +895,10 @@ packages: resolution: {integrity: sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==} dev: false - /@types/node@20.8.7: - resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==} + /@types/node@20.8.10: + resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} dependencies: - undici-types: 5.25.3 + undici-types: 5.26.5 /@types/qs@6.9.9: resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} @@ -913,7 +916,7 @@ packages: resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} dependencies: '@types/mime': 1.3.4 - '@types/node': 20.8.7 + '@types/node': 20.8.10 dev: true /@types/serve-static@1.15.4: @@ -921,7 +924,7 @@ packages: dependencies: '@types/http-errors': 2.0.3 '@types/mime': 3.0.3 - '@types/node': 20.8.7 + '@types/node': 20.8.10 dev: true /@types/web-bluetooth@0.0.18: @@ -939,7 +942,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.1 + '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.8.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.8.0 '@typescript-eslint/type-utils': 6.8.0(eslint@8.50.0)(typescript@5.2.2) @@ -1059,7 +1062,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@vitejs/plugin-vue@4.3.4(vite@4.5.0)(vue@3.3.6): + /@vitejs/plugin-vue@4.3.4(vite@4.5.0)(vue@3.3.8): resolution: {integrity: sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1067,103 +1070,103 @@ packages: vue: ^3.2.25 dependencies: vite: 4.5.0(sass@1.68.0) - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true - /@vue/compiler-core@3.3.6: - resolution: {integrity: sha512-2JNjemwaNwf+MkkatATVZi7oAH1Hx0B04DdPH3ZoZ8vKC1xZVP7nl4HIsk8XYd3r+/52sqqoz9TWzYc3yE9dqA==} + /@vue/compiler-core@3.3.8: + resolution: {integrity: sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==} dependencies: '@babel/parser': 7.23.0 - '@vue/shared': 3.3.6 + '@vue/shared': 3.3.8 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: true - /@vue/compiler-dom@3.3.6: - resolution: {integrity: sha512-1MxXcJYMHiTPexjLAJUkNs/Tw2eDf2tY3a0rL+LfuWyiKN2s6jvSwywH3PWD8bKICjfebX3GWx2Os8jkRDq3Ng==} + /@vue/compiler-dom@3.3.8: + resolution: {integrity: sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==} dependencies: - '@vue/compiler-core': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-core': 3.3.8 + '@vue/shared': 3.3.8 dev: true - /@vue/compiler-sfc@3.3.6: - resolution: {integrity: sha512-/Kms6du2h1VrXFreuZmlvQej8B1zenBqIohP0690IUBkJjsFvJxY0crcvVRJ0UhMgSR9dewB+khdR1DfbpArJA==} + /@vue/compiler-sfc@3.3.8: + resolution: {integrity: sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==} dependencies: '@babel/parser': 7.23.0 - '@vue/compiler-core': 3.3.6 - '@vue/compiler-dom': 3.3.6 - '@vue/compiler-ssr': 3.3.6 - '@vue/reactivity-transform': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-core': 3.3.8 + '@vue/compiler-dom': 3.3.8 + '@vue/compiler-ssr': 3.3.8 + '@vue/reactivity-transform': 3.3.8 + '@vue/shared': 3.3.8 estree-walker: 2.0.2 magic-string: 0.30.5 postcss: 8.4.31 source-map-js: 1.0.2 dev: true - /@vue/compiler-ssr@3.3.6: - resolution: {integrity: sha512-QTIHAfDCHhjXlYGkUg5KH7YwYtdUM1vcFl/FxFDlD6d0nXAmnjizka3HITp8DGudzHndv2PjKVS44vqqy0vP4w==} + /@vue/compiler-ssr@3.3.8: + resolution: {integrity: sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==} dependencies: - '@vue/compiler-dom': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-dom': 3.3.8 + '@vue/shared': 3.3.8 dev: true /@vue/devtools-api@6.5.1: resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==} dev: true - /@vue/reactivity-transform@3.3.6: - resolution: {integrity: sha512-RlJl4dHfeO7EuzU1iJOsrlqWyJfHTkJbvYz/IOJWqu8dlCNWtxWX377WI0VsbAgBizjwD+3ZjdnvSyyFW1YVng==} + /@vue/reactivity-transform@3.3.8: + resolution: {integrity: sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==} dependencies: '@babel/parser': 7.23.0 - '@vue/compiler-core': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/compiler-core': 3.3.8 + '@vue/shared': 3.3.8 estree-walker: 2.0.2 magic-string: 0.30.5 dev: true - /@vue/reactivity@3.3.6: - resolution: {integrity: sha512-gtChAumfQz5lSy5jZXfyXbKrIYPf9XEOrIr6rxwVyeWVjFhJwmwPLtV6Yis+M9onzX++I5AVE9j+iPH60U+B8Q==} + /@vue/reactivity@3.3.8: + resolution: {integrity: sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==} dependencies: - '@vue/shared': 3.3.6 + '@vue/shared': 3.3.8 dev: true - /@vue/runtime-core@3.3.6: - resolution: {integrity: sha512-qp7HTP1iw1UW2ZGJ8L3zpqlngrBKvLsDAcq5lA6JvEXHmpoEmjKju7ahM9W2p/h51h0OT5F2fGlP/gMhHOmbUA==} + /@vue/runtime-core@3.3.8: + resolution: {integrity: sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==} dependencies: - '@vue/reactivity': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/reactivity': 3.3.8 + '@vue/shared': 3.3.8 dev: true - /@vue/runtime-dom@3.3.6: - resolution: {integrity: sha512-AoX3Cp8NqMXjLbIG9YR6n/pPLWE9TiDdk6wTJHFnl2GpHzDFH1HLBC9wlqqQ7RlnvN3bVLpzPGAAH00SAtOxHg==} + /@vue/runtime-dom@3.3.8: + resolution: {integrity: sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==} dependencies: - '@vue/runtime-core': 3.3.6 - '@vue/shared': 3.3.6 + '@vue/runtime-core': 3.3.8 + '@vue/shared': 3.3.8 csstype: 3.1.2 dev: true - /@vue/server-renderer@3.3.6(vue@3.3.6): - resolution: {integrity: sha512-kgLoN43W4ERdZ6dpyy+gnk2ZHtcOaIr5Uc/WUP5DRwutgvluzu2pudsZGoD2b7AEJHByUVMa9k6Sho5lLRCykw==} + /@vue/server-renderer@3.3.8(vue@3.3.8): + resolution: {integrity: sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==} peerDependencies: - vue: 3.3.6 + vue: 3.3.8 dependencies: - '@vue/compiler-ssr': 3.3.6 - '@vue/shared': 3.3.6 - vue: 3.3.6(typescript@5.2.2) + '@vue/compiler-ssr': 3.3.8 + '@vue/shared': 3.3.8 + vue: 3.3.8(typescript@5.2.2) dev: true - /@vue/shared@3.3.6: - resolution: {integrity: sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ==} + /@vue/shared@3.3.8: + resolution: {integrity: sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==} dev: true - /@vueuse/core@10.5.0(vue@3.3.6): + /@vueuse/core@10.5.0(vue@3.3.8): resolution: {integrity: sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==} dependencies: '@types/web-bluetooth': 0.0.18 '@vueuse/metadata': 10.5.0 - '@vueuse/shared': 10.5.0(vue@3.3.6) - vue-demi: 0.14.6(vue@3.3.6) + '@vueuse/shared': 10.5.0(vue@3.3.8) + vue-demi: 0.14.6(vue@3.3.8) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -1173,10 +1176,10 @@ packages: resolution: {integrity: sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==} dev: true - /@vueuse/shared@10.5.0(vue@3.3.6): + /@vueuse/shared@10.5.0(vue@3.3.8): resolution: {integrity: sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==} dependencies: - vue-demi: 0.14.6(vue@3.3.6) + vue-demi: 0.14.6(vue@3.3.8) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -1195,16 +1198,16 @@ packages: negotiator: 0.6.3 dev: false - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.2 dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1396,8 +1399,8 @@ packages: dev: false optional: true - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} requiresBuild: true dev: false optional: true @@ -1489,14 +1492,14 @@ packages: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true - /bootstrap-vue-next@0.14.10(vue@3.3.6): + /bootstrap-vue-next@0.14.10(vue@3.3.8): resolution: {integrity: sha512-0czOUVVi8nSA3M9dm48jJnMUB6vP7sYrMxfbFjINE/MEwVbsi4b1Gq41k6gFJcwE54fj7pYQW9q8LP5fqcq0Lw==} peerDependencies: vue: ^3.3.4 dependencies: - '@floating-ui/vue': 1.0.2(vue@3.3.6) - '@vueuse/core': 10.5.0(vue@3.3.6) - vue: 3.3.6(typescript@5.2.2) + '@floating-ui/vue': 1.0.2(vue@3.3.8) + '@vueuse/core': 10.5.0(vue@3.3.8) + vue: 3.3.8(typescript@5.2.2) transitivePeerDependencies: - '@vue/composition-api' dev: true @@ -2082,8 +2085,8 @@ packages: engines: {node: '>=10.2.0'} dependencies: '@types/cookie': 0.4.1 - '@types/cors': 2.8.15 - '@types/node': 20.8.7 + '@types/cors': 2.8.16 + '@types/node': 20.8.10 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -2237,8 +2240,8 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - '@eslint-community/regexpp': 4.9.1 - '@eslint/eslintrc': 2.1.2 + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 '@eslint/js': 8.50.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 @@ -2286,8 +2289,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 dev: true @@ -2404,8 +2407,8 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2547,7 +2550,7 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-extra@8.1.0: @@ -2734,7 +2737,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -2805,6 +2808,15 @@ packages: toidentifier: 1.0.1 dev: false + /http-graceful-shutdown@3.1.13: + resolution: {integrity: sha512-Ci5LRufQ8AtrQ1U26AevS8QoMXDOhnAHCJI3eZu1com7mZGHxREmw3dNj85ftpQokQCvak8nI2pnFS8zyM1M+Q==} + engines: {node: '>=4.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} @@ -3081,7 +3093,7 @@ packages: /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 dev: true @@ -3131,7 +3143,7 @@ packages: json-buffer: 3.0.1 dev: true - /knex@2.4.2(mysql2@3.6.2): + /knex@2.4.2(mysql2@3.6.3): resolution: {integrity: sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==} engines: {node: '>=12'} hasBin: true @@ -3168,7 +3180,7 @@ packages: getopts: 2.3.0 interpret: 2.2.0 lodash: 4.17.21 - mysql2: 3.6.2 + mysql2: 3.6.3 pg-connection-string: 2.5.0 rechoir: 0.8.0 resolve-from: 5.0.0 @@ -3178,7 +3190,7 @@ packages: - supports-color dev: false - /knex@2.5.1(mysql2@3.6.2): + /knex@2.5.1(mysql2@3.6.3): resolution: {integrity: sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==} engines: {node: '>=12'} hasBin: true @@ -3215,7 +3227,7 @@ packages: getopts: 2.3.0 interpret: 2.2.0 lodash: 4.17.21 - mysql2: 3.6.2 + mysql2: 3.6.3 pg-connection-string: 2.6.1 rechoir: 0.8.0 resolve-from: 5.0.0 @@ -3587,7 +3599,7 @@ packages: vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 - yaml: 2.3.3 + yaml: 2.3.4 dev: true /ms@2.0.0: @@ -3607,8 +3619,8 @@ packages: dev: false optional: true - /mysql2@3.6.2: - resolution: {integrity: sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==} + /mysql2@3.6.3: + resolution: {integrity: sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==} engines: {node: '>= 8.0'} dependencies: denque: 2.1.0 @@ -3632,8 +3644,8 @@ packages: resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} dev: false - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true @@ -4009,10 +4021,10 @@ packages: resolution: {integrity: sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==} requiresBuild: true dependencies: - async: 3.2.4 + async: 3.2.5 debug: 4.3.4 pidusage: 2.0.21 - systeminformation: 5.21.13 + systeminformation: 5.21.15 tx2: 1.0.5 transitivePeerDependencies: - supports-color @@ -4029,7 +4041,7 @@ packages: '@pm2/io': 5.0.2 '@pm2/js-api': 0.6.7 '@pm2/pm2-version-check': 1.0.4 - async: 3.2.4 + async: 3.2.5 blessed: 0.1.81 chalk: 3.0.0 chokidar: 3.5.3 @@ -4080,7 +4092,7 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.6 + nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 dev: true @@ -4188,8 +4200,8 @@ packages: once: 1.4.0 dev: false - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} dev: true @@ -4271,14 +4283,14 @@ packages: resolve: 1.22.8 dev: false - /redbean-node@0.3.1(mysql2@3.6.2): + /redbean-node@0.3.1(mysql2@3.6.3): resolution: {integrity: sha512-rz71vF7UtJQ14ttZ9I0QuaJ9TOwBCnZb+qHUBiU05f2fLaiQC79liisL3xgkHI8uE9et6HAkG8Z8VPkZbhgxKw==} dependencies: '@types/node': 20.3.3 await-lock: 2.2.2 dayjs: 1.11.10 glob: 10.3.10 - knex: 2.4.2(mysql2@3.6.2) + knex: 2.4.2(mysql2@3.6.3) lodash: 4.17.21 transitivePeerDependencies: - better-sqlite3 @@ -4748,8 +4760,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /systeminformation@5.21.13: - resolution: {integrity: sha512-sGgMhQxxjKHSIJtv7g5s19IRpfCgLG3tZqGbFcfGFyMm1hJ3BmzTfaq0yyOO2oLHlbkM49mgMjnPPB8g573LMA==} + /systeminformation@5.21.15: + resolution: {integrity: sha512-vMLwsGgJZW6GvoBXVWNZuRQG0MPxlfQnIIIY9ZxoogWftUpJ9C33qD+32e1meFlXuWpN0moNApPFLpbsSi4OaQ==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -4939,8 +4951,8 @@ packages: engines: {node: '>=8'} dev: false - /undici-types@5.25.3: - resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} /unique-filename@1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} @@ -4965,8 +4977,8 @@ packages: dev: false optional: true - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} dev: true @@ -4975,7 +4987,7 @@ packages: engines: {node: '>= 0.8'} dev: false - /unplugin-vue-components@0.25.2(vue@3.3.6): + /unplugin-vue-components@0.25.2(vue@3.3.8): resolution: {integrity: sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==} engines: {node: '>=14'} peerDependencies: @@ -4992,13 +5004,13 @@ packages: '@rollup/pluginutils': 5.0.5 chokidar: 3.5.3 debug: 4.3.4 - fast-glob: 3.3.1 + fast-glob: 3.3.2 local-pkg: 0.4.3 magic-string: 0.30.5 minimatch: 9.0.3 resolve: 1.22.8 unplugin: 1.5.0 - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) transitivePeerDependencies: - rollup - supports-color @@ -5007,7 +5019,7 @@ packages: /unplugin@1.5.0: resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -5016,7 +5028,7 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true /util-deprecate@1.0.2: @@ -5125,7 +5137,7 @@ packages: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} dev: true - /vue-demi@0.14.6(vue@3.3.6): + /vue-demi@0.14.6(vue@3.3.8): resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} engines: {node: '>=12'} hasBin: true @@ -5137,7 +5149,7 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true /vue-eslint-parser@9.3.2(eslint@8.50.0): @@ -5158,7 +5170,7 @@ packages: - supports-color dev: true - /vue-i18n@9.5.0(vue@3.3.6): + /vue-i18n@9.5.0(vue@3.3.8): resolution: {integrity: sha512-NiI3Ph1qMstNf7uhYh8trQBOBFLxeJgcOxBq51pCcZ28Vs18Y7BDS58r8HGDKCYgXdLUYqPDXdKatIF4bvBVZg==} engines: {node: '>= 16'} peerDependencies: @@ -5167,19 +5179,19 @@ packages: '@intlify/core-base': 9.5.0 '@intlify/shared': 9.5.0 '@vue/devtools-api': 6.5.1 - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true - /vue-prism-editor@2.0.0-alpha.2(vue@3.3.6): + /vue-prism-editor@2.0.0-alpha.2(vue@3.3.8): resolution: {integrity: sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==} engines: {node: '>=10'} peerDependencies: vue: ^3.0.0 dependencies: - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true - /vue-qrcode@2.2.0(qrcode@1.5.3)(vue@3.3.6): + /vue-qrcode@2.2.0(qrcode@1.5.3)(vue@3.3.8): resolution: {integrity: sha512-pEwy/IznxEY5MXptFLaxbGdeDWIJRgU5VhBcFmg1avDjD2z2jjWAGE5dlDwqagXtUjcgkvFSSQ40boog1maLuw==} peerDependencies: qrcode: ^1.5.0 @@ -5187,39 +5199,39 @@ packages: dependencies: qrcode: 1.5.3 tslib: 2.6.2 - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true - /vue-router@4.2.5(vue@3.3.6): + /vue-router@4.2.5(vue@3.3.8): resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==} peerDependencies: vue: ^3.2.0 dependencies: '@vue/devtools-api': 6.5.1 - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true - /vue-toastification@2.0.0-rc.5(vue@3.3.6): + /vue-toastification@2.0.0-rc.5(vue@3.3.8): resolution: {integrity: sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==} peerDependencies: vue: ^3.0.2 dependencies: - vue: 3.3.6(typescript@5.2.2) + vue: 3.3.8(typescript@5.2.2) dev: true - /vue@3.3.6(typescript@5.2.2): - resolution: {integrity: sha512-jJIDETeWJnoY+gfn4ZtMPMS5KtbP4ax+CT4dcQFhTnWEk8xMupFyQ0JxL28nvT/M4+p4a0ptxaV2WY0LiIxvRg==} + /vue@3.3.8(typescript@5.2.2): + resolution: {integrity: sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.3.6 - '@vue/compiler-sfc': 3.3.6 - '@vue/runtime-dom': 3.3.6 - '@vue/server-renderer': 3.3.6(vue@3.3.6) - '@vue/shared': 3.3.6 + '@vue/compiler-dom': 3.3.8 + '@vue/compiler-sfc': 3.3.8 + '@vue/runtime-dom': 3.3.8 + '@vue/server-renderer': 3.3.8(vue@3.3.8) + '@vue/shared': 3.3.8 typescript: 5.2.2 dev: true @@ -5371,8 +5383,8 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@2.3.3: - resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} engines: {node: '>= 14'} /yamljs@0.3.0: