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')
+ }
+ }
+ }
+})