From e1dcaacdb7274c86d4ee31668c12f23c2c1678f7 Mon Sep 17 00:00:00 2001 From: sundongyu <2811054731@qq.com> Date: Wed, 12 Jun 2024 14:58:17 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=E5=AE=8C=E6=88=90=E7=A1=85?= =?UTF-8?q?=E8=B0=B7=E7=94=84=E9=80=89=E7=9A=84=E5=AD=A6=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 5 + .env.production | 4 + .env.test | 4 + .eslintignore | 2 + .eslintrc.cjs | 62 + .gitignore | 30 + .prettierignore | 8 + .prettierrc.json | 10 + .vscode/extensions.json | 7 + README.md | 39 + env.d.ts | 1 + index.html | 13 + mock/user.ts | 65 + package.json | 45 + pnpm-lock.yaml | 2646 ++++++++++++++++++++ public/favicon.ico | Bin 0 -> 4286 bytes src/App.vue | 5 + src/api/menu/index.ts | 28 + src/api/menu/type.ts | 35 + src/api/user/index.ts | 24 + src/api/user/type.ts | 29 + src/assets/background.jpg | Bin 0 -> 47628 bytes src/assets/logo.svg | 1 + src/components/HelloWorld.vue | 41 + src/components/TheWelcome.vue | 88 + src/components/WelcomeItem.vue | 87 + src/components/icons/IconCommunity.vue | 7 + src/components/icons/IconDocumentation.vue | 7 + src/components/icons/IconEcosystem.vue | 7 + src/components/icons/IconSupport.vue | 7 + src/components/icons/IconTooling.vue | 19 + src/layout/index.vue | 117 + src/layout/logo/index.vue | 31 + src/layout/main/index.vue | 56 + src/layout/menu/index.vue | 53 + src/layout/tabbar/breadcrumd/index.vue | 40 + src/layout/tabbar/index.vue | 42 + src/layout/tabbar/setting/index.vue | 115 + src/main.ts | 22 + src/pages/404/index.vue | 7 + src/pages/home/index.vue | 7 + src/pages/home/test.vue | 7 + src/pages/login/index.vue | 109 + src/pages/permission/menu/index.vue | 112 + src/pages/permission/role/index.vue | 7 + src/pages/permission/user/index.vue | 7 + src/permisstion.ts | 69 + src/router/index.ts | 17 + src/router/routes.ts | 115 + src/stores/index.ts | 6 + src/stores/modules/setting.ts | 13 + src/stores/modules/user.ts | 42 + src/style/index.scss | 2 + src/style/reset.scss | 186 ++ src/style/variable.scss | 19 + src/utils/request.ts | 44 + tsconfig.app.json | 15 + tsconfig.json | 11 + tsconfig.node.json | 19 + vite.config.ts | 29 + 60 files changed, 4645 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.test create mode 100644 .eslintignore create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 env.d.ts create mode 100644 index.html create mode 100644 mock/user.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/favicon.ico create mode 100644 src/App.vue create mode 100644 src/api/menu/index.ts create mode 100644 src/api/menu/type.ts create mode 100644 src/api/user/index.ts create mode 100644 src/api/user/type.ts create mode 100644 src/assets/background.jpg create mode 100644 src/assets/logo.svg create mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/TheWelcome.vue create mode 100644 src/components/WelcomeItem.vue create mode 100644 src/components/icons/IconCommunity.vue create mode 100644 src/components/icons/IconDocumentation.vue create mode 100644 src/components/icons/IconEcosystem.vue create mode 100644 src/components/icons/IconSupport.vue create mode 100644 src/components/icons/IconTooling.vue create mode 100644 src/layout/index.vue create mode 100644 src/layout/logo/index.vue create mode 100644 src/layout/main/index.vue create mode 100644 src/layout/menu/index.vue create mode 100644 src/layout/tabbar/breadcrumd/index.vue create mode 100644 src/layout/tabbar/index.vue create mode 100644 src/layout/tabbar/setting/index.vue create mode 100644 src/main.ts create mode 100644 src/pages/404/index.vue create mode 100644 src/pages/home/index.vue create mode 100644 src/pages/home/test.vue create mode 100644 src/pages/login/index.vue create mode 100644 src/pages/permission/menu/index.vue create mode 100644 src/pages/permission/role/index.vue create mode 100644 src/pages/permission/user/index.vue create mode 100644 src/permisstion.ts create mode 100644 src/router/index.ts create mode 100644 src/router/routes.ts create mode 100644 src/stores/index.ts create mode 100644 src/stores/modules/setting.ts create mode 100644 src/stores/modules/user.ts create mode 100644 src/style/index.scss create mode 100644 src/style/reset.scss create mode 100644 src/style/variable.scss create mode 100644 src/utils/request.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..5806c19 --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV = 'development' +VITE_APP_TITLE = '硅谷甄选运营平台' +VITE_APP_BASE_API = '/api' +VITE_SERVE="http://sph-api.atguigu.cn" \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..7de14ad --- /dev/null +++ b/.env.production @@ -0,0 +1,4 @@ +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV = 'production' +VITE_APP_TITLE = '硅谷甄选运营平台' +VITE_APP_BASE_API = '/prod-api' \ No newline at end of file diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..df5b916 --- /dev/null +++ b/.env.test @@ -0,0 +1,4 @@ +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV = 'test' +VITE_APP_TITLE = '硅谷甄选运营平台' +VITE_APP_BASE_API = '/test-api' \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..db4c6d9 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..be8901c --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,62 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + jest: true + }, + /* 指定如何解析语法 */ + parser: 'vue-eslint-parser', + /** 优先级低于 parse 的语法解析配置 */ + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + parser: '@typescript-eslint/parser', + jsxPragma: 'React', + ecmaFeatures: { + jsx: true + } + }, + /* 继承已有的规则 */ + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-essential', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended' + ], + plugins: ['vue', '@typescript-eslint'], + /* + * "off" 或 0 ==> 关闭规则 + * "warn" 或 1 ==> 打开的规则作为警告(不影响代码执行) + * "error" 或 2 ==> 规则作为一个错误(代码不能执行,界面报错) + */ + rules: { + // eslint(https://eslint.bootcss.com/docs/rules/) + 'no-var': 'error', // 要求使用 let 或 const 而不是 var + 'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行 + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-unexpected-multiline': 'error', // 禁止空余的多行 + 'no-useless-escape': 'off', // 禁止不必要的转义字符 + // 添加允许末尾逗号的规则 + 'comma-dangle': ['error', 'never'], // 对于多行数组、对象字面量和函数参数,要求末尾有逗号 + // 如果你也希望单行情况下允许尾随逗号,可以设置为:'comma-dangle': ['error', 'always'] + + // typeScript (https://typescript-eslint.io/rules) + '@typescript-eslint/no-unused-vars': 'error', // 禁止定义未使用的变量 + '@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore + '@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型 + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-namespace': 'off', // 禁止使用自定义 TypeScript 模块和命名空间。 + '@typescript-eslint/semi': 'off', + + // eslint-plugin-vue (https://eslint.vuejs.org/rules/) + 'vue/multi-word-component-names': 'off', // 要求组件名称始终为 “-” 链接的单词 + 'vue/script-setup-uses-vars': 'error', // 防止 + + diff --git a/mock/user.ts b/mock/user.ts new file mode 100644 index 0000000..cbdcba3 --- /dev/null +++ b/mock/user.ts @@ -0,0 +1,65 @@ +//用户信息数据 +function createUserList() { + return [ + { + userId: 1, + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + username: 'admin', + password: '111111', + desc: '平台管理员', + roles: ['平台管理员'], + buttons: ['cuser.detail'], + routes: ['home'], + token: 'Admin Token' + }, + { + userId: 2, + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + username: 'system', + password: '111111', + desc: '系统管理员', + roles: ['系统管理员'], + buttons: ['cuser.detail', 'cuser.user'], + routes: ['home'], + token: 'System Token' + } + ] +} + +export default [ + // 用户登录接口 + { + url: '/api/user/login', //请求地址 + method: 'post', //请求方式 + response: ({ body }) => { + //获取请求体携带过来的用户名与密码 + const { username, password } = body + //调用获取用户信息函数,用于判断是否有此用户 + const checkUser = createUserList().find((item) => item.username === username && item.password === password) + //没有用户返回失败信息 + if (!checkUser) { + return { code: 201, data: { message: '账号或者密码不正确' } } + } + //如果有返回成功信息 + const { token } = checkUser + return { code: 200, data: { token } } + } + }, + // 获取用户信息 + { + url: '/api/user/info', + method: 'get', + response: (request) => { + //获取请求头携带token + const token = request.headers.token + //查看用户信息是否包含有次token用户 + const checkUser = createUserList().find((item) => item.token === token) + //没有返回失败的信息 + if (!checkUser) { + return { code: 201, data: { message: '获取用户信息失败' } } + } + //如果有返回成功信息 + return { code: 200, data: { checkUser } } + } + } +] diff --git a/package.json b/package.json new file mode 100644 index 0000000..adf61d1 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "vite", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --open", + "build:test": "vue-tsc && vite build --mode test", + "build:pro": "vue-tsc && vite build --mode production", + "preview": "vite preview", + "lint": "eslint src", + "fix": "eslint src --fix", + "format": "prettier --write \"./**/*.{html,vue,ts,js,json,md}\"", + "lint:eslint": "eslint src/**/*.{ts,vue} --cache --fix", + "lint:style": "stylelint src/**/*.{css,scss,vue} --cache --fix" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "axios": "^1.7.2", + "element-plus": "^2.7.5", + "nprogress": "^0.2.0", + "pinia": "^2.1.7", + "sass": "^1.77.4", + "vue": "^3.4.21", + "vue-router": "^4.3.0" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.8.0", + "@tsconfig/node20": "^20.1.4", + "@types/node": "^20.12.5", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/eslint-config-prettier": "^9.0.0", + "@vue/eslint-config-typescript": "^13.0.0", + "@vue/tsconfig": "^0.5.1", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.23.0", + "mockjs": "^1.1.0", + "npm-run-all2": "^6.1.2", + "prettier": "^3.2.5", + "typescript": "~5.4.0", + "vite": "^5.2.8", + "vite-plugin-mock": "^3.0.2", + "vue-tsc": "^2.0.11" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..4ce4c78 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2646 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.3.1 + version: 2.3.1(vue@3.4.27(typescript@5.4.5)) + axios: + specifier: ^1.7.2 + version: 1.7.2 + element-plus: + specifier: ^2.7.5 + version: 2.7.5(vue@3.4.27(typescript@5.4.5)) + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^2.1.7 + version: 2.1.7(typescript@5.4.5)(vue@3.4.27(typescript@5.4.5)) + sass: + specifier: ^1.77.4 + version: 1.77.4 + vue: + specifier: ^3.4.21 + version: 3.4.27(typescript@5.4.5) + vue-router: + specifier: ^4.3.0 + version: 4.3.2(vue@3.4.27(typescript@5.4.5)) + devDependencies: + '@rushstack/eslint-patch': + specifier: ^1.8.0 + version: 1.10.3 + '@tsconfig/node20': + specifier: ^20.1.4 + version: 20.1.4 + '@types/node': + specifier: ^20.12.5 + version: 20.14.2 + '@vitejs/plugin-vue': + specifier: ^5.0.4 + version: 5.0.5(vite@5.2.13(@types/node@20.14.2)(sass@1.77.4))(vue@3.4.27(typescript@5.4.5)) + '@vue/eslint-config-prettier': + specifier: ^9.0.0 + version: 9.0.0(eslint@8.57.0)(prettier@3.3.1) + '@vue/eslint-config-typescript': + specifier: ^13.0.0 + version: 13.0.0(eslint-plugin-vue@9.26.0(eslint@8.57.0))(eslint@8.57.0)(typescript@5.4.5) + '@vue/tsconfig': + specifier: ^0.5.1 + version: 0.5.1 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-plugin-vue: + specifier: ^9.23.0 + version: 9.26.0(eslint@8.57.0) + mockjs: + specifier: ^1.1.0 + version: 1.1.0 + npm-run-all2: + specifier: ^6.1.2 + version: 6.2.0 + prettier: + specifier: ^3.2.5 + version: 3.3.1 + typescript: + specifier: ~5.4.0 + version: 5.4.5 + vite: + specifier: ^5.2.8 + version: 5.2.13(@types/node@20.14.2)(sass@1.77.4) + vite-plugin-mock: + specifier: ^3.0.2 + version: 3.0.2(esbuild@0.20.2)(mockjs@1.1.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.77.4)) + vue-tsc: + specifier: ^2.0.11 + version: 2.0.21(typescript@5.4.5) + +packages: + + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.1': + resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + + '@rushstack/eslint-patch@1.10.3': + resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@tsconfig/node20@20.1.4': + resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.5': + resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==} + + '@types/node@20.14.2': + resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@typescript-eslint/eslint-plugin@7.12.0': + resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.12.0': + resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.12.0': + resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.12.0': + resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.12.0': + resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.12.0': + resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.12.0': + resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.12.0': + resolution: {integrity: sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-vue@5.0.5': + resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.3.0': + resolution: {integrity: sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==} + + '@volar/source-map@2.3.0': + resolution: {integrity: sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==} + + '@volar/typescript@2.3.0': + resolution: {integrity: sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==} + + '@vue/compiler-core@3.4.27': + resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + + '@vue/compiler-dom@3.4.27': + resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + + '@vue/compiler-sfc@3.4.27': + resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} + + '@vue/compiler-ssr@3.4.27': + resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} + + '@vue/devtools-api@6.6.3': + resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} + + '@vue/eslint-config-prettier@9.0.0': + resolution: {integrity: sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==} + peerDependencies: + eslint: '>= 8.0.0' + prettier: '>= 3.0.0' + + '@vue/eslint-config-typescript@13.0.0': + resolution: {integrity: sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + eslint-plugin-vue: ^9.0.0 + typescript: '>=4.7.4' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@2.0.21': + resolution: {integrity: sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.4.27': + resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} + + '@vue/runtime-core@3.4.27': + resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} + + '@vue/runtime-dom@3.4.27': + resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} + + '@vue/server-renderer@3.4.27': + resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} + peerDependencies: + vue: 3.4.27 + + '@vue/shared@3.4.27': + resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + + '@vue/tsconfig@0.5.1': + resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bundle-require@4.2.1: + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + element-plus@2.7.5: + resolution: {integrity: sha512-e4oqhfRGBpdblgsjEBK+tA2+fg1H1KZ2Qinty1SaJl0X49FrMLK0lpXQNheWyBqI4V/pyjVOF9sRjz2hfyoctw==} + peerDependencies: + vue: ^3.2.0 + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@9.26.0: + resolution: {integrity: sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immutable@4.3.6: + resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + mockjs@1.1.0: + resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-all2@6.2.0: + resolution: {integrity: sha512-wA7yVIkthe6qJBfiJ2g6aweaaRlw72itsFGF6HuwCHKwtwAx/4BY1vVpk6bw6lS8RLMsexoasOkd0aYOmsFG7Q==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} + hasBin: true + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pinia@2.1.7: + resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + + postcss-selector-parser@6.1.0: + resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + engines: {node: '>=4'} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.3.1: + resolution: {integrity: sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==} + engines: {node: '>=14'} + hasBin: true + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sass@1.77.4: + resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} + engines: {node: '>=14.0.0'} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + vite-plugin-mock@3.0.2: + resolution: {integrity: sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==} + engines: {node: '>=16.0.0'} + peerDependencies: + esbuild: '>=0.17' + mockjs: '>=1.1.0' + vite: '>=4.0.0' + + vite@5.2.13: + resolution: {integrity: sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-demi@0.14.8: + resolution: {integrity: sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-router@4.3.2: + resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==} + peerDependencies: + vue: ^3.2.0 + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@2.0.21: + resolution: {integrity: sha512-E6x1p1HaHES6Doy8pqtm7kQern79zRtIewkf9fiv7Y43Zo4AFDS5hKi+iHi2RwEhqRmuiwliB1LCEFEGwvxQnw==} + hasBin: true + peerDependencies: + typescript: '*' + + vue@3.4.27: + resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.1(vue@3.4.27(typescript@5.4.5))': + dependencies: + vue: 3.4.27(typescript@5.4.5) + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@floating-ui/core@1.6.2': + dependencies: + '@floating-ui/utils': 0.2.2 + + '@floating-ui/dom@1.6.5': + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 + + '@floating-ui/utils@0.2.2': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgr/core@0.1.1': {} + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true + + '@rollup/rollup-android-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-x64@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.18.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.18.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.18.0': + optional: true + + '@rushstack/eslint-patch@1.10.3': {} + + '@sxzz/popperjs-es@2.11.7': {} + + '@tsconfig/node20@20.1.4': {} + + '@types/estree@1.0.5': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.5 + + '@types/lodash@4.17.5': {} + + '@types/node@20.14.2': + dependencies: + undici-types: 5.26.5 + + '@types/web-bluetooth@0.0.16': {} + + '@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.1 + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/type-utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.12.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.12.0 + debug: 4.3.5 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.12.0': + dependencies: + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/visitor-keys': 7.12.0 + + '@typescript-eslint/type-utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.5 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.12.0': {} + + '@typescript-eslint/typescript-estree@7.12.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/visitor-keys': 7.12.0 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.12.0': + dependencies: + '@typescript-eslint/types': 7.12.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-vue@5.0.5(vite@5.2.13(@types/node@20.14.2)(sass@1.77.4))(vue@3.4.27(typescript@5.4.5))': + dependencies: + vite: 5.2.13(@types/node@20.14.2)(sass@1.77.4) + vue: 3.4.27(typescript@5.4.5) + + '@volar/language-core@2.3.0': + dependencies: + '@volar/source-map': 2.3.0 + + '@volar/source-map@2.3.0': + dependencies: + muggle-string: 0.4.1 + + '@volar/typescript@2.3.0': + dependencies: + '@volar/language-core': 2.3.0 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + + '@vue/compiler-core@3.4.27': + dependencies: + '@babel/parser': 7.24.7 + '@vue/shared': 3.4.27 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.27': + dependencies: + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/compiler-sfc@3.4.27': + dependencies: + '@babel/parser': 7.24.7 + '@vue/compiler-core': 3.4.27 + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.27': + dependencies: + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/devtools-api@6.6.3': {} + + '@vue/eslint-config-prettier@9.0.0(eslint@8.57.0)(prettier@3.3.1)': + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.1) + prettier: 3.3.1 + transitivePeerDependencies: + - '@types/eslint' + + '@vue/eslint-config-typescript@13.0.0(eslint-plugin-vue@9.26.0(eslint@8.57.0))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-plugin-vue: 9.26.0(eslint@8.57.0) + vue-eslint-parser: 9.4.3(eslint@8.57.0) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@vue/language-core@2.0.21(typescript@5.4.5)': + dependencies: + '@volar/language-core': 2.3.0 + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 + computeds: 0.0.1 + minimatch: 9.0.4 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.4.5 + + '@vue/reactivity@3.4.27': + dependencies: + '@vue/shared': 3.4.27 + + '@vue/runtime-core@3.4.27': + dependencies: + '@vue/reactivity': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/runtime-dom@3.4.27': + dependencies: + '@vue/runtime-core': 3.4.27 + '@vue/shared': 3.4.27 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + vue: 3.4.27(typescript@5.4.5) + + '@vue/shared@3.4.27': {} + + '@vue/tsconfig@0.5.1': {} + + '@vueuse/core@9.13.0(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.4.27(typescript@5.4.5)) + vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@9.13.0(vue@3.4.27(typescript@5.4.5))': + dependencies: + vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn@8.11.3: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + axios@1.7.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bundle-require@4.2.1(esbuild@0.20.2): + dependencies: + esbuild: 0.20.2 + load-tsconfig: 0.2.5 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@12.1.0: {} + + computeds@0.0.1: {} + + concat-map@0.0.1: {} + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + dayjs@1.11.11: {} + + de-indent@1.0.2: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + ee-first@1.1.1: {} + + element-plus@2.7.5(vue@3.4.27(typescript@5.4.5)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.4.27(typescript@5.4.5)) + '@floating-ui/dom': 1.6.5 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.5 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.4.27(typescript@5.4.5)) + async-validator: 4.2.5 + dayjs: 1.11.11 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.4.27(typescript@5.4.5) + transitivePeerDependencies: + - '@vue/composition-api' + + encodeurl@1.0.2: {} + + entities@4.5.0: {} + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.1): + dependencies: + eslint: 8.57.0 + prettier: 3.3.1 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + + eslint-plugin-vue@9.26.0(eslint@8.57.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.0 + semver: 7.6.2 + vue-eslint-parser: 9.4.3(eslint@8.57.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + he@1.2.0: {} + + ignore@5.3.1: {} + + immutable@4.3.6: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isexe@2.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@3.0.2: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + load-tsconfig@0.2.5: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + memoize-one@6.0.0: {} + + memorystream@0.3.1: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + mockjs@1.1.0: + dependencies: + commander: 12.1.0 + + ms@2.0.0: {} + + ms@2.1.2: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + normalize-path@3.0.0: {} + + normalize-wheel-es@1.2.0: {} + + npm-normalize-package-bin@3.0.1: {} + + npm-run-all2@6.2.0: + dependencies: + ansi-styles: 6.2.1 + cross-spawn: 7.0.3 + memorystream: 0.3.1 + minimatch: 9.0.4 + pidtree: 0.6.0 + read-package-json-fast: 3.0.2 + shell-quote: 1.8.1 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-to-regexp@6.2.2: {} + + path-type@4.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + pinia@2.1.7(typescript@5.4.5)(vue@3.4.27(typescript@5.4.5)): + dependencies: + '@vue/devtools-api': 6.6.3 + vue: 3.4.27(typescript@5.4.5) + vue-demi: 0.14.8(vue@3.4.27(typescript@5.4.5)) + optionalDependencies: + typescript: 5.4.5 + + postcss-selector-parser@6.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.3.1: {} + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + read-package-json-fast@3.0.2: + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + resolve-from@4.0.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.18.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sass@1.77.4: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.6 + source-map-js: 1.2.0 + + semver@7.6.2: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + slash@3.0.0: {} + + source-map-js@1.2.0: {} + + statuses@1.5.0: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + + text-table@0.2.0: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + tslib@2.6.3: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typescript@5.4.5: {} + + undici-types@5.26.5: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + vite-plugin-mock@3.0.2(esbuild@0.20.2)(mockjs@1.1.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.77.4)): + dependencies: + bundle-require: 4.2.1(esbuild@0.20.2) + chokidar: 3.6.0 + connect: 3.7.0 + debug: 4.3.5 + esbuild: 0.20.2 + fast-glob: 3.3.2 + mockjs: 1.1.0 + path-to-regexp: 6.2.2 + picocolors: 1.0.1 + vite: 5.2.13(@types/node@20.14.2)(sass@1.77.4) + transitivePeerDependencies: + - supports-color + + vite@5.2.13(@types/node@20.14.2)(sass@1.77.4): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + '@types/node': 20.14.2 + fsevents: 2.3.3 + sass: 1.77.4 + + vscode-uri@3.0.8: {} + + vue-demi@0.14.8(vue@3.4.27(typescript@5.4.5)): + dependencies: + vue: 3.4.27(typescript@5.4.5) + + vue-eslint-parser@9.4.3(eslint@8.57.0): + dependencies: + debug: 4.3.5 + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + + vue-router@4.3.2(vue@3.4.27(typescript@5.4.5)): + dependencies: + '@vue/devtools-api': 6.6.3 + vue: 3.4.27(typescript@5.4.5) + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-tsc@2.0.21(typescript@5.4.5): + dependencies: + '@volar/typescript': 2.3.0 + '@vue/language-core': 2.0.21(typescript@5.4.5) + semver: 7.6.2 + typescript: 5.4.5 + + vue@3.4.27(typescript@5.4.5): + dependencies: + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-sfc': 3.4.27 + '@vue/runtime-dom': 3.4.27 + '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.4.5)) + '@vue/shared': 3.4.27 + optionalDependencies: + typescript: 5.4.5 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + xml-name-validator@4.0.0: {} + + yocto-queue@0.1.0: {} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..28aa00c --- /dev/null +++ b/src/App.vue @@ -0,0 +1,5 @@ + + + diff --git a/src/api/menu/index.ts b/src/api/menu/index.ts new file mode 100644 index 0000000..e215b51 --- /dev/null +++ b/src/api/menu/index.ts @@ -0,0 +1,28 @@ +import request from '@/utils/request' +// 引入类型 +import type { PermisstionResponseData, MenuParams } from './type' + +const API = { + //获取全部菜单与按钮的标识数据 + ALLPERMISSTION_URL: 'http://sph-api.atguigu.cn/admin/acl/permission', + //给某一级菜单新增一个子菜单 + ADDMENU_URL: 'http://sph-api.atguigu.cn/admin/acl/permission/save', + //更新某一个已有的菜单 + UPDATE_URL: 'http://sph-api.atguigu.cn/admin/acl/permission/update', + //删除已有的菜单 + DELETEMENU_URL: 'http://sph-api.atguigu.cn/admin/acl/permission/remove/' +} +//获取菜单数据 +export const reqAllPermission = () => { + return request.get(API.ALLPERMISSTION_URL) +} +//添加与更新菜单的方法 +export const reqAddOrUpdateMenu = (data: MenuParams) => { + if (data.id) { + return request.put(API.UPDATE_URL, data) + } else { + return request.post(API.ADDMENU_URL, data) + } +} +//删除某一个已有的菜单 +export const reqRemoveMenu = (id: number) => request.delete(API.DELETEMENU_URL + id) diff --git a/src/api/menu/type.ts b/src/api/menu/type.ts new file mode 100644 index 0000000..711bbb8 --- /dev/null +++ b/src/api/menu/type.ts @@ -0,0 +1,35 @@ +//数据类型定义 +export interface ResponseData { + code: number + message: string + ok: boolean +} +//菜单数据与按钮数据的ts类型 +export interface Permisstion { + id?: number + createTime: string + updateTime: string + pid: number + name: string + code: null + toCode: null + type: number + status: null + level: number + children?: PermisstionList + select: boolean +} +export type PermisstionList = Permisstion[] +//菜单接口返回的数据类型 +export interface PermisstionResponseData extends ResponseData { + data: PermisstionList +} + +//添加与修改菜单携带的参数的ts类型 +export interface MenuParams { + id?: number //ID + code: string //权限数值 + level: number //几级菜单 + name: string //菜单的名字 + pid: number //菜单的ID +} diff --git a/src/api/user/index.ts b/src/api/user/index.ts new file mode 100644 index 0000000..b5ce688 --- /dev/null +++ b/src/api/user/index.ts @@ -0,0 +1,24 @@ +//统一管理咱们项目用户相关的接口 + +import request from '@/utils/request' + +import type { loginFormData, loginResponseData, userInfoReponseData } from './type' + +//项目用户相关的请求地址 + +enum API { + LOGIN_URL = '/user/login', + + USERINFO_URL = '/admin/acl/index/info', + + LOGOUT_URL = '/admin/acl/index/logout' +} +//登录接口 +export const reqLogin = (data: loginFormData) => request.post(API.LOGIN_URL, data) +//获取用户信息 + +export const reqUserInfo = () => request.get(API.USERINFO_URL) + +//退出登录 + +export const reqLogout = () => request.post(API.LOGOUT_URL) diff --git a/src/api/user/type.ts b/src/api/user/type.ts new file mode 100644 index 0000000..0fa83bf --- /dev/null +++ b/src/api/user/type.ts @@ -0,0 +1,29 @@ +//定义用户相关数据的ts类型 +//用户登录接口携带参数的ts类型 +export interface loginFormData { + username: string + password: string +} + +//定义全部接口返回数据都拥有ts类型 +export interface ResponseData { + code: number + message: string + ok: boolean +} + +//定义登录接口返回数据类型 +export interface loginResponseData extends ResponseData { + data: string +} + +//定义获取用户信息返回数据类型 +export interface userInfoReponseData extends ResponseData { + data: { + routes: string[] + buttons: string[] + roles: string[] + name: string + avatar: string + } +} diff --git a/src/assets/background.jpg b/src/assets/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67a86bcda12b22c51420e1231cb46d5e78831e3e GIT binary patch literal 47628 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

>x!fxoCl?dF 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 z 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 literal 0 HcmV?d00001 diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..38d821e --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/components/TheWelcome.vue b/src/components/TheWelcome.vue new file mode 100644 index 0000000..49d8f73 --- /dev/null +++ b/src/components/TheWelcome.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/components/WelcomeItem.vue b/src/components/WelcomeItem.vue new file mode 100644 index 0000000..6d7086a --- /dev/null +++ b/src/components/WelcomeItem.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..e12a309 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,117 @@ + + + + + + + diff --git a/src/layout/logo/index.vue b/src/layout/logo/index.vue new file mode 100644 index 0000000..0243909 --- /dev/null +++ b/src/layout/logo/index.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/src/layout/main/index.vue b/src/layout/main/index.vue new file mode 100644 index 0000000..d2710c8 --- /dev/null +++ b/src/layout/main/index.vue @@ -0,0 +1,56 @@ + + + + + + diff --git a/src/layout/menu/index.vue b/src/layout/menu/index.vue new file mode 100644 index 0000000..c65cd63 --- /dev/null +++ b/src/layout/menu/index.vue @@ -0,0 +1,53 @@ + + + + + + diff --git a/src/layout/tabbar/breadcrumd/index.vue b/src/layout/tabbar/breadcrumd/index.vue new file mode 100644 index 0000000..ac27e0b --- /dev/null +++ b/src/layout/tabbar/breadcrumd/index.vue @@ -0,0 +1,40 @@ + + + + + + diff --git a/src/layout/tabbar/index.vue b/src/layout/tabbar/index.vue new file mode 100644 index 0000000..8390e85 --- /dev/null +++ b/src/layout/tabbar/index.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/layout/tabbar/setting/index.vue b/src/layout/tabbar/setting/index.vue new file mode 100644 index 0000000..772a2c2 --- /dev/null +++ b/src/layout/tabbar/setting/index.vue @@ -0,0 +1,115 @@ + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..38f7c46 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,22 @@ +// import './assets/main.css' +import { createApp } from 'vue' +import { createPinia } from 'pinia' +//引入element-plus插件与样式 +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +// 引入暗黑模式样式 +import 'element-plus/theme-chalk/dark/css-vars.css' +//引入模板的全局的样式 +import '@/style/index.scss' +import './permisstion' + +import App from './App.vue' +import router from './router' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) +app.use(ElementPlus) + +app.mount('#app') diff --git a/src/pages/404/index.vue b/src/pages/404/index.vue new file mode 100644 index 0000000..794f8d5 --- /dev/null +++ b/src/pages/404/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/pages/home/index.vue b/src/pages/home/index.vue new file mode 100644 index 0000000..0362235 --- /dev/null +++ b/src/pages/home/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/pages/home/test.vue b/src/pages/home/test.vue new file mode 100644 index 0000000..944ddfc --- /dev/null +++ b/src/pages/home/test.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue new file mode 100644 index 0000000..4eeea6a --- /dev/null +++ b/src/pages/login/index.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/pages/permission/menu/index.vue b/src/pages/permission/menu/index.vue new file mode 100644 index 0000000..9b1cb04 --- /dev/null +++ b/src/pages/permission/menu/index.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/pages/permission/role/index.vue b/src/pages/permission/role/index.vue new file mode 100644 index 0000000..15624c4 --- /dev/null +++ b/src/pages/permission/role/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/pages/permission/user/index.vue b/src/pages/permission/user/index.vue new file mode 100644 index 0000000..6d4ecf7 --- /dev/null +++ b/src/pages/permission/user/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/permisstion.ts b/src/permisstion.ts new file mode 100644 index 0000000..224cffe --- /dev/null +++ b/src/permisstion.ts @@ -0,0 +1,69 @@ +//路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问) +import router from '@/router' +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-expect-error +import nprogress from 'nprogress' +//引入进度条样式 +import 'nprogress/nprogress.css' +//获取用户相关的小仓库内部token数据,去判断用户是否登录成功 +import useUserStore from './stores/modules/user' +import pinia from './stores' +const userStore = useUserStore(pinia) +//全局守卫:项目当中任意路由切换都会触发的钩子 +//全局前置守卫 +router.beforeEach(async (to: any, from: any, next: any) => { + //to:你将要访问那个路由 + //from:你从来个路由而来 + //next:路由的放行函数 + nprogress.start() + //获取token,去判断用户登录、还是未登录 + const token = userStore.token + //获取用户名字 + const username = userStore.username + + //用户登录判断 + if (token) { + //登录成功,访问login,不能访问,指向首页 + if (to.path == '/login') { + next({ path: '/' }) + } else { + //登录成功访问其余六个路由(登录排除) + //有用户信息 + if (username) { + //放行 + next() + } else { + try { + //获取用户信息 + //放行 + //万一:刷新的时候是异步路由,有可能获取到用户信息、异步路由还没有加载完毕,出现空白的效果 + next({ ...to }) + } catch (error) { + //token过期:获取不到用户信息了 + //用户手动修改本地存储token + //退出登录->用户相关的数据清空 + next({ path: '/login', query: { redirect: to.path } }) + } + } + } + } else { + //用户未登录判断 + if (to.path == '/login') { + next() + } else { + next({ path: '/login', query: { redirect: to.path } }) + } + } +}) +//全局后置守卫 +// eslint-disable-next-line @typescript-eslint/no-unused-vars +router.afterEach((to: any, from: any) => { + nprogress.done() +}) + +//第一个问题:任意路由切换实现进度条业务 ---nprogress +//第二个问题:路由鉴权(路由组件访问权限的设置) +//全部路由组件:登录|404|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(四个子路由) + +//用户未登录:可以访问login,其余六个路由不能访问(指向login) +//用户登录成功:不可以访问login[指向首页],其余的路由可以访问 diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..7d2d615 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,17 @@ +//通过vue-router插件实现模板路由配置 +import { createRouter, createWebHashHistory } from 'vue-router' +import { constantRoute } from './routes' +//创建路由器 +const router = createRouter({ + //路由模式hash + history: createWebHashHistory(), + routes: constantRoute, + //滚动行为 + scrollBehavior() { + return { + left: 0, + top: 0 + } + } +}) +export default router diff --git a/src/router/routes.ts b/src/router/routes.ts new file mode 100644 index 0000000..e91b3b8 --- /dev/null +++ b/src/router/routes.ts @@ -0,0 +1,115 @@ +import Layout from '@/layout/index.vue' + +export const constantRoute = [ + { + //登录 + path: '/login', + component: () => import('@/pages/login/index.vue'), + name: 'login', + meta: { + title: '登录', //菜单标题 + hidden: true, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + } + }, + { + //首页 + path: '/', + component: Layout, + name: 'home', + redirect: '/home', + meta: { + title: '首页', //菜单标题 + hidden: false, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + }, + children: [ + { + path: '/home', + component: () => import('@/pages/home/index.vue'), + name: 'index', + meta: { + title: '首页', //菜单标题 + hidden: false, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + } + }, + { + path: '/test', + component: () => import('@/pages/home/test.vue'), + name: 'test', + meta: { + title: '测试', //菜单标题 + hidden: false, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + } + } + ] + }, + { + //菜单 + path: '/permission', + component: Layout, + name: 'permission', + redirect: '/user', + meta: { + title: '权限管理', //菜单标题 + hidden: false, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + }, + children: [ + { + path: '/user', + component: () => import('@/pages/permission/user/index.vue'), + name: 'user', + meta: { + title: '用户管理', //菜单标题 + hidden: false, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + } + }, + { + path: '/role', + component: () => import('@/pages/permission/role/index.vue'), + name: 'role', + meta: { + title: '角色管理', //菜单标题 + hidden: false, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + } + }, + { + path: '/menu', + component: () => import('@/pages/permission/menu/index.vue'), + name: 'menu', + meta: { + title: '菜单管理', //菜单标题 + hidden: false, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏 + icon: 'Promotion' //菜单文字左侧的图标,支持element-plus全部图标 + } + } + ] + }, + { + //404 + path: '/404', + component: () => import('@/pages/404/index.vue'), + name: '404', + meta: { + title: '404', + hidden: true, + icon: 'DocumentDelete' + } + }, + { + //任意路由 + path: '/:pathMatch(.*)*', + redirect: '/404', + name: 'Any', + meta: { + title: '任意路由', + hidden: true, + icon: 'DataLine' + } + } +] diff --git a/src/stores/index.ts b/src/stores/index.ts new file mode 100644 index 0000000..f984eea --- /dev/null +++ b/src/stores/index.ts @@ -0,0 +1,6 @@ +//仓库大仓库 +import { createPinia } from 'pinia' +//创建大仓库 +const pinia = createPinia() +//对外暴露:入口文件需要安装仓库 +export default pinia diff --git a/src/stores/modules/setting.ts b/src/stores/modules/setting.ts new file mode 100644 index 0000000..18c8c8f --- /dev/null +++ b/src/stores/modules/setting.ts @@ -0,0 +1,13 @@ +//小仓库:layout组件相关配置仓库 +import { defineStore } from 'pinia' + +const useLayOutSettingStore = defineStore('SettingStore', { + state: () => { + return { + fold: false, //用户控制菜单折叠还是收起控制 + refsh: false //仓库这个属性用于控制刷新效果 + } + } +}) + +export default useLayOutSettingStore diff --git a/src/stores/modules/user.ts b/src/stores/modules/user.ts new file mode 100644 index 0000000..5719f30 --- /dev/null +++ b/src/stores/modules/user.ts @@ -0,0 +1,42 @@ +//创建用户相关的小仓库 +import { defineStore } from 'pinia' +import { reqLogin } from '@/api/user' +import type { loginFormData, loginResponseData } from '@/api/user/type' +//引入路由(常量路由) +import { constantRoute } from '@/router/routes' + +//创建用户小仓库 +const useUserStore = defineStore('User', { + //小仓库存储数据地方 + state: () => { + return { + token: localStorage.getItem('TOKEN'), //用户唯一标识token + menuRoutes: constantRoute, //仓库存储生成菜单需要数组(路由) + username: 'sdy', + avatar: 'https://q4.itc.cn/q_70/images03/20240528/298d4abda5e4469d98fa77e7cde46525.jpeg' + } + }, + //异步|逻辑的地方 + actions: { + // 用户登录的方法 + async userLogin(data: loginFormData) { + //登录请求 + const result: loginResponseData = await reqLogin(data) + //登录请求:成功200->token + //登录请求:失败201->登录失败错误的信息 + if (result.code == 200) { + //pinia仓库存储一下token + this.token = result.data as string + //本地存储持久化存储一份 + localStorage.setItem('TOKEN', (result.data as any).token) + //能保证当前async函数返回一个成功的promise + return 'ok' + } else { + return Promise.reject(new Error(result.data)) + } + } + }, + getters: {} +}) +//对外暴露获取小仓库方法 +export default useUserStore diff --git a/src/style/index.scss b/src/style/index.scss new file mode 100644 index 0000000..efb4a4d --- /dev/null +++ b/src/style/index.scss @@ -0,0 +1,2 @@ +// 引入默认样式 +@import '@/style/reset.scss'; diff --git a/src/style/reset.scss b/src/style/reset.scss new file mode 100644 index 0000000..7ef1676 --- /dev/null +++ b/src/style/reset.scss @@ -0,0 +1,186 @@ +*, +*:after, +*:before { + box-sizing: border-box; + + outline: none; +} + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + font: inherit; + font-size: 100%; + + margin: 0; + padding: 0; + + vertical-align: baseline; + + border: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} + +body { + line-height: 1; +} + +ol, +ul { + list-style: none; +} + +blockquote, +q { + quotes: none; + + &:before, + &:after { + content: ''; + content: none; + } +} + +sub, +sup { + font-size: 75%; + line-height: 0; + + position: relative; + + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +table { + border-spacing: 0; + border-collapse: collapse; +} + +input, +textarea, +button { + font-family: inhert; + font-size: inherit; + + color: inherit; +} + +select { + text-indent: 0.01px; + text-overflow: ''; + + border: 0; + border-radius: 0; + + -webkit-appearance: none; + -moz-appearance: none; +} + +select::-ms-expand { + display: none; +} + +code, +pre { + font-family: monospace, monospace; + font-size: 1em; +} diff --git a/src/style/variable.scss b/src/style/variable.scss new file mode 100644 index 0000000..c90b362 --- /dev/null +++ b/src/style/variable.scss @@ -0,0 +1,19 @@ +//项目提供scss全局变量 +//定义项目主题颜色 + +//左侧的菜单的宽度 +$base-menu-width: 260px; +//左侧菜单的背景颜色 +$base-menu-background: #001529; +$base-menu-min-width: 50px; + +// 顶部导航的高度 +$base-tabbar-height: 50px; + +//左侧菜单logo高度设置 +$base-menu-logo-height: 50px; + +//左侧菜单logo右侧文字大小 +$base-logo-title-fontSize: 20px; +//左侧菜单文字颜色 +$--active-color: red; diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..446ee71 --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,44 @@ +import axios from 'axios' +import { ElMessage } from 'element-plus' +//创建axios实例 +const request = axios.create({ + baseURL: import.meta.env.VITE_APP_BASE_API, + timeout: 5000 +}) +//请求拦截器 +request.interceptors.request.use((config) => { + return config +}) +//响应拦截器 +request.interceptors.response.use( + (response) => { + return response.data + }, + (error) => { + //处理网络错误 + let msg = '' + const status = error.response.status + switch (status) { + case 401: + msg = 'token过期' + break + case 403: + msg = '无权访问' + break + case 404: + msg = '请求地址错误' + break + case 500: + msg = '服务器出现问题' + break + default: + msg = '无网络' + } + ElMessage({ + type: 'error', + message: msg + }) + return Promise.reject(error) + } +) +export default request diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..477446d --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,15 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "types": ["element-plus/global"], + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..f094063 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..0c4c7b2 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,29 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import { viteMockServe } from 'vite-plugin-mock' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + viteMockServe({ + mockPath: 'mock', + enable: true + }) + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + }, + css: { + preprocessorOptions: { + scss: { + javascriptEnabled: true, + additionalData: '@import "@/style/variable.scss";' + } + } + } +})