From 7c3e9d5a85e31f4a2d1d3aab0a15c74753f0d28c Mon Sep 17 00:00:00 2001 From: sadnub Date: Wed, 27 Apr 2022 17:37:33 -0400 Subject: [PATCH] add typescript support and stricter formatting/linting --- .babelrc | 19 - .editorconfig | 9 + .eslintignore | 9 + .eslintrc.js | 88 + .postcssrc.js | 6 +- .prettierrc | 4 + babel.config.js | 30 +- package-lock.json | 1406 ++++++++++- package.json | 35 +- quasar.conf.js | 78 +- src/App.vue | 2 +- src/api/accounts.js | 60 +- src/api/agents.js | 195 +- src/api/automation.js | 20 +- src/api/checks.js | 38 +- src/api/clients.js | 82 +- src/api/core.js | 38 +- src/api/logs.js | 30 +- src/api/scripts.js | 59 +- src/api/services.js | 34 +- src/api/software.js | 48 +- src/api/tasks.js | 32 +- src/api/winupdates.js | 26 +- src/boot/axios.js | 39 +- src/components/AdminManager.vue | 107 +- src/components/AgentTable.vue | 201 +- src/components/AlertsIcon.vue | 66 +- src/components/AlertsManager.vue | 146 +- src/components/FileBar.vue | 52 +- src/components/SubTableTabs.vue | 79 +- .../accounts/PermissionsManager.vue | 52 +- src/components/accounts/RolesForm.vue | 310 ++- src/components/agents/AgentActionMenu.vue | 67 +- src/components/agents/AssetsTab.vue | 5 +- src/components/agents/AuditTab.vue | 2 +- src/components/agents/AutomatedTasksTab.vue | 1035 ++++---- src/components/agents/ChecksTab.vue | 1219 +++++----- src/components/agents/DebugTab.vue | 2 +- src/components/agents/HistoryTab.vue | 43 +- src/components/agents/NotesTab.vue | 59 +- src/components/agents/SoftwareTab.vue | 40 +- src/components/agents/SummaryTab.vue | 70 +- src/components/agents/WinUpdateTab.vue | 108 +- src/components/agents/WmiDetail.vue | 7 +- .../agents/remotebg/EventLogManager.vue | 89 +- .../agents/remotebg/ProcessManager.vue | 66 +- .../agents/remotebg/ServiceDetail.vue | 41 +- .../agents/remotebg/ServicesManager.vue | 37 +- .../automation/AutomationManager.vue | 1080 +++++---- .../automation/PolicyAutomatedTasksTab.vue | 103 +- src/components/automation/PolicyChecksTab.vue | 99 +- src/components/automation/PolicyOverview.vue | 26 +- .../automation/modals/PolicyAdd.vue | 33 +- .../automation/modals/PolicyExclusions.vue | 23 +- .../automation/modals/PolicyForm.vue | 21 +- .../automation/modals/PolicyStatus.vue | 540 +++-- .../automation/modals/RelationsView.vue | 36 +- src/components/checks/CpuLoadCheck.vue | 21 +- src/components/checks/DiskSpaceCheck.vue | 23 +- src/components/checks/EventLogCheck.vue | 92 +- src/components/checks/EventLogCheckOutput.vue | 61 +- src/components/checks/MemCheck.vue | 21 +- src/components/checks/PingCheck.vue | 64 +- src/components/checks/ScriptCheck.vue | 57 +- src/components/checks/ScriptOutput.vue | 4 +- src/components/checks/WinSvcCheck.vue | 58 +- src/components/clients/ClientsForm.vue | 39 +- src/components/clients/ClientsManager.vue | 53 +- src/components/clients/DeleteClient.vue | 27 +- .../{Deployment.vue => DeploymentTable.vue} | 81 +- src/components/clients/NewDeployment.vue | 45 +- src/components/clients/SitesForm.vue | 45 +- src/components/clients/SitesTable.vue | 52 +- src/components/core/APIKeysForm.vue | 38 +- src/components/core/APIKeysTable.vue | 23 +- src/components/graphs/CheckGraph.vue | 54 +- src/components/logs/AuditLogDetailModal.vue | 2 +- src/components/logs/AuditManager.vue | 95 +- src/components/logs/DebugLog.vue | 100 +- src/components/logs/PendingActions.vue | 92 +- src/components/modals/admin/UserForm.vue | 41 +- .../modals/admin/UserResetPasswordForm.vue | 8 +- .../modals/agents/AgentDownload.vue | 30 +- .../modals/agents/AgentRecovery.vue | 27 +- src/components/modals/agents/BulkAction.vue | 61 +- src/components/modals/agents/EditAgent.vue | 266 ++- src/components/modals/agents/InstallAgent.vue | 127 +- .../modals/agents/PatchPolicyForm.vue | 100 +- src/components/modals/agents/RebootLater.vue | 14 +- src/components/modals/agents/RunScript.vue | 119 +- src/components/modals/agents/SendCommand.vue | 64 +- src/components/modals/agents/UpdateAgents.vue | 39 +- .../modals/alerts/AlertExclusions.vue | 36 +- .../modals/alerts/AlertTemplateAdd.vue | 24 +- .../modals/alerts/AlertTemplateForm.vue | 283 ++- .../modals/alerts/AlertTemplateRelated.vue | 6 +- .../modals/alerts/AlertsOverview.vue | 148 +- .../modals/core/ServerMaintenance.vue | 21 +- .../modals/coresettings/CodeSign.vue | 24 +- .../modals/coresettings/CustomFields.vue | 19 +- .../modals/coresettings/CustomFieldsForm.vue | 36 +- .../modals/coresettings/CustomFieldsTable.vue | 54 +- .../modals/coresettings/EditCoreSettings.vue | 191 +- .../modals/coresettings/KeyStoreForm.vue | 26 +- .../modals/coresettings/KeyStoreTable.vue | 25 +- .../modals/coresettings/ResetPatchPolicy.vue | 29 +- .../modals/coresettings/URLActionsForm.vue | 27 +- .../modals/coresettings/URLActionsTable.vue | 25 +- .../modals/coresettings/UserPreferences.vue | 83 +- src/components/scripts/ScriptFormModal.vue | 103 +- src/components/scripts/ScriptManager.vue | 307 ++- .../scripts/ScriptSnippetFormModal.vue | 62 +- src/components/scripts/ScriptSnippets.vue | 71 +- src/components/scripts/ScriptUploadModal.vue | 40 +- src/components/scripts/TestScriptModal.vue | 8 +- src/components/software/InstallSoftware.vue | 19 +- src/components/tasks/AutomatedTaskForm.vue | 2116 +++++++++-------- src/components/ui/CustomField.vue | 29 +- src/components/ui/DialogWrapper.vue | 18 +- src/components/ui/ExportTableBtn.vue | 2 +- src/components/ui/TacticalDropdown.vue | 36 +- src/composables/accounts.js | 38 +- src/composables/agents.js | 29 +- src/composables/checks.js | 675 +++--- src/composables/clients.js | 37 +- src/composables/core.js | 26 +- src/composables/scripts.js | 56 +- src/env.d.ts | 9 + src/index.template.html | 38 +- src/layouts/MainLayout.vue | 81 +- src/mixins/data.js | 28 +- src/mixins/mixins.js | 107 +- src/quasar.d.ts | 9 + src/router/index.js | 32 +- src/router/routes.js | 44 +- src/shims-vue.d.ts | 8 + src/store/index.js | 265 ++- src/utils/csv.js | 15 +- src/utils/format.js | 238 +- src/utils/notify.js | 10 +- src/utils/validation.js | 20 +- src/views/{Agent.vue => AgentView.vue} | 18 +- .../{Dashboard.vue => DashboardView.vue} | 207 +- src/views/InitialSetup.vue | 42 +- src/views/{Login.vue => LoginView.vue} | 66 +- src/views/NotFound.vue | 6 +- src/views/RemoteBackground.vue | 56 +- src/views/SessionExpired.vue | 2 +- src/views/TOTPSetup.vue | 23 +- src/views/TakeControl.vue | 40 +- tsconfig.json | 9 + 151 files changed, 10991 insertions(+), 5405 deletions(-) delete mode 100644 .babelrc create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .prettierrc rename src/components/clients/{Deployment.vue => DeploymentTable.vue} (76%) create mode 100644 src/env.d.ts create mode 100644 src/quasar.d.ts create mode 100644 src/shims-vue.d.ts rename src/views/{Agent.vue => AgentView.vue} (75%) rename src/views/{Dashboard.vue => DashboardView.vue} (79%) rename src/views/{Login.vue => LoginView.vue} (62%) create mode 100644 tsconfig.json diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 18c19db..0000000 --- a/.babelrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "plugins": ["@babel/plugin-syntax-dynamic-import"], - "env": { - "test": { - "plugins": ["dynamic-import-node"], - "presets": [ - [ - "@babel/preset-env", - { - "modules": "commonjs", - "targets": { - "node": "current" - } - } - ] - ] - } - } -} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..47d6d52 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,9 @@ +/dist +/src-bex/www +/src-capacitor +/src-cordova +/.quasar +/node_modules +.eslintrc.js +babel.config.js +/src-ssr diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..11a7aef --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,88 @@ +module.exports = { + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, + + // https://eslint.vuejs.org/user-guide/#how-to-use-a-custom-parser + // Must use parserOptions instead of "parser" to allow vue-eslint-parser to keep working + // `parser: 'vue-eslint-parser'` is already included with any 'plugin:vue/**' config and should be omitted + parserOptions: { + parser: require.resolve("@typescript-eslint/parser"), + extraFileExtensions: [".vue"], + }, + + env: { + browser: true, + es2021: true, + node: true, + "vue/setup-compiler-macros": true, + }, + + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + // 'eslint:recommended', + + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + // ESLint typescript rules + "plugin:@typescript-eslint/recommended", + + // Uncomment any of the lines below to choose desired strictness, + // but leave only one uncommented! + // See https://eslint.vuejs.org/rules/#available-rules + "plugin:vue/vue3-essential", // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + "prettier", + ], + + plugins: [ + // required to apply rules which need type information + "@typescript-eslint", + + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + "vue", + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + ], + + globals: { + ga: "readonly", // Google Analytics + cordova: "readonly", + __statics: "readonly", + __QUASAR_SSR__: "readonly", + __QUASAR_SSR_SERVER__: "readonly", + __QUASAR_SSR_CLIENT__: "readonly", + __QUASAR_SSR_PWA__: "readonly", + process: "readonly", + Capacitor: "readonly", + chrome: "readonly", + }, + + // add your custom rules here + rules: { + "prefer-promise-reject-errors": "off", + + quotes: ["warn", "double", { avoidEscape: true }], + + // this rule, if on, would require explicit return type on the `render` function + "@typescript-eslint/explicit-function-return-type": "off", + + // in plain CommonJS modules, you can't use `import foo = require('foo')` to pass this rule, so it has to be disabled + "@typescript-eslint/no-var-requires": "off", + + // The core 'no-unused-vars' rules (in the eslint:recommended ruleset) + // does not work with type definitions + "no-unused-vars": "off", + + // allow debugger during development only + "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off", + }, +}; diff --git a/.postcssrc.js b/.postcssrc.js index 1174fe5..f2ec6b3 100644 --- a/.postcssrc.js +++ b/.postcssrc.js @@ -3,6 +3,6 @@ module.exports = { plugins: [ // to edit target browsers: use "browserslist" field in package.json - require('autoprefixer') - ] -} + require("autoprefixer"), + ], +}; diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..dc6958f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": false, + "semi": true +} diff --git a/babel.config.js b/babel.config.js index 1952e0c..ab0385b 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,18 +1,14 @@ -const fs = require('fs-extra') -let extend = undefined +/* eslint-disable */ -/** - * The .babelrc file has been created to assist Jest for transpiling. - * You should keep your application's babel rules in this file. - */ - -if (fs.existsSync('./.babelrc')) { - extend = './.babelrc' -} - -module.exports = { - presets: [ - '@quasar/babel-preset-app' - ], - extends: extend -} +module.exports = (api) => { + return { + presets: [ + [ + "@quasar/babel-preset-app", + api.caller((caller) => caller && caller.target === "node") + ? { targets: { node: "current" } } + : {}, + ], + ], + }; +}; diff --git a/package-lock.json b/package-lock.json index 1d6f171..90227ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,12 @@ "@quasar/extras": "^1.13.5", "apexcharts": "^3.35.0", "axios": "^0.26.1", + "core-js": "^3.6.5", "dotenv": "^16.0.0", "qrcode.vue": "^3.3.3", "quasar": "^2.6.6", "vue": "^3.2.31", + "vue-router": "^4.0.0", "vue3-ace-editor": "^2.2.2", "vue3-apexcharts": "^1.4.1", "vuedraggable": "^4.1.0", @@ -22,7 +24,19 @@ }, "devDependencies": { "@quasar/app-webpack": "^3.5.1", - "@quasar/cli": "^1.3.2" + "@quasar/cli": "^1.3.2", + "@types/node": "^12.20.21", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "eslint": "^8.10.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-vue": "^8.5.0", + "prettier": "^2.5.1" + }, + "engines": { + "node": ">= 12.22.1", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" } }, "node_modules/@ampproject/remapping": { @@ -1816,6 +1830,91 @@ "node": ">=6.9.0" } }, + "node_modules/@eslint/eslintrc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", + "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", @@ -2297,9 +2396,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", + "version": "12.20.49", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.49.tgz", + "integrity": "sha512-5e6QNb9bkeh4Hni4ktLqUZuUqnGTX/kou2aZkXyxtuYaHXgBm+In1SHR9V+7kDzWzjB08KC2uqt2doDi7cuAAA==", "dev": true }, "node_modules/@types/parse-json": { @@ -2374,6 +2473,228 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz", + "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/type-utils": "5.21.0", + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "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/@typescript-eslint/parser": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz", + "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.0", + "debug": "^4.3.2" + }, + "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/@typescript-eslint/scope-manager": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz", + "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz", + "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", + "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": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz", + "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz", + "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "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/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "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/@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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz", + "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.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/visitor-keys": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz", + "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.21.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@vue/compiler-core": { "version": "3.2.33", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz", @@ -2694,6 +3015,15 @@ "acorn": "^8" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -4218,7 +4548,6 @@ "version": "3.22.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz", "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==", - "dev": true, "hasInstallScript": true, "funding": { "type": "opencollective", @@ -4918,6 +5247,12 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "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", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -5039,6 +5374,18 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -5368,6 +5715,90 @@ "node": ">=0.8.0" } }, + "node_modules/eslint": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", + "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.2.2", + "@humanwhocodes/config-array": "^0.9.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.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "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.0.4", + "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/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz", + "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.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" + }, + "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-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -5381,6 +5812,147 @@ "node": ">=8.0.0" } }, + "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/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/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/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/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.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/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, + "engines": { + "node": ">=4.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, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5394,6 +5966,27 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -5664,6 +6257,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -5709,6 +6308,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -5885,6 +6496,25 @@ "node": ">=8" } }, + "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/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, "node_modules/follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", @@ -6102,6 +6732,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7270,6 +7906,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -7403,6 +8045,19 @@ "safe-buffer": "~5.1.0" } }, + "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/lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", @@ -7501,6 +8156,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -7941,6 +8602,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -8219,6 +8886,23 @@ "opener": "bin/opener-bin.js" } }, + "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/ora": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", @@ -9340,6 +10024,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "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/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -9349,6 +10042,21 @@ "node": ">=4" } }, + "node_modules/prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -9632,6 +10340,18 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", @@ -10995,6 +11715,12 @@ "node": ">= 8" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -11143,6 +11869,27 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/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/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -11155,6 +11902,18 @@ "node": "*" } }, + "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/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -11442,6 +12201,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -11472,6 +12237,52 @@ "@vue/shared": "3.2.33" } }, + "node_modules/vue-eslint-parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/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/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-loader": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz", @@ -11490,8 +12301,6 @@ "version": "4.0.14", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.14.tgz", "integrity": "sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==", - "dev": true, - "peer": true, "dependencies": { "@vue/devtools-api": "^6.0.0" }, @@ -12060,6 +12869,15 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -13461,6 +14279,72 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", + "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "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 + }, + "globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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" + } + }, + "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 + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", @@ -13852,9 +14736,9 @@ "dev": true }, "@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", + "version": "12.20.49", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.49.tgz", + "integrity": "sha512-5e6QNb9bkeh4Hni4ktLqUZuUqnGTX/kou2aZkXyxtuYaHXgBm+In1SHR9V+7kDzWzjB08KC2uqt2doDi7cuAAA==", "dev": true }, "@types/parse-json": { @@ -13929,6 +14813,129 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz", + "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/type-utils": "5.21.0", + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz", + "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz", + "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz", + "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.21.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz", + "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz", + "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/visitor-keys": "5.21.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "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 + }, + "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" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@typescript-eslint/utils": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz", + "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.21.0", + "@typescript-eslint/types": "5.21.0", + "@typescript-eslint/typescript-estree": "5.21.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz", + "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.21.0", + "eslint-visitor-keys": "^3.0.0" + } + }, "@vue/compiler-core": { "version": "3.2.33", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz", @@ -14233,6 +15240,13 @@ "dev": true, "requires": {} }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -15405,8 +16419,7 @@ "core-js": { "version": "3.22.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz", - "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==", - "dev": true + "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==" }, "core-js-compat": { "version": "3.22.0", @@ -15923,6 +16936,12 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-is": { + "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": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -16019,6 +17038,15 @@ "@leichtgewicht/ip-codec": "^2.0.1" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -16288,6 +17316,133 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", + "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.2.2", + "@humanwhocodes/config-array": "^0.9.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.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "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.0.4", + "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" + }, + "dependencies": { + "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 + }, + "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-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" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "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.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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" + } + }, + "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 + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-plugin-vue": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz", + "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==", + "dev": true, + "requires": { + "eslint-utils": "^3.0.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" + } + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -16298,12 +17453,63 @@ "estraverse": "^4.1.1" } }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -16512,6 +17718,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -16548,6 +17760,15 @@ "escape-string-regexp": "^1.0.5" } }, + "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" + } + }, "file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -16682,6 +17903,22 @@ } } }, + "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.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, "follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", @@ -16835,6 +18072,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -17707,6 +18950,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -17822,6 +19071,16 @@ } } }, + "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" + } + }, "lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", @@ -17908,6 +19167,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -18245,6 +19510,12 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -18441,6 +19712,20 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "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" + } + }, "ora": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", @@ -19225,12 +20510,24 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "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 + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, + "prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "dev": true + }, "pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -19451,6 +20748,12 @@ "@babel/runtime": "^7.8.4" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "regexpu-core": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", @@ -20488,6 +21791,12 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -20602,6 +21911,23 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -20611,6 +21937,15 @@ "safe-buffer": "^5.0.1" } }, + "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.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -20816,6 +22151,12 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -20843,6 +22184,39 @@ "@vue/shared": "3.2.33" } }, + "vue-eslint-parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "dev": true, + "requires": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "dependencies": { + "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" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, "vue-loader": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz", @@ -20858,8 +22232,6 @@ "version": "4.0.14", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.14.tgz", "integrity": "sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==", - "dev": true, - "peer": true, "requires": { "@vue/devtools-api": "^6.0.0" } @@ -21285,6 +22657,12 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "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 + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 2edad4e..4a3da77 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,14 @@ "scripts": { "serve": "quasar dev", "build": "quasar build", - "test:e2e": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress open\"", - "test:e2e:ci": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress run\"" + "lint": "eslint --ext .js,.ts,.vue ./", + "format": "prettier --write \"**/*.{js,ts,vue,,html,md,json}\" --ignore-path .gitignore" }, "dependencies": { "@quasar/extras": "^1.13.5", "apexcharts": "^3.35.0", "axios": "^0.26.1", + "core-js": "^3.6.5", "dotenv": "^16.0.0", "qrcode.vue": "^3.3.3", "quasar": "^2.6.6", @@ -20,16 +21,34 @@ "vue3-ace-editor": "^2.2.2", "vue3-apexcharts": "^1.4.1", "vuedraggable": "^4.1.0", + "vue-router": "^4.0.0", "vuex": "^4.0.2" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "eslint": "^8.10.0", + "eslint-plugin-vue": "^8.5.0", + "eslint-config-prettier": "^8.1.0", + "prettier": "^2.5.1", + "@types/node": "^12.20.21", "@quasar/app-webpack": "^3.5.1", "@quasar/cli": "^1.3.2" }, "browserslist": [ - "last 2 Chrome versions", - "last 2 Firefox versions", - "last 2 Edge versions", - "last 1 Safari versions" - ] -} \ No newline at end of file + "last 10 Chrome versions", + "last 10 Firefox versions", + "last 4 Edge versions", + "last 7 Safari versions", + "last 8 Android versions", + "last 8 ChromeAndroid versions", + "last 8 FirefoxAndroid versions", + "last 10 iOS versions", + "last 5 Opera versions" + ], + "engines": { + "node": ">= 12.22.1", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } +} diff --git a/quasar.conf.js b/quasar.conf.js index 232bc6a..cf0832d 100644 --- a/quasar.conf.js +++ b/quasar.conf.js @@ -1,38 +1,48 @@ -require('dotenv').config(); -const path = require('path'); +require("dotenv").config(); +const path = require("path"); module.exports = function () { return { - supportTS: false, + supportTS: { + tsCheckerConfig: { + eslint: { + enabled: true, + files: "./src/**/*.{ts,tsx,js,jsx,vue}", + }, + }, + }, // https://quasar.dev/quasar-cli/cli-documentation/prefetch-feature // preFetch: true, - boot: [ - 'axios', - ], + boot: ["axios"], // https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css - css: [ - 'app.sass' - ], + css: ["app.sass"], // https://github.com/quasarframework/quasar/tree/dev/extras extras: [ // 'ionicons-v4', - 'mdi-v5', - 'fontawesome-v5', + "mdi-v5", + "fontawesome-v5", // 'eva-icons', // 'themify', // 'line-awesome', // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! - 'roboto-font', // optional, you are not bound to it - 'material-icons', // optional, you are not bound to it + "roboto-font", // optional, you are not bound to it + "material-icons", // optional, you are not bound to it ], // Full list of options: https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build build: { - env: { DEV_API: process.env.DEV_URL, PROD_API: process.env.PROD_URL, DOCKER_BUILD: process.env.DOCKER_BUILD }, - vueRouterMode: 'history', // available values: 'hash', 'history' + env: { + DEV_API: process.env.DEV_URL, + PROD_API: process.env.PROD_URL, + DOCKER_BUILD: process.env.DOCKER_BUILD, + }, + vueRouterMode: "history", // available values: 'hash', 'history' distDir: "dist/", - devtool: process.env.NODE_ENV === "production" ? "cheap-module-eval-source-map" : "source-map", + devtool: + process.env.NODE_ENV === "production" + ? "cheap-module-eval-source-map" + : "source-map", // Add dependencies for transpiling with Babel (Array of regexes) // (from node_modules, which are by default not transpiled). @@ -52,8 +62,8 @@ module.exports = function () { extendWebpack(cfg) { cfg.resolve.alias = { ...cfg.resolve.alias, - "@": path.resolve(__dirname, './src'), - } + "@": path.resolve(__dirname, "./src"), + }; }, }, @@ -62,36 +72,30 @@ module.exports = function () { https: false, host: process.env.DEV_HOST, port: process.env.DEV_PORT, - open: false + open: false, }, // https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework framework: { - iconSet: 'material-icons', // Quasar icon set - lang: 'en-US', // Quasar language pack + iconSet: "material-icons", // Quasar icon set + lang: "en-US", // Quasar language pack // Quasar plugins - plugins: [ - 'Dialog', - 'Loading', - 'LoadingBar', - 'Meta', - 'Notify' - ], + plugins: ["Dialog", "Loading", "LoadingBar", "Meta", "Notify"], config: { loadingBar: { - size: "4px" + size: "4px", }, notify: { position: "top", timeout: 2000, textColor: "white", - actions: [{ icon: "close", color: "white" }] + actions: [{ icon: "close", color: "white" }], }, loading: { - delay: 50 - } - } + delay: 50, + }, + }, }, // animations: 'all', // --- includes all animations @@ -100,7 +104,7 @@ module.exports = function () { // https://quasar.dev/quasar-cli/developing-ssr/configuring-ssr ssr: { - pwa: false - } - } -} + pwa: false, + }, + }; +}; diff --git a/src/App.vue b/src/App.vue index 29b30e7..01da864 100644 --- a/src/App.vue +++ b/src/App.vue @@ -96,4 +96,4 @@ body .min-width min-width: 0px !important - \ No newline at end of file + diff --git a/src/api/accounts.js b/src/api/accounts.js index 3ca976a..16e3509 100644 --- a/src/api/accounts.js +++ b/src/api/accounts.js @@ -1,57 +1,63 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/accounts" +const baseUrl = "/accounts"; // user api functions export async function fetchUsers(params = {}) { try { - const { data } = await axios.get(`${baseUrl}/users/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/users/`, { params: params }); + return data; + } catch (e) { + console.error(e); + } } // role api function export async function fetchRoles(params = {}) { try { - const { data } = await axios.get(`${baseUrl}/roles/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/roles/`, { params: params }); + return data; + } catch (e) { + console.error(e); + } } export async function removeRole(id) { - const { data } = await axios.delete(`${baseUrl}/roles/${id}/`) - return data + const { data } = await axios.delete(`${baseUrl}/roles/${id}/`); + return data; } -export async function saveRole(payload) { - const { data } = await axios.post(`${baseUrl}/roles/`, payload) - return data +export async function saveRole(role) { + const { data } = await axios.post(`${baseUrl}/roles/`, role); + return data; } -export async function editRole(id, payload) { - const { data } = await axios.put(`${baseUrl}/roles/${id}/`, payload) - return data +export async function editRole(id, role) { + const { data } = await axios.put(`${baseUrl}/roles/${id}/`, role); + return data; } // api key api functions export async function fetchAPIKeys(params = {}) { try { - const { data } = await axios.get(`${baseUrl}/apikeys/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/apikeys/`, { params: params }); + return data; + } catch (e) { + console.error(e); + } } -export async function saveAPIKey(payload) { - const { data } = await axios.post(`${baseUrl}/apikeys/`, payload) - return data +export async function saveAPIKey(apiKey) { + const { data } = await axios.post(`${baseUrl}/apikeys/`, apiKey); + return data; } -export async function editAPIKey(payload) { - const { data } = await axios.put(`${baseUrl}/apikeys/${payload.id}/`, payload) - return data +export async function editAPIKey(id, apiKey) { + const { data } = await axios.put(`${baseUrl}/apikeys/${id}/`, apiKey); + return data; } export async function removeAPIKey(id) { - const { data } = await axios.delete(`${baseUrl}/apikeys/${id}/`) - return data + const { data } = await axios.delete(`${baseUrl}/apikeys/${id}/`); + return data; } diff --git a/src/api/agents.js b/src/api/agents.js index bf0ab2c..046ff87 100644 --- a/src/api/agents.js +++ b/src/api/agents.js @@ -1,167 +1,234 @@ -import axios from "axios" +import axios from "axios"; import { openURL } from "quasar"; -import { router } from "@/router" +import { router } from "@/router"; -const baseUrl = "/agents" +const baseUrl = "/agents"; export function runTakeControl(agent_id) { const url = router.resolve(`/takecontrol/${agent_id}`).href; - openURL(url, null, { popup: true, scrollbars: false, location: false, status: false, toolbar: false, menubar: false, width: 1600, height: 900 }); + openURL(url, null, { + popup: true, + scrollbars: false, + location: false, + status: false, + toolbar: false, + menubar: false, + width: 1600, + height: 900, + }); } export function openAgentWindow(agent_id) { const url = router.resolve(`/agents/${agent_id}`).href; - openURL(url, null, { popup: true, scrollbars: false, location: false, status: false, toolbar: false, menubar: false, width: 1600, height: 900 }); + openURL(url, null, { + popup: true, + scrollbars: false, + location: false, + status: false, + toolbar: false, + menubar: false, + width: 1600, + height: 900, + }); } export function runRemoteBackground(agent_id, agentPlatform) { - const url = router.resolve(`/remotebackground/${agent_id}?agentPlatform=${agentPlatform}`).href; - openURL(url, null, { popup: true, scrollbars: false, location: false, status: false, toolbar: false, menubar: false, width: 1280, height: 900 }); + const url = router.resolve( + `/remotebackground/${agent_id}?agentPlatform=${agentPlatform}` + ).href; + openURL(url, null, { + popup: true, + scrollbars: false, + location: false, + status: false, + toolbar: false, + menubar: false, + width: 1280, + height: 900, + }); } export async function fetchAgents(params = {}) { try { - const { data } = await axios.get(`${baseUrl}/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/`, { params: params }); + return data; } catch (e) { - console.error(e) + console.error(e); } } export async function fetchAgent(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function editAgent(agent_id, payload) { - const { data } = await axios.put(`${baseUrl}/${agent_id}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/${agent_id}/`, payload); + return data; } export async function removeAgent(agent_id) { - const { data } = await axios.delete(`${baseUrl}/${agent_id}/`) - return data + const { data } = await axios.delete(`${baseUrl}/${agent_id}/`); + return data; } export async function fetchAgentHistory(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/history/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/${agent_id}/history/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function fetchAgentChecks(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/checks/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/${agent_id}/checks/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function fetchAgentTasks(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/tasks/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/${agent_id}/tasks/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function sendAgentRecovery(agent_id, payload) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/recover/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/recover/`, payload); + return data; } export async function sendAgentCommand(agent_id, payload) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/cmd/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/cmd/`, payload); + return data; } export async function refreshAgentWMI(agent_id) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/wmi/`) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/wmi/`); + return data; } export async function runScript(agent_id, payload) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/runscript/`, payload) - return data + const { data } = await axios.post( + `${baseUrl}/${agent_id}/runscript/`, + payload + ); + return data; } export async function runBulkAction(payload) { - const { data } = await axios.post(`${baseUrl}/actions/bulk/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/actions/bulk/`, payload); + return data; } export async function fetchAgentProcesses(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/processes/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/${agent_id}/processes/`, { + params: params, + }); + return data; } catch (e) { - console.error(e) + console.error(e); } } export async function killAgentProcess(agent_id, pid, params = {}) { - const { data } = await axios.delete(`${baseUrl}/${agent_id}/processes/${pid}/`, { params: params }) - return data + const { data } = await axios.delete( + `${baseUrl}/${agent_id}/processes/${pid}/`, + { params: params } + ); + return data; } export async function fetchAgentEventLog(agent_id, logType, days, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/eventlog/${logType}/${days}/`, { params: params }) - return data + const { data } = await axios.get( + `${baseUrl}/${agent_id}/eventlog/${logType}/${days}/`, + { params: params } + ); + return data; } catch (e) { - console.error(e) + console.error(e); } } export async function fetchAgentMeshCentralURLs(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/meshcentral/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/${agent_id}/meshcentral/`, { + params: params, + }); + return data; } catch (e) { - console.error(e) + console.error(e); } } export async function scheduleAgentReboot(agent_id, payload) { - const { data } = await axios.patch(`${baseUrl}/${agent_id}/reboot/`, payload) - return data + const { data } = await axios.patch(`${baseUrl}/${agent_id}/reboot/`, payload); + return data; } export async function agentRebootNow(agent_id) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/reboot/`) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/reboot/`); + return data; } export async function sendAgentRecoverMesh(agent_id, params = {}) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/meshcentral/recover/`, { params: params }) - return data + const { data } = await axios.post( + `${baseUrl}/${agent_id}/meshcentral/recover/`, + { params: params } + ); + return data; } export async function sendAgentPing(agent_id, params = {}) { - const { data } = await axios.get(`${baseUrl}/${agent_id}/ping/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/${agent_id}/ping/`, { + params: params, + }); + return data; } // agent notes export async function fetchAgentNotes(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/notes/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/${agent_id}/notes/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function saveAgentNote(payload) { - const { data } = await axios.post(`${baseUrl}/notes/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/notes/`, payload); + return data; } export async function editAgentNote(pk, payload) { - const { data } = await axios.put(`${baseUrl}/notes/${pk}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/notes/${pk}/`, payload); + return data; } export async function removeAgentNote(pk) { - const { data } = await axios.delete(`${baseUrl}/notes/${pk}/`) - return data + const { data } = await axios.delete(`${baseUrl}/notes/${pk}/`); + return data; } diff --git a/src/api/automation.js b/src/api/automation.js index 296d091..7041b3b 100644 --- a/src/api/automation.js +++ b/src/api/automation.js @@ -1,15 +1,17 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/automation" +const baseUrl = "/automation"; export async function sendPatchPolicyReset(payload) { - const { data } = await axios.post(`${baseUrl}/patchpolicy/reset/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/patchpolicy/reset/`, payload); + return data; } export async function fetchPolicyChecks(id) { - try { - const { data } = await axios.get(`${baseUrl}/policies/${id}/checks/`) - return data - } catch (e) { console.error(e) } -} \ No newline at end of file + try { + const { data } = await axios.get(`${baseUrl}/policies/${id}/checks/`); + return data; + } catch (e) { + console.error(e); + } +} diff --git a/src/api/checks.js b/src/api/checks.js index bd28025..080f591 100644 --- a/src/api/checks.js +++ b/src/api/checks.js @@ -1,37 +1,37 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/checks" +const baseUrl = "/checks"; export async function fetchChecks(params = {}) { - try { - const { data } = await axios.get(`${baseUrl}/`, { params: params }) - return data - } catch (e) { - console.error(e) - } + try { + const { data } = await axios.get(`${baseUrl}/`, { params: params }); + return data; + } catch (e) { + console.error(e); + } } export async function saveCheck(payload) { - const { data } = await axios.post(`${baseUrl}/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/`, payload); + return data; } export async function updateCheck(id, payload) { - const { data } = await axios.put(`${baseUrl}/${id}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/${id}/`, payload); + return data; } export async function removeCheck(id) { - const { data } = await axios.delete(`${baseUrl}/${id}/`) - return data + const { data } = await axios.delete(`${baseUrl}/${id}/`); + return data; } export async function resetCheck(id) { - const { data } = await axios.post(`${baseUrl}/${id}/reset/`) - return data + const { data } = await axios.post(`${baseUrl}/${id}/reset/`); + return data; } export async function runAgentChecks(agent_id) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/run/`) - return data -} \ No newline at end of file + const { data } = await axios.post(`${baseUrl}/${agent_id}/run/`); + return data; +} diff --git a/src/api/clients.js b/src/api/clients.js index faa9c6e..e160a7a 100644 --- a/src/api/clients.js +++ b/src/api/clients.js @@ -1,81 +1,95 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/clients" +const baseUrl = "/clients"; // client endpoints export async function fetchClients() { try { - const { data } = await axios.get(`${baseUrl}/`) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/`); + return data; + } catch (e) { + console.error(e); + } } export async function fetchClient(id) { try { - const { data } = await axios.get(`${baseUrl}/${id}/`) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/${id}/`); + return data; + } catch (e) { + console.error(e); + } } export async function saveClient(payload) { - const { data } = await axios.post(`${baseUrl}/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/`, payload); + return data; } export async function editClient(id, payload) { - const { data } = await axios.put(`${baseUrl}/${id}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/${id}/`, payload); + return data; } export async function removeClient(id, params = {}) { - const { data } = await axios.delete(`${baseUrl}/${id}/`, { params: params }) - return data + const { data } = await axios.delete(`${baseUrl}/${id}/`, { params: params }); + return data; } // site endpoints export async function fetchSites() { try { - const { data } = await axios.get(`${baseUrl}/sites/`) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/sites/`); + return data; + } catch (e) { + console.error(e); + } } export async function fetchSite(id) { try { - const { data } = await axios.get(`${baseUrl}/sites/${id}/`) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/sites/${id}/`); + return data; + } catch (e) { + console.error(e); + } } export async function saveSite(payload) { - const { data } = await axios.post(`${baseUrl}/sites/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/sites/`, payload); + return data; } export async function editSite(id, payload) { - const { data } = await axios.put(`${baseUrl}/sites/${id}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/sites/${id}/`, payload); + return data; } export async function removeSite(id, params = {}) { - const { data } = await axios.delete(`${baseUrl}/sites/${id}/`, { params: params }) - return data + const { data } = await axios.delete(`${baseUrl}/sites/${id}/`, { + params: params, + }); + return data; } // deployment endpoints export async function fetchDeployments() { try { - const { data } = await axios.get(`${baseUrl}/deployments/`) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/deployments/`); + return data; + } catch (e) { + console.error(e); + } } export async function saveDeployment(payload) { - const { data } = await axios.post(`${baseUrl}/deployments/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/deployments/`, payload); + return data; } export async function removeDeployment(id, params = {}) { - const { data } = await axios.delete(`${baseUrl}/deployments/${id}/`, { params: params }) - return data -} \ No newline at end of file + const { data } = await axios.delete(`${baseUrl}/deployments/${id}/`, { + params: params, + }); + return data; +} diff --git a/src/api/core.js b/src/api/core.js index a78b41c..b448827 100644 --- a/src/api/core.js +++ b/src/api/core.js @@ -1,30 +1,40 @@ -import axios from "axios" +import axios from "axios"; import { openURL } from "quasar"; -const baseUrl = "/core" +const baseUrl = "/core"; export async function fetchCustomFields(params = {}) { try { - const { data } = await axios.get(`${baseUrl}/customfields/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/customfields/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function fetchDashboardInfo(params = {}) { - const { data } = await axios.get(`${baseUrl}/dashinfo/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/dashinfo/`, { params: params }); + return data; } export async function fetchURLActions(params = {}) { try { - const { data } = await axios.get(`${baseUrl}/urlaction/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/urlaction/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function runURLAction(payload) { try { - const { data } = await axios.patch(`${baseUrl}/urlaction/run/`, payload) - openURL(data) - } catch (e) { console.error(e) } -} \ No newline at end of file + const { data } = await axios.patch(`${baseUrl}/urlaction/run/`, payload); + openURL(data); + } catch (e) { + console.error(e); + } +} diff --git a/src/api/logs.js b/src/api/logs.js index 0462626..4251aa2 100644 --- a/src/api/logs.js +++ b/src/api/logs.js @@ -1,35 +1,37 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/logs" +const baseUrl = "/logs"; export async function fetchDebugLog(payload) { try { - const { data } = await axios.patch(`${baseUrl}/debug/`, payload) - return data - } catch (e) { } + const { data } = await axios.patch(`${baseUrl}/debug/`, payload); + return data; + } catch (e) {} } export async function fetchAuditLog(payload) { - const { data } = await axios.patch(`${baseUrl}/audit/`, payload) - return data + const { data } = await axios.patch(`${baseUrl}/audit/`, payload); + return data; } // pending actions export async function fetchPendingActions(params = {}) { - const { data } = await axios.get(`${baseUrl}/pendingactions/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/pendingactions/`, { + params: params, + }); + return data; } export async function fetchAgentPendingActions(agent_id) { try { - const { data } = await axios.get(`/agents/${agent_id}/pendingactions/`) - return data + const { data } = await axios.get(`/agents/${agent_id}/pendingactions/`); + return data; } catch (e) { - console.error(e) + console.error(e); } } export async function deletePendingAction(id) { - const { data } = await axios.delete(`${baseUrl}/pendingactions/${id}/`) - return data + const { data } = await axios.delete(`${baseUrl}/pendingactions/${id}/`); + return data; } diff --git a/src/api/scripts.js b/src/api/scripts.js index e37e7b9..c3d9c18 100644 --- a/src/api/scripts.js +++ b/src/api/scripts.js @@ -1,62 +1,67 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/scripts" +const baseUrl = "/scripts"; // script operations export async function fetchScripts(params = {}) { - const { data } = await axios.get(`${baseUrl}/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/`, { params: params }); + return data; } export async function testScript(agent_id, payload) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/test/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/test/`, payload); + return data; } export async function saveScript(payload) { - const { data } = await axios.post(`${baseUrl}/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/`, payload); + return data; } export async function editScript(payload) { - const { data } = await axios.put(`${baseUrl}/${payload.id}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/${payload.id}/`, payload); + return data; } export async function removeScript(id) { - const { data } = await axios.delete(`${baseUrl}/${id}/`) - return data + const { data } = await axios.delete(`${baseUrl}/${id}/`); + return data; } export async function downloadScript(id, params = {}) { - const { data } = await axios.get(`${baseUrl}/${id}/download/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/${id}/download/`, { + params: params, + }); + return data; } - // script snippet operations export async function fetchScriptSnippets(params = {}) { - const { data } = await axios.get(`${baseUrl}/snippets/`, { params: params }) - return data - + const { data } = await axios.get(`${baseUrl}/snippets/`, { params: params }); + return data; } export async function saveScriptSnippet(payload) { - const { data } = await axios.post(`${baseUrl}/snippets/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/snippets/`, payload); + return data; } export async function fetchScriptSnippet(id, params = {}) { - const { data } = await axios.get(`${baseUrl}/snippets/${id}/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/snippets/${id}/`, { + params: params, + }); + return data; } export async function editScriptSnippet(payload) { - const { data } = await axios.put(`${baseUrl}/snippets/${payload.id}/`, payload) - return data + const { data } = await axios.put( + `${baseUrl}/snippets/${payload.id}/`, + payload + ); + return data; } export async function removeScriptSnippet(id) { - const { data } = await axios.delete(`${baseUrl}/snippets/${id}/`) - return data -} \ No newline at end of file + const { data } = await axios.delete(`${baseUrl}/snippets/${id}/`); + return data; +} diff --git a/src/api/services.js b/src/api/services.js index ddd9a04..dcaf38f 100644 --- a/src/api/services.js +++ b/src/api/services.js @@ -1,31 +1,41 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/services" +const baseUrl = "/services"; export async function getAgentServices(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { + params: params, + }); + return data; } catch (e) { - console.error(e) + console.error(e); } } export async function getAgentServiceDetails(agent_id, svcname, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/${svcname}/`, { params: params }) - return data + const { data } = await axios.get(`${baseUrl}/${agent_id}/${svcname}/`, { + params: params, + }); + return data; } catch (e) { - console.error(e) + console.error(e); } } export async function editAgentServiceStartType(agent_id, svcname, payload) { - const { data } = await axios.put(`${baseUrl}/${agent_id}/${svcname}/`, payload) - return data + const { data } = await axios.put( + `${baseUrl}/${agent_id}/${svcname}/`, + payload + ); + return data; } export async function sendAgentServiceAction(agent_id, svcname, payload) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/${svcname}/`, payload) - return data + const { data } = await axios.post( + `${baseUrl}/${agent_id}/${svcname}/`, + payload + ); + return data; } diff --git a/src/api/software.js b/src/api/software.js index 22c525e..e1df9e2 100644 --- a/src/api/software.js +++ b/src/api/software.js @@ -1,35 +1,37 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/software" +const baseUrl = "/software"; export async function fetchChocosSoftware(params = {}) { - try { - const { data } = await axios.get(`${baseUrl}/chocos/`, { params: params }) - return data - } catch (e) { - console.error(e) - } + try { + const { data } = await axios.get(`${baseUrl}/chocos/`, { params: params }); + return data; + } catch (e) { + console.error(e); + } } export async function fetchAgentSoftware(agent_id, params = {}) { - try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) - return data.software - } catch (e) { - console.error(e) - } + try { + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { + params: params, + }); + return data.software; + } catch (e) { + console.error(e); + } } export async function installAgentSoftware(agent_id, payload) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/`, payload); + return data; } export async function refreshAgentSoftware(agent_id) { - try { - const { data } = await axios.put(`${baseUrl}/${agent_id}/`) - return data - } catch (e) { - console.error(e) - } -} \ No newline at end of file + try { + const { data } = await axios.put(`${baseUrl}/${agent_id}/`); + return data; + } catch (e) { + console.error(e); + } +} diff --git a/src/api/tasks.js b/src/api/tasks.js index 28480a1..8ac767b 100644 --- a/src/api/tasks.js +++ b/src/api/tasks.js @@ -1,32 +1,32 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/tasks" +const baseUrl = "/tasks"; export async function fetchTasks(params = {}) { - try { - const { data } = await axios.get(`${baseUrl}/`, { params: params }) - return data - } catch (e) { - console.error(e) - } + try { + const { data } = await axios.get(`${baseUrl}/`, { params: params }); + return data; + } catch (e) { + console.error(e); + } } export async function saveTask(payload) { - const { data } = await axios.post(`${baseUrl}/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/`, payload); + return data; } export async function updateTask(id, payload) { - const { data } = await axios.put(`${baseUrl}/${id}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/${id}/`, payload); + return data; } export async function removeTask(id) { - const { data } = await axios.delete(`${baseUrl}/${id}/`) - return data + const { data } = await axios.delete(`${baseUrl}/${id}/`); + return data; } export async function runTask(id, payload) { - const { data } = await axios.post(`${baseUrl}/${id}/run/`, payload) - return data + const { data } = await axios.post(`${baseUrl}/${id}/run/`, payload); + return data; } diff --git a/src/api/winupdates.js b/src/api/winupdates.js index 96515a4..4d6ef4d 100644 --- a/src/api/winupdates.js +++ b/src/api/winupdates.js @@ -1,26 +1,30 @@ -import axios from "axios" +import axios from "axios"; -const baseUrl = "/winupdate" +const baseUrl = "/winupdate"; // win updates api functions export async function fetchAgentUpdates(agent_id, params = {}) { try { - const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params }) - return data - } catch (e) { console.error(e) } + const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { + params: params, + }); + return data; + } catch (e) { + console.error(e); + } } export async function runAgentUpdateScan(agent_id) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/scan/`) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/scan/`); + return data; } export async function runAgentUpdateInstall(agent_id) { - const { data } = await axios.post(`${baseUrl}/${agent_id}/install/`) - return data + const { data } = await axios.post(`${baseUrl}/${agent_id}/install/`); + return data; } export async function editAgentUpdate(id, payload) { - const { data } = await axios.put(`${baseUrl}/${id}/`, payload) - return data + const { data } = await axios.put(`${baseUrl}/${id}/`, payload); + return data; } diff --git a/src/boot/axios.js b/src/boot/axios.js index dfe73a3..1468fdf 100644 --- a/src/boot/axios.js +++ b/src/boot/axios.js @@ -1,5 +1,5 @@ -import axios from 'axios'; -import { Notify } from "quasar" +import axios from "axios"; +import { Notify } from "quasar"; export const getBaseUrl = () => { if (process.env.NODE_ENV === "production") { @@ -14,12 +14,11 @@ export const getBaseUrl = () => { }; export default function ({ app, router, store }) { - app.config.globalProperties.$axios = axios; axios.interceptors.request.use( function (config) { - config.baseURL = getBaseUrl() + config.baseURL = getBaseUrl(); const token = store.state.token; if (token != null) { config.headers.Authorization = `Token ${token}`; @@ -36,10 +35,10 @@ export default function ({ app, router, store }) { return response; }, async function (error) { - let text + let text; if (!error.response) { - text = error.message + text = error.message; } // unauthorized else if (error.response.status === 401) { @@ -48,25 +47,22 @@ export default function ({ app, router, store }) { // perms else if (error.response.status === 403) { // don't notify user if method is GET - if (error.config.method === "get" || error.config.method === "patch") return Promise.reject({ ...error }); + if (error.config.method === "get" || error.config.method === "patch") + return Promise.reject({ ...error }); text = error.response.data.detail; } // catch all for other 400 error messages else if (error.response.status >= 400 && error.response.status < 500) { - if (error.config.responseType === "blob") { - text = (await error.response.data.text()).replace(/^"|"$/g, '') - } - - else if (error.response.data.non_field_errors) { - text = error.response.data.non_field_errors[0] - + text = (await error.response.data.text()).replace(/^"|"$/g, ""); + } else if (error.response.data.non_field_errors) { + text = error.response.data.non_field_errors[0]; } else { if (typeof error.response.data === "string") { - text = error.response.data + text = error.response.data; } else if (typeof error.response.data === "object") { - let [key, value] = Object.entries(error.response.data)[0] - text = key + ": " + value[0] + let [key, value] = Object.entries(error.response.data)[0]; + text = key + ": " + value[0]; } } } @@ -75,13 +71,14 @@ export default function ({ app, router, store }) { Notify.create({ color: "negative", message: text ? text : "", - caption: error.response ? error.response.status + ": " + error.response.statusText : "", - timeout: 2500 - }) + caption: error.response + ? error.response.status + ": " + error.response.statusText + : "", + timeout: 2500, + }); } return Promise.reject({ ...error }); } ); } - diff --git a/src/components/AdminManager.vue b/src/components/AdminManager.vue index 8ff6d71..6c9a1ab 100644 --- a/src/components/AdminManager.vue +++ b/src/components/AdminManager.vue @@ -2,7 +2,15 @@
- User Administration + User Administration Close @@ -10,7 +18,17 @@
- +
@@ -269,7 +367,7 @@ export default { const params = lowerTerms.trim().split(" "); // parse search text and set variables - params.forEach(param => { + params.forEach((param) => { if (param.includes("is:")) { advancedFilter = true; let filter = param.split(":")[1]; @@ -277,22 +375,30 @@ export default { if (filter === "actionspending") actions = true; else if (filter === "checksfailing") checks = true; else if (filter === "rebootneeded") reboot = true; - else if (filter === "online" || filter === "offline" || filter === "expired" || filter === "overdue") + else if ( + filter === "online" || + filter === "offline" || + filter === "expired" || + filter === "overdue" + ) availability = filter; } else { search = param + ""; } }); - return rows.filter(row => { + return rows.filter((row) => { if (advancedFilter) { if (checks && !row.checks.has_failing_checks) return false; if (patches && !row.has_patches_pending) return false; if (actions && row.pending_actions_count === 0) return false; if (reboot && !row.needs_reboot) return false; - if (availability === "online" && row.status !== "online") return false; - else if (availability === "offline" && row.status !== "offline") return false; - else if (availability === "overdue" && row.status !== "overdue") return false; + if (availability === "online" && row.status !== "online") + return false; + else if (availability === "offline" && row.status !== "offline") + return false; + else if (availability === "overdue" && row.status !== "overdue") + return false; else if (availability === "expired") { let now = new Date(); let lastSeen = date.extractDate(row.last_seen, "MM DD YYYY HH:mm"); @@ -302,9 +408,10 @@ export default { } // Normal text filter - return cols.some(col => { + return cols.some((col) => { const val = cellValue(col, row) + ""; - const haystack = val === "undefined" || val === "null" ? "" : val.toLowerCase(); + const haystack = + val === "undefined" || val === "null" ? "" : val.toLowerCase(); return haystack.indexOf(search) !== -1; }); }); @@ -354,18 +461,17 @@ export default { [db_field]: !alert_action, }; const alertColor = !alert_action ? "positive" : "info"; - this.$axios - .put(`/agents/${agent.agent_id}/`, data) - .then(r => { - this.$q.notify({ - color: alertColor, - textColor: "black", - icon: "fas fa-check-circle", - message: `${capitalize(category)} alerts will now be ${action} when ${agent.hostname} is overdue.`, - timeout: 5000, - }); - }) - .catch(e => {}); + this.$axios.put(`/agents/${agent.agent_id}/`, data).then(() => { + this.$q.notify({ + color: alertColor, + textColor: "black", + icon: "fas fa-check-circle", + message: `${capitalize(category)} alerts will now be ${action} when ${ + agent.hostname + } is overdue.`, + timeout: 5000, + }); + }); }, agentClass(status) { if (status === "offline") { @@ -417,4 +523,3 @@ export default { }, }; - diff --git a/src/components/AlertsIcon.vue b/src/components/AlertsIcon.vue index 671f128..13742ca 100644 --- a/src/components/AlertsIcon.vue +++ b/src/components/AlertsIcon.vue @@ -1,6 +1,8 @@