From 744cfa74747b518b9c65d679ae722b5ac83c8384 Mon Sep 17 00:00:00 2001 From: LineseWorld <1076452761@qq.com> Date: Mon, 28 Jul 2025 23:45:33 +0800 Subject: [PATCH 1/7] =?UTF-8?q?misc:=20=E6=9C=AC=E5=9C=B0=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E9=85=8D=E5=A5=97=E6=90=AD=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +- backend/.env.example | 10 +- backend/app/db/redis.py | 6 +- frontend/package-lock.json | 304 ++++++++---- frontend/package.json | 4 +- frontend/yarn.lock | 933 ++++++++++++++++--------------------- 6 files changed, 648 insertions(+), 623 deletions(-) diff --git a/README.md b/README.md index cc392e6..477aebb 100644 --- a/README.md +++ b/README.md @@ -46,13 +46,13 @@ git clone https://github.com/baizunxian/zerorunner.git # 数据库脚本 将内容复制数据库执行 需要新建数据库 zerorunner backend/script/db_init.sql -# 修改对应的数据库地址,redis 地址 +# 修改对应的数据库地址,redis 地址 , redis 密码可能是空 backend/config.py # 或者 -backend/.env # 环境文件中的地址修改 +backend/.env # 环境文件中的地址修改 -> 这里需要拷贝 .env.exmaple 文件 改为.env # 安装依赖 -pip install -r requirements +pip install -r requirements -i https://pypi.tuna.tsinghua.edu.cn/simple # 运行项目 zerorunner/backend 目录下执行 python main.py @@ -92,12 +92,16 @@ git clone https://github.com/baizunxian/zerorunner.git cd zerorunner/frontend # 安装依赖 -cnpm install +npm install + +# 会出现依赖版本错误 npm install monaco-editor@0.27.0 + # 或者 yarn insatll # 运行项目 -cnpm run dev +npm run dev + # 或者 yarn dev diff --git a/backend/.env.example b/backend/.env.example index 8d99baf..f1866f6 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,11 +1,11 @@ # redis -REDIS_URI=redis://:redis@localhost:6379/4 +REDIS_URI=redis://:@localhost:6379/4 # mysql 异步 -MYSQL_DATABASE_URI=mysql+asyncmy://root:123456@localhost:3306/zerorunner?charset=UTF8MB4 +MYSQL_DATABASE_URI=mysql+asyncmy://root:lsj123@localhost:3306/zerorunner?charset=UTF8MB4 # celery -CELERY_BROKER_URL=redis://:redis@localhost:6379/5 -CELERY_RESULT_BACKEND=redis://:redis@localhost:6379/5 -CELERY_BEAT_DB_URL=mysql+pymysql://root:123456@localhost:3306/zerorunner?charset=UTF8MB4 +CELERY_BROKER_URL=redis://:@localhost:6379/5 +CELERY_RESULT_BACKEND=redis://:@localhost:6379/5 +CELERY_BEAT_DB_URL=mysql+pymysql://root:lsj123@localhost:3306/zerorunner?charset=UTF8MB4 diff --git a/backend/app/db/redis.py b/backend/app/db/redis.py index 7291896..c77889d 100644 --- a/backend/app/db/redis.py +++ b/backend/app/db/redis.py @@ -4,13 +4,15 @@ import json import typing -from aioredis import Redis, DataError +from redis import asyncio as aioredis # 统一使用 redis 库的异步接口 +from redis.exceptions import DataError # 从 redis 库导入异常类 + from redis.typing import KeyT, FieldT, EncodableT, AnyFieldT from config import config -class MyRedis(Redis): +class MyRedis(aioredis.Redis): """ 继承Redis,并添加自己的方法 """ # 写 __init__ 的话就取消下面注释 diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6ea63f3..80793f9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { - "name": "vue-next-admin-template", - "version": "2.4.21", + "name": "fast-element-admin", + "version": "2.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "vue-next-admin-template", - "version": "2.4.21", + "name": "fast-element-admin", + "version": "2.0.1", "license": "MIT", "dependencies": { "@element-plus/icons-vue": "^2.0.10", @@ -32,14 +32,21 @@ "@typescript-eslint/parser": "^5.46.0", "@vitejs/plugin-vue": "^4.0.0", "@vue/compiler-sfc": "^3.2.45", - "eslint": "^8.29.0", + "cropperjs": "^1.5.13", + "eslint": "8.22.0", "eslint-plugin-vue": "^9.8.0", + "monaco-editor": "^0.27.0", "prettier": "^2.8.1", "sass": "^1.56.2", + "splitpanes": "^3.1.5", "typescript": "^4.9.4", "vite": "^4.0.0", + "vite-plugin-monaco-editor": "1.0.5", "vite-plugin-vue-setup-extend": "^0.4.0", - "vue-eslint-parser": "^9.1.0" + "vue-eslint-parser": "^9.1.0", + "vuedraggable": "^4.1.0", + "xterm": "^5.1.0", + "xterm-addon-fit": "^0.7.0" }, "engines": { "node": ">=16.0.0", @@ -462,27 +469,27 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.10.7", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", "dev": true, - "engines": { - "node": ">=12.22" - }, + "license": "Apache-2.0", "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" @@ -490,9 +497,11 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -1244,6 +1253,13 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/cropperjs": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.6.2.tgz", + "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1429,15 +1445,16 @@ } }, "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.22.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1447,21 +1464,21 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "espree": "^9.3.3", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.2", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -1472,7 +1489,8 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "bin": { "eslint": "bin/eslint.js" @@ -1829,6 +1847,13 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, "node_modules/get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", @@ -2064,15 +2089,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2087,16 +2103,6 @@ "node": ">=12" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2258,6 +2264,13 @@ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" }, + "node_modules/monaco-editor": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.27.0.tgz", + "integrity": "sha512-UhwP78Wb8w0ZSYoKXQNTV/0CHObp6NS3nCt51QfKE6sKyBo5PBsvuDOHoI2ooBakc6uIwByRLHVeT7+yXQe2fQ==", + "dev": true, + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2848,6 +2861,19 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, + "node_modules/splitpanes": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.2.0.tgz", + "integrity": "sha512-K+WKxWdqtKShV33gPjQl769wHxB3glypTOReCvYu/AJd38J+abHlpiF8rK6uBNPMrgw5thHZCI5JkEwsAqa9XA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antoniandre" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2997,6 +3023,13 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.0.tgz", @@ -3046,6 +3079,16 @@ } } }, + "node_modules/vite-plugin-monaco-editor": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.0.5.tgz", + "integrity": "sha512-vstgFhRMfLfkE5yGQ0cHO3UaW7+eqtOKsBEWLL6ZNmCNwgBxsaB1otWGiJEoHgc9gVoBdeKOOjgW1pACTS1gVQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "monaco-editor": "0.25.x || 0.26.x || 0.27.x" + } + }, "node_modules/vite-plugin-vue-setup-extend": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz", @@ -3139,6 +3182,26 @@ "vue": "^3.2.0" } }, + "node_modules/vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "dev": true, + "license": "MIT", + "dependencies": { + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.0.1" + } + }, + "node_modules/vuedraggable/node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", + "dev": true, + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3178,6 +3241,25 @@ "node": ">=12" } }, + "node_modules/xterm": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "deprecated": "This package is now deprecated. Move to @xterm/xterm instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/xterm-addon-fit": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz", + "integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==", + "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.", + "dev": true, + "license": "MIT", + "peerDependencies": { + "xterm": "^5.0.0" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -3407,25 +3489,25 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.10.7", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", + "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" } }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", "dev": true }, "@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, @@ -3961,6 +4043,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "cropperjs": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.6.2.tgz", + "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4104,15 +4192,14 @@ "dev": true }, "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.22.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4122,21 +4209,21 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "espree": "^9.3.3", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.2", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -4147,7 +4234,8 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { "eslint-scope": { @@ -4406,6 +4494,12 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, "get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", @@ -4578,12 +4672,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4595,12 +4683,6 @@ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==" }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4728,6 +4810,12 @@ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" }, + "monaco-editor": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.27.0.tgz", + "integrity": "sha512-UhwP78Wb8w0ZSYoKXQNTV/0CHObp6NS3nCt51QfKE6sKyBo5PBsvuDOHoI2ooBakc6uIwByRLHVeT7+yXQe2fQ==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5097,6 +5185,13 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "splitpanes": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.2.0.tgz", + "integrity": "sha512-K+WKxWdqtKShV33gPjQl769wHxB3glypTOReCvYu/AJd38J+abHlpiF8rK6uBNPMrgw5thHZCI5JkEwsAqa9XA==", + "dev": true, + "requires": {} + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5205,6 +5300,12 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true + }, "vite": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.0.tgz", @@ -5218,6 +5319,13 @@ "rollup": "^3.7.0" } }, + "vite-plugin-monaco-editor": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.0.5.tgz", + "integrity": "sha512-vstgFhRMfLfkE5yGQ0cHO3UaW7+eqtOKsBEWLL6ZNmCNwgBxsaB1otWGiJEoHgc9gVoBdeKOOjgW1pACTS1gVQ==", + "dev": true, + "requires": {} + }, "vite-plugin-vue-setup-extend": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz", @@ -5289,6 +5397,23 @@ "@vue/devtools-api": "^6.4.5" } }, + "vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "dev": true, + "requires": { + "sortablejs": "1.14.0" + }, + "dependencies": { + "sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", + "dev": true + } + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5316,6 +5441,19 @@ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, + "xterm": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "dev": true + }, + "xterm-addon-fit": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz", + "integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==", + "dev": true, + "requires": {} + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 6c5d9b8..1567790 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -36,7 +36,7 @@ "cropperjs": "^1.5.13", "eslint": "8.22.0", "eslint-plugin-vue": "^9.8.0", - "monaco-editor": "^0.34.1", + "monaco-editor": "^0.27.0", "prettier": "^2.8.1", "sass": "^1.56.2", "splitpanes": "^3.1.5", @@ -75,4 +75,4 @@ "type": "git", "url": "https://github.com/baizunxian/zerorunner.git" } -} +} \ No newline at end of file diff --git a/frontend/yarn.lock b/frontend/yarn.lock index ea6324b..7d6549c 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -3,160 +3,55 @@ "@babel/parser@^7.16.4": - version "7.20.7" - resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== "@ctrl/tinycolor@^3.4.1": version "3.5.0" - resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz#6e52b3d1c38d13130101771821e09cdd414a16bc" + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz" integrity sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg== "@element-plus/icons-vue@^2.0.10", "@element-plus/icons-vue@^2.0.6": version "2.0.10" - resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz#60808d613c3dbdad025577022be8a972739ade21" + resolved "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz" integrity sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ== -"@esbuild/android-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" - integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== - -"@esbuild/android-arm@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" - integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== - -"@esbuild/android-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" - integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== - -"@esbuild/darwin-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" - integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== - -"@esbuild/darwin-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" - integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== - -"@esbuild/freebsd-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" - integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== - -"@esbuild/freebsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" - integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== - -"@esbuild/linux-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" - integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== - -"@esbuild/linux-arm@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" - integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== - -"@esbuild/linux-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" - integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== - -"@esbuild/linux-loong64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" - integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== - -"@esbuild/linux-mips64el@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" - integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== - -"@esbuild/linux-ppc64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" - integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== - -"@esbuild/linux-riscv64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" - integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== - -"@esbuild/linux-s390x@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" - integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== - -"@esbuild/linux-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" - integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== - -"@esbuild/netbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" - integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== - -"@esbuild/openbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" - integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== - -"@esbuild/sunos-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" - integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== - -"@esbuild/win32-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" - integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== - -"@esbuild/win32-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" - integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== - -"@esbuild/win32-x64@0.16.17": - version "0.16.17" - resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" - integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== +"@esbuild/win32-x64@0.16.4": + version "0.16.4" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.4.tgz" + integrity sha512-sN/I8FMPtmtT2Yw+Dly8Ur5vQ5a/RmC8hW7jO9PtPSQUPkowxWpcUZnqOggU7VwyT3Xkj6vcXWd3V/qTXwultQ== "@eslint/eslintrc@^1.3.0": - version "1.4.1" - resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" - integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + version "1.3.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz" + integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== dependencies: ajv "^6.12.4" debug "^4.3.2" espree "^9.4.0" - globals "^13.19.0" + globals "^13.15.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@floating-ui/core@^1.0.5": - version "1.1.0" - resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-1.1.0.tgz#0a1dee4bbce87ff71602625d33f711cafd8afc08" - integrity sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ== +"@floating-ui/core@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.0.4.tgz" + integrity sha512-FPFLbg2b06MIw1dqk2SOEMAMX3xlrreGjcui5OTxfBDtaKTmh0kioOVjT8gcfl58juawL/yF+S+gnq8aUYQx/Q== "@floating-ui/dom@^1.0.1": - version "1.1.0" - resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.1.0.tgz#29fea1344fdef15b6ba270a733d20b7134fee5c2" - integrity sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A== + version "1.0.9" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.0.9.tgz" + integrity sha512-nF9P6/BoARdt+h+CdUW3td4EUVngeDONCGuzRgnZveRZiJETx63cxhinE0JaPPC2tbcdTY9IGZocS5/7ag3xRg== dependencies: - "@floating-ui/core" "^1.0.5" + "@floating-ui/core" "^1.0.4" "@humanwhocodes/config-array@^0.10.4": version "0.10.7" - resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" + resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz" integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== dependencies: "@humanwhocodes/object-schema" "^1.2.1" @@ -165,30 +60,30 @@ "@humanwhocodes/gitignore-to-minimatch@^1.0.2": version "1.0.2" - resolved "https://registry.npmmirror.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + resolved "https://registry.npmmirror.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz" integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" - resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -196,54 +91,54 @@ "@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7": version "2.11.7" - resolved "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz#a7f69e3665d3da9b115f9e71671dae1b97e13671" + resolved "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz" integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ== "@types/json-schema@^7.0.9": version "7.0.11" - resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/lodash-es@^4.17.6": +"@types/lodash-es@*", "@types/lodash-es@^4.17.6": version "4.17.6" - resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz#c2ed4c8320ffa6f11b43eb89e9eaeec65966a0a0" + resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz" integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg== dependencies: "@types/lodash" "*" "@types/lodash@*", "@types/lodash@^4.14.182": version "4.14.191" - resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== -"@types/node@^18.11.13": - version "18.11.18" - resolved "https://registry.npmmirror.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== +"@types/node@^18.11.13", "@types/node@>= 14": + version "18.11.13" + resolved "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz" + integrity sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w== "@types/nprogress@^0.2.0": version "0.2.0" - resolved "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz#86c593682d4199212a0509cc3c4d562bbbd6e45f" + resolved "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz" integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A== "@types/semver@^7.3.12": version "7.3.13" - resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== "@types/web-bluetooth@^0.0.16": version "0.0.16" - resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" + resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz" integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== "@typescript-eslint/eslint-plugin@^5.46.0": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz#deee67e399f2cb6b4608c935777110e509d8018c" - integrity sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ== + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz" + integrity sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q== dependencies: - "@typescript-eslint/scope-manager" "5.48.1" - "@typescript-eslint/type-utils" "5.48.1" - "@typescript-eslint/utils" "5.48.1" + "@typescript-eslint/scope-manager" "5.46.0" + "@typescript-eslint/type-utils" "5.46.0" + "@typescript-eslint/utils" "5.46.0" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -251,82 +146,82 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.46.0": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.48.1.tgz#d0125792dab7e232035434ab8ef0658154db2f10" - integrity sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA== +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.46.0": + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz" + integrity sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA== dependencies: - "@typescript-eslint/scope-manager" "5.48.1" - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/typescript-estree" "5.48.1" + "@typescript-eslint/scope-manager" "5.46.0" + "@typescript-eslint/types" "5.46.0" + "@typescript-eslint/typescript-estree" "5.46.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.48.1": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz#39c71e4de639f5fe08b988005beaaf6d79f9d64d" - integrity sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ== +"@typescript-eslint/scope-manager@5.46.0": + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz" + integrity sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA== dependencies: - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/visitor-keys" "5.48.1" + "@typescript-eslint/types" "5.46.0" + "@typescript-eslint/visitor-keys" "5.46.0" -"@typescript-eslint/type-utils@5.48.1": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz#5d94ac0c269a81a91ad77c03407cea2caf481412" - integrity sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ== +"@typescript-eslint/type-utils@5.46.0": + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz" + integrity sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg== dependencies: - "@typescript-eslint/typescript-estree" "5.48.1" - "@typescript-eslint/utils" "5.48.1" + "@typescript-eslint/typescript-estree" "5.46.0" + "@typescript-eslint/utils" "5.46.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.48.1": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.48.1.tgz#efd1913a9aaf67caf8a6e6779fd53e14e8587e14" - integrity sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg== +"@typescript-eslint/types@5.46.0": + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz" + integrity sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw== -"@typescript-eslint/typescript-estree@5.48.1": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz#9efa8ee2aa471c6ab62e649f6e64d8d121bc2056" - integrity sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA== +"@typescript-eslint/typescript-estree@5.46.0": + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz" + integrity sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw== dependencies: - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/visitor-keys" "5.48.1" + "@typescript-eslint/types" "5.46.0" + "@typescript-eslint/visitor-keys" "5.46.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.48.1": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.48.1.tgz#20f2f4e88e9e2a0961cbebcb47a1f0f7da7ba7f9" - integrity sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA== +"@typescript-eslint/utils@5.46.0": + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz" + integrity sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.48.1" - "@typescript-eslint/types" "5.48.1" - "@typescript-eslint/typescript-estree" "5.48.1" + "@typescript-eslint/scope-manager" "5.46.0" + "@typescript-eslint/types" "5.46.0" + "@typescript-eslint/typescript-estree" "5.46.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.48.1": - version "5.48.1" - resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz#79fd4fb9996023ef86849bf6f904f33eb6c8fccb" - integrity sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA== +"@typescript-eslint/visitor-keys@5.46.0": + version "5.46.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz" + integrity sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw== dependencies: - "@typescript-eslint/types" "5.48.1" + "@typescript-eslint/types" "5.46.0" eslint-visitor-keys "^3.3.0" "@vitejs/plugin-vue@^4.0.0": version "4.0.0" - resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz#93815beffd23db46288c787352a8ea31a0c03e5e" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz" integrity sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA== "@vue/compiler-core@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz" integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A== dependencies: "@babel/parser" "^7.16.4" @@ -336,15 +231,15 @@ "@vue/compiler-dom@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz" integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw== dependencies: "@vue/compiler-core" "3.2.45" "@vue/shared" "3.2.45" -"@vue/compiler-sfc@3.2.45", "@vue/compiler-sfc@^3.2.29", "@vue/compiler-sfc@^3.2.45": +"@vue/compiler-sfc@^3.2.29", "@vue/compiler-sfc@^3.2.45", "@vue/compiler-sfc@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz" integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q== dependencies: "@babel/parser" "^7.16.4" @@ -360,7 +255,7 @@ "@vue/compiler-ssr@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz#bd20604b6e64ea15344d5b6278c4141191c983b2" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz" integrity sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ== dependencies: "@vue/compiler-dom" "3.2.45" @@ -368,12 +263,12 @@ "@vue/devtools-api@^6.4.5": version "6.4.5" - resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz#d54e844c1adbb1e677c81c665ecef1a2b4bb8380" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz" integrity sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ== "@vue/reactivity-transform@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d" + resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz" integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ== dependencies: "@babel/parser" "^7.16.4" @@ -384,14 +279,14 @@ "@vue/reactivity@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.45.tgz#412a45b574de601be5a4a5d9a8cbd4dee4662ff0" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz" integrity sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A== dependencies: "@vue/shared" "3.2.45" "@vue/runtime-core@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz#7ad7ef9b2519d41062a30c6fa001ec43ac549c7f" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz" integrity sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A== dependencies: "@vue/reactivity" "3.2.45" @@ -399,7 +294,7 @@ "@vue/runtime-dom@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz#1a2ef6ee2ad876206fbbe2a884554bba2d0faf59" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz" integrity sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA== dependencies: "@vue/runtime-core" "3.2.45" @@ -408,7 +303,7 @@ "@vue/server-renderer@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz#ca9306a0c12b0530a1a250e44f4a0abac6b81f3f" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz" integrity sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g== dependencies: "@vue/compiler-ssr" "3.2.45" @@ -416,44 +311,44 @@ "@vue/shared@3.2.45": version "3.2.45" - resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz" integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg== "@vueuse/core@^9.1.0": - version "9.10.0" - resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.10.0.tgz#2ef6e55ca773c5b2db1e3f13b8292af96dd32214" - integrity sha512-CxMewME07qeuzuT/AOIQGv0EhhDoojniqU6pC3F8m5VC76L47UT18DcX88kWlP3I7d3qMJ4u/PD8iSRsy3bmNA== + version "9.6.0" + resolved "https://registry.npmjs.org/@vueuse/core/-/core-9.6.0.tgz" + integrity sha512-qGUcjKQXHgN+jqXEgpeZGoxdCbIDCdVPz3QiF1uyecVGbMuM63o96I1GjYx5zskKgRI0FKSNsVWM7rwrRMTf6A== dependencies: "@types/web-bluetooth" "^0.0.16" - "@vueuse/metadata" "9.10.0" - "@vueuse/shared" "9.10.0" + "@vueuse/metadata" "9.6.0" + "@vueuse/shared" "9.6.0" vue-demi "*" -"@vueuse/metadata@9.10.0": - version "9.10.0" - resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.10.0.tgz#1a5eb94ca755bd8e666505f47da7d88969cffdc7" - integrity sha512-G5VZhgTCapzU9rv0Iq2HBrVOSGzOKb+OE668NxhXNcTjUjwYxULkEhAw70FtRLMZc+hxcFAzDZlKYA0xcwNMuw== +"@vueuse/metadata@9.6.0": + version "9.6.0" + resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.6.0.tgz" + integrity sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w== -"@vueuse/shared@9.10.0": - version "9.10.0" - resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.10.0.tgz#49874a0f9955d28689b3133de660367c63dbc030" - integrity sha512-vakHJ2ZRklAzqmcVBL38RS7BxdBA4+5poG9NsSyqJxrt9kz0zX3P5CXMy0Hm6LFbZXUgvKdqAS3pUH1zX/5qTQ== +"@vueuse/shared@9.6.0": + version "9.6.0" + resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-9.6.0.tgz" + integrity sha512-/eDchxYYhkHnFyrb00t90UfjCx94kRHxc7J1GtBCqCG4HyPMX+krV9XJgVtWIsAMaxKVU4fC8NSUviG1JkwhUQ== dependencies: vue-demi "*" acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.8.0: version "8.8.1" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -463,19 +358,19 @@ ajv@^6.10.0, ajv@^6.12.4: ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -483,28 +378,28 @@ anymatch@~3.1.2: argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== async-validator@^4.2.5: version "4.2.5" - resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" + resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz" integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^1.2.1: - version "1.2.2" - resolved "https://registry.npmmirror.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1" - integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q== + version "1.2.1" + resolved "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz" + integrity sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -512,22 +407,22 @@ axios@^1.2.1: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -535,14 +430,14 @@ brace-expansion@^1.1.7: braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -550,12 +445,12 @@ call-bind@^1.0.0: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== chalk@^4.0.0: version "4.1.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -563,7 +458,7 @@ chalk@^4.0.0: "chokidar@>=3.0.0 <4.0.0": version "3.5.3" - resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -578,7 +473,7 @@ chalk@^4.0.0: clipboard@^2.0.6: version "2.0.11" - resolved "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" + resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz" integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== dependencies: good-listener "^1.2.2" @@ -587,36 +482,36 @@ clipboard@^2.0.6: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== cropperjs@^1.5.13: - version "1.5.13" - resolved "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.5.13.tgz#eb1682f01d17c70ed5244317091d745c9a249ef8" - integrity sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA== + version "1.6.2" + resolved "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.6.2.tgz" + integrity sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA== cross-spawn@^7.0.2: version "7.0.3" - resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -625,67 +520,67 @@ cross-spawn@^7.0.2: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^2.6.8: version "2.6.21" - resolved "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== dayjs@^1.11.3: version "1.11.7" - resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegate@^3.1.2: version "3.2.0" - resolved "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz" integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" echarts@^5.4.1: version "5.4.1" - resolved "https://registry.npmmirror.com/echarts/-/echarts-5.4.1.tgz#d7f65a584d78beff62568d878b16151b3381811c" + resolved "https://registry.npmjs.org/echarts/-/echarts-5.4.1.tgz" integrity sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ== dependencies: tslib "2.3.0" zrender "5.4.1" element-plus@^2.2.26: - version "2.2.28" - resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.28.tgz#855441976e82da597faecaf6ed74fc4650a970b2" - integrity sha512-BsxF7iEaBydmRfw1Tt++EO9jRBjbtJr7ZRIrnEwz4J3Cwa1IzHCNCcx3ZwcYTlJq9CYFxv94JnbNr1EbkTou3A== + version "2.2.26" + resolved "https://registry.npmjs.org/element-plus/-/element-plus-2.2.26.tgz" + integrity sha512-O/rdY5m9DkclpVg8r3GynyqCunm7MxSR142xSsjrZA77bi7bcwA3SIy6SPEDqHi5R4KqgkGYgKSp4Q4e3irbYg== dependencies: "@ctrl/tinycolor" "^3.4.1" "@element-plus/icons-vue" "^2.0.6" @@ -704,46 +599,46 @@ element-plus@^2.2.26: normalize-wheel-es "^1.2.0" esbuild@^0.16.3: - version "0.16.17" - resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" - integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== + version "0.16.4" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.16.4.tgz" + integrity sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA== optionalDependencies: - "@esbuild/android-arm" "0.16.17" - "@esbuild/android-arm64" "0.16.17" - "@esbuild/android-x64" "0.16.17" - "@esbuild/darwin-arm64" "0.16.17" - "@esbuild/darwin-x64" "0.16.17" - "@esbuild/freebsd-arm64" "0.16.17" - "@esbuild/freebsd-x64" "0.16.17" - "@esbuild/linux-arm" "0.16.17" - "@esbuild/linux-arm64" "0.16.17" - "@esbuild/linux-ia32" "0.16.17" - "@esbuild/linux-loong64" "0.16.17" - "@esbuild/linux-mips64el" "0.16.17" - "@esbuild/linux-ppc64" "0.16.17" - "@esbuild/linux-riscv64" "0.16.17" - "@esbuild/linux-s390x" "0.16.17" - "@esbuild/linux-x64" "0.16.17" - "@esbuild/netbsd-x64" "0.16.17" - "@esbuild/openbsd-x64" "0.16.17" - "@esbuild/sunos-x64" "0.16.17" - "@esbuild/win32-arm64" "0.16.17" - "@esbuild/win32-ia32" "0.16.17" - "@esbuild/win32-x64" "0.16.17" + "@esbuild/android-arm" "0.16.4" + "@esbuild/android-arm64" "0.16.4" + "@esbuild/android-x64" "0.16.4" + "@esbuild/darwin-arm64" "0.16.4" + "@esbuild/darwin-x64" "0.16.4" + "@esbuild/freebsd-arm64" "0.16.4" + "@esbuild/freebsd-x64" "0.16.4" + "@esbuild/linux-arm" "0.16.4" + "@esbuild/linux-arm64" "0.16.4" + "@esbuild/linux-ia32" "0.16.4" + "@esbuild/linux-loong64" "0.16.4" + "@esbuild/linux-mips64el" "0.16.4" + "@esbuild/linux-ppc64" "0.16.4" + "@esbuild/linux-riscv64" "0.16.4" + "@esbuild/linux-s390x" "0.16.4" + "@esbuild/linux-x64" "0.16.4" + "@esbuild/netbsd-x64" "0.16.4" + "@esbuild/openbsd-x64" "0.16.4" + "@esbuild/sunos-x64" "0.16.4" + "@esbuild/win32-arm64" "0.16.4" + "@esbuild/win32-ia32" "0.16.4" + "@esbuild/win32-x64" "0.16.4" escape-html@^1.0.3: version "1.0.3" - resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-plugin-vue@^9.8.0: version "9.8.0" - resolved "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.8.0.tgz#91de2aabbee8cdbef078ccd4f650a9ecfa445f4f" + resolved "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.8.0.tgz" integrity sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA== dependencies: eslint-utils "^3.0.0" @@ -756,7 +651,7 @@ eslint-plugin-vue@^9.8.0: eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -764,7 +659,7 @@ eslint-scope@^5.1.1: eslint-scope@^7.1.1: version "7.1.1" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" @@ -772,29 +667,24 @@ eslint-scope@^7.1.1: eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.3.0: version "3.3.0" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@8.22.0: +eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", eslint@>=5, eslint@>=6.0.0, eslint@8.22.0: version "8.22.0" - resolved "https://registry.npmmirror.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" + resolved "https://registry.npmmirror.com/eslint/-/eslint-8.22.0.tgz" integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== dependencies: "@eslint/eslintrc" "^1.3.0" @@ -837,66 +727,62 @@ eslint@8.22.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^9.3.1, espree@^9.4.0: +espree@^9.3.1, espree@^9.3.3, espree@^9.4.0: version "9.4.1" - resolved "https://registry.npmmirror.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + resolved "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz" integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -espree@^9.3.3: - version "9.5.2" - resolved "https://registry.npmmirror.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - esquery@^1.4.0: version "1.4.0" - resolved "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: version "5.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -907,38 +793,38 @@ fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.14.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -946,7 +832,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -954,17 +840,17 @@ flat-cache@^3.0.4: flatted@^3.1.0: version "3.2.7" - resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.15.0: version "1.15.2" - resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -973,50 +859,52 @@ form-data@^4.0.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== get-intrinsic@^1.0.2: version "1.1.3" - resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.3" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.1: version "6.0.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^7.1.3: version "7.2.3" - resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -1027,22 +915,15 @@ glob@^7.1.3: path-is-absolute "^1.0.0" globals@^13.15.0: - version "13.20.0" - resolved "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globals@^13.19.0: - version "13.19.0" - resolved "https://registry.npmmirror.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.18.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -1054,46 +935,46 @@ globby@^11.1.0: good-listener@^1.2.2: version "1.2.2" - resolved "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz" integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== dependencies: delegate "^3.1.2" grapheme-splitter@^1.0.4: version "1.0.4" - resolved "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has@^1.0.3: version "1.0.3" - resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.2.1" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz" + integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== immutable@^4.0.0: - version "4.2.2" - resolved "https://registry.npmmirror.com/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16" - integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og== + version "4.1.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -1101,12 +982,12 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -1114,70 +995,70 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== js-cookie@^3.0.1: version "3.0.1" - resolved "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" + resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz" integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1185,58 +1066,58 @@ levn@^0.4.1: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" -lodash-es@^4.17.21: +lodash-es@*, lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash-unified@^1.0.2: version "1.0.3" - resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894" + resolved "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz" integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.21: +lodash@*, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" magic-string@^0.25.7: version "0.25.9" - resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" memoize-one@^6.0.0: version "6.0.0" - resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -1244,90 +1125,90 @@ micromatch@^4.0.4: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" mitt@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz" integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== -monaco-editor@^0.34.1: - version "0.34.1" - resolved "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.34.1.tgz#1b75c4ad6bc4c1f9da656d740d98e0b850a22f87" - integrity sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ== +monaco-editor@^0.27.0, "monaco-editor@0.25.x || 0.26.x || 0.27.x": + version "0.27.0" + resolved "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.27.0.tgz" + integrity sha512-UhwP78Wb8w0ZSYoKXQNTV/0CHObp6NS3nCt51QfKE6sKyBo5PBsvuDOHoI2ooBakc6uIwByRLHVeT7+yXQe2fQ== ms@2.1.2: version "2.1.2" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nanoid@^3.3.4: version "3.3.4" - resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-wheel-es@^1.2.0: version "1.2.0" - resolved "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz#0fa2593d619f7245a541652619105ab076acf09e" + resolved "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz" integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw== nprogress@^0.2.0: version "0.2.0" - resolved "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" object-inspect@^1.9.0: version "1.12.2" - resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== once@^1.3.0: version "1.4.0" - resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" optionator@^0.9.1: version "0.9.1" - resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -1339,63 +1220,63 @@ optionator@^0.9.1: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pinia@^2.0.28: version "2.0.28" - resolved "https://registry.npmmirror.com/pinia/-/pinia-2.0.28.tgz#887c982d854972042d9bdfd5bc4fad3b9d6ab02a" + resolved "https://registry.npmjs.org/pinia/-/pinia-2.0.28.tgz" integrity sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw== dependencies: "@vue/devtools-api" "^6.4.5" @@ -1403,16 +1284,16 @@ pinia@^2.0.28: postcss-selector-parser@^6.0.9: version "6.0.11" - resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss@^8.1.10, postcss@^8.4.20: - version "8.4.21" - resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.1.10, postcss@^8.4.19: + version "8.4.20" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz" + integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -1420,61 +1301,61 @@ postcss@^8.1.10, postcss@^8.4.20: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier@^2.8.1: - version "2.8.2" - resolved "https://registry.npmmirror.com/prettier/-/prettier-2.8.2.tgz#c4ea1b5b454d7c4b59966db2e06ed7eec5dfd160" - integrity sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw== + version "2.8.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== punycode@^2.1.0: - version "2.2.0" - resolved "https://registry.npmmirror.com/punycode/-/punycode-2.2.0.tgz#2092cc57cd2582c38e4e7e8bb869dc8d3148bc74" - integrity sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw== + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qrcodejs2-fixes@^0.0.2: version "0.0.2" - resolved "https://registry.npmmirror.com/qrcodejs2-fixes/-/qrcodejs2-fixes-0.0.2.tgz#a2f5d7816100073d1c09088ac75a34404d025b30" + resolved "https://registry.npmjs.org/qrcodejs2-fixes/-/qrcodejs2-fixes-0.0.2.tgz" integrity sha512-wMUXYMOixAEJlLnjk5MbLiFaz0gQObWYm/TIFWB5+j7sTY5gPyr09Cx1EpcLYbsgfFdN3wHjrKAhZofTuCBGhg== qs@^6.11.0: version "6.11.0" - resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" regexpp@^3.2.0: version "3.2.0" - resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.22.1: version "1.22.1" - resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -1483,34 +1364,34 @@ resolve@^1.22.1: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rollup@^3.7.0: - version "3.9.1" - resolved "https://registry.npmmirror.com/rollup/-/rollup-3.9.1.tgz#27501d3d026418765fe379d5620d25954ff2a011" - integrity sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w== + version "3.7.3" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.7.3.tgz" + integrity sha512-7e68MQbAWCX6mI4/0lG1WHd+NdNAlVamg0Zkd+8LZ/oXojligdGnCNyHlzXqXCZObyjs5FRc3AH0b17iJESGIQ== optionalDependencies: fsevents "~2.3.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -sass@^1.56.2: - version "1.57.1" - resolved "https://registry.npmmirror.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" - integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== +sass@*, sass@^1.56.2: + version "1.56.2" + resolved "https://registry.npmjs.org/sass/-/sass-1.56.2.tgz" + integrity sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -1518,36 +1399,36 @@ sass@^1.56.2: screenfull@^6.0.2: version "6.0.2" - resolved "https://registry.npmmirror.com/screenfull/-/screenfull-6.0.2.tgz#3dbe4b8c4f8f49fb8e33caa8f69d0bca730ab238" + resolved "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz" integrity sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw== select@^1.1.2: version "1.1.2" - resolved "https://registry.npmmirror.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz" integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== semver@^7.3.5, semver@^7.3.6, semver@^7.3.7: version "7.3.8" - resolved "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -1556,151 +1437,151 @@ side-channel@^1.0.4: slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -sortablejs@1.14.0: - version "1.14.0" - resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8" - integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w== - sortablejs@^1.15.0: version "1.15.0" - resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.0.tgz#53230b8aa3502bb77a29e2005808ffdb4a5f7e2a" + resolved "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz" integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +sortablejs@1.14.0: + version "1.14.0" + resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz" + integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w== + +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" - resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map@^0.6.1: version "0.6.1" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== splitpanes@^3.1.5: - version "3.1.5" - resolved "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.1.5.tgz#de81da25681c252d131747a9cb48a17156e2b210" - integrity sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw== + version "3.2.0" + resolved "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.2.0.tgz" + integrity sha512-K+WKxWdqtKShV33gPjQl769wHxB3glypTOReCvYu/AJd38J+abHlpiF8rK6uBNPMrgw5thHZCI5JkEwsAqa9XA== strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== tiny-emitter@^2.0.0: version "2.1.0" - resolved "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" -tslib@2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - tslib@^1.8.1: version "1.14.1" - resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@^4.9.4: +typescript@^4.9.4, "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", typescript@>=4.4.4: version "4.9.4" - resolved "https://registry.npmmirror.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + version "2.4.0" + resolved "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== vite-plugin-monaco-editor@1.0.5: version "1.0.5" - resolved "https://registry.npmmirror.com/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.0.5.tgz#beb494a280ec32a8aaa3a821c130b4578dc2c031" + resolved "https://registry.npmmirror.com/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.0.5.tgz" integrity sha512-vstgFhRMfLfkE5yGQ0cHO3UaW7+eqtOKsBEWLL6ZNmCNwgBxsaB1otWGiJEoHgc9gVoBdeKOOjgW1pACTS1gVQ== vite-plugin-vue-setup-extend@^0.4.0: version "0.4.0" - resolved "https://registry.npmmirror.com/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz#ebbbe265320039b8c6a3b9fcae3b8d152ecf4a13" + resolved "https://registry.npmjs.org/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz" integrity sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ== dependencies: "@vue/compiler-sfc" "^3.2.29" magic-string "^0.25.7" -vite@^4.0.0: - version "4.0.4" - resolved "https://registry.npmmirror.com/vite/-/vite-4.0.4.tgz#4612ce0b47bbb233a887a54a4ae0c6e240a0da31" - integrity sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw== +vite@^4.0.0, vite@>=2.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/vite/-/vite-4.0.0.tgz" + integrity sha512-ynad+4kYs8Jcnn8J7SacS9vAbk7eMy0xWg6E7bAhS1s79TK+D7tVFGXVZ55S7RNLRROU1rxoKlvZ/qjaB41DGA== dependencies: esbuild "^0.16.3" - postcss "^8.4.20" + postcss "^8.4.19" resolve "^1.22.1" rollup "^3.7.0" optionalDependencies: @@ -1708,19 +1589,19 @@ vite@^4.0.0: vue-clipboard3@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz#79b026c765c0f6a5cde18a477c2dbfc7d3b9f178" + resolved "https://registry.npmjs.org/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz" integrity sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A== dependencies: clipboard "^2.0.6" vue-demi@*: version "0.13.11" - resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz" integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A== vue-eslint-parser@^9.0.1, vue-eslint-parser@^9.1.0: version "9.1.0" - resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz#0e121d1bb29bd10763c83e3cc583ee03434a9dd5" + resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz" integrity sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ== dependencies: debug "^4.3.4" @@ -1733,14 +1614,14 @@ vue-eslint-parser@^9.0.1, vue-eslint-parser@^9.1.0: vue-router@^4.1.6: version "4.1.6" - resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz#b70303737e12b4814578d21d68d21618469375a1" + resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz" integrity sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ== dependencies: "@vue/devtools-api" "^6.4.5" -vue@^3.2.45: +"vue@^2.6.14 || ^3.2.0", "vue@^3.0.0-0 || ^2.6.0", vue@^3.0.1, vue@^3.2.0, vue@^3.2.25, vue@^3.2.45, vue@3.2.45: version "3.2.45" - resolved "https://registry.npmmirror.com/vue/-/vue-3.2.45.tgz#94a116784447eb7dbd892167784619fef379b3c8" + resolved "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz" integrity sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA== dependencies: "@vue/compiler-dom" "3.2.45" @@ -1751,56 +1632,56 @@ vue@^3.2.45: vuedraggable@^4.1.0: version "4.1.0" - resolved "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz#edece68adb8a4d9e06accff9dfc9040e66852270" + resolved "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz" integrity sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww== dependencies: sortablejs "1.14.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.3: version "1.2.3" - resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wrappy@1: version "1.0.2" - resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== xml-name-validator@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xterm-addon-fit@^0.7.0: version "0.7.0" - resolved "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz#b8ade6d96e63b47443862088f6670b49fb752c6a" + resolved "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz" integrity sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ== -xterm@^5.1.0: - version "5.1.0" - resolved "https://registry.npmmirror.com/xterm/-/xterm-5.1.0.tgz#3e160d60e6801c864b55adf19171c49d2ff2b4fc" - integrity sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ== +xterm@^5.0.0, xterm@^5.1.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/xterm/-/xterm-5.3.0.tgz" + integrity sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zrender@5.4.1: version "5.4.1" - resolved "https://registry.npmmirror.com/zrender/-/zrender-5.4.1.tgz#892f864b885c71e1dc25dcb3c7a4ba42678d3f11" + resolved "https://registry.npmjs.org/zrender/-/zrender-5.4.1.tgz" integrity sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA== dependencies: tslib "2.3.0" -- Gitee From 93f28e15d5fa9b4e1ca84648c40f138267eaa1bd Mon Sep 17 00:00:00 2001 From: LineseWorld <1076452761@qq.com> Date: Wed, 30 Jul 2025 00:43:47 +0800 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=E5=88=9D=E6=AD=A5=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=89=8D=E5=90=8E=E7=AB=AF=E6=8E=88=E6=9D=83=E4=BA=A4?= =?UTF-8?q?=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env.example | 3 ++ backend/app/apis/system/user.py | 22 +++++++-- backend/app/schemas/system/user.py | 5 ++ backend/app/services/system/user.py | 7 ++- backend/app/utils/auth_tool.py | 38 ++++++++++++++++ backend/app/utils/common.py | 4 +- backend/config.py | 3 ++ frontend/src/api/useSystemApi/user.ts | 9 +++- frontend/src/types/views.d.ts | 5 ++ frontend/src/views/login/index.vue | 7 ++- frontend/src/views/system/personal/index.vue | 48 ++++++++++++++++++++ 11 files changed, 141 insertions(+), 10 deletions(-) create mode 100644 backend/app/utils/auth_tool.py diff --git a/backend/.env.example b/backend/.env.example index f1866f6..f831dd7 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -9,3 +9,6 @@ MYSQL_DATABASE_URI=mysql+asyncmy://root:lsj123@localhost:3306/zerorunner?charset CELERY_BROKER_URL=redis://:@localhost:6379/5 CELERY_RESULT_BACKEND=redis://:@localhost:6379/5 CELERY_BEAT_DB_URL=mysql+pymysql://root:lsj123@localhost:3306/zerorunner?charset=UTF8MB4 + +# 授权回调地址 +CALL_BACK_REDIRECT_URI="127.0.0.1/account/auth_callback" \ No newline at end of file diff --git a/backend/app/apis/system/user.py b/backend/app/apis/system/user.py index 64334ad..91c9730 100644 --- a/backend/app/apis/system/user.py +++ b/backend/app/apis/system/user.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- # @author: xiaobai -from fastapi import APIRouter, Request +from fastapi import APIRouter, Request,Header from app.corelibs import g from app.corelibs.codes import CodeEnum from app.corelibs.http_response import partner_success -from app.schemas.system.user import UserLogin, UserQuery, UserIn, UserResetPwd, UserDel +from app.schemas.system.user import UserLogin, UserQuery, UserIn, UserResetPwd, UserDel, AuthInfo from app.services.system.user import UserService +from app.utils.auth_tool import get_auth_url +from fastapi.responses import RedirectResponse router = APIRouter() @@ -51,7 +53,7 @@ async def get_user_info(request: Request): return partner_success(user_info) -@router.post('/userRegister', description="新增用户") +@router.post('/register', description="新增用户") async def user_register(user_info: UserIn): data = await UserService.user_register(user_info) return partner_success(data) @@ -81,3 +83,17 @@ async def authorize_token(request: Request): async def get_menu_by_token(): user_info = await UserService.get_menu_by_token(g.token) return partner_success(user_info) + + +@router.post('/auth', description="授权操作") +async def start_auth(authInfo:AuthInfo, token: str = Header(..., description="用户Token")): + await UserService.check_token(token) # 复用现有逻辑 + + auth_url = get_auth_url(app_id=authInfo.appId, state=authInfo.secret) + return { + "code": 0, + "data": { + "url": auth_url + } + } + diff --git a/backend/app/schemas/system/user.py b/backend/app/schemas/system/user.py index dccc916..d3c7935 100644 --- a/backend/app/schemas/system/user.py +++ b/backend/app/schemas/system/user.py @@ -79,3 +79,8 @@ class UserLoginRecordQuery(BaseModel): ret_code: str = Field(None, description="返回code") address: str = Field(None, description="地址") source_type: str = Field(None, description="来源") + + +class AuthInfo(BaseModel): + appId: str = Field(..., description='appId') + secret: str = Field(..., description='secret') \ No newline at end of file diff --git a/backend/app/services/system/user.py b/backend/app/services/system/user.py index 2a1b581..64e219a 100644 --- a/backend/app/services/system/user.py +++ b/backend/app/services/system/user.py @@ -9,11 +9,12 @@ from app.corelibs.codes import CodeEnum from app.corelibs.consts import TEST_USER_INFO, CACHE_DAY from app.models.system_models import User, Menu, Roles, UserLoginRecord from app.schemas.system.user import UserLogin, UserIn, UserResetPwd, UserDel, UserQuery, \ - UserLoginRecordIn, UserLoginRecordQuery + UserLoginRecordIn, UserLoginRecordQuery,AuthInfo from app.services.system.menu import MenuService from app.utils.current_user import current_user from app.utils.des import encrypt_rsa_password, decrypt_rsa_password from app.utils.serialize import default_serialize +from app.utils.auth_tool import get_auth_url,handle_callback class UserService: @@ -227,6 +228,10 @@ class UserService: result = await UserLoginRecord.create_or_update(params.dict()) return result + @staticmethod + async def auth(auth_info: AuthInfo): + auth_url = get_auth_url(app_id=auth_info.app_id, state=auth_info.app_secret) + return auth_url class LoginRecordService: @staticmethod diff --git a/backend/app/utils/auth_tool.py b/backend/app/utils/auth_tool.py new file mode 100644 index 0000000..3d32175 --- /dev/null +++ b/backend/app/utils/auth_tool.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +from config import config +import requests +import random +import string + +def random_string(length=10): + # 可选字符集:字母+数字(string.ascii_letters + string.digits) + chars = string.ascii_letters + string.digits + return ''.join(random.choices(chars, k=length)) + + +def get_auth_url(scope=None, app_id:str = "", state="custom_state", redirect_uri=config.CALL_BACK_REDIRECT_URI): + base_url = "https://qianchuan.jinritemai.com/openapi/qc/audit/oauth.html" + + params = { + "app_id": app_id, + "redirect_uri": redirect_uri, + "state": state, + "material_auth": 1, + "rid": random_string(), + } + if scope: + params["scope"] = scope + return f"{base_url}?{'&'.join(f'{k}={v}' for k, v in params.items())}" + +def handle_callback(app_id, app_secret, auth_code): + + payload = { + "app_id": app_id, + "secret": app_secret, + "grant_type": "auth_code", + "auth_code": auth_code + } + ocean_api_oauth_url = f"https://ad.oceanengine.com/open_api/oauth2/access_token/" + response = requests.post(ocean_api_oauth_url, json=payload) + tokens = response.json()['data'] + return tokens diff --git a/backend/app/utils/common.py b/backend/app/utils/common.py index b91cd04..a367fcd 100644 --- a/backend/app/utils/common.py +++ b/backend/app/utils/common.py @@ -2,6 +2,8 @@ # @author: xiaobai import uuid - def get_str_uuid(): return str(uuid.uuid4()).replace("-", "") + + + diff --git a/backend/config.py b/backend/config.py index 8cb4888..1a4f9bf 100644 --- a/backend/config.py +++ b/backend/config.py @@ -35,6 +35,9 @@ class Configs(BaseSettings): # DATABASE_URI: str = "postgresql+asyncpg://postgres:123456@localhost:5432/postgres" # PostgreSQL(异步) DATABASE_ECHO: bool = False # 是否打印数据库日志 (可看到创建表、表数据增删改查的信息) + # CALL_BACK_REDIRECT_URI="127.0.0.1/account/auth_callback" + CALL_BACK_REDIRECT_URI: str = Field(..., env="CALL_BACK_REDIRECT_URI") # 授权回调地址 + # logger LOGGER_DIR: str = "logs" # 日志文件夹名 LOGGER_NAME: str = 'zerorunner.log' # 日志文件名 (时间格式 {time:YYYY-MM-DD_HH-mm-ss}.log) diff --git a/frontend/src/api/useSystemApi/user.ts b/frontend/src/api/useSystemApi/user.ts index 0d63352..d8bc0ee 100644 --- a/frontend/src/api/useSystemApi/user.ts +++ b/frontend/src/api/useSystemApi/user.ts @@ -1,5 +1,5 @@ import request from '/@/utils/request'; - +import config from "/@/config/config" /** * 用户接口 * @method getUserList 获取用户列表 @@ -56,6 +56,13 @@ export function useUserApi() { method: 'POST', data: {} }) + }, + getAuthUrl(data: { appId: string; secret: string }) { + return request({ + url: '/user/auth', + method: 'POST', + data: { appId: data.appId, secret: data.secret } // 参数通过 body 传递 + }); } }; } diff --git a/frontend/src/types/views.d.ts b/frontend/src/types/views.d.ts index 4fbffe1..6970b86 100644 --- a/frontend/src/types/views.d.ts +++ b/frontend/src/types/views.d.ts @@ -24,9 +24,14 @@ declare type PersonalState = { email: string; tags: string; }; + authFrom: { + appId: string; + secret: string; + }; editTag: boolean; tagValue: string; showEditPage: boolean; + showAuthPage: boolean; }; /** diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue index d598332..c1bde54 100644 --- a/frontend/src/views/login/index.vue +++ b/frontend/src/views/login/index.vue @@ -24,9 +24,9 @@ - - - + @@ -54,7 +54,6 @@ import loginMain from '/@/assets/login-main.svg'; const Account = defineAsyncComponent(() => import('/@/views/login/component/account.vue')); const Mobile = defineAsyncComponent(() => import('/@/views/login/component/mobile.vue')); const Scan = defineAsyncComponent(() => import('/@/views/login/component/scan.vue')); - // 定义变量内容 const storesThemeConfig = useThemeConfig(); const {themeConfig} = storeToRefs(storesThemeConfig); diff --git a/frontend/src/views/system/personal/index.vue b/frontend/src/views/system/personal/index.vue index 8c98f71..445c8f8 100644 --- a/frontend/src/views/system/personal/index.vue +++ b/frontend/src/views/system/personal/index.vue @@ -72,6 +72,13 @@ 更新个人信息 + + + + + + 授权查询 + @@ -184,6 +191,37 @@ + + + + + + 授权信息 + + + + + + + + + + + + + + + + + + + + 授权 + + + @@ -215,6 +253,10 @@ const state = reactive({ email: '', tags: '', }, + authFrom:{ + appId:'', + secret:'', + }, editTag: false, tagValue: "", @@ -269,6 +311,12 @@ const save = async () => { ElMessage.success("更新成功!") } +const auth = async () => { + // 方案2:通过API请求获取授权URL(推荐) + let response = await useUserApi().getAuthUrl(state.authFrom); + window.location.href = response.data.url; // 后端返回{url: '...'} +} + const updateAvatar = (img: String) => { state.personalForm.avatar = img save() -- Gitee From 7c3b6202747f1a5d4cd18e4267e61e64af311ce1 Mon Sep 17 00:00:00 2001 From: LineseWorld <1076452761@qq.com> Date: Thu, 31 Jul 2025 00:21:29 +0800 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E5=AE=8C=E6=88=90=E5=90=8E=EF=BC=8Ctoken=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=AD=98=E5=82=A8=20=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=92=8Credis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++ backend/app/apis/system/user.py | 24 ++++---- backend/app/models/system_models.py | 4 +- backend/app/services/system/user.py | 59 ++++++++++++++++++-- backend/app/utils/auth_tool.py | 8 ++- backend/config.py | 4 +- backend/db_script/db_init.sql | 7 ++- frontend/src/views/home/index.vue | 8 ++- frontend/src/views/system/personal/index.vue | 1 - 9 files changed, 94 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 477aebb..1793ab2 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,12 @@ backend/config.py # 或者 backend/.env # 环境文件中的地址修改 -> 这里需要拷贝 .env.exmaple 文件 改为.env +# 创建虚拟环境 +python -m venv venv + +# 启动虚拟环境 +venv\Scripts\activate # Windows + # 安装依赖 pip install -r requirements -i https://pypi.tuna.tsinghua.edu.cn/simple diff --git a/backend/app/apis/system/user.py b/backend/app/apis/system/user.py index 91c9730..050e423 100644 --- a/backend/app/apis/system/user.py +++ b/backend/app/apis/system/user.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- # @author: xiaobai -from fastapi import APIRouter, Request,Header - +from fastapi import APIRouter, Request, Header +from app.corelibs.logger import logger from app.corelibs import g from app.corelibs.codes import CodeEnum from app.corelibs.http_response import partner_success from app.schemas.system.user import UserLogin, UserQuery, UserIn, UserResetPwd, UserDel, AuthInfo from app.services.system.user import UserService -from app.utils.auth_tool import get_auth_url +from app.utils.auth_tool import get_auth_url, handle_callback from fastapi.responses import RedirectResponse router = APIRouter() @@ -86,14 +86,14 @@ async def get_menu_by_token(): @router.post('/auth', description="授权操作") -async def start_auth(authInfo:AuthInfo, token: str = Header(..., description="用户Token")): - await UserService.check_token(token) # 复用现有逻辑 +async def start_auth(auth_info: AuthInfo, token: str = Header(...)): + auth_data = await UserService.start_auth(auth_info, token) + return partner_success({"url": auth_data}) - auth_url = get_auth_url(app_id=authInfo.appId, state=authInfo.secret) - return { - "code": 0, - "data": { - "url": auth_url - } - } +@router.get("/auth_callback", response_model=None) +async def oauth_callback(app_id: str, auth_code: str, state: str): + handle_success = await UserService.auth_handle_callback(app_id, auth_code, state) + # 重定向到应用首页 + frontend_home_url = f"http://localhost:8893/#/home?auth_success={handle_success}" + return RedirectResponse(url=frontend_home_url) diff --git a/backend/app/models/system_models.py b/backend/app/models/system_models.py index 93f1108..bb0530a 100644 --- a/backend/app/models/system_models.py +++ b/backend/app/models/system_models.py @@ -26,6 +26,9 @@ class User(Base): remarks = Column(String(255), nullable=False, comment='用户描述') avatar = Column(Text, nullable=False, comment='头像') tags = Column(JSON, nullable=False, comment='标签') + auth_token = Column(Text, nullable=True, comment='抖音授权token信息') + app_id = Column(Text, nullable=True, comment='抖音后台appId') + secret = Column(Text, nullable=True, comment='抖音后台secrets') @classmethod async def get_list(cls, params: UserQuery): @@ -344,4 +347,3 @@ class FileInfo(Base): original_name = Column(String(255), nullable=True, comment='原名称') content_type = Column(String(255), nullable=True, comment='文件类型') file_size = Column(String(255), nullable=True, comment='文件大小') - diff --git a/backend/app/services/system/user.py b/backend/app/services/system/user.py index 64e219a..4a56e72 100644 --- a/backend/app/services/system/user.py +++ b/backend/app/services/system/user.py @@ -2,19 +2,20 @@ import typing from datetime import datetime import traceback import uuid - +import base64 from app.corelibs import g from loguru import logger from app.corelibs.codes import CodeEnum from app.corelibs.consts import TEST_USER_INFO, CACHE_DAY from app.models.system_models import User, Menu, Roles, UserLoginRecord from app.schemas.system.user import UserLogin, UserIn, UserResetPwd, UserDel, UserQuery, \ - UserLoginRecordIn, UserLoginRecordQuery,AuthInfo + UserLoginRecordIn, UserLoginRecordQuery, AuthInfo from app.services.system.menu import MenuService from app.utils.current_user import current_user from app.utils.des import encrypt_rsa_password, decrypt_rsa_password from app.utils.serialize import default_serialize -from app.utils.auth_tool import get_auth_url,handle_callback +from app.utils.auth_tool import get_auth_url, handle_callback +import json class UserService: @@ -47,7 +48,8 @@ class UserService: "login_time": login_time, "username": user_info["username"], "roles": roles if roles else [], - "tags": tags if tags else [] + "tags": tags if tags else [], + "auth_token": user_info["auth_token"] } await g.redis.set(TEST_USER_INFO.format(token), token_user_info, CACHE_DAY) logger.info('用户 [{}] 登录了系统'.format(user_info["username"])) @@ -68,6 +70,7 @@ class UserService: await UserService.user_login_record(params) except Exception as err: logger.error(f"登录日志记录错误\n{err}") + logger.info(f"token_user_info {token_user_info}") return token_user_info @staticmethod @@ -194,7 +197,7 @@ class UserService: "nickname": user_info.nickname, "roles": user_info.roles, "tags": user_info.tags, - "login_time": token_user_info.get("login_time", None) + "login_time": token_user_info.get("login_time", None), } @staticmethod @@ -233,6 +236,52 @@ class UserService: auth_url = get_auth_url(app_id=auth_info.app_id, state=auth_info.app_secret) return auth_url + @staticmethod + async def start_auth(authInfo: AuthInfo, token: str): + param = { + "secret": authInfo.secret, + "token": token, + } + state = json.dumps(param) + state_json = json.dumps(param) + # 2. Base64 编码(URL 安全版) + state_encoded = base64.urlsafe_b64encode(state_json.encode('utf-8')).decode('utf-8').rstrip("=") + return get_auth_url(app_id=authInfo.appId, state=state_encoded) + + @staticmethod + async def auth_handle_callback(app_id: str, auth_code: str, state: str) -> int: + # 1. Base64 解码(自动处理 URL 安全字符) + padding = len(state) % 4 + if padding: + state += "=" * (4 - padding) # 补足等号 + state_decoded = base64.urlsafe_b64decode(state).decode('utf-8') + + # 2. 解析 JSON + state_dict = json.loads(state_decoded) + + secret = state_dict.get('secret') + token = state_dict.get('token') + auth_token = handle_callback(app_id, secret, auth_code) + + # 授权完成后 auth_token 数据存到 缓存中 + user_info = await g.redis.get(TEST_USER_INFO.format(token)) + user_info["app_id"] = app_id + user_info["secret"] = secret + user_info["auth_token"] = auth_token + await g.redis.set(TEST_USER_INFO.format(token), user_info, CACHE_DAY) + + # 授权完成后 存储 数据到user表中 + param = { + "id": user_info["id"], + "auth_token": json.dumps(auth_token), + "app_id": app_id, + "secret": secret + } + await User.create_or_update(param) + + return 1 + + class LoginRecordService: @staticmethod async def list(params: UserLoginRecordQuery) -> typing.Dict[typing.Text, typing.Any]: diff --git a/backend/app/utils/auth_tool.py b/backend/app/utils/auth_tool.py index 3d32175..0c4a2e7 100644 --- a/backend/app/utils/auth_tool.py +++ b/backend/app/utils/auth_tool.py @@ -4,13 +4,14 @@ import requests import random import string + def random_string(length=10): # 可选字符集:字母+数字(string.ascii_letters + string.digits) chars = string.ascii_letters + string.digits return ''.join(random.choices(chars, k=length)) -def get_auth_url(scope=None, app_id:str = "", state="custom_state", redirect_uri=config.CALL_BACK_REDIRECT_URI): +def get_auth_url(scope=None, app_id: str = "", state="custom_state", redirect_uri=config.CALL_BACK_REDIRECT_URI): base_url = "https://qianchuan.jinritemai.com/openapi/qc/audit/oauth.html" params = { @@ -22,10 +23,11 @@ def get_auth_url(scope=None, app_id:str = "", state="custom_state", redirect_uri } if scope: params["scope"] = scope - return f"{base_url}?{'&'.join(f'{k}={v}' for k, v in params.items())}" + url = f"{base_url}?{'&'.join(f'{k}={v}' for k, v in params.items())}" + return url # 返回结构化数据 -def handle_callback(app_id, app_secret, auth_code): +def handle_callback(app_id, app_secret, auth_code): payload = { "app_id": app_id, "secret": app_secret, diff --git a/backend/config.py b/backend/config.py index 1a4f9bf..8943db5 100644 --- a/backend/config.py +++ b/backend/config.py @@ -22,14 +22,14 @@ class Configs(BaseSettings): STATIC_DIR: str = 'static' # 静态文件目录 GLOBAL_ENCODING: str = 'utf8' # 全局编码 CORS_ORIGINS: typing.List[typing.Any] = ["*"] # 跨域请求 - WHITE_ROUTER = ["/api/user/login"] # 路由白名单,不需要鉴权 + WHITE_ROUTER = ["/api/user/login", "/api/user/auth_callback"] # 路由白名单,不需要鉴权 SECRET_KEY: str = "kPBDjVk0o3Y1wLxdODxBpjwEjo7-Euegg4kdnzFIRjc" # 密钥(每次重启服务密钥都会改变, token解密失败导致过期, 可设置为常量) ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 1 # token过期时间: 60 minutes * 24 hours * 1 days = 1 days # redis REDIS_URI: str = Field(..., env="REDIS_URI") # redis - + # DATABASE_URI: str = "sqlite+aiosqlite:///./sql_app.db?check_same_thread=False" # Sqlite(异步) DATABASE_URI: str = Field(..., env="MYSQL_DATABASE_URI") # MySQL(异步) # DATABASE_URI: str = "postgresql+asyncpg://postgres:123456@localhost:5432/postgres" # PostgreSQL(异步) diff --git a/backend/db_script/db_init.sql b/backend/db_script/db_init.sql index eac43f4..8015439 100644 --- a/backend/db_script/db_init.sql +++ b/backend/db_script/db_init.sql @@ -387,6 +387,9 @@ CREATE TABLE `user` ( `avatar` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '头像数据', `tags` json DEFAULT NULL COMMENT '用户标签', `trace_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'trace_id', + `auth_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '抖音授权token信息', + `app_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '抖音后台appId', + `secret` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '抖音后台secrets', PRIMARY KEY (`id`) USING BTREE, INDEX `ix_user_email`(`email`) USING BTREE, INDEX `ix_user_password`(`password`) USING BTREE, @@ -397,8 +400,8 @@ CREATE TABLE `user` ( -- ---------------------------- -- Records of user -- ---------------------------- -INSERT INTO `user` VALUES (NULL, NULL, 1, 0, '系统', '', NULL, '[1]', '系统', 1, NULL, NULL, 10, NULL, NULL, NULL, NULL); -INSERT INTO `user` VALUES ('2022-03-09 16:03:43', '2023-02-23 14:36:44', 1, 1, 'admin', 'o1qooQ2aDAxzq2r7YAxbk7mNHvyDQ0iyFngiSpp6rkBUwzpCqYwyd4hpXKk8x4ZUKKEKUbCIZSS+1lEnHhOH67COnHszbOq/vWdVGHZOXehYv02yj3jO/q7/Moh9KoLWHSpBJN8MfqdxvdmvowfWzeQz2DbD81BlyKXTSwyYeek=', '12546@qq.com', '[1]', 'admin', 1, 7, 7, 10, '富在术数,不在劳身;利在势居,不在力耕。', 'data:image/jpeg;base64,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', '[\"测试\", \"123\"]', NULL); +INSERT INTO `user` VALUES (NULL, NULL, 1, 0, '系统', '', NULL, '[1]', '系统', 1, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `user` VALUES ('2022-03-09 16:03:43', '2023-02-23 14:36:44', 1, 1, 'admin', 'o1qooQ2aDAxzq2r7YAxbk7mNHvyDQ0iyFngiSpp6rkBUwzpCqYwyd4hpXKk8x4ZUKKEKUbCIZSS+1lEnHhOH67COnHszbOq/vWdVGHZOXehYv02yj3jO/q7/Moh9KoLWHSpBJN8MfqdxvdmvowfWzeQz2DbD81BlyKXTSwyYeek=', '12546@qq.com', '[1]', 'admin', 1, 7, 7, 10, '富在术数,不在劳身;利在势居,不在力耕。', 'data:image/jpeg;base64,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', '[\"测试\", \"123\"]', NULL,"","",""); -- ---------------------------- -- Table structure for user_login_record diff --git a/frontend/src/views/home/index.vue b/frontend/src/views/home/index.vue index 4d8bad9..4bf7379 100644 --- a/frontend/src/views/home/index.vue +++ b/frontend/src/views/home/index.vue @@ -72,7 +72,8 @@ import * as echarts from 'echarts'; import {storeToRefs} from 'pinia'; import {useThemeConfig} from '/@/stores/themeConfig'; import {useTagsViewRoutes} from '/@/stores/tagsViewRoutes'; - +import { useRoute } from 'vue-router' +import { ElMessage } from 'element-plus' // 定义变量内容 const homeLineRef = ref(); const homePieRef = ref(); @@ -81,6 +82,7 @@ const storesTagsViewRoutes = useTagsViewRoutes(); const storesThemeConfig = useThemeConfig(); const {themeConfig} = storeToRefs(storesThemeConfig); const {isTagsViewCurrenFull} = storeToRefs(storesTagsViewRoutes); + const state = reactive({ global: { homeChartOne: null, @@ -505,6 +507,10 @@ const initEchartsResize = () => { // 页面加载时 onMounted(() => { initEchartsResize(); + const route = useRoute() + if (route.query.auth_success === '1') { + ElMessage.success('授权成功!') + } }); // 由于页面缓存原因,keep-alive onActivated(() => { diff --git a/frontend/src/views/system/personal/index.vue b/frontend/src/views/system/personal/index.vue index 445c8f8..db63d18 100644 --- a/frontend/src/views/system/personal/index.vue +++ b/frontend/src/views/system/personal/index.vue @@ -312,7 +312,6 @@ const save = async () => { } const auth = async () => { - // 方案2:通过API请求获取授权URL(推荐) let response = await useUserApi().getAuthUrl(state.authFrom); window.location.href = response.data.url; // 后端返回{url: '...'} } -- Gitee From 94dcb9a5172db0c471520509546846d72a7786ab Mon Sep 17 00:00:00 2001 From: LineseWorld <1076452761@qq.com> Date: Thu, 31 Jul 2025 21:28:25 +0800 Subject: [PATCH 4/7] =?UTF-8?q?misc:=20=E8=BF=81=E7=A7=BB=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=B9=BF=E5=91=8A=E4=B8=BB=E5=88=97=E8=A1=A8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/apis/api_router.py | 2 + backend/app/apis/ocean/__init__.py | 2 + backend/app/apis/ocean/account.py | 69 ++++++++ backend/app/schemas/base.py | 7 +- backend/app/schemas/ocean/__init__.py | 0 backend/app/schemas/ocean/account.py | 12 ++ backend/app/schemas/system/user.py | 3 +- backend/app/services/ocean/__init__.py | 0 backend/app/services/ocean/account.py | 43 +++++ backend/app/services/ocean/token_manager.py | 94 +++++++++++ backend/app/utils/request_handler.py | 165 ++++++++++++++++++++ 11 files changed, 394 insertions(+), 3 deletions(-) create mode 100644 backend/app/apis/ocean/__init__.py create mode 100644 backend/app/apis/ocean/account.py create mode 100644 backend/app/schemas/ocean/__init__.py create mode 100644 backend/app/schemas/ocean/account.py create mode 100644 backend/app/services/ocean/__init__.py create mode 100644 backend/app/services/ocean/account.py create mode 100644 backend/app/services/ocean/token_manager.py create mode 100644 backend/app/utils/request_handler.py diff --git a/backend/app/apis/api_router.py b/backend/app/apis/api_router.py index 88b6d54..61dac55 100644 --- a/backend/app/apis/api_router.py +++ b/backend/app/apis/api_router.py @@ -4,6 +4,7 @@ from fastapi import APIRouter from app.apis.system import user, menu, roles, lookup, id_center, file +from app.apis.ocean import account app_router = APIRouter() @@ -14,3 +15,4 @@ app_router.include_router(roles.router, prefix="/roles", tags=["roles"]) app_router.include_router(lookup.router, prefix="/lookup", tags=["lookup"]) app_router.include_router(id_center.router, prefix="/idCenter", tags=["idCenter"]) app_router.include_router(file.router, prefix="/file", tags=["file"]) +app_router.include_router(account.router, prefix="/account", tags=["account"]) diff --git a/backend/app/apis/ocean/__init__.py b/backend/app/apis/ocean/__init__.py new file mode 100644 index 0000000..fb0deb2 --- /dev/null +++ b/backend/app/apis/ocean/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# @author: xiaobai diff --git a/backend/app/apis/ocean/account.py b/backend/app/apis/ocean/account.py new file mode 100644 index 0000000..09a0dee --- /dev/null +++ b/backend/app/apis/ocean/account.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# @author: xiaobai + +from fastapi import APIRouter, Request, Header +from app.corelibs.logger import logger +from app.corelibs import g +from app.corelibs.codes import CodeEnum +from app.corelibs.http_response import partner_success +from app.schemas.system.user import UserLogin, UserQuery, UserIn, UserResetPwd, UserDel, AuthInfo +from app.services.system.user import UserService +from app.utils.auth_tool import get_auth_url, handle_callback +from fastapi.responses import RedirectResponse +from app.services.ocean.account import AccountService +from app.schemas.ocean.account import GetAdvertiserListParam + +router = APIRouter() + + +# @router.post("/auth") +# async def auth(auth_info: AuthInfo): +# access_token = token_manager.get_access_token(auth_info.app_id) +# +# if not access_token: +# logger.info("auth access token is empty, initiating OAuth flow") +# +# # 1. 生成授权URL +# # 实际上 secret 要加密一下 +# auth_url = get_auth_url(app_id=auth_info.app_id, state=auth_info.app_secret) +# logger.info(f"need auth, url:{auth_url}") +# # 2. 执行重定向 +# return RedirectResponse( +# url=auth_url, +# status_code=status.HTTP_302_FOUND # 或 status.HTTP_307_TEMPORARY_REDIRECT +# ) +# else: +# +# if not engine_manager.is_exist_engine(app_id=auth_info.app_id): +# account = AccountInfo() +# account.app_id = auth_info.app_id +# account.app_secret = auth_info.app_secret +# engine = OceanEngine(account) +# engine.module_init() +# engine_manager.set_engine(auth_info.app_id, engine) +# +# return RedirectResponse(url="/welcome") +# +# +# @router.get("/auth_callback", response_model=None) +# async def oauth_callback(app_id: str, auth_code: str, state: str): +# logger.info(f"auth_callback handle auth code: {auth_code}") +# +# token = handle_callback(app_id, state, auth_code) +# app_id = app_id +# token_manager.update_tokens(token, app_id) +# +# logger.info(f"handle_auth_code success token: {token}") +# # 重定向到应用首页 +# return RedirectResponse(url="/welcome") + + +@router.post("/advertiser/list/") +async def get_advertiser_list(param: GetAdvertiserListParam, request: Request): + """ + 获取广告主数据 + :return: + """ + token = request.headers.get("token", None) + data = await AccountService.get_advertiser_list(param, token) + return data diff --git a/backend/app/schemas/base.py b/backend/app/schemas/base.py index 9ddc892..36da6a5 100644 --- a/backend/app/schemas/base.py +++ b/backend/app/schemas/base.py @@ -1,6 +1,11 @@ # -*- coding: utf-8 -*- # @author: xiaobai -from pydantic import BaseModel, validator +from pydantic import BaseModel, validator, Field + + +class PageParam(BaseModel): + page: int = Field(default=1, description='页码') + page_size: int = Field(default=100, description='每页数量') class BaseSchema(BaseModel): diff --git a/backend/app/schemas/ocean/__init__.py b/backend/app/schemas/ocean/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/schemas/ocean/account.py b/backend/app/schemas/ocean/account.py new file mode 100644 index 0000000..0b11022 --- /dev/null +++ b/backend/app/schemas/ocean/account.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +import typing + +from pydantic import BaseModel, Field +from app.schemas.base import BaseSchema, PageParam +from app.utils.des import decrypt_rsa_password + + +class GetAdvertiserListParam(BaseModel): + cc_account_id: str = Field(..., description='纵横账户ID,默认为实例的enterprise_id 企业号id') + page: PageParam = Field(..., description='查询翻页') + account_source: str = Field(default="DEFAULT_ACCOUNT_SOURCE", description='账户来源') diff --git a/backend/app/schemas/system/user.py b/backend/app/schemas/system/user.py index d3c7935..de40209 100644 --- a/backend/app/schemas/system/user.py +++ b/backend/app/schemas/system/user.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -# @author: xiaobai import typing from pydantic import BaseModel, Field @@ -83,4 +82,4 @@ class UserLoginRecordQuery(BaseModel): class AuthInfo(BaseModel): appId: str = Field(..., description='appId') - secret: str = Field(..., description='secret') \ No newline at end of file + secret: str = Field(..., description='secret') diff --git a/backend/app/services/ocean/__init__.py b/backend/app/services/ocean/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/services/ocean/account.py b/backend/app/services/ocean/account.py new file mode 100644 index 0000000..ef3f805 --- /dev/null +++ b/backend/app/services/ocean/account.py @@ -0,0 +1,43 @@ +from app.schemas.ocean.account import GetAdvertiserListParam +from app.utils.current_user import current_user +from loguru import logger +import requests +from app.services.ocean.token_manager import TokenManager + + +# 反序列化函数 + +class AccountService: + @staticmethod + async def get_advertiser_list(param: GetAdvertiserListParam, token: str): + """ + 获取纵横工作台下的广告主列表 + https://open.oceanengine.com/labels/12/docs/1796368918556803?origin=left_nav + :return: 广告主列表 + """ + current_user_info = await current_user(token) + if not current_user_info: + return [] + auth_token_info = current_user_info.get('auth_token') + + # 这里封装一个 token 检测,自动刷新 + if not auth_token_info: + logger.warning(f"未授权") + return [] + + access_token = TokenManager.get_access_token(token) + + headers = { + "Content-Type": "application/json", + "Access-Token": access_token + } + + params = { + "cc_account_id": param.cc_account_id, + "account_source": param.account_source, + "page": param.page.page, + "page_size": param.page.page_size + } + url = "https://ad.oceanengine.com/open_api/2/customer_center/advertiser/list/" + response = requests.get(url, headers=headers, params=params) + return response diff --git a/backend/app/services/ocean/token_manager.py b/backend/app/services/ocean/token_manager.py new file mode 100644 index 0000000..7ad819a --- /dev/null +++ b/backend/app/services/ocean/token_manager.py @@ -0,0 +1,94 @@ +import time + +import requests +from typing import Dict, Optional +from loguru import logger +from app.utils.current_user import current_user +from app.corelibs import g +from app.corelibs.consts import TEST_USER_INFO, CACHE_DAY +from app.models.system_models import User +import json + +token_refresh_buffer_time = 300 # 提前5分钟刷新避免过期 + + +class TokenManager: + @staticmethod + async def update_tokens(self, token_response: Dict[str, str], token: str): + """更新并持久化令牌数据""" + # 计算精确过期时间点 + logger.info(f"update token data:{token_response}") + current_time = time.time() + token_response['access_token_expires_at'] = current_time + token_response['expires_in'] + token_response['refresh_token_expires_at'] = current_time + token_response['refresh_token_expires_in'] + + user_info = await g.redis.get(TEST_USER_INFO.format(token)) + user_info["auth_token"] = token_response + await g.redis.set(TEST_USER_INFO.format(token), user_info, CACHE_DAY) + + # 授权完成后 存储 数据到user表中 + param = { + "id": user_info["id"], + "auth_token": json.dumps(token_response), + } + await User.create_or_update(param) + + logger.info(f"save token: {token_response} success") + + @staticmethod + def is_token_expired(token_data: Dict, token_type: str = "access") -> bool: + """检测令牌是否过期""" + key = f"{token_type}_token_expires_at" + return time.time() >= (token_data.get(key, 0) - token_refresh_buffer_time) + + @staticmethod + async def refresh_token(token_data: Dict, token=None) -> Dict: + """使用刷新令牌获取新访问令牌""" + current_user_info = await current_user(token) + app_id = current_user_info.get('app_id') + secret = current_user_info.get('secret') + payload = { + "app_id": app_id, + "secret": secret, + "grant_type": "refresh_token", + "refresh_token": token_data["refresh_token"] + } + logger.info(f"need refresh token") + refresh_ulr = "https://ad.oceanengine.com/open_api/oauth2/refresh_token/" + response = requests.post(refresh_ulr, json=payload) + if response.status_code != 200: + logger.error(f"Token refresh failed: {response.text}") + return {} + + logger.info(f"need refresh token") + new_tokens = response.json()['data'] + + await TokenManager.update_tokens(new_tokens, token) + logger.info(f"refresh token finish") + return new_tokens + + @staticmethod + async def get_access_token(token: str) -> str | None: + """获取有效访问令牌(自动刷新过期令牌)""" + current_user_info = await current_user(token) + if not current_user_info: + logger.error(f"用户信息已过期") + return None + + token_data = current_user_info.get('auth_token') + + if not token_data: + logger.error(f"token data is null") + return None + + # 检查并刷新过期令牌 + if TokenManager.is_token_expired(token_data, token_type="access"): + if TokenManager.is_token_expired(token_data, token_type="refresh"): + logger.error(f"Refresh token expired - reauthentication required") + # 返回空就认为是过期要重新授权 + return None + token_data = TokenManager.refresh_token(token_data, token) + if not token_data: + return None + + return token_data['access_token'] diff --git a/backend/app/utils/request_handler.py b/backend/app/utils/request_handler.py new file mode 100644 index 0000000..9504412 --- /dev/null +++ b/backend/app/utils/request_handler.py @@ -0,0 +1,165 @@ +import requests +from app.core.logger import logger + +from typing import Dict, Any, Optional, TypeVar, Generic +from dataclasses import dataclass +import json +from requests.models import Response +from requests.exceptions import RequestException + +T = TypeVar('T') # 泛型类型 + + +@dataclass +class APIResponse(Generic[T]): + """标准API响应封装""" + success: bool + code: int + message: str + data: Optional[T] = None + request_id: Optional[str] = None + raw_response: Optional[Response] = None + + +class APIRequest: + def __init__(self, token_manager): + self.token_manager = token_manager + self.headers = { + "Content-Type": "application/json", + "Access-Token": None + } + + def _update_token(self): + """更新请求头中的Access-Token""" + self.headers["Access-Token"] = self.token_manager.get_access_token() + + def _handle_response(self, response: Response) -> APIResponse[Dict[str, Any]]: + """ + 统一处理API响应 + :param response: requests.Response对象 + :return: 标准化的APIResponse + """ + try: + response.raise_for_status() + result = response.json() + + # 解析巨量引擎API标准格式 + return APIResponse( + success=result.get("code", -1) == 0, + code=result.get("code", response.status_code), + message=result.get("message", "Success"), + data=result.get("data"), + request_id=result.get("request_id"), + raw_response=response + ) + + except json.JSONDecodeError: + logger.error(f"JSON解析失败 - URL: {response.url} Status: {response.status_code}") + return APIResponse( + success=False, + code=response.status_code, + message="Invalid JSON response", + raw_response=response + ) + + except RequestException as e: + logger.error(f"请求异常 - {str(e)}") + return APIResponse( + success=False, + code=getattr(e.response, 'status_code', 500), + message=str(e), + raw_response=getattr(e, 'response', None) + ) + + def get(self, url: str, params: Optional[Dict] = None) -> APIResponse: + """封装GET请求""" + self._update_token() + + try: + logger.debug(f"GET >>> {url} Body:\n {params}") + response = requests.get(url, headers=self.headers, params=params) + resp_data = response.json() + logger.debug( + f"GET <<< {url} | Code: {response.status_code} | Res: {resp_data.get('code')} | Data: \n{resp_data.get('data', {})}") + return self._handle_response(response) + + except Exception as e: + logger.error(f"GET请求异常 - {url}") + return APIResponse( + success=False, + code=500, + message=f"Unexpected error: {str(e)}" + ) + + def post(self, url: str, data: Optional[Dict] = None) -> APIResponse: + """封装POST请求""" + self._update_token() + + try: + logger.debug(f"POST >>> {url} Body:\n {json.dumps(data, indent=2, ensure_ascii=False)}") + response = requests.post(url, headers=self.headers, json=data) + resp_data = response.json() + logger.debug( + f"POST <<< {url} | Code: {response.status_code} | Res: {resp_data.get('code')} | Data: \n{resp_data.get('data', {})}") + return self._handle_response(response) + + except Exception as e: + logger.error(f"POST请求异常 - {url}") + return APIResponse( + success=False, + code=500, + message=f"Unexpected error: {str(e)}" + ) + + def put(self, url: str, params: Optional[Dict] = None) -> APIResponse: + """封装PUT请求""" + self._update_token() + + try: + logger.debug(f"PUT >>> {url} \n {json.dumps(params, indent=2, ensure_ascii=False)}") + response = requests.put(url, headers=self.headers, json=params) + resp_data = response.json() + logger.debug( + f"PUT <<< {url} | Code: {response.status_code} | Res: {resp_data.get('code')} | Data: \n{resp_data.get('data', {})}") + return self._handle_response(response) + + except Exception as e: + logger.error(f"PUT请求异常 - {url}") + return APIResponse( + success=False, + code=500, + message=f"Unexpected error: {str(e)}" + ) + + def get_direct(self, url: str, params: Optional[Dict] = None, api_base_url: str = API_BASE_URL): + """封装GET请求""" + self._update_token() + + try: + logger.debug(f"GET >>> {url} Body:\n {params}") + response = requests.get(url, headers=self.headers, params=params) + resp_data = response.json() + logger.debug( + f"GET <<< {url} | Code: {response.status_code} | Res: {resp_data.get('code')} | Data: \n{resp_data.get('data', {})}") + return resp_data + + except Exception as e: + logger.error(f"GET请求异常 - {url}") + return None + + def post_direct(self, url: str, data: Optional[Dict] = None, api_base_url: str = API_BASE_URL): + """封装POST请求""" + self._update_token() + + try: + logger.info(f"POST >>> {url} Body:\n {json.dumps(data, indent=2, ensure_ascii=False)}") + response = requests.post(url, headers=self.headers, json=data) + logger.info(f"POST >>> {url} Response:\n {response}") + resp_data = response.json() + logger.debug( + f"POST <<< {url} | Code: {response.status_code} | Res: {resp_data.get('code')} | Data: \n{resp_data.get('data', {})}") + return resp_data + + except Exception as e: + logger.error(f"POST请求异常 - {url}") + return None -- Gitee From 0c5e2375b12d0a7d2bf4ae3b35d58ccd96e81724 Mon Sep 17 00:00:00 2001 From: LineseWorld <1076452761@qq.com> Date: Sat, 2 Aug 2025 01:01:18 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E5=90=8E=E7=9A=84=E6=8E=A5=E5=8F=A3=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=EF=BC=8C=E5=B0=81=E8=A3=85=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/apis/ocean/account.py | 118 ++++++++++--------- backend/app/apis/ocean/base_controller.py | 70 +++++++++++ backend/app/exceptions/exceptions.py | 9 ++ backend/app/schemas/base.py | 16 ++- backend/app/schemas/ocean/account.py | 15 +++ backend/app/services/ocean/account.py | 70 +++++------ backend/app/services/ocean/base_service.py | 57 +++++++++ backend/app/services/ocean/token_manager.py | 6 +- backend/app/services/system/user.py | 4 +- frontend/src/types/views.d.ts | 34 ++++++ frontend/src/views/system/personal/index.vue | 116 +++++++++++++++--- 11 files changed, 404 insertions(+), 111 deletions(-) create mode 100644 backend/app/apis/ocean/base_controller.py create mode 100644 backend/app/services/ocean/base_service.py diff --git a/backend/app/apis/ocean/account.py b/backend/app/apis/ocean/account.py index 09a0dee..1396085 100644 --- a/backend/app/apis/ocean/account.py +++ b/backend/app/apis/ocean/account.py @@ -1,69 +1,79 @@ # -*- coding: utf-8 -*- -# @author: xiaobai +from typing import Dict -from fastapi import APIRouter, Request, Header +from fastapi import APIRouter, Request from app.corelibs.logger import logger -from app.corelibs import g -from app.corelibs.codes import CodeEnum -from app.corelibs.http_response import partner_success -from app.schemas.system.user import UserLogin, UserQuery, UserIn, UserResetPwd, UserDel, AuthInfo -from app.services.system.user import UserService -from app.utils.auth_tool import get_auth_url, handle_callback -from fastapi.responses import RedirectResponse from app.services.ocean.account import AccountService from app.schemas.ocean.account import GetAdvertiserListParam +import math +from app.apis.ocean.base_controller import BaseController router = APIRouter() -# @router.post("/auth") -# async def auth(auth_info: AuthInfo): -# access_token = token_manager.get_access_token(auth_info.app_id) -# -# if not access_token: -# logger.info("auth access token is empty, initiating OAuth flow") -# -# # 1. 生成授权URL -# # 实际上 secret 要加密一下 -# auth_url = get_auth_url(app_id=auth_info.app_id, state=auth_info.app_secret) -# logger.info(f"need auth, url:{auth_url}") -# # 2. 执行重定向 -# return RedirectResponse( -# url=auth_url, -# status_code=status.HTTP_302_FOUND # 或 status.HTTP_307_TEMPORARY_REDIRECT -# ) -# else: -# -# if not engine_manager.is_exist_engine(app_id=auth_info.app_id): -# account = AccountInfo() -# account.app_id = auth_info.app_id -# account.app_secret = auth_info.app_secret -# engine = OceanEngine(account) -# engine.module_init() -# engine_manager.set_engine(auth_info.app_id, engine) -# -# return RedirectResponse(url="/welcome") -# -# -# @router.get("/auth_callback", response_model=None) -# async def oauth_callback(app_id: str, auth_code: str, state: str): -# logger.info(f"auth_callback handle auth code: {auth_code}") -# -# token = handle_callback(app_id, state, auth_code) -# app_id = app_id -# token_manager.update_tokens(token, app_id) -# -# logger.info(f"handle_auth_code success token: {token}") -# # 重定向到应用首页 -# return RedirectResponse(url="/welcome") +def _process_advertiser_list(data: Dict) -> Dict: + """处理广告主列表数据""" + return { + "list": data["list"], + "page_info": { + "page": data["page_info"]["page"], + "page_size": data["page_info"]["page_size"], + "total_number": data["page_info"]["total_number"], + "total_page": math.ceil(data["page_info"]["total_number"] / data["page_info"]["page_size"]) + } + } + + +def _process_authed_advertisers(data: Dict) -> Dict: + """ + 处理授权广告主数据 + 返回结构: + { + "list": [{ + "advertiser_id": int, + "advertiser_name": str, + "account_role": str, + "is_valid": bool, + "company_list": list + }], + "total": int + } + """ + processed_list = [] + for item in data.get("list", []): + processed_list.append({ + "advertiser_id": item.get("advertiser_id"), + "advertiser_name": item.get("advertiser_name", ""), + "account_role": item.get("account_role"), + "is_valid": item.get("is_valid", False), + "company_list": item.get("company_list", []) + }) + + return { + "list": processed_list, + "total": len(processed_list) + } @router.post("/advertiser/list/") async def get_advertiser_list(param: GetAdvertiserListParam, request: Request): """ - 获取广告主数据 - :return: + 获取广告主列表 + """ + return await BaseController.handle_api_request( + request=request, + service_call=lambda token: AccountService.get_advertiser_list(param, token), + data_processor=_process_advertiser_list + ) + + +@router.get("/authed_advertiser/get/") +async def get_authed_advertisers(request: Request): + """ + 获取授权广告主列表 """ - token = request.headers.get("token", None) - data = await AccountService.get_advertiser_list(param, token) - return data + return await BaseController.handle_api_request( + request=request, + service_call=lambda token: AccountService.get_authed_advertisers(token), + data_processor=_process_authed_advertisers + ) diff --git a/backend/app/apis/ocean/base_controller.py b/backend/app/apis/ocean/base_controller.py new file mode 100644 index 0000000..d819b7e --- /dev/null +++ b/backend/app/apis/ocean/base_controller.py @@ -0,0 +1,70 @@ +from fastapi import Request, status +from loguru import logger +from typing import Callable, Dict, Any +from app.corelibs.http_response import partner_success +from app.exceptions.exceptions import ThirdPartyAPIError + + +class BaseController: + @classmethod + async def handle_api_request( + cls, + request: Request, + service_call: Callable, + data_processor: Callable[[Dict], Dict] = None, + required_token: bool = True + ): + """ + 统一处理API请求 + :param service_call: 服务层调用方法 + :param data_processor: 数据处理函数 + :param required_token: 是否必须token + """ + try: + # Token验证 + token = request.headers.get("token") + if required_token and not token: + return partner_success( + data=None, + code=401, + msg="未提供访问令牌", + http_code=status.HTTP_401_UNAUTHORIZED + ) + + # 调用服务层 + service_result = await service_call(token if required_token else None) + + logger.info(f"handle_api_request ==== {service_result}") + # 数据处理 + response_data = data_processor(service_result["data"]) if data_processor else service_result["data"] + logger.info(f"handle_api_request response_data ==== {response_data}") + return partner_success( + data=response_data, + http_code=status.HTTP_200_OK + ) + + except ThirdPartyAPIError as e: + logger.error(f"第三方API错误: {str(e)}") + return cls._handle_error(e) + except Exception as e: + logger.exception("服务处理异常") + return cls._handle_error(e) + + @staticmethod + def _handle_error(e: Exception): + """统一错误处理""" + if isinstance(e, ThirdPartyAPIError): + http_code = status.HTTP_502_BAD_GATEWAY if e.code >= 500 else status.HTTP_400_BAD_REQUEST + return partner_success( + data=None, + code=e.code, + msg=f"第三方服务错误: {e.message}", + http_code=http_code + ) + else: + return partner_success( + data=None, + code=500, + msg=f"服务端错误: {str(e)}", + http_code=status.HTTP_500_INTERNAL_SERVER_ERROR + ) diff --git a/backend/app/exceptions/exceptions.py b/backend/app/exceptions/exceptions.py index 62e2bd3..6f67c52 100644 --- a/backend/app/exceptions/exceptions.py +++ b/backend/app/exceptions/exceptions.py @@ -78,3 +78,12 @@ class ParameterError(MyBaseException): def __init__(self, err_code: typing.Union[CodeEnum, str]): super(ParameterError, self).__init__(err_code) + +class ThirdPartyAPIError(Exception): + """第三方API异常""" + + def __init__(self, message: str, code: int = 400, request_id: str = None): + self.message = message + self.code = code + self.request_id = request_id + super().__init__(message) diff --git a/backend/app/schemas/base.py b/backend/app/schemas/base.py index 36da6a5..e1df999 100644 --- a/backend/app/schemas/base.py +++ b/backend/app/schemas/base.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# @author: xiaobai from pydantic import BaseModel, validator, Field +from typing import List, Optional class PageParam(BaseModel): @@ -8,6 +8,20 @@ class PageParam(BaseModel): page_size: int = Field(default=100, description='每页数量') +class PageInfo(BaseModel): + page: int + page_size: int + total_number: int + total_page: int + + +class ThirdPartyResponse(BaseModel): + code: int + message: str + request_id: str + data: Optional[dict] + + class BaseSchema(BaseModel): def dict(self, *args, **kwargs): if "exclude_none" not in kwargs: diff --git a/backend/app/schemas/ocean/account.py b/backend/app/schemas/ocean/account.py index 0b11022..74520c6 100644 --- a/backend/app/schemas/ocean/account.py +++ b/backend/app/schemas/ocean/account.py @@ -4,9 +4,24 @@ import typing from pydantic import BaseModel, Field from app.schemas.base import BaseSchema, PageParam from app.utils.des import decrypt_rsa_password +from pydantic import BaseModel +from typing import List, Optional, Dict class GetAdvertiserListParam(BaseModel): cc_account_id: str = Field(..., description='纵横账户ID,默认为实例的enterprise_id 企业号id') page: PageParam = Field(..., description='查询翻页') account_source: str = Field(default="DEFAULT_ACCOUNT_SOURCE", description='账户来源') + + +class AdvertiserItem(BaseModel): + advertiser_id: int + advertiser_name: str + advertiser_type: str + + +class AuthedAdvertiserItem(BaseModel): + advertiser_id: int + advertiser_name: str + is_valid: bool + account_role: str diff --git a/backend/app/services/ocean/account.py b/backend/app/services/ocean/account.py index ef3f805..7fbd5cb 100644 --- a/backend/app/services/ocean/account.py +++ b/backend/app/services/ocean/account.py @@ -1,43 +1,47 @@ +from typing import Dict from app.schemas.ocean.account import GetAdvertiserListParam -from app.utils.current_user import current_user -from loguru import logger -import requests from app.services.ocean.token_manager import TokenManager +from .base_service import BaseAPIService -# 反序列化函数 +class AccountService(BaseAPIService): -class AccountService: @staticmethod - async def get_advertiser_list(param: GetAdvertiserListParam, token: str): + async def get_advertiser_list(param: GetAdvertiserListParam, token: str) -> Dict: """ - 获取纵横工作台下的广告主列表 - https://open.oceanengine.com/labels/12/docs/1796368918556803?origin=left_nav - :return: 广告主列表 + 获取广告主列表 + https://ad.oceanengine.com/open_api/2/customer_center/advertiser/list/ """ - current_user_info = await current_user(token) - if not current_user_info: - return [] - auth_token_info = current_user_info.get('auth_token') + access_token = await TokenManager.get_access_token(token) - # 这里封装一个 token 检测,自动刷新 - if not auth_token_info: - logger.warning(f"未授权") - return [] + return await AccountService._make_api_request( + url="https://ad.oceanengine.com/open_api/2/customer_center/advertiser/list/", + method="GET", + headers={ + "Content-Type": "application/json", + "Access-Token": access_token + }, + params={ + "cc_account_id": param.cc_account_id, + "account_source": param.account_source, + "page": param.page.page, + "page_size": param.page.page_size + } + ) - access_token = TokenManager.get_access_token(token) - - headers = { - "Content-Type": "application/json", - "Access-Token": access_token - } - - params = { - "cc_account_id": param.cc_account_id, - "account_source": param.account_source, - "page": param.page.page, - "page_size": param.page.page_size - } - url = "https://ad.oceanengine.com/open_api/2/customer_center/advertiser/list/" - response = requests.get(url, headers=headers, params=params) - return response + @staticmethod + async def get_authed_advertisers(token: str) -> Dict: + """ + 获取授权账号列表 + https://open.oceanengine.com/labels/12/docs/1697467748096067?origin=left_nav + """ + access_token = await TokenManager.get_access_token(token) + return await AccountService._make_api_request( + url="https://ad.oceanengine.com/open_api/oauth2/advertiser/get/", + method="GET", + headers={ + "Content-Type": "application/json", + "Access-Token": access_token + }, + params={"access_token": access_token} + ) diff --git a/backend/app/services/ocean/base_service.py b/backend/app/services/ocean/base_service.py new file mode 100644 index 0000000..6966eff --- /dev/null +++ b/backend/app/services/ocean/base_service.py @@ -0,0 +1,57 @@ +from typing import Dict, Optional +import requests +from loguru import logger +from app.exceptions.exceptions import ThirdPartyAPIError +from app.schemas.base import ThirdPartyResponse + + +class BaseAPIService: + @staticmethod + async def _make_api_request( + url: str, + method: str = "GET", + headers: Optional[Dict] = None, + params: Optional[Dict] = None, + data: Optional[Dict] = None + ) -> Dict: + """ + 封装基础API请求逻辑 + :return: { + "success": bool, + "data": dict, + "request_id": Optional[str] + } + """ + try: + response = requests.request( + method=method, + url=url, + headers=headers or {}, + params=params, + json=data + ) + logger.info(f"response==== {response}") + response.raise_for_status() + + api_response = ThirdPartyResponse(**response.json()) + logger.info(f"api_response.code==== {api_response.code}") + if api_response.code != 0: + raise ThirdPartyAPIError( + api_response.message, + code=api_response.code, + request_id=api_response.request_id + ) + + logger.info(f"api_response==== {api_response.data}") + return { + "success": True, + "data": api_response.data, + "request_id": api_response.request_id + } + + except requests.exceptions.RequestException as e: + logger.error(f"API请求失败: {str(e)}") + raise ThirdPartyAPIError(f"网络请求失败: {str(e)}", code=500) + except Exception as e: + logger.error(f"API数据处理失败: {str(e)}") + raise ThirdPartyAPIError(f"数据处理失败: {str(e)}", code=500) diff --git a/backend/app/services/ocean/token_manager.py b/backend/app/services/ocean/token_manager.py index 7ad819a..5fcb643 100644 --- a/backend/app/services/ocean/token_manager.py +++ b/backend/app/services/ocean/token_manager.py @@ -14,7 +14,7 @@ token_refresh_buffer_time = 300 # 提前5分钟刷新避免过期 class TokenManager: @staticmethod - async def update_tokens(self, token_response: Dict[str, str], token: str): + async def update_tokens(token_response: Dict[str, str], token: str): """更新并持久化令牌数据""" # 计算精确过期时间点 logger.info(f"update token data:{token_response}") @@ -76,11 +76,11 @@ class TokenManager: return None token_data = current_user_info.get('auth_token') - + logger.info(f"get_access_token ==== token_data:{token_data}") if not token_data: logger.error(f"token data is null") return None - + # 检查并刷新过期令牌 if TokenManager.is_token_expired(token_data, token_type="access"): if TokenManager.is_token_expired(token_data, token_type="refresh"): diff --git a/backend/app/services/system/user.py b/backend/app/services/system/user.py index 4a56e72..4dfd30b 100644 --- a/backend/app/services/system/user.py +++ b/backend/app/services/system/user.py @@ -10,6 +10,7 @@ from app.corelibs.consts import TEST_USER_INFO, CACHE_DAY from app.models.system_models import User, Menu, Roles, UserLoginRecord from app.schemas.system.user import UserLogin, UserIn, UserResetPwd, UserDel, UserQuery, \ UserLoginRecordIn, UserLoginRecordQuery, AuthInfo +from app.services.ocean.token_manager import TokenManager from app.services.system.menu import MenuService from app.utils.current_user import current_user from app.utils.des import encrypt_rsa_password, decrypt_rsa_password @@ -264,10 +265,11 @@ class UserService: auth_token = handle_callback(app_id, secret, auth_code) # 授权完成后 auth_token 数据存到 缓存中 + await TokenManager.update_tokens(auth_token, token) + user_info = await g.redis.get(TEST_USER_INFO.format(token)) user_info["app_id"] = app_id user_info["secret"] = secret - user_info["auth_token"] = auth_token await g.redis.set(TEST_USER_INFO.format(token), user_info, CACHE_DAY) # 授权完成后 存储 数据到user表中 diff --git a/frontend/src/types/views.d.ts b/frontend/src/types/views.d.ts index 6970b86..315947d 100644 --- a/frontend/src/types/views.d.ts +++ b/frontend/src/types/views.d.ts @@ -6,6 +6,39 @@ type NewInfo = { date: string; link: string; }; + +type AdvertiserItem = { + advertiser_name: string + advertiser_id: number + advertiser_type: string +}; + +type PageInfo = { + page: number + pageSize: number + total: number +} + +export interface AdvertiserResponse { + code: number + message: string + request_id: string + data: { + page_info: { + page: number + total_number: number + page_size: number + total_page: number + } + list: AdvertiserItem[] + } +} + +type AdvertiserListInfo = { + advertiserList: AdvertiserItem[]; + pageInfo: PageInfo; +}; + type Recommend = { title: string; msg: string; @@ -15,6 +48,7 @@ type Recommend = { }; declare type PersonalState = { newsInfoList: NewInfo[]; + advertiserListInfo: AdvertiserListInfo; recommendList: Recommend[]; personalForm: { username: string; diff --git a/frontend/src/views/system/personal/index.vue b/frontend/src/views/system/personal/index.vue index db63d18..34555f7 100644 --- a/frontend/src/views/system/personal/index.vue +++ b/frontend/src/views/system/personal/index.vue @@ -104,23 +104,7 @@ - - - - - 消息通知 - - - - - {{ v.title }} - - - - - - - + import("/@/components/seePictures/index.vue")) const SeePicturesRef = ref(); @@ -244,6 +232,14 @@ const userStores = useUserInfo() // 定义变量内容 const state = reactive({ newsInfoList: [], + advertiserListInfo: { + advertiserList: [], + pageInfo: { + page: 1, + pageSize: 20, + total: 0 + } + }, recommendList: [], personalForm: { username: '', @@ -259,9 +255,8 @@ const state = reactive({ }, editTag: false, tagValue: "", - showEditPage: false, - cropperImg: '', + showAuthPage: false, }); const getUserInfo = async () => { @@ -329,6 +324,89 @@ onMounted(() => { \ No newline at end of file diff --git a/frontend/src/views/system/personal/AuthedAccountList.vue b/frontend/src/views/system/personal/AuthedAccountList.vue new file mode 100644 index 0000000..4f627a4 --- /dev/null +++ b/frontend/src/views/system/personal/AuthedAccountList.vue @@ -0,0 +1,235 @@ + + + + + + 授权的账号列表 - 总数{{ state.total }} + + 刷新 + + + + + + + + + + + + + {{ getRoleLabel(row.account_role) }} + + + + + + + {{ row.is_valid ? '有效' : '无效' }} + + + + + + + 详情 + + + 关联企业({{ row.company_list.length }}) + + + + + + + + + + + + + \ No newline at end of file -- Gitee