From 3671e297a2144ceb17f1f1f7733dd49628f80f2b Mon Sep 17 00:00:00 2001 From: Matt Lishman Date: Thu, 20 Mar 2025 22:35:34 +0000 Subject: [PATCH 01/97] refactor: move logger to injected dependency --- .mocharc.json | 3 - .nvmrc | 1 + package-lock.json | 6166 +++++++++-------- package.json | 12 +- .../unit/services/config.service.test.ts | 170 +- .../unit/services/game.service.test.ts | 3 +- .../unit/services/graphics.service.test.ts | 8 +- .../unit/services/migration.service.test.ts | 4 +- .../services/modOrganizer.service.test.ts | 7 +- .../unit/services/profile.service.test.ts | 3 +- .../unit/services/startup.service.test.ts | 4 +- .../unit/services/system.service.test.ts | 5 +- .../unit/services/wabbajack.service.test.ts | 6 +- src/__tests__/unit/setup/global-setup.ts | 5 - .../unit/support/mocks/logger.mock.ts | 5 + src/main.ts | 6 +- src/main/application.ts | 9 +- .../controllers/modpack/modpack.controller.ts | 11 +- src/main/decorators/controller.decorator.ts | 47 +- src/main/logger.ts | 13 +- src/main/preload.ts | 2 +- src/main/services/config.service.ts | 45 +- src/main/services/enb.service.ts | 59 +- src/main/services/error.service.ts | 14 +- src/main/services/game.service.ts | 11 +- src/main/services/graphics.service.ts | 99 +- src/main/services/instruction.service.ts | 43 +- src/main/services/launcher.service.ts | 13 +- src/main/services/migration.service.ts | 45 +- src/main/services/modOrganizer.service.ts | 65 +- src/main/services/modpack.service.ts | 11 +- src/main/services/profile.service.ts | 15 +- src/main/services/resolution.service.ts | 41 +- src/main/services/startup.service.ts | 17 +- src/main/services/system.service.ts | 53 +- src/main/services/update.service.ts | 27 +- src/main/services/wabbajack.service.ts | 19 +- src/main/services/window.service.ts | 62 +- wallaby.js | 4 +- 39 files changed, 4023 insertions(+), 3110 deletions(-) create mode 100644 .nvmrc delete mode 100644 src/__tests__/unit/setup/global-setup.ts create mode 100644 src/__tests__/unit/support/mocks/logger.mock.ts diff --git a/.mocharc.json b/.mocharc.json index 60cab294..38a269c1 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -3,8 +3,5 @@ "require": [ "source-map-support/register", "tsconfig-paths/register" - ], - "file": [ - "./dist/__tests__/unit/setup/global-setup.js" ] } diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..19c7bdba --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 718674ca..4155f8e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,28 +47,28 @@ "@types/mock-require": "^2.0.1", "@types/ncp": "^2.0.5", "@types/node-fetch": "^2.6.1", - "@typescript-eslint/eslint-plugin": "^2.33.0", - "@typescript-eslint/parser": "^2.33.0", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", "@vue/cli-plugin-babel": "~4.5.15", - "@vue/cli-plugin-eslint": "^4.5.15", + "@vue/cli-plugin-eslint": "^5.0.8", "@vue/cli-plugin-router": "~4.5.15", "@vue/cli-plugin-typescript": "^4.5.15", "@vue/cli-service": "~4.5.15", "@vue/compiler-sfc": "^3.2.26", "@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-standard": "^5.1.2", - "@vue/eslint-config-typescript": "^5.0.2", + "@vue/eslint-config-typescript": "^11.0.3", "babel-eslint": "^10.1.0", "commitlint": "^15.0.0", "electron": "^16.0.5", "electron-devtools-installer": "^3.1.0", - "eslint": "^6.7.2", + "eslint": "^8.41.0", "eslint-plugin-import": "^2.25.3", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.4.1", "eslint-plugin-promise": "^6.0.0", "eslint-plugin-standard": "^4.0.0", - "eslint-plugin-vue": "^8.2.0", + "eslint-plugin-vue": "^9.14.1", "lint-staged": "^12.1.3", "mocha": "^10.0.0", "mock-fs": "^5.1.3", @@ -88,6 +88,20 @@ "vue-property-decorator": "^10.0.0-rc.3" } }, + "node_modules/@achrinza/node-ipc": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.6.tgz", + "integrity": "sha512-ULSIYPy4ZPM301dfCxRz0l2GJjOwIo/PqmWonIu1bLml7UmnVQmH+juJcoyXp6E8gIRRNAjGYftJnNQlfy4vPg==", + "dev": true, + "dependencies": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + }, + "engines": { + "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19" + } + }, "node_modules/@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -2772,62 +2786,57 @@ "cosmiconfig": ">=6" } }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2836,10 +2845,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2852,9 +2867,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -2908,6 +2923,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@exodus/schemasafe": { "version": "1.0.0-rc.7", "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.7.tgz", @@ -2990,24 +3014,39 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "engines": { + "node": ">=12.22" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" @@ -3104,6 +3143,64 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "node_modules/@loopback/boot": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-5.0.2.tgz", @@ -3216,196 +3313,12 @@ "eslint": "^8.19.0" } }, - "node_modules/@loopback/build/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/@loopback/build/node_modules/@types/node": { "version": "14.18.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.23.tgz", "integrity": "sha512-MhbCWN18R4GhO8ewQWAFK4TGQdBpXWByukz7cWyJmXhvRuCIaM/oWytGPqVmDzgEnnaIc9ss6HbU5mUi+vyZPA==", "dev": true }, - "node_modules/@loopback/build/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz", - "integrity": "sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/type-utils": "5.32.0", - "@typescript-eslint/utils": "5.32.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@loopback/build/node_modules/@typescript-eslint/parser": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.32.0.tgz", - "integrity": "sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@loopback/build/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@loopback/build/node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@loopback/build/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@loopback/build/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@loopback/build/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@loopback/build/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@loopback/build/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@loopback/build/node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3420,86 +3333,6 @@ "node": ">= 8" } }, - "node_modules/@loopback/build/node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@loopback/build/node_modules/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@loopback/build/node_modules/eslint-config-prettier": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", @@ -3528,19 +3361,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/@loopback/build/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@loopback/build/node_modules/eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", @@ -3568,128 +3388,6 @@ "node": ">=10" } }, - "node_modules/@loopback/build/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@loopback/build/node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@loopback/build/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@loopback/build/node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@loopback/build/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@loopback/build/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@loopback/build/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@loopback/build/node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@loopback/build/node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, "node_modules/@loopback/build/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -3709,18 +3407,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@loopback/build/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@loopback/build/node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -3742,180 +3428,6 @@ "node": ">=10" } }, - "node_modules/@loopback/build/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@loopback/build/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@loopback/build/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@loopback/build/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/@loopback/build/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@loopback/build/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@loopback/build/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@loopback/build/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@loopback/build/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@loopback/build/node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@loopback/build/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@loopback/build/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@loopback/build/node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3925,39 +3437,6 @@ "node": ">=8" } }, - "node_modules/@loopback/build/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@loopback/build/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@loopback/build/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3979,75 +3458,6 @@ "node": ">=8" } }, - "node_modules/@loopback/build/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@loopback/build/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@loopback/build/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@loopback/build/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@loopback/build/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@loopback/build/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4314,6 +3724,18 @@ "node": ">=4" } }, + "node_modules/@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dev": true, + "dependencies": { + "easy-stack": "1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4388,6 +3810,33 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/address/node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "dev": true, @@ -4591,10 +4040,31 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/eslint-visitor-keys": { - "version": "1.0.0", + "node_modules/@types/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.13", @@ -4771,9 +4241,9 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", - "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" }, "node_modules/@types/serve-static": { "version": "1.13.10", @@ -4920,25 +4390,32 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "2.34.0", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^2.0.0", - "eslint": "^5.0.0 || ^6.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4946,46 +4423,50 @@ } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "2.34.0", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "eslint": "*" + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/parser": { - "version": "2.34.0", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "debug": "^4.3.4" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4994,13 +4475,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5011,12 +4492,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz", - "integrity": "sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5037,9 +4519,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5050,20 +4532,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "2.34.0", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -5075,31 +4558,7 @@ } } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.32.0.tgz", - "integrity": "sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@nodelib/fs.stat": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", @@ -5108,34 +4567,7 @@ "node": ">= 8" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/array-union": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", @@ -5144,7 +4576,7 @@ "node": ">=8" } }, - "node_modules/@typescript-eslint/utils/node_modules/braces": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", @@ -5156,7 +4588,7 @@ "node": ">=8" } }, - "node_modules/@typescript-eslint/utils/node_modules/dir-glob": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", @@ -5168,37 +4600,10 @@ "node": ">=8" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -5211,7 +4616,7 @@ "node": ">=8.6.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/fill-range": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", @@ -5223,7 +4628,7 @@ "node": ">=8" } }, - "node_modules/@typescript-eslint/utils/node_modules/globby": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", @@ -5243,16 +4648,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/utils/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/@typescript-eslint/utils/node_modules/is-number": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", @@ -5261,7 +4666,7 @@ "node": ">=0.12.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/micromatch": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", @@ -5274,7 +4679,7 @@ "node": ">=8.6" } }, - "node_modules/@typescript-eslint/utils/node_modules/path-type": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", @@ -5283,10 +4688,10 @@ "node": ">=8" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5298,7 +4703,7 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils/node_modules/slash": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", @@ -5307,7 +4712,7 @@ "node": ">=8" } }, - "node_modules/@typescript-eslint/utils/node_modules/to-regex-range": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", @@ -5319,13 +4724,54 @@ "node": ">=8.0" } }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -5337,12 +4783,15 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@ungap/promise-all-settled": { @@ -5623,61 +5072,949 @@ "license": "ISC" }, "node_modules/@vue/cli-plugin-eslint": { - "version": "4.5.15", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz", + "integrity": "sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg==", "dev": true, - "license": "MIT", "dependencies": { - "@vue/cli-shared-utils": "^4.5.15", - "eslint-loader": "^2.2.1", - "globby": "^9.2.0", - "inquirer": "^7.1.0", - "webpack": "^4.0.0", + "@vue/cli-shared-utils": "^5.0.8", + "eslint-webpack-plugin": "^3.1.0", + "globby": "^11.0.2", + "webpack": "^5.54.0", "yorkie": "^2.0.0" }, "peerDependencies": { - "@vue/cli-service": "^3.0.0 || ^4.0.0-0", - "eslint": ">= 1.6.0 < 7.0.0" + "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", + "eslint": ">=7.5.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" } }, "node_modules/@vue/cli-plugin-eslint/node_modules/@vue/cli-shared-utils": { - "version": "4.5.15", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz", + "integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==", "dev": true, - "license": "MIT", "dependencies": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", + "@achrinza/node-ipc": "^9.2.5", + "chalk": "^4.1.2", "execa": "^1.0.0", + "joi": "^17.4.0", "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", + "lru-cache": "^6.0.0", + "node-fetch": "^2.6.7", + "open": "^8.0.2", + "ora": "^5.3.0", "read-pkg": "^5.1.1", - "request": "^2.88.2", - "semver": "^6.1.0", + "semver": "^7.3.4", "strip-ansi": "^6.0.0" } }, - "node_modules/@vue/cli-plugin-eslint/node_modules/lru-cache": { - "version": "5.1.1", + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, - "license": "ISC", "dependencies": { - "yallist": "^3.0.2" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "node_modules/@vue/cli-plugin-eslint/node_modules/semver": { - "version": "6.3.0", + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, - "license": "ISC", "bin": { - "semver": "bin/semver.js" + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@vue/cli-plugin-eslint/node_modules/yallist": { - "version": "3.1.1", + "node_modules/@vue/cli-plugin-eslint/node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, - "license": "ISC" + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser": { + "version": "5.17.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/webpack": { + "version": "5.85.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", + "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@vue/cli-plugin-eslint/node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } }, "node_modules/@vue/cli-plugin-router": { "version": "4.5.15", @@ -6321,17 +6658,27 @@ } }, "node_modules/@vue/eslint-config-typescript": { - "version": "5.1.0", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", "dev": true, - "license": "MIT", "dependencies": { - "vue-eslint-parser": "^7.0.0" + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "vue-eslint-parser": "^9.1.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^2.7.0", - "@typescript-eslint/parser": "^2.7.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint-plugin-vue": "^5.2.3 || ^6.0.0 || ^7.0.0-0" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@vue/preload-webpack-plugin": { @@ -6452,6 +6799,29 @@ "@webassemblyjs/ast": "1.9.0" } }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "dev": true, @@ -7378,14 +7748,6 @@ "node": ">=0.10.0" } }, - "node_modules/astral-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/async": { "version": "2.6.3", "dev": true, @@ -8683,9 +9045,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001409", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001409.tgz", - "integrity": "sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ==", + "version": "1.0.30001494", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz", + "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", "dev": true, "funding": [ { @@ -8695,6 +9057,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -8832,11 +9198,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chardet": { - "version": "0.7.0", - "dev": true, - "license": "MIT" - }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -9281,14 +9642,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, "node_modules/clipboardy": { "version": "2.3.0", "dev": true, @@ -11010,9 +11363,10 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "dev": true, - "license": "MIT" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.2.2", @@ -11208,6 +11562,15 @@ "dev": true, "license": "MIT" }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.1.3", "dev": true, @@ -12301,6 +12664,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, "node_modules/es-to-primitive": { "version": "1.2.1", "dev": true, @@ -12351,53 +12720,56 @@ } }, "node_modules/eslint": { - "version": "6.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -12518,34 +12890,6 @@ "node": ">=0.6" } }, - "node_modules/eslint-loader": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - }, - "peerDependencies": { - "eslint": ">=1.6.0 <7.0.0", - "webpack": ">=2.0.0 <5.0.0" - } - }, - "node_modules/eslint-loader/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/eslint-module-utils": { "version": "2.7.1", "dev": true, @@ -12851,306 +13195,486 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-prettier": { - "version": "3.4.1", + "node_modules/eslint-plugin-prettier": { + "version": "3.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "4.1.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.14.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.14.1.tgz", + "integrity": "sha512-LQazDB1qkNEKejLe/b5a9VfEbtbczcOaui5lQ4Qw0tbRBbQYREyxxOV5BQgNDTqGPs9pxqiEpbMi9ywuIaF7vw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.3.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.3.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, - "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-promise": { - "version": "6.0.0", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, - "license": "ISC", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-standard": { - "version": "4.1.0", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peerDependencies": { - "eslint": ">=5.0.0" + "engines": { + "node": ">=4.0" } }, - "node_modules/eslint-plugin-vue": { - "version": "8.2.0", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { - "eslint-utils": "^3.0.0", - "natural-compare": "^1.4.0", - "semver": "^7.3.5", - "vue-eslint-parser": "^8.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/acorn": { - "version": "8.6.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "node": ">=10" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-vue/node_modules/eslint-scope": { - "version": "6.0.0", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "is-glob": "^4.0.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.13.0" } }, - "node_modules/eslint-plugin-vue/node_modules/eslint-utils": { - "version": "3.0.0", + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, - "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-vue/node_modules/eslint-visitor-keys": { - "version": "2.1.0", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/eslint-plugin-vue/node_modules/espree": { - "version": "9.2.0", + "node_modules/eslint/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.6.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 4" } }, - "node_modules/eslint-plugin-vue/node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.1.0", + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/eslint-plugin-vue/node_modules/estraverse": { - "version": "5.3.0", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser": { - "version": "8.0.1", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { - "debug": "^4.3.2", - "eslint-scope": "^6.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.5" + "p-locate": "^5.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.1.0", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "Apache-2.0", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "*" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "1.4.3", + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/eslint/node_modules/globals": { - "version": "12.4.0", + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.8.1" - }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/regexpp": { - "version": "2.0.1", + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "5.2.0", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^4.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.1.1", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.8.1", + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=8" + "node": ">= 8" } }, "node_modules/espree": { - "version": "6.2.1", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -13158,6 +13682,18 @@ "node": ">=0.4.0" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "dev": true, @@ -13171,9 +13707,10 @@ } }, "node_modules/esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -13182,9 +13719,10 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -13528,19 +14066,6 @@ "node": ">=0.10.0" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/extglob": { "version": "2.0.4", "dev": true, @@ -13703,8 +14228,9 @@ }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -13754,29 +14280,16 @@ "dev": true, "license": "ISC" }, - "node_modules/figures": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { - "version": "5.0.1", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-loader": { @@ -13920,33 +14433,23 @@ } }, "node_modules/flat-cache": { - "version": "2.0.1", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "license": "MIT", "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "2.0.2", - "dev": true, - "license": "ISC" + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true }, "node_modules/flush-write-stream": { "version": "1.1.1", @@ -14467,11 +14970,6 @@ "dev": true, "license": "MIT" }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/gauge": { "version": "2.7.4", "dev": true, @@ -14893,8 +15391,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "license": "ISC" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graceful-readlink": { "version": "1.0.1", @@ -14908,6 +15407,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/gzip-size": { "version": "5.1.1", "dev": true, @@ -15836,138 +16341,6 @@ "dev": true, "license": "ISC" }, - "node_modules/inquirer": { - "version": "7.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/internal-ip": { "version": "4.3.0", "dev": true, @@ -16374,6 +16747,15 @@ "node": ">=8" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-negative-zero": { "version": "2.0.1", "dev": true, @@ -16869,6 +17251,72 @@ "dev": true, "license": "MIT" }, + "node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/joi/node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/joi/node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/js-base64": { "version": "2.6.4", "dev": true, @@ -17138,12 +17586,13 @@ } }, "node_modules/levn": { - "version": "0.3.0", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -17555,62 +18004,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/loader-fs-cache": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" - } - }, - "node_modules/loader-fs-cache/node_modules/find-cache-dir": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-fs-cache/node_modules/find-up": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-fs-cache/node_modules/path-exists": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-fs-cache/node_modules/pkg-dir": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/loader-runner": { "version": "2.4.0", "dev": true, @@ -19136,11 +19529,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "license": "ISC" - }, "node_modules/mylas": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.9.tgz", @@ -19206,6 +19594,12 @@ "dev": true, "license": "MIT" }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -20168,14 +20562,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.0", "dev": true, @@ -20498,16 +20884,17 @@ } }, "node_modules/optionator": { - "version": "0.8.3", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { "node": ">= 0.8.0" @@ -20703,14 +21090,6 @@ "node": ">= 8" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-cancelable": { "version": "1.1.0", "dev": true, @@ -22874,9 +23253,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.6", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -22988,7 +23368,9 @@ "license": "MIT" }, "node_modules/prelude-ls": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -24022,14 +24404,6 @@ "license": "BSD-3-Clause", "optional": true }, - "node_modules/run-async": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -24061,23 +24435,6 @@ "aproba": "^1.1.1" } }, - "node_modules/rxjs": { - "version": "6.6.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.1.2", "license": "MIT" @@ -24722,27 +25079,6 @@ "node": ">=6" } }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -25723,17 +26059,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/stylelint/node_modules/fill-range": { "version": "7.0.1", "dev": true, @@ -25745,23 +26070,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/flat-cache": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/stylelint/node_modules/flatted": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, "node_modules/stylelint/node_modules/get-stdin": { "version": "8.0.0", "dev": true, @@ -26206,57 +26514,6 @@ "node": ">=4.0.0" } }, - "node_modules/table": { - "version": "5.4.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tapable": { "version": "1.1.3", "dev": true, @@ -26577,17 +26834,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tmp": { - "version": "0.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tmp-promise": { "version": "3.0.2", "dev": true, @@ -27203,11 +27449,12 @@ "license": "Unlicense" }, "node_modules/type-check": { - "version": "0.3.2", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -28444,25 +28691,79 @@ } }, "node_modules/vue-eslint-parser": { - "version": "7.6.0", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.0.tgz", + "integrity": "sha512-48IxT9d0+wArT1+3wNIy0tascRoywqSUe2E1YalIC1L8jsUGe5aJQItWfRok7DVFGz3UYvzEI7n5wiTXsCMAcQ==", "dev": true, - "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "eslint-scope": "^5.0.0", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.2.1", + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", - "lodash": "^4.17.15" + "lodash": "^4.17.21", + "semver": "^7.3.6" }, "engines": { - "node": ">=8.10" + "node": "^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { - "eslint": ">=5.0.0" + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/vue-final-modal": { @@ -29197,8 +29498,9 @@ }, "node_modules/word-wrap": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -29279,17 +29581,6 @@ "version": "1.0.2", "license": "ISC" }, - "node_modules/write": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -29318,6 +29609,15 @@ "node": ">=8" } }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/xtend": { "version": "4.0.2", "dev": true, @@ -29621,6 +29921,17 @@ } }, "dependencies": { + "@achrinza/node-ipc": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.6.tgz", + "integrity": "sha512-ULSIYPy4ZPM301dfCxRz0l2GJjOwIo/PqmWonIu1bLml7UmnVQmH+juJcoyXp6E8gIRRNAjGYftJnNQlfy4vPg==", + "dev": true, + "requires": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + } + }, "@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -31325,16 +31636,39 @@ "tslib": "^2" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", + "espree": "^9.5.2", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -31342,48 +31676,25 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "js-yaml": { @@ -31418,6 +31729,12 @@ } } }, + "@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true + }, "@exodus/schemasafe": { "version": "1.0.0-rc.7", "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.7.tgz", @@ -31499,20 +31816,31 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, "@humanwhocodes/object-schema": { @@ -31581,6 +31909,55 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "@loopback/boot": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-5.0.2.tgz", @@ -31662,123 +32039,12 @@ "eslint-plugin-mocha": "^10.0.5" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, "@types/node": { "version": "14.18.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.23.tgz", "integrity": "sha512-MhbCWN18R4GhO8ewQWAFK4TGQdBpXWByukz7cWyJmXhvRuCIaM/oWytGPqVmDzgEnnaIc9ss6HbU5mUi+vyZPA==", "dev": true }, - "@typescript-eslint/eslint-plugin": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz", - "integrity": "sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/type-utils": "5.32.0", - "@typescript-eslint/utils": "5.32.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.32.0.tgz", - "integrity": "sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -31790,68 +32056,6 @@ "which": "^2.0.1" } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, "eslint-config-prettier": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", @@ -31869,16 +32073,6 @@ "rambda": "^7.1.0" } }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, "eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", @@ -31896,97 +32090,6 @@ } } }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -32020,162 +32123,12 @@ } } }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -32191,51 +32144,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -32418,6 +32326,15 @@ "glob-to-regexp": "^0.3.0" } }, + "@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dev": true, + "requires": { + "easy-stack": "1.0.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -32467,6 +32384,35 @@ "@popperjs/core": { "version": "2.11.0" }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + }, + "dependencies": { + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + } + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "@sindresorhus/is": { "version": "0.14.0", "dev": true @@ -32621,8 +32567,30 @@ "version": "2.2.0", "dev": true }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", + "@types/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/express": { @@ -32782,9 +32750,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", - "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" }, "@types/serve-static": { "version": "1.13.10", @@ -32915,87 +32883,93 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/parser": { - "version": "2.34.0", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" } }, "@typescript-eslint/type-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz", - "integrity": "sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "2.34.0", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.32.0.tgz", - "integrity": "sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { "@nodelib/fs.stat": { @@ -33004,21 +32978,6 @@ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, - "@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -33043,25 +33002,10 @@ "path-type": "^4.0.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -33095,9 +33039,9 @@ } }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "is-number": { @@ -33123,9 +33067,9 @@ "dev": true }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -33148,20 +33092,47 @@ } } }, + "@typescript-eslint/utils": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true } } @@ -33373,48 +33344,707 @@ } }, "@vue/cli-plugin-eslint": { - "version": "4.5.15", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz", + "integrity": "sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg==", "dev": true, "requires": { - "@vue/cli-shared-utils": "^4.5.15", - "eslint-loader": "^2.2.1", - "globby": "^9.2.0", - "inquirer": "^7.1.0", - "webpack": "^4.0.0", + "@vue/cli-shared-utils": "^5.0.8", + "eslint-webpack-plugin": "^3.1.0", + "globby": "^11.0.2", + "webpack": "^5.54.0", "yorkie": "^2.0.0" }, "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, "@vue/cli-shared-utils": { - "version": "4.5.15", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz", + "integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==", "dev": true, "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", + "@achrinza/node-ipc": "^9.2.5", + "chalk": "^4.1.2", "execa": "^1.0.0", + "joi": "^17.4.0", "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", + "lru-cache": "^6.0.0", + "node-fetch": "^2.6.7", + "open": "^8.0.2", + "ora": "^5.3.0", "read-pkg": "^5.1.1", - "request": "^2.88.2", - "semver": "^6.1.0", + "semver": "^7.3.4", "strip-ansi": "^6.0.0" } }, - "lru-cache": { - "version": "5.1.1", + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "yallist": "^3.0.2" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "semver": { - "version": "6.3.0", + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, - "yallist": { - "version": "3.1.1", + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, + "requires": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.17.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.85.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", + "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true } } @@ -33880,10 +34510,14 @@ } }, "@vue/eslint-config-typescript": { - "version": "5.1.0", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", "dev": true, "requires": { - "vue-eslint-parser": "^7.0.0" + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "vue-eslint-parser": "^9.1.1" } }, "@vue/preload-webpack-plugin": { @@ -33980,6 +34614,31 @@ "@webassemblyjs/ast": "1.9.0" } }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + }, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + } + } + }, "@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "dev": true @@ -34625,10 +35284,6 @@ "version": "1.0.0", "dev": true }, - "astral-regex": { - "version": "1.0.0", - "dev": true - }, "async": { "version": "2.6.3", "dev": true, @@ -35532,9 +36187,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001409", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001409.tgz", - "integrity": "sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ==", + "version": "1.0.30001494", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz", + "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", "dev": true }, "capital-case": { @@ -35651,10 +36306,6 @@ "version": "1.1.4", "dev": true }, - "chardet": { - "version": "0.7.0", - "dev": true - }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -35927,10 +36578,6 @@ } } }, - "cli-width": { - "version": "3.0.0", - "dev": true - }, "clipboardy": { "version": "2.3.0", "dev": true, @@ -37128,7 +37775,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { @@ -37253,6 +37902,12 @@ "version": "1.1.3", "dev": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "define-properties": { "version": "1.1.3", "dev": true, @@ -38061,6 +38716,12 @@ "unbox-primitive": "^1.0.0" } }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, "es-to-primitive": { "version": "1.2.1", "dev": true, @@ -38090,84 +38751,270 @@ "dev": true }, "eslint": { - "version": "6.8.0", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" }, "dependencies": { - "eslint-utils": { - "version": "1.4.3", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "color-convert": "^2.0.1" } }, - "globals": { - "version": "12.4.0", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "regexpp": { + "color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "semver": { - "version": "6.3.0", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "strip-ansi": { - "version": "5.2.0", + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" } }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "dev": true }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "type-fest": { - "version": "0.8.1", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -38254,28 +39101,6 @@ } } }, - "eslint-loader": { - "version": "2.2.1", - "dev": true, - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "eslint-module-utils": { "version": "2.7.1", "dev": true, @@ -38507,80 +39332,35 @@ "requires": {} }, "eslint-plugin-vue": { - "version": "8.2.0", + "version": "9.14.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.14.1.tgz", + "integrity": "sha512-LQazDB1qkNEKejLe/b5a9VfEbtbczcOaui5lQ4Qw0tbRBbQYREyxxOV5BQgNDTqGPs9pxqiEpbMi9ywuIaF7vw==", "dev": true, "requires": { - "eslint-utils": "^3.0.0", + "@eslint-community/eslint-utils": "^4.3.0", "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", "semver": "^7.3.5", - "vue-eslint-parser": "^8.0.1" + "vue-eslint-parser": "^9.3.0", + "xml-name-validator": "^4.0.0" }, "dependencies": { - "acorn": { - "version": "8.6.0", - "dev": true - }, - "eslint-scope": { - "version": "6.0.0", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "dev": true - }, - "espree": { - "version": "9.2.0", - "dev": true, - "requires": { - "acorn": "^8.6.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.1.0", - "dev": true - } - } - }, - "estraverse": { - "version": "5.3.0", - "dev": true - }, - "vue-eslint-parser": { - "version": "8.0.1", + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { - "debug": "^4.3.2", - "eslint-scope": "^6.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.5" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.1.0", - "dev": true - } + "boolbase": "^1.0.0" } } } }, "eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -38599,16 +39379,26 @@ "dev": true }, "espree": { - "version": "6.2.1", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "dependencies": { "acorn": { - "version": "7.4.1", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true } } @@ -38618,14 +39408,18 @@ "dev": true }, "esquery": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -38871,15 +39665,6 @@ } } }, - "external-editor": { - "version": "3.1.0", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "extglob": { "version": "2.0.4", "dev": true, @@ -39004,6 +39789,8 @@ }, "fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fast-safe-stringify": { @@ -39046,18 +39833,13 @@ "version": "3.5.2", "dev": true }, - "figures": { - "version": "3.2.0", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { - "version": "5.0.1", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "file-loader": { @@ -39164,25 +39946,19 @@ "dev": true }, "flat-cache": { - "version": "2.0.1", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "flush-write-stream": { @@ -39527,10 +40303,6 @@ "version": "1.1.1", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "dev": true - }, "gauge": { "version": "2.7.4", "dev": true, @@ -39822,7 +40594,9 @@ } }, "graceful-fs": { - "version": "4.2.6" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "graceful-readlink": { "version": "1.0.1", @@ -39836,6 +40610,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "gzip-size": { "version": "5.1.1", "dev": true, @@ -40460,90 +41240,6 @@ "version": "1.3.8", "dev": true }, - "inquirer": { - "version": "7.3.3", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "internal-ip": { "version": "4.3.0", "dev": true, @@ -40783,6 +41479,12 @@ } } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, "is-negative-zero": { "version": "2.0.1", "dev": true @@ -41103,6 +41805,64 @@ "version": "2.1.0", "dev": true }, + "jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + }, + "dependencies": { + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + } + } + }, "js-base64": { "version": "2.6.4", "dev": true @@ -41292,11 +42052,13 @@ } }, "levn": { - "version": "0.3.0", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lie": { @@ -41542,47 +42304,6 @@ } } }, - "loader-fs-cache": { - "version": "1.0.3", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, "loader-runner": { "version": "2.4.0", "dev": true @@ -42653,10 +43374,6 @@ "version": "1.1.0", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "dev": true - }, "mylas": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.9.tgz", @@ -42702,6 +43419,12 @@ "version": "1.4.0", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -43405,10 +44128,6 @@ } } }, - "object-hash": { - "version": "1.3.1", - "dev": true - }, "object-inspect": { "version": "1.12.0", "dev": true @@ -43610,15 +44329,17 @@ } }, "optionator": { - "version": "0.8.3", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "ora": { @@ -43751,10 +44472,6 @@ } } }, - "os-tmpdir": { - "version": "1.0.2", - "dev": true - }, "p-cancelable": { "version": "1.1.0", "dev": true @@ -45194,7 +45911,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.6", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -45269,7 +45988,9 @@ "dev": true }, "prelude-ls": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prepend-http": { @@ -45969,10 +46690,6 @@ } } }, - "run-async": { - "version": "2.4.1", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -45989,21 +46706,6 @@ "aproba": "^1.1.1" } }, - "rxjs": { - "version": "6.6.7", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, "safe-buffer": { "version": "5.1.2" }, @@ -46492,21 +47194,6 @@ "version": "2.0.0", "dev": true }, - "slice-ansi": { - "version": "2.1.0", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true - } - } - }, "snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -47192,13 +47879,6 @@ "picomatch": "^2.2.1" } }, - "file-entry-cache": { - "version": "6.0.1", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, "fill-range": { "version": "7.0.1", "dev": true, @@ -47206,18 +47886,6 @@ "to-regex-range": "^5.0.1" } }, - "flat-cache": { - "version": "3.0.4", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.1.1", - "dev": true - }, "get-stdin": { "version": "8.0.0", "dev": true @@ -47530,42 +48198,6 @@ "util.promisify": "~1.0.0" } }, - "table": { - "version": "5.4.6", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "tapable": { "version": "1.1.3", "dev": true @@ -47784,13 +48416,6 @@ "version": "0.3.0", "dev": true }, - "tmp": { - "version": "0.0.33", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "tmp-promise": { "version": "3.0.2", "dev": true, @@ -48221,10 +48846,12 @@ "dev": true }, "type-check": { - "version": "0.3.2", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -49034,15 +49661,51 @@ } }, "vue-eslint-parser": { - "version": "7.6.0", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.0.tgz", + "integrity": "sha512-48IxT9d0+wArT1+3wNIy0tascRoywqSUe2E1YalIC1L8jsUGe5aJQItWfRok7DVFGz3UYvzEI7n5wiTXsCMAcQ==", "dev": true, "requires": { - "debug": "^4.1.1", - "eslint-scope": "^5.0.0", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.2.1", + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", - "lodash": "^4.17.15" + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "dependencies": { + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "vue-final-modal": { @@ -49580,6 +50243,8 @@ }, "word-wrap": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "worker-farm": { @@ -49640,13 +50305,6 @@ "wrappy": { "version": "1.0.2" }, - "write": { - "version": "1.0.3", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -49670,6 +50328,12 @@ "version": "4.0.0", "dev": true }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, "xtend": { "version": "4.0.2", "dev": true diff --git a/package.json b/package.json index 4fe45bca..f2ee275b 100644 --- a/package.json +++ b/package.json @@ -78,28 +78,28 @@ "@types/mock-require": "^2.0.1", "@types/ncp": "^2.0.5", "@types/node-fetch": "^2.6.1", - "@typescript-eslint/eslint-plugin": "^2.33.0", - "@typescript-eslint/parser": "^2.33.0", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", "@vue/cli-plugin-babel": "~4.5.15", - "@vue/cli-plugin-eslint": "^4.5.15", + "@vue/cli-plugin-eslint": "^5.0.8", "@vue/cli-plugin-router": "~4.5.15", "@vue/cli-plugin-typescript": "^4.5.15", "@vue/cli-service": "~4.5.15", "@vue/compiler-sfc": "^3.2.26", "@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-standard": "^5.1.2", - "@vue/eslint-config-typescript": "^5.0.2", + "@vue/eslint-config-typescript": "^11.0.3", "babel-eslint": "^10.1.0", "commitlint": "^15.0.0", "electron": "^16.0.5", "electron-devtools-installer": "^3.1.0", - "eslint": "^6.7.2", + "eslint": "^8.41.0", "eslint-plugin-import": "^2.25.3", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.4.1", "eslint-plugin-promise": "^6.0.0", "eslint-plugin-standard": "^4.0.0", - "eslint-plugin-vue": "^8.2.0", + "eslint-plugin-vue": "^9.14.1", "lint-staged": "^12.1.3", "mocha": "^10.0.0", "mock-fs": "^5.1.3", diff --git a/src/__tests__/unit/services/config.service.test.ts b/src/__tests__/unit/services/config.service.test.ts index d3f3b3c8..d7ed479e 100644 --- a/src/__tests__/unit/services/config.service.test.ts +++ b/src/__tests__/unit/services/config.service.test.ts @@ -2,39 +2,201 @@ import { ConfigService, UserPreferences } from "@/main/services/config.service"; import { expect } from "@loopback/testlab"; import mockFs from "mock-fs"; import Store from "electron-store"; +import sinon from "sinon"; +import log, { ElectronLog } from "electron-log"; +import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; describe("Config Service", () => { let mockStore: Store; let mockModDirectory: string; + let mockLogger: sinon.SinonStubbedInstance; + let configService: ConfigService; + + let mockUserConfig: string; + let preferenceFile: string; beforeEach(() => { - const mockUserConfig = "/mock/config"; - const preferenceFile = "userPreferences"; + mockUserConfig = "/mock/config"; + preferenceFile = "userPreferences"; mockModDirectory = "mock/mod/directory"; mockFs({ [`${mockUserConfig}/${preferenceFile}.json`]: JSON.stringify({ MOD_DIRECTORY: mockModDirectory, }), + [mockModDirectory]: { + "Stock Game": {}, + launcher: { + _backups: {}, + }, + }, }); + mockStore = new Store({ name: preferenceFile, cwd: mockUserConfig, }); + + mockLogger = sinon.stub(log); + sinon.stub(mockLogger.transports.file, "getFile").returns({ + path: "mock/log/file", + bytesWritten: 0, + clear: sinon.stub(), + size: 0, + on: sinon.stub(), + }); + + configService = new ConfigService(mockLogger, mockStore); }); afterEach(() => { + sinon.restore(); mockFs.restore(); }); + it("should get the skyrim directory", () => { + expect(configService.skyrimDirectory()).to.eql( + `${mockModDirectory}/Stock Game` + ); + }); + + it("should get the log directory", () => { + expect(configService.getLogDirectory()).to.eql("mock/log"); + }); + it("should get the mod directory", () => { - const configService = new ConfigService(mockStore); expect(configService.modDirectory()).to.eql("mock/mod/directory"); }); it("should return the modlist launcher directory", () => { - const configService = new ConfigService(mockStore); expect(configService.launcherDirectory()).to.eql( `${mockModDirectory}/launcher` ); }); + + it("should return the backup directory", () => { + expect(configService.backupDirectory()).to.eql( + `${mockModDirectory}/launcher/_backups` + ); + }); + + it("should return true if backups exist", () => { + expect(configService.backupsExist()).to.eql(true); + }); + + it("should return false if backups do not exist", () => { + mockFs({ + [mockModDirectory]: { + "Stock Game": {}, + launcher: {}, + }, + }); + expect(configService.backupsExist()).to.eql(false); + }); + + it("should return the preference", () => { + expect( + configService.getPreference(USER_PREFERENCE_KEYS.MOD_DIRECTORY) + ).to.eql(mockModDirectory); + }); + + it("should return true if the preference exists", () => { + expect( + configService.hasPreference(USER_PREFERENCE_KEYS.MOD_DIRECTORY) + ).to.eql(true); + }); + + it("should return false if the preference does not exist", () => { + expect(configService.hasPreference(USER_PREFERENCE_KEYS.GRAPHICS)).to.eql( + false + ); + }); + + it("should delete the preference", () => { + configService.deletePreference(USER_PREFERENCE_KEYS.MOD_DIRECTORY); + expect(mockStore.get(USER_PREFERENCE_KEYS.MOD_DIRECTORY)).to.eql(undefined); + }); + + it("should set the preference", () => { + configService.setPreference( + USER_PREFERENCE_KEYS.MOD_DIRECTORY, + "new/mod/directory" + ); + expect(mockStore.get(USER_PREFERENCE_KEYS.MOD_DIRECTORY)).to.eql( + "new/mod/directory" + ); + }); + + describe("Set default preferences", () => { + it("should set the default preference if the key doesn't exist", async () => { + await configService.setDefaultPreferences({ + [USER_PREFERENCE_KEYS.GRAPHICS]: { + value: "high", + }, + }); + expect(mockStore.get(USER_PREFERENCE_KEYS.GRAPHICS)).to.eql("high"); + }); + + it("should not set the default preference if it exists", async () => { + mockStore.set(USER_PREFERENCE_KEYS.MOD_DIRECTORY, "old/mod/directory"); + await configService.setDefaultPreferences({ + [USER_PREFERENCE_KEYS.MOD_DIRECTORY]: { + value: "new/mod/directory", + }, + }); + expect(mockStore.get(USER_PREFERENCE_KEYS.MOD_DIRECTORY)).to.eql( + "old/mod/directory" + ); + }); + + it("should set the preference if the current value is not valid", async () => { + await configService.setDefaultPreferences({ + [USER_PREFERENCE_KEYS.GRAPHICS]: { + value: "mockValue", + validate: async () => false, + }, + }); + expect(mockStore.get(USER_PREFERENCE_KEYS.GRAPHICS)).to.eql("mockValue"); + }); + + it("should not set the value if it is already present and valid", async () => { + mockStore.set(USER_PREFERENCE_KEYS.RESOLUTION, "high"); + await configService.setDefaultPreferences({ + [USER_PREFERENCE_KEYS.RESOLUTION]: { + value: "low", + validate: async () => true, + }, + }); + expect(mockStore.get(USER_PREFERENCE_KEYS.RESOLUTION)).to.eql("high"); + }); + + it("should set the preference if the value is valid", async () => { + mockFs({ + [`${mockUserConfig}/${preferenceFile}.json`]: JSON.stringify({}), + [mockModDirectory]: { + "Stock Game": {}, + launcher: { + _backups: {}, + }, + }, + }); + + await configService.setDefaultPreferences({ + [USER_PREFERENCE_KEYS.RESOLUTION]: { + value: "high", + validate: async () => true, + }, + }); + expect(mockStore.get(USER_PREFERENCE_KEYS.RESOLUTION)).to.eql("high"); + }); + }); + + it("should get the preferences", async () => { + expect(configService.getPreferences()).to.eql(mockStore); + }); + + it("should open the preferences in an editor", async () => { + const mockEditor = sinon.stub(mockStore, "openInEditor"); + await configService.editPreferences(); + expect(mockEditor.calledOnce).to.eql(true); + }); }); diff --git a/src/__tests__/unit/services/game.service.test.ts b/src/__tests__/unit/services/game.service.test.ts index 1087f612..8b8f8c37 100644 --- a/src/__tests__/unit/services/game.service.test.ts +++ b/src/__tests__/unit/services/game.service.test.ts @@ -7,6 +7,7 @@ import { import { GameService } from "@/main/services/game.service"; import { ConfigService } from "@/main/services/config.service"; import fs from "fs"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; describe("GameService", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; @@ -16,7 +17,7 @@ describe("GameService", () => { beforeEach(() => { mockConfigService = createStubInstance(ConfigService); - gameService = new GameService(mockConfigService); + gameService = new GameService(mockConfigService, mockLogger()); logPath = "mock/log/path"; }); diff --git a/src/__tests__/unit/services/graphics.service.test.ts b/src/__tests__/unit/services/graphics.service.test.ts index d1e45878..7eaa3a9f 100644 --- a/src/__tests__/unit/services/graphics.service.test.ts +++ b/src/__tests__/unit/services/graphics.service.test.ts @@ -11,6 +11,7 @@ import { FriendlyDirectoryMap } from "@/modpack-metadata"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { ProfileService } from "@/main/services/profile.service"; import fs from "fs"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; describe("Graphics service", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; @@ -22,7 +23,8 @@ describe("Graphics service", () => { mockProfileService = createStubInstance(ProfileService); graphicsService = new GraphicsService( mockConfigService, - mockProfileService + mockProfileService, + mockLogger() ); }); @@ -109,7 +111,7 @@ describe("Graphics service", () => { expect(graphics).to.eql(expected); }); - it("should get the graphics preference", () => { + it("should get the graphics preference", async () => { mockConfigService.stubs.getPreference .withArgs(USER_PREFERENCE_KEYS.GRAPHICS) .returns("mock-graphics-preference"); @@ -118,7 +120,7 @@ describe("Graphics service", () => { ); }); - it("should set the graphics preference", () => { + it("should set the graphics preference", async () => { graphicsService.setGraphicsPreference("mock-preference"); sinon.assert.calledWith( mockConfigService.stubs.setPreference, diff --git a/src/__tests__/unit/services/migration.service.test.ts b/src/__tests__/unit/services/migration.service.test.ts index 66226161..2a98ade1 100644 --- a/src/__tests__/unit/services/migration.service.test.ts +++ b/src/__tests__/unit/services/migration.service.test.ts @@ -10,6 +10,7 @@ import mockFs from "mock-fs"; import { ProfileService } from "@/main/services/profile.service"; import fs from "fs"; import { ConfigService } from "@/main/services/config.service"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; describe("Migration service", () => { let migrationService: MigrationService; @@ -136,7 +137,8 @@ describe("Migration service", () => { migrationService = new MigrationService( mockGraphicsService, mockProfileService, - mockConfigService + mockConfigService, + mockLogger() ); }); diff --git a/src/__tests__/unit/services/modOrganizer.service.test.ts b/src/__tests__/unit/services/modOrganizer.service.test.ts index ed4738f7..97a521b1 100644 --- a/src/__tests__/unit/services/modOrganizer.service.test.ts +++ b/src/__tests__/unit/services/modOrganizer.service.test.ts @@ -16,6 +16,7 @@ import { ProfileService } from "@/main/services/profile.service"; import { SystemService } from "@/main/services/system.service"; import { GraphicsService } from "@/main/services/graphics.service"; import mockFs from "mock-fs"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; describe("ModOrganizer service", () => { let mockEnbService: StubbedInstanceWithSinonAccessor; @@ -57,7 +58,8 @@ describe("ModOrganizer service", () => { mockGameService, mockProfileService, mockSystemService, - mockGraphicsService + mockGraphicsService, + mockLogger() ); expect(await modOrganizerService.isRunning()).to.eql(true); @@ -87,7 +89,8 @@ describe("ModOrganizer service", () => { mockGameService, mockProfileService, mockSystemService, - mockGraphicsService + mockGraphicsService, + mockLogger() ); expect(await modOrganizerService.getFirstCustomExecutableTitle()).to.eql( diff --git a/src/__tests__/unit/services/profile.service.test.ts b/src/__tests__/unit/services/profile.service.test.ts index 344e4939..70c4cda8 100644 --- a/src/__tests__/unit/services/profile.service.test.ts +++ b/src/__tests__/unit/services/profile.service.test.ts @@ -9,6 +9,7 @@ import { import { ConfigService } from "@/main/services/config.service"; import { ProfileService } from "@/main/services/profile.service"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; describe("Profile service", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; @@ -16,7 +17,7 @@ describe("Profile service", () => { beforeEach(() => { mockConfigService = createStubInstance(ConfigService); - profileService = new ProfileService(mockConfigService); + profileService = new ProfileService(mockConfigService, mockLogger()); }); afterEach(() => { diff --git a/src/__tests__/unit/services/startup.service.test.ts b/src/__tests__/unit/services/startup.service.test.ts index 838f91cd..3d5e58f3 100644 --- a/src/__tests__/unit/services/startup.service.test.ts +++ b/src/__tests__/unit/services/startup.service.test.ts @@ -19,6 +19,7 @@ import { UpdateService } from "@/main/services/update.service"; import { BlacklistService } from "@/main/services/blacklist.service"; import { ErrorService } from "@/main/services/error.service"; import { WindowService } from "@/main/services/window.service"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; describe("Startup service", () => { let mockModpackService: StubbedInstanceWithSinonAccessor; @@ -53,7 +54,8 @@ describe("Startup service", () => { mockUpdateService, mockBlacklistService, mockErrorService, - mockWindowService + mockWindowService, + mockLogger() ); }); diff --git a/src/__tests__/unit/services/system.service.test.ts b/src/__tests__/unit/services/system.service.test.ts index 40f5844b..af31e814 100644 --- a/src/__tests__/unit/services/system.service.test.ts +++ b/src/__tests__/unit/services/system.service.test.ts @@ -7,6 +7,7 @@ import { import { ConfigService } from "@/main/services/config.service"; import { ErrorService } from "@/main/services/error.service"; import psList from "ps-list"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; describe("System service", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; @@ -27,13 +28,14 @@ describe("System service", () => { systemService = new SystemService( mockConfigService, mockErrorService, + mockLogger(), mockListProcess ); expect(await systemService.isProcessRunning("mockname.exe")).to.eql(true); }); - it("should return false if a process is not", async () => { + it("should return false if a process is not running", async () => { const mockListProcess = () => new Promise((resolve) => resolve([{ name: "mockname.exe", pid: 1234, ppid: 1234 }]) @@ -41,6 +43,7 @@ describe("System service", () => { systemService = new SystemService( mockConfigService, mockErrorService, + mockLogger(), mockListProcess ); diff --git a/src/__tests__/unit/services/wabbajack.service.test.ts b/src/__tests__/unit/services/wabbajack.service.test.ts index c3a59aa9..16b6f7d2 100644 --- a/src/__tests__/unit/services/wabbajack.service.test.ts +++ b/src/__tests__/unit/services/wabbajack.service.test.ts @@ -8,6 +8,7 @@ import { sinon, StubbedInstanceWithSinonAccessor, } from "@loopback/testlab"; +import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; const mockLocalAppData = "mock/local/app/data"; @@ -75,13 +76,14 @@ describe("Wabbajack service", () => { wabbajackService = new WabbajackService( mockSystemService, - mockModpackService + mockModpackService, + mockLogger() ); }); afterEach(() => { - mockFs.restore(); sinon.restore(); + mockFs.restore(); }); it("should combine modlist info from wabbajack v2 and v3", async () => { diff --git a/src/__tests__/unit/setup/global-setup.ts b/src/__tests__/unit/setup/global-setup.ts deleted file mode 100644 index 047490eb..00000000 --- a/src/__tests__/unit/setup/global-setup.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { logger } from "@/main/logger"; - -// Disable logging -logger.transports.console.level = false; -logger.transports.file.level = false; diff --git a/src/__tests__/unit/support/mocks/logger.mock.ts b/src/__tests__/unit/support/mocks/logger.mock.ts new file mode 100644 index 00000000..78f7cc5f --- /dev/null +++ b/src/__tests__/unit/support/mocks/logger.mock.ts @@ -0,0 +1,5 @@ +import { sinon } from "@loopback/testlab/dist/sinon"; +import logger from "electron-log"; +import { uuid } from "@loopback/core"; + +export const mockLogger = () => sinon.stub(logger.create(uuid())); diff --git a/src/main.ts b/src/main.ts index ad12406f..c585994f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,15 +2,17 @@ import { app, protocol } from "electron"; import { isDevelopment } from "./main/services/config.service"; import { autoUpdater } from "electron-updater"; import { LauncherApplication } from "@/main/application"; -import { logger } from "@/main/logger"; import { ErrorService } from "@/main/services/error.service"; import { WindowService } from "@/main/services/window.service"; +import { newLogInstance } from "@/main/logger"; const isSingleInstance = app.requestSingleInstanceLock(); if (!isSingleInstance) { app.quit(); } +const logger = newLogInstance("Startup logger"); + // Ensure it's easy to tell where the logs for this application start const initialLog = `| ${new Date().toLocaleString()} |`; logger.debug("-".repeat(initialLog.length)); @@ -59,7 +61,7 @@ app.on("ready", async () => { try { await start(); } catch (error) { - const errorService = new ErrorService(); + const errorService = new ErrorService(logger); await errorService.handleError( "Failed to start application", (error as Error).message diff --git a/src/main/application.ts b/src/main/application.ts index 64bebad4..cb4dcb4d 100644 --- a/src/main/application.ts +++ b/src/main/application.ts @@ -1,11 +1,12 @@ import { StartupService } from "@/main/services/startup.service"; import { Constructor } from "@loopback/context"; import { WindowService } from "@/main/services/window.service"; -import { logger } from "@/main/logger"; +import { LoggerBinding } from "@/main/logger"; import { BootMixin } from "@loopback/boot"; import { Application } from "@loopback/core"; import { Controller } from "@/main/decorators/controller.decorator"; import { ErrorService } from "@/main/services/error.service"; +import logger from "electron-log"; const serviceNamespace = "services"; @@ -13,6 +14,8 @@ export class LauncherApplication extends BootMixin(Application) { constructor() { super(); + this.bindLogger(); + this.projectRoot = __dirname; this.onStart(async () => { @@ -54,4 +57,8 @@ export class LauncherApplication extends BootMixin(Application) { await renderService.createBrowserWindow(); await renderService.load("/"); } + + private bindLogger() { + this.bind(LoggerBinding).to(logger.create("launcher")); + } } diff --git a/src/main/controllers/modpack/modpack.controller.ts b/src/main/controllers/modpack/modpack.controller.ts index 1084c367..f4cb6e08 100644 --- a/src/main/controllers/modpack/modpack.controller.ts +++ b/src/main/controllers/modpack/modpack.controller.ts @@ -3,16 +3,17 @@ import { IsModpackValidResponse, MODPACK_EVENTS, } from "@/main/controllers/modpack/mopack.events"; -import { service } from "@loopback/core"; +import { inject, service } from "@loopback/core"; import { ModpackService } from "@/main/services/modpack.service"; -import { logger } from "@/main/logger"; import { LauncherService } from "@/main/services/launcher.service"; +import { Logger, LoggerBinding } from "@/main/logger"; @controller export class ModpackController { constructor( @service(ModpackService) private modpackService: ModpackService, - @service(LauncherService) private launcherService: LauncherService + @service(LauncherService) private launcherService: LauncherService, + @inject(LoggerBinding) private logger: Logger ) {} @handle(MODPACK_EVENTS.IS_MODPACK_SET) @@ -23,7 +24,7 @@ export class ModpackController { @handle(MODPACK_EVENTS.IS_MODPACK_DIRECTORY_VALID) isValidModDirectory(filepath: string): IsModpackValidResponse { if (!filepath) { - logger.warn("No filepath specified when checking mod directory"); + this.logger.warn("No filepath specified when checking mod directory"); return { ok: false }; } return this.modpackService.checkModpackPathIsValid(filepath); @@ -32,7 +33,7 @@ export class ModpackController { @handle(MODPACK_EVENTS.SET_MODPACK) setModpack(filepath: string) { if (!filepath) { - logger.error("No filepath specified when setting mod directory"); + this.logger.error("No filepath specified when setting mod directory"); } return this.launcherService.setModpack(filepath); } diff --git a/src/main/decorators/controller.decorator.ts b/src/main/decorators/controller.decorator.ts index 4423cc25..be5f8531 100644 --- a/src/main/decorators/controller.decorator.ts +++ b/src/main/decorators/controller.decorator.ts @@ -1,17 +1,21 @@ import { ipcMain, IpcMainInvokeEvent } from "electron"; -import { logger } from "@/main/logger"; import { Constructor } from "@loopback/context"; +import log from "electron-log"; +import "reflect-metadata"; export interface Controller { - registerHandlers: () => void; + registerHandlers(): void; } -const Handlers = "Handlers"; +const HandlersMetadataKey = Symbol("handlers"); +const logger = log.create("decorator"); +type HandlerMap = Map unknown>; /** Add a method to controllers that can be called to register all IPC handlers. This is then automatically be called by the booter. e.g. + ```typescript @controller class ExampleController { @@ -21,34 +25,43 @@ const Handlers = "Handlers"; } } + ``` */ -export function controller>(Base: T) { +export function controller>(Base: T) { return { [Base.name]: class extends Base implements Controller { public registerHandlers() { - const handlers = Base.prototype[Handlers]; - handlers.forEach( - (method: (...args: unknown[]) => unknown, channel: string) => { - logger.silly(`Registered handler "${channel}"`); - ipcMain.handle( - channel, - (event: IpcMainInvokeEvent, ...args: unknown[]) => - method.apply(this, [...args, event]) - ); - } + const handlers: HandlerMap = Reflect.getMetadata( + HandlersMetadataKey, + this ); + handlers.forEach((method, channel) => { + logger.silly(`Registered handler "${channel}"`); + ipcMain.handle( + channel, + (event: IpcMainInvokeEvent, ...args: unknown[]) => + method.apply(this, [...args, event]) + ); + }); } }, }[Base.name]; } +/** + * @handle decorator for controllers. + * This decorator is used to register a method as an IPC handler. + * @param channel - The channel name to listen for. + */ export function handle(channel: string) { return function ( - target: Record, + target: object, propertyKey: string, propertyDescriptor: PropertyDescriptor ) { - target[Handlers] = target[Handlers] || new Map(); - target[Handlers].set(channel, propertyDescriptor.value); + const handlers = + Reflect.getMetadata(HandlersMetadataKey, target) || new Map(); + handlers.set(channel, propertyDescriptor.value); + Reflect.defineMetadata(HandlersMetadataKey, handlers, target); }; } diff --git a/src/main/logger.ts b/src/main/logger.ts index 34bfdeba..0afcc25e 100644 --- a/src/main/logger.ts +++ b/src/main/logger.ts @@ -1,4 +1,11 @@ -import log from "electron-log"; +import { BindingKey } from "@loopback/context/dist/binding-key"; +import log, { ElectronLog } from "electron-log"; +import { uuid } from "@loopback/context/dist/value-promise"; -// Export from here in case we want to write any wrappers around the methods or change logger -export const logger = log; +export type Logger = ElectronLog; +export const LoggerBinding = BindingKey.create("bindings.logger"); + +export const newLogInstance = (id = uuid()) => log.create(id); + +// Export an instance of the logger that the renderer can use because it doesn't use dependency injection. +export const logger = newLogInstance("renderer"); diff --git a/src/main/preload.ts b/src/main/preload.ts index 2885885f..a99854f9 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -7,7 +7,7 @@ contextBridge.exposeInMainWorld("ipcRenderer", { invoke: (channel: string, data: unknown) => { return ipcRenderer.invoke(channel, data); }, - on: (channel: string, callback: Function) => { + on: (channel: string, callback: (...args: unknown[]) => unknown) => { // Deliberately strip event as it includes `sender` ipcRenderer.on(channel, (event, ...args) => callback(...args)); }, diff --git a/src/main/services/config.service.ts b/src/main/services/config.service.ts index 9699da45..ce15c357 100644 --- a/src/main/services/config.service.ts +++ b/src/main/services/config.service.ts @@ -2,8 +2,8 @@ import Store from "electron-store"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { Resolution } from "@/Resolution"; import path from "path"; -import { BindingScope, injectable } from "@loopback/context"; -import { logger } from "@/main/logger"; +import { BindingScope, inject, injectable } from "@loopback/context"; +import { Logger, LoggerBinding } from "@/main/logger"; import fs from "fs"; export const appRoot = path.resolve(`${__dirname}/../../`); @@ -23,26 +23,27 @@ export interface UserPreferences { type PreferenceWithValidator = { [key in keyof UserPreferences]?: { value: UserPreferences[keyof UserPreferences]; - validate?: (...args: unknown[]) => boolean | Promise; + validate?: (...args: unknown[]) => Promise; }; }; -export const userPreferences = new Store({ - name: "userPreferences", -}); - @injectable({ scope: BindingScope.SINGLETON, }) export class ConfigService { - constructor(private config = userPreferences) {} + constructor( + @inject(LoggerBinding) private logger: Logger, + private readonly config = new Store({ + name: "userPreferences", + }) + ) {} skyrimDirectory() { return `${this.modDirectory()}/Stock Game`; } getLogDirectory() { - return path.dirname(logger.transports?.file.getFile().path); + return path.dirname(this.logger.transports?.file.getFile().path); } modDirectory() { @@ -72,15 +73,17 @@ export class ConfigService { } deletePreference(key: keyof UserPreferences) { - logger.debug(`Deleting preference: ${key}`); + this.logger.debug(`Deleting preference: ${key}`); return this.config.delete(key); } setPreference(key: keyof UserPreferences | string, value: unknown) { if (typeof value === "object") { - logger.debug(`Setting preference ${key} to ${JSON.stringify(value)}`); + this.logger.debug( + `Setting preference ${key} to ${JSON.stringify(value)}` + ); } else { - logger.debug(`Setting preference ${key} to ${value}`); + this.logger.debug(`Setting preference ${key} to ${value}`); } return this.config.set(key, value); } @@ -88,14 +91,16 @@ export class ConfigService { /** Set the value specified if the key doesn't exist or the current value is invalid */ - async setDefaultPreferences(preferences: PreferenceWithValidator) { - logger.debug("Setting default user preferences"); - logger.debug(`Current preferences`); - logger.debug(this.getPreferences().store); + async setDefaultPreferences( + preferences: PreferenceWithValidator + ): Promise { + this.logger.debug("Setting default user preferences"); + this.logger.debug(`Current preferences`); + this.logger.debug(this.getPreferences().store); for (const [key, { value, validate }] of Object.entries(preferences)) { const valid = validate ? await validate() : true; if (!valid) { - logger.warn( + this.logger.warn( `Current ${key} preference is invalid. Setting to default: ${value}` ); } @@ -103,8 +108,8 @@ export class ConfigService { this.setPreference(key, value); } } - logger.debug("New preferences"); - logger.debug(this.getPreferences().store); + this.logger.debug("New preferences"); + this.logger.debug(this.getPreferences().store); } getPreferences() { @@ -112,6 +117,6 @@ export class ConfigService { } editPreferences() { - return userPreferences.openInEditor(); + return this.config.openInEditor(); } } diff --git a/src/main/services/enb.service.ts b/src/main/services/enb.service.ts index 987a69c4..aa17b5c3 100644 --- a/src/main/services/enb.service.ts +++ b/src/main/services/enb.service.ts @@ -1,14 +1,14 @@ import fs from "fs"; -import { logger } from "@/main/logger"; -import { ConfigService, userPreferences } from "@/main/services/config.service"; +import { ConfigService } from "@/main/services/config.service"; import { copy, existsSync } from "fs-extra"; import { not as isNotJunk } from "junk"; import { FriendlyDirectoryMap } from "@/modpack-metadata"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { service } from "@loopback/core"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { AdditionalInstruction } from "@/additional-instructions"; import { InstructionService } from "@/main/services/instruction.service"; +import { Logger, LoggerBinding } from "@/main/logger"; const noEnb = "noEnb"; type noEnb = typeof noEnb; @@ -22,11 +22,16 @@ export class EnbService { constructor( @service(ConfigService) private configService: ConfigService, @service(InstructionService) - private modpackInstructionsService: InstructionService + private modpackInstructionsService: InstructionService, + @inject(LoggerBinding) private logger: Logger ) {} + private static getEnbInstruction(instruction: AdditionalInstruction) { + return instruction.type === "enb"; + } + enbDirectory() { - return `${userPreferences.get( + return `${this.configService.getPreference( USER_PREFERENCE_KEYS.MOD_DIRECTORY )}/launcher/ENB Presets`; } @@ -34,9 +39,9 @@ export class EnbService { async getENBPresets(): Promise { const mappedEnbs = JSON.parse( await fs.promises.readFile( - `${userPreferences.get(USER_PREFERENCE_KEYS.MOD_DIRECTORY)}/launcher/${ - this.ENBNameMappingFile - }`, + `${this.configService.getPreference( + USER_PREFERENCE_KEYS.MOD_DIRECTORY + )}/launcher/${this.ENBNameMappingFile}`, "utf-8" ) ) as FriendlyDirectoryMap[]; @@ -85,7 +90,7 @@ export class EnbService { const presets = await this.getENBPresets(); const isInList = presets.filter(({ real }) => real === preset).length > 0; if (!isInList) { - logger.debug( + this.logger.debug( `enb preset "${preset}" in not in preset list: ${JSON.stringify( presets )}` @@ -116,12 +121,12 @@ export class EnbService { * Defined in additional-instructions.json */ async postSetEnb(enb: string) { - logger.info("Handling additional enb set instructions"); + this.logger.info("Handling additional enb set instructions"); const modpackEnbInstructions = this.modpackInstructionsService .getInstructions() .filter(EnbService.getEnbInstruction); if (modpackEnbInstructions) { - logger.debug( + this.logger.debug( `Found modpack instructions: ${JSON.stringify(modpackEnbInstructions)}` ); await this.modpackInstructionsService.execute( @@ -131,17 +136,13 @@ export class EnbService { } } - private static getEnbInstruction(instruction: AdditionalInstruction) { - return instruction.type === "enb"; - } - async backupOriginalENBs() { const ENBBackupDirectory = `${this.configService.backupDirectory()}/ENB Presets`; const backupExists = existsSync(ENBBackupDirectory); - logger.debug(`Backup for ENBs exists: ${backupExists}`); + this.logger.debug(`Backup for ENBs exists: ${backupExists}`); if (!backupExists) { - logger.info("No ENB backup exists. Backing up..."); + this.logger.info("No ENB backup exists. Backing up..."); await fs.promises.mkdir(this.configService.backupDirectory(), { recursive: true, }); @@ -151,11 +152,11 @@ export class EnbService { } async restoreENBPresets() { - logger.info("Restoring ENB presets"); + this.logger.info("Restoring ENB presets"); const ENBBackupDirectory = `${this.configService.backupDirectory()}/ENB Presets`; await copy(ENBBackupDirectory, this.enbDirectory(), { overwrite: true }); await this.copyEnbFiles( - userPreferences.get(USER_PREFERENCE_KEYS.ENB_PROFILE), + this.configService.getPreference(USER_PREFERENCE_KEYS.ENB_PROFILE), false ); } @@ -195,37 +196,37 @@ export class EnbService { * so all presets need to be read to ensure everything is removed */ async deleteAllENBFiles() { - logger.info("Deleting ENB Files"); + this.logger.info("Deleting ENB Files"); const existingENBFiles = await this.getExistingENBFiles(); for (const file of existingENBFiles) { const fileWithPath = `${this.configService.skyrimDirectory()}/${file}`; - logger.debug(`Deleting ENB file ${file} with path ${fileWithPath}`); + this.logger.debug(`Deleting ENB file ${file} with path ${fileWithPath}`); const isDirectory = (await fs.promises.lstat(fileWithPath)).isDirectory(); await fs.promises.rm(fileWithPath, { recursive: isDirectory }); } } async syncENBFromGameToPresets(preset: string | noEnb) { - logger.info(`Syncing ENB changes back to presets for ${preset}`); + this.logger.info(`Syncing ENB changes back to presets for ${preset}`); if (preset !== noEnb) { const enbFiles = await this.getENBFilesForPreset(preset); - logger.debug( + this.logger.debug( `ENB files that need to be synced: ${JSON.stringify(enbFiles)}` ); for (const file of enbFiles) { const fileWithPath = `${this.configService.skyrimDirectory()}/${file}`; const fileDestination = `${this.enbDirectory()}/${preset}/${file}`; - logger.debug(`Copying ${file} to ${fileDestination}`); + this.logger.debug(`Copying ${file} to ${fileDestination}`); if (existsSync(fileWithPath)) { await copy(fileWithPath, fileDestination, { overwrite: true }); } } } - logger.info("Finished syncing ENB presets"); + this.logger.info("Finished syncing ENB presets"); } /** @@ -234,10 +235,10 @@ export class EnbService { * @param sync - Whether to sync the changes from Stock Game back to the ENB Preset directory */ async copyEnbFiles(profile: string | noEnb, sync = true) { - logger.info(`Copying ${profile} ENB Files prerequisite`); + this.logger.info(`Copying ${profile} ENB Files prerequisite`); const previousProfile = - (userPreferences.get( + (this.configService.getPreference( USER_PREFERENCE_KEYS.PREVIOUS_ENB_PROFILE ) as string) || ""; if (sync && previousProfile && previousProfile !== noEnb) { @@ -247,7 +248,7 @@ export class EnbService { await this.deleteAllENBFiles(); - logger.info(`Copying ${profile} ENB Files`); + this.logger.info(`Copying ${profile} ENB Files`); // All ENB files have been deleted already so nothing to do if the preset is noEnb if (profile !== noEnb) { @@ -256,7 +257,7 @@ export class EnbService { for (const file of ENBFiles) { const fileWithPath = `${this.enbDirectory()}/${profile}/${file}`; const fileDestination = `${this.configService.skyrimDirectory()}/${file}`; - logger.debug( + this.logger.debug( `Copy ENB file ${file} with path ${fileWithPath} to ${fileDestination}` ); await copy(fileWithPath, fileDestination); diff --git a/src/main/services/error.service.ts b/src/main/services/error.service.ts index 0d3e01fd..f16a5976 100644 --- a/src/main/services/error.service.ts +++ b/src/main/services/error.service.ts @@ -1,22 +1,24 @@ import { dialog } from "electron"; -import { logger } from "@/main/logger"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, }) export class ErrorService { + constructor(@inject(LoggerBinding) private logger: Logger) {} + async handleError(title: string, message: string) { - logger.error(`${title}: ${message}`); - logger.error(new Error().stack); + this.logger.error(`${title}: ${message}`); + this.logger.error(new Error().stack); await dialog.showErrorBox(title, message); } async handleUnknownError(error?: unknown) { - logger.error( + this.logger.error( `Unknown error. The stack trace might hold more details. ${error}` ); - logger.error(new Error().stack); + this.logger.error(new Error().stack); await dialog.showErrorBox( "An unknown error has occurred", "If you require more support, please post a message in the official modpack Discord and send your launcher log files." diff --git a/src/main/services/game.service.ts b/src/main/services/game.service.ts index 5baa0825..263968e6 100644 --- a/src/main/services/game.service.ts +++ b/src/main/services/game.service.ts @@ -1,17 +1,20 @@ -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { ConfigService } from "@/main/services/config.service"; import { service } from "@loopback/core"; import fs from "fs"; -import { logger } from "@/main/logger"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, }) export class GameService { - constructor(@service(ConfigService) private configService: ConfigService) {} + constructor( + @service(ConfigService) private configService: ConfigService, + @inject(LoggerBinding) private logger: Logger + ) {} async copySkyrimLaunchLogs() { - logger.info("Copying Skyrim launch logs"); + this.logger.info("Copying Skyrim launch logs"); const launchLogPath = `${this.configService.skyrimDirectory()}/d3dx9_42.log`; const logPath = this.configService.getLogDirectory(); if (fs.existsSync(launchLogPath)) { diff --git a/src/main/services/graphics.service.ts b/src/main/services/graphics.service.ts index e3f0afff..372b0aba 100644 --- a/src/main/services/graphics.service.ts +++ b/src/main/services/graphics.service.ts @@ -3,16 +3,17 @@ import fs from "fs"; import { ConfigService } from "@/main/services/config.service"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { not as isNotJunk } from "junk"; -import { service } from "@loopback/core"; +import { inject, service } from "@loopback/core"; import { ProfileService } from "@/main/services/profile.service"; import path from "path"; -import { logger } from "@/main/logger"; import { copy, existsSync } from "fs-extra"; +import { Logger, LoggerBinding } from "@/main/logger"; export class GraphicsService { constructor( @service(ConfigService) private configService: ConfigService, - @service(ProfileService) private profileService: ProfileService + @service(ProfileService) private profileService: ProfileService, + @inject(LoggerBinding) private logger: Logger ) {} graphicsDirectory() { @@ -27,10 +28,6 @@ export class GraphicsService { return `${this.configService.launcherDirectory()}/${this.graphicsMappingFile()}`; } - private graphicsBackupDirectory() { - return `${this.configService.backupDirectory()}/graphics`; - } - async isInGraphicsList(graphics: string) { return ( (await this.getGraphics()).filter(({ real }) => real === graphics) @@ -46,43 +43,13 @@ export class GraphicsService { return (await this.getGraphics())[0].real; } - private async getMappedGraphics(): Promise { - return JSON.parse( - await fs.promises.readFile(`${this.graphicsMappingPath()}`, "utf-8") - ); - } - - private async getUnmappedGraphics(mappedGraphics: FriendlyDirectoryMap[]) { - return ( - ( - await fs.promises.readdir(this.graphicsDirectory(), { - withFileTypes: true, - }) - ) - .filter((dirent) => dirent.isDirectory()) - .map((dirent) => dirent.name) - .filter(isNotJunk) - .map( - (preset): FriendlyDirectoryMap => ({ real: preset, friendly: preset }) - ) - // Remove any graphics that have a mapping - .filter( - (unmappedSetting) => - !mappedGraphics.find( - (mappedSetting: FriendlyDirectoryMap) => - mappedSetting.real === unmappedSetting.real - ) - ) - ); - } - async syncGraphicsFromGameToPresets(graphicsPreset: string, profile: string) { - logger.info( + this.logger.info( `Syncing graphics changes back to presets for ${graphicsPreset}` ); const graphicsFiles = await this.getGraphicsFilesForPreset(graphicsPreset); - logger.debug( + this.logger.debug( `Graphics files that need to be synced: ${JSON.stringify(graphicsFiles)}` ); @@ -90,12 +57,12 @@ export class GraphicsService { const fileWithPath = `${this.profileService.profileDirectory()}/${profile}/${file}`; const fileDestination = `${this.graphicsDirectory()}/${graphicsPreset}/${file}`; if (existsSync(fileWithPath)) { - logger.debug(`Copying ${fileWithPath} to ${fileDestination}`); + this.logger.debug(`Copying ${fileWithPath} to ${fileDestination}`); await copy(fileWithPath, fileDestination, { overwrite: true }); } } - logger.info("Finished syncing graphics presets"); + this.logger.info("Finished syncing graphics presets"); } async getGraphics(): Promise { @@ -115,7 +82,7 @@ export class GraphicsService { } async setGraphics(graphics: string) { - logger.info(`Setting graphics to ${graphics}`); + this.logger.info(`Setting graphics to ${graphics}`); this.setGraphicsPreference(graphics); await this.updateProfilesWithGraphics(graphics); } @@ -125,7 +92,7 @@ export class GraphicsService { } async updateProfilesWithGraphics(preset: string) { - logger.debug("Updating profiles with graphics settings"); + this.logger.debug("Updating profiles with graphics settings"); const graphics = (await this.getGraphicsFilesForPreset(preset)).map( (file) => `${this.graphicsDirectory()}/${preset}/${file}` ); @@ -133,7 +100,7 @@ export class GraphicsService { return Promise.all( profiles.map((profile) => graphics.map(async (file) => { - logger.debug(`Copying ${file} to ${profile}`); + this.logger.debug(`Copying ${file} to ${profile}`); await fs.promises.copyFile(file, `${profile}/${path.basename(file)}`); }) ) @@ -146,10 +113,10 @@ export class GraphicsService { async backupOriginalGraphics() { const backupExists = existsSync(this.graphicsBackupDirectory()); - logger.debug(`Backup for graphics exists: ${backupExists}`); + this.logger.debug(`Backup for graphics exists: ${backupExists}`); if (!backupExists) { - logger.info("No graphics backup exists. Backing up..."); + this.logger.info("No graphics backup exists. Backing up..."); await fs.promises.mkdir(this.configService.backupDirectory(), { recursive: true, }); @@ -168,14 +135,48 @@ export class GraphicsService { } async restoreGraphics() { - logger.info("Restoring graphics settings"); - logger.debug( + this.logger.info("Restoring graphics settings"); + this.logger.debug( `Copying ${this.graphicsBackupDirectory()} to ${this.graphicsDirectory()}` ); await copy(this.graphicsBackupDirectory(), this.graphicsDirectory(), { overwrite: true, }); await this.updateProfilesWithGraphics(this.getGraphicsPreference()); - logger.info("Graphics restored"); + this.logger.info("Graphics restored"); + } + + private graphicsBackupDirectory() { + return `${this.configService.backupDirectory()}/graphics`; + } + + private async getMappedGraphics(): Promise { + return JSON.parse( + await fs.promises.readFile(`${this.graphicsMappingPath()}`, "utf-8") + ); + } + + private async getUnmappedGraphics(mappedGraphics: FriendlyDirectoryMap[]) { + return ( + ( + await fs.promises.readdir(this.graphicsDirectory(), { + withFileTypes: true, + }) + ) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name) + .filter(isNotJunk) + .map( + (preset): FriendlyDirectoryMap => ({ real: preset, friendly: preset }) + ) + // Remove any graphics that have a mapping + .filter( + (unmappedSetting) => + !mappedGraphics.find( + (mappedSetting: FriendlyDirectoryMap) => + mappedSetting.real === unmappedSetting.real + ) + ) + ); } } diff --git a/src/main/services/instruction.service.ts b/src/main/services/instruction.service.ts index 012fca69..c3b5b775 100644 --- a/src/main/services/instruction.service.ts +++ b/src/main/services/instruction.service.ts @@ -4,8 +4,7 @@ import { } from "@/additional-instructions"; import modpackAdditionalInstructions from "@/additional-instructions.json"; import fs from "fs"; -import { BindingScope, injectable } from "@loopback/context"; -import { logger } from "@/main/logger"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { service } from "@loopback/core"; import { ConfigService } from "@/main/services/config.service"; import { ProfileService } from "@/main/services/profile.service"; @@ -13,6 +12,7 @@ import * as readline from "readline"; import * as os from "os"; import { PathLike } from "fs-extra"; import { WabbajackService } from "@/main/services/wabbajack.service"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, @@ -21,9 +21,19 @@ export class InstructionService { constructor( @service(ConfigService) private configService: ConfigService, @service(ProfileService) private profileService: ProfileService, - @service(WabbajackService) private wabbajackService: WabbajackService + @service(WabbajackService) private wabbajackService: WabbajackService, + @inject(LoggerBinding) private logger: Logger ) {} + private static checkTargetMatches( + instruction: PluginOrModInstruction, + target: string + ) { + return typeof instruction.target === "string" + ? instruction.target === target + : instruction.target.includes(target); + } + getInstructions(): AdditionalInstructions { return modpackAdditionalInstructions as AdditionalInstructions; } @@ -32,7 +42,7 @@ export class InstructionService { const modpackVersion = await this.wabbajackService.getModpackVersion(); for (const instruction of instructions) { - logger.debug( + this.logger.debug( `Handling instruction ${JSON.stringify( instruction )} for modpack version ${modpackVersion}` @@ -110,20 +120,20 @@ export class InstructionService { plugin: string, state: "enable" | "disable" ): Promise { - logger.info(`Toggling plugin ${plugin} to state ${state}`); + this.logger.info(`Toggling plugin ${plugin} to state ${state}`); for (const pluginsFile of await this.getPluginFiles()) { - logger.debug(`Toggling plugin in ${pluginsFile}`); + this.logger.debug(`Toggling plugin in ${pluginsFile}`); const plugins = this.getPluginsFromFile(pluginsFile); const editedFile = []; for await (let currentPlugin of plugins) { if (currentPlugin.replace("*", "") === plugin) { if (state === "disable" && currentPlugin.startsWith("*")) { - logger.debug(`Disabling plugin ${plugin}`); + this.logger.debug(`Disabling plugin ${plugin}`); currentPlugin = currentPlugin.replace("*", ""); } else if (state === "enable" && !currentPlugin.startsWith("*")) { - logger.debug(`Enabling plugin ${plugin}`); + this.logger.debug(`Enabling plugin ${plugin}`); currentPlugin = `*${currentPlugin}`; } } @@ -145,10 +155,10 @@ export class InstructionService { * Disabled mods have a - symbol, like this: -Wildlander FULL */ async toggleMod(mod: string, state: "enable" | "disable"): Promise { - logger.info(`Toggling mod ${mod} to state ${state}`); + this.logger.info(`Toggling mod ${mod} to state ${state}`); for (const modlistFile of await this.getModlistFiles()) { - logger.debug(`Toggling mod in ${modlistFile}`); + this.logger.debug(`Toggling mod in ${modlistFile}`); const mods = this.getModsFromFile(modlistFile); const editedFile = []; @@ -158,10 +168,10 @@ export class InstructionService { currentMod.replace("-", "") === mod ) { if (state === "disable" && currentMod.startsWith("+")) { - logger.debug(`Disabling mod ${mod}`); + this.logger.debug(`Disabling mod ${mod}`); currentMod = currentMod.replace("+", "-"); } else if (state === "enable" && currentMod.startsWith("-")) { - logger.debug(`Enabling mod ${mod}`); + this.logger.debug(`Enabling mod ${mod}`); currentMod = currentMod.replace("-", "+"); } } @@ -204,13 +214,4 @@ export class InstructionService { `${this.profileService.profileDirectory()}/${name}/plugins.txt` ); } - - private static checkTargetMatches( - instruction: PluginOrModInstruction, - target: string - ) { - return typeof instruction.target === "string" - ? instruction.target === target - : instruction.target.includes(target); - } } diff --git a/src/main/services/launcher.service.ts b/src/main/services/launcher.service.ts index 8bfe0180..a85bfabe 100644 --- a/src/main/services/launcher.service.ts +++ b/src/main/services/launcher.service.ts @@ -6,13 +6,13 @@ import { EnbService } from "@/main/services/enb.service"; import { ConfigService } from "@/main/services/config.service"; import { ResolutionService } from "@/main/services/resolution.service"; import { ModpackService } from "@/main/services/modpack.service"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { app } from "electron"; -import { logger } from "@/main/logger"; import { ErrorService } from "@/main/services/error.service"; import { WindowService } from "@/main/services/window.service"; import { GraphicsService } from "@/main/services/graphics.service"; import { MigrationService } from "@/main/services/migration.service"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, @@ -29,11 +29,12 @@ export class LauncherService { @service(ErrorService) private errorService: ErrorService, @service(WindowService) private windowService: WindowService, @service(GraphicsService) private graphicsService: GraphicsService, - @service(MigrationService) private migrationService: MigrationService + @service(MigrationService) private migrationService: MigrationService, + @inject(LoggerBinding) private logger: Logger ) {} async refreshModpack() { - logger.debug("Refreshing modpack"); + this.logger.debug("Refreshing modpack"); return this.setModpack(this.modpackService.getModpackDirectory()); } @@ -71,7 +72,7 @@ export class LauncherService { } async validateConfig() { - logger.debug("Validating config..."); + this.logger.debug("Validating config..."); await this.configService.setDefaultPreferences({ [USER_PREFERENCE_KEYS.ENB_PROFILE]: { value: await this.enbService.getDefaultPreference(), @@ -96,7 +97,7 @@ export class LauncherService { ), }, }); - logger.debug("Config validated"); + this.logger.debug("Config validated"); } async backupAssets() { diff --git a/src/main/services/migration.service.ts b/src/main/services/migration.service.ts index 0c7bcb84..883d3fdb 100644 --- a/src/main/services/migration.service.ts +++ b/src/main/services/migration.service.ts @@ -1,23 +1,24 @@ -import { service } from "@loopback/core"; +import { inject, service } from "@loopback/core"; import { GraphicsService } from "@/main/services/graphics.service"; -import { logger } from "@/main/logger"; import { ProfileService } from "@/main/services/profile.service"; import fs from "fs"; import path from "path"; import { ConfigService } from "@/main/services/config.service"; import { copy } from "fs-extra"; import { asyncFilter } from "@/shared/util/asyncFilter"; +import { Logger, LoggerBinding } from "@/main/logger"; export class MigrationService { + private standardProfileName = "0_Wildlander-STANDARD"; + private performanceProfileName = "0_Wildlander-PERFORMANCE"; + constructor( @service(GraphicsService) private graphicsService: GraphicsService, @service(ProfileService) private profileService: ProfileService, - @service(ConfigService) private configService: ConfigService + @service(ConfigService) private configService: ConfigService, + @inject(LoggerBinding) private logger: Logger ) {} - private standardProfileName = "0_Wildlander-STANDARD"; - private performanceProfileName = "0_Wildlander-PERFORMANCE"; - /** * Wildlander originally shipped with graphics settings in the profiles. * This makes maintenance of profiles that have the same modlists but different graphics difficult. @@ -34,44 +35,50 @@ export class MigrationService { this.performanceProfileName }`; - logger.debug("Separate profile from graphics migration"); + this.logger.debug("Separate profile from graphics migration"); if (!(await this.graphicsService.graphicsExist())) { - logger.debug("Creating graphics presets from profiles"); + this.logger.debug("Creating graphics presets from profiles"); const profiles = await this.profileService.getProfileDirectories(); - logger.debug(`Creating ${this.graphicsService.graphicsMappingFile()}`); + this.logger.debug( + `Creating ${this.graphicsService.graphicsMappingFile()}` + ); await copy( this.profileService.profileMappingFile(), this.graphicsService.graphicsMappingPath() ); - logger.debug("Creating new standard profile"); + this.logger.debug("Creating new standard profile"); await this.createNewProfiles( standardProfilePath, potatoProfilePath, profiles ); - logger.debug("Moving graphics out of profiles"); + this.logger.debug("Moving graphics out of profiles"); await this.moveGraphicsFromProfiles(profiles); - logger.debug("Create new mapped profile file"); + this.logger.debug("Create new mapped profile file"); await this.createMappedProfileFile(); - logger.debug("Select first profile so the old original one isn't reused"); + this.logger.debug( + "Select first profile so the old original one isn't reused" + ); await this.profileService.setProfilePreference( ( await this.profileService.getProfiles() )[0].real ); - logger.debug( + this.logger.debug( `New profile is ${await this.profileService.getProfilePreference()}` ); - logger.debug("Migration complete"); + this.logger.debug("Migration complete"); } else { - logger.debug("Graphics presets already exist, not performing migration"); + this.logger.debug( + "Graphics presets already exist, not performing migration" + ); } } @@ -82,7 +89,7 @@ export class MigrationService { ) { if (this.configService.backupsExist()) { // Create the new profiles from the backup taken when the launcher first ran - logger.debug( + this.logger.debug( "Create the new standard and performance profile from backup" ); const backedUpProfiles = @@ -95,7 +102,7 @@ export class MigrationService { await copy(backedUpPerformanceProfile, performanceProfilePath); } else { // If there is no backup, just use the first one - logger.debug( + this.logger.debug( "Create the new standard profile from the first profile in the list because no backup exists" ); const performanceProfile = @@ -129,7 +136,7 @@ export class MigrationService { recursive: true, }); const dest = `${graphicsDirectory}/${path.basename(file)}`; - logger.debug(`Move ${file} to ${dest}`); + this.logger.debug(`Move ${file} to ${dest}`); await fs.promises.rename(file, dest); } diff --git a/src/main/services/modOrganizer.service.ts b/src/main/services/modOrganizer.service.ts index 0c5790f0..d71b40d3 100644 --- a/src/main/services/modOrganizer.service.ts +++ b/src/main/services/modOrganizer.service.ts @@ -1,6 +1,6 @@ import path from "path"; import childProcess from "child_process"; -import { ConfigService, userPreferences } from "@/main/services/config.service"; +import { ConfigService } from "@/main/services/config.service"; import psList from "ps-list"; import { dialog } from "electron"; import fs from "fs"; @@ -9,17 +9,17 @@ import { IIniObjectSection } from "js-ini/src/interfaces/ini-object-section"; import { promisify } from "util"; import { IIniObject } from "js-ini/lib/interfaces/ini-object"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; -import { logger } from "@/main/logger"; import { EnbService } from "@/main/services/enb.service"; import { service } from "@loopback/core"; import { ErrorService } from "@/main/services/error.service"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { ResolutionService } from "@/main/services/resolution.service"; import { GameService } from "@/main/services/game.service"; import { ProfileService } from "@/main/services/profile.service"; import { SystemService } from "@/main/services/system.service"; import { GraphicsService } from "@/main/services/graphics.service"; import { ModOrganizerIni } from "@/ModOrganizer.ini"; +import { Logger, LoggerBinding } from "@/main/logger"; export const enum MO2Names { MO2EXE = "ModOrganizer.exe", @@ -40,7 +40,8 @@ export class ModOrganizerService { @service(GameService) private gameService: GameService, @service(ProfileService) private profileService: ProfileService, @service(SystemService) private systemService: SystemService, - @service(GraphicsService) private graphicsService: GraphicsService + @service(GraphicsService) private graphicsService: GraphicsService, + @inject(LoggerBinding) private logger: Logger ) {} private static filterMO2(process: psList.ProcessDescriptor) { @@ -52,18 +53,20 @@ export class ModOrganizerService { } async closeMO2() { - logger.info("Killing MO2 forcefully"); + this.logger.info("Killing MO2 forcefully"); (await psList()) .filter(ModOrganizerService.filterMO2) .forEach((mo2Instance) => { - logger.debug(`Found process to kill: ${JSON.stringify(mo2Instance)}`); + this.logger.debug( + `Found process to kill: ${JSON.stringify(mo2Instance)}` + ); process.kill(mo2Instance.pid); }); - logger.info("Killed all MO2 processes"); + this.logger.info("Killed all MO2 processes"); } async handleMO2Running(): Promise { - logger.info( + this.logger.info( "MO2 already running. Giving user option to cancel or continue" ); const buttonSelectionIndex = await dialog.showMessageBox({ @@ -95,7 +98,7 @@ export class ModOrganizerService { } async updateSelectedProfile(profile: string) { - logger.info(`Updating selected profile to ${profile}`); + this.logger.info(`Updating selected profile to ${profile}`); const settings = await this.readSettings(); (settings.General as IIniObjectSection)[ @@ -109,7 +112,7 @@ export class ModOrganizerService { } async preventMO2GUIFromShowing() { - logger.info(`Preventing the MO2 GUI from showing`); + this.logger.info(`Preventing the MO2 GUI from showing`); const settings = await this.readSettings(); // Copy the object so changes don't mutate it this.previousMO2Settings = JSON.parse( @@ -125,7 +128,7 @@ export class ModOrganizerService { } async restoreMO2Settings() { - logger.info("Restoring MO2 settings"); + this.logger.info("Restoring MO2 settings"); // If we have some previous settings saved, restore them if (this.previousMO2Settings) { await fs.promises.writeFile( @@ -134,7 +137,7 @@ export class ModOrganizerService { ); this.previousMO2Settings = null; } - logger.info("Finished restoring MO2 settings"); + this.logger.info("Finished restoring MO2 settings"); } /** @@ -145,22 +148,24 @@ export class ModOrganizerService { if (await this.isRunning()) { const continueLaunching = await this.handleMO2Running(); if (!continueLaunching) { - logger.info("MO2 already running, user chose to abort"); + this.logger.info("MO2 already running, user chose to abort"); return false; } } await this.resolutionService.setResolutionInGraphicsSettings(); - logger.debug( - `User configuration: ${JSON.stringify(userPreferences.store)}` + this.logger.debug( + `User configuration: ${JSON.stringify( + this.configService.getPreferences().store + )}` ); return true; } async launchMO2() { - logger.info("Preparing MO2 for launch"); + this.logger.info("Preparing MO2 for launch"); try { const continueLaunch = await this.prepareForLaunch(); @@ -168,7 +173,7 @@ export class ModOrganizerService { return; } - logger.info("Launching MO2"); + this.logger.info("Launching MO2"); // MO2 will not respect the profile set in the launcher until the config is edited await this.updateSelectedProfile( @@ -176,21 +181,21 @@ export class ModOrganizerService { ); const MO2Path = path.join( - userPreferences.get(USER_PREFERENCE_KEYS.MOD_DIRECTORY), + this.configService.getPreference(USER_PREFERENCE_KEYS.MOD_DIRECTORY), MO2Names.MO2EXE ); const { stderr } = await promisify(childProcess.exec)(`"${MO2Path}"`); if (stderr) { - logger.error(`Error while executing ModOrganizer - ${stderr}`); + this.logger.error(`Error while executing ModOrganizer - ${stderr}`); } } catch (error) { - logger.error(`Error while opening MO2 - ${error}`); + this.logger.error(`Error while opening MO2 - ${error}`); throw error; } } async launchGame() { - logger.info("Preparing to launch game"); + this.logger.info("Preparing to launch game"); try { const continueLaunch = await this.prepareForLaunch(); @@ -200,16 +205,18 @@ export class ModOrganizerService { await this.preventMO2GUIFromShowing(); - logger.info("Launching game"); + this.logger.info("Launching game"); const MO2Path = path.join( - userPreferences.get(USER_PREFERENCE_KEYS.MOD_DIRECTORY), + this.configService.getPreference(USER_PREFERENCE_KEYS.MOD_DIRECTORY), MO2Names.MO2EXE ); - const profile = userPreferences.get(USER_PREFERENCE_KEYS.PRESET); + const profile = this.configService.getPreference( + USER_PREFERENCE_KEYS.PRESET + ); const mo2Command = `"${MO2Path}" -p "${profile}" "moshortcut://:${await this.getFirstCustomExecutableTitle()}"`; - logger.debug(`Executing MO2 command: ${mo2Command}`); + this.logger.debug(`Executing MO2 command: ${mo2Command}`); const { stderr } = await promisify(childProcess.exec)(mo2Command); await this.postLaunch(); @@ -226,15 +233,15 @@ export class ModOrganizerService { } async postLaunch() { - logger.info("MO2 exited, starting post launch actions"); + this.logger.info("MO2 exited, starting post launch actions"); await this.gameService.copySkyrimLaunchLogs(); await this.restoreMO2Settings(); await this.enbService.syncENBFromGameToPresets( - userPreferences.get(USER_PREFERENCE_KEYS.ENB_PROFILE) + this.configService.getPreference(USER_PREFERENCE_KEYS.ENB_PROFILE) ); await this.graphicsService.syncGraphicsFromGameToPresets( - userPreferences.get(USER_PREFERENCE_KEYS.GRAPHICS), - userPreferences.get(USER_PREFERENCE_KEYS.PRESET) + this.configService.getPreference(USER_PREFERENCE_KEYS.GRAPHICS), + this.configService.getPreference(USER_PREFERENCE_KEYS.PRESET) ); } } diff --git a/src/main/services/modpack.service.ts b/src/main/services/modpack.service.ts index 43f10a10..1227eee5 100644 --- a/src/main/services/modpack.service.ts +++ b/src/main/services/modpack.service.ts @@ -1,25 +1,28 @@ import fs from "fs"; -import { logger } from "@/main/logger"; import { MO2Names } from "@/main/services/modOrganizer.service"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import modpack from "@/modpack.json"; import { IsModpackValidResponse } from "@/main/controllers/modpack/mopack.events"; import { Modpack } from "@/modpack-metadata"; import { service } from "@loopback/core"; import { ConfigService } from "@/main/services/config.service"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, }) export class ModpackService { - constructor(@service(ConfigService) private configService: ConfigService) {} + constructor( + @service(ConfigService) private configService: ConfigService, + @inject(LoggerBinding) private logger: Logger + ) {} checkModpackPathIsValid(modpackPath: string): IsModpackValidResponse { const missingPaths = [MO2Names.MO2EXE, "profiles", "launcher"] .filter((path) => !fs.existsSync(`${modpackPath}/${path}`)) .map((path) => { - logger.warn( + this.logger.warn( `Selected mod directory "${modpackPath}" doesn't contain a "${path}" directory/file` ); return path; diff --git a/src/main/services/profile.service.ts b/src/main/services/profile.service.ts index de037610..44140dc9 100644 --- a/src/main/services/profile.service.ts +++ b/src/main/services/profile.service.ts @@ -3,12 +3,15 @@ import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { FriendlyDirectoryMap } from "@/modpack-metadata"; import fs from "fs"; import { not as isNotJunk } from "junk"; -import { logger } from "@/main/logger"; import { copy, existsSync } from "fs-extra"; -import { service } from "@loopback/core"; +import { inject, service } from "@loopback/core"; +import { Logger, LoggerBinding } from "@/main/logger"; export class ProfileService { - constructor(@service(ConfigService) private configService: ConfigService) {} + constructor( + @service(ConfigService) private configService: ConfigService, + @inject(LoggerBinding) private logger: Logger + ) {} profileDirectory() { return `${this.configService.modDirectory()}/profiles`; @@ -129,10 +132,10 @@ export class ProfileService { async backupOriginalProfiles() { const backupExists = existsSync(this.profileBackupDirectory()); - logger.debug(`Backup for profiles exists: ${backupExists}`); + this.logger.debug(`Backup for profiles exists: ${backupExists}`); if (!backupExists) { - logger.info("No profiles backup exists. Backing up..."); + this.logger.info("No profiles backup exists. Backing up..."); await fs.promises.mkdir(this.configService.backupDirectory(), { recursive: true, }); @@ -142,7 +145,7 @@ export class ProfileService { } async restoreProfiles() { - logger.info("Restoring MO2 profiles"); + this.logger.info("Restoring MO2 profiles"); await copy(this.profileBackupDirectory(), this.profileDirectory(), { overwrite: true, }); diff --git a/src/main/services/resolution.service.ts b/src/main/services/resolution.service.ts index a7684703..b8c7e5c0 100644 --- a/src/main/services/resolution.service.ts +++ b/src/main/services/resolution.service.ts @@ -1,22 +1,18 @@ import * as os from "os"; import { promisify } from "util"; import childProcess from "child_process"; -import { - ConfigService, - isDevelopment, - userPreferences, -} from "@/main/services/config.service"; +import { ConfigService, isDevelopment } from "@/main/services/config.service"; import { parse, stringify } from "js-ini"; import fs from "fs"; import { IIniObjectSection } from "js-ini/src/interfaces/ini-object-section"; import { screen } from "electron"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { Resolution } from "@/Resolution"; -import { logger } from "@/main/logger"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { service } from "@loopback/core"; import { name as modpackName } from "@/modpack.json"; import { InstructionService } from "@/main/services/instruction.service"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, @@ -28,7 +24,8 @@ export class ResolutionService { constructor( @service(ConfigService) private configService: ConfigService, @service(InstructionService) - private instructionsService: InstructionService + private instructionsService: InstructionService, + @inject(LoggerBinding) private logger: Logger ) {} getResourcePath() { @@ -73,7 +70,9 @@ export class ResolutionService { const closestRatio = supportedRatios.find( (x) => x.value === closestValue )?.key; - logger.debug(`Found closest ratio for ${width}x${height}: ${closestRatio}`); + this.logger.debug( + `Found closest ratio for ${width}x${height}: ${closestRatio}` + ); return closestRatio; } @@ -83,7 +82,9 @@ export class ResolutionService { .filter((x) => x.action === "disable-ultra-widescreen"); this.ultraWidescreenDisabled = (await this.instructionsService.execute(instructions)) ?? false; - logger.debug(`Ultra-widescreen disabled: ${this.ultraWidescreenDisabled}`); + this.logger.debug( + `Ultra-widescreen disabled: ${this.ultraWidescreenDisabled}` + ); } async isUnsupportedResolution(resolution: Resolution) { @@ -140,7 +141,7 @@ export class ResolutionService { childProcess.exec )(`"${this.getResourcePath()}/tools/QRes.exe" /L`); if (stderr) { - logger.error(`Error getting resolutions ${stderr}`); + this.logger.error(`Error getting resolutions ${stderr}`); throw new Error(stderr); } @@ -176,10 +177,10 @@ export class ResolutionService { } async getResolutions(): Promise { - logger.debug("Getting resolutions"); + this.logger.debug("Getting resolutions"); if (this.resolutionsCache) { - logger.debug( + this.logger.debug( `Resolutions cached ${JSON.stringify(this.resolutionsCache)}` ); return this.resolutionsCache; @@ -207,12 +208,14 @@ export class ResolutionService { height: Number(resolution.split("x")[1]), })); - logger.debug(`Supported resolutions: ${JSON.stringify(resolutions)}`); + this.logger.debug( + `Supported resolutions: ${JSON.stringify(resolutions)}` + ); // Sometimes, QRes.exe cannot recognise some resolutions. // As a safety measure, add the users current resolution if it wasn't detected. if (!this.resolutionsContain(resolutions, currentResolution)) { - logger.debug( + this.logger.debug( `Native resolution (${JSON.stringify( currentResolution )}) not found. Adding to the list.` @@ -230,7 +233,7 @@ export class ResolutionService { const sortedResolutions = resolutions.sort(this.sortResolutions); - logger.debug( + this.logger.debug( `Resolutions: ${sortedResolutions.map( ({ width, height }) => `${width}x${height}` )}` @@ -273,18 +276,18 @@ export class ResolutionService { ); } - logger.info( + this.logger.info( `Setting borderless upscale for ${width}x${height}: ${borderlessUpscale}` ); return borderlessUpscale; } async setResolutionInGraphicsSettings() { - const { width, height } = userPreferences.get( + const { width, height } = this.configService.getPreference( USER_PREFERENCE_KEYS.RESOLUTION ) as Resolution; - logger.info( + this.logger.info( `Setting resolution in ${this.skyrimGraphicsSettingsPath()} to ${width} x ${height}` ); const SkyrimGraphicSettings = parse( diff --git a/src/main/services/startup.service.ts b/src/main/services/startup.service.ts index 3d691140..8ced4bab 100644 --- a/src/main/services/startup.service.ts +++ b/src/main/services/startup.service.ts @@ -1,5 +1,4 @@ -import { BindingScope, injectable } from "@loopback/context"; -import { logger } from "@/main/logger"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { service } from "@loopback/core"; import { app } from "electron"; import { ConfigService } from "@/main/services/config.service"; @@ -12,6 +11,7 @@ import { UpdateService } from "@/main/services/update.service"; import { BlacklistService } from "@/main/services/blacklist.service"; import { ErrorService } from "@/main/services/error.service"; import { WindowService } from "@/main/services/window.service"; +import { Logger, LoggerBinding } from "@/main/logger"; interface StartupCommand { // Only needed if the command is being filtered @@ -37,7 +37,8 @@ export class StartupService { @service(UpdateService) private updateService: UpdateService, @service(BlacklistService) private blacklistService: BlacklistService, @service(ErrorService) private errorService: ErrorService, - @service(WindowService) private windowService: WindowService + @service(WindowService) private windowService: WindowService, + @inject(LoggerBinding) private logger: Logger ) {} public registerStartupCommands(filter?: string) { @@ -45,7 +46,7 @@ export class StartupService { { name: "Startup logs", execute: async () => { - logger.debug(` + this.logger.debug(` --- Startup debug logs --- OS: ${type()} ${platform()} ${version()} Modpack version: ${await this.wabbajackService.getModpackVersion()} @@ -69,7 +70,7 @@ export class StartupService { await this.blacklistService.blacklistedProcessesRunning(); if (runningBlacklistedProcesses.length > 0) { // Throw an error and don't continue until the process has been closed - logger.debug( + this.logger.debug( `Blacklisted process running ${JSON.stringify( runningBlacklistedProcesses )}` @@ -90,7 +91,7 @@ export class StartupService { execute: () => { if (!this.modpackService.checkCurrentModpackPathIsValid()) { const modpackDirectory = this.modpackService.getModpackDirectory(); - logger.error( + this.logger.error( `Current selected modpack (${modpackDirectory}) is invalid. Removing so the user can select a valid one.` ); this.modpackService.deleteModpackDirectory(); @@ -118,9 +119,9 @@ export class StartupService { (command.requiresModpack && this.modpackService.isModpackSet()) || !command.requiresModpack ) { - logger.debug(`Running startup command: ${command.name}`); + this.logger.debug(`Running startup command: ${command.name}`); await command.execute(); - logger.debug(`Command "${command.name}" completed`); + this.logger.debug(`Command "${command.name}" completed`); } } } diff --git a/src/main/services/system.service.ts b/src/main/services/system.service.ts index 91dc0d1f..77e6ae03 100644 --- a/src/main/services/system.service.ts +++ b/src/main/services/system.service.ts @@ -1,7 +1,6 @@ import path from "path"; -import { BindingScope, injectable } from "@loopback/context"; -import { shell, app } from "electron"; -import { logger } from "@/main/logger"; +import { BindingScope, inject, injectable } from "@loopback/context"; +import { app, shell } from "electron"; import fs, { createWriteStream } from "fs"; import { service } from "@loopback/core"; import { ConfigService } from "@/main/services/config.service"; @@ -15,29 +14,31 @@ import { reboot } from "electron-shutdown-command"; import { getAllInstalledSoftware } from "fetch-installed-software"; import psList from "ps-list"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, }) export class SystemService { + private prerequisitesDownloaded = false; + constructor( @service(ConfigService) private configService: ConfigService, @service(ErrorService) private errorService: ErrorService, + @inject(LoggerBinding) private logger: Logger, private listProcesses = psList ) {} - private static getInstallerFile() { - return path.normalize(`${app.getPath("userData")}/vc_redist.x64.exe`); - } - - private prerequisitesDownloaded = false; - static getLocalAppData() { return path.resolve(`${process.env.APPDATA}/../local`); } + private static getInstallerFile() { + return path.normalize(`${app.getPath("userData")}/vc_redist.x64.exe`); + } + reboot() { - logger.debug("Rebooting system"); + this.logger.debug("Rebooting system"); reboot(); } @@ -46,7 +47,7 @@ export class SystemService { path.parse(log.transports?.file.getFile().path).dir ); if (error) { - logger.error(error); + this.logger.error(error); } } @@ -59,7 +60,7 @@ export class SystemService { if (fs.existsSync(logPath)) { const error = await shell.openPath(logPath); if (error) { - logger.error(error); + this.logger.error(error); } } else { await this.errorService.handleError( @@ -70,13 +71,13 @@ export class SystemService { } async clearApplicationLogs() { - logger.transports?.file.getFile().clear(); + this.logger.transports?.file.getFile().clear(); /* Due to the fact that the renderer proc has little to no node func / lib access, the renderer logs have to be manually cleared here. Because even if the entire logging object is exposed to the renderer it is unable to clear the file. */ - const path = logger.transports?.file.getFile().path.split("\\") || []; + const path = this.logger.transports?.file.getFile().path.split("\\") || []; // replace main.log with renderer.log path.pop(); path.push("renderer.log"); @@ -89,14 +90,14 @@ export class SystemService { } async checkPrerequisitesInstalled() { - logger.debug("Checking prerequisites are installed"); + this.logger.debug("Checking prerequisites are installed"); if ( this.configService.getPreference( USER_PREFERENCE_KEYS.CHECK_PREREQUISITES ) === false ) { - logger.debug("Skip checking prerequisites due to user setting"); + this.logger.debug("Skip checking prerequisites due to user setting"); return true; } @@ -106,7 +107,7 @@ export class SystemService { .map((x) => x.DisplayName); if (installedSoftware.length === 0) { - logger.debug(`${productTester} not detected`); + this.logger.debug(`${productTester} not detected`); return false; } @@ -117,22 +118,22 @@ export class SystemService { ); const sortedVersions = [...new Set(installedVersions.sort())]; - logger.debug(`Installed ${productTester} versions ${sortedVersions}`); + this.logger.debug(`Installed ${productTester} versions ${sortedVersions}`); return installedVersions.filter((x) => Number(x) >= 2019).length > 0; } async installPrerequisites() { await this.downloadPrerequisites(); - logger.debug("Downloads completed"); - logger.debug(`Installing ${SystemService.getInstallerFile()}`); + this.logger.debug("Downloads completed"); + this.logger.debug(`Installing ${SystemService.getInstallerFile()}`); return promisify(childProcess.exec)( `"${SystemService.getInstallerFile()}"` ); } async downloadPrerequisites() { - logger.debug("Downloading prerequisites"); + this.logger.debug("Downloading prerequisites"); await this.downloadFile( "https://aka.ms/vs/17/release/vc_redist.x64.exe", SystemService.getInstallerFile() @@ -143,19 +144,19 @@ export class SystemService { async downloadFile(url: string, output: string) { if (fs.existsSync(output)) { - logger.debug("Download already exists, skipping"); + this.logger.debug("Download already exists, skipping"); return; } - logger.debug(`Downloading from ${url} to ${output}`); + this.logger.debug(`Downloading from ${url} to ${output}`); const body = (await fetch(url)).body; if (body) { - logger.debug(`Download complete, writing to ${output}`); + this.logger.debug(`Download complete, writing to ${output}`); await pipeline(body, createWriteStream(output)); - logger.debug(`Finished writing to ${output}`); + this.logger.debug(`Finished writing to ${output}`); } else { - logger.error(`Failed to download file from ${url}`); + this.logger.error(`Failed to download file from ${url}`); } } diff --git a/src/main/services/update.service.ts b/src/main/services/update.service.ts index a603038d..b4264521 100644 --- a/src/main/services/update.service.ts +++ b/src/main/services/update.service.ts @@ -5,10 +5,10 @@ import { isDevelopment } from "@/main/services/config.service"; import fs from "fs"; import { service } from "@loopback/core"; import { WindowService } from "@/main/services/window.service"; -import { logger } from "@/main/logger"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { UPDATE_EVENTS } from "@/main/controllers/update/update.events"; import { ErrorService } from "@/main/services/error.service"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, @@ -22,7 +22,8 @@ export class UpdateService { constructor( @service(WindowService) private renderService: WindowService, @service(ErrorService) private errorService: ErrorService, - @service(WindowService) private windowService: WindowService + @service(WindowService) private windowService: WindowService, + @inject(LoggerBinding) private logger: Logger ) {} async update() { @@ -32,13 +33,15 @@ export class UpdateService { return new Promise((resolve) => { // Only register if there is no update available. If there is an update, the window will close itself anyway. autoUpdater.on(UPDATE_EVENTS.UPDATE_NOT_AVAILABLE, () => { - logger.debug("No update available"); + this.logger.debug("No update available"); resolve(); }); if (this.shouldUpdate()) { this.checkForUpdate().catch((error) => { - logger.debug(`Update failed with error ${error}. Continuing anyway.`); + this.logger.debug( + `Update failed with error ${error}. Continuing anyway.` + ); resolve(); }); } else { @@ -51,16 +54,16 @@ export class UpdateService { let shouldUpdate; if (isDevelopment && fs.existsSync(this.devAppUpdatePath)) { - logger.debug(`Setting auto update path to ${this.devAppUpdatePath}`); + this.logger.debug(`Setting auto update path to ${this.devAppUpdatePath}`); autoUpdater.updateConfigPath = this.devAppUpdatePath; shouldUpdate = true; } else if (isDevelopment) { - logger.debug( + this.logger.debug( "Skipping app update check because we're in development mode" ); shouldUpdate = false; } else if (app.getVersion().includes("-")) { - logger.debug( + this.logger.debug( "Skipping app update check because this is a pre-release version" ); shouldUpdate = false; @@ -73,7 +76,7 @@ export class UpdateService { registerEvents() { autoUpdater.on(UPDATE_EVENTS.UPDATE_AVAILABLE, () => { - logger.info(`Update available`); + this.logger.info(`Update available`); this.renderService.getWebContents().send(UPDATE_EVENTS.UPDATE_AVAILABLE); }); @@ -84,7 +87,7 @@ export class UpdateService { }); autoUpdater.on(UPDATE_EVENTS.UPDATE_DOWNLOADED, () => { - logger.debug("Update downloaded"); + this.logger.debug("Update downloaded"); autoUpdater.quitAndInstall(); }); @@ -106,7 +109,7 @@ export class UpdateService { async checkForUpdate() { this.registerEvents(); const updateCheckResult = await autoUpdater.checkForUpdates(); - logger.debug("Auto update check result"); - logger.debug(updateCheckResult); + this.logger.debug("Auto update check result"); + this.logger.debug(updateCheckResult); } } diff --git a/src/main/services/wabbajack.service.ts b/src/main/services/wabbajack.service.ts index 6c79d715..c7784ef5 100644 --- a/src/main/services/wabbajack.service.ts +++ b/src/main/services/wabbajack.service.ts @@ -4,11 +4,11 @@ import { WabbajackModpackMetadata, WabbajackV2SettingsFile, } from "@/wabbajack"; -import { logger } from "@/main/logger"; import { SystemService } from "@/main/services/system.service"; import { service } from "@loopback/core"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import { ModpackService } from "@/main/services/modpack.service"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, @@ -22,7 +22,8 @@ export class WabbajackService { constructor( @service(SystemService) private systemService: SystemService, - @service(ModpackService) private modpackService: ModpackService + @service(ModpackService) private modpackService: ModpackService, + @inject(LoggerBinding) private logger: Logger ) {} async getInstalledModpacks(): Promise { @@ -31,13 +32,17 @@ export class WabbajackService { if (fs.existsSync(this.wabbajackV2InstalledModpacksPath)) { v2Modpacks = await this.getInstalledModpacksFromWabbajackV2(); } else { - logger.warn(`${this.wabbajackV2InstalledModpacksPath} does not exist.`); + this.logger.warn( + `${this.wabbajackV2InstalledModpacksPath} does not exist.` + ); } if (fs.existsSync(this.wabbajackV3InstalledModpacksPath)) { v3Modpacks = await this.getInstalledModpacksFromWabbajackV3(); } else { - logger.warn(`${this.wabbajackV3InstalledModpacksPath} does not exist.`); + this.logger.warn( + `${this.wabbajackV3InstalledModpacksPath} does not exist.` + ); } const combined = { @@ -122,10 +127,10 @@ export class WabbajackService { modpack !== "$type" && modpacks[modpack].title === modpackName ) : []; - logger.info( + this.logger.info( `Discovered ${wildlanderModpacks.length} ${modpackName} modpack installations in ${this.installedModpacksFilename}` ); - logger.debug(wildlanderModpacks); + this.logger.debug(wildlanderModpacks); return wildlanderModpacks; } diff --git a/src/main/services/window.service.ts b/src/main/services/window.service.ts index 8d7412b9..3b62fa5e 100644 --- a/src/main/services/window.service.ts +++ b/src/main/services/window.service.ts @@ -3,9 +3,9 @@ import { URL } from "url"; import { readFile } from "fs"; import path from "path"; import { appRoot, isDevelopment } from "@/main/services/config.service"; -import { logger } from "@/main/logger"; -import { BindingScope, injectable } from "@loopback/context"; +import { BindingScope, inject, injectable } from "@loopback/context"; import contextMenu from "electron-context-menu"; +import { Logger, LoggerBinding } from "@/main/logger"; @injectable({ scope: BindingScope.SINGLETON, @@ -13,20 +13,7 @@ import contextMenu from "electron-context-menu"; export class WindowService { private window!: BrowserWindow; - private static handleFatalError(message: string, err: string | Error) { - logger.error(`${message}. ${err}`); - - dialog.showMessageBoxSync({ - type: "error", - title: "A fatal error occurred!", - message: ` - ${message} - ${err} - `, - }); - - app.quit(); - } + constructor(@inject(LoggerBinding) private logger: Logger) {} getWindow() { return this.window; @@ -37,17 +24,17 @@ export class WindowService { } quit() { - logger.debug("Quit application"); + this.logger.debug("Quit application"); app.quit(); } reload() { - logger.debug("Reload window"); + this.logger.debug("Reload window"); this.getWindow().reload(); } minimize() { - logger.debug("Minimize window"); + this.logger.debug("Minimize window"); this.getWindow().minimize(); } @@ -60,10 +47,10 @@ export class WindowService { } async createBrowserWindow() { - logger.debug("Creating browser window"); + this.logger.debug("Creating browser window"); if (this.window) { - logger.debug("Browser window already exists"); + this.logger.debug("Browser window already exists"); return; } @@ -96,12 +83,9 @@ export class WindowService { }); } catch (error) { if (error instanceof Error) { - WindowService.handleFatalError( - "Unable to create browser window", - error - ); + this.handleFatalError("Unable to create browser window", error); } else { - WindowService.handleFatalError( + this.handleFatalError( "Unable to create browser window with unknown error", "" ); @@ -132,12 +116,9 @@ export class WindowService { } } catch (error) { if (error instanceof Error) { - WindowService.handleFatalError( - "Unable to load application page", - error - ); + this.handleFatalError("Unable to load application page", error); } else { - WindowService.handleFatalError( + this.handleFatalError( "Unable to load application page with unknown error", "" ); @@ -145,12 +126,27 @@ export class WindowService { } } + private handleFatalError(message: string, err: string | Error) { + this.logger.error(`${message}. ${err}`); + + dialog.showMessageBoxSync({ + type: "error", + title: "A fatal error occurred!", + message: ` + ${message} + ${err} + `, + }); + + app.quit(); + } + private async navigateInWindow(url: string) { // If the browser window is already open, a URL change will cause electron to think the request is aborted. // When the app loads a URL, the hash is changed immediately. If the window is already open, // electron considers this a change in URl and a failure so it errors. // If the window is open, just navigate from the browser instead. - logger.debug(`Loading url: ${url}`); + this.logger.debug(`Loading url: ${url}`); if (this.window.isVisible()) { await this.window.webContents.executeJavaScript( `window.location.href = '${url}'` @@ -172,7 +168,7 @@ export class WindowService { readFile(path.join(appRoot, pathName), (error, data) => { if (error) { - logger.error( + this.logger.error( `Failed to read ${pathName} on ${scheme} protocol`, error ); diff --git a/wallaby.js b/wallaby.js index ca4f20e9..409f7179 100644 --- a/wallaby.js +++ b/wallaby.js @@ -4,10 +4,10 @@ module.exports = function (w) { "src/**/*.ts", "src/**/*.js", "src/**/*.json", - "!src/__tests__/unit/**/*.ts", + "!src/__tests__/unit/**/*.test.ts", "tsconfig.json", ], - tests: ["src/__tests__/unit/**/*.ts"], + tests: ["src/__tests__/unit/**/*.test.ts"], testFramework: "mocha", From c4699a7d83afe64b8752ab511a4df2e741f75ada Mon Sep 17 00:00:00 2001 From: Matt Lishman Date: Thu, 20 Mar 2025 22:35:35 +0000 Subject: [PATCH 02/97] refactor: make main directory follow strict typescript settings --- .eslintignore | 5 +- .eslintrc | 12 +++ .eslintrc.js | 25 ------ .gitignore | 1 + .prettierignore | 2 +- package-lock.json | 84 ++++++++++++++++--- package.json | 9 +- .../controllers/graphics.controller.test.ts | 0 .../services/blacklist.service.test.ts | 0 .../services/config.service.test.ts | 0 .../{ => main}/services/game.service.test.ts | 2 +- .../services/graphics.service.test.ts | 4 +- .../services/migration.service.test.ts | 2 +- .../services/modOrganizer.service.test.ts | 2 +- .../services/profile.service.test.ts | 4 +- .../services/startup.service.test.ts | 21 ++--- .../services/system.service.test.ts | 4 +- .../services/wabbajack.service.test.ts | 5 +- .../{ => main}/support/mocks/logger.mock.ts | 0 .../unit/shared/util/asyncFilter.unit.ts | 34 ++++++++ src/main/.eslintrc | 5 ++ src/main/application.ts | 4 +- src/main/controllers/enb/enb.controller.ts | 2 +- .../resolution/resolution.controller.ts | 2 +- src/main/decorators/controller.decorator.ts | 4 +- src/main/preload.ts | 2 +- src/main/services/config.service.ts | 2 +- src/main/services/enb.service.ts | 11 ++- src/main/services/graphics.service.ts | 9 +- src/main/services/instruction.service.ts | 10 +-- src/main/services/launcher.service.ts | 3 - src/main/services/migration.service.ts | 10 +-- src/main/services/modOrganizer.service.ts | 6 +- src/main/services/modpack.service.ts | 6 +- src/main/services/profile.service.ts | 9 +- src/main/services/resolution.service.ts | 21 ++--- src/main/services/startup.service.ts | 4 +- src/main/services/system.service.ts | 6 +- src/main/services/wabbajack.service.ts | 17 ++-- src/main/services/window.service.ts | 2 +- src/main/tsconfig.json | 28 +++++++ src/main/wildlander/README.md | 4 + .../wildlander}/additional-instructions.json | 0 src/{ => main/wildlander}/modpack.json | 0 src/renderer/.eslintrc | 20 +++++ src/renderer/App.vue | 6 +- src/renderer/components/Community.vue | 2 +- src/renderer/components/ModDirectory.vue | 2 +- src/renderer/components/TheHeader.vue | 2 +- src/renderer/router/index.ts | 5 +- src/renderer/services/message.service.ts | 4 +- src/renderer/services/modal.service.ts | 6 +- src/renderer/services/modpack.service.ts | 2 +- src/renderer/services/patreon.service.ts | 21 ++--- src/renderer/services/posts.service.ts | 2 +- src/renderer/services/service-container.ts | 2 +- src/renderer/tsconfig.json | 38 +++++++++ src/shared/tsconfig.json | 15 ++++ src/shared/util/asyncFilter.ts | 14 +--- src/types/ModOrganizer.ini.d.ts | 11 +-- src/types/wabbajack.d.ts | 4 +- tsconfig.json | 43 +++------- wallaby.js | 14 ++-- 63 files changed, 384 insertions(+), 212 deletions(-) create mode 100644 .eslintrc delete mode 100644 .eslintrc.js rename src/__tests__/unit/{ => main}/controllers/graphics.controller.test.ts (100%) rename src/__tests__/unit/{ => main}/services/blacklist.service.test.ts (100%) rename src/__tests__/unit/{ => main}/services/config.service.test.ts (100%) rename src/__tests__/unit/{ => main}/services/game.service.test.ts (94%) rename src/__tests__/unit/{ => main}/services/graphics.service.test.ts (98%) rename src/__tests__/unit/{ => main}/services/migration.service.test.ts (98%) rename src/__tests__/unit/{ => main}/services/modOrganizer.service.test.ts (97%) rename src/__tests__/unit/{ => main}/services/profile.service.test.ts (96%) rename src/__tests__/unit/{ => main}/services/startup.service.test.ts (88%) rename src/__tests__/unit/{ => main}/services/system.service.test.ts (93%) rename src/__tests__/unit/{ => main}/services/wabbajack.service.test.ts (96%) rename src/__tests__/unit/{ => main}/support/mocks/logger.mock.ts (100%) create mode 100644 src/__tests__/unit/shared/util/asyncFilter.unit.ts create mode 100644 src/main/.eslintrc create mode 100644 src/main/tsconfig.json create mode 100644 src/main/wildlander/README.md rename src/{ => main/wildlander}/additional-instructions.json (100%) rename src/{ => main/wildlander}/modpack.json (100%) create mode 100644 src/renderer/.eslintrc create mode 100644 src/renderer/tsconfig.json create mode 100644 src/shared/tsconfig.json diff --git a/.eslintignore b/.eslintignore index 33e41d8c..cca00dc2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,6 @@ -.eslintrc.js .github node_modules/ +wallaby.js +babel.config.js +lint-staged.config.js +vue.config.js \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..a66091d1 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,12 @@ +{ + "root": true, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ] +} \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index b0fb6323..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - root: true, - - env: { - node: true, - }, - - 'extends': [ - 'plugin:vue/vue3-essential', - 'eslint:recommended', - '@vue/typescript/recommended', - '@vue/prettier', - '@vue/prettier/@typescript-eslint' - ], - - parserOptions: { - parser: '@typescript-eslint/parser', - }, - - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', - 'prettier/prettier': ['error', { 'endOfLine': 'auto' }] - } -} diff --git a/.gitignore b/.gitignore index ac9aa5e3..2fabd425 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ node_modules /dist /coverage .nyc_output +.tsbuildinfo # local env files .env.local diff --git a/.prettierignore b/.prettierignore index 0859b014..c5a35528 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,4 @@ node_modules dist_electron -.eslintrc.js +.eslintrc .github diff --git a/package-lock.json b/package-lock.json index 4155f8e1..a526b579 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "electron-updater": "^4.6.5", "fetch-installed-software": "^0.0.7", "fs-extra": "^10.1.0", - "js-ini": "^1.5.1", + "js-ini": "^1.6.0", "junk": "^3.1.0", "mitt": "^3.0.0", "node-fetch": "^2.6.7", @@ -39,6 +39,8 @@ "@commitlint/config-conventional": "^15.0.0", "@loopback/build": "^9.0.2", "@loopback/testlab": "^5.0.2", + "@tsconfig/node16-strictest": "^1.0.4", + "@tsconfig/strictest": "^2.0.1", "@types/electron-devtools-installer": "^2.2.0", "@types/fs-extra": "^9.0.13", "@types/ini": "^1.3.31", @@ -58,6 +60,7 @@ "@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-standard": "^5.1.2", "@vue/eslint-config-typescript": "^11.0.3", + "@vue/tsconfig": "^0.4.0", "babel-eslint": "^10.1.0", "commitlint": "^15.0.0", "electron": "^16.0.5", @@ -83,7 +86,7 @@ "stylelint-scss": "^3.21.0", "tsc-alias": "^1.6.4", "tsconfig-paths": "^4.0.0", - "typescript": "^4.5.4", + "typescript": "^4.9.5", "vue-cli-plugin-electron-builder": "~2.1.1", "vue-property-decorator": "^10.0.0-rc.3" } @@ -3458,6 +3461,19 @@ "node": ">=8" } }, + "node_modules/@loopback/build/node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@loopback/build/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3996,6 +4012,19 @@ "node": ">=6" } }, + "node_modules/@tsconfig/node16-strictest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16-strictest/-/node16-strictest-1.0.4.tgz", + "integrity": "sha512-kp6/DuAoKzHVv5U+p0uOesYbjrEvrYVNdQMl163a+yXXUv9twabvkCGEn3pmVxKXB45JU5MPGolDDWnONZL5ZQ==", + "deprecated": "TypeScript 5.0 supports combining TSConfigs using array syntax in extends", + "dev": true + }, + "node_modules/@tsconfig/strictest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.1.tgz", + "integrity": "sha512-7JHHCbyCsGUxLd0pDbp24yz3zjxw2t673W5oAP6HCEdr/UUhaRhYd3SSnUsGCk+VnPVJVA4mXROzbhI+nyIk+w==", + "dev": true + }, "node_modules/@types/body-parser": { "version": "1.19.1", "dev": true, @@ -6743,6 +6772,12 @@ "version": "3.2.31", "license": "MIT" }, + "node_modules/@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, "node_modules/@vue/web-component-wrapper": { "version": "1.3.0", "dev": true, @@ -17323,8 +17358,9 @@ "license": "BSD-3-Clause" }, "node_modules/js-ini": { - "version": "1.5.1", - "license": "MIT" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/js-ini/-/js-ini-1.6.0.tgz", + "integrity": "sha512-9Vx+NVkMRNY4i7pLLIGdXIQbP1iwB3fP2IG1zMCgeUUvR1ODmTKa33eR/J9FHoorNsfoJr9/2SVqeSKLwPD9Nw==" }, "node_modules/js-message": { "version": "1.0.7", @@ -27504,9 +27540,9 @@ } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -32144,6 +32180,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -32528,6 +32570,18 @@ "defer-to-connect": "^1.0.1" } }, + "@tsconfig/node16-strictest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16-strictest/-/node16-strictest-1.0.4.tgz", + "integrity": "sha512-kp6/DuAoKzHVv5U+p0uOesYbjrEvrYVNdQMl163a+yXXUv9twabvkCGEn3pmVxKXB45JU5MPGolDDWnONZL5ZQ==", + "dev": true + }, + "@tsconfig/strictest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/strictest/-/strictest-2.0.1.tgz", + "integrity": "sha512-7JHHCbyCsGUxLd0pDbp24yz3zjxw2t673W5oAP6HCEdr/UUhaRhYd3SSnUsGCk+VnPVJVA4mXROzbhI+nyIk+w==", + "dev": true + }, "@types/body-parser": { "version": "1.19.1", "dev": true, @@ -34566,6 +34620,12 @@ "@vue/shared": { "version": "3.2.31" }, + "@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, "@vue/web-component-wrapper": { "version": "1.3.0", "dev": true @@ -41868,7 +41928,9 @@ "dev": true }, "js-ini": { - "version": "1.5.1" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/js-ini/-/js-ini-1.6.0.tgz", + "integrity": "sha512-9Vx+NVkMRNY4i7pLLIGdXIQbP1iwB3fP2IG1zMCgeUUvR1ODmTKa33eR/J9FHoorNsfoJr9/2SVqeSKLwPD9Nw==" }, "js-message": { "version": "1.0.7", @@ -48886,9 +48948,9 @@ } }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index f2ee275b..cc1df74e 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "lint:eslint": "vue-cli-service lint", "lint:eslint:fix": "vue-cli-service lint --fix", "lint:styles": "stylelint **/*.scss", - "lint:typescript": "tsc --noEmit", + "lint:typescript": "lb-tsc --noEmit", "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps", "pretest": "npm run compile", @@ -51,7 +51,7 @@ "electron-updater": "^4.6.5", "fetch-installed-software": "^0.0.7", "fs-extra": "^10.1.0", - "js-ini": "^1.5.1", + "js-ini": "^1.6.0", "junk": "^3.1.0", "mitt": "^3.0.0", "node-fetch": "^2.6.7", @@ -70,6 +70,8 @@ "@commitlint/config-conventional": "^15.0.0", "@loopback/build": "^9.0.2", "@loopback/testlab": "^5.0.2", + "@tsconfig/node16-strictest": "^1.0.4", + "@tsconfig/strictest": "^2.0.1", "@types/electron-devtools-installer": "^2.2.0", "@types/fs-extra": "^9.0.13", "@types/ini": "^1.3.31", @@ -89,6 +91,7 @@ "@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-standard": "^5.1.2", "@vue/eslint-config-typescript": "^11.0.3", + "@vue/tsconfig": "^0.4.0", "babel-eslint": "^10.1.0", "commitlint": "^15.0.0", "electron": "^16.0.5", @@ -114,7 +117,7 @@ "stylelint-scss": "^3.21.0", "tsc-alias": "^1.6.4", "tsconfig-paths": "^4.0.0", - "typescript": "^4.5.4", + "typescript": "^4.9.5", "vue-cli-plugin-electron-builder": "~2.1.1", "vue-property-decorator": "^10.0.0-rc.3" }, diff --git a/src/__tests__/unit/controllers/graphics.controller.test.ts b/src/__tests__/unit/main/controllers/graphics.controller.test.ts similarity index 100% rename from src/__tests__/unit/controllers/graphics.controller.test.ts rename to src/__tests__/unit/main/controllers/graphics.controller.test.ts diff --git a/src/__tests__/unit/services/blacklist.service.test.ts b/src/__tests__/unit/main/services/blacklist.service.test.ts similarity index 100% rename from src/__tests__/unit/services/blacklist.service.test.ts rename to src/__tests__/unit/main/services/blacklist.service.test.ts diff --git a/src/__tests__/unit/services/config.service.test.ts b/src/__tests__/unit/main/services/config.service.test.ts similarity index 100% rename from src/__tests__/unit/services/config.service.test.ts rename to src/__tests__/unit/main/services/config.service.test.ts diff --git a/src/__tests__/unit/services/game.service.test.ts b/src/__tests__/unit/main/services/game.service.test.ts similarity index 94% rename from src/__tests__/unit/services/game.service.test.ts rename to src/__tests__/unit/main/services/game.service.test.ts index 8b8f8c37..a458fb4f 100644 --- a/src/__tests__/unit/services/game.service.test.ts +++ b/src/__tests__/unit/main/services/game.service.test.ts @@ -7,7 +7,7 @@ import { import { GameService } from "@/main/services/game.service"; import { ConfigService } from "@/main/services/config.service"; import fs from "fs"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import { mockLogger } from "@/__tests__/unit/main/support/mocks/logger.mock"; describe("GameService", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; diff --git a/src/__tests__/unit/services/graphics.service.test.ts b/src/__tests__/unit/main/services/graphics.service.test.ts similarity index 98% rename from src/__tests__/unit/services/graphics.service.test.ts rename to src/__tests__/unit/main/services/graphics.service.test.ts index 7eaa3a9f..f943c9fa 100644 --- a/src/__tests__/unit/services/graphics.service.test.ts +++ b/src/__tests__/unit/main/services/graphics.service.test.ts @@ -7,11 +7,11 @@ import { import { ConfigService } from "@/main/services/config.service"; import { GraphicsService } from "@/main/services/graphics.service"; import mockFs from "mock-fs"; -import { FriendlyDirectoryMap } from "@/modpack-metadata"; +import type { FriendlyDirectoryMap } from "@/modpack-metadata"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { ProfileService } from "@/main/services/profile.service"; import fs from "fs"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import { mockLogger } from "@/__tests__/unit/main/support/mocks/logger.mock"; describe("Graphics service", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; diff --git a/src/__tests__/unit/services/migration.service.test.ts b/src/__tests__/unit/main/services/migration.service.test.ts similarity index 98% rename from src/__tests__/unit/services/migration.service.test.ts rename to src/__tests__/unit/main/services/migration.service.test.ts index 2a98ade1..a9aeecca 100644 --- a/src/__tests__/unit/services/migration.service.test.ts +++ b/src/__tests__/unit/main/services/migration.service.test.ts @@ -10,7 +10,7 @@ import mockFs from "mock-fs"; import { ProfileService } from "@/main/services/profile.service"; import fs from "fs"; import { ConfigService } from "@/main/services/config.service"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import { mockLogger } from "@/__tests__/unit/main/support/mocks/logger.mock"; describe("Migration service", () => { let migrationService: MigrationService; diff --git a/src/__tests__/unit/services/modOrganizer.service.test.ts b/src/__tests__/unit/main/services/modOrganizer.service.test.ts similarity index 97% rename from src/__tests__/unit/services/modOrganizer.service.test.ts rename to src/__tests__/unit/main/services/modOrganizer.service.test.ts index 97a521b1..6523e7e4 100644 --- a/src/__tests__/unit/services/modOrganizer.service.test.ts +++ b/src/__tests__/unit/main/services/modOrganizer.service.test.ts @@ -16,7 +16,7 @@ import { ProfileService } from "@/main/services/profile.service"; import { SystemService } from "@/main/services/system.service"; import { GraphicsService } from "@/main/services/graphics.service"; import mockFs from "mock-fs"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import { mockLogger } from "@/__tests__/unit/main/support/mocks/logger.mock"; describe("ModOrganizer service", () => { let mockEnbService: StubbedInstanceWithSinonAccessor; diff --git a/src/__tests__/unit/services/profile.service.test.ts b/src/__tests__/unit/main/services/profile.service.test.ts similarity index 96% rename from src/__tests__/unit/services/profile.service.test.ts rename to src/__tests__/unit/main/services/profile.service.test.ts index 70c4cda8..190bce36 100644 --- a/src/__tests__/unit/services/profile.service.test.ts +++ b/src/__tests__/unit/main/services/profile.service.test.ts @@ -1,5 +1,5 @@ import mockFs from "mock-fs"; -import { FriendlyDirectoryMap } from "@/modpack-metadata"; +import type { FriendlyDirectoryMap } from "@/modpack-metadata"; import { createStubInstance, expect, @@ -9,7 +9,7 @@ import { import { ConfigService } from "@/main/services/config.service"; import { ProfileService } from "@/main/services/profile.service"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import { mockLogger } from "@/__tests__/unit/main/support/mocks/logger.mock"; describe("Profile service", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; diff --git a/src/__tests__/unit/services/startup.service.test.ts b/src/__tests__/unit/main/services/startup.service.test.ts similarity index 88% rename from src/__tests__/unit/services/startup.service.test.ts rename to src/__tests__/unit/main/services/startup.service.test.ts index 3d5e58f3..c4e819cc 100644 --- a/src/__tests__/unit/services/startup.service.test.ts +++ b/src/__tests__/unit/main/services/startup.service.test.ts @@ -1,30 +1,23 @@ import mock from "mock-require"; -// electron-is-dev throws an error if not running in electron -mock("electron-is-dev", () => { - return true; -}); - import { StartupService } from "@/main/services/startup.service"; -import { - createStubInstance, - sinon, - StubbedInstanceWithSinonAccessor, -} from "@loopback/testlab"; +import { createStubInstance, sinon, StubbedInstanceWithSinonAccessor } from "@loopback/testlab"; import { ModpackService } from "@/main/services/modpack.service"; import { LauncherService } from "@/main/services/launcher.service"; -import { ConfigService } from "@/main/services/config.service"; import { WabbajackService } from "@/main/services/wabbajack.service"; import { ResolutionService } from "@/main/services/resolution.service"; import { UpdateService } from "@/main/services/update.service"; import { BlacklistService } from "@/main/services/blacklist.service"; import { ErrorService } from "@/main/services/error.service"; import { WindowService } from "@/main/services/window.service"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import { mockLogger } from "@/__tests__/unit/main/support/mocks/logger.mock"; +// electron-is-dev throws an error if not running in electron +mock("electron-is-dev", () => { + return true; +}); describe("Startup service", () => { let mockModpackService: StubbedInstanceWithSinonAccessor; let mockLauncherService: StubbedInstanceWithSinonAccessor; - let mockConfigService: StubbedInstanceWithSinonAccessor; let mockWabbajackService: StubbedInstanceWithSinonAccessor; let mockResolutionService: StubbedInstanceWithSinonAccessor; let mockUpdateService: StubbedInstanceWithSinonAccessor; @@ -37,7 +30,6 @@ describe("Startup service", () => { beforeEach(() => { mockModpackService = createStubInstance(ModpackService); mockLauncherService = createStubInstance(LauncherService); - mockConfigService = createStubInstance(ConfigService); mockWabbajackService = createStubInstance(WabbajackService); mockResolutionService = createStubInstance(ResolutionService); mockUpdateService = createStubInstance(UpdateService); @@ -48,7 +40,6 @@ describe("Startup service", () => { startupService = new StartupService( mockModpackService, mockLauncherService, - mockConfigService, mockWabbajackService, mockResolutionService, mockUpdateService, diff --git a/src/__tests__/unit/services/system.service.test.ts b/src/__tests__/unit/main/services/system.service.test.ts similarity index 93% rename from src/__tests__/unit/services/system.service.test.ts rename to src/__tests__/unit/main/services/system.service.test.ts index af31e814..ea6b59b3 100644 --- a/src/__tests__/unit/services/system.service.test.ts +++ b/src/__tests__/unit/main/services/system.service.test.ts @@ -6,8 +6,8 @@ import { } from "@loopback/testlab"; import { ConfigService } from "@/main/services/config.service"; import { ErrorService } from "@/main/services/error.service"; -import psList from "ps-list"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import type psList from "ps-list"; +import { mockLogger } from "../support/mocks/logger.mock"; describe("System service", () => { let mockConfigService: StubbedInstanceWithSinonAccessor; diff --git a/src/__tests__/unit/services/wabbajack.service.test.ts b/src/__tests__/unit/main/services/wabbajack.service.test.ts similarity index 96% rename from src/__tests__/unit/services/wabbajack.service.test.ts rename to src/__tests__/unit/main/services/wabbajack.service.test.ts index 16b6f7d2..9c2988ef 100644 --- a/src/__tests__/unit/services/wabbajack.service.test.ts +++ b/src/__tests__/unit/main/services/wabbajack.service.test.ts @@ -8,7 +8,7 @@ import { sinon, StubbedInstanceWithSinonAccessor, } from "@loopback/testlab"; -import { mockLogger } from "@/__tests__/unit/support/mocks/logger.mock"; +import { mockLogger } from "@/__tests__/unit/main/support/mocks/logger.mock"; const mockLocalAppData = "mock/local/app/data"; @@ -64,18 +64,15 @@ const getMockV3Wabbajack = () => ({ }); describe("Wabbajack service", () => { - let mockSystemService: StubbedInstanceWithSinonAccessor; let mockModpackService: StubbedInstanceWithSinonAccessor; let wabbajackService: WabbajackService; beforeEach(() => { - mockSystemService = createStubInstance(SystemService); mockModpackService = createStubInstance(ModpackService); sinon.stub(SystemService, "getLocalAppData").returns(mockLocalAppData); wabbajackService = new WabbajackService( - mockSystemService, mockModpackService, mockLogger() ); diff --git a/src/__tests__/unit/support/mocks/logger.mock.ts b/src/__tests__/unit/main/support/mocks/logger.mock.ts similarity index 100% rename from src/__tests__/unit/support/mocks/logger.mock.ts rename to src/__tests__/unit/main/support/mocks/logger.mock.ts diff --git a/src/__tests__/unit/shared/util/asyncFilter.unit.ts b/src/__tests__/unit/shared/util/asyncFilter.unit.ts new file mode 100644 index 00000000..1ce3556e --- /dev/null +++ b/src/__tests__/unit/shared/util/asyncFilter.unit.ts @@ -0,0 +1,34 @@ +import { expect } from "@loopback/testlab"; +import { asyncFilter } from "../../../../shared/util/asyncFilter"; + +describe('asyncFilter', () => { + interface Person { + name: string; + age: number; + } + + async function filterAdults(person: Person): Promise { + return person.age >= 18; + } + + const people: Person[] = [ + { name: 'John', age: 25 }, + { name: 'Alice', age: 30 }, + { name: 'Bob', age: 16 }, + ]; + + it('should filter adults', async () => { + const filtered = await asyncFilter(people, filterAdults); + + expect(filtered).to.deepEqual([ + { name: 'John', age: 25 }, + { name: 'Alice', age: 30 }, + ]); + }); + + it('should filter no adults', async () => { + const filtered = await asyncFilter(people, async (person) => person.age >= 100); + + expect(filtered).to.deepEqual([]); + }); +}); diff --git a/src/main/.eslintrc b/src/main/.eslintrc new file mode 100644 index 00000000..c7e858d5 --- /dev/null +++ b/src/main/.eslintrc @@ -0,0 +1,5 @@ +{ + "env": { + "node": true + } +} \ No newline at end of file diff --git a/src/main/application.ts b/src/main/application.ts index cb4dcb4d..b7b4e8d9 100644 --- a/src/main/application.ts +++ b/src/main/application.ts @@ -1,10 +1,10 @@ import { StartupService } from "@/main/services/startup.service"; -import { Constructor } from "@loopback/context"; +import type { Constructor } from "@loopback/context"; import { WindowService } from "@/main/services/window.service"; import { LoggerBinding } from "@/main/logger"; import { BootMixin } from "@loopback/boot"; import { Application } from "@loopback/core"; -import { Controller } from "@/main/decorators/controller.decorator"; +import type { Controller } from "@/main/decorators/controller.decorator"; import { ErrorService } from "@/main/services/error.service"; import logger from "electron-log"; diff --git a/src/main/controllers/enb/enb.controller.ts b/src/main/controllers/enb/enb.controller.ts index a950541a..3ac82e03 100644 --- a/src/main/controllers/enb/enb.controller.ts +++ b/src/main/controllers/enb/enb.controller.ts @@ -2,7 +2,7 @@ import { controller, handle } from "@/main/decorators/controller.decorator"; import { ENB_EVENTS } from "@/main/controllers/enb/enb.events"; import { EnbService } from "@/main/services/enb.service"; import { service } from "@loopback/core"; -import { FriendlyDirectoryMap } from "@/modpack-metadata"; +import type { FriendlyDirectoryMap } from "@/modpack-metadata"; @controller export class EnbController { diff --git a/src/main/controllers/resolution/resolution.controller.ts b/src/main/controllers/resolution/resolution.controller.ts index f95cdb72..5872fa41 100644 --- a/src/main/controllers/resolution/resolution.controller.ts +++ b/src/main/controllers/resolution/resolution.controller.ts @@ -2,7 +2,7 @@ import { controller, handle } from "@/main/decorators/controller.decorator"; import { RESOLUTION_EVENTS } from "@/main/controllers/resolution/resolution.events"; import { ResolutionService } from "@/main/services/resolution.service"; import { service } from "@loopback/core"; -import { Resolution } from "@/Resolution"; +import type { Resolution } from "@/Resolution"; @controller export class ResolutionController { diff --git a/src/main/decorators/controller.decorator.ts b/src/main/decorators/controller.decorator.ts index be5f8531..5d07b862 100644 --- a/src/main/decorators/controller.decorator.ts +++ b/src/main/decorators/controller.decorator.ts @@ -1,5 +1,5 @@ import { ipcMain, IpcMainInvokeEvent } from "electron"; -import { Constructor } from "@loopback/context"; +import type { Constructor } from "@loopback/context"; import log from "electron-log"; import "reflect-metadata"; @@ -56,7 +56,7 @@ export function controller>(Base: T) { export function handle(channel: string) { return function ( target: object, - propertyKey: string, + _propertyKey: string, propertyDescriptor: PropertyDescriptor ) { const handlers = diff --git a/src/main/preload.ts b/src/main/preload.ts index a99854f9..db2dc5eb 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -9,7 +9,7 @@ contextBridge.exposeInMainWorld("ipcRenderer", { }, on: (channel: string, callback: (...args: unknown[]) => unknown) => { // Deliberately strip event as it includes `sender` - ipcRenderer.on(channel, (event, ...args) => callback(...args)); + ipcRenderer.on(channel, (_event, ...args) => callback(...args)); }, }); diff --git a/src/main/services/config.service.ts b/src/main/services/config.service.ts index ce15c357..074b2746 100644 --- a/src/main/services/config.service.ts +++ b/src/main/services/config.service.ts @@ -1,6 +1,6 @@ import Store from "electron-store"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; -import { Resolution } from "@/Resolution"; +import type { Resolution } from "@/Resolution"; import path from "path"; import { BindingScope, inject, injectable } from "@loopback/context"; import { Logger, LoggerBinding } from "@/main/logger"; diff --git a/src/main/services/enb.service.ts b/src/main/services/enb.service.ts index aa17b5c3..c7b3a129 100644 --- a/src/main/services/enb.service.ts +++ b/src/main/services/enb.service.ts @@ -2,11 +2,11 @@ import fs from "fs"; import { ConfigService } from "@/main/services/config.service"; import { copy, existsSync } from "fs-extra"; import { not as isNotJunk } from "junk"; -import { FriendlyDirectoryMap } from "@/modpack-metadata"; +import type { FriendlyDirectoryMap } from "@/modpack-metadata"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { service } from "@loopback/core"; import { BindingScope, inject, injectable } from "@loopback/context"; -import { AdditionalInstruction } from "@/additional-instructions"; +import type { AdditionalInstruction } from "@/additional-instructions"; import { InstructionService } from "@/main/services/instruction.service"; import { Logger, LoggerBinding } from "@/main/logger"; @@ -79,7 +79,12 @@ export class EnbService { } async getDefaultPreference() { - return (await this.getENBPresets())[0].real; + return ( + (await this.getENBPresets())[0]?.real ?? + (() => { + throw new Error("No ENB presets found"); + })() + ); } isValid(preset: string) { diff --git a/src/main/services/graphics.service.ts b/src/main/services/graphics.service.ts index 372b0aba..060252d3 100644 --- a/src/main/services/graphics.service.ts +++ b/src/main/services/graphics.service.ts @@ -1,4 +1,3 @@ -import { FriendlyDirectoryMap } from "@/modpack-metadata"; import fs from "fs"; import { ConfigService } from "@/main/services/config.service"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; @@ -8,6 +7,7 @@ import { ProfileService } from "@/main/services/profile.service"; import path from "path"; import { copy, existsSync } from "fs-extra"; import { Logger, LoggerBinding } from "@/main/logger"; +import type { FriendlyDirectoryMap } from "@/types/modpack-metadata"; export class GraphicsService { constructor( @@ -40,7 +40,12 @@ export class GraphicsService { } async getDefaultPreference() { - return (await this.getGraphics())[0].real; + return ( + (await this.getGraphics())[0]?.real ?? + (() => { + throw new Error("No graphics found"); + })() + ); } async syncGraphicsFromGameToPresets(graphicsPreset: string, profile: string) { diff --git a/src/main/services/instruction.service.ts b/src/main/services/instruction.service.ts index c3b5b775..ee63c769 100644 --- a/src/main/services/instruction.service.ts +++ b/src/main/services/instruction.service.ts @@ -1,16 +1,15 @@ -import { +import type { AdditionalInstructions, PluginOrModInstruction, } from "@/additional-instructions"; -import modpackAdditionalInstructions from "@/additional-instructions.json"; +import modpackAdditionalInstructions from "@/main/wildlander/additional-instructions.json"; import fs from "fs"; import { BindingScope, inject, injectable } from "@loopback/context"; import { service } from "@loopback/core"; -import { ConfigService } from "@/main/services/config.service"; import { ProfileService } from "@/main/services/profile.service"; import * as readline from "readline"; import * as os from "os"; -import { PathLike } from "fs-extra"; +import type { PathLike } from "fs-extra"; import { WabbajackService } from "@/main/services/wabbajack.service"; import { Logger, LoggerBinding } from "@/main/logger"; @@ -19,7 +18,6 @@ import { Logger, LoggerBinding } from "@/main/logger"; }) export class InstructionService { constructor( - @service(ConfigService) private configService: ConfigService, @service(ProfileService) private profileService: ProfileService, @service(WabbajackService) private wabbajackService: WabbajackService, @inject(LoggerBinding) private logger: Logger @@ -38,7 +36,7 @@ export class InstructionService { return modpackAdditionalInstructions as AdditionalInstructions; } - async execute(instructions: AdditionalInstructions, target?: string) { + async execute(instructions: AdditionalInstructions, target?: string): Promise { const modpackVersion = await this.wabbajackService.getModpackVersion(); for (const instruction of instructions) { diff --git a/src/main/services/launcher.service.ts b/src/main/services/launcher.service.ts index a85bfabe..3da281cf 100644 --- a/src/main/services/launcher.service.ts +++ b/src/main/services/launcher.service.ts @@ -1,6 +1,5 @@ import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { service } from "@loopback/core"; -import { ModOrganizerService } from "@/main/services/modOrganizer.service"; import { ProfileService } from "@/main/services/profile.service"; import { EnbService } from "@/main/services/enb.service"; import { ConfigService } from "@/main/services/config.service"; @@ -24,8 +23,6 @@ export class LauncherService { @service(ResolutionService) private resolutionService: ResolutionService, @service(ModpackService) private modpackService: ModpackService, @service(ProfileService) private profileService: ProfileService, - @service(ModOrganizerService) - private modOrganizerService: ModOrganizerService, @service(ErrorService) private errorService: ErrorService, @service(WindowService) private windowService: WindowService, @service(GraphicsService) private graphicsService: GraphicsService, diff --git a/src/main/services/migration.service.ts b/src/main/services/migration.service.ts index 883d3fdb..3460ef31 100644 --- a/src/main/services/migration.service.ts +++ b/src/main/services/migration.service.ts @@ -68,7 +68,7 @@ export class MigrationService { await this.profileService.setProfilePreference( ( await this.profileService.getProfiles() - )[0].real + )[0]!.real ); this.logger.debug( `New profile is ${await this.profileService.getProfilePreference()}` @@ -98,8 +98,8 @@ export class MigrationService { backedUpProfiles.find((profile) => profile.toLowerCase().includes("potato") ) ?? backedUpProfiles[backedUpProfiles.length - 1]; - await copy(backedUpProfiles[0], standardProfilePath); - await copy(backedUpPerformanceProfile, performanceProfilePath); + await copy(backedUpProfiles[0]!, standardProfilePath); + await copy(backedUpPerformanceProfile!, performanceProfilePath); } else { // If there is no backup, just use the first one this.logger.debug( @@ -108,8 +108,8 @@ export class MigrationService { const performanceProfile = profiles.find((profile) => profile.toLowerCase().includes("potato")) ?? profiles[[profiles].length - 1]; - await copy(profiles[0], standardProfilePath); - await copy(performanceProfile, performanceProfilePath); + await copy(profiles[0]!, standardProfilePath); + await copy(performanceProfile!, performanceProfilePath); } } diff --git a/src/main/services/modOrganizer.service.ts b/src/main/services/modOrganizer.service.ts index d71b40d3..f30772e7 100644 --- a/src/main/services/modOrganizer.service.ts +++ b/src/main/services/modOrganizer.service.ts @@ -4,10 +4,8 @@ import { ConfigService } from "@/main/services/config.service"; import psList from "ps-list"; import { dialog } from "electron"; import fs from "fs"; -import { parse, stringify } from "js-ini"; -import { IIniObjectSection } from "js-ini/src/interfaces/ini-object-section"; +import { IIniObject, IIniObjectSection, parse, stringify } from "js-ini"; import { promisify } from "util"; -import { IIniObject } from "js-ini/lib/interfaces/ini-object"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; import { EnbService } from "@/main/services/enb.service"; import { service } from "@loopback/core"; @@ -18,7 +16,7 @@ import { GameService } from "@/main/services/game.service"; import { ProfileService } from "@/main/services/profile.service"; import { SystemService } from "@/main/services/system.service"; import { GraphicsService } from "@/main/services/graphics.service"; -import { ModOrganizerIni } from "@/ModOrganizer.ini"; +import type { ModOrganizerIni } from "@/ModOrganizer.ini"; import { Logger, LoggerBinding } from "@/main/logger"; export const enum MO2Names { diff --git a/src/main/services/modpack.service.ts b/src/main/services/modpack.service.ts index 1227eee5..6c0fa07b 100644 --- a/src/main/services/modpack.service.ts +++ b/src/main/services/modpack.service.ts @@ -1,9 +1,9 @@ import fs from "fs"; import { MO2Names } from "@/main/services/modOrganizer.service"; import { BindingScope, inject, injectable } from "@loopback/context"; -import modpack from "@/modpack.json"; -import { IsModpackValidResponse } from "@/main/controllers/modpack/mopack.events"; -import { Modpack } from "@/modpack-metadata"; +import modpack from "@/main/wildlander/modpack.json"; +import type { IsModpackValidResponse } from "@/main/controllers/modpack/mopack.events"; +import type { Modpack } from "@/modpack-metadata"; import { service } from "@loopback/core"; import { ConfigService } from "@/main/services/config.service"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; diff --git a/src/main/services/profile.service.ts b/src/main/services/profile.service.ts index 44140dc9..d5a1e4a0 100644 --- a/src/main/services/profile.service.ts +++ b/src/main/services/profile.service.ts @@ -1,6 +1,6 @@ import { ConfigService } from "@/main/services/config.service"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; -import { FriendlyDirectoryMap } from "@/modpack-metadata"; +import type { FriendlyDirectoryMap } from "@/modpack-metadata"; import fs from "fs"; import { not as isNotJunk } from "junk"; import { copy, existsSync } from "fs-extra"; @@ -112,7 +112,12 @@ export class ProfileService { } async getDefaultPreference() { - return (await this.getPhysicalProfiles())[0].name; + return ( + (await this.getPhysicalProfiles())[0]?.name ?? + (() => { + throw new Error("No physical profiles found"); + })() + ); } setProfilePreference(profile: string) { diff --git a/src/main/services/resolution.service.ts b/src/main/services/resolution.service.ts index b8c7e5c0..1a31abaf 100644 --- a/src/main/services/resolution.service.ts +++ b/src/main/services/resolution.service.ts @@ -2,15 +2,14 @@ import * as os from "os"; import { promisify } from "util"; import childProcess from "child_process"; import { ConfigService, isDevelopment } from "@/main/services/config.service"; -import { parse, stringify } from "js-ini"; +import { IIniObjectSection, parse, stringify } from "js-ini"; import fs from "fs"; -import { IIniObjectSection } from "js-ini/src/interfaces/ini-object-section"; import { screen } from "electron"; import { USER_PREFERENCE_KEYS } from "@/shared/enums/userPreferenceKeys"; -import { Resolution } from "@/Resolution"; +import type { Resolution } from "@/Resolution"; import { BindingScope, inject, injectable } from "@loopback/context"; import { service } from "@loopback/core"; -import { name as modpackName } from "@/modpack.json"; +import { name as modpackName } from "@/main/wildlander/modpack.json"; import { InstructionService } from "@/main/services/instruction.service"; import { Logger, LoggerBinding } from "@/main/logger"; @@ -158,7 +157,7 @@ export class ResolutionService { // Remove empty entries .filter((resolution) => resolution !== "") // Only save the resolution - .map((resolution) => resolution.split(",")[0]) + .map((resolution) => resolution.split(",")[0] as string) ); } @@ -295,13 +294,15 @@ export class ResolutionService { { comment: "#" } ) as IIniObjectSection; - ( - SkyrimGraphicSettings.Render as IIniObjectSection - ).Resolution = `${width}x${height}`; + (SkyrimGraphicSettings["Render"] as IIniObjectSection)[ + "Resolution" + ] = `${width}x${height}`; // If the selected resolution is ultra-widescreen, don't upscale the image otherwise it gets stretched - (SkyrimGraphicSettings.Render as IIniObjectSection).BorderlessUpscale = - this.shouldEnableBorderlessUpscale({ width, height }); + // If the selected resolution is ultra-widescreen, don't upscale the image otherwise it gets stretched + (SkyrimGraphicSettings["Render"] as IIniObjectSection)[ + "BorderlessUpscale" + ] = this.shouldEnableBorderlessUpscale({ width, height }); await fs.promises.writeFile( this.skyrimGraphicsSettingsPath(), diff --git a/src/main/services/startup.service.ts b/src/main/services/startup.service.ts index 8ced4bab..51034e10 100644 --- a/src/main/services/startup.service.ts +++ b/src/main/services/startup.service.ts @@ -1,7 +1,6 @@ import { BindingScope, inject, injectable } from "@loopback/context"; import { service } from "@loopback/core"; import { app } from "electron"; -import { ConfigService } from "@/main/services/config.service"; import { ModpackService } from "@/main/services/modpack.service"; import { LauncherService } from "@/main/services/launcher.service"; import { platform, type, version } from "os"; @@ -31,7 +30,6 @@ export class StartupService { constructor( @service(ModpackService) private modpackService: ModpackService, @service(LauncherService) private launcherService: LauncherService, - @service(ConfigService) private configService: ConfigService, @service(WabbajackService) private wabbajackService: WabbajackService, @service(ResolutionService) private resolutionService: ResolutionService, @service(UpdateService) private updateService: UpdateService, @@ -68,7 +66,7 @@ export class StartupService { execute: async () => { const runningBlacklistedProcesses = await this.blacklistService.blacklistedProcessesRunning(); - if (runningBlacklistedProcesses.length > 0) { + if (runningBlacklistedProcesses[0]) { // Throw an error and don't continue until the process has been closed this.logger.debug( `Blacklisted process running ${JSON.stringify( diff --git a/src/main/services/system.service.ts b/src/main/services/system.service.ts index 77e6ae03..38a12303 100644 --- a/src/main/services/system.service.ts +++ b/src/main/services/system.service.ts @@ -20,8 +20,6 @@ import { Logger, LoggerBinding } from "@/main/logger"; scope: BindingScope.SINGLETON, }) export class SystemService { - private prerequisitesDownloaded = false; - constructor( @service(ConfigService) private configService: ConfigService, @service(ErrorService) private errorService: ErrorService, @@ -30,7 +28,7 @@ export class SystemService { ) {} static getLocalAppData() { - return path.resolve(`${process.env.APPDATA}/../local`); + return path.resolve(`${process.env["APPDATA"]}/../local`); } private static getInstallerFile() { @@ -138,8 +136,6 @@ export class SystemService { "https://aka.ms/vs/17/release/vc_redist.x64.exe", SystemService.getInstallerFile() ); - - this.prerequisitesDownloaded = true; } async downloadFile(url: string, output: string) { diff --git a/src/main/services/wabbajack.service.ts b/src/main/services/wabbajack.service.ts index c7784ef5..99807b9e 100644 --- a/src/main/services/wabbajack.service.ts +++ b/src/main/services/wabbajack.service.ts @@ -1,5 +1,5 @@ import fs from "fs"; -import { +import type { WabbajackInstallSettings, WabbajackModpackMetadata, WabbajackV2SettingsFile, @@ -21,7 +21,6 @@ export class WabbajackService { private wabbajackV3InstalledModpacksPath = `${SystemService.getLocalAppData()}/Wabbajack/saved_settings`; constructor( - @service(SystemService) private systemService: SystemService, @service(ModpackService) private modpackService: ModpackService, @inject(LoggerBinding) private logger: Logger ) {} @@ -62,10 +61,10 @@ export class WabbajackService { .reduce( (accumulator, current) => ({ ...accumulator, - [modpackMeta[current].InstallationPath]: { - title: modpackMeta[current].ModList.Name, - installPath: modpackMeta[current].InstallationPath, - version: modpackMeta[current].ModList.Version, + [modpackMeta[current]!.InstallationPath]: { + title: modpackMeta[current]!.ModList.Name, + installPath: modpackMeta[current]!.InstallationPath, + version: modpackMeta[current]!.ModList.Version, }, }), {} @@ -106,9 +105,9 @@ export class WabbajackService { return { ...accumulator, [current.contents.InstallLocation]: { - title: current.contents.Metadata?.title, + title: current.contents.Metadata?.title ?? null, installPath: current.contents.InstallLocation, - version: current.contents.Metadata?.version, + version: current.contents.Metadata?.version ?? null, lastUpdated: current.lastUpdated, }, }; @@ -124,7 +123,7 @@ export class WabbajackService { modpacks !== null ? Object.keys(modpacks).filter( (modpack) => - modpack !== "$type" && modpacks[modpack].title === modpackName + modpack !== "$type" && modpacks[modpack]?.title === modpackName ) : []; this.logger.info( diff --git a/src/main/services/window.service.ts b/src/main/services/window.service.ts index 3b62fa5e..6bca2a53 100644 --- a/src/main/services/window.service.ts +++ b/src/main/services/window.service.ts @@ -102,7 +102,7 @@ export class WindowService { if (isDevelopment) { const url = new URL(`http://localhost:8080/#${path}`).toString(); await this.navigateInWindow(url); - if (!process.env.IS_TEST) { + if (!process.env["IS_TEST"]) { this.window.webContents.openDevTools(); } // Show window without setting focus diff --git a/src/main/tsconfig.json b/src/main/tsconfig.json new file mode 100644 index 00000000..672e4b5a --- /dev/null +++ b/src/main/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "outDir": "../../dist/main", + "resolveJsonModule": true, + "paths": { + "@/*": [ + "./src/*", + "./src/types/*" + ] + } + }, + "include": [ + "./**/*.ts", + "./**/*.json", + "../types/*.ts" + ], + "exclude": [ + "../../node_modules" + ], + "references": [ + { + "path": "../shared" + } + ] +} diff --git a/src/main/wildlander/README.md b/src/main/wildlander/README.md new file mode 100644 index 00000000..4062a045 --- /dev/null +++ b/src/main/wildlander/README.md @@ -0,0 +1,4 @@ +This launcher was originally created for the Wildlander modpack. + +Any Wildlander specific settings are stored in this directory +to allow users of the original Wildlander to use the latest launcher features without needing to update the Wildlander modpack. \ No newline at end of file diff --git a/src/additional-instructions.json b/src/main/wildlander/additional-instructions.json similarity index 100% rename from src/additional-instructions.json rename to src/main/wildlander/additional-instructions.json diff --git a/src/modpack.json b/src/main/wildlander/modpack.json similarity index 100% rename from src/modpack.json rename to src/main/wildlander/modpack.json diff --git a/src/renderer/.eslintrc b/src/renderer/.eslintrc new file mode 100644 index 00000000..d4c5337a --- /dev/null +++ b/src/renderer/.eslintrc @@ -0,0 +1,20 @@ +{ + "env": { + "node": false, + "browser": true, + "es6": true + }, + "extends": [ + "eslint:recommended", + "plugin:vue/vue3-essential", + "@vue/typescript/recommended", + "@vue/prettier", + "@vue/prettier/@typescript-eslint" + ], + "parserOptions": { + "parser": "@typescript-eslint/parser", + "project": [ + "./tsconfig.json" + ] + } +} diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 2df1ad64..c185858b 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -17,11 +17,15 @@ import { injectStrict, SERVICE_BINDINGS, } from "@/renderer/services/service-container"; -import { Modpack } from "@/modpack-metadata"; +import type { Modpack } from "@/modpack-metadata"; import TheTitleBar from "@/renderer/components/TheTitleBar.vue"; import { MODPACK_EVENTS } from "@/main/controllers/modpack/mopack.events"; import AppPage from "@/renderer/components/AppPage.vue"; +const test = (something) => { + return something; +} + @Options({ components: { AppPage, diff --git a/src/renderer/components/Community.vue b/src/renderer/components/Community.vue index 5a739553..67fe8b73 100644 --- a/src/renderer/components/Community.vue +++ b/src/renderer/components/Community.vue @@ -44,7 +44,7 @@ import AppPage from "@/renderer/components/AppPage.vue"; import BaseLink from "@/renderer/components/BaseLink.vue"; import ImageWithText from "@/renderer/components/ImageWithText.vue"; import { Modpack } from "@/modpack-metadata"; -import modpack from "@/modpack.json"; +import modpack from "@/main/wildlander/modpack.json"; @Options({ components: { diff --git a/src/renderer/components/ModDirectory.vue b/src/renderer/components/ModDirectory.vue index 2278b004..54a456fd 100644 --- a/src/renderer/components/ModDirectory.vue +++ b/src/renderer/components/ModDirectory.vue @@ -17,7 +17,7 @@ import { } from "@/renderer/services/service-container"; import { SelectOption } from "@/renderer/components/BaseDropdown.vue"; import BaseLabel from "@/renderer/components/BaseLabel.vue"; -import modpack from "@/modpack.json"; +import modpack from "@/main/wildlander/modpack.json"; import { MODPACK_EVENTS } from "@/main/controllers/modpack/mopack.events"; import { Prop } from "vue-property-decorator"; import { WABBAJACK_EVENTS } from "@/main/controllers/wabbajack/wabbajack.events"; diff --git a/src/renderer/components/TheHeader.vue b/src/renderer/components/TheHeader.vue index a04825ce..85680c15 100644 --- a/src/renderer/components/TheHeader.vue +++ b/src/renderer/components/TheHeader.vue @@ -30,7 +30,7 @@ - + \ No newline at end of file diff --git a/src/renderer/components/AppModal.vue b/src/renderer/components/AppModal.vue index 688bf232..aeb9e38b 100644 --- a/src/renderer/components/AppModal.vue +++ b/src/renderer/components/AppModal.vue @@ -1,7 +1,7 @@
@@ -22,10 +22,10 @@ import BaseLabel from "@/renderer/components/BaseLabel.vue"; emits: ["input", "click"], }) export default class BaseInput extends Vue { - @Prop({ required: true }) private label!: string; - @Prop({ default: false }) private readonly!: boolean; - @Prop({ default: false }) private centered!: boolean; - @Prop() private value!: string; + @Prop({ required: true }) label!: string; + @Prop({ default: false }) readonly!: boolean; + @Prop({ default: false }) centered!: boolean; + @Prop() value!: string; @Emit() input(event: Event) { @@ -54,4 +54,4 @@ export default class BaseInput extends Vue { border: none; border-radius: 2px; } - + \ No newline at end of file diff --git a/src/renderer/components/BaseLabel.vue b/src/renderer/components/BaseLabel.vue index b16b7b69..5f8c329e 100644 --- a/src/renderer/components/BaseLabel.vue +++ b/src/renderer/components/BaseLabel.vue @@ -10,8 +10,8 @@ import { Prop } from "vue-property-decorator"; @Options({}) export default class BaseLabel extends Vue { - @Prop() private centered!: boolean; - @Prop() private label!: string; + @Prop() centered!: boolean; + @Prop() label!: string; } @@ -30,4 +30,4 @@ export default class BaseLabel extends Vue { justify-content: center; text-align: center; } - + \ No newline at end of file diff --git a/src/renderer/components/Community.vue b/src/renderer/components/Community.vue index 67fe8b73..0d42420a 100644 --- a/src/renderer/components/Community.vue +++ b/src/renderer/components/Community.vue @@ -43,8 +43,8 @@ import AppPageContent from "@/renderer/components/AppPageContent.vue"; import AppPage from "@/renderer/components/AppPage.vue"; import BaseLink from "@/renderer/components/BaseLink.vue"; import ImageWithText from "@/renderer/components/ImageWithText.vue"; -import { Modpack } from "@/modpack-metadata"; -import modpack from "@/main/wildlander/modpack.json"; +import type { Modpack } from "@/shared/types/modpack-metadata"; +import modpack from "@/shared/wildlander/modpack.json"; @Options({ components: { @@ -55,9 +55,9 @@ import modpack from "@/main/wildlander/modpack.json"; }, }) export default class Community extends Vue { - private modpack!: Modpack; + modpack!: Modpack; - async created() { + override async created() { this.modpack = modpack; } } @@ -93,4 +93,4 @@ export default class Community extends Vue { .c-resource__text { margin-top: $size-spacing; } - + \ No newline at end of file diff --git a/src/renderer/components/ENB.vue b/src/renderer/components/ENB.vue index 7bbfdfa9..d06832e2 100644 --- a/src/renderer/components/ENB.vue +++ b/src/renderer/components/ENB.vue @@ -1,10 +1,10 @@