From 9f429196c894365c2f74a2bf803ec24202ab69a3 Mon Sep 17 00:00:00 2001 From: lengxiaofei <2102819372@qq.com> Date: Mon, 23 Jun 2025 11:09:57 +0800 Subject: [PATCH] first commit --- .env | 2 + .env.development | 1 + .env.production | 1 + .gitignore | 24 + .vscode/extensions.json | 3 + README.md | 7 + index.html | 13 + package.json | 32 + pnpm-lock.yaml | 2114 ++++++++++++++++++++++++++++++++++++ public/vite.svg | 1 + src/App.vue | 9 + src/api/api.ts | 0 src/env/env.config.ts | 47 + src/env/env.ts | 95 ++ src/http/request.ts | 31 + src/main.ts | 11 + src/store/index.ts | 3 + src/style.css | 120 ++ src/utils/logger/Logger.ts | 325 ++++++ src/utils/logger/types.ts | 33 + src/utils/storage.ts | 144 +++ src/utils/websocket.ts | 88 ++ src/view/index.vue | 5 + src/vite-env.d.ts | 15 + tsconfig.app.json | 22 + tsconfig.json | 7 + tsconfig.node.json | 25 + uno.config.ts | 5 + vite.config.ts | 19 + 29 files changed, 3202 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 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/vite.svg create mode 100644 src/App.vue create mode 100644 src/api/api.ts create mode 100644 src/env/env.config.ts create mode 100644 src/env/env.ts create mode 100644 src/http/request.ts create mode 100644 src/main.ts create mode 100644 src/store/index.ts create mode 100644 src/style.css create mode 100644 src/utils/logger/Logger.ts create mode 100644 src/utils/logger/types.ts create mode 100644 src/utils/storage.ts create mode 100644 src/utils/websocket.ts create mode 100644 src/view/index.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 uno.config.ts create mode 100644 vite.config.ts diff --git a/.env b/.env new file mode 100644 index 0000000..2fc252d --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +VITE_APP_TITLE = "web_app" +VITE_API_TIMEOUT = "5000" \ No newline at end of file diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..8ce19de --- /dev/null +++ b/.env.development @@ -0,0 +1 @@ +VITE_API_BASE_URL = "http://localhost:4444" \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..8ce19de --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +VITE_API_BASE_URL = "http://localhost:4444" \ No newline at end of file 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..742dd7c --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# 无样式组件库和原子化css的前端技术栈 + +Vue 3 + TypeScript + Vite + +`node:22.13.1` `npm:11.4.0` + +其他依赖:`primeVue` `fontawesome` `unocss` `vue-router` `pinia` `vueuse` `dayjs` diff --git a/index.html b/index.html new file mode 100644 index 0000000..dde16aa --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Vue + TS + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..46791dc --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "storecamera", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^6.7.2", + "@primeuix/themes": "^1.1.2", + "@vueuse/core": "^13.4.0", + "axios": "^1.10.0", + "dayjs": "^1.11.13", + "pinia": "^3.0.3", + "primevue": "^4.3.5", + "vue": "^3.5.13", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@types/node": "^24.0.3", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "sass-loader": "^16.0.5", + "typescript": "~5.8.3", + "unocss": "^66.2.3", + "vite": "^6.3.5", + "vue-tsc": "^2.2.8" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..390f79a --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2114 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@fortawesome/fontawesome-free': + specifier: ^6.7.2 + version: 6.7.2 + '@primeuix/themes': + specifier: ^1.1.2 + version: 1.1.2 + '@vueuse/core': + specifier: ^13.4.0 + version: 13.4.0(vue@3.5.17(typescript@5.8.3)) + axios: + specifier: ^1.10.0 + version: 1.10.0 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + pinia: + specifier: ^3.0.3 + version: 3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)) + primevue: + specifier: ^4.3.5 + version: 4.3.5(vue@3.5.17(typescript@5.8.3)) + vue: + specifier: ^3.5.13 + version: 3.5.17(typescript@5.8.3) + vue-router: + specifier: ^4.5.1 + version: 4.5.1(vue@3.5.17(typescript@5.8.3)) + devDependencies: + '@types/node': + specifier: ^24.0.3 + version: 24.0.3 + '@vitejs/plugin-vue': + specifier: ^5.2.3 + version: 5.2.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3)) + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)) + sass-loader: + specifier: ^16.0.5 + version: 16.0.5 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + unocss: + specifier: ^66.2.3 + version: 66.2.3(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3)) + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@24.0.3)(jiti@2.4.2) + vue-tsc: + specifier: ^2.2.8 + version: 2.2.10(typescript@5.8.3) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fortawesome/fontawesome-free@6.7.2': + resolution: {integrity: sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==} + engines: {node: '>=6'} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@primeuix/styled@0.6.4': + resolution: {integrity: sha512-7ePLwqazLV0x269YlPMeE4wtQKT0NScY2/gEin0/96krTiGiElmlzKMMbH69bVApm/sfen5DZGuCEEwPiBJJ5g==} + engines: {node: '>=12.11.0'} + + '@primeuix/styles@1.1.2': + resolution: {integrity: sha512-KSwyuxNhl2bVv9eBr6SQHyRUtg93mCL7xqfQPoEzr7tgKfvIHJdGcMSSFxYyEXQv4EmSF6JxVkCWprKFAfnR5Q==} + + '@primeuix/themes@1.1.2': + resolution: {integrity: sha512-yxnmMqMct6RYWX6m9gS9AIG8QArjnROQzBqQf8UDQggAedX3My1fxr9FKEpvZMoY39WD494kG0pU9zIa1k2XyA==} + + '@primeuix/utils@0.5.4': + resolution: {integrity: sha512-8LggV3Jz59pymHQD10e/u63z/GemQ22RBeu2Gb1eJgBYVwn1iOb82LR+daeAc/LxrXCC5pHnftnCmnZO6vInLA==} + engines: {node: '>=12.11.0'} + + '@primevue/core@4.3.5': + resolution: {integrity: sha512-YBlSr/EbXsnsTOyfgqmbrJQ7AI5EThaeGZvfDFjPIIEpokEK+Q32++9xPn3MH8rcM8zPsfMeBOWi4/OJkOqG4w==} + engines: {node: '>=12.11.0'} + peerDependencies: + vue: ^3.5.0 + + '@primevue/icons@4.3.5': + resolution: {integrity: sha512-+V8XG6MEvczw3Ufz7+ABSSCaVdFCYKRHvVDmXpS65AUeQTDEqmJz3xx2UiYYdASA6Gb2yIKdVztTcRjHFtiAnw==} + engines: {node: '>=12.11.0'} + + '@quansync/fs@0.1.3': + resolution: {integrity: sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==} + engines: {node: '>=20.0.0'} + + '@rollup/rollup-android-arm-eabi@4.44.0': + resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.44.0': + resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.44.0': + resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.44.0': + resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.44.0': + resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.44.0': + resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.44.0': + resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.44.0': + resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.44.0': + resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.44.0': + resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.44.0': + resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': + resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.44.0': + resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.44.0': + resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.44.0': + resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.44.0': + resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.44.0': + resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.44.0': + resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.44.0': + resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.44.0': + resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@24.0.3': + resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@unocss/astro@66.2.3': + resolution: {integrity: sha512-tWqQmsdyEV328NhUU1pLkn6SFXeQmDb+EwM7iqDaswmBBwBUGktd3xAFJqO3fBEIhQEmXzj4oHZCIO7GuXcLxA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + peerDependenciesMeta: + vite: + optional: true + + '@unocss/cli@66.2.3': + resolution: {integrity: sha512-S5Go7hxRgi9WYQmWq7MxhVeROIrt0Ml6slbCbV3TKxHnllSp64BfQTj/69txB29fLLuwiHlnID7VLdVOd0iIQA==} + engines: {node: '>=14'} + hasBin: true + + '@unocss/config@66.2.3': + resolution: {integrity: sha512-Xd2P1NgD7poYKDMI176yPvmMojBbc1HH26dgG8OYpNiBuzdhdLuyfSLPbpAOXPSyoK8Fu2BikS+NLTWQ8MmgFQ==} + engines: {node: '>=14'} + + '@unocss/core@66.2.3': + resolution: {integrity: sha512-mRpwm3HUAqCtQrBB7+vkCp0qDZT+G1s2EAVJIF6zzrnoqb2BmIlHgz7DXVDufRFMRJtQUCp2jVMtEQZCTXEVjQ==} + + '@unocss/extractor-arbitrary-variants@66.2.3': + resolution: {integrity: sha512-QQig1VnIfFJPVnp3lSM0za/7zZS91A+qOmEfOvbabiJ+dyI48wUU6MgP6/xZ5qZK6bvkuyQC9Ta73g9vXXuSZw==} + + '@unocss/inspector@66.2.3': + resolution: {integrity: sha512-dNJzfrUo0z87Lu+NdaG/EEPQw+b3QjH0c6Wj1mGyw9kGDkTtGVLMyNVVwLbzMCOCY/W2vPgvyVi+A3scTjGYFQ==} + + '@unocss/postcss@66.2.3': + resolution: {integrity: sha512-OVPpXvh0RluVws5T1kupWTH5mfh7DjKQeW41lV8lV845HLDEdiq5ABaKsIQ8eXKVzo/scWje/s2C/lZObMoSZw==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + + '@unocss/preset-attributify@66.2.3': + resolution: {integrity: sha512-qAJIlqfdclowB6dRNklh1b2cedl6WMY+iTFe5yTh3A89RP5691tMI3eqiQvNqBsxv4cuU+Wf86rN6enffrEYfw==} + + '@unocss/preset-icons@66.2.3': + resolution: {integrity: sha512-U0Y4n7Oiq4wqAAdnhVInx6eu+dwxK0H35hwKdPra54ge0maDXzoYP9mFwsgZ7V4FZWZA985cSwhHgvcbqKeAVg==} + + '@unocss/preset-mini@66.2.3': + resolution: {integrity: sha512-qGdpp5ZiekR0QREFzc5eOTjMaYT3FWs9wQJqYKZNY3OJ8wMFpgDVoDTpqdfgvCiL7hheYITuxLDHw0gp/vDGBw==} + + '@unocss/preset-tagify@66.2.3': + resolution: {integrity: sha512-vAso+TdrcEipPiCJosYysE1VsEF9UlViwPQQuCBA1vQzhVY3pxfv5+JTHQ3Zg7q34HC+O8WfILnosUa/bMZcLQ==} + + '@unocss/preset-typography@66.2.3': + resolution: {integrity: sha512-EoJTNeGSUqEVB3ui+BGLTVnwzhPyyD0JQhLhj7bn7ASGHfBmaPFy8ywbOWgumLUwwd8zKR5qZB3jCLVM9n4gRg==} + + '@unocss/preset-uno@66.2.3': + resolution: {integrity: sha512-sLxZwh22eRvzipTf3OVsnfqVWm03rjcGR0jQ/TNZXoQLG8Jql3H560y+iS3if47E1RHTho5ySaBRRzfnLCUppA==} + + '@unocss/preset-web-fonts@66.2.3': + resolution: {integrity: sha512-I7raQj7QzjNeIdsBsEJiJE+fZ9+kpT8P/QnNVHmDtJgQOnFzmf+QdJrysEZ3tLqWX94tQX7gTBVElI138jGAAw==} + + '@unocss/preset-wind3@66.2.3': + resolution: {integrity: sha512-jthSiWYvsVg5MJVfEykJX35NtbqKDwcabvz7zmwSqhd6LgQwywi2vM7+iRhq+Os8UmX0N5q3WTAVRNsOWLBa+w==} + + '@unocss/preset-wind4@66.2.3': + resolution: {integrity: sha512-hRJ85hC6uPUDd1KWa+LRmlQW5bWsuAER+w9bfkpXK+LBHobnVlrkA2qVvBIzFFwh1Mled5+/dCNPuR/Wq/YoJw==} + + '@unocss/preset-wind@66.2.3': + resolution: {integrity: sha512-sA+x9ynJB6X1nzD6+FysPj1axYe/CeocG7zPCgIYPfZaZt4N1cB1QKqXjUojnNrwiNgQsr6h0ox/EGuNpgQsxg==} + + '@unocss/reset@66.2.3': + resolution: {integrity: sha512-szULFXX4IvNMQ+HKbu9p0KVME2pVhZBh9zQ1CSqA/TV9s2DRVMbNO5nVYjjBDkTnvr6N4IgWEGFVK+XVVITJRQ==} + + '@unocss/rule-utils@66.2.3': + resolution: {integrity: sha512-OL4s4pTb/YD66OK2b7NavwSqGTn5cDBaafkLphqnXKe9/DUfGoWNmeUAHfSzvM1QelprRXtPNLK/GIfUjcsNMg==} + engines: {node: '>=14'} + + '@unocss/transformer-attributify-jsx@66.2.3': + resolution: {integrity: sha512-Q8uxlp++BlOzumP17VuuIYQdtpKqPnJQE9IudF2xOyV9z92DWDuo0TzCro3i1+dMcBJ6+dH9R9M77EmMLZUCfw==} + + '@unocss/transformer-compile-class@66.2.3': + resolution: {integrity: sha512-KOISdvtp0fz4I2Thd37Kg0wFlKySkJnZtGXjwgoDJOSzS+oXYaWEvqIekzUoLly1GkyAE6V4TBNDrwod/sMFhg==} + + '@unocss/transformer-directives@66.2.3': + resolution: {integrity: sha512-7WJrqcFQ2zeGTbYxB2JZJlfPRrRpj3rIN5Ru3oxx1wbrAc6xNLRQUcPzYecSmmNLbIVx0JjhitiwnacErI1S3Q==} + + '@unocss/transformer-variant-group@66.2.3': + resolution: {integrity: sha512-gZ7E6KU9v/MEk5CcsJZClCfrVCmOpbU0e4GkK1scnk06Pt4uQn2lKc0zRGiAtFV64K6b0TPs2019LrRLPlhe4g==} + + '@unocss/vite@66.2.3': + resolution: {integrity: sha512-O2p4KVqitCG/mMq2eJQxVnf61LV/6JBC+ZdKftig4NssvDge8turcP0OjwWEvTh0bOOVD3yVjA0QBXO0BS7pMA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.14': + resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==} + + '@volar/source-map@2.4.14': + resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==} + + '@volar/typescript@2.4.14': + resolution: {integrity: sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==} + + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} + + '@vue/compiler-sfc@3.5.17': + resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} + + '@vue/compiler-ssr@3.5.17': + resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.7': + resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} + + '@vue/devtools-kit@7.7.7': + resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} + + '@vue/devtools-shared@7.7.7': + resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} + + '@vue/language-core@2.2.10': + resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.17': + resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} + + '@vue/runtime-core@3.5.17': + resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} + + '@vue/runtime-dom@3.5.17': + resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} + + '@vue/server-renderer@3.5.17': + resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} + peerDependencies: + vue: 3.5.17 + + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + + '@vue/tsconfig@0.7.0': + resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} + peerDependencies: + typescript: 5.x + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true + + '@vueuse/core@13.4.0': + resolution: {integrity: sha512-OnK7zW3bTq/QclEk17+vDFN3tuAm8ONb9zQUIHrYQkkFesu3WeGUx/3YzpEp+ly53IfDAT9rsYXgGW6piNZC5w==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@13.4.0': + resolution: {integrity: sha512-CPDQ/IgOeWbqItg1c/pS+Ulum63MNbpJ4eecjFJqgD/JUCJ822zLfpw6M9HzSvL6wbzMieOtIAW/H8deQASKHg==} + + '@vueuse/shared@13.4.0': + resolution: {integrity: sha512-+AxuKbw8R1gYy5T21V5yhadeNM7rJqb4cPaRI9DdGnnNl3uqXh+unvQ3uCaA2DjYLbNr1+l7ht/B4qEsRegX6A==} + peerDependencies: + vue: ^3.5.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + birpc@2.4.0: + resolution: {integrity: sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pinia@3.0.3: + resolution: {integrity: sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + primevue@4.3.5: + resolution: {integrity: sha512-KYjLrf7W96qVOFdX2nyap5IrJIEF8qEfLaHpMPw+H3SCd7zV6uiIrOYBNvovk677rhjBGpSjEbxTFY/K+i/DMA==} + engines: {node: '>=12.11.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.44.0: + resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sass-loader@16.0.5: + resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + webpack: + optional: true + + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + unconfig@7.3.2: + resolution: {integrity: sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==} + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + unocss@66.2.3: + resolution: {integrity: sha512-GoZSQLkgPqXxLbj+WqCr8/S/9l3CqUK/h8xKVFi7aJJ6njAjQivtCEuutZ/OgwafMhyW0rHUiwqTHuc4YQU1Eg==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 66.2.3 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + + unplugin-utils@0.2.4: + resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + engines: {node: '>=18.12.0'} + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + 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 + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-flow-layout@0.1.1: + resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==} + peerDependencies: + vue: ^3.4.37 + + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + peerDependencies: + vue: ^3.2.0 + + vue-tsc@2.2.10: + resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.17: + resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@8.1.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.27.5': + dependencies: + '@babel/types': 7.27.6 + + '@babel/types@7.27.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-x64@0.25.5': + optional: true + + '@esbuild/darwin-arm64@0.25.5': + optional: true + + '@esbuild/darwin-x64@0.25.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.5': + optional: true + + '@esbuild/freebsd-x64@0.25.5': + optional: true + + '@esbuild/linux-arm64@0.25.5': + optional: true + + '@esbuild/linux-arm@0.25.5': + optional: true + + '@esbuild/linux-ia32@0.25.5': + optional: true + + '@esbuild/linux-loong64@0.25.5': + optional: true + + '@esbuild/linux-mips64el@0.25.5': + optional: true + + '@esbuild/linux-ppc64@0.25.5': + optional: true + + '@esbuild/linux-riscv64@0.25.5': + optional: true + + '@esbuild/linux-s390x@0.25.5': + optional: true + + '@esbuild/linux-x64@0.25.5': + optional: true + + '@esbuild/netbsd-arm64@0.25.5': + optional: true + + '@esbuild/netbsd-x64@0.25.5': + optional: true + + '@esbuild/openbsd-arm64@0.25.5': + optional: true + + '@esbuild/openbsd-x64@0.25.5': + optional: true + + '@esbuild/sunos-x64@0.25.5': + optional: true + + '@esbuild/win32-arm64@0.25.5': + optional: true + + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.5': + optional: true + + '@fortawesome/fontawesome-free@6.7.2': {} + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.1 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.1 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@polka/url@1.0.0-next.29': {} + + '@primeuix/styled@0.6.4': + dependencies: + '@primeuix/utils': 0.5.4 + + '@primeuix/styles@1.1.2': + dependencies: + '@primeuix/styled': 0.6.4 + + '@primeuix/themes@1.1.2': + dependencies: + '@primeuix/styled': 0.6.4 + + '@primeuix/utils@0.5.4': {} + + '@primevue/core@4.3.5(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@primeuix/styled': 0.6.4 + '@primeuix/utils': 0.5.4 + vue: 3.5.17(typescript@5.8.3) + + '@primevue/icons@4.3.5(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@primeuix/utils': 0.5.4 + '@primevue/core': 4.3.5(vue@3.5.17(typescript@5.8.3)) + transitivePeerDependencies: + - vue + + '@quansync/fs@0.1.3': + dependencies: + quansync: 0.2.10 + + '@rollup/rollup-android-arm-eabi@4.44.0': + optional: true + + '@rollup/rollup-android-arm64@4.44.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.44.0': + optional: true + + '@rollup/rollup-darwin-x64@4.44.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.44.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.44.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.44.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.44.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.44.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.44.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.44.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.44.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.44.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.44.0': + optional: true + + '@types/estree@1.0.8': {} + + '@types/node@24.0.3': + dependencies: + undici-types: 7.8.0 + + '@types/web-bluetooth@0.0.21': {} + + '@unocss/astro@66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/reset': 66.2.3 + '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3)) + optionalDependencies: + vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2) + transitivePeerDependencies: + - vue + + '@unocss/cli@66.2.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@unocss/config': 66.2.3 + '@unocss/core': 66.2.3 + '@unocss/preset-uno': 66.2.3 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.4.2 + magic-string: 0.30.17 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + tinyglobby: 0.2.14 + unplugin-utils: 0.2.4 + + '@unocss/config@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + unconfig: 7.3.2 + + '@unocss/core@66.2.3': {} + + '@unocss/extractor-arbitrary-variants@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + + '@unocss/inspector@66.2.3(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/rule-utils': 66.2.3 + colorette: 2.0.20 + gzip-size: 6.0.0 + sirv: 3.0.1 + vue-flow-layout: 0.1.1(vue@3.5.17(typescript@5.8.3)) + transitivePeerDependencies: + - vue + + '@unocss/postcss@66.2.3(postcss@8.5.6)': + dependencies: + '@unocss/config': 66.2.3 + '@unocss/core': 66.2.3 + '@unocss/rule-utils': 66.2.3 + css-tree: 3.1.0 + postcss: 8.5.6 + tinyglobby: 0.2.14 + + '@unocss/preset-attributify@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + + '@unocss/preset-icons@66.2.3': + dependencies: + '@iconify/utils': 2.3.0 + '@unocss/core': 66.2.3 + ofetch: 1.4.1 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-mini@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/extractor-arbitrary-variants': 66.2.3 + '@unocss/rule-utils': 66.2.3 + + '@unocss/preset-tagify@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + + '@unocss/preset-typography@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/preset-mini': 66.2.3 + '@unocss/rule-utils': 66.2.3 + + '@unocss/preset-uno@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/preset-wind3': 66.2.3 + + '@unocss/preset-web-fonts@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + ofetch: 1.4.1 + + '@unocss/preset-wind3@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/preset-mini': 66.2.3 + '@unocss/rule-utils': 66.2.3 + + '@unocss/preset-wind4@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/extractor-arbitrary-variants': 66.2.3 + '@unocss/rule-utils': 66.2.3 + + '@unocss/preset-wind@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/preset-wind3': 66.2.3 + + '@unocss/reset@66.2.3': {} + + '@unocss/rule-utils@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + magic-string: 0.30.17 + + '@unocss/transformer-attributify-jsx@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + + '@unocss/transformer-compile-class@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + + '@unocss/transformer-directives@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + '@unocss/rule-utils': 66.2.3 + css-tree: 3.1.0 + + '@unocss/transformer-variant-group@66.2.3': + dependencies: + '@unocss/core': 66.2.3 + + '@unocss/vite@66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@unocss/config': 66.2.3 + '@unocss/core': 66.2.3 + '@unocss/inspector': 66.2.3(vue@3.5.17(typescript@5.8.3)) + chokidar: 3.6.0 + magic-string: 0.30.17 + pathe: 2.0.3 + tinyglobby: 0.2.14 + unplugin-utils: 0.2.4 + vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2) + transitivePeerDependencies: + - vue + + '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3))': + dependencies: + vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2) + vue: 3.5.17(typescript@5.8.3) + + '@volar/language-core@2.4.14': + dependencies: + '@volar/source-map': 2.4.14 + + '@volar/source-map@2.4.14': {} + + '@volar/typescript@2.4.14': + dependencies: + '@volar/language-core': 2.4.14 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.17': + dependencies: + '@babel/parser': 7.27.5 + '@vue/shared': 3.5.17 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.17': + dependencies: + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 + + '@vue/compiler-sfc@3.5.17': + dependencies: + '@babel/parser': 7.27.5 + '@vue/compiler-core': 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.17': + dependencies: + '@vue/compiler-dom': 3.5.17 + '@vue/shared': 3.5.17 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.7': + dependencies: + '@vue/devtools-kit': 7.7.7 + + '@vue/devtools-kit@7.7.7': + dependencies: + '@vue/devtools-shared': 7.7.7 + birpc: 2.4.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + + '@vue/devtools-shared@7.7.7': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@2.2.10(typescript@5.8.3)': + dependencies: + '@volar/language-core': 2.4.14 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.17 + alien-signals: 1.0.13 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.3 + + '@vue/reactivity@3.5.17': + dependencies: + '@vue/shared': 3.5.17 + + '@vue/runtime-core@3.5.17': + dependencies: + '@vue/reactivity': 3.5.17 + '@vue/shared': 3.5.17 + + '@vue/runtime-dom@3.5.17': + dependencies: + '@vue/reactivity': 3.5.17 + '@vue/runtime-core': 3.5.17 + '@vue/shared': 3.5.17 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 + vue: 3.5.17(typescript@5.8.3) + + '@vue/shared@3.5.17': {} + + '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))': + optionalDependencies: + typescript: 5.8.3 + vue: 3.5.17(typescript@5.8.3) + + '@vueuse/core@13.4.0(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.4.0 + '@vueuse/shared': 13.4.0(vue@3.5.17(typescript@5.8.3)) + vue: 3.5.17(typescript@5.8.3) + + '@vueuse/metadata@13.4.0': {} + + '@vueuse/shared@13.4.0(vue@3.5.17(typescript@5.8.3))': + dependencies: + vue: 3.5.17(typescript@5.8.3) + + acorn@8.15.0: {} + + alien-signals@1.0.13: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + asynckit@0.4.0: {} + + axios@1.10.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.3 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + birpc@2.4.0: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + consola@3.4.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + csstype@3.1.3: {} + + dayjs@1.11.13: {} + + de-indent@1.0.2: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + destr@2.0.5: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + entities@4.5.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + + estree-walker@2.0.2: {} + + exsolve@1.0.7: {} + + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + follow-redirects@1.15.9: {} + + form-data@4.0.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + 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 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globals@15.15.0: {} + + gopd@1.2.0: {} + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hookable@5.5.3: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-what@4.1.16: {} + + jiti@2.4.2: {} + + kolorist@1.8.0: {} + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + math-intrinsics@1.1.0: {} + + mdn-data@2.12.2: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + mitt@3.0.1: {} + + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + neo-async@2.6.2: {} + + node-fetch-native@1.6.6: {} + + normalize-path@3.0.0: {} + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + + package-manager-detector@1.3.0: {} + + path-browserify@1.0.1: {} + + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pinia@3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)): + dependencies: + '@vue/devtools-api': 7.7.7 + vue: 3.5.17(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + primevue@4.3.5(vue@3.5.17(typescript@5.8.3)): + dependencies: + '@primeuix/styled': 0.6.4 + '@primeuix/styles': 1.1.2 + '@primeuix/utils': 0.5.4 + '@primevue/core': 4.3.5(vue@3.5.17(typescript@5.8.3)) + '@primevue/icons': 4.3.5(vue@3.5.17(typescript@5.8.3)) + transitivePeerDependencies: + - vue + + proxy-from-env@1.1.0: {} + + quansync@0.2.10: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rfdc@1.4.1: {} + + rollup@4.44.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.44.0 + '@rollup/rollup-android-arm64': 4.44.0 + '@rollup/rollup-darwin-arm64': 4.44.0 + '@rollup/rollup-darwin-x64': 4.44.0 + '@rollup/rollup-freebsd-arm64': 4.44.0 + '@rollup/rollup-freebsd-x64': 4.44.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.0 + '@rollup/rollup-linux-arm-musleabihf': 4.44.0 + '@rollup/rollup-linux-arm64-gnu': 4.44.0 + '@rollup/rollup-linux-arm64-musl': 4.44.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.0 + '@rollup/rollup-linux-riscv64-gnu': 4.44.0 + '@rollup/rollup-linux-riscv64-musl': 4.44.0 + '@rollup/rollup-linux-s390x-gnu': 4.44.0 + '@rollup/rollup-linux-x64-gnu': 4.44.0 + '@rollup/rollup-linux-x64-musl': 4.44.0 + '@rollup/rollup-win32-arm64-msvc': 4.44.0 + '@rollup/rollup-win32-ia32-msvc': 4.44.0 + '@rollup/rollup-win32-x64-msvc': 4.44.0 + fsevents: 2.3.3 + + sass-loader@16.0.5: + dependencies: + neo-async: 2.6.2 + + sirv@3.0.1: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + + speakingurl@14.0.1: {} + + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + tinyexec@1.0.1: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + typescript@5.8.3: {} + + ufo@1.6.1: {} + + unconfig@7.3.2: + dependencies: + '@quansync/fs': 0.1.3 + defu: 6.1.4 + jiti: 2.4.2 + quansync: 0.2.10 + + undici-types@7.8.0: {} + + unocss@66.2.3(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3)): + dependencies: + '@unocss/astro': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3)) + '@unocss/cli': 66.2.3 + '@unocss/core': 66.2.3 + '@unocss/postcss': 66.2.3(postcss@8.5.6) + '@unocss/preset-attributify': 66.2.3 + '@unocss/preset-icons': 66.2.3 + '@unocss/preset-mini': 66.2.3 + '@unocss/preset-tagify': 66.2.3 + '@unocss/preset-typography': 66.2.3 + '@unocss/preset-uno': 66.2.3 + '@unocss/preset-web-fonts': 66.2.3 + '@unocss/preset-wind': 66.2.3 + '@unocss/preset-wind3': 66.2.3 + '@unocss/preset-wind4': 66.2.3 + '@unocss/transformer-attributify-jsx': 66.2.3 + '@unocss/transformer-compile-class': 66.2.3 + '@unocss/transformer-directives': 66.2.3 + '@unocss/transformer-variant-group': 66.2.3 + '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2))(vue@3.5.17(typescript@5.8.3)) + optionalDependencies: + vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2) + transitivePeerDependencies: + - postcss + - supports-color + - vue + + unplugin-utils@0.2.4: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.2 + + vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2): + dependencies: + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.0.3 + fsevents: 2.3.3 + jiti: 2.4.2 + + vscode-uri@3.1.0: {} + + vue-flow-layout@0.1.1(vue@3.5.17(typescript@5.8.3)): + dependencies: + vue: 3.5.17(typescript@5.8.3) + + vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.17(typescript@5.8.3) + + vue-tsc@2.2.10(typescript@5.8.3): + dependencies: + '@volar/typescript': 2.4.14 + '@vue/language-core': 2.2.10(typescript@5.8.3) + typescript: 5.8.3 + + vue@3.5.17(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-sfc': 3.5.17 + '@vue/runtime-dom': 3.5.17 + '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) + '@vue/shared': 3.5.17 + optionalDependencies: + typescript: 5.8.3 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..3502ef3 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,9 @@ + + + + + diff --git a/src/api/api.ts b/src/api/api.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/env/env.config.ts b/src/env/env.config.ts new file mode 100644 index 0000000..6953507 --- /dev/null +++ b/src/env/env.config.ts @@ -0,0 +1,47 @@ +// 环境变量定义 - 在这里添加新变量 +export const envDefinitions = { + // 应用配置 + APP_TITLE: { + envKey: 'VITE_APP_TITLE', + type: 'string' as const, + required: true, + defaultValue: 'My Application', + validator: (value: string) => value.length > 0, + description: "APP Name" + }, + + // API 配置 + API_BASE_URL: { + envKey: 'VITE_API_BASE_URL', + type: 'string' as const, + required: true, + defaultValue: '/', + validator: (value: string) => value.startsWith('http'), + description: 'API 基础地址' + }, + + API_TIMEOUT: { + envKey: 'VITE_API_TIMEOUT', + type: 'number' as const, + defaultValue: 5000, + required: true, + validator: (value: number) => value > 0 && value <= 30000, + description: 'API 超时时间 (毫秒)' + }, +} + +// 自动生成环境变量类型 +export type EnvVariables = { + [Property in keyof typeof envDefinitions]: + typeof envDefinitions[Property]['type'] extends 'string' ? string : + typeof envDefinitions[Property]['type'] extends 'number' ? number : + typeof envDefinitions[Property]['type'] extends 'boolean' ? boolean : never; +}; + +// 自动生成 Vite 环境变量类型声明 +export type ViteEnvVariables = { + [K in keyof typeof envDefinitions as typeof envDefinitions[K]['envKey']]: + typeof envDefinitions[K]['type'] extends 'string' ? string : + typeof envDefinitions[K]['type'] extends 'number' ? number : + typeof envDefinitions[K]['type'] extends 'boolean' ? boolean : never; +}; \ No newline at end of file diff --git a/src/env/env.ts b/src/env/env.ts new file mode 100644 index 0000000..30f615a --- /dev/null +++ b/src/env/env.ts @@ -0,0 +1,95 @@ +import { envDefinitions, EnvVariables } from './env.config'; + +// 验证环境变量 +const validateEnv = () => { + for (const [key, config] of Object.entries(envDefinitions)) { + const envKey = config.envKey; + const rawValue = import.meta.env[envKey]; + + // 检查必填项 + if (config.required && (rawValue === undefined || rawValue === null)) { + throw new Error(`Missing required environment variable: ${envKey} (for ${key})`); + } + + // 类型转换和验证 + let value: any; + switch (config.type) { + case 'number': + value = Number(rawValue); + if (isNaN(value)) { + throw new Error(`Invalid number for env variable ${envKey}: ${rawValue}`); + } + break; + // case 'boolean': + // value = rawValue === 'true' || rawValue === '1'; + // break; + default: + value = rawValue; + } + + // 设置默认值 + if (value === undefined && config.defaultValue !== undefined) { + value = config.defaultValue; + } + + // 执行自定义验证 + //@ts-ignore + if (config.validator && !config.validator(value)) { + let message = `Invalid value for env variable ${envKey}: ${value}`; + if (config.description) message += ` (${config.description})`; + throw new Error(message); + } + } +}; + +// 验证环境变量 +validateEnv(); + +// 创建类型安全的环境变量对象 +const env = Object.entries(envDefinitions).reduce((acc, [key, config]) => { + const envKey = config.envKey; + const rawValue = import.meta.env[envKey]; + + let value: any; + switch (config.type) { + case 'number': + value = Number(rawValue); + break; + // case 'boolean': + // value = rawValue === 'true' || rawValue === '1'; + // break; + default: + value = rawValue; + } + + // 应用默认值 + if (value === undefined && config.defaultValue !== undefined) { + value = config.defaultValue; + } + + return { + ...acc, + [key]: value + }; +}, {}) as EnvVariables; + +// 添加辅助属性 +Object.defineProperty(env, 'IS_DEV', { + get: () => import.meta.env.DEV, + enumerable: true +}); + +Object.defineProperty(env, 'IS_PROD', { + get: () => import.meta.env.PROD, + enumerable: true +}); + +Object.defineProperty(env, 'MODE', { + get: () => import.meta.env.MODE, + enumerable: true +}); + +// 冻结对象防止修改 +Object.freeze(env); + +export default env; \ No newline at end of file diff --git a/src/http/request.ts b/src/http/request.ts new file mode 100644 index 0000000..7126f80 --- /dev/null +++ b/src/http/request.ts @@ -0,0 +1,31 @@ +import axios from "axios" +import env from "@/env/env" +import { logger } from "@/utils/logger/Logger"; +const instance = axios.create({ + baseURL: env.API_BASE_URL, + timeout: 5000, + headers: { 'X-Custom-Header': 'foobar' } +}); +const apiLogger = logger.create('API'); +// 添加请求拦截器 +axios.interceptors.request.use(function (config) { + apiLogger.time(config.url || "") + // 在发送请求之前做些什么 + return config; +}, function (error) { + // 对请求错误做些什么 + return Promise.reject(error); +}); + +// 添加响应拦截器 +axios.interceptors.response.use(function (response) { + apiLogger.timeEnd(`请求返回${response.config.url}`) + // 2xx 范围内的状态码都会触发该函数。 + // 对响应数据做点什么 + return response; +}, function (error) { + // 超出 2xx 范围的状态码都会触发该函数。 + // 对响应错误做点什么 + return Promise.reject(error); +}); +export default instance \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..2aa2f37 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,11 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' +import PrimeVue from 'primevue/config'; +import '@fortawesome/fontawesome-free/css/all.min.css'; +import 'virtual:uno.css' +import store from './store'; +const app = createApp(App) +app.use(store) +app.use(PrimeVue, { unstyled: true, ripple: true }) +app.mount('#app') diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..64e317b --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,3 @@ +import { createPinia } from "pinia" +const store = createPinia() +export default store; \ No newline at end of file diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..2c07e3e --- /dev/null +++ b/src/style.css @@ -0,0 +1,120 @@ +/** + * Modern CSS Reset + * 1. 使用更直观的盒模型 + * 2. 移除默认边距和内边距 + * 3. 设置核心元素基线样式 + * 4. 移除列表样式和引号 + * 5. 使媒体元素更易使用 + * 6. 移除移动端点击高亮 + * 7. 防止文本溢出导致布局问题 + * 8. 表单元素继承字体 + */ +*, +*::before, +*::after { + box-sizing: border-box; /* 1 */ +} + +/* 移除默认边距和内边距 */ +body, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, dl, dd, ol, ul, +figure, hr, fieldset, legend { + margin: 0; + padding: 0; +} + +/* 设置核心元素基线 */ +html { + -webkit-text-size-adjust: 100%; /* 防止iOS横屏时字体缩放 */ + line-height: 1.5; /* 无单位行高继承 */ +} + +body { + min-height: 100vh; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; +} + +/* 标题和段落去粗体/去默认大小 */ +h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: inherit; +} + +/* 列表去默认标记 */ +ol, ul { + list-style: none; +} + +/* 引用去默认样式 */ +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* 表格重置 */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* 媒体元素自适应 */ +img, video, canvas, svg { + display: block; + max-width: 100%; + height: auto; +} + +/* 移除链接下划线并继承颜色 */ +a { + color: inherit; + text-decoration: none; + background-color: transparent; +} + +/* 表单元素重置 */ +button, input, optgroup, select, textarea { + margin: 0; /* 移除默认边距 */ + padding: 0; + border: 0; + font: inherit; + color: inherit; + background-color: transparent; + line-height: inherit; +} + +/* 移除输入框默认样式 */ +input::-ms-clear { + display: none; /* 移除IE输入框清除按钮 */ +} + +/* 移除按钮默认样式 */ +button { + cursor: pointer; + -webkit-appearance: none; + appearance: none; +} + +/* 文本域禁止拖拽 */ +textarea { + resize: vertical; +} + +/* 移除移动端点击高亮 */ +* { + -webkit-tap-highlight-color: transparent; +} + +/* 防止文本溢出容器 */ +p, h1, h2, h3, h4, h5, h6 { + overflow-wrap: break-word; +} + +/* 隐藏有hidden属性的元素 */ +[hidden] { + display: none !important; +} \ No newline at end of file diff --git a/src/utils/logger/Logger.ts b/src/utils/logger/Logger.ts new file mode 100644 index 0000000..6217f6a --- /dev/null +++ b/src/utils/logger/Logger.ts @@ -0,0 +1,325 @@ +// Logger.ts +import { + LogLevel, LogStyle, LogTimer, LogPlugin, + LogEntry, LoggerOptions, GroupOptions +} from './types'; + +const DEFAULT_STYLES = { + debug: { color: '#9E9E9E', fontWeight: 'normal' }, + info: { color: '#2196F3', fontWeight: 'normal' }, + warn: { color: '#FF9800', fontWeight: 'bold' }, + error: { color: '#F44336', fontWeight: 'bold' }, +}; + +const LEVEL_WEIGHTS: Record = { + debug: 0, + info: 1, + warn: 2, + error: 3, + off: 99, +}; + +export class Logger { + private options: LoggerOptions; + private timers: LogTimer = {}; + private plugins: LogPlugin[] = []; + private enabledLevels: Set = new Set(['debug', 'info', 'warn', 'error']); + + constructor(options: LoggerOptions = {}) { + this.options = { + level: 'info', + timestamp: true, + styles: DEFAULT_STYLES, + ...options + }; + + this.setLevel(this.options.level || 'info'); + + if (this.options.plugins) { + this.plugins = [...this.options.plugins]; + } + } + + /** + * 设置日志级别 + * @param level 日志级别 + */ + setLevel(level: LogLevel): void { + const currentWeight = LEVEL_WEIGHTS[level]; + + this.enabledLevels.clear(); + Object.entries(LEVEL_WEIGHTS).forEach(([lvl, weight]) => { + if (weight >= currentWeight && lvl !== 'off') { + this.enabledLevels.add(lvl as LogLevel); + } + }); + } + + /** + * 添加插件 + * @param plugin 插件函数 + */ + addPlugin(plugin: LogPlugin): void { + this.plugins.push(plugin); + } + + /** + * 移除插件 + * @param plugin 插件函数 + */ + removePlugin(plugin: LogPlugin): void { + this.plugins = this.plugins.filter(p => p !== plugin); + } + + /** + * 创建子日志器 + * @param context 上下文名称 + * @returns 新的日志器实例 + */ + create(context: string): Logger { + return new Logger({ + ...this.options, + context + }); + } + + /** + * 调试日志 + * @param messages 日志消息 + */ + debug(...messages: any[]): void { + this.log('debug', messages); + } + + /** + * 信息日志 + * @param messages 日志消息 + */ + info(...messages: any[]): void { + this.log('info', messages); + } + + /** + * 警告日志 + * @param messages 日志消息 + */ + warn(...messages: any[]): void { + this.log('warn', messages); + } + + /** + * 错误日志 + * @param messages 日志消息 + */ + error(...messages: any[]): void { + this.log('error', messages); + } + + /** + * 开始计时器 + * @param label 计时器标签 + */ + time(label: string): void { + this.timers[label] = performance.now(); + this.debug(`⏱️ Timer '${label}' started`); + } + + /** + * 结束计时器并输出结果 + * @param label 计时器标签 + */ + timeEnd(label: string): void { + const startTime = this.timers[label]; + if (startTime === undefined) { + this.warn(`Timer '${label}' does not exist`); + return; + } + + const duration = performance.now() - startTime; + this.info(`⏱️ Timer '${label}': ${duration.toFixed(2)}ms`); + delete this.timers[label]; + } + + /** + * 开始日志分组 + * @param label 分组标签 + * @param options 分组选项 + */ + group(label: string, options: GroupOptions = {}): void { + const { collapsed = false } = options; + if (collapsed) { + console.groupCollapsed(`%c📁 ${label}`, this.getGroupStyle()); + } else { + console.group(`%c📂 ${label}`, this.getGroupStyle()); + } + } + + /** + * 结束日志分组 + */ + groupEnd(): void { + console.groupEnd(); + } + + /** + * 增强堆栈跟踪 + * @param message 错误消息 + * @param error 错误对象 + */ + trace(message: string, error?: Error): void { + const traceError = error || new Error(message); + const stackLines = traceError.stack?.split('\n') || []; + + // 过滤掉库内部调用 + const filteredStack = stackLines.filter(line => + !line.includes('Logger.') && + !line.includes('logMaster') + ).join('\n'); + + console.groupCollapsed(`%c🔍 ${message}`, this.getStyle('debug')); + console.debug(filteredStack); + console.groupEnd(); + } + + /** + * 自定义日志输出 + * @param level 日志级别 + * @param messages 日志消息 + */ + private log(level: LogLevel, messages: any[]): void { + if (!this.shouldLog(level)) return; + + const { context, styles } = this.options; + const logEntry: LogEntry = { + level, + messages, + timestamp: new Date(), + context, + }; + + // 应用插件 + this.plugins.forEach(plugin => plugin(logEntry)); + + const prefix = this.formatPrefix(logEntry); + const style = this.getStyle(level); + + // 添加样式信息 + const styledMessages = [`%c${prefix}$`]; + const styledArgs = [style]; + // 添加额外样式 + if (styles && styles[level]) { + Object.values(styles[level]).forEach((style: any) => { + styledArgs.push(this.styleToString(style)); + }); + } + // 处理包含样式的消息 + messages.forEach(msg => { + if (typeof msg === 'string' && msg.includes('%c')) { + const parts = msg.split('%c'); + parts.forEach((part, index) => { + if (index > 0) { + styledArgs.push(''); + } + styledMessages.push(part); + }); + } else { + styledMessages.push(msg); + } + }); + + // 调用对应的控制台方法 + switch (level) { + case 'debug': + console.debug(styledMessages.join(''), styledArgs.join('')); + break; + case 'info': + console.info(styledMessages.join(''), styledArgs.join('')); + break; + case 'warn': + console.warn(styledMessages.join(''), styledArgs.join('')); + break; + case 'error': + console.error(styledMessages.join(''), styledArgs.join('')); + break; + } + } + + /** + * 格式化日志前缀 + * @param entry 日志条目 + * @returns 格式化后的前缀字符串 + */ + private formatPrefix(entry: LogEntry): string { + const { context, timestamp } = this.options; + const { level } = entry; + + const parts: string[] = []; + const icons = { + debug: '🐞', + info: 'ℹ️', + warn: '⚠️', + error: '❌' + }; + + if (timestamp) { + const time = entry.timestamp.toTimeString().split(' '); + parts.push(`[${time}]`); + } + + if (context) { + parts.push(`[${context}]`); + } + + parts.push(`${icons[level]} ${level.toUpperCase()}:`); + + return parts.join(' '); + } + + /** + * 获取日志样式 + * @param level 日志级别 + * @returns CSS样式字符串 + */ + private getStyle(level: LogLevel): string { + const { styles = DEFAULT_STYLES } = this.options; + return this.styleToString(styles[level] || {}); + } + + /** + * 获取分组样式 + * @returns CSS样式字符串 + */ + private getGroupStyle(): string { + return this.styleToString({ + color: '#795548', + fontWeight: 'bold', + fontSize: '14px', + padding: '2px 6px', + borderRadius: '4px', + backgroundColor: '#E0E0E0' + }); + } + + /** + * 将样式对象转换为CSS字符串 + * @param style 样式对象 + * @returns CSS样式字符串 + */ + private styleToString(style: LogStyle): string { + return Object.entries(style) + .map(([key, value]) => `${key}:${value}`) + .join(';'); + } + + /** + * 检查是否应该记录日志 + * @param level 日志级别 + * @returns 是否记录 + */ + private shouldLog(level: LogLevel): boolean { + return this.enabledLevels.has(level); + } +} + +// 默认导出实例 +export const logger = new Logger(); \ No newline at end of file diff --git a/src/utils/logger/types.ts b/src/utils/logger/types.ts new file mode 100644 index 0000000..746f02d --- /dev/null +++ b/src/utils/logger/types.ts @@ -0,0 +1,33 @@ +// types.ts +export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'off'; +export type LogStyle = { [key: string]: string }; +export type LogTimer = { [label: string]: number }; +export type LogPlugin = (log: LogEntry) => void; + +export interface LogEntry { + level: LogLevel; + messages: any[]; + timestamp: Date; + context?: string; + styles?: LogStyle[]; +} + +export interface LoggerOptions { + level?: LogLevel; + context?: string; + timestamp?: boolean; + format?: (entry: LogEntry) => string; + styles?: { + debug?: LogStyle; + info?: LogStyle; + warn?: LogStyle; + error?: LogStyle; + }; + plugins?: LogPlugin[]; +} + +export interface GroupOptions { + collapsed?: boolean; + context?: string; + timestamp?: boolean; +} \ No newline at end of file diff --git a/src/utils/storage.ts b/src/utils/storage.ts new file mode 100644 index 0000000..e133ed7 --- /dev/null +++ b/src/utils/storage.ts @@ -0,0 +1,144 @@ +// 定义一个存储包装器接口 +interface StorageItem { + value: T; + expires?: number; // 过期时间戳(毫秒) +} +class SafeLocalStorage { + private prefix: string; + + /** + * 创建一个安全的本地存储实例 + * @param prefix 存储键名前缀,用于避免键名冲突 + */ + constructor(prefix: string = '') { + this.prefix = prefix ? `${prefix}:` : ''; + } + + /** + * 获取带前缀的完整键名 + * @param key 原始键名 + * @returns 带前缀的键名 + */ + private getFullKey(key: string): string { + return `${this.prefix}${key}`; + } + + /** + * 设置存储项 + * @param key 存储键名 + * @param value 存储的值 + * @param expiresIn 过期时间(毫秒),可选 + */ + set(key: string, value: T, expiresIn?: number): void { + const fullKey = this.getFullKey(key); + + const item: StorageItem = { + value, + expires: expiresIn ? Date.now() + expiresIn : undefined + }; + + try { + const serialized = JSON.stringify(item); + localStorage.setItem(fullKey, serialized); + } catch (e) { + console.error(`Failed to store item for key "${fullKey}"`, e); + } + } + + /** + * 获取存储项 + * @param key 存储键名 + * @param defaultValue 当值不存在或过期时的默认值 + * @returns 存储的值或默认值 + */ + get(key: string, defaultValue?: T): T | undefined { + const fullKey = this.getFullKey(key); + const serialized = localStorage.getItem(fullKey); + + if (!serialized) return defaultValue; + + try { + const item = JSON.parse(serialized) as StorageItem; + + // 检查是否过期 + if (item.expires && Date.now() > item.expires) { + this.remove(key); + return defaultValue; + } + + return item.value; + } catch (e) { + console.error(`Failed to parse stored item for key "${fullKey}"`, e); + this.remove(key); + return defaultValue; + } + } + + /** + * 移除存储项 + * @param key 存储键名 + */ + remove(key: string): void { + const fullKey = this.getFullKey(key); + localStorage.removeItem(fullKey); + } + + /** + * 检查存储项是否存在且未过期 + * @param key 存储键名 + * @returns 是否存在且有效 + */ + has(key: string): boolean { + const fullKey = this.getFullKey(key); + return this.get(fullKey) !== undefined; + } + + /** + * 清除当前命名空间下的所有存储项 + */ + clearNamespace(): void { + const keysToRemove: string[] = []; + + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + if (key && key.startsWith(this.prefix)) { + keysToRemove.push(key); + } + } + + keysToRemove.forEach(key => localStorage.removeItem(key)); + } + + /** + * 获取存储项并移除它 + * @param key 存储键名 + * @param defaultValue 当值不存在或过期时的默认值 + * @returns 存储的值或默认值 + */ + pop(key: string, defaultValue?: T): T | undefined { + const value = this.get(key, defaultValue); + this.remove(key); + return value; + } + + /** + * 获取当前命名空间下的所有键名 + * @returns 键名数组 + */ + keys(): string[] { + const keys: string[] = []; + + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + if (key && key.startsWith(this.prefix)) { + keys.push(key.substring(this.prefix.length)); + } + } + + return keys; + } +} + +// 导出单例实例和类 +const safeLocalStorage = new SafeLocalStorage('app'); +export { SafeLocalStorage, safeLocalStorage }; \ No newline at end of file diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts new file mode 100644 index 0000000..eb88c90 --- /dev/null +++ b/src/utils/websocket.ts @@ -0,0 +1,88 @@ +export class WebSocketClient { + ws: any; + url: string; + listeners: any; + oncelisteners: any + constructor(url: string) { + this.ws = null; + this.url = url; + this.listeners = new Map(); + this.oncelisteners = new Map() + } + + connect(call: any) { + return new Promise((resolve: any, reject: any) => { + // console.log(this.url); + this.ws = new WebSocket(this.url); + this.ws.onopen = () => { + console.log("WebSocket connected"); + resolve("连接成功"); + call(this); + // this.breath(); + }; + + this.ws.onmessage = (event: any) => { + switch (JSON.parse(event.data).type) { + } + const message = JSON.parse(event.data); + // + const handlers = this.listeners.get(message.type) || []; + handlers.forEach((handler: any) => handler(message)); + // + const onceHandlers = this.oncelisteners.get(message.type) || [] + onceHandlers.forEach((handler: any) => handler(message)) + this.oncelisteners.delete(message.type); + // + }; + + this.ws.onerror = (error: any) => { + console.error("WebSocket error:", error); + reject(error); + }; + + this.ws.onclose = () => { + console.log("WebSocket disconnected"); + }; + }); + } + once(eventType: any, handler: any) { + if (!this.oncelisteners.has(eventType)) { + this.oncelisteners.set(eventType, []); + } + this.oncelisteners.get(eventType).push(handler); + } + on(eventType: any, handler: any) { + if (!this.listeners.has(eventType)) { + this.listeners.set(eventType, []); + } + this.listeners.get(eventType).push(handler); + } + // breath() { + // setInterval(() => { + // this.sendCall( + // "breath", + // { + // userId: userStore.getUserId, + // }, + // () => { + // // console.log(msg); + // } + // ); + // }, 20000); + // } + send(types: any, data: any) { + if (this.ws.readyState === WebSocket.OPEN) { + console.log("socket send", JSON.stringify({ types, data })); + this.ws.send(JSON.stringify({ type: types, data })); + } + } + + async sendCall(types: any, data: any, call: any) { + this.send(types, data); + await this.once(types, call); + } + + disconnect() { + this.ws.close(); + } +} \ No newline at end of file diff --git a/src/view/index.vue b/src/view/index.vue new file mode 100644 index 0000000..9aff3e2 --- /dev/null +++ b/src/view/index.vue @@ -0,0 +1,5 @@ + + + diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..3119ce5 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,15 @@ +/// +import { ViteEnvVariables } from '@/env/env.config'; + +// 扩展 Vite 的环境变量类型 +interface ImportMetaEnv extends ViteEnvVariables { + // 内置属性 + readonly MODE: string; + readonly DEV: boolean; + readonly PROD: boolean; + readonly SSR: boolean; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..dc95c53 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,22 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "lib": ["ESNext", "DOM"], + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "verbatimModuleSyntax": false, + "noImplicitAny": false, + "baseUrl": ".", + "paths": { + "@/*":["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..befc57b --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023", "DOM"], + "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/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000..9013e22 --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'unocss' + +export default defineConfig({ + // ...UnoCSS options +}) \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..9286c79 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,19 @@ +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue' +import UnoCSS from 'unocss/vite' +import { resolve } from "path" + +// https://vite.dev/config/ +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd()) + console.log(env); + return { + plugins: [vue(), UnoCSS()], server: { + port: 4444 + }, resolve: { + alias: { + '@': resolve(__dirname, 'src') + } + } + } +})