From ea42900d019d52fa458e9258c7b703c6a8f9bec2 Mon Sep 17 00:00:00 2001 From: landaiqing Date: Mon, 15 Sep 2025 23:55:27 +0800 Subject: [PATCH] :tada: initial commit --- .env | 0 .env.development | 10 + .env.production | 10 + .gitignore | 24 + .vscode/extensions.json | 3 + README.md | 5 + components.d.ts | 109 + eslint.config.ts | 59 + index.html | 13 + package-lock.json | 5267 +++++++++++++++++ package.json | 43 + public/vite.svg | 1 + src/App.vue | 78 + src/apis/auth.ts | 64 + src/apis/banners.ts | 116 + src/apis/classes.ts | 108 + src/apis/grades.ts | 65 + src/apis/login.ts | 51 + src/apis/profile.ts | 43 + src/apis/questions.ts | 151 + src/apis/records.ts | 120 + src/apis/schools.ts | 237 + src/apis/users.ts | 85 + src/assets/styles/index.scss | 1 + src/assets/vue.svg | 1 + src/components/RichEditor.vue | 334 ++ src/components/layout/AdminHeader.vue | 177 + src/components/layout/AdminLayout.vue | 130 + src/components/layout/AdminSidebar.vue | 191 + src/main.ts | 13 + src/mocks/auth.mock.ts | 128 + src/mocks/banners.mock.ts | 246 + src/mocks/classes.mock.ts | 336 ++ src/mocks/common.mock.ts | 26 + src/mocks/grades.mock.ts | 214 + src/mocks/index.mock.ts | 42 + src/mocks/profile.mock.ts | 104 + src/mocks/questions.mock.ts | 297 + src/mocks/records.mock.ts | 421 ++ src/mocks/schools.mock.ts | 462 ++ src/mocks/users.mock.ts | 266 + src/router/index.ts | 151 + src/stores/auth.ts | 71 + .../adapter/localforageStorageAdapter.ts | 17 + src/utils/request/index.ts | 133 + src/views/auth/LoginPage.vue | 373 ++ src/views/banners/BannerPage.vue | 242 + src/views/banners/components/BannerForm.vue | 416 ++ src/views/banners/components/BannerList.vue | 444 ++ src/views/classes/ClassPage.vue | 438 ++ .../classes/components/ClassBatchImport.vue | 367 ++ .../classes/components/ClassFormModal.vue | 266 + .../classes/components/ClassStudentsModal.vue | 287 + .../classes/components/StudentFormModal.vue | 213 + src/views/dashboard/DashboardPage.vue | 106 + src/views/grades/GradePage.vue | 344 ++ .../grades/components/GradeFormModal.vue | 206 + src/views/profile/PasswordPage.vue | 359 ++ src/views/profile/ProfilePage.vue | 362 ++ src/views/questions/QuestionPage.vue | 281 + .../questions/components/BatchOperations.vue | 190 + .../questions/components/ImportExport.vue | 354 ++ .../questions/components/QuestionForm.vue | 487 ++ .../questions/components/QuestionList.vue | 321 + src/views/records/RecordPage.vue | 343 ++ .../records/components/RecordDetailModal.vue | 468 ++ src/views/records/components/RecordList.vue | 409 ++ .../records/components/StatisticsCards.vue | 384 ++ src/views/schools/SchoolPage.vue | 402 ++ src/views/schools/components/BatchImport.vue | 571 ++ src/views/schools/components/ClassForm.vue | 390 ++ src/views/schools/components/GradeForm.vue | 374 ++ src/views/schools/components/SchoolForm.vue | 347 ++ src/views/schools/components/SchoolTree.vue | 549 ++ src/views/users/UserPage.vue | 355 ++ .../users/components/UserDetailModal.vue | 373 ++ src/views/users/components/UserList.vue | 363 ++ src/vite-env.d.ts | 23 + tsconfig.app.json | 24 + tsconfig.json | 7 + tsconfig.node.json | 25 + vite.config.ts | 86 + 82 files changed, 21972 insertions(+) create mode 100644 .env create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 components.d.ts create mode 100644 eslint.config.ts create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/vite.svg create mode 100644 src/App.vue create mode 100644 src/apis/auth.ts create mode 100644 src/apis/banners.ts create mode 100644 src/apis/classes.ts create mode 100644 src/apis/grades.ts create mode 100644 src/apis/login.ts create mode 100644 src/apis/profile.ts create mode 100644 src/apis/questions.ts create mode 100644 src/apis/records.ts create mode 100644 src/apis/schools.ts create mode 100644 src/apis/users.ts create mode 100644 src/assets/styles/index.scss create mode 100644 src/assets/vue.svg create mode 100644 src/components/RichEditor.vue create mode 100644 src/components/layout/AdminHeader.vue create mode 100644 src/components/layout/AdminLayout.vue create mode 100644 src/components/layout/AdminSidebar.vue create mode 100644 src/main.ts create mode 100644 src/mocks/auth.mock.ts create mode 100644 src/mocks/banners.mock.ts create mode 100644 src/mocks/classes.mock.ts create mode 100644 src/mocks/common.mock.ts create mode 100644 src/mocks/grades.mock.ts create mode 100644 src/mocks/index.mock.ts create mode 100644 src/mocks/profile.mock.ts create mode 100644 src/mocks/questions.mock.ts create mode 100644 src/mocks/records.mock.ts create mode 100644 src/mocks/schools.mock.ts create mode 100644 src/mocks/users.mock.ts create mode 100644 src/router/index.ts create mode 100644 src/stores/auth.ts create mode 100644 src/utils/request/adapter/localforageStorageAdapter.ts create mode 100644 src/utils/request/index.ts create mode 100644 src/views/auth/LoginPage.vue create mode 100644 src/views/banners/BannerPage.vue create mode 100644 src/views/banners/components/BannerForm.vue create mode 100644 src/views/banners/components/BannerList.vue create mode 100644 src/views/classes/ClassPage.vue create mode 100644 src/views/classes/components/ClassBatchImport.vue create mode 100644 src/views/classes/components/ClassFormModal.vue create mode 100644 src/views/classes/components/ClassStudentsModal.vue create mode 100644 src/views/classes/components/StudentFormModal.vue create mode 100644 src/views/dashboard/DashboardPage.vue create mode 100644 src/views/grades/GradePage.vue create mode 100644 src/views/grades/components/GradeFormModal.vue create mode 100644 src/views/profile/PasswordPage.vue create mode 100644 src/views/profile/ProfilePage.vue create mode 100644 src/views/questions/QuestionPage.vue create mode 100644 src/views/questions/components/BatchOperations.vue create mode 100644 src/views/questions/components/ImportExport.vue create mode 100644 src/views/questions/components/QuestionForm.vue create mode 100644 src/views/questions/components/QuestionList.vue create mode 100644 src/views/records/RecordPage.vue create mode 100644 src/views/records/components/RecordDetailModal.vue create mode 100644 src/views/records/components/RecordList.vue create mode 100644 src/views/records/components/StatisticsCards.vue create mode 100644 src/views/schools/SchoolPage.vue create mode 100644 src/views/schools/components/BatchImport.vue create mode 100644 src/views/schools/components/ClassForm.vue create mode 100644 src/views/schools/components/GradeForm.vue create mode 100644 src/views/schools/components/SchoolForm.vue create mode 100644 src/views/schools/components/SchoolTree.vue create mode 100644 src/views/users/UserPage.vue create mode 100644 src/views/users/components/UserDetailModal.vue create mode 100644 src/views/users/components/UserList.vue create mode 100644 src/vite-env.d.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 b/.env new file mode 100644 index 0000000..e69de29 diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..1171a73 --- /dev/null +++ b/.env.development @@ -0,0 +1,10 @@ +# 开发环境配置 +VITE_NODE_ENV='development' + +# 开发环境 +VITE_APP_BASE_API='/api' + +# 网络请求公用地址 +VITE_API_BASE_URL='' + + diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..752e9a9 --- /dev/null +++ b/.env.production @@ -0,0 +1,10 @@ +# 开发环境配置 +VITE_NODE_ENV='production' + +# 开发环境 +VITE_APP_BASE_API='/api' + +# 网络请求公用地址 +VITE_API_BASE_URL='' + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f4ece1d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5267 @@ +{ + "name": "zhuzi-admin", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "zhuzi-admin", + "version": "0.0.0", + "dependencies": { + "@alova/adapter-axios": "^2.0.16", + "@alova/mock": "^2.0.17", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "alova": "^3.3.4", + "ant-design-vue": "^4.2.6", + "axios": "^1.12.2", + "date-fns": "^4.1.0", + "localforage": "^1.10.0", + "pinia": "^3.0.3", + "pinia-plugin-persistedstate": "^4.5.0", + "sass": "^1.92.1", + "vue": "^3.5.18", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@eslint/js": "^9.35.0", + "@types/node": "^24.4.0", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.35.0", + "eslint-plugin-vue": "^10.4.0", + "globals": "^16.4.0", + "jiti": "^2.5.1", + "typescript": "~5.8.3", + "typescript-eslint": "^8.43.0", + "unplugin-vue-components": "^29.0.0", + "vite": "^7.1.2", + "vue-eslint-parser": "^10.2.0", + "vue-tsc": "^3.0.5" + } + }, + "node_modules/@alova/adapter-axios": { + "version": "2.0.16", + "resolved": "https://registry.npmmirror.com/@alova/adapter-axios/-/adapter-axios-2.0.16.tgz", + "integrity": "sha512-O9iskfllA8Yd5QV7w/c2aBduf1ocpD5goXp3aJbBXovZanKbsgMyvuFycXmTeqPyLdjURo5fYicEmWHwURpkbQ==", + "license": "MIT", + "dependencies": { + "@alova/shared": "1.3.1" + }, + "peerDependencies": { + "alova": "^3.0.20", + "axios": ">=0.4.0" + } + }, + "node_modules/@alova/mock": { + "version": "2.0.17", + "resolved": "https://registry.npmmirror.com/@alova/mock/-/mock-2.0.17.tgz", + "integrity": "sha512-Zf+I7AE0/vIt/pv0S25cqw6G+yX0uIJAdzRMkRvFVKGspPHnBZ+a43/8lT1bKdLsvPweydqC7jACCv1JThd3IQ==", + "license": "MIT", + "dependencies": { + "@alova/shared": "1.3.1" + }, + "peerDependencies": { + "alova": "^3.0.20" + } + }, + "node_modules/@alova/shared": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@alova/shared/-/shared-1.3.1.tgz", + "integrity": "sha512-ijSOaFLUFcVzMKSY3avoEE5C03/p9atjMDPBwvNkwnzaCrhv6/m4A121NdadF8YlHCRuifyYfz90IyEdMXTsJg==", + "license": "MIT" + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.35.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz", + "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz", + "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz", + "integrity": "sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz", + "integrity": "sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz", + "integrity": "sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz", + "integrity": "sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz", + "integrity": "sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz", + "integrity": "sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz", + "integrity": "sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz", + "integrity": "sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz", + "integrity": "sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz", + "integrity": "sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz", + "integrity": "sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz", + "integrity": "sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz", + "integrity": "sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz", + "integrity": "sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz", + "integrity": "sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz", + "integrity": "sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz", + "integrity": "sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz", + "integrity": "sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz", + "integrity": "sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "license": "MIT", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@transloadit/prettier-bytes": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", + "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.4.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.4.0.tgz", + "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.11.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz", + "integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/type-utils": "8.43.0", + "@typescript-eslint/utils": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.43.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.43.0.tgz", + "integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.43.0.tgz", + "integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.43.0", + "@typescript-eslint/types": "^8.43.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz", + "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.43.0.tgz", + "integrity": "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz", + "integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/utils": "8.43.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.43.0.tgz", + "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz", + "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.43.0", + "@typescript-eslint/tsconfig-utils": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.43.0.tgz", + "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz", + "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.43.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@uppy/companion-client": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz", + "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^4.1.2", + "namespace-emitter": "^2.0.1" + } + }, + "node_modules/@uppy/core": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz", + "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", + "license": "MIT", + "dependencies": { + "@transloadit/prettier-bytes": "0.0.7", + "@uppy/store-default": "^2.1.1", + "@uppy/utils": "^4.1.3", + "lodash.throttle": "^4.1.1", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^3.1.25", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/store-default": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz", + "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==", + "license": "MIT" + }, + "node_modules/@uppy/utils": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz", + "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==", + "license": "MIT", + "dependencies": { + "lodash.throttle": "^4.1.1" + } + }, + "node_modules/@uppy/xhr-upload": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", + "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", + "license": "MIT", + "dependencies": { + "@uppy/companion-client": "^2.2.2", + "@uppy/utils": "^4.1.2", + "nanoid": "^3.1.25" + }, + "peerDependencies": { + "@uppy/core": "^2.3.3" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.23", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.23.tgz", + "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.23" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.23", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.23.tgz", + "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.23", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.23.tgz", + "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.23", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.21.tgz", + "integrity": "sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/shared": "3.5.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz", + "integrity": "sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.21", + "@vue/shared": "3.5.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz", + "integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/compiler-core": "3.5.21", + "@vue/compiler-dom": "3.5.21", + "@vue/compiler-ssr": "3.5.21", + "@vue/shared": "3.5.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.18", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.21.tgz", + "integrity": "sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.21", + "@vue/shared": "3.5.21" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.0.7.tgz", + "integrity": "sha512-0sqqyqJ0Gn33JH3TdIsZLCZZ8Gr4kwlg8iYOnOrDDkJKSjFurlQY/bEFQx5zs7SX2C/bjMkmPYq/NiyY1fTOkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.23", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^2.0.5", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.21.tgz", + "integrity": "sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.21.tgz", + "integrity": "sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.21", + "@vue/shared": "3.5.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.21.tgz", + "integrity": "sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.21", + "@vue/runtime-core": "3.5.21", + "@vue/shared": "3.5.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.21.tgz", + "integrity": "sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.21", + "@vue/shared": "3.5.21" + }, + "peerDependencies": { + "vue": "3.5.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.21.tgz", + "integrity": "sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz", + "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@wangeditor/basic-modules": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", + "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", + "license": "MIT", + "dependencies": { + "is-url": "^1.2.4" + }, + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.throttle": "^4.1.1", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/code-highlight": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz", + "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.23.0" + }, + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/core": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz", + "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", + "license": "MIT", + "dependencies": { + "@types/event-emitter": "^0.3.3", + "event-emitter": "^0.3.5", + "html-void-elements": "^2.0.0", + "i18next": "^20.4.0", + "scroll-into-view-if-needed": "^2.2.28", + "slate-history": "^0.66.0" + }, + "peerDependencies": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/editor": { + "version": "5.1.23", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz", + "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==", + "license": "MIT", + "dependencies": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "^1.1.7", + "@wangeditor/code-highlight": "^1.0.3", + "@wangeditor/core": "^1.1.19", + "@wangeditor/list-module": "^1.0.5", + "@wangeditor/table-module": "^1.1.4", + "@wangeditor/upload-image-module": "^1.0.2", + "@wangeditor/video-module": "^1.1.4", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/editor-for-vue": { + "version": "5.1.12", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz", + "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==", + "license": "MIT", + "peerDependencies": { + "@wangeditor/editor": ">=5.1.0", + "vue": "^3.0.5" + } + }, + "node_modules/@wangeditor/list-module": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz", + "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==", + "license": "MIT", + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/table-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz", + "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==", + "license": "MIT", + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/upload-image-module": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz", + "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==", + "license": "MIT", + "peerDependencies": { + "@uppy/core": "^2.0.3", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "1.x", + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.foreach": "^4.5.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/video-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz", + "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==", + "license": "MIT", + "peerDependencies": { + "@uppy/core": "^2.1.4", + "@uppy/xhr-upload": "^2.0.7", + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-2.0.7.tgz", + "integrity": "sha512-wE7y3jmYeb0+h6mr5BOovuqhFv22O/MV9j5p0ndJsa7z1zJNPGQ4ph5pQk/kTTCWRC3xsA4SmtwmkzQO+7NCNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/alova": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/alova/-/alova-3.3.4.tgz", + "integrity": "sha512-UKKqXdvf8aQ4C7m3brO77YWe5CDz8N59PdAUz7M8gowKUUXTutbk0Vk5DRBrCe0hMUyyNMUhdCZ38llGxCViyQ==", + "license": "MIT", + "dependencies": { + "@alova/shared": "1.3.1", + "rate-limiter-flexible": "^5.0.3" + }, + "engines": { + "node": ">= 18.0.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ant-design-vue": { + "version": "4.2.6", + "resolved": "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-4.2.6.tgz", + "integrity": "sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "license": "MIT" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.5.0.tgz", + "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-pick-omit": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz", + "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==", + "license": "MIT" + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==", + "license": "MIT" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==", + "license": "MIT" + }, + "node_modules/dom7": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz", + "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", + "license": "MIT", + "dependencies": { + "ssr-window": "^3.0.0-alpha.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.35.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.35.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.4.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", + "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmmirror.com/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/i18next": { + "version": "20.6.1", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz", + "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "license": "MIT" + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "license": "ISC", + "dependencies": { + "wildcard": "^1.1.0" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanopop": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persistedstate": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.5.0.tgz", + "integrity": "sha512-QTkP1xJVyCdr2I2p3AKUZM84/e+IS+HktRxKGAIuDzkyaKKV48mQcYkJFVVDuvTxlI5j6X3oZObpqoVB8JnWpw==", + "license": "MIT", + "dependencies": { + "deep-pick-omit": "^1.2.1", + "defu": "^6.1.4", + "destr": "^2.0.5" + }, + "peerDependencies": { + "@nuxt/kit": ">=3.0.0", + "@pinia/nuxt": ">=0.10.0", + "pinia": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@pinia/nuxt": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/preact": { + "version": "10.27.2", + "resolved": "https://registry.npmmirror.com/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rate-limiter-flexible": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/rate-limiter-flexible/-/rate-limiter-flexible-5.0.5.tgz", + "integrity": "sha512-+/dSQfo+3FYwYygUs/V2BBdwGa9nFtakDwKt4l0bnvNB53TNT++QSFewwHX9qXrZJuMe9j+TUaU21lm5ARgqdQ==", + "license": "ISC" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.50.2", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.50.2.tgz", + "integrity": "sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.2", + "@rollup/rollup-android-arm64": "4.50.2", + "@rollup/rollup-darwin-arm64": "4.50.2", + "@rollup/rollup-darwin-x64": "4.50.2", + "@rollup/rollup-freebsd-arm64": "4.50.2", + "@rollup/rollup-freebsd-x64": "4.50.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.2", + "@rollup/rollup-linux-arm-musleabihf": "4.50.2", + "@rollup/rollup-linux-arm64-gnu": "4.50.2", + "@rollup/rollup-linux-arm64-musl": "4.50.2", + "@rollup/rollup-linux-loong64-gnu": "4.50.2", + "@rollup/rollup-linux-ppc64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-musl": "4.50.2", + "@rollup/rollup-linux-s390x-gnu": "4.50.2", + "@rollup/rollup-linux-x64-gnu": "4.50.2", + "@rollup/rollup-linux-x64-musl": "4.50.2", + "@rollup/rollup-openharmony-arm64": "4.50.2", + "@rollup/rollup-win32-arm64-msvc": "4.50.2", + "@rollup/rollup-win32-ia32-msvc": "4.50.2", + "@rollup/rollup-win32-x64-msvc": "4.50.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.92.1", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.92.1.tgz", + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slate": { + "version": "0.72.8", + "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz", + "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", + "license": "MIT", + "dependencies": { + "immer": "^9.0.6", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "node_modules/slate-history": { + "version": "0.66.0", + "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz", + "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/slate-history/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slate/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snabbdom": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz", + "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==", + "license": "MIT", + "engines": { + "node": ">=12.17.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssr-window": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz", + "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==", + "license": "MIT" + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.43.0", + "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.43.0.tgz", + "integrity": "sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.43.0", + "@typescript-eslint/parser": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/utils": "8.43.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.11.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.11.0.tgz", + "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "2.3.10", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.10.tgz", + "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz", + "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "29.0.0", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-29.0.0.tgz", + "integrity": "sha512-M2DX44g4/jvBkB0V6uwqTbkTd5DMRHpeGoi/cIKwGG4HPuNxLbe8zoTStB2n12hoDiWc9I1PIRQruRWExNXHlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "tinyglobby": "^0.2.14", + "unplugin": "^2.3.5", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/unplugin-vue-components/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/unplugin-vue-components/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-vue-components/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.5", + "resolved": "https://registry.npmmirror.com/vite/-/vite-7.1.5.tgz", + "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.21.tgz", + "integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.21", + "@vue/compiler-sfc": "3.5.21", + "@vue/runtime-dom": "3.5.21", + "@vue/server-renderer": "3.5.21", + "@vue/shared": "3.5.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.2.0", + "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", + "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.5.1", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-tsc": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.0.7.tgz", + "integrity": "sha512-BSMmW8GGEgHykrv7mRk6zfTdK+tw4MBZY/x6fFa7IkdXK3s/8hQRacPjG9/8YKFDIWGhBocwi6PlkQQ/93OgIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.23", + "@vue/language-core": "3.0.7" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "license": "MIT", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..469c062 --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "name": "zhuzi-admin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@alova/adapter-axios": "^2.0.16", + "@alova/mock": "^2.0.17", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "alova": "^3.3.4", + "ant-design-vue": "^4.2.6", + "axios": "^1.12.2", + "date-fns": "^4.1.0", + "localforage": "^1.10.0", + "pinia": "^3.0.3", + "pinia-plugin-persistedstate": "^4.5.0", + "sass": "^1.92.1", + "vue": "^3.5.18", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@eslint/js": "^9.35.0", + "@types/node": "^24.4.0", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.35.0", + "eslint-plugin-vue": "^10.4.0", + "globals": "^16.4.0", + "jiti": "^2.5.1", + "typescript": "~5.8.3", + "typescript-eslint": "^8.43.0", + "unplugin-vue-components": "^29.0.0", + "vite": "^7.1.2", + "vue-eslint-parser": "^10.2.0", + "vue-tsc": "^3.0.5" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..5077c52 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/apis/auth.ts b/src/apis/auth.ts new file mode 100644 index 0000000..e64a686 --- /dev/null +++ b/src/apis/auth.ts @@ -0,0 +1,64 @@ +import { request } from "@/utils/request"; + +/** + * 登录请求参数 + */ +export interface LoginParams { + username: string; + password: string; +} + +/** + * 登录响应数据 + */ +export interface LoginResponse { + token: string; + refreshToken: string; + userInfo: { + id: string; + username: string; + nickname: string; + avatar?: string; + role: 'admin' | 'operator'; + createTime: string; + }; +} + + +/** + * 管理员登录 + */ +export const adminLogin = (params: LoginParams) => { + return request.Post('/admin/auth/login', params, { + meta: { + ignoreToken: true, + } + }); +}; + + +/** + * 获取当前用户信息 + */ +export const getCurrentUser = () => { + return request.Get('/admin/auth/profile'); +}; + +/** + * 管理员退出登录 + */ +export const adminLogout = () => { + return request.Post('/admin/auth/logout'); +}; + +/** + * 刷新token + */ +export const refreshAdminToken = () => { + return request.Post('/admin/auth/refresh-token', {}, { + meta: { + authRole: 'refreshToken', + ignoreToken: false, + } + }); +}; diff --git a/src/apis/banners.ts b/src/apis/banners.ts new file mode 100644 index 0000000..75ed8ee --- /dev/null +++ b/src/apis/banners.ts @@ -0,0 +1,116 @@ +import { request } from "@/utils/request"; + +/** + * 轮播图链接类型 + */ +export type BannerLinkType = 'url' | 'article'; + +/** + * 轮播图数据 + */ +export interface Banner { + id: string; + title: string; + image: string; + linkType: BannerLinkType; + linkUrl?: string; + articleContent?: string; + sort: number; + status: 'enabled' | 'disabled'; + createTime: string; + updateTime: string; +} + +/** + * 轮播图列表查询参数 + */ +export interface BannerQueryParams { + page?: number; + pageSize?: number; + status?: 'enabled' | 'disabled'; + keyword?: string; +} + +/** + * 轮播图列表响应 + */ +export interface BannerListResponse { + list: Banner[]; + total: number; + page: number; + pageSize: number; +} + +/** + * 创建轮播图参数 + */ +export interface CreateBannerParams { + title: string; + image: string; + linkType: BannerLinkType; + linkUrl?: string; + articleContent?: string; + sort: number; + status: 'enabled' | 'disabled'; +} + +/** + * 获取轮播图列表 + */ +export const getBannerList = (params?: BannerQueryParams) => { + return request.Get('/admin/banners', { + params + }); +}; + +/** + * 获取轮播图详情 + */ +export const getBannerDetail = (id: string) => { + return request.Get(`/admin/banners/${id}`); +}; + +/** + * 创建轮播图 + */ +export const createBanner = (params: CreateBannerParams) => { + return request.Post<{ message: string; id: string }>('/admin/banners', params); +}; + +/** + * 更新轮播图 + */ +export const updateBanner = (id: string, params: CreateBannerParams) => { + return request.Put<{ message: string }>(`/admin/banners/${id}`, params); +}; + +/** + * 删除轮播图 + */ +export const deleteBanner = (id: string) => { + return request.Delete<{ message: string }>(`/admin/banners/${id}`); +}; + +/** + * 更新轮播图状态 + */ +export const updateBannerStatus = (id: string, status: 'enabled' | 'disabled') => { + return request.Put<{ message: string }>(`/admin/banners/${id}/status`, { status }); +}; + +/** + * 更新轮播图排序 + */ +export const updateBannerSort = (id: string, sort: number) => { + return request.Put<{ message: string }>(`/admin/banners/${id}/sort`, { sort }); +}; + +/** + * 上传轮播图图片 + */ +export const uploadBannerImage = (file: File) => { + const formData = new FormData(); + formData.append('image', file); + + return request.Post<{ url: string }>('/admin/upload/banner', formData); +}; diff --git a/src/apis/classes.ts b/src/apis/classes.ts new file mode 100644 index 0000000..f0fe92a --- /dev/null +++ b/src/apis/classes.ts @@ -0,0 +1,108 @@ +import { request } from '@/utils/request'; + +/** + * 获取班级列表 + */ +export const getClasses = (params: { + schoolId: string; + gradeId: string; + page?: number; + pageSize?: number; + keyword?: string; +}) => { + return request.Get('/admin/classes', { + params + }); +}; + +/** + * 创建班级 + */ +export const createClass = (data: { + name: string; + code: string; + schoolId: string; + gradeId: string; + teacherName?: string; + teacherPhone?: string; + classroom?: string; + sort?: number; + maxStudents?: number; + enrollmentYear?: number; + description?: string; + status?: string; +}) => { + return request.Post('/admin/classes', data); +}; + +/** + * 更新班级 + */ +export const updateClass = (id: string, data: { + name?: string; + code?: string; + teacherName?: string; + teacherPhone?: string; + classroom?: string; + sort?: number; + maxStudents?: number; + enrollmentYear?: number; + description?: string; + status?: string; +}) => { + return request.Put(`/admin/classes/${id}`, data); +}; + +/** + * 删除班级 + */ +export const deleteClass = (id: string) => { + return request.Delete(`/admin/classes/${id}`); +}; + +/** + * 切换班级状态 + */ +export const toggleClassStatus = (id: string) => { + return request.Patch(`/admin/classes/${id}/toggle-status`); +}; + +/** + * 获取班级详情 + */ +export const getClassDetail = (id: string) => { + return request.Get(`/admin/classes/${id}`); +}; + +/** + * 获取班级学生列表 + */ +export const getClassStudents = (classId: string, params?: { + page?: number; + pageSize?: number; + keyword?: string; +}) => { + return request.Get(`/admin/classes/${classId}/students`, { + params + }); +}; + +/** + * 批量导入班级 + */ +export const importClasses = (data: { + schoolId: string; + gradeId: string; + file: File; +}) => { + const formData = new FormData(); + formData.append('schoolId', data.schoolId); + formData.append('gradeId', data.gradeId); + formData.append('file', data.file); + + return request.Post('/admin/classes/import', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +}; diff --git a/src/apis/grades.ts b/src/apis/grades.ts new file mode 100644 index 0000000..8c9b4c2 --- /dev/null +++ b/src/apis/grades.ts @@ -0,0 +1,65 @@ +import { request } from '@/utils/request'; + +/** + * 获取年级列表 + */ +export const getGrades = (params: { + schoolId: string; + page?: number; + pageSize?: number; + keyword?: string; +}) => { + return request.Get('/admin/grades', { + params + }); +}; + +/** + * 创建年级 + */ +export const createGrade = (data: { + name: string; + code: string; + schoolId: string; + duration?: number; + sort?: number; + description?: string; + status?: string; +}) => { + return request.Post('/admin/grades', data); +}; + +/** + * 更新年级 + */ +export const updateGrade = (id: string, data: { + name?: string; + code?: string; + duration?: number; + sort?: number; + description?: string; + status?: string; +}) => { + return request.Put(`/admin/grades/${id}`, data); +}; + +/** + * 删除年级 + */ +export const deleteGrade = (id: string) => { + return request.Delete(`/admin/grades/${id}`); +}; + +/** + * 切换年级状态 + */ +export const toggleGradeStatus = (id: string) => { + return request.Patch(`/admin/grades/${id}/toggle-status`); +}; + +/** + * 获取年级详情 + */ +export const getGradeDetail = (id: string) => { + return request.Get(`/admin/grades/${id}`); +}; diff --git a/src/apis/login.ts b/src/apis/login.ts new file mode 100644 index 0000000..1b6e08c --- /dev/null +++ b/src/apis/login.ts @@ -0,0 +1,51 @@ +import {request} from "@/utils/request"; +/** + * 刷新token post演示接口 + */ +export const refreshToken = () => { + return request.Post('/api/auth/token/refresh', {}, { + meta: { + authRole: 'refreshToken', + ignoreToken: false, + signature: true + } + }); +}; + +/** + * 获取Gitee登录链接 get演示接口 + */ +export const getGiteeUrl = () => { + return request.Get('/api/oauth/gitee/url', + { + meta: { + ignoreToken: true, + }, + cacheFor: { + mode: "restore", + expire: 1000 * 60 * 60 * 24 + } + } + ); +}; + +/** + * 使用方式: + * 请注意,useRequest只能用于组件内发送请求,在组件外,你可以通过 method 实例直接发送请求,并且 useRequest 的使用需要符合 use hook 使用规则,即只能在函数最外层调用。 + * + * ❌❌❌ 不推荐在在循环、条件判断或者子函数中调用,例如以下在 click 回调中的使用示例,在回调函数中使用时,虽然可以正常发起请求,但 use hook 返回的响应式数据无法在视图中使用,循环和条件判断中使用也是如此。 + * + * // ❌ bad + * const handleClick = () => { + * const { loading, data } = useRequest(getter); + * }; + * + * // ------- + * // ✅ good + * const { loading, data, send } = useRequest(getter, { + * immediate: false + * }); + * const handleClick = () => { + * send(); + * }; + */ \ No newline at end of file diff --git a/src/apis/profile.ts b/src/apis/profile.ts new file mode 100644 index 0000000..f50c838 --- /dev/null +++ b/src/apis/profile.ts @@ -0,0 +1,43 @@ +import { request } from '@/utils/request'; + +/** + * 获取用户资料 + */ +export const getUserProfile = () => { + return request.Get('/admin/profile'); +}; + +/** + * 更新用户资料 + */ +export const updateUserProfile = (data: { + realName?: string; + phone?: string; + email?: string; + gender?: string; + birthday?: string; + bio?: string; +}) => { + return request.Put('/admin/profile', data); +}; + +/** + * 上传头像 + */ +export const uploadAvatar = (formData: FormData) => { + return request.Post('/admin/profile/avatar', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +}; + +/** + * 修改密码 + */ +export const changePassword = (data: { + oldPassword: string; + newPassword: string; +}) => { + return request.Post('/admin/profile/password', data); +}; diff --git a/src/apis/questions.ts b/src/apis/questions.ts new file mode 100644 index 0000000..2bfd6c6 --- /dev/null +++ b/src/apis/questions.ts @@ -0,0 +1,151 @@ +import { request } from "@/utils/request"; + +/** + * 题目类型 + */ +export type QuestionType = 'single' | 'multiple'; + +/** + * 题目选项 + */ +export interface QuestionOption { + key: string; + value: string; + isCorrect?: boolean; +} + +/** + * 题目数据 + */ +export interface Question { + id: string; + title: string; + content: string; + image?: string; + type: QuestionType; + options: QuestionOption[]; + correctAnswer: string[]; + score: number; + difficulty: 'easy' | 'medium' | 'hard'; + category: string; + tags: string[]; + createTime: string; + updateTime: string; +} + +/** + * 题目列表查询参数 + */ +export interface QuestionQueryParams { + page?: number; + pageSize?: number; + keyword?: string; + type?: QuestionType; + difficulty?: 'easy' | 'medium' | 'hard'; + category?: string; +} + +/** + * 题目列表响应 + */ +export interface QuestionListResponse { + list: Question[]; + total: number; + page: number; + pageSize: number; +} + +/** + * 创建题目参数 + */ +export interface CreateQuestionParams { + title: string; + content: string; + image?: string; + type: QuestionType; + options: QuestionOption[]; + correctAnswer: string[]; + score: number; + difficulty: 'easy' | 'medium' | 'hard'; + category: string; + tags: string[]; +} + +/** + * 批量导入题目参数 + */ +export interface ImportQuestionsParams { + file: File; +} + +/** + * 获取题目列表 + */ +export const getQuestionList = (params?: QuestionQueryParams) => { + return request.Get('/admin/questions', { + params + }); +}; + +/** + * 获取题目详情 + */ +export const getQuestionDetail = (id: string) => { + return request.Get(`/admin/questions/${id}`); +}; + +/** + * 创建题目 + */ +export const createQuestion = (params: CreateQuestionParams) => { + return request.Post<{ message: string; id: string }>('/admin/questions', params); +}; + +/** + * 更新题目 + */ +export const updateQuestion = (id: string, params: CreateQuestionParams) => { + return request.Put<{ message: string }>(`/admin/questions/${id}`, params); +}; + +/** + * 删除题目 + */ +export const deleteQuestion = (id: string) => { + return request.Delete<{ message: string }>(`/admin/questions/${id}`); +}; + +/** + * 批量删除题目 + */ +export const batchDeleteQuestions = (ids: string[]) => { + return request.Delete<{ message: string }>('/admin/questions/batch', { + data: { ids } + }); +}; + +/** + * 批量导入题目 + */ +export const importQuestions = (file: File) => { + const formData = new FormData(); + formData.append('file', file); + + return request.Post<{ message: string; successCount: number; failCount: number }>('/admin/questions/import', formData); +}; + +/** + * 导出题目模板 + */ +export const exportQuestionTemplate = () => { + return request.Get('/admin/questions/template', { + responseType: 'blob' + }); +}; + +/** + * 获取题目分类列表 + */ +export const getQuestionCategories = () => { + return request.Get<{ name: string; count: number }[]>('/admin/questions/categories'); +}; diff --git a/src/apis/records.ts b/src/apis/records.ts new file mode 100644 index 0000000..8da3132 --- /dev/null +++ b/src/apis/records.ts @@ -0,0 +1,120 @@ +import { request } from "@/utils/request"; + +/** + * 答题人类型 + */ +export type AnswererType = 'student' | 'parent'; + +/** + * 答题记录数据 + */ +export interface AnswerRecord { + id: string; + userId: string; + studentName: string; + parentPhone: string; + schoolName: string; + gradeName: string; + className: string; + answererType: AnswererType; + totalQuestions: number; + correctCount: number; + totalScore: number; + answerTime: number; // 答题用时(秒) + questionDetails: { + questionId: string; + questionTitle: string; + userAnswer: string[]; + correctAnswer: string[]; + isCorrect: boolean; + score: number; + timeSpent: number; + }[]; + createTime: string; +} + +/** + * 答题记录列表查询参数 + */ +export interface RecordQueryParams { + page?: number; + pageSize?: number; + keyword?: string; // 学生姓名关键词 + schoolName?: string; + gradeName?: string; + className?: string; + answererType?: AnswererType; + startTime?: string; + endTime?: string; +} + +/** + * 答题记录列表响应 + */ +export interface RecordListResponse { + list: AnswerRecord[]; + total: number; + page: number; + pageSize: number; +} + +/** + * 答题统计数据 + */ +export interface AnswerStatistics { + totalRecords: number; + totalUsers: number; + avgScore: number; + avgCorrectRate: number; + popularQuestions: { + questionId: string; + questionTitle: string; + answerCount: number; + correctRate: number; + }[]; + rankingData: { + schoolRanking: { name: string; avgScore: number }[]; + gradeRanking: { name: string; avgScore: number }[]; + classRanking: { name: string; avgScore: number }[]; + }; +} + +/** + * 获取答题记录列表 + */ +export const getRecordList = (params?: RecordQueryParams) => { + return request.Get('/admin/records', { + params + }); +}; + +/** + * 获取答题记录详情 + */ +export const getRecordDetail = (id: string) => { + return request.Get(`/admin/records/${id}`); +}; + +/** + * 获取答题统计数据 + */ +export const getAnswerStatistics = (params?: { + startTime?: string; + endTime?: string; + schoolName?: string; + gradeName?: string; +}) => { + return request.Get('/admin/records/statistics', { + params + }); +}; + +/** + * 导出答题记录 + */ +export const exportRecords = (params?: RecordQueryParams) => { + return request.Get('/admin/records/export', { + params, + responseType: 'blob' + }); +}; diff --git a/src/apis/schools.ts b/src/apis/schools.ts new file mode 100644 index 0000000..3a75b1f --- /dev/null +++ b/src/apis/schools.ts @@ -0,0 +1,237 @@ +import { request } from "@/utils/request"; + +/** + * 学校数据 + */ +export interface School { + id: string; + name: string; + address?: string; + principal?: string; + phone?: string; + district: string; // 区县 + type: 'primary' | 'junior' | 'senior' | 'vocational'; // 学校类型 + studentCount?: number; + grades?: Grade[]; + createTime: string; + updateTime: string; +} + +/** + * 年级数据 + */ +export interface Grade { + id: string; + schoolId: string; + name: string; + level: number; // 年级层级:1-6年级,7-9初中,10-12高中 + classes?: Class[]; + createTime: string; +} + +/** + * 班级数据 + */ +export interface Class { + id: string; + schoolId: string; + gradeId: string; + name: string; + teacherName?: string; + studentCount?: number; + createTime: string; +} + +/** + * 学校列表查询参数 + */ +export interface SchoolQueryParams { + page?: number; + pageSize?: number; + keyword?: string; + district?: string; + type?: 'primary' | 'junior' | 'senior' | 'vocational'; +} + +/** + * 学校列表响应 + */ +export interface SchoolListResponse { + list: School[]; + total: number; + page: number; + pageSize: number; +} + +/** + * 创建学校参数 + */ +export interface CreateSchoolParams { + name: string; + address?: string; + principal?: string; + phone?: string; + district: string; + type: 'primary' | 'junior' | 'senior' | 'vocational'; +} + +/** + * 创建年级参数 + */ +export interface CreateGradeParams { + schoolId: string; + name: string; + level: number; +} + +/** + * 创建班级参数 + */ +export interface CreateClassParams { + schoolId: string; + gradeId: string; + name: string; + teacherName?: string; +} + +/** + * 批量导入学校数据参数 + */ +export interface ImportSchoolData { + schools: { + name: string; + district: string; + type: 'primary' | 'junior' | 'senior' | 'vocational'; + grades: { + name: string; + level: number; + classes: { + name: string; + teacherName?: string; + }[]; + }[]; + }[]; +} + +// 学校相关接口 +/** + * 获取学校列表 + */ +export const getSchoolList = (params?: SchoolQueryParams) => { + return request.Get('/admin/schools', { + params + }); +}; + +/** + * 获取学校详情(包含年级班级) + */ +export const getSchoolDetail = (id: string) => { + return request.Get(`/admin/schools/${id}`); +}; + +/** + * 创建学校 + */ +export const createSchool = (params: CreateSchoolParams) => { + return request.Post<{ message: string; id: string }>('/admin/schools', params); +}; + +/** + * 更新学校 + */ +export const updateSchool = (id: string, params: CreateSchoolParams) => { + return request.Put<{ message: string }>(`/admin/schools/${id}`, params); +}; + +/** + * 删除学校 + */ +export const deleteSchool = (id: string) => { + return request.Delete<{ message: string }>(`/admin/schools/${id}`); +}; + +// 年级相关接口 +/** + * 获取年级列表 + */ +export const getGradeList = (schoolId: string) => { + return request.Get(`/admin/schools/${schoolId}/grades`); +}; + +/** + * 创建年级 + */ +export const createGrade = (params: CreateGradeParams) => { + return request.Post<{ message: string; id: string }>('/admin/grades', params); +}; + +/** + * 更新年级 + */ +export const updateGrade = (id: string, params: CreateGradeParams) => { + return request.Put<{ message: string }>(`/admin/grades/${id}`, params); +}; + +/** + * 删除年级 + */ +export const deleteGrade = (id: string) => { + return request.Delete<{ message: string }>(`/admin/grades/${id}`); +}; + +// 班级相关接口 +/** + * 获取班级列表 + */ +export const getClassList = (gradeId: string) => { + return request.Get(`/admin/grades/${gradeId}/classes`); +}; + +/** + * 创建班级 + */ +export const createClass = (params: CreateClassParams) => { + return request.Post<{ message: string; id: string }>('/admin/classes', params); +}; + +/** + * 更新班级 + */ +export const updateClass = (id: string, params: CreateClassParams) => { + return request.Put<{ message: string }>(`/admin/classes/${id}`, params); +}; + +/** + * 删除班级 + */ +export const deleteClass = (id: string) => { + return request.Delete<{ message: string }>(`/admin/classes/${id}`); +}; + +// 批量操作接口 +/** + * 批量导入学校数据 + */ +export const importSchoolData = (file: File) => { + const formData = new FormData(); + formData.append('file', file); + + return request.Post<{ message: string; successCount: number; failCount: number }>('/admin/schools/import', formData); +}; + +/** + * 导出学校数据模板 + */ +export const exportSchoolTemplate = () => { + return request.Get('/admin/schools/template', { + responseType: 'blob' + }); +}; + +/** + * 获取区县列表 + */ +export const getDistrictList = () => { + return request.Get<{ name: string; count: number }[]>('/admin/schools/districts'); +}; diff --git a/src/apis/users.ts b/src/apis/users.ts new file mode 100644 index 0000000..6cefc96 --- /dev/null +++ b/src/apis/users.ts @@ -0,0 +1,85 @@ +import { request } from "@/utils/request"; + +/** + * 小程序用户数据 + */ +export interface AppUser { + id: string; + openid: string; + phone: string; + avatar?: string; + nickname?: string; + studentId?: string; + studentName?: string; + schoolId: string; + schoolName: string; + gradeId: string; + gradeName: string; + classId: string; + className: string; + studentSeatNumber?: number; + totalScore: number; + answerCount: number; + lastAnswerTime?: string; + createTime: string; + updateTime: string; +} + +/** + * 用户列表查询参数 + */ +export interface UserQueryParams { + page?: number; + pageSize?: number; + keyword?: string; // 学生姓名或家长手机号 + schoolId?: string; + gradeId?: string; + classId?: string; +} + +/** + * 用户列表响应 + */ +export interface UserListResponse { + list: AppUser[]; + total: number; + page: number; + pageSize: number; +} + +/** + * 获取用户列表 + */ +export const getUserList = (params?: UserQueryParams) => { + return request.Get('/admin/users', { + params + }); +}; + +/** + * 获取用户详情 + */ +export const getUserDetail = (id: string) => { + return request.Get(`/admin/users/${id}`); +}; + +/** + * 解绑家长与学生关系 + */ +export const unbindParentStudent = (userId: string) => { + return request.Put<{ message: string }>(`/admin/users/${userId}/unbind`); +}; + +/** + * 禁用用户 + */ +export const disableUser = (userId: string) => { + return request.Put<{ message: string }>(`/admin/users/${userId}/disable`); +}; + +/** + * 启用用户 + */ +export const enableUser = (userId: string) => { + return request.Put<{ message: string }>(`/admin/users/${userId}/enable`); +}; diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/assets/styles/index.scss @@ -0,0 +1 @@ + diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/RichEditor.vue b/src/components/RichEditor.vue new file mode 100644 index 0000000..19d9219 --- /dev/null +++ b/src/components/RichEditor.vue @@ -0,0 +1,334 @@ + + + + + diff --git a/src/components/layout/AdminHeader.vue b/src/components/layout/AdminHeader.vue new file mode 100644 index 0000000..1861a4a --- /dev/null +++ b/src/components/layout/AdminHeader.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/components/layout/AdminLayout.vue b/src/components/layout/AdminLayout.vue new file mode 100644 index 0000000..1425a43 --- /dev/null +++ b/src/components/layout/AdminLayout.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/components/layout/AdminSidebar.vue b/src/components/layout/AdminSidebar.vue new file mode 100644 index 0000000..9668d87 --- /dev/null +++ b/src/components/layout/AdminSidebar.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..96f264e --- /dev/null +++ b/src/main.ts @@ -0,0 +1,13 @@ +import {createApp} from 'vue' +import App from './App.vue' + +import router from './router'; +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' +import {createPinia} from "pinia"; + +const pinia = createPinia() +pinia.use(piniaPluginPersistedstate) +const app = createApp(App); +app.use(pinia) +app.use(router); +app.mount('#app'); diff --git a/src/mocks/auth.mock.ts b/src/mocks/auth.mock.ts new file mode 100644 index 0000000..1f210f6 --- /dev/null +++ b/src/mocks/auth.mock.ts @@ -0,0 +1,128 @@ +import { defineMock } from '@alova/mock'; + +// 认证相关接口的mock数据 +export default defineMock({ + // 管理员登录 + '[POST]/admin/auth/login': ({ data }) => { + const { username, password } = data; + + // 模拟用户数据 + const mockAdmins = [ + { + id: '1', + username: 'admin', + password: '123456', + nickname: '系统管理员', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=admin', + role: 'admin', + createTime: '2023-01-01 00:00:00' + }, + { + id: '2', + username: 'operator', + password: '123456', + nickname: '运营人员', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=operator', + role: 'operator', + createTime: '2023-01-01 00:00:00' + } + ]; + + const admin = mockAdmins.find(user => user.username === username && user.password === password); + + if (!admin) { + return { + status: 401, + body: { + code: 401, + message: '用户名或密码错误', + data: null + } + }; + } + + return { + code: 200, + message: 'success', + data: { + token: `mock_token_${admin.id}_${Date.now()}`, + refreshToken: `mock_refresh_token_${admin.id}_${Date.now()}`, + userInfo: { + id: admin.id, + username: admin.username, + nickname: admin.nickname, + avatar: admin.avatar, + role: admin.role, + createTime: admin.createTime + } + } + }; + }, + + // 获取当前用户信息 + '[GET]/admin/auth/profile': ({ headers }) => { + const token = headers.authorization?.replace('Bearer ', ''); + if (!token) { + return { + status: 401, + body: { + code: 401, + message: '未提供访问令牌', + data: null + } + }; + } + + // 简单的token验证逻辑 + const tokenParts = token.split('_'); + if (tokenParts.length < 3) { + return { + status: 401, + body: { + code: 401, + message: '访问令牌无效', + data: null + } + }; + } + + const userId = tokenParts[2]; + const mockAdmins = [ + { + id: '1', + username: 'admin', + nickname: '系统管理员', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=admin', + role: 'admin', + createTime: '2023-01-01 00:00:00' + } + ]; + + const admin = mockAdmins.find(user => user.id === userId); + if (!admin) { + return { + status: 401, + body: { + code: 401, + message: '访问令牌无效', + data: null + } + }; + } + + return { + code: 200, + message: 'success', + data: admin + }; + }, + + // 退出登录 + '[POST]/admin/auth/logout': () => { + return { + code: 200, + message: 'success', + data: { message: '退出成功' } + }; + } +}, true); diff --git a/src/mocks/banners.mock.ts b/src/mocks/banners.mock.ts new file mode 100644 index 0000000..fe9e50f --- /dev/null +++ b/src/mocks/banners.mock.ts @@ -0,0 +1,246 @@ +import { defineMock } from '@alova/mock'; + +// 模拟轮播图数据 +const mockBanners = [ + { + id: '1', + title: '朱子文化传承千年', + image: 'https://picsum.photos/800/400?random=1', + linkType: 'article', + articleContent: ` +

朱子文化传承千年

+

朱子文化作为中华优秀传统文化的重要组成部分,传承至今已有千年历史。朱熹(1130-1200),字元晦、仲晦,号晦庵、晦翁,别号紫阳,谥号"文",世称朱文公。

+

朱子理学的影响

+

朱子集南宋前儒学思想之大成,构建了"致广大,尽精微,综罗百代"的理学思想体系,影响了中国社会近千年。

+

教育贡献

+

朱子在教育方面的贡献同样卓著,提出了许多具有深远影响的教育理念和方法。

+ `, + sort: 1, + status: 'enabled', + createTime: '2024-01-01 09:00:00', + updateTime: '2024-01-01 09:00:00' + }, + { + id: '2', + title: '学习朱子理学精神', + image: 'https://picsum.photos/800/400?random=2', + linkType: 'url', + linkUrl: 'https://www.zhuzi.org', + sort: 2, + status: 'enabled', + createTime: '2024-01-01 09:30:00', + updateTime: '2024-01-01 09:30:00' + }, + { + id: '3', + title: '朱子书院文化', + image: 'https://picsum.photos/800/400?random=3', + linkType: 'article', + articleContent: ` +

朱子书院文化

+

朱子创办的书院成为中国古代教育的重要形式,对后世产生了深远的影响。

+

白鹿洞书院

+

朱熹重新修复白鹿洞书院,制定了著名的《白鹿洞书院揭示》。

+ `, + sort: 3, + status: 'disabled', + createTime: '2024-01-01 10:00:00', + updateTime: '2024-01-01 10:00:00' + }, + { + id: '4', + title: '朱子家训精神', + image: 'https://picsum.photos/800/400?random=4', + linkType: 'article', + articleContent: ` +

朱子家训精神

+

朱子的家训体现了深厚的儒家文化内涵,对家庭教育有重要指导意义。

+ `, + sort: 4, + status: 'enabled', + createTime: '2024-01-01 10:30:00', + updateTime: '2024-01-01 10:30:00' + } +]; + +// 轮播图管理接口的mock数据 +export default defineMock({ + // 获取轮播图列表 + '[GET]/admin/banners': ({ query }) => { + let filteredBanners = [...mockBanners]; + + // 状态筛选 + if (query.status) { + filteredBanners = filteredBanners.filter(b => b.status === query.status); + } + + // 关键词搜索 + if (query.keyword) { + filteredBanners = filteredBanners.filter(b => + b.title.includes(query.keyword!) + ); + } + + // 按排序字段排序 + filteredBanners.sort((a, b) => a.sort - b.sort); + + // 分页 + const page = parseInt(query.page) || 1; + const pageSize = parseInt(query.pageSize) || 10; + const total = filteredBanners.length; + const start = (page - 1) * pageSize; + const end = start + pageSize; + + return { + code: 200, + message: 'success', + data: { + list: filteredBanners.slice(start, end), + total, + page, + pageSize + } + }; + }, + + // 获取轮播图详情 + '[GET]/admin/banners/{id}': ({ params }) => { + const banner = mockBanners.find(b => b.id === params.id); + if (!banner) { + return { + status: 404, + body: { + code: 404, + message: '轮播图不存在', + data: null + } + }; + } + + return { + code: 200, + message: 'success', + data: banner + }; + }, + + // 创建轮播图 + '[POST]/admin/banners': ({ data }) => { + const newBanner = { + ...data, + id: (mockBanners.length + 1).toString(), + createTime: new Date().toLocaleString('zh-CN'), + updateTime: new Date().toLocaleString('zh-CN') + }; + + mockBanners.push(newBanner); + + return { + code: 200, + message: 'success', + data: { + message: '创建成功', + id: newBanner.id + } + }; + }, + + // 更新轮播图 + '[PUT]/admin/banners/{id}': ({ params, data }) => { + const index = mockBanners.findIndex(b => b.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '轮播图不存在', + data: null + } + }; + } + + mockBanners[index] = { + ...data, + id: params.id, + createTime: mockBanners[index].createTime, + updateTime: new Date().toLocaleString('zh-CN') + }; + + return { + code: 200, + message: 'success', + data: { message: '更新成功' } + }; + }, + + // 删除轮播图 + '[DELETE]/admin/banners/{id}': ({ params }) => { + const index = mockBanners.findIndex(b => b.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '轮播图不存在', + data: null + } + }; + } + + mockBanners.splice(index, 1); + + return { + code: 200, + message: 'success', + data: { message: '删除成功' } + }; + }, + + // 更新轮播图状态 + '[PUT]/admin/banners/{id}/status': ({ params, data }) => { + const banner = mockBanners.find(b => b.id === params.id); + if (!banner) { + return { + status: 404, + body: { + code: 404, + message: '轮播图不存在', + data: null + } + }; + } + + banner.status = data.status; + banner.updateTime = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: 'success', + data: { message: '状态更新成功' } + }; + }, + + // 更新轮播图排序 + '[PUT]/admin/banners/{id}/sort': ({ params, data }) => { + const banner = mockBanners.find(b => b.id === params.id); + if (!banner) { + return { + status: 404, + body: { + code: 404, + message: '轮播图不存在', + data: null + } + }; + } + + banner.sort = data.sort; + banner.updateTime = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: 'success', + data: { message: '排序更新成功' } + }; + } +}, true); diff --git a/src/mocks/classes.mock.ts b/src/mocks/classes.mock.ts new file mode 100644 index 0000000..1eb3b94 --- /dev/null +++ b/src/mocks/classes.mock.ts @@ -0,0 +1,336 @@ +import { defineMock } from '@alova/mock'; + +// Mock数据 +const mockClasses = [ + // 朱熹小学一年级班级 + { + id: '1', + name: '一年级1班', + code: 'CLASS_1_1', + schoolId: '1', + schoolName: '朱熹小学', + gradeId: '1', + gradeName: '一年级', + teacherName: '张老师', + teacherPhone: '13800138001', + classroom: '教学楼A101', + sort: 1, + maxStudents: 40, + studentCount: 38, + enrollmentYear: 2024, + description: '一年级1班,班风优良', + status: 'active', + createdAt: '2024-09-01 08:00:00', + updatedAt: '2024-09-01 08:00:00' + }, + { + id: '2', + name: '一年级2班', + code: 'CLASS_1_2', + schoolId: '1', + schoolName: '朱熹小学', + gradeId: '1', + gradeName: '一年级', + teacherName: '李老师', + teacherPhone: '13800138002', + classroom: '教学楼A102', + sort: 2, + maxStudents: 40, + studentCount: 39, + enrollmentYear: 2024, + description: '一年级2班,活泼可爱', + status: 'active', + createdAt: '2024-09-01 08:00:00', + updatedAt: '2024-09-01 08:00:00' + }, + // 朱熹小学二年级班级 + { + id: '3', + name: '二年级1班', + code: 'CLASS_2_1', + schoolId: '1', + schoolName: '朱熹小学', + gradeId: '2', + gradeName: '二年级', + teacherName: '王老师', + teacherPhone: '13800138003', + classroom: '教学楼A201', + sort: 1, + maxStudents: 40, + studentCount: 37, + enrollmentYear: 2023, + description: '二年级1班,学习认真', + status: 'active', + createdAt: '2024-09-01 08:00:00', + updatedAt: '2024-09-01 08:00:00' + }, + // 朱熹中学初一班级 + { + id: '4', + name: '初一1班', + code: 'CLASS_7_1', + schoolId: '2', + schoolName: '朱熹中学', + gradeId: '4', + gradeName: '初一', + teacherName: '陈老师', + teacherPhone: '13800138004', + classroom: '教学楼B301', + sort: 1, + maxStudents: 45, + studentCount: 44, + enrollmentYear: 2024, + description: '初一1班,团结向上', + status: 'active', + createdAt: '2024-09-01 08:00:00', + updatedAt: '2024-09-01 08:00:00' + }, + { + id: '5', + name: '初一2班', + code: 'CLASS_7_2', + schoolId: '2', + schoolName: '朱熹中学', + gradeId: '4', + gradeName: '初一', + teacherName: '刘老师', + teacherPhone: '13800138005', + classroom: '教学楼B302', + sort: 2, + maxStudents: 45, + studentCount: 43, + enrollmentYear: 2024, + description: '初一2班,积极进取', + status: 'active', + createdAt: '2024-09-01 08:00:00', + updatedAt: '2024-09-01 08:00:00' + } +]; + +// Mock学生数据 +const mockStudents = [ + { + id: '1', + name: '张小明', + studentNumber: '2024001', + gender: 'male', + phone: '13900139001', + parentName: '张大明', + parentPhone: '13800138001', + classId: '1', + status: 'active' + }, + { + id: '2', + name: '李小红', + studentNumber: '2024002', + gender: 'female', + phone: '13900139002', + parentName: '李大红', + parentPhone: '13800138002', + classId: '1', + status: 'active' + }, + { + id: '3', + name: '王小华', + studentNumber: '2024003', + gender: 'male', + phone: '13900139003', + parentName: '王大华', + parentPhone: '13800138003', + classId: '2', + status: 'active' + } +]; + +let classIdCounter = 6; +let studentIdCounter = 4; + +export default defineMock({ + // 获取班级列表 + '/admin/classes': ({ query }) => { + const { schoolId, gradeId, page = 1, pageSize = 10, keyword = '' } = query; + + // 根据学校ID和年级ID过滤 + let filteredClasses = mockClasses.filter(cls => + cls.schoolId === schoolId && cls.gradeId === gradeId + ); + + // 根据关键字搜索 + if (keyword) { + filteredClasses = filteredClasses.filter(cls => + cls.name.includes(keyword) || + cls.code.includes(keyword) || + cls.teacherName.includes(keyword) + ); + } + + // 分页 + const start = (page - 1) * pageSize; + const end = start + pageSize; + const list = filteredClasses.slice(start, end); + + return { + code: 200, + message: 'success', + data: { + list, + page: Number(page), + pageSize: Number(pageSize), + total: filteredClasses.length + } + }; + }, + + // 创建班级 + '[POST]/admin/classes': ({ data }) => { + const newClass = { + id: String(classIdCounter++), + ...data, + schoolName: mockClasses.find(c => c.schoolId === data.schoolId)?.schoolName || '未知学校', + gradeName: mockClasses.find(c => c.gradeId === data.gradeId)?.gradeName || '未知年级', + studentCount: 0, + createdAt: new Date().toLocaleString('zh-CN'), + updatedAt: new Date().toLocaleString('zh-CN') + }; + + mockClasses.push(newClass); + + return { + code: 200, + message: '创建成功', + data: newClass + }; + }, + + // 更新班级 + '[PUT]/admin/classes/{id}': ({ params, data }) => { + const index = mockClasses.findIndex(cls => cls.id === params.id); + if (index === -1) { + return { + code: 404, + message: '班级不存在' + }; + } + + mockClasses[index] = { + ...mockClasses[index], + ...data, + updatedAt: new Date().toLocaleString('zh-CN') + }; + + return { + code: 200, + message: '更新成功', + data: mockClasses[index] + }; + }, + + // 删除班级 + '[DELETE]/admin/classes/{id}': ({ params }) => { + const index = mockClasses.findIndex(cls => cls.id === params.id); + if (index === -1) { + return { + code: 404, + message: '班级不存在' + }; + } + + mockClasses.splice(index, 1); + + return { + code: 200, + message: '删除成功' + }; + }, + + // 切换班级状态 + '[PATCH]/admin/classes/{id}/toggle-status': ({ params }) => { + const cls = mockClasses.find(c => c.id === params.id); + if (!cls) { + return { + code: 404, + message: '班级不存在' + }; + } + + cls.status = cls.status === 'active' ? 'inactive' : 'active'; + cls.updatedAt = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: '状态切换成功', + data: cls + }; + }, + + // 获取班级详情 + '/admin/classes/{id}': ({ params }) => { + const cls = mockClasses.find(c => c.id === params.id); + if (!cls) { + return { + code: 404, + message: '班级不存在' + }; + } + + return { + code: 200, + message: 'success', + data: cls + }; + }, + + // 获取班级学生列表 + '/admin/classes/{classId}/students': ({ params, query }) => { + const { page = 1, pageSize = 10, keyword = '' } = query; + + // 根据班级ID过滤学生 + let filteredStudents = mockStudents.filter(student => student.classId === params.classId); + + // 根据关键字搜索 + if (keyword) { + filteredStudents = filteredStudents.filter(student => + student.name.includes(keyword) || + student.studentNumber.includes(keyword) || + student.parentName.includes(keyword) + ); + } + + // 分页 + const start = (page - 1) * pageSize; + const end = start + pageSize; + const list = filteredStudents.slice(start, end); + + return { + code: 200, + message: 'success', + data: { + list, + page: Number(page), + pageSize: Number(pageSize), + total: filteredStudents.length + } + }; + }, + + // 批量导入班级 + '[POST]/admin/classes/import': ({ data }) => { + // 模拟导入结果 + const importResult = { + total: 10, + success: 9, + failed: 1, + errors: [ + { row: 5, message: '班级代码重复' } + ] + }; + + return { + code: 200, + message: '导入完成', + data: importResult + }; + } +}, true); diff --git a/src/mocks/common.mock.ts b/src/mocks/common.mock.ts new file mode 100644 index 0000000..eea92bd --- /dev/null +++ b/src/mocks/common.mock.ts @@ -0,0 +1,26 @@ +import { defineMock } from '@alova/mock'; + +// 通用接口的mock数据 +export default defineMock({ + // 上传轮播图图片 + '[POST]/admin/upload/banner': () => { + return { + code: 200, + message: 'success', + data: { + url: `https://picsum.photos/800/400?random=${Date.now()}` + } + }; + }, + + // 文件上传通用接口 + '[POST]/admin/upload/file': () => { + return { + code: 200, + message: 'success', + data: { + url: `https://picsum.photos/400/300?random=${Date.now()}` + } + }; + } +}, true); diff --git a/src/mocks/grades.mock.ts b/src/mocks/grades.mock.ts new file mode 100644 index 0000000..9a7d256 --- /dev/null +++ b/src/mocks/grades.mock.ts @@ -0,0 +1,214 @@ +import { defineMock } from '@alova/mock'; + +// Mock数据 +const mockGrades = [ + { + id: '1', + name: '一年级', + code: 'GRADE_1', + schoolId: '1', + schoolName: '朱熹小学', + duration: 1, + sort: 1, + description: '小学一年级', + status: 'active', + classCount: 8, + studentCount: 320, + createdAt: '2023-09-01 08:00:00', + updatedAt: '2023-09-01 08:00:00' + }, + { + id: '2', + name: '二年级', + code: 'GRADE_2', + schoolId: '1', + schoolName: '朱熹小学', + duration: 2, + sort: 2, + description: '小学二年级', + status: 'active', + classCount: 7, + studentCount: 280, + createdAt: '2023-09-01 08:00:00', + updatedAt: '2023-09-01 08:00:00' + }, + { + id: '3', + name: '三年级', + code: 'GRADE_3', + schoolId: '1', + schoolName: '朱熹小学', + duration: 3, + sort: 3, + description: '小学三年级', + status: 'active', + classCount: 6, + studentCount: 240, + createdAt: '2023-09-01 08:00:00', + updatedAt: '2023-09-01 08:00:00' + }, + { + id: '4', + name: '初一', + code: 'GRADE_7', + schoolId: '2', + schoolName: '朱熹中学', + duration: 1, + sort: 7, + description: '初中一年级', + status: 'active', + classCount: 10, + studentCount: 450, + createdAt: '2023-09-01 08:00:00', + updatedAt: '2023-09-01 08:00:00' + }, + { + id: '5', + name: '初二', + code: 'GRADE_8', + schoolId: '2', + schoolName: '朱熹中学', + duration: 2, + sort: 8, + description: '初中二年级', + status: 'active', + classCount: 9, + studentCount: 405, + createdAt: '2023-09-01 08:00:00', + updatedAt: '2023-09-01 08:00:00' + } +]; + +let gradeIdCounter = 6; + +export default defineMock({ + // 获取年级列表 + '/admin/grades': ({ query }) => { + const { schoolId, page = 1, pageSize = 10, keyword = '' } = query; + + // 根据学校ID过滤 + let filteredGrades = mockGrades.filter(grade => grade.schoolId === schoolId); + + // 根据关键字搜索 + if (keyword) { + filteredGrades = filteredGrades.filter(grade => + grade.name.includes(keyword) || grade.code.includes(keyword) + ); + } + + // 分页 + const start = (page - 1) * pageSize; + const end = start + pageSize; + const list = filteredGrades.slice(start, end); + + return { + code: 200, + message: 'success', + data: { + list, + page: Number(page), + pageSize: Number(pageSize), + total: filteredGrades.length + } + }; + }, + + // 创建年级 + '[POST]/admin/grades': ({ data }) => { + const newGrade = { + id: String(gradeIdCounter++), + ...data, + schoolName: mockGrades.find(g => g.schoolId === data.schoolId)?.schoolName || '未知学校', + classCount: 0, + studentCount: 0, + createdAt: new Date().toLocaleString('zh-CN'), + updatedAt: new Date().toLocaleString('zh-CN') + }; + + mockGrades.push(newGrade); + + return { + code: 200, + message: '创建成功', + data: newGrade + }; + }, + + // 更新年级 + '[PUT]/admin/grades/{id}': ({ params, data }) => { + const index = mockGrades.findIndex(grade => grade.id === params.id); + if (index === -1) { + return { + code: 404, + message: '年级不存在' + }; + } + + mockGrades[index] = { + ...mockGrades[index], + ...data, + updatedAt: new Date().toLocaleString('zh-CN') + }; + + return { + code: 200, + message: '更新成功', + data: mockGrades[index] + }; + }, + + // 删除年级 + '[DELETE]/admin/grades/{id}': ({ params }) => { + const index = mockGrades.findIndex(grade => grade.id === params.id); + if (index === -1) { + return { + code: 404, + message: '年级不存在' + }; + } + + mockGrades.splice(index, 1); + + return { + code: 200, + message: '删除成功' + }; + }, + + // 切换年级状态 + '[PATCH]/admin/grades/{id}/toggle-status': ({ params }) => { + const grade = mockGrades.find(g => g.id === params.id); + if (!grade) { + return { + code: 404, + message: '年级不存在' + }; + } + + grade.status = grade.status === 'active' ? 'inactive' : 'active'; + grade.updatedAt = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: '状态切换成功', + data: grade + }; + }, + + // 获取年级详情 + '/admin/grades/{id}': ({ params }) => { + const grade = mockGrades.find(g => g.id === params.id); + if (!grade) { + return { + code: 404, + message: '年级不存在' + }; + } + + return { + code: 200, + message: 'success', + data: grade + }; + } +}, true); diff --git a/src/mocks/index.mock.ts b/src/mocks/index.mock.ts new file mode 100644 index 0000000..4fc4c9e --- /dev/null +++ b/src/mocks/index.mock.ts @@ -0,0 +1,42 @@ +/** + * Mock数据统一管理 - 使用alova官方@alova/mock + */ + +// 导入所有mock模块 +import authMock from './auth.mock'; +import questionsMock from './questions.mock'; +import bannersMock from './banners.mock'; +import recordsMock from './records.mock'; +import usersMock from './users.mock'; +import schoolsMock from './schools.mock'; +import gradesMock from './grades.mock'; +import classesMock from './classes.mock'; +import profileMock from './profile.mock'; +import commonMock from './common.mock'; + +// 导出所有mock定义 +export const mockGroups = [ + authMock, + questionsMock, + bannersMock, + recordsMock, + usersMock, + schoolsMock, + gradesMock, + classesMock, + profileMock, + commonMock +]; + +export { + authMock, + questionsMock, + bannersMock, + recordsMock, + usersMock, + schoolsMock, + gradesMock, + classesMock, + profileMock, + commonMock +}; diff --git a/src/mocks/profile.mock.ts b/src/mocks/profile.mock.ts new file mode 100644 index 0000000..9042fda --- /dev/null +++ b/src/mocks/profile.mock.ts @@ -0,0 +1,104 @@ +import { defineMock } from '@alova/mock'; + +// Mock用户资料数据 +let mockProfile = { + id: 'admin001', + username: 'admin', + realName: '管理员', + phone: '13800138000', + email: 'admin@zhuzi.edu.cn', + gender: 'male', + birthday: '1985-06-15', + bio: '朱子文化管理系统管理员,负责系统维护和用户管理工作。', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=admin', + role: 'admin', + status: 'active', + createdAt: '2023-01-01 08:00:00', + lastLoginAt: '2024-12-16 14:30:00', + loginCount: 256, + updatedAt: '2024-12-16 14:30:00' +}; + +export default defineMock({ + // 获取用户资料 + '/admin/profile': () => { + return { + code: 200, + message: 'success', + data: mockProfile + }; + }, + + // 更新用户资料 + '[PUT]/admin/profile': ({ data }) => { + // 更新用户资料 + mockProfile = { + ...mockProfile, + ...data, + updatedAt: new Date().toLocaleString('zh-CN') + }; + + return { + code: 200, + message: '更新成功', + data: mockProfile + }; + }, + + // 上传头像 + '[POST]/admin/profile/avatar': () => { + // 模拟生成头像URL + const avatarUrl = `https://api.dicebear.com/7.x/avataaars/svg?seed=${Date.now()}`; + + // 更新用户头像 + mockProfile.avatar = avatarUrl; + mockProfile.updatedAt = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: '头像上传成功', + data: { + url: avatarUrl + } + }; + }, + + // 修改密码 + '[POST]/admin/profile/password': ({ data }) => { + const { oldPassword, newPassword } = data; + + // 模拟验证旧密码(这里简单判断不为空即可) + if (!oldPassword) { + return { + code: 400, + message: '当前密码不能为空' + }; + } + + // 模拟验证旧密码是否正确(实际项目中应该加密验证) + if (oldPassword !== '123456' && oldPassword !== 'admin123') { + return { + status: 400, + statusText: 'Bad Request', + body: { + code: 400, + message: 'Invalid old password' + } + }; + } + + // 模拟验证新密码强度 + if (newPassword.length < 8) { + return { + code: 400, + message: '新密码长度至少8位' + }; + } + + // 模拟密码修改成功 + return { + code: 200, + message: '密码修改成功' + }; + } +}, true); diff --git a/src/mocks/questions.mock.ts b/src/mocks/questions.mock.ts new file mode 100644 index 0000000..73339b6 --- /dev/null +++ b/src/mocks/questions.mock.ts @@ -0,0 +1,297 @@ +import { defineMock } from '@alova/mock'; + +// 模拟题目数据 +const mockQuestions = [ + { + id: '1', + title: '朱熹的生卒年份', + content: '朱熹(朱子)生于哪一年,卒于哪一年?', + type: 'single', + options: [ + { key: 'A', value: '1130-1200', isCorrect: true }, + { key: 'B', value: '1120-1190' }, + { key: 'C', value: '1140-1210' }, + { key: 'D', value: '1125-1195' } + ], + correctAnswer: ['A'], + score: 10, + difficulty: 'easy', + category: '朱子生平', + tags: ['朱熹', '生平', '基础知识'], + createTime: '2024-01-01 10:00:00', + updateTime: '2024-01-01 10:00:00' + }, + { + id: '2', + title: '朱子理学的核心思想', + content: '朱子理学的核心思想包括哪些?(多选)', + type: 'multiple', + options: [ + { key: 'A', value: '理气论', isCorrect: true }, + { key: 'B', value: '心性论', isCorrect: true }, + { key: 'C', value: '格物致知', isCorrect: true }, + { key: 'D', value: '王道思想' } + ], + correctAnswer: ['A', 'B', 'C'], + score: 15, + difficulty: 'medium', + category: '朱子思想', + tags: ['理学', '哲学', '思想'], + createTime: '2024-01-01 11:00:00', + updateTime: '2024-01-01 11:00:00' + }, + { + id: '3', + title: '朱子的著作', + content: '《四书章句集注》是朱子的代表作品吗?', + type: 'single', + options: [ + { key: 'A', value: '是', isCorrect: true }, + { key: 'B', value: '不是' } + ], + correctAnswer: ['A'], + score: 8, + difficulty: 'easy', + category: '朱子著作', + tags: ['著作', '四书'], + createTime: '2024-01-01 12:00:00', + updateTime: '2024-01-01 12:00:00' + }, + { + id: '4', + title: '朱子的家乡', + content: '朱熹的出生地是哪里?', + type: 'single', + options: [ + { key: 'A', value: '江西婺源' }, + { key: 'B', value: '福建尤溪', isCorrect: true }, + { key: 'C', value: '福建建阳' }, + { key: 'D', value: '浙江金华' } + ], + correctAnswer: ['B'], + score: 12, + difficulty: 'medium', + category: '朱子生平', + tags: ['家乡', '生平'], + createTime: '2024-01-01 13:00:00', + updateTime: '2024-01-01 13:00:00' + }, + { + id: '5', + title: '朱子教育思想', + content: '朱子在教育方面提出了哪些重要观点?(多选)', + type: 'multiple', + options: [ + { key: 'A', value: '因材施教', isCorrect: true }, + { key: 'B', value: '学思并重', isCorrect: true }, + { key: 'C', value: '博学笃行', isCorrect: true }, + { key: 'D', value: '死记硬背' } + ], + correctAnswer: ['A', 'B', 'C'], + score: 20, + difficulty: 'hard', + category: '朱子教育', + tags: ['教育', '思想', '方法'], + createTime: '2024-01-01 14:00:00', + updateTime: '2024-01-01 14:00:00' + } +]; + +// 题目分类 +const mockCategories = [ + { name: '朱子生平', count: 2 }, + { name: '朱子思想', count: 1 }, + { name: '朱子著作', count: 1 }, + { name: '朱子教育', count: 1 } +]; + +// 题库管理接口的mock数据 +export default defineMock({ + // 获取题目列表 + '[GET]/admin/questions': ({ query }) => { + let filteredQuestions = [...mockQuestions]; + + // 关键词搜索 + if (query.keyword) { + filteredQuestions = filteredQuestions.filter(q => + q.title.includes(query.keyword!) || + q.content.includes(query.keyword!) || + q.category.includes(query.keyword!) + ); + } + + // 题型筛选 + if (query.type) { + filteredQuestions = filteredQuestions.filter(q => q.type === query.type); + } + + // 难度筛选 + if (query.difficulty) { + filteredQuestions = filteredQuestions.filter(q => q.difficulty === query.difficulty); + } + + // 分类筛选 + if (query.category) { + filteredQuestions = filteredQuestions.filter(q => q.category === query.category); + } + + // 分页 + const page = parseInt(query.page) || 1; + const pageSize = parseInt(query.pageSize) || 10; + const total = filteredQuestions.length; + const start = (page - 1) * pageSize; + const end = start + pageSize; + + return { + code: 200, + message: 'success', + data: { + list: filteredQuestions.slice(start, end), + total, + page, + pageSize + } + }; + }, + + // 获取题目详情 + '[GET]/admin/questions/{id}': ({ params }) => { + const question = mockQuestions.find(q => q.id === params.id); + if (!question) { + return { + status: 404, + body: { + code: 404, + message: '题目不存在', + data: null + } + }; + } + + return { + code: 200, + message: 'success', + data: question + }; + }, + + // 创建题目 + '[POST]/admin/questions': ({ data }) => { + const newQuestion = { + ...data, + id: (mockQuestions.length + 1).toString(), + createTime: new Date().toLocaleString('zh-CN'), + updateTime: new Date().toLocaleString('zh-CN') + }; + + mockQuestions.push(newQuestion); + + return { + code: 200, + message: 'success', + data: { + message: '创建成功', + id: newQuestion.id + } + }; + }, + + // 更新题目 + '[PUT]/admin/questions/{id}': ({ params, data }) => { + const index = mockQuestions.findIndex(q => q.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '题目不存在', + data: null + } + }; + } + + mockQuestions[index] = { + ...data, + id: params.id, + createTime: mockQuestions[index].createTime, + updateTime: new Date().toLocaleString('zh-CN') + }; + + return { + code: 200, + message: 'success', + data: { message: '更新成功' } + }; + }, + + // 删除题目 + '[DELETE]/admin/questions/{id}': ({ params }) => { + const index = mockQuestions.findIndex(q => q.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '题目不存在', + data: null + } + }; + } + + mockQuestions.splice(index, 1); + + return { + code: 200, + message: 'success', + data: { message: '删除成功' } + }; + }, + + // 批量删除题目 + '[DELETE]/admin/questions/batch': ({ data }) => { + let deletedCount = 0; + data.ids.forEach(id => { + const index = mockQuestions.findIndex(q => q.id === id); + if (index !== -1) { + mockQuestions.splice(index, 1); + deletedCount++; + } + }); + + return { + code: 200, + message: 'success', + data: { + message: `成功删除${deletedCount}个题目` + } + }; + }, + + // 获取题目分类列表 + '[GET]/admin/questions/categories': () => { + return { + code: 200, + message: 'success', + data: mockCategories + }; + }, + + // 导出题目模板 + '[GET]/admin/questions/template': () => { + const blob = new Blob(['模板内容'], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + return blob; + }, + + // 批量导入题目 + '[POST]/admin/questions/import': () => { + return { + code: 200, + message: 'success', + data: { + message: '导入成功', + successCount: 5, + failCount: 0 + } + }; + } +}, true); diff --git a/src/mocks/records.mock.ts b/src/mocks/records.mock.ts new file mode 100644 index 0000000..462990a --- /dev/null +++ b/src/mocks/records.mock.ts @@ -0,0 +1,421 @@ +import { defineMock } from '@alova/mock'; + +// 模拟答题记录数据 +const mockAnswerRecords = [ + { + id: '1', + userId: '1', + studentName: '张小明', + parentPhone: '13800138001', + schoolName: '建阳区实验小学', + gradeName: '一年级', + className: '一年级1班', + answererType: 'parent', + totalQuestions: 5, + correctCount: 4, + totalScore: 43, + answerTime: 120, + questionDetails: [ + { + questionId: '1', + questionTitle: '朱熹的生卒年份', + userAnswer: ['A'], + correctAnswer: ['A'], + isCorrect: true, + score: 10, + timeSpent: 25 + }, + { + questionId: '2', + questionTitle: '朱子理学的核心思想', + userAnswer: ['A', 'B'], + correctAnswer: ['A', 'B', 'C'], + isCorrect: false, + score: 0, + timeSpent: 30 + }, + { + questionId: '3', + questionTitle: '朱子的著作', + userAnswer: ['A'], + correctAnswer: ['A'], + isCorrect: true, + score: 8, + timeSpent: 20 + }, + { + questionId: '4', + questionTitle: '朱子的家乡', + userAnswer: ['B'], + correctAnswer: ['B'], + isCorrect: true, + score: 12, + timeSpent: 28 + }, + { + questionId: '5', + questionTitle: '朱子教育思想', + userAnswer: ['A', 'B', 'C'], + correctAnswer: ['A', 'B', 'C'], + isCorrect: true, + score: 20, + timeSpent: 17 + } + ], + createTime: '2024-01-15 14:30:00' + }, + { + id: '2', + userId: '2', + studentName: '李小红', + parentPhone: '13800138002', + schoolName: '建阳区实验小学', + gradeName: '一年级', + className: '一年级2班', + answererType: 'student', + totalQuestions: 10, + correctCount: 8, + totalScore: 76, + answerTime: 280, + questionDetails: [ + { + questionId: '1', + questionTitle: '朱熹的生卒年份', + userAnswer: ['A'], + correctAnswer: ['A'], + isCorrect: true, + score: 10, + timeSpent: 22 + }, + { + questionId: '2', + questionTitle: '朱子理学的核心思想', + userAnswer: ['A', 'B', 'C'], + correctAnswer: ['A', 'B', 'C'], + isCorrect: true, + score: 15, + timeSpent: 35 + } + ], + createTime: '2024-01-14 16:20:00' + }, + { + id: '3', + userId: '3', + studentName: '王小强', + parentPhone: '13800138003', + schoolName: '建阳区第一中学', + gradeName: '七年级', + className: '七年级1班', + answererType: 'parent', + totalQuestions: 5, + correctCount: 3, + totalScore: 30, + answerTime: 145, + questionDetails: [ + { + questionId: '1', + questionTitle: '朱熹的生卒年份', + userAnswer: ['B'], + correctAnswer: ['A'], + isCorrect: false, + score: 0, + timeSpent: 30 + }, + { + questionId: '3', + questionTitle: '朱子的著作', + userAnswer: ['A'], + correctAnswer: ['A'], + isCorrect: true, + score: 8, + timeSpent: 25 + } + ], + createTime: '2024-01-13 15:45:00' + }, + { + id: '4', + userId: '4', + studentName: '刘小丽', + parentPhone: '13800138004', + schoolName: '建阳区实验小学', + gradeName: '二年级', + className: '二年级1班', + answererType: 'student', + totalQuestions: 10, + correctCount: 9, + totalScore: 88, + answerTime: 250, + questionDetails: [ + { + questionId: '1', + questionTitle: '朱熹的生卒年份', + userAnswer: ['A'], + correctAnswer: ['A'], + isCorrect: true, + score: 10, + timeSpent: 20 + } + ], + createTime: '2024-01-16 11:20:00' + }, + { + id: '5', + userId: '5', + studentName: '陈小华', + parentPhone: '13800138005', + schoolName: '建阳区实验小学', + gradeName: '一年级', + className: '一年级1班', + answererType: 'parent', + totalQuestions: 5, + correctCount: 2, + totalScore: 18, + answerTime: 110, + questionDetails: [ + { + questionId: '1', + questionTitle: '朱熹的生卒年份', + userAnswer: ['C'], + correctAnswer: ['A'], + isCorrect: false, + score: 0, + timeSpent: 25 + }, + { + questionId: '3', + questionTitle: '朱子的著作', + userAnswer: ['A'], + correctAnswer: ['A'], + isCorrect: true, + score: 8, + timeSpent: 20 + } + ], + createTime: '2024-01-12 09:30:00' + } +]; + +// 答题记录管理接口的mock数据 +export default defineMock({ + // 获取答题记录列表 + '[GET]/admin/records': ({ query }) => { + let filteredRecords = [...mockAnswerRecords]; + + // 关键词搜索(学生姓名) + if (query.keyword) { + filteredRecords = filteredRecords.filter(r => + r.studentName.includes(query.keyword!) || + r.parentPhone.includes(query.keyword!) + ); + } + + // 学校筛选 + if (query.schoolName) { + filteredRecords = filteredRecords.filter(r => r.schoolName.includes(query.schoolName!)); + } + + // 年级筛选 + if (query.gradeName) { + filteredRecords = filteredRecords.filter(r => r.gradeName.includes(query.gradeName!)); + } + + // 班级筛选 + if (query.className) { + filteredRecords = filteredRecords.filter(r => r.className.includes(query.className!)); + } + + // 答题人类型筛选 + if (query.answererType) { + filteredRecords = filteredRecords.filter(r => r.answererType === query.answererType); + } + + // 时间范围筛选 + if (query.startTime) { + filteredRecords = filteredRecords.filter(r => r.createTime >= query.startTime!); + } + if (query.endTime) { + filteredRecords = filteredRecords.filter(r => r.createTime <= query.endTime!); + } + + // 按创建时间倒序排列 + filteredRecords.sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime()); + + // 分页 + const page = parseInt(query.page) || 1; + const pageSize = parseInt(query.pageSize) || 10; + const total = filteredRecords.length; + const start = (page - 1) * pageSize; + const end = start + pageSize; + + return { + code: 200, + message: 'success', + data: { + list: filteredRecords.slice(start, end), + total, + page, + pageSize + } + }; + }, + + // 获取答题记录详情 + '[GET]/admin/records/{id}': ({ params }) => { + const record = mockAnswerRecords.find(r => r.id === params.id); + if (!record) { + return { + status: 404, + body: { + code: 404, + message: '记录不存在', + data: null + } + }; + } + + return { + code: 200, + message: 'success', + data: record + }; + }, + + // 获取答题统计数据 + '[GET]/admin/records/statistics': ({ query }) => { + let filteredRecords = [...mockAnswerRecords]; + + // 时间筛选 + if (query?.startTime) { + filteredRecords = filteredRecords.filter(r => r.createTime >= query.startTime!); + } + if (query?.endTime) { + filteredRecords = filteredRecords.filter(r => r.createTime <= query.endTime!); + } + + // 学校筛选 + if (query?.schoolName) { + filteredRecords = filteredRecords.filter(r => r.schoolName.includes(query.schoolName!)); + } + + // 年级筛选 + if (query?.gradeName) { + filteredRecords = filteredRecords.filter(r => r.gradeName.includes(query.gradeName!)); + } + + const totalRecords = filteredRecords.length; + const totalUsers = new Set(filteredRecords.map(r => r.userId)).size; + const avgScore = totalRecords > 0 ? + filteredRecords.reduce((sum, r) => sum + r.totalScore, 0) / totalRecords : 0; + const avgCorrectRate = totalRecords > 0 ? + filteredRecords.reduce((sum, r) => sum + (r.correctCount / r.totalQuestions), 0) / totalRecords : 0; + + // 统计热门题目 + const questionStats = new Map(); + filteredRecords.forEach(record => { + record.questionDetails.forEach(detail => { + if (!questionStats.has(detail.questionId)) { + questionStats.set(detail.questionId, { + title: detail.questionTitle, + answerCount: 0, + correctCount: 0 + }); + } + const stat = questionStats.get(detail.questionId)!; + stat.answerCount++; + if (detail.isCorrect) { + stat.correctCount++; + } + }); + }); + + const popularQuestions = Array.from(questionStats.entries()) + .map(([questionId, stat]: any) => ({ + questionId, + questionTitle: stat.title, + answerCount: stat.answerCount, + correctRate: stat.answerCount > 0 ? stat.correctCount / stat.answerCount : 0 + })) + .sort((a, b) => b.answerCount - a.answerCount) + .slice(0, 10); + + // 统计排行榜数据 + const schoolStats = new Map(); + const gradeStats = new Map(); + const classStats = new Map(); + + filteredRecords.forEach(record => { + // 学校统计 + if (!schoolStats.has(record.schoolName)) { + schoolStats.set(record.schoolName, { totalScore: 0, count: 0 }); + } + const schoolStat = schoolStats.get(record.schoolName)!; + schoolStat.totalScore += record.totalScore; + schoolStat.count++; + + // 年级统计 + if (!gradeStats.has(record.gradeName)) { + gradeStats.set(record.gradeName, { totalScore: 0, count: 0 }); + } + const gradeStat = gradeStats.get(record.gradeName)!; + gradeStat.totalScore += record.totalScore; + gradeStat.count++; + + // 班级统计 + if (!classStats.has(record.className)) { + classStats.set(record.className, { totalScore: 0, count: 0 }); + } + const classStat = classStats.get(record.className)!; + classStat.totalScore += record.totalScore; + classStat.count++; + }); + + const schoolRanking = Array.from(schoolStats.entries()) + .map(([name, stat]: any) => ({ + name, + avgScore: stat.count > 0 ? stat.totalScore / stat.count : 0 + })) + .sort((a, b) => b.avgScore - a.avgScore) + .slice(0, 10); + + const gradeRanking = Array.from(gradeStats.entries()) + .map(([name, stat]: any) => ({ + name, + avgScore: stat.count > 0 ? stat.totalScore / stat.count : 0 + })) + .sort((a, b) => b.avgScore - a.avgScore) + .slice(0, 10); + + const classRanking = Array.from(classStats.entries()) + .map(([name, stat]: any) => ({ + name, + avgScore: stat.count > 0 ? stat.totalScore / stat.count : 0 + })) + .sort((a, b) => b.avgScore - a.avgScore) + .slice(0, 10); + + return { + code: 200, + message: 'success', + data: { + totalRecords, + totalUsers, + avgScore: Math.round(avgScore * 100) / 100, + avgCorrectRate: Math.round(avgCorrectRate * 10000) / 100, + popularQuestions, + rankingData: { + schoolRanking, + gradeRanking, + classRanking + } + } + }; + }, + + // 导出答题记录 + '[GET]/admin/records/export': () => { + const blob = new Blob(['导出内容'], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + return blob; + } +}, true); diff --git a/src/mocks/schools.mock.ts b/src/mocks/schools.mock.ts new file mode 100644 index 0000000..7eb99ee --- /dev/null +++ b/src/mocks/schools.mock.ts @@ -0,0 +1,462 @@ +import { defineMock } from '@alova/mock'; + +// 模拟学校数据 +const mockSchools = [ + { + id: '1', + name: '建阳区实验小学', + address: '福建省南平市建阳区实验路123号', + principal: '张三', + phone: '0599-1234567', + district: '建阳区', + type: 'primary', + studentCount: 1200, + createTime: '2024-01-01 08:00:00', + updateTime: '2024-01-01 08:00:00' + }, + { + id: '2', + name: '建阳区第一中学', + address: '福建省南平市建阳区中山路456号', + principal: '李四', + phone: '0599-1234568', + district: '建阳区', + type: 'junior', + studentCount: 800, + createTime: '2024-01-01 08:00:00', + updateTime: '2024-01-01 08:00:00' + }, + { + id: '3', + name: '建阳区第二小学', + address: '福建省南平市建阳区朱熹路789号', + principal: '王五', + phone: '0599-1234569', + district: '建阳区', + type: 'primary', + studentCount: 900, + createTime: '2024-01-01 08:00:00', + updateTime: '2024-01-01 08:00:00' + } +]; + +// 模拟年级数据 +const mockGrades = [ + // 建阳区实验小学 + { id: '1', schoolId: '1', name: '一年级', level: 1, createTime: '2024-01-01 08:00:00' }, + { id: '2', schoolId: '1', name: '二年级', level: 2, createTime: '2024-01-01 08:00:00' }, + { id: '3', schoolId: '1', name: '三年级', level: 3, createTime: '2024-01-01 08:00:00' }, + { id: '4', schoolId: '1', name: '四年级', level: 4, createTime: '2024-01-01 08:00:00' }, + { id: '5', schoolId: '1', name: '五年级', level: 5, createTime: '2024-01-01 08:00:00' }, + { id: '6', schoolId: '1', name: '六年级', level: 6, createTime: '2024-01-01 08:00:00' }, + + // 建阳区第一中学 + { id: '7', schoolId: '2', name: '七年级', level: 7, createTime: '2024-01-01 08:00:00' }, + { id: '8', schoolId: '2', name: '八年级', level: 8, createTime: '2024-01-01 08:00:00' }, + { id: '9', schoolId: '2', name: '九年级', level: 9, createTime: '2024-01-01 08:00:00' }, + + // 建阳区第二小学 + { id: '10', schoolId: '3', name: '一年级', level: 1, createTime: '2024-01-01 08:00:00' }, + { id: '11', schoolId: '3', name: '二年级', level: 2, createTime: '2024-01-01 08:00:00' }, + { id: '12', schoolId: '3', name: '三年级', level: 3, createTime: '2024-01-01 08:00:00' } +]; + +// 模拟班级数据 +const mockClasses = [ + // 建阳区实验小学一年级 + { id: '1', schoolId: '1', gradeId: '1', name: '一年级1班', teacherName: '王老师', studentCount: 30, createTime: '2024-01-01 08:00:00' }, + { id: '2', schoolId: '1', gradeId: '1', name: '一年级2班', teacherName: '刘老师', studentCount: 28, createTime: '2024-01-01 08:00:00' }, + { id: '3', schoolId: '1', gradeId: '1', name: '一年级3班', teacherName: '李老师', studentCount: 29, createTime: '2024-01-01 08:00:00' }, + + // 建阳区实验小学二年级 + { id: '4', schoolId: '1', gradeId: '2', name: '二年级1班', teacherName: '张老师', studentCount: 32, createTime: '2024-01-01 08:00:00' }, + { id: '5', schoolId: '1', gradeId: '2', name: '二年级2班', teacherName: '赵老师', studentCount: 31, createTime: '2024-01-01 08:00:00' }, + + // 建阳区第一中学七年级 + { id: '6', schoolId: '2', gradeId: '7', name: '七年级1班', teacherName: '陈老师', studentCount: 40, createTime: '2024-01-01 08:00:00' }, + { id: '7', schoolId: '2', gradeId: '7', name: '七年级2班', teacherName: '吴老师', studentCount: 38, createTime: '2024-01-01 08:00:00' }, + + // 建阳区第二小学 + { id: '8', schoolId: '3', gradeId: '10', name: '一年级1班', teacherName: '周老师', studentCount: 35, createTime: '2024-01-01 08:00:00' } +]; + +// 区县列表 +const mockDistricts = [ + { name: '建阳区', count: 3 }, + { name: '延平区', count: 0 }, + { name: '顺昌县', count: 0 }, + { name: '浦城县', count: 0 } +]; + +// 学校管理接口的mock数据 +export default defineMock({ + // 获取学校列表 + '[GET]/admin/schools': ({ query }) => { + let filteredSchools = [...mockSchools]; + + // 关键词搜索 + if (query.keyword) { + filteredSchools = filteredSchools.filter(s => + s.name.includes(query.keyword!) || + s.address?.includes(query.keyword!) || + s.principal?.includes(query.keyword!) + ); + } + + // 区县筛选 + if (query.district) { + filteredSchools = filteredSchools.filter(s => s.district === query.district); + } + + // 类型筛选 + if (query.type) { + filteredSchools = filteredSchools.filter(s => s.type === query.type); + } + + // 为每个学校添加年级班级信息 + const schoolsWithGrades = filteredSchools.map(school => { + const grades = mockGrades.filter(g => g.schoolId === school.id); + const gradesWithClasses = grades.map(grade => ({ + ...grade, + classes: mockClasses.filter(c => c.gradeId === grade.id) + })); + + return { + ...school, + grades: gradesWithClasses + }; + }); + + // 分页 + const page = parseInt(query.page) || 1; + const pageSize = parseInt(query.pageSize) || 10; + const total = schoolsWithGrades.length; + const start = (page - 1) * pageSize; + const end = start + pageSize; + + return { + code: 200, + message: 'success', + data: { + list: schoolsWithGrades.slice(start, end), + total, + page, + pageSize + } + }; + }, + + // 获取学校详情(包含年级班级) + '[GET]/admin/schools/{id}': ({ params }) => { + const school = mockSchools.find(s => s.id === params.id); + if (!school) { + return { + status: 404, + body: { + code: 404, + message: '学校不存在', + data: null + } + }; + } + + // 获取该学校的年级 + const grades = mockGrades.filter(g => g.schoolId === params.id); + const gradesWithClasses = grades.map(grade => ({ + ...grade, + classes: mockClasses.filter(c => c.gradeId === grade.id) + })); + + return { + code: 200, + message: 'success', + data: { + ...school, + grades: gradesWithClasses + } + }; + }, + + // 创建学校 + '[POST]/admin/schools': ({ data }) => { + const newSchool = { + ...data, + id: (mockSchools.length + 1).toString(), + createTime: new Date().toLocaleString('zh-CN'), + updateTime: new Date().toLocaleString('zh-CN') + }; + + mockSchools.push(newSchool); + + return { + code: 200, + message: 'success', + data: { + message: '创建成功', + id: newSchool.id + } + }; + }, + + // 更新学校 + '[PUT]/admin/schools/{id}': ({ params, data }) => { + const index = mockSchools.findIndex(s => s.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '学校不存在', + data: null + } + }; + } + + mockSchools[index] = { + ...data, + id: params.id, + createTime: mockSchools[index].createTime, + updateTime: new Date().toLocaleString('zh-CN') + }; + + return { + code: 200, + message: 'success', + data: { message: '更新成功' } + }; + }, + + // 删除学校 + '[DELETE]/admin/schools/{id}': ({ params }) => { + const schoolIndex = mockSchools.findIndex(s => s.id === params.id); + if (schoolIndex === -1) { + return { + status: 404, + body: { + code: 404, + message: '学校不存在', + data: null + } + }; + } + + // 删除学校 + mockSchools.splice(schoolIndex, 1); + + // 删除相关年级 + const gradeIds = mockGrades.filter(g => g.schoolId === params.id).map(g => g.id); + for (let i = mockGrades.length - 1; i >= 0; i--) { + if (mockGrades[i].schoolId === params.id) { + mockGrades.splice(i, 1); + } + } + + // 删除相关班级 + for (let i = mockClasses.length - 1; i >= 0; i--) { + if (gradeIds.includes(mockClasses[i].gradeId)) { + mockClasses.splice(i, 1); + } + } + + return { + code: 200, + message: 'success', + data: { message: '删除成功' } + }; + }, + + // 获取年级列表 + '[GET]/admin/schools/{schoolId}/grades': ({ params }) => { + const grades = mockGrades.filter(g => g.schoolId === params.schoolId); + return { + code: 200, + message: 'success', + data: grades + }; + }, + + // 创建年级 + '[POST]/admin/grades': ({ data }) => { + const newGrade = { + ...data, + id: (mockGrades.length + 1).toString(), + createTime: new Date().toLocaleString('zh-CN') + }; + + mockGrades.push(newGrade); + + return { + code: 200, + message: 'success', + data: { + message: '创建成功', + id: newGrade.id + } + }; + }, + + // 更新年级 + '[PUT]/admin/grades/{id}': ({ params, data }) => { + const index = mockGrades.findIndex(g => g.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '年级不存在', + data: null + } + }; + } + + mockGrades[index] = { + ...data, + id: params.id, + createTime: mockGrades[index].createTime + }; + + return { + code: 200, + message: 'success', + data: { message: '更新成功' } + }; + }, + + // 删除年级 + '[DELETE]/admin/grades/{id}': ({ params }) => { + const index = mockGrades.findIndex(g => g.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '年级不存在', + data: null + } + }; + } + + mockGrades.splice(index, 1); + + // 删除相关班级 + for (let i = mockClasses.length - 1; i >= 0; i--) { + if (mockClasses[i].gradeId === params.id) { + mockClasses.splice(i, 1); + } + } + + return { + code: 200, + message: 'success', + data: { message: '删除成功' } + }; + }, + + // 获取班级列表 + '[GET]/admin/grades/{gradeId}/classes': ({ params }) => { + const classes = mockClasses.filter(c => c.gradeId === params.gradeId); + return { + code: 200, + message: 'success', + data: classes + }; + }, + + // 创建班级 + '[POST]/admin/classes': ({ data }) => { + const newClass = { + ...data, + id: (mockClasses.length + 1).toString(), + createTime: new Date().toLocaleString('zh-CN') + }; + + mockClasses.push(newClass); + + return { + code: 200, + message: 'success', + data: { + message: '创建成功', + id: newClass.id + } + }; + }, + + // 更新班级 + '[PUT]/admin/classes/{id}': ({ params, data }) => { + const index = mockClasses.findIndex(c => c.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '班级不存在', + data: null + } + }; + } + + mockClasses[index] = { + ...data, + id: params.id, + createTime: mockClasses[index].createTime + }; + + return { + code: 200, + message: 'success', + data: { message: '更新成功' } + }; + }, + + // 删除班级 + '[DELETE]/admin/classes/{id}': ({ params }) => { + const index = mockClasses.findIndex(c => c.id === params.id); + if (index === -1) { + return { + status: 404, + body: { + code: 404, + message: '班级不存在', + data: null + } + }; + } + + mockClasses.splice(index, 1); + + return { + code: 200, + message: 'success', + data: { message: '删除成功' } + }; + }, + + // 获取区县列表 + '[GET]/admin/schools/districts': () => { + return { + code: 200, + message: 'success', + data: mockDistricts + }; + }, + + // 导出学校数据模板 + '[GET]/admin/schools/template': () => { + const blob = new Blob(['模板内容'], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + return blob; + }, + + // 批量导入学校数据 + '[POST]/admin/schools/import': () => { + return { + code: 200, + message: 'success', + data: { + message: '导入成功', + successCount: 3, + failCount: 0 + } + }; + } +}, true); diff --git a/src/mocks/users.mock.ts b/src/mocks/users.mock.ts new file mode 100644 index 0000000..a496e20 --- /dev/null +++ b/src/mocks/users.mock.ts @@ -0,0 +1,266 @@ +import { defineMock } from '@alova/mock'; + +// 模拟小程序用户数据 +const mockAppUsers = [ + { + id: '1', + openid: 'oABC123def456', + phone: '13800138001', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user1', + nickname: '张家长', + studentId: 'student1', + studentName: '张小明', + schoolId: '1', + schoolName: '建阳区实验小学', + gradeId: '1', + gradeName: '一年级', + classId: '1', + className: '一年级1班', + studentSeatNumber: 15, + totalScore: 85, + answerCount: 10, + lastAnswerTime: '2024-01-15 14:30:00', + createTime: '2024-01-01 10:00:00', + updateTime: '2024-01-15 14:30:00' + }, + { + id: '2', + openid: 'oABC789ghi012', + phone: '13800138002', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user2', + nickname: '李家长', + studentId: 'student2', + studentName: '李小红', + schoolId: '1', + schoolName: '建阳区实验小学', + gradeId: '1', + gradeName: '一年级', + classId: '2', + className: '一年级2班', + studentSeatNumber: 8, + totalScore: 92, + answerCount: 12, + lastAnswerTime: '2024-01-14 16:20:00', + createTime: '2024-01-01 11:00:00', + updateTime: '2024-01-14 16:20:00' + }, + { + id: '3', + openid: 'oABC345jkl678', + phone: '13800138003', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user3', + nickname: '王家长', + studentId: 'student3', + studentName: '王小强', + schoolId: '2', + schoolName: '建阳区第一中学', + gradeId: '3', + gradeName: '七年级', + classId: '3', + className: '七年级1班', + studentSeatNumber: 12, + totalScore: 78, + answerCount: 8, + lastAnswerTime: '2024-01-13 15:45:00', + createTime: '2024-01-01 12:00:00', + updateTime: '2024-01-13 15:45:00' + }, + { + id: '4', + openid: 'oABC901mno234', + phone: '13800138004', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user4', + nickname: '刘家长', + studentId: 'student4', + studentName: '刘小丽', + schoolId: '1', + schoolName: '建阳区实验小学', + gradeId: '2', + gradeName: '二年级', + classId: '4', + className: '二年级1班', + studentSeatNumber: 5, + totalScore: 95, + answerCount: 15, + lastAnswerTime: '2024-01-16 11:20:00', + createTime: '2024-01-01 13:00:00', + updateTime: '2024-01-16 11:20:00' + }, + { + id: '5', + openid: 'oABC567pqr890', + phone: '13800138005', + avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user5', + nickname: '陈家长', + studentId: 'student5', + studentName: '陈小华', + schoolId: '1', + schoolName: '建阳区实验小学', + gradeId: '1', + gradeName: '一年级', + classId: '1', + className: '一年级1班', + studentSeatNumber: 20, + totalScore: 67, + answerCount: 6, + lastAnswerTime: '2024-01-12 09:30:00', + createTime: '2024-01-01 14:00:00', + updateTime: '2024-01-12 09:30:00' + } +]; + +// 用户管理接口的mock数据 +export default defineMock({ + // 获取用户列表 + '[GET]/admin/users': ({ query }) => { + let filteredUsers = [...mockAppUsers]; + + // 关键词搜索(学生姓名或家长手机号) + if (query.keyword) { + filteredUsers = filteredUsers.filter(u => + u.studentName?.includes(query.keyword!) || + u.phone.includes(query.keyword!) || + u.nickname?.includes(query.keyword!) + ); + } + + // 学校筛选 + if (query.schoolId) { + filteredUsers = filteredUsers.filter(u => u.schoolId === query.schoolId); + } + + // 年级筛选 + if (query.gradeId) { + filteredUsers = filteredUsers.filter(u => u.gradeId === query.gradeId); + } + + // 班级筛选 + if (query.classId) { + filteredUsers = filteredUsers.filter(u => u.classId === query.classId); + } + + // 按创建时间倒序排列 + filteredUsers.sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime()); + + // 分页 + const page = parseInt(query.page) || 1; + const pageSize = parseInt(query.pageSize) || 10; + const total = filteredUsers.length; + const start = (page - 1) * pageSize; + const end = start + pageSize; + + return { + code: 200, + message: 'success', + data: { + list: filteredUsers.slice(start, end), + total, + page, + pageSize + } + }; + }, + + // 获取用户详情 + '[GET]/admin/users/{id}': ({ params }) => { + const user = mockAppUsers.find(u => u.id === params.id); + if (!user) { + return { + status: 404, + body: { + code: 404, + message: '用户不存在', + data: null + } + }; + } + + return { + code: 200, + message: 'success', + data: user + }; + }, + + // 解绑家长与学生关系 + '[PUT]/admin/users/{id}/unbind': ({ params }) => { + const user = mockAppUsers.find(u => u.id === params.id); + if (!user) { + return { + status: 404, + body: { + code: 404, + message: '用户不存在', + data: null + } + }; + } + + // 清空学生信息 + user.studentId = undefined; + user.studentName = undefined; + user.schoolId = ''; + user.schoolName = ''; + user.gradeId = ''; + user.gradeName = ''; + user.classId = ''; + user.className = ''; + user.studentSeatNumber = undefined; + user.totalScore = 0; + user.answerCount = 0; + user.lastAnswerTime = undefined; + user.updateTime = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: 'success', + data: { message: '解绑成功' } + }; + }, + + // 禁用用户 + '[PUT]/admin/users/{id}/disable': ({ params }) => { + const user = mockAppUsers.find(u => u.id === params.id); + if (!user) { + return { + status: 404, + body: { + code: 404, + message: '用户不存在', + data: null + } + }; + } + + user.updateTime = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: 'success', + data: { message: '禁用成功' } + }; + }, + + // 启用用户 + '[PUT]/admin/users/{id}/enable': ({ params }) => { + const user = mockAppUsers.find(u => u.id === params.id); + if (!user) { + return { + status: 404, + body: { + code: 404, + message: '用户不存在', + data: null + } + }; + } + + user.updateTime = new Date().toLocaleString('zh-CN'); + + return { + code: 200, + message: 'success', + data: { message: '启用成功' } + }; + } +}, true); diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..a04e8b4 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,151 @@ +import { createRouter, createWebHashHistory, type RouteRecordRaw } from 'vue-router'; +import { useAuthStore } from '@/stores/auth'; + +const routes: RouteRecordRaw[] = [ + { + path: '/', + redirect: '/admin' + }, + { + path: '/login', + name: 'Login', + component: () => import('@/views/auth/LoginPage.vue'), + meta: { + title: '登录', + requiresGuest: true + } + }, + { + path: '/admin', + component: () => import('@/components/layout/AdminLayout.vue'), + meta: { + requiresAuth: true + }, + children: [ + { + path: '', + name: 'Dashboard', + component: () => import('@/views/dashboard/DashboardPage.vue'), + meta: { + title: '仪表盘' + } + }, + { + path: 'questions', + name: 'Questions', + component: () => import('@/views/questions/QuestionPage.vue'), + meta: { + title: '题库管理' + } + }, + { + path: 'banners', + name: 'Banners', + component: () => import('@/views/banners/BannerPage.vue'), + meta: { + title: '轮播图管理' + } + }, + { + path: 'records', + name: 'Records', + component: () => import('@/views/records/RecordPage.vue'), + meta: { + title: '答题记录' + } + }, + { + path: 'users', + name: 'Users', + component: () => import('@/views/users/UserPage.vue'), + meta: { + title: '用户管理' + } + }, + { + path: 'schools', + name: 'Schools', + component: () => import('@/views/schools/SchoolPage.vue'), + meta: { + title: '学校管理' + } + }, + { + path: 'grades', + name: 'Grades', + component: () => import('@/views/grades/GradePage.vue'), + meta: { + title: '年级管理' + } + }, + { + path: 'classes', + name: 'Classes', + component: () => import('@/views/classes/ClassPage.vue'), + meta: { + title: '班级管理' + } + }, + { + path: 'profile', + name: 'Profile', + component: () => import('@/views/profile/ProfilePage.vue'), + meta: { + title: '个人信息' + } + }, + { + path: 'password', + name: 'Password', + component: () => import('@/views/profile/PasswordPage.vue'), + meta: { + title: '修改密码' + } + } + ] + }, + { + path: '/:pathMatch(.*)*', + name: 'NotFound', + component: () => import('@/views/auth/LoginPage.vue'), + meta: { + title: '页面未找到' + } + } +]; + +const router = createRouter({ + history: createWebHashHistory(), + routes +}); + +// 路由守卫 +router.beforeEach((to, _from, next) => { + const authStore = useAuthStore(); + + + // 设置页面标题 + if (to.meta.title) { + document.title = `${to.meta.title} - 朱子文化管理后台`; + } + + // 需要认证的页面 + if (to.meta.requiresAuth) { + if (!authStore.isLoggedIn) { + next('/login'); + return; + } + } + + // 需要游客身份的页面(如登录页) + if (to.meta.requiresGuest) { + if (authStore.isLoggedIn) { + next('/admin'); + return; + } + } + + next(); +}); + +export default router; \ No newline at end of file diff --git a/src/stores/auth.ts b/src/stores/auth.ts new file mode 100644 index 0000000..4cb99f0 --- /dev/null +++ b/src/stores/auth.ts @@ -0,0 +1,71 @@ +import { defineStore } from 'pinia'; +import { ref, computed } from 'vue'; +import type { LoginResponse } from '@/apis/auth'; + +/** + * 用户认证状态管理 + */ +export const useAuthStore = defineStore('auth', () => { + // 状态 + const token = ref(''); + const refreshToken = ref(''); + const userInfo = ref(null); + const isLoggedIn = computed(() => !!token.value && !!userInfo.value); + + // 设置登录信息 + const setAuth = (loginData: LoginResponse) => { + token.value = loginData.token; + refreshToken.value = loginData.refreshToken; + userInfo.value = loginData.userInfo; + }; + + // 设置用户信息 + const setUserInfo = (user: LoginResponse['userInfo']) => { + userInfo.value = user; + }; + + // 更新token + const updateToken = (newToken: string, newRefreshToken?: string) => { + token.value = newToken; + if (newRefreshToken) { + refreshToken.value = newRefreshToken; + } + }; + + // 清除登录信息 + const clearAuth = () => { + token.value = ''; + refreshToken.value = ''; + userInfo.value = null; + }; + + // 检查是否为管理员 + const isAdmin = computed(() => userInfo.value?.role === 'admin'); + + // 检查是否为操作员 + const isOperator = computed(() => userInfo.value?.role === 'operator'); + + return { + // 状态 + token, + refreshToken, + userInfo, + isLoggedIn, + + // 计算属性 + isAdmin, + isOperator, + + // 方法 + setAuth, + setUserInfo, + updateToken, + clearAuth, + }; +}, { + persist: { + key: 'zhuzi-admin-auth', + storage: localStorage, + pick: ['token', 'refreshToken', 'userInfo'] + } +}); diff --git a/src/utils/request/adapter/localforageStorageAdapter.ts b/src/utils/request/adapter/localforageStorageAdapter.ts new file mode 100644 index 0000000..31852cc --- /dev/null +++ b/src/utils/request/adapter/localforageStorageAdapter.ts @@ -0,0 +1,17 @@ +import localforage from "localforage"; + + +export const localforageStorageAdapter = { + async set(key: string, value: any) { + await localforage.setItem(key, value); + }, + async get(key: string) { + return await localforage.getItem(key); + }, + async remove(key: any) { + await localforage.removeItem(key); + }, + async clear() { + await localforage.clear(); + } +}; diff --git a/src/utils/request/index.ts b/src/utils/request/index.ts new file mode 100644 index 0000000..d15f554 --- /dev/null +++ b/src/utils/request/index.ts @@ -0,0 +1,133 @@ +import {createAlova} from 'alova'; +import VueHook from 'alova/vue'; +import {localforageStorageAdapter} from "@/utils/request/adapter/localforageStorageAdapter.ts"; +import {createServerTokenAuthentication} from "alova/client"; +import type {AxiosResponse, AxiosResponseHeaders} from "axios"; +import type {AlovaAxiosRequestConfig} from "@alova/adapter-axios"; + +import {axiosRequestAdapter} from "@alova/adapter-axios"; +import {createAlovaMockAdapter} from '@alova/mock'; +import {mockGroups} from '@/mocks/index.mock'; + + +// 创建axios适配器 +const httpAdapter = axiosRequestAdapter(); + +// 创建mock适配器 +const mockAdapter = createAlovaMockAdapter(mockGroups, { + // 全局控制是否启用mock接口,默认为true + enable: import.meta.env.VITE_NODE_ENV === 'development', + + // 非模拟请求适配器,用于未匹配mock接口时发送请求 + httpAdapter, + + // mock接口响应延迟,单位毫秒 + delay: 500, + + matchMode: "methodurl", + + // 是否打印mock接口请求信息 + mockRequestLogger: import.meta.env.DEV, + + // 模拟接口回调,适配axios响应格式 + onMockResponse: (response, _request, currentMethod) => { + if (import.meta.env.DEV) { + console.log('🚀 Mock响应:', { + url: currentMethod.url, + method: currentMethod.type, + response: response.body || response + }); + } + + // 创建AxiosResponse格式的响应 + const axiosResponse: AxiosResponse = { + data: response.body || response, + status: response.status || 200, + statusText: response.statusText || 'OK', + headers: response.responseHeaders || {}, + config: {} as any, + request: {} as any + }; + + // 转换headers格式以兼容AxiosResponseHeaders + const headers: AxiosResponseHeaders = {} as AxiosResponseHeaders; + if (response.responseHeaders) { + Object.assign(headers, response.responseHeaders); + } + + return { + response: axiosResponse, + headers + }; + }, + + // 模拟错误回调 + onMockError: (error, currentMethod) => { + console.error('❌ Mock错误:', error, currentMethod?.url); + return { + name: error.name, + message: error.message, + stack: error.stack + }; + } +}); + +const {onAuthRequired, onResponseRefreshToken} = createServerTokenAuthentication({ + refreshTokenOnSuccess: { + // 在请求前触发,将接收到method参数,并返回boolean表示token是否过期 + isExpired: (_response: any, _method: any) => { + return false + }, + + // 当token过期时触发,在此函数中触发刷新token + handler: async () => { + + } + } +}); + +export const request = createAlova({ + timeout: 10000, + baseURL: import.meta.env.VITE_APP_BASE_API, + statesHook: VueHook, + // 使用mock适配器,在生产环境自动切换到http适配器 + requestAdapter: import.meta.env.VITE_NODE_ENV === 'development' ? mockAdapter : httpAdapter, + l2Cache: localforageStorageAdapter, + cacheLogger: import.meta.env.VITE_NODE_ENV === 'development', + cacheFor: null, + // 设置全局的请求拦截器 + beforeRequest: onAuthRequired(async (method: any) => { + // 从localStorage获取token并设置到请求头 + const token = localStorage.getItem('auth-token'); + if (token) { + method.config.headers.Authorization = `Bearer ${token}`; + } + }), + // 响应拦截器 + responded: onResponseRefreshToken({ + onSuccess: async (response: any, _method: any) => { + if (response.data instanceof Blob) { + return response; + } + + // 处理标准API响应格式 { code, message, data } + if (response.data && typeof response.data === 'object' && 'code' in response.data) { + if (response.data.code === 200) { + return response.data.data; + } else { + // 抛出业务错误 + throw new Error(response.data.message || '请求失败'); + } + } + + return response.data; + }, + onError: + (error: any, _method: any) => { + return Promise.reject(error); + }, + }), +}); + + diff --git a/src/views/auth/LoginPage.vue b/src/views/auth/LoginPage.vue new file mode 100644 index 0000000..c365ec3 --- /dev/null +++ b/src/views/auth/LoginPage.vue @@ -0,0 +1,373 @@ + + + + + diff --git a/src/views/banners/BannerPage.vue b/src/views/banners/BannerPage.vue new file mode 100644 index 0000000..edc26f1 --- /dev/null +++ b/src/views/banners/BannerPage.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/src/views/banners/components/BannerForm.vue b/src/views/banners/components/BannerForm.vue new file mode 100644 index 0000000..c004d42 --- /dev/null +++ b/src/views/banners/components/BannerForm.vue @@ -0,0 +1,416 @@ + + + + + diff --git a/src/views/banners/components/BannerList.vue b/src/views/banners/components/BannerList.vue new file mode 100644 index 0000000..33008de --- /dev/null +++ b/src/views/banners/components/BannerList.vue @@ -0,0 +1,444 @@ + + + + + diff --git a/src/views/classes/ClassPage.vue b/src/views/classes/ClassPage.vue new file mode 100644 index 0000000..8c03019 --- /dev/null +++ b/src/views/classes/ClassPage.vue @@ -0,0 +1,438 @@ + + + + + diff --git a/src/views/classes/components/ClassBatchImport.vue b/src/views/classes/components/ClassBatchImport.vue new file mode 100644 index 0000000..c99f0d6 --- /dev/null +++ b/src/views/classes/components/ClassBatchImport.vue @@ -0,0 +1,367 @@ + + + + + diff --git a/src/views/classes/components/ClassFormModal.vue b/src/views/classes/components/ClassFormModal.vue new file mode 100644 index 0000000..68a373d --- /dev/null +++ b/src/views/classes/components/ClassFormModal.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/src/views/classes/components/ClassStudentsModal.vue b/src/views/classes/components/ClassStudentsModal.vue new file mode 100644 index 0000000..2c6e438 --- /dev/null +++ b/src/views/classes/components/ClassStudentsModal.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/src/views/classes/components/StudentFormModal.vue b/src/views/classes/components/StudentFormModal.vue new file mode 100644 index 0000000..89000d9 --- /dev/null +++ b/src/views/classes/components/StudentFormModal.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/src/views/dashboard/DashboardPage.vue b/src/views/dashboard/DashboardPage.vue new file mode 100644 index 0000000..a61374a --- /dev/null +++ b/src/views/dashboard/DashboardPage.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/views/grades/GradePage.vue b/src/views/grades/GradePage.vue new file mode 100644 index 0000000..323aab4 --- /dev/null +++ b/src/views/grades/GradePage.vue @@ -0,0 +1,344 @@ + + + + + diff --git a/src/views/grades/components/GradeFormModal.vue b/src/views/grades/components/GradeFormModal.vue new file mode 100644 index 0000000..dec0e9d --- /dev/null +++ b/src/views/grades/components/GradeFormModal.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/src/views/profile/PasswordPage.vue b/src/views/profile/PasswordPage.vue new file mode 100644 index 0000000..a3c4bd8 --- /dev/null +++ b/src/views/profile/PasswordPage.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/src/views/profile/ProfilePage.vue b/src/views/profile/ProfilePage.vue new file mode 100644 index 0000000..52deb7a --- /dev/null +++ b/src/views/profile/ProfilePage.vue @@ -0,0 +1,362 @@ + + + + + diff --git a/src/views/questions/QuestionPage.vue b/src/views/questions/QuestionPage.vue new file mode 100644 index 0000000..051e2f7 --- /dev/null +++ b/src/views/questions/QuestionPage.vue @@ -0,0 +1,281 @@ + + + + + diff --git a/src/views/questions/components/BatchOperations.vue b/src/views/questions/components/BatchOperations.vue new file mode 100644 index 0000000..5bab4a8 --- /dev/null +++ b/src/views/questions/components/BatchOperations.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/views/questions/components/ImportExport.vue b/src/views/questions/components/ImportExport.vue new file mode 100644 index 0000000..dba974e --- /dev/null +++ b/src/views/questions/components/ImportExport.vue @@ -0,0 +1,354 @@ + + + + + diff --git a/src/views/questions/components/QuestionForm.vue b/src/views/questions/components/QuestionForm.vue new file mode 100644 index 0000000..21dbc71 --- /dev/null +++ b/src/views/questions/components/QuestionForm.vue @@ -0,0 +1,487 @@ + + + + + diff --git a/src/views/questions/components/QuestionList.vue b/src/views/questions/components/QuestionList.vue new file mode 100644 index 0000000..e0a9c99 --- /dev/null +++ b/src/views/questions/components/QuestionList.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/src/views/records/RecordPage.vue b/src/views/records/RecordPage.vue new file mode 100644 index 0000000..0f3c909 --- /dev/null +++ b/src/views/records/RecordPage.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/src/views/records/components/RecordDetailModal.vue b/src/views/records/components/RecordDetailModal.vue new file mode 100644 index 0000000..cfcfc0c --- /dev/null +++ b/src/views/records/components/RecordDetailModal.vue @@ -0,0 +1,468 @@ + + + + + diff --git a/src/views/records/components/RecordList.vue b/src/views/records/components/RecordList.vue new file mode 100644 index 0000000..d772dea --- /dev/null +++ b/src/views/records/components/RecordList.vue @@ -0,0 +1,409 @@ + + + + + diff --git a/src/views/records/components/StatisticsCards.vue b/src/views/records/components/StatisticsCards.vue new file mode 100644 index 0000000..7dbf832 --- /dev/null +++ b/src/views/records/components/StatisticsCards.vue @@ -0,0 +1,384 @@ + + + + + diff --git a/src/views/schools/SchoolPage.vue b/src/views/schools/SchoolPage.vue new file mode 100644 index 0000000..c341783 --- /dev/null +++ b/src/views/schools/SchoolPage.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/src/views/schools/components/BatchImport.vue b/src/views/schools/components/BatchImport.vue new file mode 100644 index 0000000..ec630c5 --- /dev/null +++ b/src/views/schools/components/BatchImport.vue @@ -0,0 +1,571 @@ + + + + + diff --git a/src/views/schools/components/ClassForm.vue b/src/views/schools/components/ClassForm.vue new file mode 100644 index 0000000..dbde2e8 --- /dev/null +++ b/src/views/schools/components/ClassForm.vue @@ -0,0 +1,390 @@ + + + + + diff --git a/src/views/schools/components/GradeForm.vue b/src/views/schools/components/GradeForm.vue new file mode 100644 index 0000000..1803753 --- /dev/null +++ b/src/views/schools/components/GradeForm.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/src/views/schools/components/SchoolForm.vue b/src/views/schools/components/SchoolForm.vue new file mode 100644 index 0000000..a5eee23 --- /dev/null +++ b/src/views/schools/components/SchoolForm.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/src/views/schools/components/SchoolTree.vue b/src/views/schools/components/SchoolTree.vue new file mode 100644 index 0000000..7349752 --- /dev/null +++ b/src/views/schools/components/SchoolTree.vue @@ -0,0 +1,549 @@ + + + + + diff --git a/src/views/users/UserPage.vue b/src/views/users/UserPage.vue new file mode 100644 index 0000000..8378cfd --- /dev/null +++ b/src/views/users/UserPage.vue @@ -0,0 +1,355 @@ + + + + + diff --git a/src/views/users/components/UserDetailModal.vue b/src/views/users/components/UserDetailModal.vue new file mode 100644 index 0000000..7fba547 --- /dev/null +++ b/src/views/users/components/UserDetailModal.vue @@ -0,0 +1,373 @@ + + + + + diff --git a/src/views/users/components/UserList.vue b/src/views/users/components/UserList.vue new file mode 100644 index 0000000..667525f --- /dev/null +++ b/src/views/users/components/UserList.vue @@ -0,0 +1,363 @@ + + + + + diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..9409b99 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,23 @@ +/// + + +declare interface ImportMetaEnv { + readonly VITE_APP_BASE_API: string; + readonly VITE_API_BASE_URL: string; + readonly VITE_NODE_ENV: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +declare module '*.vue' { + import type {DefineComponent} from 'vue'; + const component: DefineComponent; + export default component; +} + +declare module '*.svg' { + const content: any; + export default content; +} \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..5400167 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "baseUrl": "./", + "paths": { + "@": [ + "src" + ], + "@/*": [ + "src/*" + ] + } + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..f85a399 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..13a5e98 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,86 @@ +import {defineConfig, loadEnv} from 'vite'; +import vue from '@vitejs/plugin-vue'; +import * as path from 'path'; +import Components from 'unplugin-vue-components/vite'; +import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers'; + + +export default defineConfig(({mode}: { mode: string }): object => { + const env: Record = loadEnv(mode, process.cwd()); + return { + publicDir: 'public', + base: '/', + resolve: { + //设置别名 + alias: { + '@': path.resolve(__dirname, 'src') + } + }, + worker: { + format: 'es' + }, + plugins: [ + vue(), + Components({ + dts: true, + dirs: ['src/components', 'src/views'], + resolvers: [ + AntDesignVueResolver({ + importStyle: false, + resolveIcons: true + }), + ], + }), + ], + css: { + preprocessorOptions: { + scss: { + api: "modern-compiler", + javascriptEnabled: true, + additionalData: `@use "@/assets/styles/index.scss";` + }, + less: { + javascriptEnabled: true, + }, + }, + }, + + esbuild: { + drop: env.VITE_NODE_ENV === 'production' ? ['console', 'debugger'] : [], + }, + build: { + outDir: "dist", // 指定输出路径 + assetsDir: "assets", // 指定生成静态文件目录 + assetsInlineLimit: "4096", // 小于此阈值的导入或引用资源将内联为 base64 编码 + cssCodeSplit: true, // 启用 CSS 代码拆分 + sourcemap: false, // 构建后是否生成 source map 文件 + minify: "esbuild", // 指定使用哪种混淆器 + write: true, // 启用将构建后的文件写入磁盘 + emptyOutDir: true, // 构建时清空该目录 + brotliSize: true, // 启用 brotli 压缩大小报告 + chunkSizeWarningLimit: 15000, // chunk 大小警告的限制 + watch: null, // 设置为 {} 则会启用 rollup 的监听器 + rollupOptions: { // 自定义底层的 Rollup 打包配置 + output: { + format: 'es', + chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称 + entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称 + assetFileNames: '[ext]/[name]-[hash].[ext]',// 资源文件像 字体,图片等 + }, + } + }, + server: { + proxy: env.VITE_NODE_ENV === 'development' ? {} : { + [env.VITE_APP_BASE_API]: { + //后端接口的baseurl + target: env.VITE_API_BASE_URL, + //是否允许跨域 + changeOrigin: true, + rewrite: (path: string) => path.replace(RegExp(`^${env.VITE_APP_BASE_API}`), ""), + }, + }, + }, + }; + } +) +;