diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 5a5809dbeff9763e5efeafee09134dcd5f1ce8c3..0000000000000000000000000000000000000000
--- a/.editorconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}]
-charset = utf-8
-indent_size = 2
-indent_style = space
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-end_of_line = lf
-max_line_length = 100
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 6313b56c57848efce05faa7aa7e901ccfc2886ea..0000000000000000000000000000000000000000
--- a/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text=auto eol=lf
diff --git a/.gitignore b/.gitignore
index 8ee54e8d343e466a213c8c30aa04be77126b170d..2184ace34c28dd53a180a9e56cf6080725a1db62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,30 +1,23 @@
-# Logs
-logs
-*.log
+.DS_Store
+node_modules
+#记得解除忽略dist目录
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-.DS_Store
-dist
-dist-ssr
-coverage
-*.local
-
-/cypress/videos/
-/cypress/screenshots/
# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
.idea
+.fleet
+.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
-
-*.tsbuildinfo
diff --git a/.prettierrc.json b/.prettierrc.json
deleted file mode 100644
index 29a2402ef050746efe041b9e3393bf33796407c3..0000000000000000000000000000000000000000
--- a/.prettierrc.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/prettierrc",
- "semi": false,
- "singleQuote": true,
- "printWidth": 100
-}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
deleted file mode 100644
index c92168f50e8ef2cadc802d087ce835d5961f8963..0000000000000000000000000000000000000000
--- a/.vscode/extensions.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "recommendations": [
- "Vue.volar",
- "dbaeumer.vscode-eslint",
- "EditorConfig.EditorConfig",
- "esbenp.prettier-vscode"
- ]
-}
diff --git a/README.md b/README.md
index 3ed2181385fc736fba933e2d97d45077ca200631..ec479a3e3cfac5aef149b90f0570afa3e05dc5e3 100644
--- a/README.md
+++ b/README.md
@@ -1,50 +1,184 @@
----
-title: Music
-emoji: 🐢
-colorFrom: purple
-colorTo: indigo
-sdk: static
-pinned: false
-app_build_command: npm run build
-app_file: dist/index.html
----
-
-# vue
-
-This template should help get you started developing with Vue 3 in Vite.
-
-## Recommended IDE Setup
-
-[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
-
-## Type Support for `.vue` Imports in TS
-
-TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
-
-## Customize configuration
-
-See [Vite Configuration Reference](https://vite.dev/config/).
-
-## Project Setup
-
-```sh
+# 🎵 Vue3 PWA 音乐应用
+
+一个基于 Vue3 的渐进式网络应用(PWA),模仿网易云音乐界面风格,支持13个音乐源,提供完整的音乐播放体验。
+
+## ✨ 功能特性
+
+### 🎯 核心功能
+- **多源音乐搜索** - 支持13个主流音乐平台
+- **全屏播放器** - 网易云风格界面,支持歌词显示
+- **收藏管理** - 收藏喜爱的歌曲
+- **播放历史** - 自动记录播放记录
+- **智能设置** - 音质、播放模式、主题等个性化设置
+
+### 🌟 技术特性
+- **PWA 支持** - 可安装到桌面,离线缓存
+- **响应式设计** - 适配手机、平板、桌面
+- **MediaSession API** - 支持媒体控制(锁屏控制)
+- **状态持久化** - 刷新不丢失播放状态
+- **网易云主题** - 完美复刻的视觉体验
+
+### 📱 支持的音乐源
+1. **网易云音乐** (默认)
+2. **QQ音乐**
+3. **酷狗音乐**
+4. **酷我音乐**
+5. **咪咕音乐**
+6. **Spotify**
+7. **Apple Music**
+8. **YouTube Music**
+9. **JOOX**
+10. **TIDAL**
+11. **Deezer**
+12. **Qobuz**
+13. **喜马拉雅FM**
+
+## 🚀 快速开始
+
+### 环境要求
+- Node.js 16+
+- npm 或 yarn
+
+### 安装依赖
+```bash
npm install
```
-### Compile and Hot-Reload for Development
-
-```sh
+### 启动开发服务器
+```bash
npm run dev
```
-### Type-Check, Compile and Minify for Production
+### 或者直接运行启动脚本
+- Windows: 双击 `启动应用.bat`
+- macOS/Linux: 运行 `./启动应用.sh`
-```sh
+### 构建生产版本
+```bash
npm run build
```
-### Lint with [ESLint](https://eslint.org/)
+## 📁 项目结构
-```sh
-npm run lint
```
+vue-music/
+├── public/ # 静态资源
+│ ├── icons/ # PWA 图标
+│ └── manifest.json # PWA 配置
+├── src/
+│ ├── components/ # 组件
+│ │ ├── layout/ # 布局组件
+│ │ ├── search/ # 搜索相关
+│ │ ├── player/ # 播放器相关
+│ │ └── common/ # 通用组件
+│ ├── views/ # 页面组件
+│ ├── stores/ # Pinia 状态管理
+│ ├── services/ # API 服务
+│ ├── router/ # 路由配置
+│ └── styles/ # 全局样式
+├── 需求文档.md # 完整需求说明
+└── 启动应用.bat/sh # 快速启动脚本
+```
+
+## 🎮 使用说明
+
+### 基本操作
+1. **搜索音乐** - 在首页搜索框输入歌曲或歌手名
+2. **切换音源** - 点击搜索框旁的源选择按钮
+3. **播放控制** - 点击歌曲播放,使用底部播放条控制
+4. **全屏播放器** - 点击底部播放条进入全屏播放器
+5. **收藏歌曲** - 点击爱心图标收藏喜欢的歌曲
+
+### 高级功能
+- **播放模式** - 支持列表循环、随机播放、单曲循环
+- **歌词显示** - 全屏播放器支持歌词滚动显示
+- **设置调整** - 在设置页面个性化应用体验
+- **PWA 安装** - 在浏览器地址栏点击安装按钮
+
+## 🛠️ 技术栈
+
+- **框架**: Vue 3.4 + Composition API
+- **状态管理**: Pinia 2.1
+- **路由**: Vue Router 4.3
+- **构建工具**: Vite 5.3
+- **PWA**: Vite PWA Plugin
+- **样式**: CSS3 + CSS Variables
+- **图标**: FontAwesome 6
+- **音乐API**: 自建聚合接口
+
+## ⚡ 性能优化
+
+- **代码分割** - 路由级别的代码分割
+- **图片懒加载** - 专辑封面按需加载
+- **请求缓存** - API 响应智能缓存
+- **Service Worker** - 静态资源离线缓存
+- **组件复用** - 高效的组件设计模式
+
+## 🔧 开发特性
+
+### 代码质量
+- **组件化架构** - 高内聚低耦合的组件设计
+- **TypeScript 支持** - 可选的类型检查
+- **ESLint 配置** - 代码风格统一
+- **响应式设计** - 移动优先的设计理念
+
+### 开发体验
+- **热重载** - 代码修改实时预览
+- **自动导入** - 组件和工具函数自动导入
+- **开发工具** - Vue DevTools 完美支持
+- **错误处理** - 完善的错误边界处理
+
+## 📋 功能清单
+
+### ✅ 已完成功能
+- [x] 项目架构搭建
+- [x] PWA 配置
+- [x] 音乐API集成 (13个源)
+- [x] 状态管理 (Pinia)
+- [x] 首页搜索功能
+- [x] 搜索结果展示
+- [x] 全屏播放器
+- [x] 播放控制
+- [x] 进度条
+- [x] 歌词显示
+- [x] 收藏功能
+- [x] 播放历史
+- [x] 设置页面
+- [x] 响应式布局
+- [x] 通用组件库
+
+### 🔄 可扩展功能
+- [ ] 用户登录系统
+- [ ] 社交分享功能
+- [ ] 音乐下载功能
+- [ ] 播放列表导入导出
+- [ ] 桌面歌词显示
+- [ ] 均衡器设置
+- [ ] 定时关闭功能
+- [ ] 音乐推荐算法
+
+## 🤝 贡献指南
+
+欢迎提交 Issue 和 Pull Request!
+
+1. Fork 项目
+2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
+3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
+4. 推送到分支 (`git push origin feature/AmazingFeature`)
+5. 打开 Pull Request
+
+## 📄 许可证
+
+本项目基于 MIT 许可证开源 - 查看 [LICENSE](LICENSE) 文件了解详情。
+
+## 🙏 致谢
+
+- [Vue.js](https://vuejs.org/) - 渐进式 JavaScript 框架
+- [Vite](https://vitejs.dev/) - 下一代前端构建工具
+- [Pinia](https://pinia.vuejs.org/) - Vue 状态管理库
+- [FontAwesome](https://fontawesome.com/) - 图标库
+- [网易云音乐](https://music.163.com/) - UI 设计参考
+
+---
+
+**🎵 享受音乐,享受编程!**
\ No newline at end of file
diff --git a/demo.html b/demo.html
new file mode 100644
index 0000000000000000000000000000000000000000..945fd4b8857c68b83309bc89e98fa817e63dbd01
--- /dev/null
+++ b/demo.html
@@ -0,0 +1,1495 @@
+
+
+
+
+
+
+ 云音乐 - 在线音乐播放器
+
+
+
+
+
+
+
+
+
+
+
+
+ 云音乐
+
+
+
+
+
+
+ 网易云音乐
+ QQ音乐
+ 酷我音乐
+ JOOX
+ 酷狗音乐
+ 咪咕音乐
+ Deezer
+ Spotify
+ Apple Music
+ YouTube Music
+ TIDAL
+ Qobuz
+ 喜马拉雅
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 音质
+
+
+ 标准 128K
+ 较高 192K
+ 高品质 320K
+ 无损 FLAC
+ Hi-Res
+
+
+
+
+
+
+
+
+
+
+
+
+ 下载音乐
+
+
+
+ 下载歌词
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/env.d.ts b/env.d.ts
deleted file mode 100644
index 11f02fe2a0061d6e6e1f271b21da95423b448b32..0000000000000000000000000000000000000000
--- a/env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/eslint.config.ts b/eslint.config.ts
deleted file mode 100644
index 20475f81e2072a0ab1df6f4ba6b0a2cd2b8a1afd..0000000000000000000000000000000000000000
--- a/eslint.config.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { globalIgnores } from 'eslint/config'
-import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'
-import pluginVue from 'eslint-plugin-vue'
-import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'
-
-// To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
-// import { configureVueProject } from '@vue/eslint-config-typescript'
-// configureVueProject({ scriptLangs: ['ts', 'tsx'] })
-// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup
-
-export default defineConfigWithVueTs(
- {
- name: 'app/files-to-lint',
- files: ['**/*.{ts,mts,tsx,vue}'],
- },
-
- globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
-
- pluginVue.configs['flat/essential'],
- vueTsConfigs.recommended,
- skipFormatting,
-)
diff --git a/index.html b/index.html
index 9e5fc8f06c69dd7697ad566f198ae6577fdc15b2..cd0154e43c90d41b2bea3bda7b0aaee2293e78bd 100644
--- a/index.html
+++ b/index.html
@@ -1,13 +1,30 @@
-
-
-
-
-
- Vite App
-
-
-
-
-
+
+
+
+
+ 云音乐PWA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..e9516f691679c9beb3a605536cadbf1ab14fc75e
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6227 @@
+{
+ "name": "vue-music-pwa",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vue-music-pwa",
+ "version": "1.0.0",
+ "dependencies": {
+ "@vueuse/core": "^10.5.0",
+ "pinia": "^2.1.0",
+ "vue": "^3.4.0",
+ "vue-router": "^4.2.0"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^4.5.0",
+ "vite": "^5.0.0",
+ "vite-plugin-pwa": "^0.17.0",
+ "workbox-window": "^7.0.0"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmmirror.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.0.tgz",
+ "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.3.tgz",
+ "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.3",
+ "@babel/parser": "^7.28.3",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.3",
+ "@babel/types": "^7.28.2",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.3.tgz",
+ "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@babel/types": "^7.28.2",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.27.3",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+ "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
+ "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.28.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz",
+ "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz",
+ "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "debug": "^4.4.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.10"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
+ "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-wrap-function": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
+ "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
+ "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.3",
+ "@babel/types": "^7.28.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.3.tgz",
+ "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.3.tgz",
+ "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz",
+ "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
+ "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz",
+ "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
+ "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz",
+ "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
+ "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz",
+ "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
+ "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz",
+ "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
+ "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
+ "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.28.3",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz",
+ "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz",
+ "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/template": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz",
+ "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz",
+ "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
+ "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
+ "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-explicit-resource-management": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz",
+ "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz",
+ "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
+ "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
+ "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
+ "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz",
+ "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
+ "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz",
+ "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
+ "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
+ "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
+ "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz",
+ "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
+ "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
+ "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
+ "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz",
+ "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz",
+ "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
+ "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz",
+ "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.27.7",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
+ "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz",
+ "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz",
+ "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
+ "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz",
+ "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz",
+ "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
+ "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
+ "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz",
+ "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
+ "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
+ "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
+ "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
+ "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz",
+ "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
+ "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz",
+ "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.28.3.tgz",
+ "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.0",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.27.1",
+ "@babel/plugin-syntax-import-attributes": "^7.27.1",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "@babel/plugin-transform-async-generator-functions": "^7.28.0",
+ "@babel/plugin-transform-async-to-generator": "^7.27.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
+ "@babel/plugin-transform-block-scoping": "^7.28.0",
+ "@babel/plugin-transform-class-properties": "^7.27.1",
+ "@babel/plugin-transform-class-static-block": "^7.28.3",
+ "@babel/plugin-transform-classes": "^7.28.3",
+ "@babel/plugin-transform-computed-properties": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-dotall-regex": "^7.27.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.27.1",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-dynamic-import": "^7.27.1",
+ "@babel/plugin-transform-explicit-resource-management": "^7.28.0",
+ "@babel/plugin-transform-exponentiation-operator": "^7.27.1",
+ "@babel/plugin-transform-export-namespace-from": "^7.27.1",
+ "@babel/plugin-transform-for-of": "^7.27.1",
+ "@babel/plugin-transform-function-name": "^7.27.1",
+ "@babel/plugin-transform-json-strings": "^7.27.1",
+ "@babel/plugin-transform-literals": "^7.27.1",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.27.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.27.1",
+ "@babel/plugin-transform-modules-amd": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.27.1",
+ "@babel/plugin-transform-modules-umd": "^7.27.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-new-target": "^7.27.1",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
+ "@babel/plugin-transform-numeric-separator": "^7.27.1",
+ "@babel/plugin-transform-object-rest-spread": "^7.28.0",
+ "@babel/plugin-transform-object-super": "^7.27.1",
+ "@babel/plugin-transform-optional-catch-binding": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/plugin-transform-private-methods": "^7.27.1",
+ "@babel/plugin-transform-private-property-in-object": "^7.27.1",
+ "@babel/plugin-transform-property-literals": "^7.27.1",
+ "@babel/plugin-transform-regenerator": "^7.28.3",
+ "@babel/plugin-transform-regexp-modifiers": "^7.27.1",
+ "@babel/plugin-transform-reserved-words": "^7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+ "@babel/plugin-transform-spread": "^7.27.1",
+ "@babel/plugin-transform-sticky-regex": "^7.27.1",
+ "@babel/plugin-transform-template-literals": "^7.27.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.27.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.27.1",
+ "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.27.1",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.14",
+ "babel-plugin-polyfill-corejs3": "^0.13.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.5",
+ "core-js-compat": "^3.43.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.3.tgz",
+ "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.3.tgz",
+ "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.3",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.2",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.2",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz",
+ "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.30",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
+ "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz",
+ "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "@types/resolve": "1.20.2",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.78.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-terser": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz",
+ "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "serialize-javascript": "^6.0.1",
+ "smob": "^1.0.0",
+ "terser": "^5.17.4"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.2.0.tgz",
+ "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz",
+ "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz",
+ "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz",
+ "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz",
+ "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz",
+ "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz",
+ "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz",
+ "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz",
+ "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz",
+ "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz",
+ "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz",
+ "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz",
+ "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz",
+ "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz",
+ "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz",
+ "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz",
+ "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz",
+ "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz",
+ "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz",
+ "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz",
+ "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz",
+ "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.20.2.tgz",
+ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+ "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
+ "license": "MIT"
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
+ "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0 || ^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.21.tgz",
+ "integrity": "sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/shared": "3.5.21",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz",
+ "integrity": "sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.21",
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz",
+ "integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@vue/compiler-core": "3.5.21",
+ "@vue/compiler-dom": "3.5.21",
+ "@vue/compiler-ssr": "3.5.21",
+ "@vue/shared": "3.5.21",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.18",
+ "postcss": "^8.5.6",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.21.tgz",
+ "integrity": "sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.21",
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.21.tgz",
+ "integrity": "sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.21.tgz",
+ "integrity": "sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.21",
+ "@vue/shared": "3.5.21"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.21.tgz",
+ "integrity": "sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.21",
+ "@vue/runtime-core": "3.5.21",
+ "@vue/shared": "3.5.21",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.21.tgz",
+ "integrity": "sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.21",
+ "@vue/shared": "3.5.21"
+ },
+ "peerDependencies": {
+ "vue": "3.5.21"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.21.tgz",
+ "integrity": "sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==",
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.11.1.tgz",
+ "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.20",
+ "@vueuse/metadata": "10.11.1",
+ "@vueuse/shared": "10.11.1",
+ "vue-demi": ">=0.14.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.11.1.tgz",
+ "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "10.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.11.1.tgz",
+ "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
+ "license": "MIT",
+ "dependencies": {
+ "vue-demi": ">=0.14.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
+ "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.7",
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
+ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "core-js-compat": "^3.43.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz",
+ "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.25.4",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.4.tgz",
+ "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001737",
+ "electron-to-chromium": "^1.5.211",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001739",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz",
+ "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.45.1",
+ "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.45.1.tgz",
+ "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.25.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.213",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz",
+ "integrity": "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.0.tgz",
+ "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jake": {
+ "version": "10.9.4",
+ "resolved": "https://registry.npmmirror.com/jake/-/jake-10.9.4.tgz",
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.6",
+ "filelist": "^1.0.4",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true,
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.18",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.18.tgz",
+ "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pinia": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz",
+ "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.4.4",
+ "vue": "^2.7.0 || ^3.5.11"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz",
+ "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.50.0",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.50.0.tgz",
+ "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.50.0",
+ "@rollup/rollup-android-arm64": "4.50.0",
+ "@rollup/rollup-darwin-arm64": "4.50.0",
+ "@rollup/rollup-darwin-x64": "4.50.0",
+ "@rollup/rollup-freebsd-arm64": "4.50.0",
+ "@rollup/rollup-freebsd-x64": "4.50.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.50.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.50.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.50.0",
+ "@rollup/rollup-linux-arm64-musl": "4.50.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.50.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.50.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.50.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.50.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.50.0",
+ "@rollup/rollup-linux-x64-gnu": "4.50.0",
+ "@rollup/rollup-linux-x64-musl": "4.50.0",
+ "@rollup/rollup-openharmony-arm64": "4.50.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.50.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.50.0",
+ "@rollup/rollup-win32-x64-msvc": "4.50.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/smob": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/smob/-/smob-1.5.0.tgz",
+ "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "deprecated": "The work that was done in this beta branch won't be included in future versions",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmmirror.com/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.44.0",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.44.0.tgz",
+ "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.19",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz",
+ "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-pwa": {
+ "version": "0.17.5",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-pwa/-/vite-plugin-pwa-0.17.5.tgz",
+ "integrity": "sha512-UxRNPiJBzh4tqU/vc8G2TxmrUTzT6BqvSzhszLk62uKsf+npXdvLxGDz9C675f4BJi6MbD2tPnJhi5txlMzxbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "pretty-bytes": "^6.1.1",
+ "workbox-build": "^7.0.0",
+ "workbox-window": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^3.1.0 || ^4.0.0 || ^5.0.0",
+ "workbox-build": "^7.0.0",
+ "workbox-window": "^7.0.0"
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.21.tgz",
+ "integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.21",
+ "@vue/compiler-sfc": "3.5.21",
+ "@vue/runtime-dom": "3.5.21",
+ "@vue/server-renderer": "3.5.21",
+ "@vue/shared": "3.5.21"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz",
+ "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/workbox-background-sync": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz",
+ "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-broadcast-update": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz",
+ "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-build": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-build/-/workbox-build-7.3.0.tgz",
+ "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.24.4",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^15.2.3",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@rollup/plugin-terser": "^0.4.3",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "7.3.0",
+ "workbox-broadcast-update": "7.3.0",
+ "workbox-cacheable-response": "7.3.0",
+ "workbox-core": "7.3.0",
+ "workbox-expiration": "7.3.0",
+ "workbox-google-analytics": "7.3.0",
+ "workbox-navigation-preload": "7.3.0",
+ "workbox-precaching": "7.3.0",
+ "workbox-range-requests": "7.3.0",
+ "workbox-recipes": "7.3.0",
+ "workbox-routing": "7.3.0",
+ "workbox-strategies": "7.3.0",
+ "workbox-streams": "7.3.0",
+ "workbox-sw": "7.3.0",
+ "workbox-window": "7.3.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/workbox-build/node_modules/@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0 || ^2.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/workbox-build/node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/workbox-build/node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/workbox-build/node_modules/rollup": {
+ "version": "2.79.2",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz",
+ "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-core/-/workbox-core-7.3.0.tgz",
+ "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/workbox-expiration": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-7.3.0.tgz",
+ "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz",
+ "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-background-sync": "7.3.0",
+ "workbox-core": "7.3.0",
+ "workbox-routing": "7.3.0",
+ "workbox-strategies": "7.3.0"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz",
+ "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-7.3.0.tgz",
+ "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0",
+ "workbox-routing": "7.3.0",
+ "workbox-strategies": "7.3.0"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz",
+ "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-recipes": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-recipes/-/workbox-recipes-7.3.0.tgz",
+ "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-cacheable-response": "7.3.0",
+ "workbox-core": "7.3.0",
+ "workbox-expiration": "7.3.0",
+ "workbox-precaching": "7.3.0",
+ "workbox-routing": "7.3.0",
+ "workbox-strategies": "7.3.0"
+ }
+ },
+ "node_modules/workbox-routing": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-7.3.0.tgz",
+ "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-7.3.0.tgz",
+ "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-7.3.0.tgz",
+ "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.3.0",
+ "workbox-routing": "7.3.0"
+ }
+ },
+ "node_modules/workbox-sw": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-7.3.0.tgz",
+ "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/workbox-window": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmmirror.com/workbox-window/-/workbox-window-7.3.0.tgz",
+ "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "7.3.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ }
+ }
+}
diff --git a/package.json b/package.json
index 39f5bad5f39c68c335c9c8ec7e329e082d7f0563..fbb265c08db9889ce4e5ea193550bd7bb88819e2 100644
--- a/package.json
+++ b/package.json
@@ -1,37 +1,22 @@
{
- "name": "vue",
- "version": "0.0.0",
- "private": true,
+ "name": "vue-music-pwa",
+ "version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
- "build": "run-p type-check \"build-only {@}\" --",
- "preview": "vite preview",
- "build-only": "vite build",
- "type-check": "vue-tsc --build",
- "lint": "eslint . --fix",
- "format": "prettier --write src/"
+ "build": "vite build",
+ "preview": "vite preview"
},
"dependencies": {
- "pinia": "^3.0.1",
- "vue": "^3.5.13",
- "vue-router": "^4.5.0"
+ "vue": "^3.4.0",
+ "vue-router": "^4.2.0",
+ "pinia": "^2.1.0",
+ "@vueuse/core": "^10.5.0"
},
"devDependencies": {
- "@tsconfig/node22": "^22.0.1",
- "@types/node": "^22.14.0",
- "@vitejs/plugin-vue": "^5.2.3",
- "@vue/eslint-config-prettier": "^10.2.0",
- "@vue/eslint-config-typescript": "^14.5.0",
- "@vue/tsconfig": "^0.7.0",
- "eslint": "^9.22.0",
- "eslint-plugin-vue": "~10.0.0",
- "jiti": "^2.4.2",
- "npm-run-all2": "^7.0.2",
- "prettier": "3.5.3",
- "typescript": "~5.8.0",
- "vite": "^6.2.4",
- "vite-plugin-vue-devtools": "^7.7.2",
- "vue-tsc": "^2.2.8"
+ "@vitejs/plugin-vue": "^4.5.0",
+ "vite": "^5.0.0",
+ "vite-plugin-pwa": "^0.17.0",
+ "workbox-window": "^7.0.0"
}
-}
+}
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
deleted file mode 100644
index df36fcfb72584e00488330b560ebcf34a41c64c2..0000000000000000000000000000000000000000
Binary files a/public/favicon.ico and /dev/null differ
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..87dbf7aa564a9c8a2e5e64bf4a5ede1c9e548172
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/icons/apple-touch-icon.svg b/public/icons/apple-touch-icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..82a80d6c86a5a9834e11a23cfda6e1ef6f7af638
--- /dev/null
+++ b/public/icons/apple-touch-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/icons/icon-128x128.svg b/public/icons/icon-128x128.svg
new file mode 100644
index 0000000000000000000000000000000000000000..878aa7f36ecd84a4425eb99dbb7947b755e50916
--- /dev/null
+++ b/public/icons/icon-128x128.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/icons/icon-192x192.svg b/public/icons/icon-192x192.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d619818d723b0dd7f195a4d5424f5af425c455e0
--- /dev/null
+++ b/public/icons/icon-192x192.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/icons/icon-512x512.svg b/public/icons/icon-512x512.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c4aaf0107b6be32a556b55465f6b8a9cab9da114
--- /dev/null
+++ b/public/icons/icon-512x512.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/icons/icon-72x72.svg b/public/icons/icon-72x72.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2f647d4ba1f5a340e6113b9d9b1a56c01d74741b
--- /dev/null
+++ b/public/icons/icon-72x72.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/icons/icon-96x96.svg b/public/icons/icon-96x96.svg
new file mode 100644
index 0000000000000000000000000000000000000000..03aa7cb5beabc3d7cc5f5299a78ed7fde0f96d36
--- /dev/null
+++ b/public/icons/icon-96x96.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
index 7905b05167cb53db655f3938ea2adb68ca72e9fb..26d8eae69f42b1c8b0b0c4bc55d63ee763c3322f 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,85 +1,401 @@
-
-
-
-
diff --git a/src/assets/base.css b/src/assets/base.css
deleted file mode 100644
index 8816868a41b651f318dee87c6784ebcd6e29eca1..0000000000000000000000000000000000000000
--- a/src/assets/base.css
+++ /dev/null
@@ -1,86 +0,0 @@
-/* color palette from */
-:root {
- --vt-c-white: #ffffff;
- --vt-c-white-soft: #f8f8f8;
- --vt-c-white-mute: #f2f2f2;
-
- --vt-c-black: #181818;
- --vt-c-black-soft: #222222;
- --vt-c-black-mute: #282828;
-
- --vt-c-indigo: #2c3e50;
-
- --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
- --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
- --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
- --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
-
- --vt-c-text-light-1: var(--vt-c-indigo);
- --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
- --vt-c-text-dark-1: var(--vt-c-white);
- --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
-}
-
-/* semantic color variables for this project */
-:root {
- --color-background: var(--vt-c-white);
- --color-background-soft: var(--vt-c-white-soft);
- --color-background-mute: var(--vt-c-white-mute);
-
- --color-border: var(--vt-c-divider-light-2);
- --color-border-hover: var(--vt-c-divider-light-1);
-
- --color-heading: var(--vt-c-text-light-1);
- --color-text: var(--vt-c-text-light-1);
-
- --section-gap: 160px;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --color-background: var(--vt-c-black);
- --color-background-soft: var(--vt-c-black-soft);
- --color-background-mute: var(--vt-c-black-mute);
-
- --color-border: var(--vt-c-divider-dark-2);
- --color-border-hover: var(--vt-c-divider-dark-1);
-
- --color-heading: var(--vt-c-text-dark-1);
- --color-text: var(--vt-c-text-dark-2);
- }
-}
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
- margin: 0;
- font-weight: normal;
-}
-
-body {
- min-height: 100vh;
- color: var(--color-text);
- background: var(--color-background);
- transition:
- color 0.5s,
- background-color 0.5s;
- line-height: 1.6;
- font-family:
- Inter,
- -apple-system,
- BlinkMacSystemFont,
- 'Segoe UI',
- Roboto,
- Oxygen,
- Ubuntu,
- Cantarell,
- 'Fira Sans',
- 'Droid Sans',
- 'Helvetica Neue',
- sans-serif;
- font-size: 15px;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
diff --git a/src/assets/logo.svg b/src/assets/logo.svg
deleted file mode 100644
index 7565660356e5b3723c9c33d508b830c9cfbea29f..0000000000000000000000000000000000000000
--- a/src/assets/logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/assets/main.css b/src/assets/main.css
deleted file mode 100644
index 36fb845b5232b8594b0d0f0e61a8cff0b73a4128..0000000000000000000000000000000000000000
--- a/src/assets/main.css
+++ /dev/null
@@ -1,35 +0,0 @@
-@import './base.css';
-
-#app {
- max-width: 1280px;
- margin: 0 auto;
- padding: 2rem;
- font-weight: normal;
-}
-
-a,
-.green {
- text-decoration: none;
- color: hsla(160, 100%, 37%, 1);
- transition: 0.4s;
- padding: 3px;
-}
-
-@media (hover: hover) {
- a:hover {
- background-color: hsla(160, 100%, 37%, 0.2);
- }
-}
-
-@media (min-width: 1024px) {
- body {
- display: flex;
- place-items: center;
- }
-
- #app {
- display: grid;
- grid-template-columns: 1fr 1fr;
- padding: 0 2rem;
- }
-}
diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue
deleted file mode 100644
index d174cf8e1c12827184281d516d457c6d914c4340..0000000000000000000000000000000000000000
--- a/src/components/HelloWorld.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
{{ msg }}
-
- You’ve successfully created a project with
- Vite +
- Vue 3 . What's next?
-
-
-
-
-
diff --git a/src/components/TheWelcome.vue b/src/components/TheWelcome.vue
deleted file mode 100644
index 6092dff14de3243051b68076ecdc3cc18c18130b..0000000000000000000000000000000000000000
--- a/src/components/TheWelcome.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
-
-
-
-
- Documentation
-
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
-
-
-
-
-
- Tooling
-
- This project is served and bundled with
- Vite . The
- recommended IDE setup is
- VSCode
- +
- Vue - Official . If
- you need to test your components and web pages, check out
- Vitest
- and
- Cypress
- /
- Playwright .
-
-
-
- More instructions are available in
- README.md .
-
-
-
-
-
-
- Ecosystem
-
- Get official tools and libraries for your project:
- Pinia ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If
- you need more resources, we suggest paying
- Awesome Vue
- a visit.
-
-
-
-
-
-
- Community
-
- Got stuck? Ask your question on
- Vue Land
- (our official Discord server), or
- StackOverflow . You should also follow the official
- @vuejs.org
- Bluesky account or the
- @vuejs
- X account for latest news in the Vue world.
-
-
-
-
-
-
- Support Vue
-
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
-
diff --git a/src/components/WelcomeItem.vue b/src/components/WelcomeItem.vue
deleted file mode 100644
index 6d7086aea08fbb770b2f570dbeb4f8fcd86cb291..0000000000000000000000000000000000000000
--- a/src/components/WelcomeItem.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
diff --git a/src/components/common/BottomSheet.vue b/src/components/common/BottomSheet.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a04b32ea8cadc53f0a02b31856a6620c00c8c490
--- /dev/null
+++ b/src/components/common/BottomSheet.vue
@@ -0,0 +1,416 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/common/ConfirmDialog.vue b/src/components/common/ConfirmDialog.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a2a28482c5ad613f38ae645b690d37714d1f501e
--- /dev/null
+++ b/src/components/common/ConfirmDialog.vue
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
+
+
+ {{ cancelText }}
+
+
+ {{ confirmText }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/common/Empty.vue b/src/components/common/Empty.vue
new file mode 100644
index 0000000000000000000000000000000000000000..094ece5a2b6e9ebf94069e8de3cbd63fda58d9da
--- /dev/null
+++ b/src/components/common/Empty.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
{{ title }}
+
+
+
{{ description }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/common/Icon.vue b/src/components/common/Icon.vue
new file mode 100644
index 0000000000000000000000000000000000000000..471d6fdfd3dd45f5e2bd1fadab2555e989903987
--- /dev/null
+++ b/src/components/common/Icon.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/common/Loading.vue b/src/components/common/Loading.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0263a1ef90b1c629c27347a41b214dd2db274fd9
--- /dev/null
+++ b/src/components/common/Loading.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/common/Modal.vue b/src/components/common/Modal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..00ee2b467e8f1c696576bf1c2acb1f896c7275d3
--- /dev/null
+++ b/src/components/common/Modal.vue
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/common/Toast.vue b/src/components/common/Toast.vue
new file mode 100644
index 0000000000000000000000000000000000000000..28e4ecb1ef62677e7144363be41a5d6eec576b55
--- /dev/null
+++ b/src/components/common/Toast.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+
+
{{ message }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/favorites/FavoriteButton.vue b/src/components/favorites/FavoriteButton.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cb6d9a912d23a83856f6475239639aadd3c25549
--- /dev/null
+++ b/src/components/favorites/FavoriteButton.vue
@@ -0,0 +1,283 @@
+
+
+
+
+ {{ isFavorited ? '已收藏' : '收藏' }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/favorites/FavoriteItem.vue b/src/components/favorites/FavoriteItem.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7fe0f39e7b4f8e79e04d75d5b4eca05548ca4469
--- /dev/null
+++ b/src/components/favorites/FavoriteItem.vue
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ song.name }}
+
+ {{ formatArtist(song.artist) }}
+ •
+ {{ song.album }}
+
+
+
+
+
+
+
+
+
+ {{ formatPlayCount(playCount) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/favorites/FavoritesList.vue b/src/components/favorites/FavoritesList.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b6b94f15f333eeaf119ad14470866b2b092fea06
--- /dev/null
+++ b/src/components/favorites/FavoritesList.vue
@@ -0,0 +1,853 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全部
+
+
+ 歌名
+
+
+ 歌手
+
+
+ 专辑
+
+
+
+
+
+
+
+ 已选择 {{ selectedItems.length }} 首
+
+
+ 播放选中
+ 添加到播放列表
+ 删除选中
+
+
+
+
+
+ 排序方式:
+
+ 收藏时间
+ 歌名
+ 歌手
+ 播放次数
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全选 ({{ selectedItems.length }}/{{ filteredList.length }})
+
+
+
+
+
+
+
+
+
+
+
+ {{ loadingMore ? '加载中...' : `加载更多 (${filteredList.length - displayCount}首)` }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue
deleted file mode 100644
index 2dc8b055253af30fb797037e2fe260505f0cf711..0000000000000000000000000000000000000000
--- a/src/components/icons/IconCommunity.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue
deleted file mode 100644
index 6d4791cfbcf2782b3e5ffbabd042d4c47b2fbbed..0000000000000000000000000000000000000000
--- a/src/components/icons/IconDocumentation.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue
deleted file mode 100644
index c3a4f078c0bd340a33c61ea9ecd8a755d03571ed..0000000000000000000000000000000000000000
--- a/src/components/icons/IconEcosystem.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue
deleted file mode 100644
index 7452834d3ef961ce24c3a072ddba2620b6158bae..0000000000000000000000000000000000000000
--- a/src/components/icons/IconSupport.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue
deleted file mode 100644
index 660598d7c76644ffe126a1a1feb1606650bfb937..0000000000000000000000000000000000000000
--- a/src/components/icons/IconTooling.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
diff --git a/src/components/layout/AppTabBar.vue b/src/components/layout/AppTabBar.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b237c59b99f89b899fbaad52ab442481a5f1fcf5
--- /dev/null
+++ b/src/components/layout/AppTabBar.vue
@@ -0,0 +1,152 @@
+
+
+
+
+
+ {{ tab.label }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/layout/MiniPlayer.vue b/src/components/layout/MiniPlayer.vue
new file mode 100644
index 0000000000000000000000000000000000000000..46d3f05e9827673ff22ad49082cdc74aba291d6f
--- /dev/null
+++ b/src/components/layout/MiniPlayer.vue
@@ -0,0 +1,377 @@
+
+
+
+
+
+
+
+
+
+
+
+
{{ currentSong.name }}
+
{{ formatArtist(currentSong.artist) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/layout/SearchHeader.vue b/src/components/layout/SearchHeader.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7056ef205795e693ef0685ff14a9e9acfe6a0bb4
--- /dev/null
+++ b/src/components/layout/SearchHeader.vue
@@ -0,0 +1,624 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/AlbumCover.vue b/src/components/player/AlbumCover.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e4b88ab3529d6fa23cd4814b61dc71d69e585fab
--- /dev/null
+++ b/src/components/player/AlbumCover.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/LyricsView.vue b/src/components/player/LyricsView.vue
new file mode 100644
index 0000000000000000000000000000000000000000..728b4f2261fa49a11fc8a1872b20110bf6c9d941
--- /dev/null
+++ b/src/components/player/LyricsView.vue
@@ -0,0 +1,454 @@
+
+
+
+
+
+
+
+
+ {{ line.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/MoreActionsPanel.vue b/src/components/player/MoreActionsPanel.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1bb6b223c9f94b3742257cdc915da0180993822c
--- /dev/null
+++ b/src/components/player/MoreActionsPanel.vue
@@ -0,0 +1,365 @@
+
+
+
+
+
+
+
+
+
{{ song.name }}
+
{{ song.artist }}
+
{{ song.album }}
+
+
+
+
+
+
+
+ {{ isFavorite ? '取消收藏' : '添加到我的收藏' }}
+
+
+
+
+ 添加到播放列表
+
+
+
+
+ 下载到本地
+
+
+
+
+
+ 取消
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/PlayControls.vue b/src/components/player/PlayControls.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fdf044d4a51874dbf95359539da8d70d64031a24
--- /dev/null
+++ b/src/components/player/PlayControls.vue
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ playlistCount }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/PlayModeToggle.vue b/src/components/player/PlayModeToggle.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7d3af84c5b85f6ace201bf2dd9d0ab3ac1b669e4
--- /dev/null
+++ b/src/components/player/PlayModeToggle.vue
@@ -0,0 +1,198 @@
+
+
+
+ {{ modeText }}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/PlaylistPanel.vue b/src/components/player/PlaylistPanel.vue
new file mode 100644
index 0000000000000000000000000000000000000000..651d2e3b98d0d1e493da0a7550cce2570097d462
--- /dev/null
+++ b/src/components/player/PlaylistPanel.vue
@@ -0,0 +1,584 @@
+
+
+
+
+
+
+
+
+
+
+ 正在播放
+
+
+
+
+
+
+
{{ currentSong.name }}
+
{{ formatArtist(currentSong.artist) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 下一首播放
+
+
+
+
+ {{ index + 1 }}
+
+
+
+
+
+
+
+
{{ song.name }}
+
{{ formatArtist(song.artist) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/ProgressBar.vue b/src/components/player/ProgressBar.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5dc58032ee807da10f5e8cc1d7330cf547c97311
--- /dev/null
+++ b/src/components/player/ProgressBar.vue
@@ -0,0 +1,326 @@
+
+
+
+
+
+ {{ formatTime(currentTime) }}
+ {{ formatTime(duration) }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/player/SongInfo.vue b/src/components/player/SongInfo.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f4e1d8c1fa5cc506077f42d73264eb771036dd03
--- /dev/null
+++ b/src/components/player/SongInfo.vue
@@ -0,0 +1,253 @@
+
+
+
+ {{ songName || '未知歌曲' }}
+
+
+
+
{{ artistName || '未知歌手' }}
+ {{ albumName }}
+
+
+
+
+ {{ formatQuality(quality) }}
+
+
+
+
+
+ {{ getSourceName(source) }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/search/InfiniteScroll.vue b/src/components/search/InfiniteScroll.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cc1a57bc038e07b36286cab36289665f78c33e66
--- /dev/null
+++ b/src/components/search/InfiniteScroll.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/search/SearchBox.vue b/src/components/search/SearchBox.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ef645f668ae0b7b19bd96be1b2f975328d173158
--- /dev/null
+++ b/src/components/search/SearchBox.vue
@@ -0,0 +1,344 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentSourceName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/search/SearchHistory.vue b/src/components/search/SearchHistory.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b3ac73aab94cf91cc3421cf468ff0112cf45fcee
--- /dev/null
+++ b/src/components/search/SearchHistory.vue
@@ -0,0 +1,386 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.keyword }}
+ {{ item.sourceName }}
+ {{ formatTime(item.timestamp) }}
+
+
+
+
+
+
+
+
+
+ {{ expanded ? '收起' : `查看更多 (${historyItems.length - maxDisplay})` }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/search/SearchResults.vue b/src/components/search/SearchResults.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a478178e60c0b2a120234d9be4b65548ea12f622
--- /dev/null
+++ b/src/components/search/SearchResults.vue
@@ -0,0 +1,423 @@
+
+
+
+
+
+
+
+
+
+
+
{{ error }}
+
+
+ 重试
+
+
+
+
+
+
+
+
+
未找到相关歌曲
+
尝试更换关键词或切换音乐源
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 没有更多歌曲了
+
+
+
+
+
+
+
+
+
+
在上方输入关键词开始搜索
+
+
试试搜索:
+
+
+ {{ suggestion }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/search/SongItem.vue b/src/components/search/SongItem.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5065cf53d2c5e87c062093e2ada198fb1add42bd
--- /dev/null
+++ b/src/components/search/SongItem.vue
@@ -0,0 +1,222 @@
+
+
+
{{ String(index + 1).padStart(2, '0') }}
+
+
+
{{ song.name }}
+
+ {{ formatArtist(song.artist) }} · {{ song.album }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/search/SourceSelector.vue b/src/components/search/SourceSelector.vue
new file mode 100644
index 0000000000000000000000000000000000000000..285e739d4b2e41c6bcbd0e41b0711ac776f8e9c9
--- /dev/null
+++ b/src/components/search/SourceSelector.vue
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+ {{ source.name }}
+ 优先级 {{ source.priority }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..de4f94b499c69207444729ec3a45a644628652ea
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,83 @@
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+import router from './router/index.js'
+import App from './App.vue'
+import './styles/global.css'
+
+// 创建应用实例
+const app = createApp(App)
+
+// 创建Pinia实例
+const pinia = createPinia()
+
+// 使用插件
+app.use(pinia)
+app.use(router)
+
+// 挂载应用
+app.mount('#app')
+
+// PWA 注册 (开发环境暂时禁用)
+if ('serviceWorker' in navigator && import.meta.env.PROD) {
+ window.addEventListener('load', () => {
+ navigator.serviceWorker.register('/sw.js')
+ .then((registration) => {
+ console.log('SW registered: ', registration)
+ })
+ .catch((registrationError) => {
+ console.log('SW registration failed: ', registrationError)
+ })
+ })
+}
+
+// MediaSession API 兼容性检查
+if ('mediaSession' in navigator) {
+ console.log('MediaSession API 支持')
+} else {
+ console.log('MediaSession API 不支持')
+}
+
+// PWA 安装提示
+let deferredPrompt
+window.addEventListener('beforeinstallprompt', (e) => {
+ console.log('PWA 可以安装')
+ e.preventDefault()
+ deferredPrompt = e
+
+ // 可以在这里显示安装提示
+ showInstallPrompt()
+})
+
+function showInstallPrompt() {
+ // 显示安装应用的提示
+ if (deferredPrompt) {
+ const shouldInstall = confirm('是否将云音乐添加到主屏幕?')
+ if (shouldInstall) {
+ deferredPrompt.prompt()
+ deferredPrompt.userChoice.then((choiceResult) => {
+ if (choiceResult.outcome === 'accepted') {
+ console.log('用户接受了安装')
+ } else {
+ console.log('用户拒绝了安装')
+ }
+ deferredPrompt = null
+ })
+ }
+ }
+}
+
+// 全局错误处理
+app.config.errorHandler = (err, instance, info) => {
+ console.error('Global error:', err)
+ console.error('Component:', instance)
+ console.error('Error info:', info)
+}
+
+// 全局警告处理
+app.config.warnHandler = (msg, instance, trace) => {
+ console.warn('Global warning:', msg)
+ console.warn('Component:', instance)
+ console.warn('Trace:', trace)
+}
+
+console.log('🎵 云音乐PWA 启动完成')
\ No newline at end of file
diff --git a/src/main.ts b/src/main.ts
deleted file mode 100644
index 5dcad83c30800a564e96bad81c93d6be2ffaceaa..0000000000000000000000000000000000000000
--- a/src/main.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import './assets/main.css'
-
-import { createApp } from 'vue'
-import { createPinia } from 'pinia'
-
-import App from './App.vue'
-import router from './router'
-
-const app = createApp(App)
-
-app.use(createPinia())
-app.use(router)
-
-app.mount('#app')
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..829dd947c783e0ef26a64e1d1208695dcf1feef7
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,65 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import HomePage from '@/views/HomePage.vue'
+import MyMusicPage from '@/views/MyMusicPage.vue'
+import SettingsPage from '@/views/SettingsPage.vue'
+import FullPlayerPage from '@/views/FullPlayerPage.vue'
+
+const routes = [
+ {
+ path: '/',
+ redirect: '/home'
+ },
+ {
+ path: '/home',
+ name: 'Home',
+ component: HomePage,
+ meta: {
+ title: '首页',
+ keepAlive: true
+ }
+ },
+ {
+ path: '/my-music',
+ name: 'MyMusic',
+ component: MyMusicPage,
+ meta: {
+ title: '我的音乐',
+ keepAlive: true
+ }
+ },
+ {
+ path: '/settings',
+ name: 'Settings',
+ component: SettingsPage,
+ meta: {
+ title: '设置',
+ keepAlive: false
+ }
+ },
+ {
+ path: '/player',
+ name: 'FullPlayer',
+ component: FullPlayerPage,
+ meta: {
+ title: '正在播放',
+ keepAlive: false,
+ fullScreen: true
+ }
+ }
+]
+
+const router = createRouter({
+ history: createWebHashHistory(),
+ routes
+})
+
+// 路由守卫
+router.beforeEach((to, from, next) => {
+ // 设置页面标题
+ if (to.meta?.title) {
+ document.title = `${to.meta.title} - 云音乐PWA`
+ }
+ next()
+})
+
+export default router
\ No newline at end of file
diff --git a/src/router/index.ts b/src/router/index.ts
deleted file mode 100644
index 3e49915cae707b92441e745b76f9a7958cd8f2ac..0000000000000000000000000000000000000000
--- a/src/router/index.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { createRouter, createWebHistory } from 'vue-router'
-import HomeView from '../views/HomeView.vue'
-
-const router = createRouter({
- history: createWebHistory(import.meta.env.BASE_URL),
- routes: [
- {
- path: '/',
- name: 'home',
- component: HomeView,
- },
- {
- path: '/about',
- name: 'about',
- // route level code-splitting
- // this generates a separate chunk (About.[hash].js) for this route
- // which is lazy-loaded when the route is visited.
- component: () => import('../views/AboutView.vue'),
- },
- ],
-})
-
-export default router
diff --git a/src/services/api.js b/src/services/api.js
new file mode 100644
index 0000000000000000000000000000000000000000..28edbe75e6b977af2f93c9e31a6d9c767b291f52
--- /dev/null
+++ b/src/services/api.js
@@ -0,0 +1,110 @@
+// 基础API请求封装
+class ApiClient {
+ constructor(baseURL = '', options = {}) {
+ this.baseURL = baseURL
+ this.timeout = options.timeout || 30000 // 改为30秒
+ this.headers = {
+ // 不要默认设置Content-Type,避免触发预检请求
+ ...options.headers
+ }
+ }
+
+ // 基础请求方法
+ async request(url, options = {}) {
+ const controller = new AbortController()
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout)
+
+ try {
+ const fullUrl = url.startsWith('http') ? url : `${this.baseURL}${url}`
+
+ // 对于所有请求,都不要添加默认的Content-Type头部,避免触发预检请求
+ const fetchOptions = {
+ signal: controller.signal,
+ ...options
+ }
+
+ const response = await fetch(fullUrl, fetchOptions)
+
+ clearTimeout(timeoutId)
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`)
+ }
+
+ const contentType = response.headers.get('content-type')
+ if (contentType && contentType.includes('application/json')) {
+ return await response.json()
+ }
+
+ return await response.text()
+ } catch (error) {
+ clearTimeout(timeoutId)
+
+ if (error.name === 'AbortError') {
+ throw new Error('请求超时')
+ }
+
+ // 处理CORS错误,重新抛出错误让上层处理
+ if (error.toString().includes('CORS') || error.toString().includes('Failed to fetch')) {
+ console.error('CORS错误:', url, error)
+ throw new Error('网络请求失败,请检查网络连接')
+ }
+
+ throw error
+ }
+ }
+
+ // GET请求
+ get(url, params = {}) {
+ let fullUrl = url.startsWith('http') ? url : `${this.baseURL}${url}`
+
+ // 统一使用手动构建查询字符串的方式,避免URL对象可能带来的问题
+ const queryString = Object.entries(params)
+ .filter(([_, value]) => value !== undefined && value !== null)
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
+ .join('&')
+
+ fullUrl = queryString ? `${fullUrl}?${queryString}` : fullUrl
+
+ return this.request(fullUrl, {
+ method: 'GET'
+ })
+ }
+
+ // POST请求
+ post(url, data = {}) {
+ return this.request(url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ ...this.headers
+ },
+ body: JSON.stringify(data)
+ })
+ }
+
+ // PUT请求
+ put(url, data = {}) {
+ return this.request(url, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ ...this.headers
+ },
+ body: JSON.stringify(data)
+ })
+ }
+
+ // DELETE请求
+ delete(url) {
+ return this.request(url, {
+ method: 'DELETE'
+ })
+ }
+}
+
+// 创建默认实例
+export const apiClient = new ApiClient()
+
+// 导出类以便创建自定义实例
+export { ApiClient }
\ No newline at end of file
diff --git a/src/services/musicApi.js b/src/services/musicApi.js
new file mode 100644
index 0000000000000000000000000000000000000000..c07d6bc844b50df7b5ec0c377e2a43581f31dc9f
--- /dev/null
+++ b/src/services/musicApi.js
@@ -0,0 +1,346 @@
+// 音乐API接口配置 - 完全按照参考项目实现
+import { apiClient } from './api.js'
+
+// API基础地址 - 直接请求API
+const API_BASE = 'https://music-api.gdstudio.xyz/api.php'
+
+// 音乐平台映射
+export const MUSIC_SOURCES = [
+ { code: 'netease', name: '网易云音乐', priority: 1 },
+ { code: 'tencent', name: 'QQ音乐', priority: 2 },
+ { code: 'kuwo', name: '酷我音乐', priority: 3 },
+ { code: 'joox', name: 'JOOX', priority: 4 },
+ { code: 'kugou', name: '酷狗音乐', priority: 5 },
+ { code: 'migu', name: '咪咕音乐', priority: 6 },
+ { code: 'deezer', name: 'Deezer', priority: 7 },
+ { code: 'spotify', name: 'Spotify', priority: 8 },
+ { code: 'apple', name: 'Apple Music', priority: 9 },
+ { code: 'ytmusic', name: 'YouTube Music', priority: 10 },
+ { code: 'tidal', name: 'TIDAL', priority: 11 },
+ { code: 'qobuz', name: 'Qobuz', priority: 12 },
+ { code: 'ximalaya', name: '喜马拉雅', priority: 13 }
+]
+
+// 音质选项
+export const QUALITY_OPTIONS = [
+ { value: '128', label: '标准 128K' },
+ { value: '192', label: '较高 192K' },
+ { value: '320', label: '高音质 320K' },
+ { value: '740', label: '无损 FLAC' },
+ { value: '999', label: 'Hi-Res' }
+]
+
+class MusicApi {
+ constructor() {
+ this.baseUrl = API_BASE
+ }
+
+ // 构建请求URL - 严格按照demo.html中的参数顺序
+ buildUrl(params) {
+ // 确保参数顺序:types, source, id/name, 其他参数
+ const orderedKeys = ['types', 'source', 'id', 'name', 'br', 'size', 'count', 'pages']
+ const orderedParams = {}
+
+ // 按照指定顺序添加参数
+ orderedKeys.forEach(key => {
+ if (params[key] !== undefined && params[key] !== null) {
+ orderedParams[key] = params[key]
+ }
+ })
+
+ // 添加其他参数
+ Object.keys(params).forEach(key => {
+ if (!(key in orderedParams)) {
+ orderedParams[key] = params[key]
+ }
+ })
+
+ const queryString = Object.entries(orderedParams)
+ .filter(([_, value]) => value !== undefined && value !== null)
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
+ .join('&')
+
+ return `${this.baseUrl}?${queryString}`
+ }
+
+ // 搜索音乐 - 按照demo.html的格式处理响应
+ async searchMusic(keyword, source = 'netease', count = 30, page = 1) {
+ try {
+ const params = {
+ types: 'search',
+ source: source,
+ name: keyword,
+ count: count,
+ pages: page
+ }
+
+ const url = this.buildUrl(params)
+ const response = await apiClient.get(url)
+
+ // 搜索API直接返回数组
+ if (Array.isArray(response)) {
+ return response.map((song, index) => ({
+ id: song.id || song.songmid || song.hash || index,
+ name: song.name || song.songname || song.title || '未知歌曲',
+ artist: song.artist || song.singer || song.artists || '未知艺术家',
+ album: song.album || song.albumname || song.title || '未知专辑',
+ pic_id: song.pic_id || song.albumId || song.albumid || '',
+ lyric_id: song.lyric_id || song.id || '',
+ source: source,
+ duration: song.duration || song.time || 0
+ }))
+ }
+
+ return []
+ } catch (error) {
+ console.error('搜索音乐失败:', error)
+ throw error
+ }
+ }
+
+ // 获取音乐播放URL
+ async getMusicUrl(source, id, quality = '320') {
+ try {
+ const params = {
+ types: 'url',
+ source: source,
+ id: id,
+ br: quality
+ }
+
+ const url = this.buildUrl(params)
+ const response = await apiClient.get(url)
+
+ if (response && response.url) {
+ return response.url
+ }
+
+ console.warn('未获取到播放链接:', response)
+ return null
+ } catch (error) {
+ console.error('获取播放链接失败:', error)
+ return null
+ }
+ }
+
+ // 获取歌词
+ async getLyrics(source, id) {
+ try {
+ const params = {
+ types: 'lyric',
+ source: source,
+ id: id
+ }
+
+ const url = this.buildUrl(params)
+ const response = await apiClient.get(url)
+
+ // 歌词API返回包含lyric和tlyric字段的对象
+ if (response && (response.lyric !== undefined || response.tlyric !== undefined)) {
+ return {
+ lyric: response.lyric || '',
+ tlyric: response.tlyric || ''
+ }
+ }
+
+ return { lyric: '', tlyric: '' }
+ } catch (error) {
+ console.error('获取歌词失败:', error)
+ return { lyric: '', tlyric: '' }
+ }
+ }
+
+ // 获取专辑封面
+ async getAlbumCover(source, picId, size = 300) {
+ if (!picId) {
+ return 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIHJ4PSIxMiIgZmlsbD0iIzE4MTgxOCIvPjxwYXRoIGQ9Ik0xODcgMTUwQzE4NyAxNzEuNTM5IDE2OS41MzkgMTg5IDE0OCAxODlDMTI2LjQ2MSAxODkgMTA5IDE3MS41MzkgMTA5IDE1MEMxMDkgMTI4LjQ2MSAxMjYuNDYxIDExMSAxNDggMTExQzE2OS41MzkgMTExIDE4NyAxMjguNDYxIDE4NyAxNTBaIiBzdHJva2U9IiM2NjY2NjYiIHN0cm9rZS13aWR0aD0iNiIvPjxjaXJjbGUgY3g9IjE0OCIgY3k9IjE1MCIgcj0iNiIgZmlsbD0iIzY2NjY2NiIvPjwvc3ZnPgo='
+ }
+
+ try {
+ const params = {
+ types: 'pic',
+ source: source,
+ id: picId,
+ size: size
+ }
+
+ const url = this.buildUrl(params)
+ const response = await apiClient.get(url)
+
+ if (response && response.url) {
+ return response.url
+ }
+ } catch (error) {
+ console.error('获取专辑图失败:', error)
+ }
+
+ return 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIHJ4PSIxMiIgZmlsbD0iIzE4MTgxOCIvPjxwYXRoIGQ9Ik0xODcgMTUwQzE4NyAxNzEuNTM5IDE2OS41MzkgMTg5IDE0OCAxODlDMTI2LjQ2MSAxODkgMTA5IDE3MS41MzkgMTA5IDE1MEMxMDkgMTI4LjQ2MSAxMjYuNDYxIDExMSAxNDggMTExQzE2OS41MzkgMTExIDE4NyAxMjguNDYxIDE4NyAxNTBaIiBzdHJva2U9IiM2NjY2NjYiIHN0cm9rZS13aWR0aD0iNiIvPjxjaXJjbGUgY3g9IjE0OCIgY3k9IjE1MCIgcj0iNiIgZmlsbD0iIzY2NjY2NiIvPjwvc3ZnPgo='
+ }
+
+ // 批量搜索多个平台
+ async searchMultiPlatform(keyword, sources = ['netease', 'tencent', 'kuwo'], count = 10) {
+ try {
+ const promises = sources.map(source =>
+ this.searchMusic(keyword, source, count, 1).catch(err => {
+ console.warn(`${source} 搜索失败:`, err)
+ return []
+ })
+ )
+
+ const results = await Promise.all(promises)
+
+ // 合并结果并去重
+ const allSongs = []
+ const songMap = new Map()
+
+ results.forEach(result => {
+ if (Array.isArray(result)) {
+ result.forEach(song => {
+ const key = `${song.name}-${song.artist}`.toLowerCase()
+ if (!songMap.has(key)) {
+ songMap.set(key, song)
+ allSongs.push(song)
+ }
+ })
+ }
+ })
+
+ return allSongs.slice(0, count)
+ } catch (error) {
+ console.error('多平台搜索失败:', error)
+ return []
+ }
+ }
+
+ // 检查API状态
+ async checkApiStatus() {
+ try {
+ // API没有专门的状态检查端点,直接返回true
+ return true
+ } catch (error) {
+ console.error('API状态检查失败:', error)
+ return false
+ }
+ }
+
+ // 解析歌词
+ parseLyrics(lrcData) {
+ if (!lrcData) {
+ return { lyrics: [], hasTranslation: false }
+ }
+
+ const lines = lrcData.split('\n')
+ const lyrics = []
+ let hasTranslation = false
+
+ lines.forEach(line => {
+ const match = line.match(/\[(\d{2}):(\d{2})\.(\d{2,3})\](.*)/)
+ if (match) {
+ const minutes = parseInt(match[1])
+ const seconds = parseInt(match[2])
+ const milliseconds = parseInt(match[3].padEnd(3, '0'))
+ const text = match[4].trim()
+
+ if (text) {
+ const time = minutes * 60 + seconds + milliseconds / 1000
+
+ // 检查是否有翻译
+ if (text.includes(':') || text.includes(':')) {
+ hasTranslation = true
+ }
+
+ lyrics.push({
+ time,
+ text
+ })
+ }
+ }
+ })
+
+ return {
+ lyrics: lyrics.sort((a, b) => a.time - b.time),
+ hasTranslation
+ }
+ }
+}
+
+// 工具函数
+export const utils = {
+ // 格式化艺术家名称
+ formatArtist(artist) {
+ if (!artist) return '未知艺术家'
+ if (Array.isArray(artist)) {
+ return artist.join(', ')
+ }
+ if (typeof artist === 'string') {
+ return artist.replace(/;|;/g, ', ')
+ }
+ return String(artist)
+ },
+
+ // 格式化时间(秒转分:秒)
+ formatTime(seconds) {
+ if (!seconds || seconds < 0) return '0:00'
+ const minutes = Math.floor(seconds / 60)
+ const secs = Math.floor(seconds % 60)
+ return `${minutes}:${secs.toString().padStart(2, '0')}`
+ },
+
+ // 格式化持续时间
+ formatDuration(seconds) {
+ return this.formatTime(seconds)
+ },
+
+ // 格式化日期
+ formatDate(date) {
+ if (!date) return ''
+ const d = new Date(date)
+ if (isNaN(d.getTime())) return ''
+
+ const now = new Date()
+ const diff = now.getTime() - d.getTime()
+ const days = Math.floor(diff / (1000 * 60 * 60 * 24))
+
+ if (days === 0) {
+ return '今天'
+ } else if (days === 1) {
+ return '昨天'
+ } else if (days < 7) {
+ return `${days}天前`
+ } else {
+ return d.toLocaleDateString('zh-CN')
+ }
+ },
+
+ // 防抖函数
+ debounce(func, wait) {
+ let timeout
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout)
+ func(...args)
+ }
+ clearTimeout(timeout)
+ timeout = setTimeout(later, wait)
+ }
+ }
+}
+
+// 创建单例
+const musicApi = new MusicApi()
+
+// 导出常用方法
+export const {
+ searchMusic,
+ getMusicUrl,
+ getLyrics,
+ getAlbumCover,
+ searchMultiPlatform,
+ checkApiStatus
+} = musicApi
+
+// 也直接导出debounce方法到musicApi对象上
+musicApi.debounce = utils.debounce
+
+export { musicApi }
+export default musicApi
\ No newline at end of file
diff --git a/src/stores/counter.ts b/src/stores/counter.ts
deleted file mode 100644
index b6757ba5723c5b89b35d011b9558d025bbcde402..0000000000000000000000000000000000000000
--- a/src/stores/counter.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ref, computed } from 'vue'
-import { defineStore } from 'pinia'
-
-export const useCounterStore = defineStore('counter', () => {
- const count = ref(0)
- const doubleCount = computed(() => count.value * 2)
- function increment() {
- count.value++
- }
-
- return { count, doubleCount, increment }
-})
diff --git a/src/stores/favorites.js b/src/stores/favorites.js
new file mode 100644
index 0000000000000000000000000000000000000000..32a4eb300c9b6a41718f2a681e2cf4294276f09b
--- /dev/null
+++ b/src/stores/favorites.js
@@ -0,0 +1,155 @@
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+export const useFavoritesStore = defineStore('favorites', () => {
+ // 状态
+ const favorites = ref([])
+ const playHistory = ref([])
+
+ // 收藏管理
+ const isFavorite = (song) => {
+ return favorites.value.some(fav => fav.id === song.id && fav.source === song.source)
+ }
+
+ const addToFavorites = (song) => {
+ if (!isFavorite(song)) {
+ const favoriteItem = {
+ ...song,
+ favoriteTime: Date.now()
+ }
+ favorites.value.unshift(favoriteItem)
+ saveFavorites()
+ return true
+ }
+ return false
+ }
+
+ const removeFromFavorites = (song) => {
+ const index = favorites.value.findIndex(fav => fav.id === song.id && fav.source === song.source)
+ if (index >= 0) {
+ favorites.value.splice(index, 1)
+ saveFavorites()
+ return true
+ }
+ return false
+ }
+
+ const toggleFavorite = (song) => {
+ if (isFavorite(song)) {
+ removeFromFavorites(song)
+ return false
+ } else {
+ addToFavorites(song)
+ return true
+ }
+ }
+
+ const clearFavorites = () => {
+ favorites.value = []
+ localStorage.removeItem('vue-music-favorites')
+ }
+
+ // 播放历史管理
+ const addToHistory = (song) => {
+ if (!song) return
+
+ // 移除已存在的记录
+ playHistory.value = playHistory.value.filter(item =>
+ !(item.id === song.id && item.source === song.source)
+ )
+
+ // 添加到开头
+ const historyItem = {
+ ...song,
+ playTime: Date.now(),
+ playCount: 1
+ }
+
+ // 检查是否已存在,如果存在则增加播放次数
+ const existingIndex = playHistory.value.findIndex(item =>
+ item.id === song.id && item.source === song.source
+ )
+
+ if (existingIndex >= 0) {
+ historyItem.playCount = playHistory.value[existingIndex].playCount + 1
+ }
+
+ playHistory.value.unshift(historyItem)
+
+ // 限制历史记录数量
+ playHistory.value = playHistory.value.slice(0, 100)
+
+ savePlayHistory()
+ }
+
+ const clearHistory = () => {
+ playHistory.value = []
+ localStorage.removeItem('vue-music-play-history')
+ }
+
+ const getRecentlyPlayed = (limit = 20) => {
+ return playHistory.value.slice(0, limit)
+ }
+
+ const getMostPlayed = (limit = 20) => {
+ return [...playHistory.value]
+ .sort((a, b) => b.playCount - a.playCount)
+ .slice(0, limit)
+ }
+
+ // 本地存储
+ const saveFavorites = () => {
+ localStorage.setItem('vue-music-favorites', JSON.stringify(favorites.value))
+ }
+
+ const loadFavorites = () => {
+ try {
+ const saved = localStorage.getItem('vue-music-favorites')
+ if (saved) {
+ favorites.value = JSON.parse(saved) || []
+ }
+ } catch (error) {
+ console.error('加载收藏列表失败:', error)
+ }
+ }
+
+ const savePlayHistory = () => {
+ localStorage.setItem('vue-music-play-history', JSON.stringify(playHistory.value))
+ }
+
+ const loadPlayHistory = () => {
+ try {
+ const saved = localStorage.getItem('vue-music-play-history')
+ if (saved) {
+ playHistory.value = JSON.parse(saved) || []
+ }
+ } catch (error) {
+ console.error('加载播放历史失败:', error)
+ }
+ }
+
+ return {
+ // 状态
+ favorites,
+ playHistory,
+
+ // 收藏管理
+ isFavorite,
+ addToFavorites,
+ removeFromFavorites,
+ toggleFavorite,
+ clearFavorites,
+
+ // 历史管理
+ addToHistory,
+ clearHistory,
+ getRecentlyPlayed,
+ getMostPlayed,
+
+ // 存储
+ saveFavorites,
+ loadFavorites,
+ savePlayHistory,
+ loadPlayHistory
+ }
+})
\ No newline at end of file
diff --git a/src/stores/history.js b/src/stores/history.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e6b8614ce6b0d70504966968819bca40a07e572
--- /dev/null
+++ b/src/stores/history.js
@@ -0,0 +1,276 @@
+import { defineStore } from 'pinia'
+
+export const useHistoryStore = defineStore('history', {
+ state: () => ({
+ history: [], // 播放历史记录
+ playCount: {}, // 歌曲播放次数统计 { songId: count }
+ maxHistorySize: 1000 // 最大历史记录数量
+ }),
+
+ getters: {
+ // 总播放时长(秒)
+ totalPlayTime: (state) => {
+ return state.history.reduce((total, item) => {
+ return total + (item.playTime || 0)
+ }, 0)
+ },
+
+ // 最近播放的歌曲(去重)
+ recentSongs: (state) => {
+ const songMap = new Map()
+ const recent = []
+
+ // 从最新的开始遍历,保持最新的记录
+ for (let i = state.history.length - 1; i >= 0; i--) {
+ const item = state.history[i]
+ if (!songMap.has(item.song.id)) {
+ songMap.set(item.song.id, true)
+ recent.push(item)
+ if (recent.length >= 50) break // 最多返回50首
+ }
+ }
+
+ return recent
+ },
+
+ // 按日期分组的历史记录
+ groupedByDate: (state) => {
+ const groups = {}
+ state.history.forEach(item => {
+ const date = new Date(item.timestamp).toDateString()
+ if (!groups[date]) {
+ groups[date] = []
+ }
+ groups[date].push(item)
+ })
+ return groups
+ },
+
+ // 播放统计
+ playStats: (state) => {
+ const stats = {
+ totalPlays: state.history.length,
+ uniqueSongs: new Set(state.history.map(item => item.song.id)).size,
+ totalDuration: 0,
+ topArtists: {},
+ topSongs: {}
+ }
+
+ state.history.forEach(item => {
+ stats.totalDuration += item.playTime || 0
+
+ // 统计艺术家
+ const artist = item.song.artist
+ stats.topArtists[artist] = (stats.topArtists[artist] || 0) + 1
+
+ // 统计歌曲
+ const songKey = `${item.song.artist} - ${item.song.name}`
+ stats.topSongs[songKey] = (stats.topSongs[songKey] || 0) + 1
+ })
+
+ return stats
+ },
+
+ // 获取单首歌曲播放次数
+ getPlayCount: (state) => (songId) => {
+ return state.playCount[songId] || 0
+ },
+
+ // 获取热门歌曲(按播放次数排序)
+ topPlayedSongs: (state) => {
+ return Object.entries(state.playCount)
+ .sort(([, a], [, b]) => b - a)
+ .slice(0, 50)
+ .map(([songId, count]) => ({
+ songId,
+ count,
+ song: state.history.find(item => item.song.id === songId)?.song
+ }))
+ .filter(item => item.song) // 过滤掉找不到歌曲信息的项
+ }
+ },
+
+ actions: {
+ // 添加播放记录
+ addToHistory(song, playTime = 0) {
+ const historyItem = {
+ song: { ...song },
+ timestamp: Date.now(),
+ playTime, // 播放时长(秒)
+ source: song.source || 'unknown'
+ }
+
+ // 添加到历史记录开头
+ this.history.unshift(historyItem)
+
+ // 更新播放次数
+ const songId = song.id
+ this.playCount[songId] = (this.playCount[songId] || 0) + 1
+
+ // 限制历史记录数量
+ if (this.history.length > this.maxHistorySize) {
+ this.history = this.history.slice(0, this.maxHistorySize)
+ }
+
+ this.saveHistory()
+ },
+
+ // 移除历史记录
+ removeFromHistory(index) {
+ if (index >= 0 && index < this.history.length) {
+ const removedItem = this.history.splice(index, 1)[0]
+
+ // 更新播放次数(如果这是该歌曲的最后一次播放记录,则不减少计数)
+ // 这里选择保持播放次数不变,因为这反映了历史播放情况
+
+ this.saveHistory()
+ }
+ },
+
+ // 清空历史记录
+ clearHistory() {
+ this.history = []
+ this.playCount = {} // 同时清空播放次数
+ this.saveHistory()
+ },
+
+ // 按日期清理历史记录
+ clearHistoryBefore(date) {
+ const targetTime = new Date(date).getTime()
+ this.history = this.history.filter(item => item.timestamp >= targetTime)
+ this.saveHistory()
+ },
+
+ // 搜索历史记录
+ searchHistory(keyword) {
+ if (!keyword.trim()) return this.history
+
+ const lowerKeyword = keyword.toLowerCase()
+ return this.history.filter(item =>
+ item.song.name.toLowerCase().includes(lowerKeyword) ||
+ item.song.artist.toLowerCase().includes(lowerKeyword) ||
+ (item.song.album && item.song.album.toLowerCase().includes(lowerKeyword))
+ )
+ },
+
+ // 保存到本地存储
+ saveHistory() {
+ try {
+ localStorage.setItem('music-history', JSON.stringify({
+ history: this.history,
+ playCount: this.playCount,
+ lastUpdated: Date.now()
+ }))
+ } catch (error) {
+ console.error('保存播放历史失败:', error)
+ }
+ },
+
+ // 从本地存储加载
+ async loadHistory() {
+ try {
+ const saved = localStorage.getItem('music-history')
+ if (saved) {
+ const data = JSON.parse(saved)
+ this.history = data.history || []
+ this.playCount = data.playCount || {}
+
+ // 清理过期的历史记录(超过30天)
+ const thirtyDaysAgo = Date.now() - (30 * 24 * 60 * 60 * 1000)
+ const originalLength = this.history.length
+ this.history = this.history.filter(item => item.timestamp > thirtyDaysAgo)
+
+ // 如果清理了历史记录,重新计算播放次数
+ if (originalLength !== this.history.length) {
+ this.playCount = {}
+ this.history.forEach(item => {
+ const songId = item.song.id
+ this.playCount[songId] = (this.playCount[songId] || 0) + 1
+ })
+ this.saveHistory() // 保存清理后的记录
+ }
+ }
+ } catch (error) {
+ console.error('加载播放历史失败:', error)
+ this.history = []
+ this.playCount = {}
+ }
+ },
+
+ // 导出历史记录
+ exportHistory() {
+ try {
+ const data = {
+ history: this.history,
+ playCount: this.playCount,
+ stats: this.playStats,
+ exportTime: Date.now(),
+ version: '1.0'
+ }
+
+ const blob = new Blob([JSON.stringify(data, null, 2)], {
+ type: 'application/json'
+ })
+
+ const url = URL.createObjectURL(blob)
+ const link = document.createElement('a')
+ link.href = url
+ link.download = `music-history-${new Date().toISOString().split('T')[0]}.json`
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ URL.revokeObjectURL(url)
+
+ return true
+ } catch (error) {
+ console.error('导出播放历史失败:', error)
+ return false
+ }
+ },
+
+ // 导入历史记录
+ async importHistory(file) {
+ try {
+ const text = await file.text()
+ const data = JSON.parse(text)
+
+ if (data.history && Array.isArray(data.history)) {
+ // 合并历史记录,去重
+ const existingIds = new Set(
+ this.history.map(item => `${item.song.id}-${item.timestamp}`)
+ )
+
+ const newItems = data.history.filter(item =>
+ !existingIds.has(`${item.song.id}-${item.timestamp}`)
+ )
+
+ this.history = [...this.history, ...newItems]
+ .sort((a, b) => b.timestamp - a.timestamp)
+ .slice(0, this.maxHistorySize)
+
+ // 合并播放次数
+ if (data.playCount) {
+ Object.entries(data.playCount).forEach(([songId, count]) => {
+ this.playCount[songId] = (this.playCount[songId] || 0) + count
+ })
+ } else {
+ // 如果导入的数据没有播放次数,重新计算
+ this.playCount = {}
+ this.history.forEach(item => {
+ const songId = item.song.id
+ this.playCount[songId] = (this.playCount[songId] || 0) + 1
+ })
+ }
+
+ this.saveHistory()
+ return true
+ }
+
+ return false
+ } catch (error) {
+ console.error('导入播放历史失败:', error)
+ return false
+ }
+ }
+ }
+})
\ No newline at end of file
diff --git a/src/stores/player.js b/src/stores/player.js
new file mode 100644
index 0000000000000000000000000000000000000000..ad5498fa558e302ca4e9f0799b8eb02e8bbbf9a6
--- /dev/null
+++ b/src/stores/player.js
@@ -0,0 +1,609 @@
+import { defineStore } from 'pinia'
+import { ref, computed } from 'vue'
+import { musicApi } from '@/services/musicApi'
+
+export const usePlayerStore = defineStore('player', () => {
+ // 状态
+ const currentSong = ref(null)
+ const playlist = ref([])
+ const currentIndex = ref(-1)
+ const isPlaying = ref(false)
+ const currentTime = ref(0)
+ const duration = ref(0)
+ const volume = ref(80)
+ const playMode = ref('list') // 'list', 'random', 'single'
+ const audioSrc = ref('')
+ const muted = ref(false)
+ const lastVolume = ref(80) // 记住静音前的音量
+ const cachedCovers = ref(new Map()) // 封面缓存
+ const cachedLyrics = ref(new Map()) // 歌词缓存
+ const audioElement = ref(null) // 添加音频元素引用
+ const isManualSeeking = ref(false) // 标志是否正在手动拖动进度条
+
+ // 计算属性
+ const hasPrevious = computed(() => currentIndex.value > 0)
+ const hasNext = computed(() => currentIndex.value < playlist.value.length - 1)
+ const progress = computed(() => {
+ return duration.value > 0 ? (currentTime.value / duration.value) * 100 : 0
+ })
+ const effectiveVolume = computed(() => muted.value ? 0 : volume.value)
+ const canRestore = computed(() => currentSong.value && audioSrc.value)
+
+ // 方法
+ const setCurrentSong = (song, index = -1, restoreProgress = false) => {
+ currentSong.value = song
+ if (index >= 0) {
+ currentIndex.value = index
+ } else {
+ // 在播放列表中查找歌曲
+ const foundIndex = playlist.value.findIndex(s => s.id === song.id && s.source === song.source)
+ currentIndex.value = foundIndex >= 0 ? foundIndex : -1
+ }
+
+ // 默认重置播放时间为0,除非明确要求恢复进度
+ if (!restoreProgress) {
+ currentTime.value = 0
+ }
+
+ savePlayerState()
+ }
+
+ const setPlaylist = (songs, startIndex = 0) => {
+ playlist.value = songs
+ if (songs.length > 0 && startIndex >= 0 && startIndex < songs.length) {
+ setCurrentSong(songs[startIndex], startIndex)
+ }
+ savePlayerState()
+ }
+
+ const addToPlaylist = (song) => {
+ const exists = playlist.value.some(s => s.id === song.id && s.source === song.source)
+ if (!exists) {
+ playlist.value.push(song)
+ savePlayerState()
+ }
+ }
+
+ const removeFromPlaylist = (index) => {
+ if (index >= 0 && index < playlist.value.length) {
+ playlist.value.splice(index, 1)
+ if (currentIndex.value > index) {
+ currentIndex.value--
+ } else if (currentIndex.value === index) {
+ if (playlist.value.length === 0) {
+ currentSong.value = null
+ currentIndex.value = -1
+ } else {
+ const newIndex = Math.min(currentIndex.value, playlist.value.length - 1)
+ setCurrentSong(playlist.value[newIndex], newIndex)
+ }
+ }
+ savePlayerState()
+ }
+ }
+
+ const setPlayMode = (mode) => {
+ playMode.value = mode
+ savePlayerState()
+ }
+
+ const setVolume = (vol) => {
+ const newVolume = Math.max(0, Math.min(100, vol))
+ volume.value = newVolume
+ if (newVolume > 0) {
+ muted.value = false
+ lastVolume.value = newVolume
+ }
+ savePlayerState()
+ }
+
+ const toggleMute = () => {
+ if (muted.value) {
+ muted.value = false
+ volume.value = lastVolume.value
+ } else {
+ muted.value = true
+ lastVolume.value = volume.value
+ volume.value = 0
+ }
+ savePlayerState()
+ }
+
+ const increaseVolume = (step = 5) => {
+ const newVolume = Math.min(100, volume.value + step)
+ setVolume(newVolume)
+ }
+
+ const decreaseVolume = (step = 5) => {
+ const newVolume = Math.max(0, volume.value - step)
+ setVolume(newVolume)
+ }
+
+ const setPlayingState = (playing) => {
+ isPlaying.value = playing
+ }
+
+ const setCurrentTime = (time) => {
+ // 如果正在手动拖动,忽略来自音频元素的时间更新
+ if (isManualSeeking.value) {
+ return
+ }
+ currentTime.value = time
+ }
+
+ const setDuration = (dur) => {
+ duration.value = dur
+ }
+
+ const setAudioSrc = (src) => {
+ audioSrc.value = src
+ }
+
+ const setAudioElement = (element) => {
+ audioElement.value = element
+ }
+
+ const seekTo = (time) => {
+ if (time >= 0 && time <= duration.value && isFinite(time)) {
+ // 设置手动拖动标志
+ isManualSeeking.value = true
+
+ // 直接更新store中的时间
+ currentTime.value = time
+
+ // 如果有音频元素引用,直接设置currentTime
+ if (audioElement.value) {
+ audioElement.value.currentTime = time
+
+ // 如果当前没有播放,且有音频源,尝试播放
+ if (!isPlaying.value && audioSrc.value) {
+ audioElement.value.play().then(() => {
+ setPlayingState(true)
+ console.log('拖动进度条后开始播放:', time)
+ }).catch(error => {
+ console.log('自动播放被阻止:', error)
+ })
+ }
+ }
+
+ // 延迟重置标志,避免立即被timeupdate覆盖
+ setTimeout(() => {
+ isManualSeeking.value = false
+ }, 200)
+
+ return true
+ }
+ return false
+ }
+
+ // 播放控制方法
+ const togglePlay = () => {
+ setPlayingState(!isPlaying.value)
+ savePlayerState()
+ }
+
+ const previous = () => {
+ const prevSong = playPrevious()
+ return prevSong
+ }
+
+ const next = () => {
+ const nextSong = playNext()
+ return nextSong
+ }
+
+ const togglePlayMode = () => {
+ const modes = ['list', 'random', 'single']
+ const currentIndex = modes.indexOf(playMode.value)
+ const nextIndex = (currentIndex + 1) % modes.length
+ setPlayMode(modes[nextIndex])
+ }
+
+ const playSong = async (song, index = -1) => {
+ setCurrentSong(song, index, false) // 不恢复进度,从0开始播放
+ setPlayingState(false) // 先暂停,等获取到URL后再播放
+
+ // 获取音频URL
+ try {
+ const audioUrl = await getAudioUrl(song)
+ if (audioUrl) {
+ setAudioSrc(audioUrl)
+ setPlayingState(true)
+ }
+ } catch (error) {
+ console.error('播放歌曲失败:', error)
+ }
+ }
+
+ const getAudioUrl = async (song) => {
+ try {
+ const result = await musicApi.getMusicUrl(song.source, song.id, '320')
+ return result?.url || null
+ } catch (error) {
+ console.error('获取音频URL失败:', error)
+ return null
+ }
+ }
+
+ const changeQuality = async (quality) => {
+ // 音质切换逻辑
+ if (currentSong.value) {
+ const newUrl = await getAudioUrl(currentSong.value)
+ if (newUrl) {
+ setAudioSrc(newUrl)
+ }
+ }
+ }
+
+ // 播放控制
+ const playNext = () => {
+ if (!playlist.value.length) return null
+
+ let nextIndex = currentIndex.value
+
+ switch (playMode.value) {
+ case 'random':
+ nextIndex = Math.floor(Math.random() * playlist.value.length)
+ break
+ case 'single':
+ // 单曲循环,保持当前歌曲
+ break
+ case 'list':
+ default:
+ nextIndex = hasNext.value ? currentIndex.value + 1 : 0
+ break
+ }
+
+ if (nextIndex < playlist.value.length) {
+ setCurrentSong(playlist.value[nextIndex], nextIndex, false) // 不恢复进度
+ return playlist.value[nextIndex]
+ }
+ return null
+ }
+
+ const playPrevious = () => {
+ if (!playlist.value.length) return null
+
+ let prevIndex = currentIndex.value
+
+ switch (playMode.value) {
+ case 'random':
+ prevIndex = Math.floor(Math.random() * playlist.value.length)
+ break
+ case 'single':
+ // 单曲循环,保持当前歌曲
+ break
+ case 'list':
+ default:
+ prevIndex = hasPrevious.value ? currentIndex.value - 1 : playlist.value.length - 1
+ break
+ }
+
+ if (prevIndex >= 0 && prevIndex < playlist.value.length) {
+ setCurrentSong(playlist.value[prevIndex], prevIndex, false) // 不恢复进度
+ return playlist.value[prevIndex]
+ }
+ return null
+ }
+
+ // 资源缓存管理
+ // 使用 Map 来存储正在进行的请求,避免重复请求
+ const pendingRequests = new Map()
+
+ const getCachedCover = (song, size = 300) => {
+ if (!song) return null
+ // 检查多种可能的图片ID字段(与MiniPlayer和FullPlayerPage保持一致)
+ const picId = song.pic_id || song.picId || song.albumId
+ if (!picId) return null
+ const key = `${song.source}-${picId}-${size}`
+ const cached = cachedCovers.value.get(key)
+ return cached || song.cover || null
+ }
+
+ const setCachedCover = (song, coverUrl, size = 300) => {
+ if (!song || !coverUrl) return
+ // 检查多种可能的图片ID字段(与MiniPlayer和FullPlayerPage保持一致)
+ const picId = song.pic_id || song.picId || song.albumId
+ if (!picId) return
+ const key = `${song.source}-${picId}-${size}`
+ cachedCovers.value.set(key, coverUrl)
+ // 同时更新歌曲对象中的cover字段
+ if (song) {
+ song.cover = coverUrl
+ }
+ }
+
+ // 新增:获取专辑封面(带请求去重)
+ const getAlbumCover = async (song, size = 300) => {
+ if (!song) return null
+
+ // 检查多种可能的图片ID字段
+ const picId = song.pic_id || song.picId || song.albumId
+ if (!picId) return null
+
+ const key = `${song.source}-${picId}-${size}`
+
+ // 先检查缓存
+ const cached = getCachedCover(song, size)
+ if (cached) {
+ return cached
+ }
+
+ // 检查是否有正在进行的相同请求
+ if (pendingRequests.has(key)) {
+ return pendingRequests.get(key)
+ }
+
+ // 创建新的请求
+ const request = musicApi.getAlbumCover(song.source, picId, size)
+ pendingRequests.set(key, request)
+
+ try {
+ const coverUrl = await request
+ if (coverUrl) {
+ // 缓存结果
+ setCachedCover(song, coverUrl, size)
+ }
+ return coverUrl
+ } catch (error) {
+ console.error('获取专辑封面失败:', error)
+ return null
+ } finally {
+ // 清除正在进行的请求
+ pendingRequests.delete(key)
+ }
+ }
+
+ // 新增:获取歌词(带请求去重)
+ const getLyricsWithDedup = async (song) => {
+ if (!song) return null
+
+ const key = `lyrics-${song.source}-${song.lyric_id || song.id}`
+
+ // 先检查缓存
+ const cached = getCachedLyrics(song)
+ if (cached) {
+ return cached
+ }
+
+ // 检查是否有正在进行的相同请求
+ if (pendingRequests.has(key)) {
+ return pendingRequests.get(key)
+ }
+
+ // 创建新的请求
+ const request = musicApi.getLyrics(song.source, song.lyric_id || song.id)
+ pendingRequests.set(key, request)
+
+ try {
+ const lyricsData = await request
+ if (lyricsData) {
+ // 缓存结果
+ setCachedLyrics(song, lyricsData)
+ }
+ return lyricsData
+ } catch (error) {
+ console.error('获取歌词失败:', error)
+ return { lyric: '', tlyric: '' }
+ } finally {
+ // 清除正在进行的请求
+ pendingRequests.delete(key)
+ }
+ }
+
+ const getCachedLyrics = (song) => {
+ if (!song) return null
+ const key = `${song.source}-${song.lyric_id || song.id}`
+ return cachedLyrics.value.get(key) || null
+ }
+
+ const setCachedLyrics = (song, lyricsData) => {
+ if (!song || !lyricsData) return
+ const key = `${song.source}-${song.lyric_id || song.id}`
+ cachedLyrics.value.set(key, lyricsData)
+ }
+
+ const clearResourceCache = () => {
+ cachedCovers.value.clear()
+ cachedLyrics.value.clear()
+ }
+
+ // 本地存储
+ const savePlayerState = () => {
+ // 构建歌曲唯一标识
+ const songKey = currentSong.value ? `${currentSong.value.source}-${currentSong.value.id}` : null
+
+ const state = {
+ currentSong: currentSong.value,
+ playlist: playlist.value,
+ currentIndex: currentIndex.value,
+ volume: volume.value,
+ playMode: playMode.value,
+ muted: muted.value,
+ lastVolume: lastVolume.value,
+ audioSrc: audioSrc.value,
+ duration: duration.value,
+ timestamp: Date.now(),
+ // 只保存当前正在播放的歌曲进度
+ savedProgress: songKey && currentTime.value > 0 ? {
+ songKey: songKey,
+ currentTime: currentTime.value
+ } : null
+ }
+
+ try {
+ localStorage.setItem('vue-music-player-state', JSON.stringify(state))
+ } catch (error) {
+ console.error('保存播放器状态失败:', error)
+ }
+ }
+
+ const loadPlayerState = () => {
+ try {
+ const saved = localStorage.getItem('vue-music-player-state')
+ if (saved) {
+ const state = JSON.parse(saved)
+
+ // 检查状态是否过期(24小时)
+ const now = Date.now()
+ const maxAge = 24 * 60 * 60 * 1000 // 24小时
+
+ if (state.timestamp && (now - state.timestamp) > maxAge) {
+ console.log('播放器状态已过期,使用默认设置')
+ clearPlayerState()
+ return false
+ }
+
+ // 恢复播放器状态
+ volume.value = state.volume !== undefined ? state.volume : 80
+ playMode.value = state.playMode || 'list'
+ muted.value = state.muted || false
+ lastVolume.value = state.lastVolume || 80
+ audioSrc.value = state.audioSrc || ''
+ duration.value = state.duration || 0
+ playlist.value = state.playlist || []
+ currentIndex.value = state.currentIndex !== undefined ? state.currentIndex : -1
+
+ // 智能恢复播放进度:只有歌曲匹配时才恢复进度
+ if (state.currentSong && state.savedProgress) {
+ const savedSongKey = `${state.currentSong.source}-${state.currentSong.id}`
+ if (state.savedProgress.songKey === savedSongKey && state.savedProgress.currentTime > 0) {
+ currentSong.value = state.currentSong
+ currentTime.value = state.savedProgress.currentTime
+ console.log('恢复播放进度:', state.savedProgress.currentTime)
+ } else {
+ currentSong.value = state.currentSong
+ currentTime.value = 0
+ }
+ } else if (state.currentSong) {
+ currentSong.value = state.currentSong
+ currentTime.value = 0
+ } else {
+ currentSong.value = null
+ currentTime.value = 0
+ }
+
+ return true
+ }
+ } catch (error) {
+ console.error('加载播放器状态失败:', error)
+ }
+ return false
+ }
+
+ const clearPlayerState = () => {
+ try {
+ localStorage.removeItem('vue-music-player-state')
+ } catch (error) {
+ console.error('清除播放器状态失败:', error)
+ }
+ }
+
+ // 恢复播放会话
+ const restorePlaybackSession = async () => {
+ if (!canRestore.value) return false
+
+ try {
+ // 重新获取音频URL(因为URL可能过期)
+ if (currentSong.value) {
+ const freshUrl = await musicApi.getAudioUrl(
+ currentSong.value.source,
+ currentSong.value.id
+ )
+
+ if (freshUrl) {
+ audioSrc.value = freshUrl
+ return true
+ }
+ }
+ } catch (error) {
+ console.error('恢复播放会话失败:', error)
+ }
+ return false
+ }
+
+ // 定期保存播放进度(用于意外关闭恢复)
+ let saveProgressTimer = null
+
+ const startPeriodicSave = () => {
+ if (saveProgressTimer) {
+ clearInterval(saveProgressTimer)
+ }
+
+ saveProgressTimer = setInterval(() => {
+ if (isPlaying.value && currentSong.value) {
+ savePlayerState()
+ }
+ }, 10000) // 每10秒保存一次
+ }
+
+ const stopPeriodicSave = () => {
+ if (saveProgressTimer) {
+ clearInterval(saveProgressTimer)
+ saveProgressTimer = null
+ }
+ }
+
+ return {
+ // 状态
+ currentSong,
+ playlist,
+ currentIndex,
+ isPlaying,
+ currentTime,
+ duration,
+ volume,
+ playMode,
+ audioSrc,
+ muted,
+ lastVolume,
+
+ // 计算属性
+ hasPrevious,
+ hasNext,
+ progress,
+ effectiveVolume,
+ canRestore,
+
+ // 方法
+ setCurrentSong,
+ setPlaylist,
+ addToPlaylist,
+ removeFromPlaylist,
+ setPlayMode,
+ setVolume,
+ toggleMute,
+ increaseVolume,
+ decreaseVolume,
+ setPlayingState,
+ setCurrentTime,
+ setDuration,
+ setAudioSrc,
+ setAudioElement,
+ seekTo,
+ togglePlay,
+ previous,
+ next,
+ togglePlayMode,
+ playSong,
+ getAudioUrl,
+ changeQuality,
+ playNext,
+ playPrevious,
+ savePlayerState,
+ loadPlayerState,
+ clearPlayerState,
+ restorePlaybackSession,
+ startPeriodicSave,
+ stopPeriodicSave,
+
+ // 资源缓存管理
+ getCachedCover,
+ setCachedCover,
+ getAlbumCover, // 添加这一行
+ getLyricsWithDedup, // 新增歌词去重方法
+ getCachedLyrics,
+ setCachedLyrics,
+ clearResourceCache
+ }
+})
\ No newline at end of file
diff --git a/src/stores/search.js b/src/stores/search.js
new file mode 100644
index 0000000000000000000000000000000000000000..34172b243ed31cde1a6dfbc31c71253ec053b75a
--- /dev/null
+++ b/src/stores/search.js
@@ -0,0 +1,342 @@
+import { defineStore } from 'pinia'
+import { ref, watch } from 'vue'
+import { musicApi } from '@/services/musicApi'
+import { useSettingsStore } from '@/stores/settings'
+
+export const useSearchStore = defineStore('search', () => {
+ // 获取设置存储
+ const settingsStore = useSettingsStore()
+
+ // 状态
+ const keyword = ref('')
+ const currentSource = ref('netease')
+ const searchResults = ref([])
+ const loading = ref(false)
+ const hasMore = ref(true)
+ const currentPage = ref(1)
+ const searchHistory = ref([])
+ const searchSuggestions = ref([])
+ const suggestionLoading = ref(false)
+
+ // 请求间隔控制
+ let lastRequestTime = 0
+ const REQUEST_INTERVAL = 100 // 100ms间隔
+
+ // 搜索音乐
+ const searchMusic = async (query, source = null, page = 1, append = false) => {
+ if (!query.trim()) return
+
+ // 防止重复请求间隔控制
+ const now = Date.now()
+ if (now - lastRequestTime < REQUEST_INTERVAL) {
+ await new Promise(resolve => setTimeout(resolve, REQUEST_INTERVAL - (now - lastRequestTime)))
+ }
+
+ loading.value = true
+
+ try {
+ const searchSource = source || currentSource.value
+ const results = await musicApi.searchMusic(query, searchSource, 20, page)
+
+ // 更新最后请求时间
+ lastRequestTime = Date.now()
+
+ if (append) {
+ searchResults.value.push(...results)
+ } else {
+ searchResults.value = results
+ keyword.value = query
+ currentPage.value = page
+
+ // 添加到搜索历史
+ addToHistory(query)
+ }
+
+ // 检查是否还有更多数据
+ hasMore.value = results.length === 20
+
+ } catch (error) {
+ console.error('搜索失败:', error)
+ throw error
+ } finally {
+ loading.value = false
+ }
+ }
+
+ // 加载更多
+ const loadMore = async () => {
+ if (!hasMore.value || loading.value || !keyword.value) return
+
+ const nextPage = currentPage.value + 1
+ await searchMusic(keyword.value, currentSource.value, nextPage, true)
+ currentPage.value = nextPage
+ }
+
+ // 设置音乐源
+ const setSource = (source) => {
+ currentSource.value = source
+ // 同步到设置存储
+ settingsStore.updateSetting('defaultSource', source)
+ saveSearchSettings()
+ }
+
+ // 清空搜索结果
+ const clearResults = () => {
+ searchResults.value = []
+ keyword.value = ''
+ currentPage.value = 1
+ hasMore.value = true
+ }
+
+ // 搜索历史管理
+ const addToHistory = (query) => {
+ if (!query.trim()) return
+
+ const trimmedQuery = query.trim()
+ // 移除重复项
+ searchHistory.value = searchHistory.value.filter(item => item !== trimmedQuery)
+ // 添加到开头
+ searchHistory.value.unshift(trimmedQuery)
+ // 限制历史记录数量
+ searchHistory.value = searchHistory.value.slice(0, 10)
+
+ saveSearchHistory()
+ }
+
+ const removeFromHistory = (query) => {
+ searchHistory.value = searchHistory.value.filter(item => item !== query)
+ saveSearchHistory()
+ }
+
+ const clearHistory = () => {
+ searchHistory.value = []
+ localStorage.removeItem('vue-music-search-history')
+ }
+
+ // 搜索建议功能
+ let suggestionTimer = null
+
+ const getSuggestions = async (query) => {
+ if (!query || query.length < 2) {
+ searchSuggestions.value = []
+ return
+ }
+
+ // 防抖处理
+ if (suggestionTimer) {
+ clearTimeout(suggestionTimer)
+ }
+
+ suggestionTimer = setTimeout(async () => {
+ suggestionLoading.value = true
+
+ try {
+ // 组合多种建议来源
+ const suggestions = []
+
+ // 1. 从搜索历史中匹配
+ const historySuggestions = searchHistory.value
+ .filter(item => item.toLowerCase().includes(query.toLowerCase()))
+ .slice(0, 3)
+ suggestions.push(...historySuggestions)
+
+ // 2. 内置热门搜索词匹配
+ const hotKeywords = [
+ '周杰伦', '邓紫棋', '薛之谦', '陈奕迅', '林俊杰',
+ '王菲', '刘德华', '张学友', 'Beyond', 'Taylor Swift',
+ '稻香', '青花瓷', '演员', '告白气球', '晴天',
+ '夜曲', '七里香', '简单爱', '海阔天空', '真的爱你',
+ '光辞', '山海', '星辰大海', '万疆', '踏山河',
+ '热爱105°C的你', '起风了', '少年', '世界这么大还是遇见你'
+ ]
+
+ const hotSuggestions = hotKeywords
+ .filter(item => item.toLowerCase().includes(query.toLowerCase()))
+ .slice(0, 2)
+ suggestions.push(...hotSuggestions)
+
+ // 3. 智能联想词
+ const smartSuggestions = getSmartSuggestions(query)
+ suggestions.push(...smartSuggestions)
+
+ // 去重并限制数量
+ const uniqueSuggestions = [...new Set(suggestions)].slice(0, 6)
+ searchSuggestions.value = uniqueSuggestions
+
+ } catch (error) {
+ console.error('获取搜索建议失败:', error)
+ searchSuggestions.value = []
+ } finally {
+ suggestionLoading.value = false
+ }
+ }, 300) // 300ms防抖
+ }
+
+ const getSmartSuggestions = (query) => {
+ const suggestions = []
+ const lowerQuery = query.toLowerCase()
+
+ // 智能联想规则
+ const rules = [
+ // 歌手相关
+ { pattern: /周杰/, suggestions: ['周杰伦', '周杰伦 稻香', '周杰伦 青花瓷', '周杰伦 告白气球'] },
+ { pattern: /邓紫/, suggestions: ['邓紫棋', '邓紫棋 泡沫', '邓紫棋 我的秘密', '邓紫棋 光年之外'] },
+ { pattern: /薛之/, suggestions: ['薛之谦', '薛之谦 演员', '薛之谦 认真的雪', '薛之谦 刚好遇见你'] },
+ { pattern: /陈奕/, suggestions: ['陈奕迅', '陈奕迅 十年', '陈奕迅 富士山下', '陈奕迅 K歌之王'] },
+ { pattern: /林俊/, suggestions: ['林俊杰', '林俊杰 江南', '林俊杰 曹操', '林俊杰 修炼爱情'] },
+
+ // 热门歌曲相关
+ { pattern: /稻香/, suggestions: ['稻香 周杰伦', '稻香 原版'] },
+ { pattern: /青花瓷/, suggestions: ['青花瓷 周杰伦', '青花瓷 纯音乐'] },
+ { pattern: /演员/, suggestions: ['演员 薛之谦', '演员 原唱'] },
+ { pattern: /告白气球/, suggestions: ['告白气球 周杰伦', '告白气球 现场版'] },
+ { pattern: /晴天/, suggestions: ['晴天 周杰伦', '晴天 吉他版'] },
+
+ // 风格相关
+ { pattern: /古风/, suggestions: ['古风歌曲', '古风音乐', '中国风'] },
+ { pattern: /民谣/, suggestions: ['民谣歌曲', '民谣吉他', '中文民谣'] },
+ { pattern: /摇滚/, suggestions: ['摇滚乐', '中文摇滚', '经典摇滚'] },
+ { pattern: /流行/, suggestions: ['流行歌曲', '流行音乐', '华语流行'] },
+ { pattern: /说唱/, suggestions: ['说唱歌曲', '中文说唱', 'Rap音乐'] }
+ ]
+
+ for (const rule of rules) {
+ if (rule.pattern.test(lowerQuery)) {
+ suggestions.push(...rule.suggestions.slice(0, 2))
+ break
+ }
+ }
+
+ // 如果没有匹配的规则,提供一些通用建议
+ if (suggestions.length === 0) {
+ const genericSuggestions = [
+ `${query} 歌曲`,
+ `${query} 现场版`,
+ `${query} 原版`
+ ]
+ suggestions.push(...genericSuggestions.slice(0, 1))
+ }
+
+ return suggestions
+ }
+
+ const clearSuggestions = () => {
+ searchSuggestions.value = []
+ if (suggestionTimer) {
+ clearTimeout(suggestionTimer)
+ suggestionTimer = null
+ }
+ }
+
+ const getSearchSuggestions = (query) => {
+ if (!query || query.length < 2) return []
+
+ const lowerQuery = query.toLowerCase()
+ return searchHistory.value
+ .filter(item => item.toLowerCase().includes(lowerQuery))
+ .slice(0, 5)
+ }
+
+ // 获取音乐源名称
+ const getSourceName = (source) => {
+ const sourceMap = {
+ 'netease': '网易云音乐',
+ 'tencent': 'QQ音乐',
+ 'kugou': '酷狗音乐',
+ 'kuwo': '酷我音乐',
+ 'migu': '咪咕音乐',
+ 'spotify': 'Spotify',
+ 'apple': 'Apple Music',
+ 'ytmusic': 'YouTube Music',
+ 'joox': 'JOOX',
+ 'tidal': 'TIDAL',
+ 'deezer': 'Deezer',
+ 'qobuz': 'Qobuz',
+ 'ximalaya': '喜马拉雅FM'
+ }
+ return sourceMap[source] || source
+ }
+
+ // 本地存储
+ const saveSearchSettings = () => {
+ const settings = {
+ currentSource: currentSource.value
+ }
+ localStorage.setItem('vue-music-search-settings', JSON.stringify(settings))
+ }
+
+ const loadSearchSettings = () => {
+ try {
+ const saved = localStorage.getItem('vue-music-search-settings')
+ if (saved) {
+ const settings = JSON.parse(saved)
+ currentSource.value = settings.currentSource || 'netease'
+ }
+ } catch (error) {
+ console.error('加载搜索设置失败:', error)
+ }
+ }
+
+ const saveSearchHistory = () => {
+ localStorage.setItem('vue-music-search-history', JSON.stringify(searchHistory.value))
+ }
+
+ const loadSearchHistory = () => {
+ try {
+ const saved = localStorage.getItem('vue-music-search-history')
+ if (saved) {
+ searchHistory.value = JSON.parse(saved) || []
+ }
+ } catch (error) {
+ console.error('加载搜索历史失败:', error)
+ }
+ }
+
+ // 同步设置存储的默认音乐源
+ const syncWithSettings = () => {
+ // 初始化时从设置获取默认音乐源
+ currentSource.value = settingsStore.getSetting('defaultSource') || 'netease'
+
+ // 监听设置变化,自动同步
+ watch(() => settingsStore.getSetting('defaultSource'), (newSource) => {
+ if (newSource && newSource !== currentSource.value) {
+ currentSource.value = newSource
+ // 清空当前搜索结果,因为音乐源已改变
+ clearResults()
+ }
+ })
+ }
+
+ // 初始化同步
+ syncWithSettings()
+
+ return {
+ // 状态
+ keyword,
+ currentSource,
+ searchResults,
+ loading,
+ hasMore,
+ currentPage,
+ searchHistory,
+ searchSuggestions,
+ suggestionLoading,
+
+ // 方法
+ searchMusic,
+ loadMore,
+ setSource,
+ clearResults,
+ addToHistory,
+ removeFromHistory,
+ clearHistory,
+ getSuggestions,
+ clearSuggestions,
+ getSearchSuggestions,
+ getSourceName,
+ saveSearchSettings,
+ loadSearchSettings,
+ saveSearchHistory,
+ loadSearchHistory
+ }
+})
\ No newline at end of file
diff --git a/src/stores/settings.js b/src/stores/settings.js
new file mode 100644
index 0000000000000000000000000000000000000000..256a62a25ca705e195c8d7758db2533de6323367
--- /dev/null
+++ b/src/stores/settings.js
@@ -0,0 +1,108 @@
+import { defineStore } from 'pinia'
+import { themeManager, THEME_IDS } from '@/styles/themes'
+
+export const useSettingsStore = defineStore('settings', {
+ state: () => ({
+ settings: {
+ // 播放设置 - 根据需求文档
+ defaultQuality: '320', // 默认音质:128/192/320/740/999 (默认:320K)
+ defaultPlayMode: 'list', // 默认播放模式:list/random/single (默认:列表循环)
+ rememberProgress: true, // 记住播放进度:true/false (默认:开启)
+ autoNext: true, // 自动播放下一首
+ fadeEffect: true, // 淡入淡出效果
+
+ // 搜索设置 - 根据需求文档
+ defaultSource: 'netease', // 默认音乐源:netease (默认:网易云音乐)
+ searchLimit: 20, // 搜索结果数量
+ saveSearchHistory: true, // 搜索历史:true/false (默认:保存)
+
+ // 外观设置 - 新的多主题系统
+ theme: 'light', // 主题模式:light/dark/orange/pink/purple/blue/green/gold/gray/wechat
+ showLyrics: true, // 显示歌词
+ lyricsFontSize: 18, // 歌词字体大小
+
+ // 通知设置
+ desktopNotification: true, // 桌面通知
+ mediaSession: true // 媒体控制
+ }
+ }),
+
+ actions: {
+ // 获取设置项
+ getSetting(key) {
+ return this.settings[key]
+ },
+
+ // 更新设置项
+ updateSetting(key, value) {
+ if (key in this.settings) {
+ this.settings[key] = value
+
+ // 特殊处理主题切换
+ if (key === 'theme') {
+ this.applyTheme(value)
+ }
+
+ this.saveSettings()
+ }
+ },
+
+ // 应用主题
+ applyTheme(themeId = null) {
+ const targetTheme = themeId || this.settings.theme || 'light'
+ try {
+ themeManager.applyTheme(targetTheme)
+
+ // 更新设置状态
+ if (themeId && themeId !== this.settings.theme) {
+ this.settings.theme = targetTheme
+ this.saveSettings()
+ }
+
+ console.log(`主题已切换到: ${targetTheme}`)
+ } catch (error) {
+ console.error('应用主题失败:', error)
+ // 回退到默认主题
+ if (targetTheme !== 'light') {
+ this.applyTheme('light')
+ }
+ }
+ },
+
+ // 获取所有可用主题
+ getAvailableThemes() {
+ return themeManager.getAllThemes()
+ },
+
+ // 保存设置到本地存储
+ saveSettings() {
+ try {
+ localStorage.setItem('music-settings', JSON.stringify({
+ settings: this.settings,
+ version: '1.0',
+ lastUpdated: Date.now()
+ }))
+ } catch (error) {
+ console.error('保存设置失败:', error)
+ }
+ },
+
+ // 从本地存储加载设置
+ loadSettings() {
+ try {
+ const saved = localStorage.getItem('music-settings')
+ if (saved) {
+ const data = JSON.parse(saved)
+ if (data.settings) {
+ this.settings = {
+ ...this.settings,
+ ...data.settings
+ }
+ }
+ }
+ } catch (error) {
+ console.error('加载设置失败:', error)
+ }
+ }
+ }
+})
\ No newline at end of file
diff --git a/src/stores/toast.js b/src/stores/toast.js
new file mode 100644
index 0000000000000000000000000000000000000000..c49003623b09c7b5850ca135b335cf857dfca1f0
--- /dev/null
+++ b/src/stores/toast.js
@@ -0,0 +1,73 @@
+import { defineStore } from 'pinia'
+import { ref } from 'vue'
+
+export const useToastStore = defineStore('toast', () => {
+ // 状态
+ const toasts = ref([])
+ const nextId = ref(1)
+
+ // 方法
+ const addToast = (message, type = 'info', duration = 3000) => {
+ const id = nextId.value++
+ const toast = {
+ id,
+ message,
+ type,
+ duration,
+ timestamp: Date.now()
+ }
+
+ toasts.value.push(toast)
+
+ // 自动移除
+ if (duration > 0) {
+ setTimeout(() => {
+ removeToast(id)
+ }, duration)
+ }
+
+ return id
+ }
+
+ const removeToast = (id) => {
+ const index = toasts.value.findIndex(toast => toast.id === id)
+ if (index > -1) {
+ toasts.value.splice(index, 1)
+ }
+ }
+
+ const clearAll = () => {
+ toasts.value = []
+ }
+
+ // 便捷方法
+ const success = (message, duration) => {
+ return addToast(message, 'success', duration)
+ }
+
+ const error = (message, duration) => {
+ return addToast(message, 'error', duration)
+ }
+
+ const warning = (message, duration) => {
+ return addToast(message, 'warning', duration)
+ }
+
+ const info = (message, duration) => {
+ return addToast(message, 'info', duration)
+ }
+
+ return {
+ // 状态
+ toasts,
+
+ // 方法
+ addToast,
+ removeToast,
+ clearAll,
+ success,
+ error,
+ warning,
+ info
+ }
+})
\ No newline at end of file
diff --git a/src/styles/global.css b/src/styles/global.css
new file mode 100644
index 0000000000000000000000000000000000000000..549c0669802797be42458b5e0555effc5589f82a
--- /dev/null
+++ b/src/styles/global.css
@@ -0,0 +1,268 @@
+/* 多主题音乐应用 - 默认变量 */
+:root {
+ /* 组件尺寸 */
+ --tabbar-height: 49px;
+ --mini-player-height: 64px;
+ --list-item-height: 64px;
+ --touch-target: 44px;
+
+ /* 圆角 */
+ --radius-small: 12px;
+ --radius-card: 20px;
+
+ /* 动画 */
+ --transition-fast: 0.3s ease;
+ --transition-slow: 0.5s ease;
+
+ /* 默认主题色彩(白色炫彩) */
+ --bg-primary: #f8f9fa;
+ --bg-card: rgba(255, 255, 255, 0.9);
+ --bg-secondary: rgba(255, 255, 255, 0.85);
+ --bg-overlay: rgba(255, 255, 255, 0.95);
+ --bg-gradient-1: #e3f2fd;
+ --bg-gradient-2: #f3e5f5;
+ --bg-gradient-3: #fff3e0;
+ --bg-gradient-4: #e8f5e8;
+
+ /* 新主题色变量 */
+ --primary-color: #ff6b6b;
+ --primary-color-hover: #ff5252;
+ --primary-color-active: #ff4444;
+ --primary-color-pressed: #ff3333;
+
+ /* 兼容性变量 */
+ --accent-red: var(--primary-color);
+ --accent-red-hover: var(--primary-color-hover);
+
+ /* 文字颜色 */
+ --text-primary: #2c3e50;
+ --text-secondary: rgba(44, 62, 80, 0.8);
+ --text-tertiary: rgba(44, 62, 80, 0.6);
+ --text-disabled: rgba(44, 62, 80, 0.5);
+
+ /* 边框颜色 */
+ --border-light: rgba(44, 62, 80, 0.2);
+ --border-lighter: rgba(44, 62, 80, 0.1);
+ --border-card: rgba(44, 62, 80, 0.15);
+ --border-strong: rgba(44, 62, 80, 0.3);
+
+ /* 状态颜色 */
+ --success-color: #4CAF50;
+ --warning-color: #ed8936;
+ --error-color: #ff4444;
+ --info-color: #3182ce;
+
+ /* 特殊效果 */
+ --shadow-color: rgba(0, 0, 0, 0.12);
+ --glow-color: rgba(255, 107, 107, 0.35);
+ --overlay-dark: rgba(0, 0, 0, 0.6);
+ --overlay-light: rgba(255, 255, 255, 0.1);
+
+ /* 兼容性阴影 */
+ --shadow-card: 0 8px 25px var(--shadow-color);
+ --shadow-button: 0 4px 12px var(--glow-color);
+}
+
+/* 黑色朦胧主题 */
+[data-theme="dark"] {
+ /* 背景色 */
+ --bg-primary: #0c0c0c;
+ --bg-card: rgba(30, 30, 30, 0.85);
+ --bg-secondary: rgba(25, 25, 25, 0.9);
+ --bg-overlay: rgba(0, 0, 0, 0.9);
+ --bg-gradient-1: #1a1a2e;
+ --bg-gradient-2: #16213e;
+ --bg-gradient-3: #0f3460;
+ --bg-gradient-4: #1a1a2e;
+
+ /* 文字颜色 */
+ --text-primary: #ffffff;
+ --text-secondary: rgba(255, 255, 255, 0.85);
+ --text-disabled: rgba(255, 255, 255, 0.5);
+ --text-tertiary: rgba(255, 255, 255, 0.65);
+
+ /* 边界和分隔线 - 黑色朦胧主题 */
+ --border-light: rgba(255, 255, 255, 0.2);
+ --border-lighter: rgba(255, 255, 255, 0.1);
+ --border-card: rgba(255, 255, 255, 0.15);
+ --border-strong: rgba(255, 255, 255, 0.3);
+
+ /* 阴影 - 黑色朦胧主题 */
+ --shadow-card: 0 8px 25px rgba(0, 0, 0, 0.4);
+ --shadow-button: 0 4px 12px rgba(255, 107, 107, 0.5);
+}
+
+/* 全局重置 */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ /* 禁用双击缩放和选择 */
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-tap-highlight-color: transparent;
+}
+
+/* 全局禁用缩放和双击 */
+html, body {
+ touch-action: manipulation;
+ -ms-touch-action: manipulation;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+
+/* 允许输入框和文本区域选择文本 */
+input, textarea, [contenteditable="true"] {
+ -webkit-user-select: text;
+ -khtml-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+}
+
+html, body {
+ height: 100%;
+ overflow-x: hidden;
+ /* 纯Meta方案:确保没有默认间距影响viewport-fit=cover */
+ margin: 0;
+ padding: 0;
+}
+
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ background: var(--bg-primary);
+ color: var(--text-primary);
+ line-height: 1.4;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ position: relative;
+}
+
+/* 白色炫彩主题背景 */
+body::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(-45deg, var(--bg-gradient-1), var(--bg-gradient-2), var(--bg-gradient-3), var(--bg-gradient-4));
+ background-size: 400% 400%;
+ animation: gradientBG 15s ease infinite;
+ opacity: 0.4;
+ z-index: -2;
+ pointer-events: none;
+}
+
+/* 黑色朦胧主题背景 */
+[data-theme="dark"] body::before {
+ background: linear-gradient(-45deg, var(--bg-gradient-1), var(--bg-gradient-2), var(--bg-gradient-3), var(--bg-gradient-4));
+ opacity: 0.2;
+}
+
+@keyframes gradientBG {
+ 0% { background-position: 0% 50%; }
+ 50% { background-position: 100% 50%; }
+ 100% { background-position: 0% 50%; }
+}
+
+#app {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 滚动条样式 - 白色主题 */
+::-webkit-scrollbar {
+ width: 6px;
+}
+
+::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(44, 62, 80, 0.3);
+ border-radius: 3px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: rgba(44, 62, 80, 0.5);
+}
+
+/* 滚动条样式 - 黑色主题 */
+[data-theme="dark"] ::-webkit-scrollbar-thumb {
+ background: rgba(255, 255, 255, 0.4);
+}
+
+[data-theme="dark"] ::-webkit-scrollbar-thumb:hover {
+ background: rgba(255, 255, 255, 0.6);
+}
+
+/* 通用类 */
+.container {
+ max-width: 100%;
+ margin: 0 auto;
+ padding: 0 16px;
+}
+
+.flex {
+ display: flex;
+}
+
+.flex-center {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.flex-between {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.text-ellipsis {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.text-center {
+ text-align: center;
+}
+
+/* 响应式隐藏 */
+@media (max-width: 768px) {
+ .hidden-mobile {
+ display: none !important;
+ }
+}
+
+@media (min-width: 769px) {
+ .hidden-desktop {
+ display: none !important;
+ }
+}
+
+/* 动画效果 */
+.fade-enter-active, .fade-leave-active {
+ transition: opacity var(--transition-fast);
+}
+
+.fade-enter-from, .fade-leave-to {
+ opacity: 0;
+}
+
+.slide-up-enter-active, .slide-up-leave-active {
+ transition: transform var(--transition-fast);
+}
+
+.slide-up-enter-from, .slide-up-leave-to {
+ transform: translateY(100%);
+}
\ No newline at end of file
diff --git a/src/styles/themes/base.js b/src/styles/themes/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..f28b80d5348fcc130bbf18ccfaeb33d5de333607
--- /dev/null
+++ b/src/styles/themes/base.js
@@ -0,0 +1,85 @@
+/**
+ * 主题基础配置
+ * 定义所有主题共用的颜色变量结构
+ */
+
+export const themeConfig = {
+ // 基础背景色
+ backgrounds: {
+ primary: '--bg-primary',
+ card: '--bg-card',
+ secondary: '--bg-secondary',
+ overlay: '--bg-overlay'
+ },
+
+ // 渐变背景色
+ gradients: {
+ 1: '--bg-gradient-1',
+ 2: '--bg-gradient-2',
+ 3: '--bg-gradient-3',
+ 4: '--bg-gradient-4'
+ },
+
+ // 主题色系
+ primary: {
+ main: '--primary-color',
+ hover: '--primary-color-hover',
+ active: '--primary-color-active',
+ pressed: '--primary-color-pressed'
+ },
+
+ // 文字颜色
+ text: {
+ primary: '--text-primary',
+ secondary: '--text-secondary',
+ tertiary: '--text-tertiary',
+ disabled: '--text-disabled'
+ },
+
+ // 边框颜色
+ borders: {
+ light: '--border-light',
+ lighter: '--border-lighter',
+ card: '--border-card',
+ strong: '--border-strong'
+ },
+
+ // 状态颜色
+ status: {
+ success: '--success-color',
+ warning: '--warning-color',
+ error: '--error-color',
+ info: '--info-color'
+ },
+
+ // 特殊效果
+ effects: {
+ shadow: '--shadow-color',
+ glow: '--glow-color',
+ overlayDark: '--overlay-dark',
+ overlayLight: '--overlay-light'
+ }
+}
+
+// 默认样式配置
+export const defaultStyles = {
+ // 组件尺寸
+ sizes: {
+ 'tabbar-height': '49px',
+ 'mini-player-height': '64px',
+ 'list-item-height': '64px',
+ 'touch-target': '44px'
+ },
+
+ // 圆角
+ radius: {
+ 'radius-small': '12px',
+ 'radius-card': '20px'
+ },
+
+ // 动画
+ transitions: {
+ 'transition-fast': '0.3s ease',
+ 'transition-slow': '0.5s ease'
+ }
+}
\ No newline at end of file
diff --git a/src/styles/themes/blue.js b/src/styles/themes/blue.js
new file mode 100644
index 0000000000000000000000000000000000000000..decc959732ed50d380a937e4dab0930df60b934e
--- /dev/null
+++ b/src/styles/themes/blue.js
@@ -0,0 +1,59 @@
+/**
+ * 科技蓝色主题 - Ant Design 蓝色系
+ */
+
+export const blueTheme = {
+ id: 'blue',
+ name: '科技蓝色',
+ colors: {
+ // 背景色
+ '--bg-primary': '#f0f5ff',
+ '--bg-card': 'rgba(255, 255, 255, 0.9)',
+ '--bg-secondary': 'rgba(240, 245, 255, 0.85)',
+ '--bg-overlay': 'rgba(240, 245, 255, 0.95)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#e6f7ff',
+ '--bg-gradient-2': '#bae7ff',
+ '--bg-gradient-3': '#91d5ff',
+ '--bg-gradient-4': '#69c0ff',
+
+ // 主题色 - Ant Design 蓝色
+ '--primary-color': '#1890ff',
+ '--primary-color-hover': '#40a9ff',
+ '--primary-color-active': '#096dd9',
+ '--primary-color-pressed': '#0050b3',
+
+ // 文字颜色
+ '--text-primary': '#000000d9',
+ '--text-secondary': '#00000073',
+ '--text-tertiary': '#00000040',
+ '--text-disabled': '#00000025',
+
+ // 边框
+ '--border-light': '#d9d9d9',
+ '--border-lighter': '#f0f0f0',
+ '--border-card': '#e8e8e8',
+ '--border-strong': '#bfbfbf',
+
+ // 状态颜色
+ '--success-color': '#52c41a',
+ '--warning-color': '#faad14',
+ '--error-color': '#ff4d4f',
+ '--info-color': '#1890ff',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(0, 0, 0, 0.15)',
+ '--glow-color': 'rgba(24, 144, 255, 0.4)',
+ '--overlay-dark': 'rgba(0, 0, 0, 0.65)',
+ '--overlay-light': 'rgba(255, 255, 255, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const blueThemeCompat = {
+ '--accent-red': '#1890ff',
+ '--accent-red-hover': '#40a9ff',
+ '--shadow-card': '0 8px 25px rgba(0, 0, 0, 0.15)',
+ '--shadow-button': '0 4px 12px rgba(24, 144, 255, 0.4)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/dark.js b/src/styles/themes/dark.js
new file mode 100644
index 0000000000000000000000000000000000000000..5a2d401b7a0b1f326a4d80e7f3c870f02f68cca8
--- /dev/null
+++ b/src/styles/themes/dark.js
@@ -0,0 +1,59 @@
+/**
+ * 黑色朦胧主题
+ */
+
+export const darkTheme = {
+ id: 'dark',
+ name: '黑色朦胧',
+ colors: {
+ // 背景色
+ '--bg-primary': '#0c0c0c',
+ '--bg-card': 'rgba(30, 30, 30, 0.85)',
+ '--bg-secondary': 'rgba(25, 25, 25, 0.9)',
+ '--bg-overlay': 'rgba(0, 0, 0, 0.9)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#1a1a2e',
+ '--bg-gradient-2': '#16213e',
+ '--bg-gradient-3': '#0f3460',
+ '--bg-gradient-4': '#1a1a2e',
+
+ // 主题色
+ '--primary-color': '#ff6b6b',
+ '--primary-color-hover': '#ff5252',
+ '--primary-color-active': '#ff4444',
+ '--primary-color-pressed': '#ff3333',
+
+ // 文字颜色
+ '--text-primary': '#ffffff',
+ '--text-secondary': 'rgba(255, 255, 255, 0.85)',
+ '--text-tertiary': 'rgba(255, 255, 255, 0.65)',
+ '--text-disabled': 'rgba(255, 255, 255, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(255, 255, 255, 0.2)',
+ '--border-lighter': 'rgba(255, 255, 255, 0.1)',
+ '--border-card': 'rgba(255, 255, 255, 0.15)',
+ '--border-strong': 'rgba(255, 255, 255, 0.3)',
+
+ // 状态颜色
+ '--success-color': '#4CAF50',
+ '--warning-color': '#ed8936',
+ '--error-color': '#ff4444',
+ '--info-color': '#3182ce',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(0, 0, 0, 0.4)',
+ '--glow-color': 'rgba(255, 107, 107, 0.5)',
+ '--overlay-dark': 'rgba(0, 0, 0, 0.8)',
+ '--overlay-light': 'rgba(255, 255, 255, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const darkThemeCompat = {
+ '--accent-red': '#ff6b6b',
+ '--accent-red-hover': '#ff5252',
+ '--shadow-card': '0 8px 25px rgba(0, 0, 0, 0.4)',
+ '--shadow-button': '0 4px 12px rgba(255, 107, 107, 0.5)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/gold.js b/src/styles/themes/gold.js
new file mode 100644
index 0000000000000000000000000000000000000000..da8fee5d43ad17bd66736fcdb7d498aeb13cda4a
--- /dev/null
+++ b/src/styles/themes/gold.js
@@ -0,0 +1,59 @@
+/**
+ * 金色年华主题
+ */
+
+export const goldTheme = {
+ id: 'gold',
+ name: '金色年华',
+ colors: {
+ // 背景色
+ '--bg-primary': '#fffbf1',
+ '--bg-card': 'rgba(255, 255, 255, 0.9)',
+ '--bg-secondary': 'rgba(255, 251, 241, 0.85)',
+ '--bg-overlay': 'rgba(255, 251, 241, 0.95)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#fefce8',
+ '--bg-gradient-2': '#fef3c7',
+ '--bg-gradient-3': '#fde68a',
+ '--bg-gradient-4': '#fcd34d',
+
+ // 主题色
+ '--primary-color': '#d97706',
+ '--primary-color-hover': '#b45309',
+ '--primary-color-active': '#92400e',
+ '--primary-color-pressed': '#78350f',
+
+ // 文字颜色
+ '--text-primary': '#451a03',
+ '--text-secondary': 'rgba(69, 26, 3, 0.8)',
+ '--text-tertiary': 'rgba(69, 26, 3, 0.6)',
+ '--text-disabled': 'rgba(69, 26, 3, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(69, 26, 3, 0.2)',
+ '--border-lighter': 'rgba(69, 26, 3, 0.1)',
+ '--border-card': 'rgba(69, 26, 3, 0.15)',
+ '--border-strong': 'rgba(69, 26, 3, 0.3)',
+
+ // 状态颜色
+ '--success-color': '#4CAF50',
+ '--warning-color': '#f59e0b',
+ '--error-color': '#ef4444',
+ '--info-color': '#3182ce',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(217, 119, 6, 0.15)',
+ '--glow-color': 'rgba(217, 119, 6, 0.4)',
+ '--overlay-dark': 'rgba(69, 26, 3, 0.6)',
+ '--overlay-light': 'rgba(255, 251, 241, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const goldThemeCompat = {
+ '--accent-red': '#d97706',
+ '--accent-red-hover': '#b45309',
+ '--shadow-card': '0 8px 25px rgba(217, 119, 6, 0.15)',
+ '--shadow-button': '0 4px 12px rgba(217, 119, 6, 0.4)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/gray.js b/src/styles/themes/gray.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f2b90f23f83edb64f5bbe2ba6a71decf06b9043
--- /dev/null
+++ b/src/styles/themes/gray.js
@@ -0,0 +1,59 @@
+/**
+ * 灰色空间主题
+ */
+
+export const grayTheme = {
+ id: 'gray',
+ name: '灰色空间',
+ colors: {
+ // 背景色
+ '--bg-primary': '#f8fafc',
+ '--bg-card': 'rgba(255, 255, 255, 0.9)',
+ '--bg-secondary': 'rgba(248, 250, 252, 0.85)',
+ '--bg-overlay': 'rgba(248, 250, 252, 0.95)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#f1f5f9',
+ '--bg-gradient-2': '#e2e8f0',
+ '--bg-gradient-3': '#cbd5e1',
+ '--bg-gradient-4': '#94a3b8',
+
+ // 主题色
+ '--primary-color': '#475569',
+ '--primary-color-hover': '#334155',
+ '--primary-color-active': '#1e293b',
+ '--primary-color-pressed': '#0f172a',
+
+ // 文字颜色
+ '--text-primary': '#0f172a',
+ '--text-secondary': 'rgba(15, 23, 42, 0.8)',
+ '--text-tertiary': 'rgba(15, 23, 42, 0.6)',
+ '--text-disabled': 'rgba(15, 23, 42, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(15, 23, 42, 0.2)',
+ '--border-lighter': 'rgba(15, 23, 42, 0.1)',
+ '--border-card': 'rgba(15, 23, 42, 0.15)',
+ '--border-strong': 'rgba(15, 23, 42, 0.3)',
+
+ // 状态颜色
+ '--success-color': '#4CAF50',
+ '--warning-color': '#ed8936',
+ '--error-color': '#ef4444',
+ '--info-color': '#3182ce',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(71, 85, 105, 0.15)',
+ '--glow-color': 'rgba(71, 85, 105, 0.4)',
+ '--overlay-dark': 'rgba(15, 23, 42, 0.6)',
+ '--overlay-light': 'rgba(248, 250, 252, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const grayThemeCompat = {
+ '--accent-red': '#475569',
+ '--accent-red-hover': '#334155',
+ '--shadow-card': '0 8px 25px rgba(71, 85, 105, 0.15)',
+ '--shadow-button': '0 4px 12px rgba(71, 85, 105, 0.4)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/green.js b/src/styles/themes/green.js
new file mode 100644
index 0000000000000000000000000000000000000000..d69b00262581fc7096a5629a65cdd0f0442ed79b
--- /dev/null
+++ b/src/styles/themes/green.js
@@ -0,0 +1,59 @@
+/**
+ * 绿色心情主题 - 微信绿色系
+ */
+
+export const greenTheme = {
+ id: 'green',
+ name: '绿色心情',
+ colors: {
+ // 背景色
+ '--bg-primary': '#f7f7f7',
+ '--bg-card': 'rgba(255, 255, 255, 0.95)',
+ '--bg-secondary': 'rgba(255, 255, 255, 0.9)',
+ '--bg-overlay': 'rgba(255, 255, 255, 0.98)',
+
+ // 渐变背景 - 微信绿色系
+ '--bg-gradient-1': '#e8f4f1',
+ '--bg-gradient-2': '#d4f1e2',
+ '--bg-gradient-3': '#a3e3c4',
+ '--bg-gradient-4': '#7dd3a0',
+
+ // 主题色 - 微信绿色
+ '--primary-color': '#07c160',
+ '--primary-color-hover': '#06ad56',
+ '--primary-color-active': '#059a4c',
+ '--primary-color-pressed': '#048642',
+
+ // 文字颜色
+ '--text-primary': '#1f2328',
+ '--text-secondary': 'rgba(31, 35, 40, 0.75)',
+ '--text-tertiary': 'rgba(31, 35, 40, 0.6)',
+ '--text-disabled': 'rgba(31, 35, 40, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(31, 35, 40, 0.15)',
+ '--border-lighter': 'rgba(31, 35, 40, 0.08)',
+ '--border-card': 'rgba(31, 35, 40, 0.12)',
+ '--border-strong': 'rgba(31, 35, 40, 0.25)',
+
+ // 状态颜色
+ '--success-color': '#07c160',
+ '--warning-color': '#faad14',
+ '--error-color': '#ff4d4f',
+ '--info-color': '#1890ff',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(7, 193, 96, 0.15)',
+ '--glow-color': 'rgba(7, 193, 96, 0.4)',
+ '--overlay-dark': 'rgba(31, 35, 40, 0.6)',
+ '--overlay-light': 'rgba(255, 255, 255, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const greenThemeCompat = {
+ '--accent-red': '#07c160',
+ '--accent-red-hover': '#06ad56',
+ '--shadow-card': '0 8px 25px rgba(7, 193, 96, 0.15)',
+ '--shadow-button': '0 4px 12px rgba(7, 193, 96, 0.4)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/index.js b/src/styles/themes/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..d682d9b936f5136dad7fe1999b685aeb9ab250f1
--- /dev/null
+++ b/src/styles/themes/index.js
@@ -0,0 +1,166 @@
+/**
+ * 主题管理器
+ * 统一管理所有主题的加载、切换和应用
+ */
+
+import { lightTheme, lightThemeCompat } from './light.js'
+import { darkTheme, darkThemeCompat } from './dark.js'
+import { orangeTheme, orangeThemeCompat } from './orange.js'
+import { pinkTheme, pinkThemeCompat } from './pink.js'
+import { purpleTheme, purpleThemeCompat } from './purple.js'
+import { blueTheme, blueThemeCompat } from './blue.js'
+import { greenTheme, greenThemeCompat } from './green.js'
+import { goldTheme, goldThemeCompat } from './gold.js'
+import { grayTheme, grayThemeCompat } from './gray.js'
+import { defaultStyles } from './base.js'
+
+// 所有可用主题
+export const availableThemes = [
+ lightTheme,
+ darkTheme,
+ orangeTheme,
+ pinkTheme,
+ purpleTheme,
+ blueTheme,
+ greenTheme,
+ goldTheme,
+ grayTheme
+]
+
+// 兼容性映射
+const themeCompatMap = {
+ light: lightThemeCompat,
+ dark: darkThemeCompat,
+ orange: orangeThemeCompat,
+ pink: pinkThemeCompat,
+ purple: purpleThemeCompat,
+ blue: blueThemeCompat,
+ green: greenThemeCompat,
+ gold: goldThemeCompat,
+ gray: grayThemeCompat
+}
+
+export class ThemeManager {
+ constructor() {
+ this.currentTheme = 'light'
+ this.rootElement = document.documentElement
+ }
+
+ /**
+ * 获取所有主题列表
+ */
+ getAllThemes() {
+ return availableThemes.map(theme => ({
+ id: theme.id,
+ name: theme.name
+ }))
+ }
+
+ /**
+ * 根据ID获取主题
+ */
+ getTheme(themeId) {
+ return availableThemes.find(theme => theme.id === themeId)
+ }
+
+ /**
+ * 应用主题
+ */
+ applyTheme(themeId) {
+ const theme = this.getTheme(themeId)
+ if (!theme) {
+ console.warn(`主题 ${themeId} 不存在,使用默认主题`)
+ return this.applyTheme('light')
+ }
+
+ // 设置 data-theme 属性
+ this.rootElement.setAttribute('data-theme', themeId)
+
+ // 应用新的CSS变量
+ Object.entries(theme.colors).forEach(([key, value]) => {
+ this.rootElement.style.setProperty(key, value)
+ })
+
+ // 应用兼容性CSS变量
+ const compatVars = themeCompatMap[themeId]
+ if (compatVars) {
+ Object.entries(compatVars).forEach(([key, value]) => {
+ this.rootElement.style.setProperty(key, value)
+ })
+ }
+
+ // 应用默认样式(如果还没应用过)
+ this.applyDefaultStyles()
+
+ this.currentTheme = themeId
+ console.log(`已切换到主题: ${theme.name}`)
+ }
+
+ /**
+ * 应用默认样式(尺寸、圆角等)
+ */
+ applyDefaultStyles() {
+ // 应用组件尺寸
+ Object.entries(defaultStyles.sizes).forEach(([key, value]) => {
+ this.rootElement.style.setProperty(`--${key}`, value)
+ })
+
+ // 应用圆角
+ Object.entries(defaultStyles.radius).forEach(([key, value]) => {
+ this.rootElement.style.setProperty(`--${key}`, value)
+ })
+
+ // 应用动画
+ Object.entries(defaultStyles.transitions).forEach(([key, value]) => {
+ this.rootElement.style.setProperty(`--${key}`, value)
+ })
+ }
+
+ /**
+ * 获取当前主题ID
+ */
+ getCurrentTheme() {
+ return this.currentTheme
+ }
+
+ /**
+ * 获取当前主题信息
+ */
+ getCurrentThemeInfo() {
+ return this.getTheme(this.currentTheme)
+ }
+
+ /**
+ * 初始化主题系统
+ */
+ init(initialThemeId = 'light') {
+ this.applyDefaultStyles()
+ this.applyTheme(initialThemeId)
+ }
+
+ /**
+ * 预加载所有主题的CSS变量(用于主题预览)
+ */
+ preloadThemes() {
+ availableThemes.forEach(theme => {
+ // 可以在这里实现主题预加载逻辑
+ console.log(`预加载主题: ${theme.name}`)
+ })
+ }
+}
+
+// 创建全局主题管理器实例
+export const themeManager = new ThemeManager()
+
+// 导出主题常量
+export const THEME_IDS = {
+ LIGHT: 'light',
+ DARK: 'dark',
+ ORANGE: 'orange',
+ PINK: 'pink',
+ PURPLE: 'purple',
+ BLUE: 'blue',
+ GREEN: 'green',
+ GOLD: 'gold',
+ GRAY: 'gray'
+}
\ No newline at end of file
diff --git a/src/styles/themes/light.js b/src/styles/themes/light.js
new file mode 100644
index 0000000000000000000000000000000000000000..74ecf2fe7a78ca1d8ad7b186e5eb9e76d607e57f
--- /dev/null
+++ b/src/styles/themes/light.js
@@ -0,0 +1,59 @@
+/**
+ * 白色炫彩主题
+ */
+
+export const lightTheme = {
+ id: 'light',
+ name: '白色炫彩',
+ colors: {
+ // 背景色
+ '--bg-primary': '#f8f9fa',
+ '--bg-card': 'rgba(255, 255, 255, 0.9)',
+ '--bg-secondary': 'rgba(255, 255, 255, 0.85)',
+ '--bg-overlay': 'rgba(255, 255, 255, 0.95)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#e3f2fd',
+ '--bg-gradient-2': '#f3e5f5',
+ '--bg-gradient-3': '#fff3e0',
+ '--bg-gradient-4': '#e8f5e8',
+
+ // 主题色
+ '--primary-color': '#ff6b6b',
+ '--primary-color-hover': '#ff5252',
+ '--primary-color-active': '#ff4444',
+ '--primary-color-pressed': '#ff3333',
+
+ // 文字颜色
+ '--text-primary': '#2c3e50',
+ '--text-secondary': 'rgba(44, 62, 80, 0.8)',
+ '--text-tertiary': 'rgba(44, 62, 80, 0.6)',
+ '--text-disabled': 'rgba(44, 62, 80, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(44, 62, 80, 0.2)',
+ '--border-lighter': 'rgba(44, 62, 80, 0.1)',
+ '--border-card': 'rgba(44, 62, 80, 0.15)',
+ '--border-strong': 'rgba(44, 62, 80, 0.3)',
+
+ // 状态颜色
+ '--success-color': '#4CAF50',
+ '--warning-color': '#ed8936',
+ '--error-color': '#ff4444',
+ '--info-color': '#3182ce',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(0, 0, 0, 0.12)',
+ '--glow-color': 'rgba(255, 107, 107, 0.35)',
+ '--overlay-dark': 'rgba(0, 0, 0, 0.6)',
+ '--overlay-light': 'rgba(255, 255, 255, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const lightThemeCompat = {
+ '--accent-red': '#ff6b6b',
+ '--accent-red-hover': '#ff5252',
+ '--shadow-card': '0 8px 25px rgba(0, 0, 0, 0.12)',
+ '--shadow-button': '0 4px 12px rgba(255, 107, 107, 0.35)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/orange.js b/src/styles/themes/orange.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc024293742790fe66b1be0b57869f29e477c721
--- /dev/null
+++ b/src/styles/themes/orange.js
@@ -0,0 +1,59 @@
+/**
+ * 橘子人生主题
+ */
+
+export const orangeTheme = {
+ id: 'orange',
+ name: '橘子人生',
+ colors: {
+ // 背景色
+ '--bg-primary': '#fef7f0',
+ '--bg-card': 'rgba(255, 255, 255, 0.9)',
+ '--bg-secondary': 'rgba(255, 248, 240, 0.85)',
+ '--bg-overlay': 'rgba(255, 248, 240, 0.95)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#fff7ed',
+ '--bg-gradient-2': '#fed7aa',
+ '--bg-gradient-3': '#fdba74',
+ '--bg-gradient-4': '#fb923c',
+
+ // 主题色
+ '--primary-color': '#ff9500',
+ '--primary-color-hover': '#ff8a00',
+ '--primary-color-active': '#e6850e',
+ '--primary-color-pressed': '#cc7a00',
+
+ // 文字颜色
+ '--text-primary': '#431407',
+ '--text-secondary': 'rgba(67, 20, 7, 0.8)',
+ '--text-tertiary': 'rgba(67, 20, 7, 0.6)',
+ '--text-disabled': 'rgba(67, 20, 7, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(67, 20, 7, 0.2)',
+ '--border-lighter': 'rgba(67, 20, 7, 0.1)',
+ '--border-card': 'rgba(67, 20, 7, 0.15)',
+ '--border-strong': 'rgba(67, 20, 7, 0.3)',
+
+ // 状态颜色
+ '--success-color': '#4CAF50',
+ '--warning-color': '#fbbf24',
+ '--error-color': '#ef4444',
+ '--info-color': '#3182ce',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(255, 149, 0, 0.15)',
+ '--glow-color': 'rgba(255, 149, 0, 0.4)',
+ '--overlay-dark': 'rgba(67, 20, 7, 0.6)',
+ '--overlay-light': 'rgba(255, 248, 240, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const orangeThemeCompat = {
+ '--accent-red': '#ff9500',
+ '--accent-red-hover': '#ff8a00',
+ '--shadow-card': '0 8px 25px rgba(255, 149, 0, 0.15)',
+ '--shadow-button': '0 4px 12px rgba(255, 149, 0, 0.4)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/pink.js b/src/styles/themes/pink.js
new file mode 100644
index 0000000000000000000000000000000000000000..6531dfc88951c7c39afee6ad34ea6e94fbfb7975
--- /dev/null
+++ b/src/styles/themes/pink.js
@@ -0,0 +1,59 @@
+/**
+ * 粉红女郎主题
+ */
+
+export const pinkTheme = {
+ id: 'pink',
+ name: '粉红女郎',
+ colors: {
+ // 背景色
+ '--bg-primary': '#fdf2f8',
+ '--bg-card': 'rgba(255, 255, 255, 0.9)',
+ '--bg-secondary': 'rgba(253, 242, 248, 0.85)',
+ '--bg-overlay': 'rgba(253, 242, 248, 0.95)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#fce7f3',
+ '--bg-gradient-2': '#fbcfe8',
+ '--bg-gradient-3': '#f9a8d4',
+ '--bg-gradient-4': '#f472b6',
+
+ // 主题色
+ '--primary-color': '#ec4899',
+ '--primary-color-hover': '#db2777',
+ '--primary-color-active': '#be185d',
+ '--primary-color-pressed': '#9d174d',
+
+ // 文字颜色
+ '--text-primary': '#500724',
+ '--text-secondary': 'rgba(80, 7, 36, 0.8)',
+ '--text-tertiary': 'rgba(80, 7, 36, 0.6)',
+ '--text-disabled': 'rgba(80, 7, 36, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(80, 7, 36, 0.2)',
+ '--border-lighter': 'rgba(80, 7, 36, 0.1)',
+ '--border-card': 'rgba(80, 7, 36, 0.15)',
+ '--border-strong': 'rgba(80, 7, 36, 0.3)',
+
+ // 状态颜色
+ '--success-color': '#4CAF50',
+ '--warning-color': '#ed8936',
+ '--error-color': '#ef4444',
+ '--info-color': '#3182ce',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(236, 72, 153, 0.15)',
+ '--glow-color': 'rgba(236, 72, 153, 0.4)',
+ '--overlay-dark': 'rgba(80, 7, 36, 0.6)',
+ '--overlay-light': 'rgba(253, 242, 248, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const pinkThemeCompat = {
+ '--accent-red': '#ec4899',
+ '--accent-red-hover': '#db2777',
+ '--shadow-card': '0 8px 25px rgba(236, 72, 153, 0.15)',
+ '--shadow-button': '0 4px 12px rgba(236, 72, 153, 0.4)'
+}
\ No newline at end of file
diff --git a/src/styles/themes/purple.js b/src/styles/themes/purple.js
new file mode 100644
index 0000000000000000000000000000000000000000..6deaa8c7cf9d2742d7ba02ae5eacd580123a4050
--- /dev/null
+++ b/src/styles/themes/purple.js
@@ -0,0 +1,59 @@
+/**
+ * 紫色韵味主题
+ */
+
+export const purpleTheme = {
+ id: 'purple',
+ name: '紫色韵味',
+ colors: {
+ // 背景色
+ '--bg-primary': '#f8fafc',
+ '--bg-card': 'rgba(255, 255, 255, 0.9)',
+ '--bg-secondary': 'rgba(248, 250, 252, 0.85)',
+ '--bg-overlay': 'rgba(248, 250, 252, 0.95)',
+
+ // 渐变背景
+ '--bg-gradient-1': '#f3e8ff',
+ '--bg-gradient-2': '#e9d5ff',
+ '--bg-gradient-3': '#d8b4fe',
+ '--bg-gradient-4': '#c084fc',
+
+ // 主题色
+ '--primary-color': '#9333ea',
+ '--primary-color-hover': '#7c3aed',
+ '--primary-color-active': '#6d28d9',
+ '--primary-color-pressed': '#5b21b6',
+
+ // 文字颜色
+ '--text-primary': '#3c1361',
+ '--text-secondary': 'rgba(60, 19, 97, 0.8)',
+ '--text-tertiary': 'rgba(60, 19, 97, 0.6)',
+ '--text-disabled': 'rgba(60, 19, 97, 0.5)',
+
+ // 边框
+ '--border-light': 'rgba(60, 19, 97, 0.2)',
+ '--border-lighter': 'rgba(60, 19, 97, 0.1)',
+ '--border-card': 'rgba(60, 19, 97, 0.15)',
+ '--border-strong': 'rgba(60, 19, 97, 0.3)',
+
+ // 状态颜色
+ '--success-color': '#4CAF50',
+ '--warning-color': '#ed8936',
+ '--error-color': '#ef4444',
+ '--info-color': '#3182ce',
+
+ // 特殊效果
+ '--shadow-color': 'rgba(147, 51, 234, 0.15)',
+ '--glow-color': 'rgba(147, 51, 234, 0.4)',
+ '--overlay-dark': 'rgba(60, 19, 97, 0.6)',
+ '--overlay-light': 'rgba(248, 250, 252, 0.1)'
+ }
+}
+
+// 为兼容性保留原有变量名
+export const purpleThemeCompat = {
+ '--accent-red': '#9333ea',
+ '--accent-red-hover': '#7c3aed',
+ '--shadow-card': '0 8px 25px rgba(147, 51, 234, 0.15)',
+ '--shadow-button': '0 4px 12px rgba(147, 51, 234, 0.4)'
+}
\ No newline at end of file
diff --git a/src/utils/imageCache.js b/src/utils/imageCache.js
new file mode 100644
index 0000000000000000000000000000000000000000..a48d99014b7ab0be50b387b1f6c7a658bf3ee4e1
--- /dev/null
+++ b/src/utils/imageCache.js
@@ -0,0 +1,269 @@
+// 图像缓存管理器 - 解决跨域问题并实现本地缓存
+class ImageCacheManager {
+ constructor() {
+ this.cache = new Map()
+ this.cacheName = 'music-images-v1'
+ this.maxCacheSize = 100 // 最多缓存100张图片
+ this.cacheExpiry = 7 * 24 * 60 * 60 * 1000 // 7天过期
+ this.init()
+ }
+
+ async init() {
+ // 清理过期的缓存
+ await this.cleanupExpiredCache()
+ }
+
+ // 获取图片的缓存键
+ getCacheKey(url) {
+ return `img_${this.hashUrl(url)}`
+ }
+
+ // 简单的URL哈希函数
+ hashUrl(url) {
+ let hash = 0
+ for (let i = 0; i < url.length; i++) {
+ const char = url.charCodeAt(i)
+ hash = ((hash << 5) - hash) + char
+ hash = hash & hash // 转换为32位整数
+ }
+ return Math.abs(hash).toString(36)
+ }
+
+ // 将图片转换为base64并缓存 - 改进跨域处理
+ async cacheImage(url, metadata = {}) {
+ try {
+ // 检查URL是否为空或无效
+ if (!url || typeof url !== 'string') {
+ return this.getDefaultImage()
+ }
+
+ const cacheKey = this.getCacheKey(url)
+
+ // 检查内存缓存
+ if (this.cache.has(cacheKey)) {
+ return this.cache.get(cacheKey).dataUrl
+ }
+
+ // 检查localStorage缓存
+ const cached = localStorage.getItem(cacheKey)
+ if (cached) {
+ try {
+ const cachedData = JSON.parse(cached)
+ if (Date.now() - cachedData.timestamp < this.cacheExpiry) {
+ this.cache.set(cacheKey, cachedData)
+ return cachedData.dataUrl
+ }
+ } catch (e) {
+ // 缓存数据损坏,删除
+ localStorage.removeItem(cacheKey)
+ }
+ }
+
+ // 直接使用原始URL,不使用代理
+ let finalUrl = url
+
+ // 使用Canvas方式转换图片
+ const dataUrl = await this.convertToDataUrl(finalUrl)
+
+ // 保存到缓存
+ const cacheData = {
+ dataUrl,
+ timestamp: Date.now(),
+ originalUrl: url,
+ metadata
+ }
+
+ this.cache.set(cacheKey, cacheData)
+
+ // 保存到localStorage
+ try {
+ if (this.cache.size <= this.maxCacheSize) {
+ localStorage.setItem(cacheKey, JSON.stringify(cacheData))
+ }
+ } catch (e) {
+ // localStorage空间不足,清理一些旧缓存
+ await this.cleanupOldCache()
+ try {
+ localStorage.setItem(cacheKey, JSON.stringify(cacheData))
+ } catch (e) {
+ console.warn('无法保存图片到localStorage:', e)
+ }
+ }
+
+ return dataUrl
+ } catch (error) {
+ console.error('缓存图片失败:', error)
+ return this.getDefaultImage()
+ }
+ }
+
+ // 检查是否为跨域URL
+ isCrossOrigin(url) {
+ try {
+ const urlObj = new URL(url, window.location.href)
+ return urlObj.origin !== window.location.origin
+ } catch (e) {
+ // 如果URL解析失败,假设为跨域
+ return true
+ }
+ }
+
+
+ // 将图片转换为DataUrl
+ async convertToDataUrl(url) {
+ return new Promise((resolve, reject) => {
+ const img = new Image()
+ img.crossOrigin = 'anonymous'
+
+ img.onload = () => {
+ try {
+ const canvas = document.createElement('canvas')
+ const ctx = canvas.getContext('2d')
+
+ canvas.width = img.naturalWidth
+ canvas.height = img.naturalHeight
+
+ ctx.drawImage(img, 0, 0)
+ const result = canvas.toDataURL('image/jpeg', 0.8)
+ resolve(result)
+ } catch (error) {
+ console.warn('Canvas转换失败,使用原始URL:', error)
+ resolve(url)
+ }
+ }
+
+ img.onerror = () => {
+ console.warn('图片加载失败,使用默认图片')
+ resolve(this.getDefaultImage())
+ }
+
+ // 设置超时
+ setTimeout(() => {
+ console.warn('图片加载超时,使用默认图片')
+ resolve(this.getDefaultImage())
+ }, 10000)
+
+ img.src = url
+ })
+ }
+
+ // 获取默认图片
+ getDefaultImage() {
+ return 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDMwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjMwMCIgaGVpZ2h0PSIzMDAiIHJ4PSIxMiIgZmlsbD0iIzE4MTgxOCIvPjxwYXRoIGQ9Ik0xODcgMTUwQzE4NyAxNzEuNTM5IDE2OS41MzkgMTg5IDE0OCAxODlDMTI2LjQ2MSAxODkgMTA5IDE3MS41MzkgMTA5IDE1MEMxMDkgMTI4LjQ2MSAxMjYuNDYxIDExMSAxNDggMTExQzE2OS41MzkgMTExIDE4NyAxMjguNDYxIDE4NyAxNTBaIiBzdHJva2U9IiM2NjY2NjYiIHN0cm9rZS13aWR0aD0iNiIvPjxjaXJjbGUgY3g9IjE0OCIgY3k9IjE1MCIgcj0iNiIgZmlsbD0iIzY2NjY2NiIvPjwvc3ZnPgo='
+ }
+
+ // 获取缓存的图片
+ async getCachedImage(url) {
+ const cacheKey = this.getCacheKey(url)
+
+ // 检查内存缓存
+ if (this.cache.has(cacheKey)) {
+ return this.cache.get(cacheKey).dataUrl
+ }
+
+ // 检查localStorage缓存
+ const cached = localStorage.getItem(cacheKey)
+ if (cached) {
+ try {
+ const cachedData = JSON.parse(cached)
+ if (Date.now() - cachedData.timestamp < this.cacheExpiry) {
+ this.cache.set(cacheKey, cachedData)
+ return cachedData.dataUrl
+ } else {
+ // 缓存过期,删除
+ localStorage.removeItem(cacheKey)
+ }
+ } catch (e) {
+ localStorage.removeItem(cacheKey)
+ }
+ }
+
+ return null
+ }
+
+ // 预加载图片
+ async preloadImage(url, metadata = {}) {
+ return this.cacheImage(url, metadata)
+ }
+
+ // 清理过期缓存
+ async cleanupExpiredCache() {
+ const keys = Object.keys(localStorage)
+ const now = Date.now()
+
+ keys.forEach(key => {
+ if (key.startsWith('img_')) {
+ try {
+ const cached = JSON.parse(localStorage.getItem(key))
+ if (now - cached.timestamp > this.cacheExpiry) {
+ localStorage.removeItem(key)
+ }
+ } catch (e) {
+ localStorage.removeItem(key)
+ }
+ }
+ })
+ }
+
+ // 清理旧缓存(释放空间)
+ async cleanupOldCache() {
+ const keys = Object.keys(localStorage)
+ const imageKeys = keys.filter(key => key.startsWith('img_'))
+
+ // 按时间戳排序,删除最旧的一半
+ const cached = imageKeys.map(key => {
+ try {
+ const data = JSON.parse(localStorage.getItem(key))
+ return { key, timestamp: data.timestamp }
+ } catch (e) {
+ return { key, timestamp: 0 }
+ }
+ }).sort((a, b) => a.timestamp - b.timestamp)
+
+ const toDelete = cached.slice(0, Math.floor(cached.length / 2))
+ toDelete.forEach(item => {
+ localStorage.removeItem(item.key)
+ this.cache.delete(item.key)
+ })
+ }
+
+ // 清空所有缓存
+ async clearCache() {
+ const keys = Object.keys(localStorage)
+ keys.forEach(key => {
+ if (key.startsWith('img_')) {
+ localStorage.removeItem(key)
+ }
+ })
+ this.cache.clear()
+ }
+
+ // 获取缓存统计信息
+ getCacheStats() {
+ const keys = Object.keys(localStorage)
+ const imageKeys = keys.filter(key => key.startsWith('img_'))
+ let totalSize = 0
+
+ imageKeys.forEach(key => {
+ totalSize += localStorage.getItem(key).length
+ })
+
+ return {
+ totalImages: imageKeys.length,
+ memoryCache: this.cache.size,
+ totalSize: (totalSize / 1024 / 1024).toFixed(2) + 'MB'
+ }
+ }
+}
+
+// 创建全局实例
+export const imageCacheManager = new ImageCacheManager()
+
+// 导出便捷方法
+export const cacheImage = (url, metadata) => imageCacheManager.cacheImage(url, metadata)
+export const getCachedImage = (url) => imageCacheManager.getCachedImage(url)
+export const preloadImage = (url, metadata) => imageCacheManager.preloadImage(url, metadata)
+export const clearImageCache = () => imageCacheManager.clearCache()
+export const getImageCacheStats = () => imageCacheManager.getCacheStats()
+
+export default imageCacheManager
\ No newline at end of file
diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue
deleted file mode 100644
index 756ad2a17909837834858538422308120cf09dab..0000000000000000000000000000000000000000
--- a/src/views/AboutView.vue
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
This is an about page
-
-
-
-
diff --git a/src/views/FullPlayerPage.vue b/src/views/FullPlayerPage.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1be3e3590d0b27277dffdd701050d63546a5b9a6
--- /dev/null
+++ b/src/views/FullPlayerPage.vue
@@ -0,0 +1,1315 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ getCurrentLyric() || '暂无歌词' }}
+
+
+
+
+ {{ formattedArtist }}
+ -
+ {{ currentSong?.album || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ quality.name }}
+
{{ quality.description }}
+
+
+
+
{{ quality.size }}
+
+
+
+
+
+
+
+
+ 更高音质需要更多流量,请在WiFi环境下使用
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@keyframes slideUpPanel {
+ from {
+ transform: translateY(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
diff --git a/src/views/HomePage.vue b/src/views/HomePage.vue
new file mode 100644
index 0000000000000000000000000000000000000000..bf16b1a122bbe061dc4390376fe6a75e90dccdf0
--- /dev/null
+++ b/src/views/HomePage.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
deleted file mode 100644
index d5c0217e45ce8f933917195f236f1d118b317e86..0000000000000000000000000000000000000000
--- a/src/views/HomeView.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/views/MyMusicPage.vue b/src/views/MyMusicPage.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a399c0d67d054474bbacd09e5ecfdfeb70200bd4
--- /dev/null
+++ b/src/views/MyMusicPage.vue
@@ -0,0 +1,628 @@
+
+
+
+
+
+
+
+
+
{{ favoriteCount }}
+
收藏歌曲
+
+
+
+
{{ historyCount }}
+
播放历史
+
+
+
+
{{ totalPlayTime }}
+
累计时长
+
+
+
+
+
+
+
+
+ 我的收藏
+ {{ favoriteCount }}
+
+
+
+
+ 播放历史
+ {{ historyCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
还没有播放记录
+
播放过的歌曲会在这里显示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/SettingsPage.vue b/src/views/SettingsPage.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f347bf5d6625641462537c3bdc97f76fdde1ae2b
--- /dev/null
+++ b/src/views/SettingsPage.vue
@@ -0,0 +1,1260 @@
+
+
+
+
+
+
+
+
+
+
+
+ 播放设置
+
+
+
+
+
+
+
+ {{ quality.label }}
+
+
+
+ {{ getQualityText(settings.defaultQuality) }}
+
+
+
+
+
+
+
默认播放模式
+
应用启动时的默认播放模式
+
+
+ 列表循环
+ 单曲循环
+ 随机播放
+
+
+ {{ getPlayModeText(settings.defaultPlayMode) }}
+
+
+
+
+
+
+
自动播放下一首
+
当前歌曲结束后自动播放下一首
+
+
+
+
+
+
+
+
+
+
淡入淡出效果
+
歌曲切换时的淡入淡出效果
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索设置
+
+
+
+
+
+
+ {{ source.label }}
+
+
+
+ {{ getSourceText(settings.defaultSource) }}
+
+
+
+
+
+
+
+ 20首
+ 30首
+ 50首
+
+
+ {{ settings.searchLimit }}首
+
+
+
+
+
+
+
+
+
+
+
+
+ 外观设置
+
+
+
+
+
+
+ {{ theme.label }}
+
+
+
+ {{ getThemeText(settings.theme) }}
+
+
+
+
+
+
+
主题色
+
自定义应用的主色调(现在由主题自动管理)
+
+
+
+
+
+
+
+
+
+
+ {{ settings.lyricsFontSize }}px
+
+
+
+
+
+
+
+
+ 通知设置
+
+
+
+
+
+
+
媒体控制
+
系统媒体控制集成 (锁屏控制)
+
+
+
+
+
+
+
+
+
+
+
+
+ 存储管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于
+
+
+
+
+
+
+
+
云音乐 PWA
+
版本 {{ appVersion }}
+
基于 Vue 3 构建的渐进式音乐应用
+
+
+
+
+
+
+
+ {{ checkingUpdate ? '检查中...' : '检查更新' }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tsconfig.app.json b/tsconfig.app.json
deleted file mode 100644
index 913b8f279fca6f23c1b6532660583d2ec4ccebab..0000000000000000000000000000000000000000
--- a/tsconfig.app.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "extends": "@vue/tsconfig/tsconfig.dom.json",
- "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
- "exclude": ["src/**/__tests__/*"],
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
-
- "paths": {
- "@/*": ["./src/*"]
- }
- }
-}
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index 66b5e5703e83c352671ce094731e9e861ada6924..0000000000000000000000000000000000000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "files": [],
- "references": [
- {
- "path": "./tsconfig.node.json"
- },
- {
- "path": "./tsconfig.app.json"
- }
- ]
-}
diff --git a/tsconfig.node.json b/tsconfig.node.json
deleted file mode 100644
index a83dfc9d48fbd0875fb6c33ac2c7bccd5a311be2..0000000000000000000000000000000000000000
--- a/tsconfig.node.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "extends": "@tsconfig/node22/tsconfig.json",
- "include": [
- "vite.config.*",
- "vitest.config.*",
- "cypress.config.*",
- "nightwatch.conf.*",
- "playwright.config.*",
- "eslint.config.*"
- ],
- "compilerOptions": {
- "noEmit": true,
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
-
- "module": "ESNext",
- "moduleResolution": "Bundler",
- "types": ["node"]
- }
-}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..869582c92054fe229e7ffb11902f6e8d7e53c833
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,97 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import { VitePWA } from 'vite-plugin-pwa'
+import { resolve } from 'path'
+
+export default defineConfig({
+ base: '/music/',
+ plugins: [
+ vue(),
+ VitePWA({
+ registerType: 'autoUpdate',
+ includeAssets: ['favicon.svg', 'icons/apple-touch-icon.svg'],
+ manifest: {
+ name: '云音乐PWA',
+ short_name: '云音乐',
+ description: '基于Vue3的PWA音乐播放器,网易云音乐风格',
+ theme_color: '#ff6b6b',
+ background_color: '#0c0c0c',
+ display: 'standalone',
+ orientation: 'portrait-primary',
+ start_url: './',
+ scope: './',
+ icons: [
+ {
+ src: 'icons/icon-72x72.svg',
+ sizes: '72x72',
+ type: 'image/svg+xml'
+ },
+ {
+ src: 'icons/icon-96x96.svg',
+ sizes: '96x96',
+ type: 'image/svg+xml'
+ },
+ {
+ src: 'icons/icon-128x128.svg',
+ sizes: '128x128',
+ type: 'image/svg+xml'
+ },
+ {
+ src: 'icons/icon-192x192.svg',
+ sizes: '192x192',
+ type: 'image/svg+xml',
+ purpose: 'any maskable'
+ },
+ {
+ src: 'icons/icon-512x512.svg',
+ sizes: '512x512',
+ type: 'image/svg+xml'
+ }
+ ]
+ },
+ workbox: {
+ globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
+ runtimeCaching: [
+ {
+ urlPattern: /^https:\/\/music-api\.gdstudio\.xyz\/.*$/,
+ handler: 'NetworkFirst',
+ options: {
+ cacheName: 'music-api-cache',
+ expiration: {
+ maxEntries: 100,
+ maxAgeSeconds: 60 * 60 * 24 // 24小时
+ }
+ }
+ }
+ ]
+ }
+ })
+ ],
+ resolve: {
+ alias: {
+ '@': resolve(__dirname, 'src')
+ }
+ },
+ server: {
+ port: 3000,
+ open: true,
+ cors: true,
+ // 禁用对模块请求的history fallback
+ middlewareMode: false,
+ fs: {
+ strict: true,
+ allow: ['..']
+ }
+ },
+ build: {
+ target: 'es2015',
+ rollupOptions: {
+ output: {
+ manualChunks: {
+ 'vue-vendor': ['vue', 'vue-router', 'pinia'],
+ 'vueuse': ['@vueuse/core']
+ }
+ }
+ }
+ }
+})
diff --git a/vite.config.ts b/vite.config.ts
deleted file mode 100644
index 4217010a3178372181948ce34c4d5045dfa18325..0000000000000000000000000000000000000000
--- a/vite.config.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { fileURLToPath, URL } from 'node:url'
-
-import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueDevTools from 'vite-plugin-vue-devtools'
-
-// https://vite.dev/config/
-export default defineConfig({
- plugins: [
- vue(),
- vueDevTools(),
- ],
- resolve: {
- alias: {
- '@': fileURLToPath(new URL('./src', import.meta.url))
- },
- },
-})
diff --git "a/\351\234\200\346\261\202\346\226\207\346\241\243.md" "b/\351\234\200\346\261\202\346\226\207\346\241\243.md"
new file mode 100644
index 0000000000000000000000000000000000000000..4ed152d5d2973f36446f09e11eff19f9c1ae650e
--- /dev/null
+++ "b/\351\234\200\346\261\202\346\226\207\346\241\243.md"
@@ -0,0 +1,393 @@
+# Vue3 PWA手机音乐软件需求文档
+
+## 📱 页面结构需求(参考网易云音乐iOS端)
+
+### 主要页面结构
+**底部导航栏(TabBar):**
+- 首页(搜索和推荐)
+- 我的音乐(收藏歌曲)
+- 设置
+
+**页面层级:**
+- 底部导航栏(固定)
+- 底部播放条(固定,在导航栏上方)
+- 主内容区域(可滚动)
+- 全屏播放器(覆盖整个屏幕)
+
+**响应式布局:**
+- 手机端:底部导航+单栏内容
+- 平板端:侧边导航+两栏布局
+- 桌面端:侧边导航+三栏布局
+
+## 🏠 首页需求
+
+**顶部区域:**
+- 云音乐Logo
+- 搜索框(点击进入搜索页面)
+
+**主要内容:**
+- 搜索结果展示区域
+- 搜索历史
+- 热门推荐(可选)
+
+**搜索功能:**
+- 点击搜索框展开搜索界面
+- 音乐源选择(底部弹窗)
+- 瀑布流搜索结果
+- 实时搜索建议
+
+## 🎵 我的音乐页面需求
+
+**页面内容:**
+- 我喜欢的音乐(收藏歌曲列表)
+- 最近播放历史
+- 播放统计信息
+
+**收藏歌曲功能:**
+- 显示收藏的所有歌曲
+- 支持搜索收藏内容
+- 支持批量操作
+- 显示收藏时间
+
+**播放历史:**
+- 最近播放的歌曲列表
+- 播放次数统计
+- 清除历史记录功能
+
+## ⚙️ 设置页面需求
+
+**设置分组:**
+
+**播放设置:**
+- 默认音质:标准128K/较高192K/高音质320K/无损FLAC/Hi-Res(默认:320K)
+- 默认播放模式:列表循环/随机播放/单曲循环(默认:列表循环)
+- 记住播放进度:开启/关闭(默认:开启)
+
+**搜索设置:**
+- 默认音乐源:网易云音乐(默认)
+- 搜索历史:保存/不保存(默认:保存)
+
+**存储管理:**
+- 清除搜索历史
+- 清除播放历史
+- 清除收藏数据
+
+**应用信息:**
+- 版本号
+- 关于应用
+
+## 🔍 搜索功能详细需求
+
+**搜索界面:**
+- 返回按钮
+- 搜索输入框
+- 音乐源选择按钮(显示当前选择的源)
+- 搜索历史列表(可清除)
+- 热门搜索词(可选)
+
+**音乐源选择弹窗:**
+- 底部弹窗形式
+- 显示所有13个音乐源
+- 当前选择源高亮显示
+- 选择后自动关闭弹窗
+
+**搜索结果:**
+- 瀑布流加载(首次20条,滚动到15条时加载下页)
+- 歌曲信息:序号、歌名、歌手专辑、时长
+- 右侧爱心收藏按钮
+- 当前播放歌曲高亮显示
+
+## 🎤 底部播放条需求
+
+**显示位置:**
+- 位于底部导航栏正上方
+- 固定显示,不随页面滚动
+
+**显示条件:**
+- 有歌曲播放或暂停时显示
+- 页面刷新后根据本地存储恢复
+
+**界面元素:**
+- 左侧:小尺寸专辑封面
+- 中间:歌曲名和歌手名(单行显示,超出滚动)
+- 右侧:播放/暂停按钮
+
+**交互功能:**
+- 点击整个播放条打开全屏播放器
+- 点击播放按钮控制播放状态
+- 左右滑动切换歌曲
+- 上滑手势展开全屏播放器
+
+## 🎼 全屏播放器需求
+
+**网易云风格界面:**
+- 专辑封面作为模糊背景
+- 顶部状态栏适配
+- 返回按钮(左上角)
+- 更多操作按钮(右上角)
+
+**主要内容区域:**
+- 大尺寸圆形专辑封面(居中)
+- 播放时封面旋转动画
+- 歌曲信息(歌名、歌手、专辑)
+- 收藏按钮(爱心图标)
+
+**播放控制:**
+- 播放模式按钮(列表循环/随机/单曲循环)
+- 上一首按钮
+- 播放/暂停按钮(大尺寸,居中)
+- 下一首按钮
+- 播放列表按钮
+
+**进度和音质:**
+- 播放进度条(可拖拽)
+- 当前时间/总时长显示
+- 音质显示和选择
+
+**歌词区域:**
+- 底部歌词滚动显示
+- 当前歌词高亮
+- 支持点击歌词跳转
+- 可展开全屏歌词模式
+
+**关闭方式:**
+- 点击返回按钮
+- 下拉手势
+- 返回键(Android)
+
+## 📊 音乐平台优先级
+
+### 平台列表(按稳定性和资源丰富度排序)
+1. **netease** - 网易云音乐(默认)
+2. **tencent** - QQ音乐
+3. **kugou** - 酷狗音乐
+4. **kuwo** - 酷我音乐
+5. **migu** - 咪咕音乐
+6. **spotify** - Spotify
+7. **apple** - Apple Music
+8. **ytmusic** - YouTube Music
+9. **joox** - JOOX
+10. **tidal** - TIDAL
+11. **deezer** - Deezer
+12. **qobuz** - Qobuz
+13. **ximalaya** - 喜马拉雅FM
+
+### 平台选择逻辑
+- 默认使用网易云音乐
+- 用户可在设置中修改默认源
+- 搜索无结果时提示切换到其他平台
+- 记住用户最后使用的音乐源
+
+## 🎨 网易云音乐UI风格规范
+
+### iOS端特色设计
+- 底部安全区域适配
+- 半透明毛玻璃效果
+- 深色模式适配
+- 圆角卡片设计
+- 红色强调色系统
+
+### 色彩系统
+```css
+/* 背景色 */
+--bg-primary: #0c0c0c; /* 主背景 */
+--bg-card: rgba(255,255,255,0.05); /* 卡片背景 */
+--bg-overlay: rgba(0,0,0,0.8); /* 遮罩背景 */
+
+/* 强调色 */
+--accent-red: #ff6b6b; /* 网易红 */
+--accent-red-hover: #ff5252; /* 悬浮态 */
+
+/* 文字颜色 */
+--text-primary: #ffffff; /* 主要文字 */
+--text-secondary: rgba(255,255,255,0.7); /* 次要文字 */
+--text-disabled: rgba(255,255,255,0.4); /* 禁用文字 */
+```
+
+### 组件规范
+- 底部导航高度:49px + 安全区域
+- 播放条高度:64px
+- 列表项高度:64px
+- 按钮最小触摸区域:44x44px
+- 统一圆角:12px(小元素)、20px(卡片)
+
+## 🧩 组件化架构
+
+### 页面组件
+```
+src/views/
+├── HomePage.vue # 首页(搜索页面)
+├── MyMusicPage.vue # 我的音乐页面
+├── SettingsPage.vue # 设置页面
+└── FullPlayerPage.vue # 全屏播放器页面
+```
+
+### 布局组件
+```
+src/components/layout/
+├── AppTabBar.vue # 底部导航栏
+├── MiniPlayer.vue # 底部播放条
+├── SearchHeader.vue # 搜索头部
+└── SafeArea.vue # 安全区域包装
+```
+
+### 搜索组件
+```
+src/components/search/
+├── SearchBox.vue # 搜索输入框
+├── SourceSelector.vue # 音乐源选择弹窗
+├── SearchResults.vue # 搜索结果列表
+├── SongItem.vue # 歌曲列表项
+├── SearchHistory.vue # 搜索历史
+└── InfiniteScroll.vue # 无限滚动
+```
+
+### 播放器组件
+```
+src/components/player/
+├── AlbumCover.vue # 专辑封面
+├── SongInfo.vue # 歌曲信息
+├── PlayControls.vue # 播放控制
+├── ProgressBar.vue # 进度条
+├── LyricsView.vue # 歌词显示
+└── PlayModeToggle.vue # 播放模式切换
+```
+
+### 收藏组件
+```
+src/components/favorites/
+├── FavoritesList.vue # 收藏列表
+├── FavoriteItem.vue # 收藏项
+└── FavoriteButton.vue # 收藏按钮
+```
+
+### 通用组件
+```
+src/components/common/
+├── Loading.vue # 加载状态
+├── Empty.vue # 空状态
+├── Toast.vue # 提示信息
+├── Modal.vue # 模态弹窗
+├── BottomSheet.vue # 底部弹窗
+└── Icon.vue # 图标组件
+```
+
+## 💾 数据持久化需求
+
+### LocalStorage存储
+**播放器状态:**
+- 当前播放歌曲信息
+- 播放进度位置
+- 音量设置
+- 播放模式
+
+**用户数据:**
+- 收藏歌曲列表
+- 播放历史记录
+- 搜索历史
+- 用户设置项
+
+**设置数据:**
+- 默认音质选择
+- 默认音乐源
+- 其他用户偏好设置
+
+### 恢复机制
+- 应用启动时恢复播放状态
+- 页面刷新后继续播放
+- 保持用户设置和偏好
+- 离线时显示本地数据
+
+---
+
+## 📡 API接口文档
+
+### 搜索音乐接口
+```
+GET https://music-api.gdstudio.xyz/api.php
+参数:
+- types: search
+- source: 音乐源(netease/tencent/kugou等)
+- name: 搜索关键词(需URL编码)
+- count: 返回数量(默认20,固定值)
+- pages: 页码(从1开始,用于瀑布流)
+
+响应:
+[
+ {
+ "id": "歌曲唯一ID",
+ "name": "歌曲名称",
+ "artist": "歌手名(字符串或数组)",
+ "album": "专辑名称",
+ "pic_id": "专辑封面ID",
+ "lyric_id": "歌词ID",
+ "source": "音乐源标识"
+ }
+]
+```
+
+### 获取播放地址接口
+```
+GET https://music-api.gdstudio.xyz/api.php
+参数:
+- types: url
+- source: 音乐源标识
+- id: 歌曲ID
+- br: 音质(128/192/320/740/999)
+
+响应:
+{
+ "url": "音频文件直链",
+ "br": "实际返回音质",
+ "size": "文件大小(KB)"
+}
+```
+
+### 获取歌词接口
+```
+GET https://music-api.gdstudio.xyz/api.php
+参数:
+- types: lyric
+- source: 音乐源标识
+- id: 歌词ID(通常与歌曲ID相同)
+
+响应:
+{
+ "lyric": "LRC格式原文歌词",
+ "tlyric": "LRC格式翻译歌词(可能为空)"
+}
+```
+
+### 获取专辑封面接口
+```
+GET https://music-api.gdstudio.xyz/api.php
+参数:
+- types: pic
+- source: 音乐源标识
+- id: 专辑封面ID
+- size: 图片尺寸(300小图/500大图)
+
+响应:
+{
+ "url": "图片文件直链"
+}
+```
+
+### 支持的音乐源列表
+```javascript
+const MUSIC_SOURCES = [
+ { code: 'netease', name: '网易云音乐', priority: 1 },
+ { code: 'tencent', name: 'QQ音乐', priority: 2 },
+ { code: 'kugou', name: '酷狗音乐', priority: 3 },
+ { code: 'kuwo', name: '酷我音乐', priority: 4 },
+ { code: 'migu', name: '咪咕音乐', priority: 5 },
+ { code: 'spotify', name: 'Spotify', priority: 6 },
+ { code: 'apple', name: 'Apple Music', priority: 7 },
+ { code: 'ytmusic', name: 'YouTube Music', priority: 8 },
+ { code: 'joox', name: 'JOOX', priority: 9 },
+ { code: 'tidal', name: 'TIDAL', priority: 10 },
+ { code: 'deezer', name: 'Deezer', priority: 11 },
+ { code: 'qobuz', name: 'Qobuz', priority: 12 },
+ { code: 'ximalaya', name: '喜马拉雅FM', priority: 13 }
+]
+```
\ No newline at end of file