hookehuyr

chore(project): 添加文档系统和开发工具配置

- 创建完整的文档体系(8 个核心文档)
  - CHANGELOG.md - 项目变更日志
  - PROJECT-STATUS.md - 项目状态报告
  - DEVELOPMENT-GUIDE.md - 开发指南
  - CODING-STANDARDS.md - 代码规范
  - GIT-WORKFLOW.md - Git 工作流规范
  - api-integration-log.md - API 集成日志
  - lessons-learned.md - 经验教训总结
  - INITIALIZATION-SUMMARY.md - 初始化总结

- 配置测试框架
  - Vitest + @vue/test-utils + jsdom
  - 测试环境设置(Mock Taro API、wx API)
  - 添加测试示例文件

- 配置代码质量工具
  - ESLint 完善配置
  - Prettier 格式化配置
  - Husky Git Hooks
  - lint-staged 暂存文件检查

- 优化项目配置
  - 更新 package.json(测试脚本、lint-staged)
  - 优化 .gitignore
  - 创建主文档 CLAUDE.md

详细信息和后续步骤请查看 docs/INITIALIZATION-SUMMARY.md
1 +// ESLint 配置
2 +// https://eslint.vuejs.org/user-guide/#editor-integrations
3 +module.exports = {
4 + extends: ['taro/vue3'],
5 + rules: {
6 + // 自定义规则
7 + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
8 + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
9 + 'vue/multi-word-component-names': 'off', // 允许单词组件名
10 + 'prefer-const': 'warn', // 建议使用 const
11 + 'no-var': 'error', // 禁止使用 var
12 + eqeqeq: ['error', 'always'], // 必须使用 ===
13 + curly: ['error', 'all'], // 必须使用大括号
14 + 'brace-style': ['error', '1tbs'], // 大括号风格
15 + indent: ['error', 2, { SwitchCase: 1 }], // 缩进
16 + quotes: ['error', 'single', { avoidEscape: true }], // 单引号
17 + semi: ['error', 'never'], // 不使用分号
18 + 'comma-dangle': ['error', 'never'], // 不使用尾随逗号
19 + 'space-before-function-paren': [
20 + 'error',
21 + {
22 + anonymous: 'always',
23 + named: 'never',
24 + asyncArrow: 'always',
25 + },
26 + ],
27 + },
28 + globals: {
29 + // Taro 全局变量
30 + wx: 'readonly',
31 + Taro: 'readonly',
32 + },
33 +}
1 +# 构建输出
1 dist/ 2 dist/
2 deploy_versions/ 3 deploy_versions/
3 .temp/ 4 .temp/
4 .rn_temp/ 5 .rn_temp/
6 +
7 +# 依赖
5 node_modules/ 8 node_modules/
6 -.DS_Store 9 +package-lock.json
10 +yarn.lock
11 +
12 +# 缓存
7 .swc 13 .swc
8 .history 14 .history
15 +.cache
16 +.tsbuildinfo
17 +
18 +# 日志
19 +*.log
20 +logs/
21 +
22 +# 编辑器
23 +.DS_Store
24 +.idea/
25 +.vscode/
26 +*.swp
27 +*.swo
28 +
29 +# 资源目录(如果有本地开发资源)
9 resource 30 resource
10 -CLAUDE.md 31 +
32 +# 测试覆盖率
33 +coverage/
34 +
35 +# 环境变量
36 +.env.local
37 +.env.*.local
38 +
39 +# 其他
11 .claude/ 40 .claude/
......
1 +#!/bin/sh
2 +. "$(dirname "$0")/_/husky.sh"
3 +
4 +echo "🔍 运行 lint-staged..."
5 +pnpm exec lint-staged
1 +# 依赖
2 +node_modules
3 +pnpm-lock.yaml
4 +package-lock.json
5 +yarn.lock
6 +
7 +# 构建输出
8 +dist
9 +build
10 +
11 +# 缓存
12 +.cache
13 +.tsbuildinfo
14 +
15 +# 日志
16 +*.log
17 +logs
18 +
19 +# 其他
20 +.DS_Store
21 +*.md
1 +{
2 + "semi": false,
3 + "singleQuote": true,
4 + "printWidth": 100,
5 + "tabWidth": 2,
6 + "useTabs": false,
7 + "trailingComma": "es5",
8 + "bracketSpacing": true,
9 + "arrowParens": "avoid",
10 + "endOfLine": "lf",
11 + "vueIndentScriptAndStyle": false,
12 + "overrides": [
13 + {
14 + "files": "*.vue",
15 + "options": {
16 + "parser": "vue"
17 + }
18 + },
19 + {
20 + "files": "*.js",
21 + "options": {
22 + "parser": "babel"
23 + }
24 + },
25 + {
26 + "files": "*.less",
27 + "options": {
28 + "parser": "less"
29 + }
30 + }
31 + ]
32 +}
1 +# CLAUDE.md
2 +
3 +本文件为 Claude Code (claude.ai/code) 在此代码库中工作时提供指导。
4 +
5 +## 项目概述
6 +
7 +**lls_program** 是一个基于 Taro 4 + Vue 3 + NutUI 的微信小程序,名为"老来赛"。这是一个家庭活动和积分奖励管理系统。
8 +
9 +## 技术栈
10 +
11 +- **框架**: Taro 4.1.7 - 跨平台小程序框架
12 +- **UI**: Vue 3.3 + Composition API (`<script setup>`)
13 +- **UI 组件库**: NutUI Taro 4.3.13 (自动导入,无需手动引入)
14 +- **样式**: TailwindCSS 3.4 + Less (组件特定样式)
15 +- **状态管理**: Pinia 3.0 + taro-plugin-pinia
16 +- **HTTP 请求**: axios-miniprogram 2.7.2
17 +- **构建工具**: Webpack 5
18 +
19 +## 开发命令
20 +
21 +```bash
22 +# 安装依赖
23 +pnpm install
24 +
25 +# 开发(微信小程序)
26 +pnpm run dev:weapp
27 +
28 +# 生产构建
29 +pnpm run build:weapp
30 +
31 +# 其他平台
32 +pnpm run dev:h5 # H5 开发
33 +pnpm run dev:alipay # 支付宝小程序
34 +pnpm run dev:tt # 抖音小程序
35 +```
36 +
37 +## 架构设计
38 +
39 +### 核心目录结构
40 +
41 +```
42 +src/
43 +├── api/ # 按业务领域组织的 API 接口
44 +├── assets/ # 静态资源(图片、样式)
45 +├── components/ # 可复用的 Vue 组件
46 +├── composables/ # Vue 3 组合式函数 (useXxx)
47 +├── pages/ # Taro 页面(每个页面包含 index.vue + index.config.js)
48 +├── stores/ # Pinia 状态管理
49 +├── utils/ # 工具函数
50 +├── app.config.js # Taro 应用配置(页面列表、窗口、权限)
51 +└── app.less # 全局样式
52 +```
53 +
54 +### 路径别名 (config/index.js:30-38)
55 +
56 +```javascript
57 +@/utils src/utils
58 +@/components src/components
59 +@/images src/assets/images
60 +@/assets src/assets
61 +@/composables src/composables
62 +@/api src/api
63 +@/stores src/stores
64 +@/hooks src/hooks
65 +```
66 +
67 +### 设计宽度配置
68 +
69 +- **NutUI 组件**: 375px (自动处理)
70 +- **其他所有内容**: 750px (Taro 标准)
71 +- `config/index.js` 中的 `designWidth` 函数根据文件路径自动切换
72 +
73 +## 核心 API 模式
74 +
75 +### API 响应格式
76 +
77 +所有 API 响应遵循以下结构:
78 +```javascript
79 +{
80 + code: 1, // 1 = 成功,其他值 = 失败
81 + data: {...}, // 响应数据
82 + msg: "message" // 错误/成功消息
83 +}
84 +```
85 +
86 +**始终检查** `res.code === 1`(而不是 `res.code`)来判断成功。
87 +
88 +### 认证机制 (sessionid)
89 +
90 +**关键**: 项目使用 `sessionid` 进行认证(存储在 `wx.storage` 中):
91 +
92 +1. **获取**: `src/utils/request.js:23-30` - `getSessionId()``wx.getStorageSync("sessionid")` 读取
93 +2. **设置**: 在 `miniProgramAuthAPI``loginAPI` 成功后设置
94 +3. **使用**: 请求拦截器 (`request.js:75-78`) 设置 `config.headers.cookie = sessionid`
95 +4. **清除**: 收到 401 响应或用户登出时
96 +
97 +⚠️ **重要**: sessionid **不**由前端用于判断登录状态(后端通过 401 响应来判断)。它只是传递给服务器的凭证。
98 +
99 +### 请求拦截器 (src/utils/request.js:66-80)
100 +
101 +```javascript
102 +service.interceptors.request.use(config => {
103 + // 动态获取 sessionid 并设置到请求头
104 + const sessionid = getSessionId();
105 + if (sessionid) {
106 + config.headers.cookie = sessionid;
107 + }
108 + return config;
109 +})
110 +```
111 +
112 +### API 模块模式 (src/api/)
113 +
114 +每个 API 文件导出调用中央 `fn()` 辅助函数的函数:
115 +
116 +```javascript
117 +// src/api/common.js
118 +export const smsAPI = (params) => fn(fetch.post(Api.SMS, params));
119 +```
120 +
121 +关键 API 模块:
122 +- `common.js` - 短信验证码、上传凭证
123 +- `user.js` - 用户认证和个人信息
124 +- `family.js` - 家庭管理
125 +- `points.js` - 积分/奖励系统
126 +- `photo.js` - 照片/媒体处理
127 +- `organization.js` - 组织管理
128 +
129 +## Taro 小程序限制
130 +
131 +### ❌ 禁止使用 Web API
132 +
133 +```javascript
134 +// 禁止 - 在小程序中会崩溃
135 +window.document.getElementById()
136 +localStorage
137 +window.location.href
138 +fetch()
139 +```
140 +
141 +### ✅ 必须使用 Taro API
142 +
143 +```javascript
144 +// 正确 - 使用 Taro 等价 API
145 +Taro.createSelectorQuery()
146 +Taro.getStorage() / Taro.setStorage()
147 +Taro.navigateTo()
148 +Taro.request()
149 +```
150 +
151 +### 页面生命周期(使用 Taro Hooks)
152 +
153 +```javascript
154 +import { useLoad, useShow, useReady } from '@tarojs/taro'
155 +
156 +useLoad((options) => {
157 + // 页面加载(仅触发一次)- 适合获取路由参数
158 +})
159 +
160 +useShow(() => {
161 + // 页面显示(每次显示都触发)- 适合刷新数据
162 +})
163 +
164 +useReady(() => {
165 + // 页面首次渲染完成
166 +})
167 +```
168 +
169 +### ❌ 页面中避免使用 Vue 生命周期
170 +
171 +```javascript
172 +// 不要使用 - 可能无法正常工作
173 +onMounted(() => { ... })
174 +onUnmounted(() => { ... })
175 +```
176 +
177 +## 组件指南
178 +
179 +### 页面结构
180 +
181 +每个页面目录包含:
182 +- `index.vue` - 页面组件(必须使用 `<script setup>`
183 +- `index.config.js` - 页面特定配置(navigationBarTitleText 等)
184 +- `index.less` - 页面特定样式(scoped)
185 +
186 +### 组件命名规范
187 +
188 +- **页面**: 目录名(如 `pages/Dashboard/`
189 +- **组件**: PascalCase 多单词命名(如 `PointsCollector.vue``FamilyAlbum.vue`
190 +- **API 文件**: camelCase(如 `miniProgramAuthAPI`
191 +
192 +### NutUI 自动导入
193 +
194 +NutUI 组件通过 `unplugin-vue-components` 自动导入。**不要**手动导入:
195 +
196 +```vue
197 +<!-- ✅ 正确 - 自动导入 -->
198 +<template>
199 + <nut-button type="primary">点击</nut-button>
200 +</template>
201 +
202 +<!-- ❌ 错误 - 不要导入 -->
203 +<script setup>
204 +import { Button } from '@nutui/nutui-taro'
205 +</script>
206 +```
207 +
208 +## 样式
209 +
210 +### TailwindCSS + Less 混合使用
211 +
212 +- **TailwindCSS**: 用于布局、间距、颜色、排版(80% 的样式)
213 +- **Less**: 用于组件特定样式、动画、深度选择器(20%)
214 +
215 +### Tailwind 配置
216 +
217 +- **Content**: `./src/**/*.{html,js,ts,jsx,tsx,vue}` (tailwind.config.js:13)
218 +- **Preflight**: 禁用(小程序不需要)
219 +- **rem → rpx**: 由 `weapp-tailwindcss` 插件处理 (rem2rpx: true)
220 +
221 +### 样式指南
222 +
223 +```vue
224 +<style lang="less" scoped>
225 +/* ✅ 组件必须使用 scoped */
226 +.page-container {
227 + padding: 30px;
228 +}
229 +
230 +/* ✅ 使用 Less 处理深度选择器 */
231 +.custom-element :deep(.nut-popup) {
232 + background-color: #fff;
233 +}
234 +</style>
235 +```
236 +
237 +## 状态管理 (Pinia)
238 +
239 +### Store 模式
240 +
241 +```javascript
242 +// src/stores/host.js
243 +import { defineStore } from 'pinia'
244 +
245 +export const hostStore = defineStore('host', {
246 + state: () => ({
247 + id: '',
248 + join_id: ''
249 + }),
250 + actions: {
251 + add(id) {
252 + this.id = id
253 + }
254 + }
255 +})
256 +```
257 +
258 +### 在组件中使用
259 +
260 +```vue
261 +<script setup>
262 +import { hostStore } from '@/stores/host'
263 +
264 +const host = hostStore()
265 +host.add('123')
266 +</script>
267 +```
268 +
269 +## 常用模式
270 +
271 +### 页面导航
272 +
273 +```javascript
274 +import Taro from '@tarojs/taro'
275 +
276 +// 跳转到页面
277 +Taro.navigateTo({
278 + url: '/pages/Detail/index?id=123'
279 +})
280 +
281 +// 重定向(无返回)
282 +Taro.redirectTo({
283 + url: '/pages/Login/index'
284 +})
285 +
286 +// 切换 Tab
287 +Taro.switchTab({
288 + url: '/pages/Dashboard/index'
289 +})
290 +
291 +// 获取路由参数
292 +useLoad((options) => {
293 + const { id } = options
294 +})
295 +```
296 +
297 +### 本地存储
298 +
299 +```javascript
300 +// 异步(推荐)
301 +await Taro.setStorage({ key: 'user', data: userInfo })
302 +const { data } = await Taro.getStorage({ key: 'user' })
303 +
304 +// 同步(谨慎使用)
305 +Taro.setStorageSync('token', 'xxxx')
306 +const token = Taro.getStorageSync('token')
307 +```
308 +
309 +### 提示/弹窗
310 +
311 +```javascript
312 +// Toast 提示
313 +Taro.showToast({
314 + title: '操作成功',
315 + icon: 'success',
316 + duration: 2000
317 +})
318 +
319 +// Modal 弹窗
320 +Taro.showModal({
321 + title: '提示',
322 + content: '确定删除吗?',
323 + success: (res) => {
324 + if (res.confirm) {
325 + // 用户点击了确定
326 + }
327 + }
328 +})
329 +```
330 +
331 +## 页面注册
332 +
333 +页面在 `src/app.config.js` 中注册:
334 +
335 +```javascript
336 +export default {
337 + pages: [
338 + 'pages/Dashboard/index',
339 + 'pages/MyFamily/index',
340 + 'pages/Activities/index',
341 + // ... 更多页面
342 + ]
343 +}
344 +```
345 +
346 +**创建新页面时**: 必须将其添加到此数组中。
347 +
348 +## 构建输出
349 +
350 +- **开发环境**: `dist/` 目录
351 +- **微信开发者工具**: 打开 `dist/` 作为项目根目录
352 +
353 +## 重要文件说明
354 +
355 +### `src/utils/request.js`
356 +
357 +核心 HTTP 客户端,包含:
358 +- SessionID 注入
359 +- 401 响应处理
360 +- 401 时静默授权重定向
361 +- 错误处理
362 +
363 +### `src/utils/authRedirect.js`
364 +
365 +处理小程序登录流程的静默授权。
366 +
367 +### `src/utils/tools.js`
368 +
369 +通用工具函数:
370 +- `formatDate()` - 使用 moment.js 格式化日期
371 +- `wxInfo()` - 平台检测(Android/iOS/微信)
372 +- `hasEllipsis()` - 文本溢出检测
373 +
374 +## 开发注意事项
375 +
376 +1. **始终使用 Taro API** 而非 Web API
377 +2. **检查 `res.code === 1`** 判断 API 成功(不是 `res.code`
378 +3. **NutUI 组件已自动导入** - 不要手动导入
379 +4. **页面中使用 Taro 生命周期钩子**`useLoad``useShow`
380 +5. **SessionID 动态获取** - 每次请求从存储中读取
381 +6. **已配置路径别名** - 使用 `@/components` 代替相对路径
382 +7. **设计宽度双模式**: NutUI 使用 375px,其他使用 750px
383 +
384 +## 平台差异
385 +
386 +项目通过 Taro 支持多平台:
387 +- **微信 (weapp)**: 主要目标平台
388 +- **H5**: Web 浏览器版本
389 +- **支付宝 (alipay)**: 支付宝小程序
390 +- **抖音 (tt)**: 字节跳动小程序
391 +
392 +平台特定代码可使用:
393 +```javascript
394 +if (process.env.TARO_ENV === 'weapp') {
395 + // 微信特定代码
396 +}
397 +```
1 +# 项目变更日志
2 +
3 +本文档记录项目的所有重要变更。
4 +
5 +格式遵循:[Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)
6 +
7 +---
8 +
9 +## [2026-02-05] - 项目开发环境初始化
10 +
11 +### 新增
12 +- 创建 docs/ 目录结构(reports/、tasks/)
13 +- 创建 CHANGELOG.md 变更日志
14 +- 创建 PROJECT-STATUS.md 项目状态报告
15 +- 创建 DEVELOPMENT-GUIDE.md 开发指南
16 +- 创建规范文档目录
17 +
18 +---
19 +
20 +**详细信息**
21 +- **影响文件**: docs/CHANGELOG.md, docs/PROJECT-STATUS.md, docs/DEVELOPMENT-GUIDE.md
22 +- **技术栈**: 文档系统
23 +- **测试状态**: N/A
24 +- **备注**: 为后续开发建立完善的文档体系
1 +# 代码规范
2 +
3 +**更新时间**: 2026-02-05
4 +
5 +本文档定义项目的代码规范。
6 +
7 +---
8 +
9 +## 📋 命名规范
10 +
11 +### 文件命名
12 +
13 +```
14 +组件: PascalCase UserCard.vue
15 +页面: PascalCase Dashboard/index.vue
16 +API 文件: camelCase userAPI.js
17 +工具函数: camelCase formatDate.js
18 +常量文件: UPPER_CASE API_CONSTANTS.js
19 +```
20 +
21 +### 变量命名
22 +
23 +```javascript
24 +// ✅ 正确
25 +const userList = ref([])
26 +const isLoading = ref(false)
27 +const MAX_COUNT = 100
28 +
29 +// ❌ 错误
30 +const UserList = ref([])
31 +const is_loading = ref(false)
32 +const max_count = 100
33 +```
34 +
35 +### 函数命名
36 +
37 +```javascript
38 +// ✅ 正确 - 动词开头
39 +const fetchUserData = async () => {}
40 +const handleSubmit = () => {}
41 +const formatDate = (date) => {}
42 +
43 +// ❌ 错误
44 +const userData = async () => {} // 应该是 fetchUserData
45 +const submit = () => {} // 应该是 handleSubmit
46 +```
47 +
48 +---
49 +
50 +## 🎯 Vue 3 规范
51 +
52 +### 组件定义
53 +
54 +```vue
55 +<script setup>
56 +// 1. 导入
57 +import { ref, computed, onMounted } from 'vue'
58 +import { useLoad } from '@tarojs/taro'
59 +import { userAPI } from '@/api/user'
60 +
61 +// 2. Props 定义
62 +const props = defineProps({
63 + userId: {
64 + type: Number,
65 + required: true,
66 + default: 0
67 + }
68 +})
69 +
70 +// 3. Emits 定义
71 +const emit = defineEmits(['update', 'delete'])
72 +
73 +// 4. 响应式状态
74 +const loading = ref(false)
75 +const dataList = ref([])
76 +
77 +// 5. 计算属性
78 +const totalCount = computed(() => dataList.value.length)
79 +
80 +// 6. 方法
81 +const fetchData = async () => {
82 + loading.value = true
83 + try {
84 + const res = await userAPI()
85 + if (res.code === 1) {
86 + dataList.value = res.data
87 + }
88 + } finally {
89 + loading.value = false
90 + }
91 +}
92 +
93 +// 7. 生命周期(Taro Hooks)
94 +useLoad(() => {
95 + fetchData()
96 +})
97 +</script>
98 +```
99 +
100 +### Props 验证
101 +
102 +```javascript
103 +// ✅ 正确 - 完整的类型和默认值
104 +const props = defineProps({
105 + userId: {
106 + type: Number,
107 + required: true,
108 + default: 0
109 + },
110 + userName: {
111 + type: String,
112 + default: ''
113 + },
114 + isActive: {
115 + type: Boolean,
116 + default: false
117 + }
118 +})
119 +
120 +// ❌ 错误 - 缺少类型
121 +const props = defineProps(['userId', 'userName'])
122 +```
123 +
124 +### Emits 定义
125 +
126 +```javascript
127 +// ✅ 正确 - 定义事件名
128 +const emit = defineEmits({
129 + // 带验证的事件
130 + update: (payload) => typeof payload.id === 'number',
131 + // 无验证的事件
132 + delete: null
133 +})
134 +
135 +// ❌ 错误 - 未定义事件
136 +const emit = defineEmits()
137 +```
138 +
139 +---
140 +
141 +## 🎨 样式规范
142 +
143 +### TailwindCSS 优先
144 +
145 +```vue
146 +<template>
147 + <!-- ✅ 优先使用 TailwindCSS -->
148 + <view class="flex items-center justify-between p-4 bg-white">
149 + <text class="text-xl font-bold text-gray-900">标题</text>
150 + </view>
151 +</template>
152 +
153 +<style lang="less" scoped>
154 +/* ✅ 仅在必要时使用 Less */
155 +.custom-element {
156 + // 深度选择器
157 + :deep(.nut-popup) {
158 + background-color: #fff;
159 + }
160 +
161 + // 复杂动画
162 + @keyframes slide-in {
163 + from { transform: translateX(-100%); }
164 + to { transform: translateX(0); }
165 + }
166 +}
167 +</style>
168 +```
169 +
170 +### 样式作用域
171 +
172 +```vue
173 +<!-- ✅ 页面组件必须使用 scoped -->
174 +<template>
175 + <view class="page-container">...</view>
176 +</template>
177 +
178 +<style lang="less" scoped>
179 +.page-container {
180 + padding: 30px;
181 +}
182 +</style>
183 +```
184 +
185 +---
186 +
187 +## 📡 API 调用规范
188 +
189 +### 统一错误处理
190 +
191 +```javascript
192 +// ✅ 正确 - 完整的错误处理
193 +const fetchData = async () => {
194 + loading.value = true
195 + try {
196 + const res = await userAPI()
197 + if (res.code === 1) {
198 + dataList.value = res.data
199 + } else {
200 + Taro.showToast({
201 + title: res.msg || '请求失败',
202 + icon: 'none'
203 + })
204 + }
205 + } catch (err) {
206 + console.error('请求失败:', err)
207 + Taro.showToast({
208 + title: '网络异常',
209 + icon: 'none'
210 + })
211 + } finally {
212 + loading.value = false
213 + }
214 +}
215 +
216 +// ❌ 错误 - 没有错误处理
217 +const fetchData = async () => {
218 + const res = await userAPI()
219 + dataList.value = res.data
220 +}
221 +```
222 +
223 +### SessionID 管理
224 +
225 +```javascript
226 +// ✅ 正确 - sessionid 由请求拦截器自动注入
227 +// 详见 src/utils/request.js:75-78
228 +
229 +// ❌ 错误 - 手动设置 sessionid
230 +const sessionid = Taro.getStorageSync('sessionid')
231 +const res = await userAPI({ headers: { cookie: sessionid } })
232 +```
233 +
234 +---
235 +
236 +## 🧪 测试规范
237 +
238 +### 单元测试
239 +
240 +```javascript
241 +// ✅ 好的测试 - 清晰的描述和断言
242 +describe('formatDate', () => {
243 + it('should format date to YYYY-MM-DD', () => {
244 + const result = formatDate('2026-02-05')
245 + expect(result).toBe('2026-02-05')
246 + })
247 +
248 + it('should handle invalid date', () => {
249 + const result = formatDate('invalid')
250 + expect(result).toBe('')
251 + })
252 +})
253 +```
254 +
255 +### 测试覆盖率目标
256 +
257 +- **全局覆盖率**: > 80%
258 +- **核心业务逻辑**: > 90%
259 +- **工具函数**: 100%
260 +
261 +---
262 +
263 +## 📝 注释规范
264 +
265 +### JSDoc 注释
266 +
267 +```javascript
268 +/**
269 + * 格式化日期
270 + * @param {string|Date} date - 日期对象或日期字符串
271 + * @param {string} format - 格式化模板(默认:'YYYY-MM-DD')
272 + * @returns {string} 格式化后的日期字符串
273 + * @example
274 + * formatDate('2026-02-05', 'YYYY年MM月DD日')
275 + * // 返回:'2026年02月05日'
276 + */
277 +const formatDate = (date, format = 'YYYY-MM-DD') => {
278 + // ...
279 +}
280 +```
281 +
282 +### 复杂逻辑注释
283 +
284 +```javascript
285 +// 步骤 1: 验证用户权限
286 +const hasPermission = await checkUserPermission()
287 +if (!hasPermission) {
288 + throw new Error('无权限操作')
289 +}
290 +
291 +// 步骤 2: 检查数据有效性
292 +const isValid = validateData(data)
293 +if (!isValid) {
294 + throw new Error('数据格式错误')
295 +}
296 +
297 +// 步骤 3: 提交到服务器
298 +const result = await submitData(data)
299 +```
300 +
301 +---
302 +
303 +## 🔒 安全规范
304 +
305 +### 防止 XSS
306 +
307 +```vue
308 +<!-- ❌ 危险 - 用户输入未转义 -->
309 +<view v-html="userComment"></view>
310 +
311 +<!-- ✅ 安全 - 使用 text 插值 -->
312 +<view>{{ userComment }}</view>
313 +```
314 +
315 +### 敏感信息保护
316 +
317 +```javascript
318 +// ❌ 错误 - 硬编码密钥
319 +const API_KEY = 'sk-proj-xxxxx'
320 +
321 +// ✅ 正确 - 使用环境变量
322 +const API_KEY = process.env.API_KEY
323 +```
324 +
325 +---
326 +
327 +## ✅ 代码检查清单
328 +
329 +提交代码前,确认:
330 +
331 +- [ ] 代码可读性强,命名清晰
332 +- [ ] 函数单一职责,长度 < 50 行
333 +- [ ] 无深度嵌套(> 4 层)
334 +- [ ] 无魔法数字,使用常量
335 +- [ ] 无 console.log 或 debugger
336 +- [ ] Props 有类型和默认值
337 +- [ ] Emits 有事件名定义
338 +- [ ] API 调用检查 `res.code === 1`
339 +- [ ] 所有 async 函数有 try-catch
340 +- [ ] 组件样式使用 scoped
341 +- [ ] 优先使用 TailwindCSS
342 +- [ ] 复杂逻辑有注释说明
343 +- [ ] JSDoc 注释完整
344 +
345 +---
346 +
347 +**维护者**: 开发团队
348 +**最后更新**: 2026-02-05
1 +# 开发指南
2 +
3 +**更新时间**: 2026-02-05
4 +
5 +本文档提供老来赛项目的开发规范和最佳实践。
6 +
7 +---
8 +
9 +## 🚀 快速开始
10 +
11 +### 1. 环境准备
12 +
13 +```bash
14 +# 安装依赖
15 +pnpm install
16 +
17 +# 启动开发服务器
18 +pnpm run dev:weapp
19 +
20 +# 在微信开发者工具中打开 dist/ 目录
21 +```
22 +
23 +### 2. 开发流程
24 +
25 +1. **创建新页面**
26 + ```bash
27 + # 在 src/pages/ 下创建页面目录
28 + mkdir src/pages/YourPage
29 + touch src/pages/YourPage/index.vue
30 + touch src/pages/YourPage/index.config.js
31 + ```
32 +
33 +2. **注册页面**(必须):
34 + ```javascript
35 + // src/app.config.js
36 + export default {
37 + pages: [
38 + // ... 其他页面
39 + 'pages/YourPage/index'
40 + ]
41 + }
42 + ```
43 +
44 +3. **启动开发**
45 + ```bash
46 + pnpm run dev:weapp
47 + ```
48 +
49 +---
50 +
51 +## 📝 代码规范
52 +
53 +### Vue 组件规范
54 +
55 +#### ✅ 推荐做法
56 +
57 +```vue
58 +<script setup>
59 +import { ref, computed } from 'vue'
60 +
61 +// 1. Props 定义(有类型和默认值)
62 +const props = defineProps({
63 + userId: {
64 + type: Number,
65 + required: true
66 + },
67 + title: {
68 + type: String,
69 + default: ''
70 + }
71 +})
72 +
73 +// 2. Emits 定义(有事件名)
74 +const emit = defineEmits(['update', 'delete'])
75 +
76 +// 3. 响应式状态
77 +const loading = ref(false)
78 +const dataList = ref([])
79 +
80 +// 4. 计算属性
81 +const totalCount = computed(() => dataList.value.length)
82 +
83 +// 5. 方法
84 +const fetchData = async () => {
85 + loading.value = true
86 + try {
87 + const res = await yourAPI()
88 + if (res.code === 1) {
89 + dataList.value = res.data
90 + }
91 + } finally {
92 + loading.value = false
93 + }
94 +}
95 +
96 +// 6. 生命周期(使用 Taro Hooks)
97 +import { useLoad, useShow } from '@tarojs/taro'
98 +
99 +useLoad((options) => {
100 + // 页面加载(只触发一次)
101 + fetchData()
102 +})
103 +
104 +useShow(() => {
105 + // 页面显示(每次显示都触发)
106 +})
107 +</script>
108 +
109 +<template>
110 + <view class="page-container">
111 + <!-- 模板内容 -->
112 + </view>
113 +</template>
114 +
115 +<style lang="less" scoped>
116 +.page-container {
117 + padding: 30px;
118 +}
119 +</style>
120 +```
121 +
122 +#### ❌ 避免做法
123 +
124 +```vue
125 +<script setup>
126 +// ❌ 不要在页面中使用 Vue 生命周期
127 +import { onMounted } from 'vue'
128 +onMounted(() => {
129 + // 可能无法正常工作
130 +})
131 +
132 +// ❌ 不要直接修改 props
133 +props.title = 'new title'
134 +
135 +// ❌ 不要使用 Web API
136 +localStorage.setItem('key', 'value')
137 +```
138 +
139 +### API 调用规范
140 +
141 +```javascript
142 +// ✅ 正确 - 检查 res.code === 1
143 +const fetchData = async () => {
144 + try {
145 + const res = await yourAPI()
146 + if (res.code === 1) { // 重要:检查 === 1
147 + // 处理成功
148 + console.log(res.data)
149 + } else {
150 + // 处理业务错误
151 + Taro.showToast({
152 + title: res.msg || '请求失败',
153 + icon: 'none'
154 + })
155 + }
156 + } catch (err) {
157 + // 处理网络错误
158 + console.error('请求失败:', err)
159 + Taro.showToast({
160 + title: '网络异常',
161 + icon: 'none'
162 + })
163 + }
164 +}
165 +
166 +// ❌ 错误 - 不检查或错误检查
167 +const fetchData = async () => {
168 + const res = await yourAPI()
169 + if (res.code) { // 错误:应该检查 === 1
170 + // ...
171 + }
172 +}
173 +```
174 +
175 +### 路径别名使用
176 +
177 +```javascript
178 +// ✅ 正确 - 使用路径别名
179 +import { formatDate } from '@/utils/tools'
180 +import UserCard from '@/components/UserCard.vue'
181 +import { userAPI } from '@/api/user'
182 +
183 +// ❌ 错误 - 使用相对路径
184 +import { formatDate } from '../../utils/tools'
185 +import UserCard from '../../components/UserCard.vue'
186 +```
187 +
188 +---
189 +
190 +## 🎨 样式规范
191 +
192 +### TailwindCSS + Less 混合使用
193 +
194 +```vue
195 +<template>
196 + <!-- TailwindCSS 用于布局、间距、颜色(80%) -->
197 + <view class="flex flex-col gap-4 p-4 bg-white">
198 + <text class="text-xl font-bold text-gray-900">标题</text>
199 + </view>
200 +</template>
201 +
202 +<style lang="less" scoped>
203 +/* Less 用于组件特定样式(20%) */
204 +.custom-element {
205 + // 深度选择器修改第三方组件
206 + :deep(.nut-popup) {
207 + background-color: #fff;
208 + }
209 +
210 + // 复杂动画
211 + @keyframes slide-in {
212 + from { transform: translateX(-100%); }
213 + to { transform: translateX(0); }
214 + }
215 +}
216 +</style>
217 +```
218 +
219 +### 样式单位
220 +
221 +```less
222 +// ✅ 正确 - 使用 px(Taro 自动转换为 rpx)
223 +.container {
224 + width: 100px; // → 100rpx
225 + height: 200px;
226 +}
227 +
228 +// ❌ 错误 - 直接写 rpx(除非明确需要)
229 +.container {
230 + width: 100rpx;
231 +}
232 +```
233 +
234 +---
235 +
236 +## 🔧 常用模式
237 +
238 +### 路由导航
239 +
240 +```javascript
241 +import Taro from '@tarojs/taro'
242 +
243 +// 跳转到新页面
244 +Taro.navigateTo({
245 + url: '/pages/Detail/index?id=123'
246 +})
247 +
248 +// 重定向(无返回)
249 +Taro.redirectTo({
250 + url: '/pages/Login/index'
251 +})
252 +
253 +// 切换 Tab
254 +Taro.switchTab({
255 + url: '/pages/Dashboard/index'
256 +})
257 +
258 +// 返回上一页
259 +Taro.navigateBack({
260 + delta: 1
261 +})
262 +```
263 +
264 +### 获取路由参数
265 +
266 +```javascript
267 +import { useLoad } from '@tarojs/taro'
268 +
269 +useLoad((options) => {
270 + const { id, type } = options
271 + console.log('页面参数:', id, type)
272 +})
273 +```
274 +
275 +### 本地存储
276 +
277 +```javascript
278 +// 异步(推荐)
279 +await Taro.setStorage({ key: 'user', data: userInfo })
280 +const { data } = await Taro.getStorage({ key: 'user' })
281 +
282 +// 同步(谨慎使用)
283 +Taro.setStorageSync('token', 'xxxx')
284 +const token = Taro.getStorageSync('token')
285 +```
286 +
287 +### 提示/弹窗
288 +
289 +```javascript
290 +// Toast
291 +Taro.showToast({
292 + title: '操作成功',
293 + icon: 'success',
294 + duration: 2000
295 +})
296 +
297 +// Modal
298 +Taro.showModal({
299 + title: '提示',
300 + content: '确定删除吗?',
301 + success: (res) => {
302 + if (res.confirm) {
303 + // 用户点击确定
304 + }
305 + }
306 +})
307 +```
308 +
309 +---
310 +
311 +## 🧪 测试规范
312 +
313 +### 单元测试(待添加)
314 +
315 +```javascript
316 +// 示例:工具函数测试
317 +import { describe, it, expect } from 'vitest'
318 +import { formatDate } from '@/utils/tools'
319 +
320 +describe('formatDate', () => {
321 + it('should format date correctly', () => {
322 + const result = formatDate('2026-02-05')
323 + expect(result).toBe('2026年02月05日')
324 + })
325 +})
326 +```
327 +
328 +### E2E 测试(待添加)
329 +
330 +```javascript
331 +// 示例:关键流程测试
332 +test('should login successfully', async ({ page }) => {
333 + await page.goto('/pages/login/index')
334 + await page.fill('input[name="phone"]', '13800138000')
335 + await page.click('button[type="submit"]')
336 + await expect(page).toHaveURL('/pages/dashboard/index')
337 +})
338 +```
339 +
340 +---
341 +
342 +## 📦 依赖管理
343 +
344 +### 添加依赖
345 +
346 +```bash
347 +# 生产依赖
348 +pnpm add package-name
349 +
350 +# 开发依赖
351 +pnpm add -D package-name
352 +
353 +# NutUI 相关
354 +pnpm add @nutui/nutui-taro
355 +```
356 +
357 +### NutUI 组件使用
358 +
359 +```vue
360 +<template>
361 + <!-- ✅ 正确 - 自动导入,无需手动 import -->
362 + <nut-button type="primary">按钮</nut-button>
363 + <nut-popup v-model:visible="showPopup">
364 + 内容
365 + </nut-popup>
366 +</template>
367 +
368 +<script setup>
369 +// ❌ 错误 - 不要手动导入
370 +// import { Button } from '@nutui/nutui-taro'
371 +</script>
372 +```
373 +
374 +---
375 +
376 +## 🚨 常见问题
377 +
378 +### Q1: 页面不显示?
379 +
380 +**检查清单**
381 +- [ ] 页面是否在 `app.config.js` 中注册
382 +- [ ] 页面路径是否正确
383 +- [ ] 是否有语法错误
384 +
385 +### Q2: API 请求失败?
386 +
387 +**检查清单**
388 +- [ ] 域名是否在微信小程序后台配置
389 +- [ ] sessionid 是否正确设置
390 +- [ ] 请求参数是否正确
391 +- [ ] 网络是否正常
392 +
393 +### Q3: 样式不生效?
394 +
395 +**检查清单**
396 +- [ ] 是否添加了 `scoped`
397 +- [ ] 是否使用了不支持的 CSS
398 +- [ ] 是否被全局样式覆盖
399 +
400 +### Q4: 组件不显示?
401 +
402 +**检查清单**
403 +- [ ] 组件名称是否正确(PascalCase)
404 +- [ ] NutUI 组件是否正确使用
405 +- [ ] 组件路径是否正确
406 +
407 +---
408 +
409 +## 📚 参考资源
410 +
411 +### 项目文档
412 +
413 +- [CLAUDE.md](../CLAUDE.md) - 项目指南
414 +- [PROJECT-STATUS.md](PROJECT-STATUS.md) - 项目状态
415 +- [CHANGELOG.md](CHANGELOG.md) - 变更日志
416 +
417 +### 外部资源
418 +
419 +- [Taro 官方文档](https://docs.taro.zone/)
420 +- [Vue 3 官方文档](https://cn.vuejs.org/)
421 +- [NutUI Taro 文档](https://nutui.jd.com/4/taro/)
422 +- [TailwindCSS 文档](https://tailwindcss.com/)
423 +
424 +---
425 +
426 +**维护者**: 开发团队
427 +**最后更新**: 2026-02-05
1 +# Git 工作流规范
2 +
3 +**更新时间**: 2026-02-05
4 +
5 +本文档定义项目的 Git 工作流和提交规范。
6 +
7 +---
8 +
9 +## 🌳 分支策略
10 +
11 +### 主要分支
12 +
13 +```
14 +master - 生产环境(主分支)
15 +develop - 开发环境(日常开发)
16 +feature/* - 功能分支
17 +bugfix/* - Bug 修复分支
18 +hotfix/* - 紧急修复分支
19 +```
20 +
21 +### 分支命名
22 +
23 +```bash
24 +# 功能开发
25 +feature/功能名称
26 +feature/user-profile
27 +feature/points-system
28 +
29 +# Bug 修复
30 +bugfix/问题描述
31 +bugfix/login-error
32 +
33 +# 紧急修复
34 +hotfix/严重问题
35 +hotfix/security-fix
36 +```
37 +
38 +---
39 +
40 +## 🔄 工作流程
41 +
42 +### 1. 开始新功能
43 +
44 +```bash
45 +# 从 develop 创建功能分支
46 +git checkout develop
47 +git pull origin develop
48 +git checkout -b feature/your-feature-name
49 +
50 +# 开发...
51 +git add .
52 +git commit -m "feat: 添加用户头像上传功能"
53 +
54 +# 推送到远程
55 +git push origin feature/your-feature-name
56 +```
57 +
58 +### 2. 完成 Bug 修复
59 +
60 +```bash
61 +# 从 develop 创建修复分支
62 +git checkout develop
63 +git pull origin develop
64 +git checkout -b bugfix/login-error
65 +
66 +# 修复...
67 +git add .
68 +git commit -m "fix: 修复登录页面验证码错误"
69 +
70 +# 推送并创建 PR
71 +git push origin bugfix/login-error
72 +```
73 +
74 +### 3. 合并到 develop
75 +
76 +```bash
77 +# 创建 Pull Request(GitHub/GitLab)
78 +# 或 Merge Request(GitLab)
79 +
80 +# 审查通过后合并
81 +git checkout develop
82 +git pull origin develop
83 +git branch -d feature/your-feature-name
84 +```
85 +
86 +---
87 +
88 +## 📝 Commit Message 规范
89 +
90 +### 格式
91 +
92 +```
93 +<type>(<scope>): <subject>
94 +
95 +<body>
96 +
97 +<footer>
98 +```
99 +
100 +### Type(类型)
101 +
102 +| 类型 | 说明 | 示例 |
103 +|------|------|------|
104 +| `feat` | 新功能 | feat(user): 添加用户头像上传 |
105 +| `fix` | Bug 修复 | fix(login): 修复验证码倒计时 |
106 +| `docs` | 文档更新 | docs(readme): 更新安装说明 |
107 +| `style` | 代码格式(不影响功能) | style(component): 统一代码缩进 |
108 +| `refactor` | 重构(不是新功能也不是修复) | refactor(api): 重构请求拦截器 |
109 +| `perf` | 性能优化 | perf(list): 优化长列表渲染 |
110 +| `test` | 测试相关 | test(utils): 添加工具函数测试 |
111 +| `chore` | 构建/工具链相关 | chore(deps): 升级 Taro 版本 |
112 +
113 +### Scope(范围)
114 +
115 +根据项目自定义:
116 +- `user` - 用户相关
117 +- `family` - 家庭相关
118 +- `points` - 积分相关
119 +- `photo` - 照片相关
120 +- `api` - API 接口
121 +- `ui` - UI 组件
122 +- `config` - 配置文件
123 +
124 +### Subject(主题)
125 +
126 +- 简短描述(不超过 50 字符)
127 +- 使用中文
128 +- 不以句号结尾
129 +- 使用祈使句(如 "添加" 而非 "添加了")
130 +
131 +### 示例
132 +
133 +```
134 +feat(user): 添加用户头像上传功能
135 +
136 +- 实现图片选择功能
137 +- 添加裁剪和压缩
138 +- 集成到用户设置页面
139 +
140 +Closes #123
141 +```
142 +
143 +```
144 +fix(login): 修复验证码倒计时问题
145 +
146 +- 修复页面切换后倒计时停止
147 +- 添加 onUnmounted 清理定时器
148 +
149 +Fixes #456
150 +```
151 +
152 +---
153 +
154 +## 🚫 禁止事项
155 +
156 +### ❌ 禁止直接提交到 master
157 +
158 +```bash
159 +# 错误
160 +git checkout master
161 +git commit -m "feat: 新功能"
162 +
163 +# 正确
164 +git checkout develop
165 +git commit -m "feat: 新功能"
166 +# 创建 PR 合并到 master
167 +```
168 +
169 +### ❌ 禁止推送未测试的代码
170 +
171 +```bash
172 +# 提交前必须测试
173 +pnpm run lint # 代码检查
174 +pnpm run test # 运行测试
175 +```
176 +
177 +### ❌ 禁止包含敏感信息
178 +
179 +```bash
180 +# 检查是否有敏感信息
181 +git diff | grep -i "password\|token\|secret\|api_key"
182 +```
183 +
184 +---
185 +
186 +## ✅ 提交前检查清单
187 +
188 +在提交代码前,确认:
189 +
190 +- [ ] 代码通过 ESLint 检查
191 +- [ ] 代码通过 Prettier 格式化
192 +- [ ] 测试通过(如果有)
193 +- [ ] 无 console.log 或 debugger
194 +- [ ] 无注释掉的代码
195 +- [ ] 代码注释完整
196 +- [ ] Commit Message 符合规范
197 +- [ ] CHANGELOG.md 已更新(如有重大变更)
198 +
199 +---
200 +
201 +## 🔧 Git Hooks 配置(待添加)
202 +
203 +### Husky + lint-staged
204 +
205 +```bash
206 +# 安装依赖
207 +pnpm add -D husky lint-staged
208 +
209 +# 初始化 Husky
210 +pnpm prepare
211 +
212 +# 配置 lint-staged
213 +```
214 +
215 +### .husky/pre-commit
216 +
217 +```bash
218 +#!/bin/sh
219 +. "$(dirname "$0")/_/husky.sh"
220 +
221 +# 代码检查
222 +pnpm lint
223 +
224 +# 运行测试
225 +pnpm test
226 +```
227 +
228 +### package.json
229 +
230 +```json
231 +{
232 + "scripts": {
233 + "prepare": "husky install"
234 + },
235 + "lint-staged": {
236 + "*.{js,vue}": [
237 + "eslint --fix",
238 + "prettier --write"
239 + ]
240 + }
241 +}
242 +```
243 +
244 +---
245 +
246 +## 📚 参考资源
247 +
248 +- [Conventional Commits](https://www.conventionalcommits.org/)
249 +- [Angular Commit Guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit)
250 +- [Commitlint](https://commitlint.js.org/)
251 +
252 +---
253 +
254 +**维护者**: 开发团队
255 +**最后更新**: 2026-02-05
1 +# 项目初始化完成总结
2 +
3 +**完成时间**: 2026-02-05
4 +
5 +---
6 +
7 +## ✅ 已完成的工作
8 +
9 +### 1. 文档系统建立
10 +
11 +#### 核心文档
12 +-**docs/CHANGELOG.md** - 项目变更日志
13 +-**docs/PROJECT-STATUS.md** - 项目状态报告
14 +-**docs/DEVELOPMENT-GUIDE.md** - 开发指南
15 +-**docs/CODING-STANDARDS.md** - 代码规范
16 +-**docs/GIT-WORKFLOW.md** - Git 工作流规范
17 +-**docs/api-integration-log.md** - API 集成日志
18 +-**docs/lessons-learned.md** - 经验教训总结
19 +-**docs/README-TEMPLATE.md** - README 模板(可用于替换根目录的简单版本)
20 +
21 +#### 目录结构
22 +```
23 +docs/
24 +├── CHANGELOG.md # 变更日志
25 +├── PROJECT-STATUS.md # 项目状态
26 +├── DEVELOPMENT-GUIDE.md # 开发指南
27 +├── CODING-STANDARDS.md # 代码规范
28 +├── GIT-WORKFLOW.md # Git 工作流
29 +├── api-integration-log.md # API 日志
30 +├── lessons-learned.md # 经验教训
31 +├── README-TEMPLATE.md # README 模板
32 +├── reports/ # 代码审查和分析报告
33 +│ └── YYYY-MM-DD/ # 按日期组织
34 +└── tasks/ # 任务管理
35 + ├── done/ # 已完成任务
36 + ├── plan/ # 进行中任务
37 + └── ideas/ # 需求池
38 +```
39 +
40 +### 2. 测试框架配置
41 +
42 +#### 测试工具
43 +-**vitest.config.js** - Vitest 测试配置
44 +-**test/setup.js** - 测试环境设置(Mock Taro API、wx API、axios)
45 +-**src/utils/tools.test.js** - 工具函数测试示例
46 +-**test/components/PrimaryButton.test.js** - 组件测试示例
47 +
48 +#### 测试脚本(已添加到 package.json)
49 +```bash
50 +pnpm run test # 运行测试
51 +pnpm run test:ui # 测试 UI 界面
52 +pnpm run test:coverage # 测试覆盖率
53 +pnpm run test:run # 运行测试(CI 模式)
54 +```
55 +
56 +### 3. 代码质量工具
57 +
58 +#### ESLint 配置
59 +-**.eslintrc.js** - 完善的 ESLint 配置
60 + - 扩展 `taro/vue3` 规则
61 + - 自定义规则(no-console, prefer-const, eqeqeq 等)
62 + - Taro 全局变量配置(wx, Taro)
63 +
64 +#### Prettier 配置
65 +-**.prettierrc** - Prettier 格式化配置
66 +-**.prettierignore** - 忽略文件配置
67 +
68 +#### 脚本命令
69 +```bash
70 +pnpm run lint # ESLint 检查
71 +pnpm run format # Prettier 格式化
72 +```
73 +
74 +### 4. 项目配置优化
75 +
76 +#### package.json 更新
77 +- ✅ 添加测试相关依赖:
78 + - `@vitejs/plugin-vue`
79 + - `@vitest/coverage-v8`
80 + - `@vue/test-utils`
81 + - `vitest`
82 + - `jsdom`
83 + - `prettier`
84 +- ✅ 添加测试和格式化脚本
85 +
86 +#### .gitignore 优化
87 +- ✅ 添加测试覆盖率目录(coverage/)
88 +- ✅ 添加缓存文件(.cache, .tsbuildinfo)
89 +- ✅ 添加日志文件(*.log, logs/)
90 +- ✅ 添加编辑器配置(.vscode/, .idea/)
91 +
92 +---
93 +
94 +## 📦 后续需要安装的依赖
95 +
96 +运行以下命令安装新增的依赖:
97 +
98 +```bash
99 +# 安装测试依赖
100 +pnpm add -D vitest @vitejs/plugin-vue @vitest/coverage-v8 @vue/test-utils jsdom
101 +
102 +# 安装代码质量工具
103 +pnpm add -D prettier
104 +```
105 +
106 +---
107 +
108 +## 🎯 后续建议
109 +
110 +### 短期(1-2 周)
111 +
112 +#### 1. 添加 Git Hooks(推荐)
113 +
114 +```bash
115 +# 安装 Husky 和 lint-staged
116 +pnpm add -D husky lint-staged
117 +
118 +# 初始化 Husky
119 +pnpm prepare
120 +
121 +# 配置 pre-commit hook
122 +```
123 +
124 +**.husky/pre-commit**:
125 +```bash
126 +#!/bin/sh
127 +. "$(dirname "$0")/_/husky.sh"
128 +
129 +pnpm lint
130 +pnpm test:run
131 +```
132 +
133 +**package.json**:
134 +```json
135 +{
136 + "lint-staged": {
137 + "*.{js,vue}": [
138 + "eslint --fix",
139 + "prettier --write"
140 + ]
141 + }
142 +}
143 +```
144 +
145 +#### 2. 替换根目录 README
146 +
147 +```bash
148 +# 使用 docs/README-TEMPLATE.md 替换根目录的简单版本
149 +cp docs/README-TEMPLATE.md ../README.md
150 +```
151 +
152 +#### 3. 编写核心功能测试
153 +
154 +优先为以下模块编写测试:
155 +- `src/utils/tools.js` - 工具函数
156 +- `src/components/PrimaryButton.vue` - 基础组件
157 +- `src/api/user.js` - 用户 API
158 +
159 +### 中期(1 个月)
160 +
161 +#### 1. 添加 E2E 测试
162 +
163 +```bash
164 +# 安装 Playwright
165 +pnpm add -D @playwright/test
166 +
167 +# 创建 E2E 测试
168 +mkdir -p e2e
169 +```
170 +
171 +**e2e/login.spec.js**:
172 +```javascript
173 +import { test, expect } from '@playwright/test'
174 +
175 +test('should login successfully', async ({ page }) => {
176 + await page.goto('/pages/login/index')
177 + await page.fill('input[name="phone"]', '13800138000')
178 + await page.click('button[type="submit"]')
179 + await expect(page).toHaveURL('/pages/dashboard/index')
180 +})
181 +```
182 +
183 +#### 2. 添加 CI/CD 配置
184 +
185 +创建 `.github/workflows/ci.yml`:
186 +```yaml
187 +name: CI
188 +
189 +on: [push, pull_request]
190 +
191 +jobs:
192 + test:
193 + runs-on: ubuntu-latest
194 + steps:
195 + - uses: actions/checkout@v3
196 + - uses: pnpm/action-setup@v2
197 + - uses: actions/setup-node@v3
198 + - run: pnpm install
199 + - run: pnpm run lint
200 + - run: pnpm run test:run
201 + - run: pnpm run build:weapp
202 +```
203 +
204 +#### 3. 性能监控
205 +
206 +```bash
207 +# 安装 web-vitals
208 +pnpm add web-vitals
209 +```
210 +
211 +在关键页面添加性能监控:
212 +```javascript
213 +import { onLCP, onFID, onCLS } from 'web-vitals'
214 +
215 +onLCP(console.log)
216 +onFID(console.log)
217 +onCLS(console.log)
218 +```
219 +
220 +### 长期(3 个月)
221 +
222 +#### 1. TypeScript 迁移(可选)
223 +
224 +```bash
225 +# 项目已配置 TypeScript(tsconfig.json)
226 +# 可以逐步迁移 .js 文件到 .ts
227 +```
228 +
229 +#### 2. 组件库文档化
230 +
231 +```bash
232 +# 安装文档工具
233 +pnpm add -D vitepress
234 +```
235 +
236 +创建组件库文档站点。
237 +
238 +#### 3. 监控和错误追踪
239 +
240 +集成错误监控服务(如 Sentry)。
241 +
242 +---
243 +
244 +## 📚 文档使用指南
245 +
246 +### 开发前必读
247 +
248 +1. **CLAUDE.md** - 项目完整指南
249 +2. **DEVELOPMENT-GUIDE.md** - 开发规范和最佳实践
250 +3. **CODING-STANDARDS.md** - 代码风格和命名规范
251 +
252 +### 开发过程中
253 +
254 +1. **GIT-WORKFLOW.md** - Git 分支和提交规范
255 +2. **lessons-learned.md** - 避免重复踩坑
256 +3. **api-integration-log.md** - API 接口文档
257 +
258 +### 代码审查
259 +
260 +1. **CODING-STANDARDS.md** - 代码检查清单
261 +2. **PROJECT-STATUS.md** - 了解项目规模和架构
262 +
263 +### 项目维护
264 +
265 +1. **CHANGELOG.md** - 更新变更日志
266 +2. **docs/reports/** - 存放代码审查和性能分析报告
267 +
268 +---
269 +
270 +## 🎉 总结
271 +
272 +通过本次初始化,项目已具备:
273 +
274 +1.**完善的文档体系** - 8 个核心文档 + 目录结构
275 +2.**测试框架配置** - Vitest + 测试示例
276 +3.**代码质量工具** - ESLint + Prettier
277 +4.**规范的工作流** - Git 规范 + 代码规范
278 +5.**经验教训积累** - lessons-learned.md
279 +
280 +现在可以开始高效开发了!🚀
281 +
282 +---
283 +
284 +## 📞 需要帮助?
285 +
286 +- 查看项目文档:`docs/` 目录
287 +- 查看项目指南:`CLAUDE.md`
288 +- 查看经验教训:`docs/lessons-learned.md`
289 +
290 +---
291 +
292 +**初始化完成日期**: 2026-02-05
293 +**维护者**: Claude Code
1 +# 项目状态报告
2 +
3 +**更新时间**: 2026-02-05
4 +**项目名称**: lls_program (老来赛)
5 +**技术栈**: Taro 4.1.7 + Vue 3.3 + NutUI 4.3.13
6 +
7 +---
8 +
9 +## 📋 项目概述
10 +
11 +**老来赛** 是一个基于 Taro 4 + Vue 3 的微信小程序,专注于家庭活动和积分奖励管理。
12 +
13 +**核心功能**
14 +- 家庭管理(创建、加入、编辑)
15 +- 积分系统(获取、兑换、排行榜)
16 +- 打卡活动(上传照片、分享海报)
17 +- 优惠券系统
18 +
19 +---
20 +
21 +## 🎯 开发环境状态
22 +
23 +### ✅ 已配置
24 +
25 +| 项目 | 状态 | 说明 |
26 +|------|------|------|
27 +| **构建工具** | ✅ 完成 | Webpack 5 + Taro CLI |
28 +| **UI 组件库** | ✅ 完成 | NutUI Taro 4.3.13(自动导入) |
29 +| **样式方案** | ✅ 完成 | TailwindCSS 3.4 + Less |
30 +| **状态管理** | ✅ 完成 | Pinia 3.0 + taro-plugin-pinia |
31 +| **HTTP 客户端** | ✅ 完成 | axios-miniprogram 2.7.2 |
32 +| **路径别名** | ✅ 完成 | @/utils、@/components 等 |
33 +| **代码规范** | ✅ 完成 | ESLint + EditorConfig |
34 +| **认证系统** | ✅ 完成 | sessionid 认证(静默授权) |
35 +
36 +### ⚠️ 待配置
37 +
38 +| 项目 | 优先级 | 建议工具 | 说明 |
39 +|------|--------|----------|------|
40 +| **单元测试** | 🔴 高 | Vitest | 测试工具函数、Composables |
41 +| **E2E 测试** | 🟡 中 | Playwright | 关键流程测试 |
42 +| **Git Hooks** | 🟡 中 | Husky + lint-staged | 提交前自动检查 |
43 +| **CI/CD** | 🟢 低 | GitHub Actions | 自动化部署 |
44 +
45 +---
46 +
47 +## 📊 项目规模统计
48 +
49 +| 类别 | 数量 |
50 +|------|------|
51 +| **页面** | 36 个 |
52 +| **组件** | 22 个 |
53 +| **API 模块** | 12 个 |
54 +| **Store** | 4 个 |
55 +| **工具函数** | 7 个 |
56 +
57 +---
58 +
59 +## 🏗️ 架构特点
60 +
61 +### 双设计宽度配置
62 +
63 +```javascript
64 +// config/index.js
65 +designWidth (input) {
66 + // NutUI 组件:375px
67 + if (input?.file?.indexOf('@nutui') > -1) {
68 + return 375
69 + }
70 + // 其他内容:750px(Taro 标准)
71 + return 750
72 +}
73 +```
74 +
75 +### 认证机制
76 +
77 +- **SessionID 存储**`wx.storage` 中的 `sessionid`
78 +- **请求拦截器**:自动注入 `config.headers.cookie`
79 +- **401 处理**:自动清除 sessionid 并跳转登录
80 +- **静默授权**:支持无感知登录流程
81 +
82 +### API 响应格式
83 +
84 +```javascript
85 +{
86 + code: 1, // 1 = 成功
87 + data: {...}, // 响应数据
88 + msg: "message" // 消息
89 +}
90 +```
91 +
92 +**重要**:检查 `res.code === 1` 判断成功(不是 `res.code`
93 +
94 +---
95 +
96 +## 📁 目录结构
97 +
98 +```
99 +src/
100 +├── api/ # API 接口(按业务领域组织)
101 +│ ├── common.js # 短信验证码、上传凭证
102 +│ ├── user.js # 用户认证和个人信息
103 +│ ├── family.js # 家庭管理
104 +│ ├── points.js # 积分/奖励系统
105 +│ ├── photo.js # 照片/媒体处理
106 +│ └── ...
107 +├── components/ # 可复用组件(22 个)
108 +├── composables/ # Vue 3 组合式函数
109 +├── pages/ # Taro 页面(36 个)
110 +├── stores/ # Pinia 状态管理
111 +├── utils/ # 工具函数
112 +├── assets/ # 静态资源
113 +├── app.config.js # Taro 应用配置
114 +├── app.js # 应用入口
115 +└── app.less # 全局样式
116 +```
117 +
118 +---
119 +
120 +## 🔧 开发命令
121 +
122 +```bash
123 +# 安装依赖
124 +pnpm install
125 +
126 +# 开发(微信小程序)
127 +pnpm run dev:weapp
128 +
129 +# 开发(H5)
130 +pnpm run dev:h5
131 +
132 +# 生产构建
133 +pnpm run build:weapp
134 +
135 +# 代码检查
136 +pnpm run lint
137 +```
138 +
139 +---
140 +
141 +## 📚 已有文档
142 +
143 +| 文档 | 路径 | 说明 |
144 +|------|------|------|
145 +| **项目指南** | CLAUDE.md | 完整的开发指南 |
146 +| **迁移指南** | 快速迁移指南.md | 静默授权功能迁移 |
147 +| **合规分析** | 微信小程序审核合规性分析报告.md | 小程序审核要点 |
148 +
149 +---
150 +
151 +## ⚡ 性能优化建议
152 +
153 +### 已实施
154 +
155 +- ✅ NutUI 组件自动导入(按需加载)
156 +- ✅ TailwindCSS Preflight 禁用(小程序不需要)
157 +- ✅ 路径别名配置(避免复杂相对路径)
158 +
159 +### 待优化
160 +
161 +- ⚠️ 图片 CDN 优化(已使用 cdn.ipadbiz.cn,可添加参数优化)
162 +- ⚠️ 长列表虚拟滚动(如有大量数据列表)
163 +- ⚠️ 路由懒加载(页面级代码分割)
164 +
165 +---
166 +
167 +## 🚨 已知问题
168 +
169 +### 1. 测试缺失
170 +
171 +**影响**:代码质量无保障,重构风险高
172 +
173 +**解决方案**
174 +- 添加 Vitest 进行单元测试
175 +- 添加 Playwright 进行 E2E 测试
176 +- 目标覆盖率:> 80%
177 +
178 +### 2. 缺少 CHANGELOG
179 +
180 +**影响**:变更历史不清晰,版本管理混乱
181 +
182 +**解决方案**:✅ 已创建 docs/CHANGELOG.md
183 +
184 +### 3. 缺少开发规范文档
185 +
186 +**影响**:团队协作效率低,代码风格不统一
187 +
188 +**解决方案**:✅ 已创建 docs/DEVELOPMENT-GUIDE.md
189 +
190 +---
191 +
192 +## 📌 开发注意事项
193 +
194 +### ❌ 禁止使用 Web API
195 +
196 +```javascript
197 +// 错误 - 会导致小程序崩溃
198 +window.document.getElementById()
199 +localStorage
200 +window.location.href
201 +fetch()
202 +```
203 +
204 +### ✅ 必须使用 Taro API
205 +
206 +```javascript
207 +// 正确
208 +Taro.createSelectorQuery()
209 +Taro.getStorage()
210 +Taro.navigateTo()
211 +Taro.request()
212 +```
213 +
214 +### 🔑 SessionID 管理
215 +
216 +```javascript
217 +// 请求拦截器自动注入
218 +service.interceptors.request.use(config => {
219 + const sessionid = getSessionId() // 从 wx.storage 读取
220 + if (sessionid) {
221 + config.headers.cookie = sessionid
222 + }
223 + return config
224 +})
225 +```
226 +
227 +---
228 +
229 +## 🎯 下一步计划
230 +
231 +### 短期(1-2周)
232 +
233 +- [ ] 添加 Vitest 单元测试
234 +- [ ] 添加 Git Hooks(Husky + lint-staged)
235 +- [ ] 完善核心功能的文档
236 +
237 +### 中期(1个月)
238 +
239 +- [ ] 添加 Playwright E2E 测试
240 +- [ ] 性能优化(图片、长列表)
241 +- [ ] CI/CD 配置
242 +
243 +### 长期(3个月)
244 +
245 +- [ ] TypeScript 迁移(可选)
246 +- [ ] 组件库文档化
247 +- [ ] 监控和错误追踪
248 +
249 +---
250 +
251 +**维护者**: 开发团队
252 +**最后更新**: 2026-02-05
1 +# 老来赛 (lls_program)
2 +
3 +> 基于 Taro 4 + Vue 3 + NutUI 的微信小程序 - 家庭活动和积分奖励管理系统
4 +
5 +[![Taro](https://img.shields.io/badge/Taro-4.1.7-blue)](https://docs.taro.zone/)
6 +[![Vue](https://img.shields.io/badge/Vue-3.3-green)](https://cn.vuejs.org/)
7 +[![NutUI](https://img.shields.io/badge/NutUI-4.3.13-orange)](https://nutui.jd.com/4/taro/)
8 +
9 +---
10 +
11 +## 📖 项目简介
12 +
13 +**老来赛** 是一个专注于家庭活动和积分奖励管理的微信小程序,提供以下核心功能:
14 +
15 +- 🏠 **家庭管理** - 创建家庭、邀请成员、管理成员权限
16 +- 💎 **积分系统** - 获取积分、兑换奖励、排行榜竞争
17 +- 📸 **打卡活动** - 上传照片、生成海报、分享成就
18 +- 🎁 **优惠券** - 积分兑换、优惠券管理
19 +
20 +---
21 +
22 +## 🚀 快速开始
23 +
24 +### 环境要求
25 +
26 +- **Node.js** >= 16.x
27 +- **pnpm** >= 8.x(推荐)或 npm >= 8.x
28 +- **微信开发者工具** [下载地址](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)
29 +
30 +### 安装依赖
31 +
32 +```bash
33 +# 使用 pnpm(推荐)
34 +pnpm install
35 +
36 +# 或使用 npm
37 +npm install
38 +```
39 +
40 +### 开发模式
41 +
42 +```bash
43 +# 微信小程序
44 +pnpm run dev:weapp
45 +
46 +# H5
47 +pnpm run dev:h5
48 +
49 +# 支付宝小程序
50 +pnpm run dev:alipay
51 +
52 +# 抖音小程序
53 +pnpm run dev:tt
54 +```
55 +
56 +### 构建生产版本
57 +
58 +```bash
59 +# 微信小程序
60 +pnpm run build:weapp
61 +
62 +# H5
63 +pnpm run build:h5
64 +```
65 +
66 +### 在微信开发者工具中打开
67 +
68 +1. 打开微信开发者工具
69 +2. 导入项目,选择 `dist/` 目录
70 +3. AppID 使用测试号或自己的 AppID
71 +
72 +---
73 +
74 +## 📚 文档导航
75 +
76 +### 核心文档
77 +
78 +- **[CLAUDE.md](../CLAUDE.md)** - 完整的项目开发指南
79 +- **[项目状态报告](PROJECT-STATUS.md)** - 项目当前状态和规模
80 +- **[开发指南](DEVELOPMENT-GUIDE.md)** - 开发规范和最佳实践
81 +- **[代码规范](CODING-STANDARDS.md)** - 命名、注释、测试规范
82 +- **[Git 工作流](GIT-WORKFLOW.md)** - 分支策略和提交规范
83 +
84 +### 技术文档
85 +
86 +- **[API 集成日志](api-integration-log.md)** - API 接口文档和集成经验
87 +- **[快速迁移指南](../快速迁移指南.md)** - 静默授权功能迁移
88 +- **[微信小程序审核合规性分析报告](../微信小程序审核合规性分析报告.md)** - 合规性要点
89 +
90 +---
91 +
92 +## 🛠️ 技术栈
93 +
94 +### 核心框架
95 +
96 +- **Taro 4.1.7** - 跨平台小程序开发框架
97 +- **Vue 3.3** - 渐进式 JavaScript 框架
98 +- **Pinia 3.0** - Vue 3 状态管理
99 +
100 +### UI 组件
101 +
102 +- **NutUI Taro 4.3.13** - 京东 Vue 3 移动端组件库(自动导入)
103 +
104 +### 样式方案
105 +
106 +- **TailwindCSS 3.4** - 原子化 CSS 框架
107 +- **Less** - CSS 预处理器
108 +
109 +### HTTP 客户端
110 +
111 +- **axios-miniprogram 2.7.2** - 小程序 HTTP 客户端
112 +
113 +---
114 +
115 +## 📁 项目结构
116 +
117 +```
118 +src/
119 +├── api/ # API 接口(按业务领域组织)
120 +├── assets/ # 静态资源(图片、样式)
121 +├── components/ # 可复用组件(22 个)
122 +├── composables/ # Vue 3 组合式函数
123 +├── pages/ # Taro 页面(36 个)
124 +│ ├── Dashboard/ # 仪表盘(首页)
125 +│ ├── MyFamily/ # 我的家庭
126 +│ ├── Activities/ # 活动列表
127 +│ └── ...
128 +├── stores/ # Pinia 状态管理
129 +├── utils/ # 工具函数
130 +│ ├── request.js # HTTP 请求拦截器
131 +│ ├── authRedirect.js # 静默授权
132 +│ └── tools.js # 通用工具
133 +├── app.config.js # Taro 应用配置
134 +├── app.js # 应用入口
135 +└── app.less # 全局样式
136 +```
137 +
138 +---
139 +
140 +## 🔑 核心特性
141 +
142 +### 双设计宽度配置
143 +
144 +```javascript
145 +// NutUI 组件:375px
146 +// 其他内容:750px(Taro 标准)
147 +
148 +designWidth (input) {
149 + if (input?.file?.indexOf('@nutui') > -1) {
150 + return 375
151 + }
152 + return 750
153 +}
154 +```
155 +
156 +### SessionID 认证机制
157 +
158 +```javascript
159 +// 请求拦截器自动注入 sessionid
160 +service.interceptors.request.use(config => {
161 + const sessionid = getSessionId() // 从 wx.storage 读取
162 + if (sessionid) {
163 + config.headers.cookie = sessionid
164 + }
165 + return config
166 +})
167 +```
168 +
169 +### 401 自动处理
170 +
171 +```javascript
172 +// 响应拦截器自动处理 401
173 +service.interceptors.response.use(
174 + response => response,
175 + error => {
176 + if (error.response?.status === 401) {
177 + // 清除 sessionid 并跳转登录
178 + wx.removeStorageSync('sessionid')
179 + Taro.reLaunch({ url: '/pages/login/index' })
180 + }
181 + return Promise.reject(error)
182 + }
183 +)
184 +```
185 +
186 +---
187 +
188 +## 📋 开发命令
189 +
190 +```bash
191 +# 开发
192 +pnpm run dev:weapp # 微信小程序
193 +pnpm run dev:h5 # H5
194 +pnpm run dev:alipay # 支付宝小程序
195 +
196 +# 构建
197 +pnpm run build:weapp # 微信小程序
198 +pnpm run build:h5 # H5
199 +
200 +# 代码检查(待添加)
201 +pnpm run lint # ESLint 检查
202 +pnpm run format # Prettier 格式化
203 +
204 +# 测试(待添加)
205 +pnpm run test # 单元测试
206 +pnpm run test:e2e # E2E 测试
207 +```
208 +
209 +---
210 +
211 +## 🎯 开发注意事项
212 +
213 +### ❌ 禁止使用 Web API
214 +
215 +```javascript
216 +// 错误 - 会导致小程序崩溃
217 +window.document.getElementById()
218 +localStorage
219 +window.location.href
220 +fetch()
221 +```
222 +
223 +### ✅ 必须使用 Taro API
224 +
225 +```javascript
226 +// 正确
227 +Taro.createSelectorQuery()
228 +Taro.getStorage()
229 +Taro.navigateTo()
230 +Taro.request()
231 +```
232 +
233 +### API 响应检查
234 +
235 +```javascript
236 +// ✅ 正确 - 检查 res.code === 1
237 +if (res.code === 1) {
238 + // 处理成功
239 +}
240 +
241 +// ❌ 错误 - 不检查或错误检查
242 +if (res.code) { // 错误
243 + // ...
244 +}
245 +```
246 +
247 +---
248 +
249 +## 📊 项目统计
250 +
251 +| 类别 | 数量 |
252 +|------|------|
253 +| **页面** | 36 个 |
254 +| **组件** | 22 个 |
255 +| **API 模块** | 12 个 |
256 +| **Store** | 4 个 |
257 +| **工具函数** | 7 个 |
258 +
259 +---
260 +
261 +## 🤝 贡献指南
262 +
263 +欢迎贡献代码!请遵循以下步骤:
264 +
265 +1. Fork 本仓库
266 +2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
267 +3. 提交更改 (`git commit -m 'feat: 添加某个功能'`)
268 +4. 推送到分支 (`git push origin feature/AmazingFeature`)
269 +5. 创建 Pull Request
270 +
271 +### Commit Message 规范
272 +
273 +```
274 +feat: 新功能
275 +fix: Bug 修复
276 +docs: 文档更新
277 +style: 代码格式(不影响功能)
278 +refactor: 重构
279 +perf: 性能优化
280 +test: 测试相关
281 +chore: 构建/工具链相关
282 +```
283 +
284 +详见 [Git 工作流规范](GIT-WORKFLOW.md)
285 +
286 +---
287 +
288 +## 📄 许可证
289 +
290 +[MIT](LICENSE)
291 +
292 +---
293 +
294 +## 🔗 相关链接
295 +
296 +- [Taro 官方文档](https://docs.taro.zone/)
297 +- [Vue 3 官方文档](https://cn.vuejs.org/)
298 +- [NutUI Taro 文档](https://nutui.jd.com/4/taro/)
299 +- [TailwindCSS 文档](https://tailwindcss.com/)
300 +- [微信小程序开发文档](https://developers.weixin.qq.com/miniprogram/dev/framework/)
301 +
302 +---
303 +
304 +## 📞 联系方式
305 +
306 +如有问题或建议,请提交 Issue 或 Pull Request。
307 +
308 +---
309 +
310 +**开发团队** | **最后更新**: 2026-02-05
1 +# API 集成日志
2 +
3 +**更新时间**: 2026-02-05
4 +
5 +本文档记录项目 API 集成的历史和经验教训。
6 +
7 +---
8 +
9 +## 📡 API 概述
10 +
11 +### API 基础信息
12 +
13 +| 项目 | 值 |
14 +|------|-----|
15 +| **Base URL** | (待配置) |
16 +| **认证方式** | sessionid(存储在 wx.storage) |
17 +| **响应格式** | `{ code, data, msg }` |
18 +| **成功标识** | `code === 1` |
19 +
20 +### API 模块结构
21 +
22 +```
23 +src/api/
24 +├── common.js # 短信验证码、上传凭证
25 +├── user.js # 用户认证和个人信息
26 +├── family.js # 家庭管理
27 +├── points.js # 积分/奖励系统
28 +├── photo.js # 照片/媒体处理
29 +├── organization.js # 组织管理
30 +├── coupon.js # 优惠券
31 +├── feedback.js # 用户反馈
32 +├── map.js # 地图相关
33 +└── fn.js # 通用函数
34 +```
35 +
36 +---
37 +
38 +## 🔑 认证机制
39 +
40 +### SessionID 管理
41 +
42 +#### 获取 SessionID
43 +
44 +```javascript
45 +// src/utils/request.js
46 +const getSessionId = () => {
47 + try {
48 + return wx.getStorageSync('sessionid') || ''
49 + } catch (e) {
50 + console.error('获取 sessionid 失败', e)
51 + return ''
52 + }
53 +}
54 +```
55 +
56 +#### 设置 SessionID
57 +
58 +```javascript
59 +// 登录成功后设置
60 +const loginSuccess = (sessionid) => {
61 + wx.setStorageSync('sessionid', sessionid)
62 +}
63 +
64 +// 小程序授权成功后设置
65 +const authSuccess = (sessionid) => {
66 + wx.setStorageSync('sessionid', sessionid)
67 +}
68 +```
69 +
70 +#### 清除 SessionID
71 +
72 +```javascript
73 +// 401 响应时清除
74 +const clearSessionId = () => {
75 + wx.removeStorageSync('sessionid')
76 +}
77 +
78 +// 用户登出时清除
79 +const logout = () => {
80 + wx.removeStorageSync('sessionid')
81 + Taro.reLaunch({ url: '/pages/login/index' })
82 +}
83 +```
84 +
85 +### 请求拦截器
86 +
87 +```javascript
88 +// src/utils/request.js
89 +service.interceptors.request.use(config => {
90 + // 动态获取 sessionid 并设置到请求头
91 + const sessionid = getSessionId()
92 + if (sessionid) {
93 + config.headers.cookie = sessionid
94 + }
95 + return config
96 +})
97 +```
98 +
99 +---
100 +
101 +## 📋 API 列表
102 +
103 +### 用户相关 (user.js)
104 +
105 +| API | 说明 | 方法 |
106 +|-----|------|------|
107 +| `miniProgramAuthAPI` | 小程序静默授权 | POST |
108 +| `loginAPI` | 用户登录 | POST |
109 +| `getUserInfoAPI` | 获取用户信息 | GET |
110 +| `updateUserInfoAPI` | 更新用户信息 | POST |
111 +
112 +### 家庭相关 (family.js)
113 +
114 +| API | 说明 | 方法 |
115 +|-----|------|------|
116 +| `createFamilyAPI` | 创建家庭 | POST |
117 +| `joinFamilyAPI` | 加入家庭 | POST |
118 +| `getFamilyInfoAPI` | 获取家庭信息 | GET |
119 +| `updateFamilyAPI` | 更新家庭信息 | POST |
120 +
121 +### 积分相关 (points.js)
122 +
123 +| API | 说明 | 方法 |
124 +|-----|------|------|
125 +| `getPointsListAPI` | 获取积分列表 | GET |
126 +| `addPointsAPI` | 添加积分 | POST |
127 +| `deductPointsAPI` | 扣除积分 | POST |
128 +
129 +### 照片相关 (photo.js)
130 +
131 +| API | 说明 | 方法 |
132 +|-----|------|------|
133 +| `uploadPhotoAPI` | 上传照片 | POST |
134 +| `getPhotoListAPI` | 获取照片列表 | GET |
135 +| `deletePhotoAPI` | 删除照片 | POST |
136 +
137 +---
138 +
139 +## 🔌 API 集成最佳实践
140 +
141 +### 1. 统一错误处理
142 +
143 +```javascript
144 +// ✅ 正确 - 完整的错误处理
145 +const fetchData = async () => {
146 + loading.value = true
147 + try {
148 + const res = await yourAPI()
149 + if (res.code === 1) {
150 + dataList.value = res.data
151 + } else {
152 + Taro.showToast({
153 + title: res.msg || '请求失败',
154 + icon: 'none'
155 + })
156 + }
157 + } catch (err) {
158 + console.error('请求失败:', err)
159 + Taro.showToast({
160 + title: '网络异常',
161 + icon: 'none'
162 + })
163 + } finally {
164 + loading.value = false
165 + }
166 +}
167 +```
168 +
169 +### 2. 检查响应格式
170 +
171 +```javascript
172 +// ✅ 正确 - 检查 res.code === 1
173 +if (res.code === 1) {
174 + // 处理成功
175 +}
176 +
177 +// ❌ 错误 - 不检查或错误检查
178 +if (res.code) { // 错误:应该检查 === 1
179 + // ...
180 +}
181 +```
182 +
183 +### 3. 加载状态管理
184 +
185 +```javascript
186 +const loading = ref(false)
187 +const error = ref(null)
188 +
189 +const fetchData = async () => {
190 + loading.value = true
191 + error.value = null
192 + try {
193 + const res = await yourAPI()
194 + if (res.code === 1) {
195 + dataList.value = res.data
196 + } else {
197 + error.value = res.msg
198 + }
199 + } catch (err) {
200 + error.value = err.message
201 + } finally {
202 + loading.value = false
203 + }
204 +}
205 +```
206 +
207 +---
208 +
209 +## ⚠️ 常见问题
210 +
211 +### 问题 1: 401 未授权
212 +
213 +**原因**: sessionid 过期或无效
214 +
215 +**解决方案**:
216 +```javascript
217 +// 响应拦截器自动处理(已实现)
218 +service.interceptors.response.use(
219 + response => response,
220 + error => {
221 + if (error.response?.status === 401) {
222 + // 清除 sessionid
223 + wx.removeStorageSync('sessionid')
224 + // 跳转登录页
225 + Taro.reLaunch({ url: '/pages/login/index' })
226 + }
227 + return Promise.reject(error)
228 + }
229 +)
230 +```
231 +
232 +### 问题 2: 跨域问题
233 +
234 +**原因**: 域名未在微信小程序后台配置
235 +
236 +**解决方案**:
237 +1. 登录微信小程序后台
238 +2. 开发 → 开发管理 → 开发设置
239 +3. 配置服务器域名白名单
240 +
241 +### 问题 3: 请求超时
242 +
243 +**原因**: 网络慢或服务器响应慢
244 +
245 +**解决方案**:
246 +```javascript
247 +// 设置合理的超时时间
248 +const request = axios.create({
249 + timeout: 10000 // 10 秒
250 +})
251 +```
252 +
253 +---
254 +
255 +## 📝 API 变更日志
256 +
257 +### 2026-02-05
258 +
259 +- ✅ 创建 API 集成日志文档
260 +- ✅ 整理现有 API 模块
261 +- ✅ 记录认证机制
262 +
263 +---
264 +
265 +## 🔗 相关文档
266 +
267 +- [CLAUDE.md](../CLAUDE.md) - 项目指南
268 +- [CODING-STANDARDS.md](CODING-STANDARDS.md) - 代码规范
269 +- [DEVELOPMENT-GUIDE.md](DEVELOPMENT-GUIDE.md) - 开发指南
270 +
271 +---
272 +
273 +**维护者**: 开发团队
274 +**最后更新**: 2026-02-05
1 +# 经验教训总结
2 +
3 +**更新时间**: 2026-02-05
4 +
5 +本文档记录项目开发过程中的经验教训,避免重复踩坑。
6 +
7 +---
8 +
9 +## 🔥 核心教训
10 +
11 +### 1. 小程序 ≠ Web + 适配器
12 +
13 +**教训**: Taro 不是简单的"Web + 适配器",而是完全不同的开发范式。
14 +
15 +**问题**:
16 +- 直接使用 `localStorage` 导致小程序崩溃
17 +- 使用 `window.document` 无法操作 DOM
18 +- 使用 `fetch` 发起请求失败
19 +
20 +**解决方案**:
21 +```javascript
22 +// ❌ 错误 - 使用 Web API
23 +localStorage.setItem('key', 'value')
24 +window.document.getElementById()
25 +fetch('/api/data')
26 +
27 +// ✅ 正确 - 使用 Taro API
28 +Taro.setStorage({ key: 'key', data: 'value' })
29 +Taro.createSelectorQuery()
30 +Taro.request({ url: '/api/data' })
31 +```
32 +
33 +**预防措施**:
34 +- 开发前仔细阅读 [Taro 官方文档](https://docs.taro.zone/)
35 +- 参考项目 [CLAUDE.md](../CLAUDE.md) 中的 API 使用规范
36 +- 代码审查时检查是否使用了 Web API
37 +
38 +---
39 +
40 +### 2. SessionID 认证机制的理解偏差
41 +
42 +**教训**: SessionID 前端不用于判断登录状态,而是传递给后端的凭证。
43 +
44 +**问题**:
45 +- 前端通过 sessionid 判断用户是否登录(错误)
46 +- sessionid 过期后前端无法及时感知
47 +
48 +**正确理解**:
49 +```javascript
50 +// ❌ 错误 - 前端判断登录状态
51 +const isLoggedIn = !!getSessionId()
52 +
53 +// ✅ 正确 - 后端通过 401 判断
54 +// 前端只需在请求中携带 sessionid
55 +// 后端返回 401 时前端清除 sessionid 并跳转登录
56 +```
57 +
58 +**预防措施**:
59 +- 阅读 [API 集成日志](api-integration-log.md)
60 +- 参考 `src/utils/request.js` 中的认证处理
61 +- 401 响应由后端判断,前端统一处理
62 +
63 +---
64 +
65 +### 3. API 响应格式检查错误
66 +
67 +**教训**: 必须检查 `res.code === 1`,而不是 `res.code``res.data`
68 +
69 +**问题**:
70 +```javascript
71 +// ❌ 错误 - 不检查或错误检查
72 +const res = await userAPI()
73 +if (res.code) { // 错误:0 也是 truthy
74 + // 处理成功
75 +}
76 +```
77 +
78 +**解决方案**:
79 +```javascript
80 +// ✅ 正确 - 严格检查 === 1
81 +const res = await userAPI()
82 +if (res.code === 1) {
83 + // 处理成功
84 +} else {
85 + // 处理业务错误
86 + Taro.showToast({ title: res.msg, icon: 'none' })
87 +}
88 +```
89 +
90 +**预防措施**:
91 +- 所有 API 调用都检查 `res.code === 1`
92 +- 代码审查时重点检查此模式
93 +- 参考 [代码规范](CODING-STANDARDS.md)
94 +
95 +---
96 +
97 +### 4. 双设计宽度配置的必要性
98 +
99 +**教训**: NutUI 组件和普通内容需要不同的设计宽度。
100 +
101 +**问题**:
102 +- NutUI 组件使用 750px 设计稿时尺寸过大
103 +- 普通内容使用 375px 设计稿时尺寸过小
104 +
105 +**解决方案**:
106 +```javascript
107 +// config/index.js
108 +designWidth (input) {
109 + // NutUI 组件:375px
110 + if (input?.file?.indexOf('@nutui') > -1) {
111 + return 375
112 + }
113 + // 其他内容:750px(Taro 标准)
114 + return 750
115 +}
116 +```
117 +
118 +**预防措施**:
119 +- 项目初始化时配置好双设计宽度
120 +- 新增 NutUI 组件时注意尺寸问题
121 +- 参考项目配置文件
122 +
123 +---
124 +
125 +### 5. 生命周期 Hook 的正确使用
126 +
127 +**教训**: Taro 页面组件必须使用 Taro 生命周期 Hook,而非 Vue 生命周期。
128 +
129 +**问题**:
130 +```javascript
131 +// ❌ 错误 - 使用 Vue 生命周期
132 +import { onMounted } from 'vue'
133 +onMounted(() => {
134 + // 可能不按预期工作
135 +})
136 +```
137 +
138 +**解决方案**:
139 +```javascript
140 +// ✅ 正确 - 使用 Taro 生命周期
141 +import { useLoad, useShow, useReady } from '@tarojs/taro'
142 +
143 +useLoad((options) => {
144 + // 页面加载(只触发一次)- 适合获取路由参数
145 +})
146 +
147 +useShow(() => {
148 + // 页面显示(每次显示都触发)- 适合刷新数据
149 +})
150 +
151 +useReady(() => {
152 + // 页面首次渲染完成
153 +})
154 +```
155 +
156 +**预防措施**:
157 +- 页面组件始终使用 `useLoad` / `useShow` / `useReady`
158 +- Vue 生命周期仅用于非页面组件
159 +- 参考项目 [CLAUDE.md](../CLAUDE.md)
160 +
161 +---
162 +
163 +## 📚 最佳实践总结
164 +
165 +### 1. 组件拆分原则
166 +
167 +**原则**: 单一职责、可复用、易测试。
168 +
169 +**示例**:
170 +```
171 +✅ 好的组件
172 +- UserCard.vue - 展示用户信息
173 +- PointsCollector.vue - 积分收集器
174 +- FamilyAlbum.vue - 家庭相册
175 +
176 +❌ 避免的组件
177 +- UserProfileAndSettingsAndOrders.vue - 职责混乱
178 +- BigComponent.vue - 难以维护和测试
179 +```
180 +
181 +### 2. API 调用封装
182 +
183 +**原则**: 统一封装、错误处理、加载状态。
184 +
185 +**示例**:
186 +```javascript
187 +// ✅ 好的封装
188 +const fetchData = async () => {
189 + loading.value = true
190 + try {
191 + const res = await yourAPI()
192 + if (res.code === 1) {
193 + dataList.value = res.data
194 + } else {
195 + Taro.showToast({ title: res.msg, icon: 'none' })
196 + }
197 + } catch (err) {
198 + Taro.showToast({ title: '网络异常', icon: 'none' })
199 + } finally {
200 + loading.value = false
201 + }
202 +}
203 +```
204 +
205 +### 3. 样式管理
206 +
207 +**原则**: TailwindCSS 优先(80%)、Less 补充(20%)。
208 +
209 +**示例**:
210 +```vue
211 +<template>
212 + <!-- TailwindCSS 用于布局、间距、颜色 -->
213 + <view class="flex items-center justify-between p-4 bg-white">
214 + <text class="text-xl font-bold">标题</text>
215 + </view>
216 +</template>
217 +
218 +<style lang="less" scoped>
219 +/* Less 用于深度选择器、动画 */
220 +.custom-element :deep(.nut-popup) {
221 + background-color: #fff;
222 +}
223 +
224 +@keyframes slide-in {
225 + from { transform: translateX(-100%); }
226 + to { transform: translateX(0); }
227 +}
228 +</style>
229 +```
230 +
231 +### 4. 命名规范
232 +
233 +**原则**: 清晰、一致、符合惯例。
234 +
235 +**示例**:
236 +```javascript
237 +// 组件:PascalCase
238 +UserCard.vue
239 +PointsCollector.vue
240 +
241 +// 函数:camelCase + 动词开头
242 +const fetchData = () => {}
243 +const handleSubmit = () => {}
244 +const formatDate = () => {}
245 +
246 +// 变量:camelCase
247 +const userList = ref([])
248 +const isLoading = ref(false)
249 +
250 +// 常量:UPPER_CASE
251 +const MAX_COUNT = 100
252 +const API_BASE_URL = 'https://api.example.com'
253 +```
254 +
255 +---
256 +
257 +## 🚫 常见陷阱
258 +
259 +### 陷阱 1: 直接修改 props
260 +
261 +```javascript
262 +// ❌ 错误
263 +props.userName = 'new name'
264 +
265 +// ✅ 正确
266 +emit('update:userName', 'new name')
267 +```
268 +
269 +### 陷阱 2: 解构 props 丢失响应性
270 +
271 +```javascript
272 +// ❌ 错误
273 +const { userName } = props
274 +
275 +// ✅ 正确
276 +const { userName } = toRefs(props)
277 +```
278 +
279 +### 陷阱 3: 在模板中调用方法
280 +
281 +```vue
282 +<!-- ❌ 错误 - 每次渲染都执行 -->
283 +<div>{{ formatDate(item.date) }}</div>
284 +
285 +<!-- ✅ 正确 - 使用 computed -->
286 +<div>{{ formattedDate }}</div>
287 +```
288 +
289 +### 陷阱 4: 滥用 deep: true
290 +
291 +```javascript
292 +// ❌ 性能问题
293 +watch(largeObject, handler, { deep: true })
294 +
295 +// ✅ 优化 - 监听具体属性
296 +watch(() => largeObject.value.nested.prop, handler)
297 +```
298 +
299 +---
300 +
301 +## 💡 性能优化建议
302 +
303 +### 1. 长列表优化
304 +
305 +```javascript
306 +// 使用虚拟滚动(如有大量数据)
307 +// 或使用分页加载
308 +const page = ref(1)
309 +const loadMore = async () => {
310 + const res = await getMoreData(page.value)
311 + dataList.value.push(...res.data)
312 + page.value++
313 +}
314 +```
315 +
316 +### 2. 图片优化
317 +
318 +```javascript
319 +// CDN 图片优化
320 +function optimizeImageUrl(url, width = 750, quality = 70) {
321 + if (!url.includes('cdn.ipadbiz.cn')) return url
322 + return `${url}?imageMogr2/thumbnail/${width}x/quality/${quality}`
323 +}
324 +```
325 +
326 +### 3. 计算属性缓存
327 +
328 +```javascript
329 +// ✅ 使用 computed(缓存)
330 +const totalPrice = computed(() => {
331 + return items.value.reduce((sum, item) => sum + item.price, 0)
332 +})
333 +
334 +// ❌ 避免方法(每次重新计算)
335 +const getTotalPrice = () => {
336 + return items.value.reduce((sum, item) => sum + item.price, 0)
337 +}
338 +```
339 +
340 +---
341 +
342 +## 📖 推荐阅读
343 +
344 +### 项目文档
345 +
346 +- [CLAUDE.md](../CLAUDE.md) - 完整的开发指南
347 +- [代码规范](CODING-STANDARDS.md) - 代码风格和命名
348 +- [开发指南](DEVELOPMENT-GUIDE.md) - 开发最佳实践
349 +
350 +### 外部资源
351 +
352 +- [Taro 官方文档](https://docs.taro.zone/)
353 +- [Vue 3 官方文档](https://cn.vuejs.org/)
354 +- [NutUI Taro 文档](https://nutui.jd.com/4/taro/)
355 +- [小程序开发文档](https://developers.weixin.qq.com/miniprogram/dev/framework/)
356 +
357 +---
358 +
359 +## 🔄 持续更新
360 +
361 +本文档会持续更新,记录新的经验教训。
362 +
363 +**更新频率**: 每次遇到重要问题后更新
364 +**维护者**: 开发团队
365 +**最后更新**: 2026-02-05
366 +
367 +---
368 +
369 +## 📝 如何添加新经验
370 +
371 +遇到新的问题后,按以下格式添加到本文档:
372 +
373 +```markdown
374 +### 问题标题
375 +
376 +**教训**: 简短描述
377 +
378 +**问题**:
379 +- 问题描述
380 +
381 +**解决方案**:
382 +```javascript
383 +// 代码示例
384 +```
385 +
386 +**预防措施**:
387 +- 如何避免
388 +```
389 +
390 +---
391 +
392 +**维护者**: 开发团队
393 +**最后更新**: 2026-02-05
...@@ -26,7 +26,14 @@ ...@@ -26,7 +26,14 @@
26 "dev:rn": "npm run build:rn -- --watch", 26 "dev:rn": "npm run build:rn -- --watch",
27 "dev:qq": "npm run build:qq -- --watch", 27 "dev:qq": "npm run build:qq -- --watch",
28 "dev:quickapp": "npm run build:quickapp -- --watch", 28 "dev:quickapp": "npm run build:quickapp -- --watch",
29 - "postinstall": "weapp-tw patch" 29 + "postinstall": "weapp-tw patch",
30 + "prepare": "husky install",
31 + "test": "vitest",
32 + "test:ui": "vitest --ui",
33 + "test:coverage": "vitest --coverage",
34 + "test:run": "vitest run",
35 + "lint": "eslint ./src --ext .vue,.js",
36 + "format": "prettier --write \"src/**/*.{js,vue,less}\""
30 }, 37 },
31 "browserslist": [ 38 "browserslist": [
32 "last 3 versions", 39 "last 3 versions",
...@@ -67,20 +74,37 @@ ...@@ -67,20 +74,37 @@
67 "@tarojs/webpack5-runner": "4.1.7", 74 "@tarojs/webpack5-runner": "4.1.7",
68 "@types/node": "^24.3.0", 75 "@types/node": "^24.3.0",
69 "@types/webpack-env": "^1.13.6", 76 "@types/webpack-env": "^1.13.6",
77 + "@vitejs/plugin-vue": "^5.2.4",
78 + "@vitest/coverage-v8": "^1.6.1",
70 "@vue/babel-plugin-jsx": "^1.0.6", 79 "@vue/babel-plugin-jsx": "^1.0.6",
71 "@vue/compiler-sfc": "^3.0.0", 80 "@vue/compiler-sfc": "^3.0.0",
81 + "@vue/test-utils": "^2.4.6",
72 "autoprefixer": "^10.4.21", 82 "autoprefixer": "^10.4.21",
73 "babel-preset-taro": "4.1.7", 83 "babel-preset-taro": "4.1.7",
74 "css-loader": "3.4.2", 84 "css-loader": "3.4.2",
75 "eslint": "^8.12.0", 85 "eslint": "^8.12.0",
76 "eslint-config-taro": "4.1.7", 86 "eslint-config-taro": "4.1.7",
87 + "husky": "^9.1.7",
88 + "jsdom": "^24.1.3",
89 + "lint-staged": "^16.2.7",
77 "postcss": "^8.5.6", 90 "postcss": "^8.5.6",
91 + "prettier": "^3.0.0",
78 "style-loader": "1.3.0", 92 "style-loader": "1.3.0",
79 "tailwindcss": "^3.4.0", 93 "tailwindcss": "^3.4.0",
80 "typescript": "^5.9.2", 94 "typescript": "^5.9.2",
81 "unplugin-vue-components": "^0.26.0", 95 "unplugin-vue-components": "^0.26.0",
96 + "vitest": "^1.6.1",
82 "vue-loader": "^17.0.0", 97 "vue-loader": "^17.0.0",
83 "weapp-tailwindcss": "^4.1.10", 98 "weapp-tailwindcss": "^4.1.10",
84 "webpack": "5.78.0" 99 "webpack": "5.78.0"
100 + },
101 + "lint-staged": {
102 + "*.{js,vue}": [
103 + "eslint --fix",
104 + "prettier --write"
105 + ],
106 + "*.{less,css}": [
107 + "prettier --write"
108 + ]
85 } 109 }
86 } 110 }
......
...@@ -28,7 +28,7 @@ importers: ...@@ -28,7 +28,7 @@ importers:
28 version: 4.1.7 28 version: 4.1.7
29 '@tarojs/plugin-framework-vue3': 29 '@tarojs/plugin-framework-vue3':
30 specifier: 4.1.7 30 specifier: 4.1.7
31 - version: 4.1.7(@tarojs/helper@4.1.7)(@tarojs/runner-utils@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)(vue-loader@17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)))(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)) 31 + version: 4.1.7(@tarojs/helper@4.1.7)(@tarojs/runner-utils@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)(@vitejs/plugin-vue@5.2.4(vue@3.5.20(typescript@5.9.2)))(vue-loader@17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)))(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96))
32 '@tarojs/plugin-html': 32 '@tarojs/plugin-html':
33 specifier: 4.1.7 33 specifier: 4.1.7
34 version: 4.1.7(@tarojs/helper@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7) 34 version: 4.1.7(@tarojs/helper@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)
...@@ -96,12 +96,21 @@ importers: ...@@ -96,12 +96,21 @@ importers:
96 '@types/webpack-env': 96 '@types/webpack-env':
97 specifier: ^1.13.6 97 specifier: ^1.13.6
98 version: 1.18.8 98 version: 1.18.8
99 + '@vitejs/plugin-vue':
100 + specifier: ^5.2.4
101 + version: 5.2.4(vue@3.5.20(typescript@5.9.2))
102 + '@vitest/coverage-v8':
103 + specifier: ^1.6.1
104 + version: 1.6.1(vitest@1.6.1(@types/node@24.3.0)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1))
99 '@vue/babel-plugin-jsx': 105 '@vue/babel-plugin-jsx':
100 specifier: ^1.0.6 106 specifier: ^1.0.6
101 version: 1.5.0(@babel/core@7.28.3) 107 version: 1.5.0(@babel/core@7.28.3)
102 '@vue/compiler-sfc': 108 '@vue/compiler-sfc':
103 specifier: ^3.0.0 109 specifier: ^3.0.0
104 version: 3.5.20 110 version: 3.5.20
111 + '@vue/test-utils':
112 + specifier: ^2.4.6
113 + version: 2.4.6
105 autoprefixer: 114 autoprefixer:
106 specifier: ^10.4.21 115 specifier: ^10.4.21
107 version: 10.4.21(postcss@8.5.6) 116 version: 10.4.21(postcss@8.5.6)
...@@ -117,9 +126,21 @@ importers: ...@@ -117,9 +126,21 @@ importers:
117 eslint-config-taro: 126 eslint-config-taro:
118 specifier: 4.1.7 127 specifier: 4.1.7
119 version: 4.1.7(@babel/core@7.28.3)(eslint@8.57.1)(typescript@5.9.2) 128 version: 4.1.7(@babel/core@7.28.3)(eslint@8.57.1)(typescript@5.9.2)
129 + husky:
130 + specifier: ^9.1.7
131 + version: 9.1.7
132 + jsdom:
133 + specifier: ^24.1.3
134 + version: 24.1.3
135 + lint-staged:
136 + specifier: ^16.2.7
137 + version: 16.2.7
120 postcss: 138 postcss:
121 specifier: ^8.5.6 139 specifier: ^8.5.6
122 version: 8.5.6 140 version: 8.5.6
141 + prettier:
142 + specifier: ^3.0.0
143 + version: 3.8.1
123 style-loader: 144 style-loader:
124 specifier: 1.3.0 145 specifier: 1.3.0
125 version: 1.3.0(webpack@5.78.0(@swc/core@1.3.96)) 146 version: 1.3.0(webpack@5.78.0(@swc/core@1.3.96))
...@@ -132,12 +153,15 @@ importers: ...@@ -132,12 +153,15 @@ importers:
132 unplugin-vue-components: 153 unplugin-vue-components:
133 specifier: ^0.26.0 154 specifier: ^0.26.0
134 version: 0.26.0(@babel/parser@7.28.3)(rollup@3.29.5)(vue@3.5.20(typescript@5.9.2)) 155 version: 0.26.0(@babel/parser@7.28.3)(rollup@3.29.5)(vue@3.5.20(typescript@5.9.2))
156 + vitest:
157 + specifier: ^1.6.1
158 + version: 1.6.1(@types/node@24.3.0)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1)
135 vue-loader: 159 vue-loader:
136 specifier: ^17.0.0 160 specifier: ^17.0.0
137 version: 17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)) 161 version: 17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96))
138 weapp-tailwindcss: 162 weapp-tailwindcss:
139 specifier: ^4.1.10 163 specifier: ^4.1.10
140 - version: 4.2.6(tailwindcss@3.4.17)(typescript@5.9.2) 164 + version: 4.2.6(magicast@0.3.5)(tailwindcss@3.4.17)(typescript@5.9.2)
141 webpack: 165 webpack:
142 specifier: 5.78.0 166 specifier: 5.78.0
143 version: 5.78.0(@swc/core@1.3.96) 167 version: 5.78.0(@swc/core@1.3.96)
...@@ -716,6 +740,9 @@ packages: ...@@ -716,6 +740,9 @@ packages:
716 resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 740 resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
717 engines: {node: '>=6.9.0'} 741 engines: {node: '>=6.9.0'}
718 742
743 + '@bcoe/v8-coverage@0.2.3':
744 + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
745 +
719 '@csstools/cascade-layer-name-parser@2.0.5': 746 '@csstools/cascade-layer-name-parser@2.0.5':
720 resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==} 747 resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==}
721 engines: {node: '>=18'} 748 engines: {node: '>=18'}
...@@ -1351,6 +1378,10 @@ packages: ...@@ -1351,6 +1378,10 @@ packages:
1351 resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 1378 resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
1352 engines: {node: '>=18.0.0'} 1379 engines: {node: '>=18.0.0'}
1353 1380
1381 + '@istanbuljs/schema@0.1.3':
1382 + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
1383 + engines: {node: '>=8'}
1384 +
1354 '@jest/schemas@29.6.3': 1385 '@jest/schemas@29.6.3':
1355 resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 1386 resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
1356 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1387 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
...@@ -1430,6 +1461,9 @@ packages: ...@@ -1430,6 +1461,9 @@ packages:
1430 unplugin-vue-components: 1461 unplugin-vue-components:
1431 optional: true 1462 optional: true
1432 1463
1464 + '@one-ini/wasm@0.1.1':
1465 + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
1466 +
1433 '@parcel/watcher-android-arm64@2.5.1': 1467 '@parcel/watcher-android-arm64@2.5.1':
1434 resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} 1468 resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
1435 engines: {node: '>= 10.0.0'} 1469 engines: {node: '>= 10.0.0'}
...@@ -1459,36 +1493,42 @@ packages: ...@@ -1459,36 +1493,42 @@ packages:
1459 engines: {node: '>= 10.0.0'} 1493 engines: {node: '>= 10.0.0'}
1460 cpu: [arm] 1494 cpu: [arm]
1461 os: [linux] 1495 os: [linux]
1496 + libc: [glibc]
1462 1497
1463 '@parcel/watcher-linux-arm-musl@2.5.1': 1498 '@parcel/watcher-linux-arm-musl@2.5.1':
1464 resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} 1499 resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
1465 engines: {node: '>= 10.0.0'} 1500 engines: {node: '>= 10.0.0'}
1466 cpu: [arm] 1501 cpu: [arm]
1467 os: [linux] 1502 os: [linux]
1503 + libc: [musl]
1468 1504
1469 '@parcel/watcher-linux-arm64-glibc@2.5.1': 1505 '@parcel/watcher-linux-arm64-glibc@2.5.1':
1470 resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} 1506 resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
1471 engines: {node: '>= 10.0.0'} 1507 engines: {node: '>= 10.0.0'}
1472 cpu: [arm64] 1508 cpu: [arm64]
1473 os: [linux] 1509 os: [linux]
1510 + libc: [glibc]
1474 1511
1475 '@parcel/watcher-linux-arm64-musl@2.5.1': 1512 '@parcel/watcher-linux-arm64-musl@2.5.1':
1476 resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} 1513 resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
1477 engines: {node: '>= 10.0.0'} 1514 engines: {node: '>= 10.0.0'}
1478 cpu: [arm64] 1515 cpu: [arm64]
1479 os: [linux] 1516 os: [linux]
1517 + libc: [musl]
1480 1518
1481 '@parcel/watcher-linux-x64-glibc@2.5.1': 1519 '@parcel/watcher-linux-x64-glibc@2.5.1':
1482 resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} 1520 resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
1483 engines: {node: '>= 10.0.0'} 1521 engines: {node: '>= 10.0.0'}
1484 cpu: [x64] 1522 cpu: [x64]
1485 os: [linux] 1523 os: [linux]
1524 + libc: [glibc]
1486 1525
1487 '@parcel/watcher-linux-x64-musl@2.5.1': 1526 '@parcel/watcher-linux-x64-musl@2.5.1':
1488 resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} 1527 resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
1489 engines: {node: '>= 10.0.0'} 1528 engines: {node: '>= 10.0.0'}
1490 cpu: [x64] 1529 cpu: [x64]
1491 os: [linux] 1530 os: [linux]
1531 + libc: [musl]
1492 1532
1493 '@parcel/watcher-win32-arm64@2.5.1': 1533 '@parcel/watcher-win32-arm64@2.5.1':
1494 resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} 1534 resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
...@@ -1544,6 +1584,144 @@ packages: ...@@ -1544,6 +1584,144 @@ packages:
1544 rollup: 1584 rollup:
1545 optional: true 1585 optional: true
1546 1586
1587 + '@rollup/rollup-android-arm-eabi@4.57.1':
1588 + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==}
1589 + cpu: [arm]
1590 + os: [android]
1591 +
1592 + '@rollup/rollup-android-arm64@4.57.1':
1593 + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==}
1594 + cpu: [arm64]
1595 + os: [android]
1596 +
1597 + '@rollup/rollup-darwin-arm64@4.57.1':
1598 + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==}
1599 + cpu: [arm64]
1600 + os: [darwin]
1601 +
1602 + '@rollup/rollup-darwin-x64@4.57.1':
1603 + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==}
1604 + cpu: [x64]
1605 + os: [darwin]
1606 +
1607 + '@rollup/rollup-freebsd-arm64@4.57.1':
1608 + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==}
1609 + cpu: [arm64]
1610 + os: [freebsd]
1611 +
1612 + '@rollup/rollup-freebsd-x64@4.57.1':
1613 + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==}
1614 + cpu: [x64]
1615 + os: [freebsd]
1616 +
1617 + '@rollup/rollup-linux-arm-gnueabihf@4.57.1':
1618 + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==}
1619 + cpu: [arm]
1620 + os: [linux]
1621 + libc: [glibc]
1622 +
1623 + '@rollup/rollup-linux-arm-musleabihf@4.57.1':
1624 + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==}
1625 + cpu: [arm]
1626 + os: [linux]
1627 + libc: [musl]
1628 +
1629 + '@rollup/rollup-linux-arm64-gnu@4.57.1':
1630 + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==}
1631 + cpu: [arm64]
1632 + os: [linux]
1633 + libc: [glibc]
1634 +
1635 + '@rollup/rollup-linux-arm64-musl@4.57.1':
1636 + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==}
1637 + cpu: [arm64]
1638 + os: [linux]
1639 + libc: [musl]
1640 +
1641 + '@rollup/rollup-linux-loong64-gnu@4.57.1':
1642 + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==}
1643 + cpu: [loong64]
1644 + os: [linux]
1645 + libc: [glibc]
1646 +
1647 + '@rollup/rollup-linux-loong64-musl@4.57.1':
1648 + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==}
1649 + cpu: [loong64]
1650 + os: [linux]
1651 + libc: [musl]
1652 +
1653 + '@rollup/rollup-linux-ppc64-gnu@4.57.1':
1654 + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==}
1655 + cpu: [ppc64]
1656 + os: [linux]
1657 + libc: [glibc]
1658 +
1659 + '@rollup/rollup-linux-ppc64-musl@4.57.1':
1660 + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==}
1661 + cpu: [ppc64]
1662 + os: [linux]
1663 + libc: [musl]
1664 +
1665 + '@rollup/rollup-linux-riscv64-gnu@4.57.1':
1666 + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==}
1667 + cpu: [riscv64]
1668 + os: [linux]
1669 + libc: [glibc]
1670 +
1671 + '@rollup/rollup-linux-riscv64-musl@4.57.1':
1672 + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==}
1673 + cpu: [riscv64]
1674 + os: [linux]
1675 + libc: [musl]
1676 +
1677 + '@rollup/rollup-linux-s390x-gnu@4.57.1':
1678 + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==}
1679 + cpu: [s390x]
1680 + os: [linux]
1681 + libc: [glibc]
1682 +
1683 + '@rollup/rollup-linux-x64-gnu@4.57.1':
1684 + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==}
1685 + cpu: [x64]
1686 + os: [linux]
1687 + libc: [glibc]
1688 +
1689 + '@rollup/rollup-linux-x64-musl@4.57.1':
1690 + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==}
1691 + cpu: [x64]
1692 + os: [linux]
1693 + libc: [musl]
1694 +
1695 + '@rollup/rollup-openbsd-x64@4.57.1':
1696 + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==}
1697 + cpu: [x64]
1698 + os: [openbsd]
1699 +
1700 + '@rollup/rollup-openharmony-arm64@4.57.1':
1701 + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==}
1702 + cpu: [arm64]
1703 + os: [openharmony]
1704 +
1705 + '@rollup/rollup-win32-arm64-msvc@4.57.1':
1706 + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==}
1707 + cpu: [arm64]
1708 + os: [win32]
1709 +
1710 + '@rollup/rollup-win32-ia32-msvc@4.57.1':
1711 + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==}
1712 + cpu: [ia32]
1713 + os: [win32]
1714 +
1715 + '@rollup/rollup-win32-x64-gnu@4.57.1':
1716 + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==}
1717 + cpu: [x64]
1718 + os: [win32]
1719 +
1720 + '@rollup/rollup-win32-x64-msvc@4.57.1':
1721 + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==}
1722 + cpu: [x64]
1723 + os: [win32]
1724 +
1547 '@rtsao/scc@1.1.0': 1725 '@rtsao/scc@1.1.0':
1548 resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 1726 resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
1549 1727
...@@ -1599,24 +1777,28 @@ packages: ...@@ -1599,24 +1777,28 @@ packages:
1599 engines: {node: '>=10'} 1777 engines: {node: '>=10'}
1600 cpu: [arm64] 1778 cpu: [arm64]
1601 os: [linux] 1779 os: [linux]
1780 + libc: [glibc]
1602 1781
1603 '@swc/core-linux-arm64-musl@1.3.96': 1782 '@swc/core-linux-arm64-musl@1.3.96':
1604 resolution: {integrity: sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==} 1783 resolution: {integrity: sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==}
1605 engines: {node: '>=10'} 1784 engines: {node: '>=10'}
1606 cpu: [arm64] 1785 cpu: [arm64]
1607 os: [linux] 1786 os: [linux]
1787 + libc: [musl]
1608 1788
1609 '@swc/core-linux-x64-gnu@1.3.96': 1789 '@swc/core-linux-x64-gnu@1.3.96':
1610 resolution: {integrity: sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==} 1790 resolution: {integrity: sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==}
1611 engines: {node: '>=10'} 1791 engines: {node: '>=10'}
1612 cpu: [x64] 1792 cpu: [x64]
1613 os: [linux] 1793 os: [linux]
1794 + libc: [glibc]
1614 1795
1615 '@swc/core-linux-x64-musl@1.3.96': 1796 '@swc/core-linux-x64-musl@1.3.96':
1616 resolution: {integrity: sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==} 1797 resolution: {integrity: sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==}
1617 engines: {node: '>=10'} 1798 engines: {node: '>=10'}
1618 cpu: [x64] 1799 cpu: [x64]
1619 os: [linux] 1800 os: [linux]
1801 + libc: [musl]
1620 1802
1621 '@swc/core-win32-arm64-msvc@1.3.96': 1803 '@swc/core-win32-arm64-msvc@1.3.96':
1622 resolution: {integrity: sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==} 1804 resolution: {integrity: sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==}
...@@ -1692,6 +1874,7 @@ packages: ...@@ -1692,6 +1874,7 @@ packages:
1692 engines: {node: '>= 18'} 1874 engines: {node: '>= 18'}
1693 cpu: [x64] 1875 cpu: [x64]
1694 os: [linux] 1876 os: [linux]
1877 + libc: [glibc]
1695 1878
1696 '@tarojs/binding-win32-x64-msvc@4.1.7': 1879 '@tarojs/binding-win32-x64-msvc@4.1.7':
1697 resolution: {integrity: sha512-treGgXFwNa9Q6xIsz0NSfI9R2J0s9GW9xb76jcOxMsjT4eIrmQ/NhNS4lHSM5dz6jwmh+Gzv5ow7nS+HEKN+Xw==} 1880 resolution: {integrity: sha512-treGgXFwNa9Q6xIsz0NSfI9R2J0s9GW9xb76jcOxMsjT4eIrmQ/NhNS4lHSM5dz6jwmh+Gzv5ow7nS+HEKN+Xw==}
...@@ -1757,24 +1940,28 @@ packages: ...@@ -1757,24 +1940,28 @@ packages:
1757 engines: {node: '>= 10'} 1940 engines: {node: '>= 10'}
1758 cpu: [arm64] 1941 cpu: [arm64]
1759 os: [linux] 1942 os: [linux]
1943 + libc: [glibc]
1760 1944
1761 '@tarojs/plugin-doctor-linux-arm64-musl@0.0.13': 1945 '@tarojs/plugin-doctor-linux-arm64-musl@0.0.13':
1762 resolution: {integrity: sha512-V1HnFITOLgHVyQ+OCa1oPFKOtGFRtP91vlbUGfOwMA4GeOVw9g28W/hfTyucTCkfZWlrssLehgW6L2AGAMXh2w==} 1946 resolution: {integrity: sha512-V1HnFITOLgHVyQ+OCa1oPFKOtGFRtP91vlbUGfOwMA4GeOVw9g28W/hfTyucTCkfZWlrssLehgW6L2AGAMXh2w==}
1763 engines: {node: '>= 10'} 1947 engines: {node: '>= 10'}
1764 cpu: [arm64] 1948 cpu: [arm64]
1765 os: [linux] 1949 os: [linux]
1950 + libc: [musl]
1766 1951
1767 '@tarojs/plugin-doctor-linux-x64-gnu@0.0.13': 1952 '@tarojs/plugin-doctor-linux-x64-gnu@0.0.13':
1768 resolution: {integrity: sha512-oetfzBW60uenPBBF4/NE6Mf0Iwkw1YGqIIBiN++aVQynbWrmMzWBsW8kleZ5vN1npxI9aud9EfRU1uM37DrG2A==} 1953 resolution: {integrity: sha512-oetfzBW60uenPBBF4/NE6Mf0Iwkw1YGqIIBiN++aVQynbWrmMzWBsW8kleZ5vN1npxI9aud9EfRU1uM37DrG2A==}
1769 engines: {node: '>= 10'} 1954 engines: {node: '>= 10'}
1770 cpu: [x64] 1955 cpu: [x64]
1771 os: [linux] 1956 os: [linux]
1957 + libc: [glibc]
1772 1958
1773 '@tarojs/plugin-doctor-linux-x64-musl@0.0.13': 1959 '@tarojs/plugin-doctor-linux-x64-musl@0.0.13':
1774 resolution: {integrity: sha512-OdIF/kFwwM0kQPDnpkanhvfWRaAI6EtDmpM9rQA/Lu2QcJq86w5d7X/WSN0U2xF1nialAUrfl79NyIaEzp4Fcw==} 1960 resolution: {integrity: sha512-OdIF/kFwwM0kQPDnpkanhvfWRaAI6EtDmpM9rQA/Lu2QcJq86w5d7X/WSN0U2xF1nialAUrfl79NyIaEzp4Fcw==}
1775 engines: {node: '>= 10'} 1961 engines: {node: '>= 10'}
1776 cpu: [x64] 1962 cpu: [x64]
1777 os: [linux] 1963 os: [linux]
1964 + libc: [musl]
1778 1965
1779 '@tarojs/plugin-doctor-win32-ia32-msvc@0.0.13': 1966 '@tarojs/plugin-doctor-win32-ia32-msvc@0.0.13':
1780 resolution: {integrity: sha512-nIbG2SliRhRwACLa1kNMskcfjsihp+3tZQMAxl+LoYUq6JRaWgP3vH2nHkDyZHTCheBTDtAaupqXWrYF3w+U6g==} 1967 resolution: {integrity: sha512-nIbG2SliRhRwACLa1kNMskcfjsihp+3tZQMAxl+LoYUq6JRaWgP3vH2nHkDyZHTCheBTDtAaupqXWrYF3w+U6g==}
...@@ -2166,6 +2353,33 @@ packages: ...@@ -2166,6 +2353,33 @@ packages:
2166 '@ungap/structured-clone@1.3.0': 2353 '@ungap/structured-clone@1.3.0':
2167 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 2354 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
2168 2355
2356 + '@vitejs/plugin-vue@5.2.4':
2357 + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
2358 + engines: {node: ^18.0.0 || >=20.0.0}
2359 + peerDependencies:
2360 + vite: ^5.0.0 || ^6.0.0
2361 + vue: ^3.2.25
2362 +
2363 + '@vitest/coverage-v8@1.6.1':
2364 + resolution: {integrity: sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==}
2365 + peerDependencies:
2366 + vitest: 1.6.1
2367 +
2368 + '@vitest/expect@1.6.1':
2369 + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==}
2370 +
2371 + '@vitest/runner@1.6.1':
2372 + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==}
2373 +
2374 + '@vitest/snapshot@1.6.1':
2375 + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==}
2376 +
2377 + '@vitest/spy@1.6.1':
2378 + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==}
2379 +
2380 + '@vitest/utils@1.6.1':
2381 + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==}
2382 +
2169 '@vue/babel-helper-vue-transform-on@1.5.0': 2383 '@vue/babel-helper-vue-transform-on@1.5.0':
2170 resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} 2384 resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==}
2171 2385
...@@ -2220,6 +2434,9 @@ packages: ...@@ -2220,6 +2434,9 @@ packages:
2220 '@vue/shared@3.5.20': 2434 '@vue/shared@3.5.20':
2221 resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==} 2435 resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==}
2222 2436
2437 + '@vue/test-utils@2.4.6':
2438 + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
2439 +
2223 '@weapp-core/escape@4.0.1': 2440 '@weapp-core/escape@4.0.1':
2224 resolution: {integrity: sha512-FuO9zTs/8VMhoZ+sZkMEMipcHd9FZhxstdhg9+Z3JlTgxMFAIvhBFOuFjM2bUyjDJ7O21nr9podHDjVjcVYu4Q==} 2441 resolution: {integrity: sha512-FuO9zTs/8VMhoZ+sZkMEMipcHd9FZhxstdhg9+Z3JlTgxMFAIvhBFOuFjM2bUyjDJ7O21nr9podHDjVjcVYu4Q==}
2225 2442
...@@ -2292,6 +2509,10 @@ packages: ...@@ -2292,6 +2509,10 @@ packages:
2292 '@xtuc/long@4.2.2': 2509 '@xtuc/long@4.2.2':
2293 resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} 2510 resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
2294 2511
2512 + abbrev@2.0.0:
2513 + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
2514 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
2515 +
2295 abortcontroller-polyfill@1.7.8: 2516 abortcontroller-polyfill@1.7.8:
2296 resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==} 2517 resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==}
2297 2518
...@@ -2363,6 +2584,10 @@ packages: ...@@ -2363,6 +2584,10 @@ packages:
2363 resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 2584 resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
2364 engines: {node: '>=8'} 2585 engines: {node: '>=8'}
2365 2586
2587 + ansi-escapes@7.3.0:
2588 + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==}
2589 + engines: {node: '>=18'}
2590 +
2366 ansi-html-community@0.0.8: 2591 ansi-html-community@0.0.8:
2367 resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} 2592 resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
2368 engines: {'0': node >= 0.8.0} 2593 engines: {'0': node >= 0.8.0}
...@@ -2380,6 +2605,10 @@ packages: ...@@ -2380,6 +2605,10 @@ packages:
2380 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 2605 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
2381 engines: {node: '>=8'} 2606 engines: {node: '>=8'}
2382 2607
2608 + ansi-styles@5.2.0:
2609 + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
2610 + engines: {node: '>=10'}
2611 +
2383 ansi-styles@6.2.1: 2612 ansi-styles@6.2.1:
2384 resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 2613 resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
2385 engines: {node: '>=12'} 2614 engines: {node: '>=12'}
...@@ -2435,6 +2664,9 @@ packages: ...@@ -2435,6 +2664,9 @@ packages:
2435 resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 2664 resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
2436 engines: {node: '>= 0.4'} 2665 engines: {node: '>= 0.4'}
2437 2666
2667 + assertion-error@1.1.0:
2668 + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
2669 +
2438 async-function@1.0.0: 2670 async-function@1.0.0:
2439 resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 2671 resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
2440 engines: {node: '>= 0.4'} 2672 engines: {node: '>= 0.4'}
...@@ -2664,6 +2896,10 @@ packages: ...@@ -2664,6 +2896,10 @@ packages:
2664 resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} 2896 resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==}
2665 engines: {node: '>=4'} 2897 engines: {node: '>=4'}
2666 2898
2899 + chai@4.5.0:
2900 + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
2901 + engines: {node: '>=4'}
2902 +
2667 chalk@3.0.0: 2903 chalk@3.0.0:
2668 resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 2904 resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
2669 engines: {node: '>=8'} 2905 engines: {node: '>=8'}
...@@ -2681,6 +2917,9 @@ packages: ...@@ -2681,6 +2917,9 @@ packages:
2681 charenc@0.0.2: 2917 charenc@0.0.2:
2682 resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 2918 resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
2683 2919
2920 + check-error@1.0.3:
2921 + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
2922 +
2684 chokidar@3.6.0: 2923 chokidar@3.6.0:
2685 resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 2924 resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
2686 engines: {node: '>= 8.10.0'} 2925 engines: {node: '>= 8.10.0'}
...@@ -2723,6 +2962,10 @@ packages: ...@@ -2723,6 +2962,10 @@ packages:
2723 resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 2962 resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
2724 engines: {node: '>=8'} 2963 engines: {node: '>=8'}
2725 2964
2965 + cli-cursor@5.0.0:
2966 + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
2967 + engines: {node: '>=18'}
2968 +
2726 cli-highlight@2.1.11: 2969 cli-highlight@2.1.11:
2727 resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} 2970 resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==}
2728 engines: {node: '>=8.0.0', npm: '>=5.0.0'} 2971 engines: {node: '>=8.0.0', npm: '>=5.0.0'}
...@@ -2732,6 +2975,10 @@ packages: ...@@ -2732,6 +2975,10 @@ packages:
2732 resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 2975 resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
2733 engines: {node: '>=6'} 2976 engines: {node: '>=6'}
2734 2977
2978 + cli-truncate@5.1.1:
2979 + resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==}
2980 + engines: {node: '>=20'}
2981 +
2735 cli-width@3.0.0: 2982 cli-width@3.0.0:
2736 resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} 2983 resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
2737 engines: {node: '>= 10'} 2984 engines: {node: '>= 10'}
...@@ -2770,6 +3017,14 @@ packages: ...@@ -2770,6 +3017,14 @@ packages:
2770 resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 3017 resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
2771 engines: {node: '>= 0.8'} 3018 engines: {node: '>= 0.8'}
2772 3019
3020 + commander@10.0.1:
3021 + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
3022 + engines: {node: '>=14'}
3023 +
3024 + commander@14.0.3:
3025 + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
3026 + engines: {node: '>=20'}
3027 +
2773 commander@2.20.3: 3028 commander@2.20.3:
2774 resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 3029 resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
2775 3030
...@@ -3093,6 +3348,10 @@ packages: ...@@ -3093,6 +3348,10 @@ packages:
3093 resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} 3348 resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==}
3094 engines: {node: '>=4'} 3349 engines: {node: '>=4'}
3095 3350
3351 + deep-eql@4.1.4:
3352 + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
3353 + engines: {node: '>=6'}
3354 +
3096 deep-extend@0.6.0: 3355 deep-extend@0.6.0:
3097 resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 3356 resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
3098 engines: {node: '>=4.0.0'} 3357 engines: {node: '>=4.0.0'}
...@@ -3168,6 +3427,10 @@ packages: ...@@ -3168,6 +3427,10 @@ packages:
3168 didyoumean@1.2.2: 3427 didyoumean@1.2.2:
3169 resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 3428 resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
3170 3429
3430 + diff-sequences@29.6.3:
3431 + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
3432 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
3433 +
3171 dingtalk-jsapi@2.15.6: 3434 dingtalk-jsapi@2.15.6:
3172 resolution: {integrity: sha512-804mFz2AFV/H9ysmo7dLqMjSGOQgREsgQIuep+Xg+yNQeQtnUOYntElEzlB798Sj/691e4mMKz9mtQ7v9qdjuA==} 3435 resolution: {integrity: sha512-804mFz2AFV/H9ysmo7dLqMjSGOQgREsgQIuep+Xg+yNQeQtnUOYntElEzlB798Sj/691e4mMKz9mtQ7v9qdjuA==}
3173 3436
...@@ -3244,12 +3507,20 @@ packages: ...@@ -3244,12 +3507,20 @@ packages:
3244 eastasianwidth@0.2.0: 3507 eastasianwidth@0.2.0:
3245 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 3508 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
3246 3509
3510 + editorconfig@1.0.4:
3511 + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
3512 + engines: {node: '>=14'}
3513 + hasBin: true
3514 +
3247 ee-first@1.1.1: 3515 ee-first@1.1.1:
3248 resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 3516 resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
3249 3517
3250 electron-to-chromium@1.5.211: 3518 electron-to-chromium@1.5.211:
3251 resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==} 3519 resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==}
3252 3520
3521 + emoji-regex@10.6.0:
3522 + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
3523 +
3253 emoji-regex@8.0.0: 3524 emoji-regex@8.0.0:
3254 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 3525 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
3255 3526
...@@ -3298,6 +3569,10 @@ packages: ...@@ -3298,6 +3569,10 @@ packages:
3298 engines: {node: '>=4'} 3569 engines: {node: '>=4'}
3299 hasBin: true 3570 hasBin: true
3300 3571
3572 + environment@1.1.0:
3573 + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
3574 + engines: {node: '>=18'}
3575 +
3301 err-code@2.0.3: 3576 err-code@2.0.3:
3302 resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 3577 resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
3303 3578
...@@ -3473,6 +3748,9 @@ packages: ...@@ -3473,6 +3748,9 @@ packages:
3473 estree-walker@2.0.2: 3748 estree-walker@2.0.2:
3474 resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 3749 resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
3475 3750
3751 + estree-walker@3.0.3:
3752 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
3753 +
3476 esutils@2.0.3: 3754 esutils@2.0.3:
3477 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 3755 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
3478 engines: {node: '>=0.10.0'} 3756 engines: {node: '>=0.10.0'}
...@@ -3484,6 +3762,9 @@ packages: ...@@ -3484,6 +3762,9 @@ packages:
3484 eventemitter3@4.0.7: 3762 eventemitter3@4.0.7:
3485 resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 3763 resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
3486 3764
3765 + eventemitter3@5.0.4:
3766 + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
3767 +
3487 events@3.3.0: 3768 events@3.3.0:
3488 resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 3769 resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
3489 engines: {node: '>=0.8.x'} 3770 engines: {node: '>=0.8.x'}
...@@ -3492,6 +3773,10 @@ packages: ...@@ -3492,6 +3773,10 @@ packages:
3492 resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 3773 resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
3493 engines: {node: '>=10'} 3774 engines: {node: '>=10'}
3494 3775
3776 + execa@8.0.1:
3777 + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
3778 + engines: {node: '>=16.17'}
3779 +
3495 expr-parser@1.0.0: 3780 expr-parser@1.0.0:
3496 resolution: {integrity: sha512-ncuWTCWH0M5KbaYikXxZ3FG3Q+FTYIEXeXAbxYscdZLFNnR5Le5gRU2r/a/JUZHnxwBDZcxWEWzCoPQlW9Engg==} 3781 resolution: {integrity: sha512-ncuWTCWH0M5KbaYikXxZ3FG3Q+FTYIEXeXAbxYscdZLFNnR5Le5gRU2r/a/JUZHnxwBDZcxWEWzCoPQlW9Engg==}
3497 3782
...@@ -3693,6 +3978,13 @@ packages: ...@@ -3693,6 +3978,13 @@ packages:
3693 resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 3978 resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
3694 engines: {node: 6.* || 8.* || >= 10.*} 3979 engines: {node: 6.* || 8.* || >= 10.*}
3695 3980
3981 + get-east-asian-width@1.4.0:
3982 + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
3983 + engines: {node: '>=18'}
3984 +
3985 + get-func-name@2.0.2:
3986 + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
3987 +
3696 get-intrinsic@1.3.0: 3988 get-intrinsic@1.3.0:
3697 resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 3989 resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
3698 engines: {node: '>= 0.4'} 3990 engines: {node: '>= 0.4'}
...@@ -3725,6 +4017,10 @@ packages: ...@@ -3725,6 +4017,10 @@ packages:
3725 resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 4017 resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
3726 engines: {node: '>=10'} 4018 engines: {node: '>=10'}
3727 4019
4020 + get-stream@8.0.1:
4021 + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
4022 + engines: {node: '>=16'}
4023 +
3728 get-symbol-description@1.1.0: 4024 get-symbol-description@1.1.0:
3729 resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 4025 resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
3730 engines: {node: '>= 0.4'} 4026 engines: {node: '>= 0.4'}
...@@ -3882,6 +4178,9 @@ packages: ...@@ -3882,6 +4178,9 @@ packages:
3882 html-entities@2.6.0: 4178 html-entities@2.6.0:
3883 resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} 4179 resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
3884 4180
4181 + html-escaper@2.0.2:
4182 + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
4183 +
3885 html-minifier-terser@6.1.0: 4184 html-minifier-terser@6.1.0:
3886 resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} 4185 resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
3887 engines: {node: '>=12'} 4186 engines: {node: '>=12'}
...@@ -3955,6 +4254,15 @@ packages: ...@@ -3955,6 +4254,15 @@ packages:
3955 resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 4254 resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
3956 engines: {node: '>=10.17.0'} 4255 engines: {node: '>=10.17.0'}
3957 4256
4257 + human-signals@5.0.0:
4258 + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
4259 + engines: {node: '>=16.17.0'}
4260 +
4261 + husky@9.1.7:
4262 + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
4263 + engines: {node: '>=18'}
4264 + hasBin: true
4265 +
3958 iconv-lite@0.4.24: 4266 iconv-lite@0.4.24:
3959 resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 4267 resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
3960 engines: {node: '>=0.10.0'} 4268 engines: {node: '>=0.10.0'}
...@@ -4106,6 +4414,10 @@ packages: ...@@ -4106,6 +4414,10 @@ packages:
4106 resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 4414 resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
4107 engines: {node: '>=8'} 4415 engines: {node: '>=8'}
4108 4416
4417 + is-fullwidth-code-point@5.1.0:
4418 + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
4419 + engines: {node: '>=18'}
4420 +
4109 is-generator-function@1.1.0: 4421 is-generator-function@1.1.0:
4110 resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 4422 resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
4111 engines: {node: '>= 0.4'} 4423 engines: {node: '>= 0.4'}
...@@ -4190,6 +4502,10 @@ packages: ...@@ -4190,6 +4502,10 @@ packages:
4190 resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 4502 resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
4191 engines: {node: '>=8'} 4503 engines: {node: '>=8'}
4192 4504
4505 + is-stream@3.0.0:
4506 + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
4507 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
4508 +
4193 is-string@1.1.1: 4509 is-string@1.1.1:
4194 resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 4510 resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
4195 engines: {node: '>= 0.4'} 4511 engines: {node: '>= 0.4'}
...@@ -4242,6 +4558,22 @@ packages: ...@@ -4242,6 +4558,22 @@ packages:
4242 resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 4558 resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
4243 engines: {node: '>=0.10.0'} 4559 engines: {node: '>=0.10.0'}
4244 4560
4561 + istanbul-lib-coverage@3.2.2:
4562 + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
4563 + engines: {node: '>=8'}
4564 +
4565 + istanbul-lib-report@3.0.1:
4566 + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
4567 + engines: {node: '>=10'}
4568 +
4569 + istanbul-lib-source-maps@5.0.6:
4570 + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
4571 + engines: {node: '>=10'}
4572 +
4573 + istanbul-reports@3.2.0:
4574 + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==}
4575 + engines: {node: '>=8'}
4576 +
4245 isurl@1.0.0: 4577 isurl@1.0.0:
4246 resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} 4578 resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
4247 engines: {node: '>= 4'} 4579 engines: {node: '>= 4'}
...@@ -4282,9 +4614,21 @@ packages: ...@@ -4282,9 +4614,21 @@ packages:
4282 joi@17.13.3: 4614 joi@17.13.3:
4283 resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} 4615 resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
4284 4616
4617 + js-beautify@1.15.4:
4618 + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==}
4619 + engines: {node: '>=14'}
4620 + hasBin: true
4621 +
4622 + js-cookie@3.0.5:
4623 + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
4624 + engines: {node: '>=14'}
4625 +
4285 js-tokens@4.0.0: 4626 js-tokens@4.0.0:
4286 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 4627 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
4287 4628
4629 + js-tokens@9.0.1:
4630 + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
4631 +
4288 js-yaml@4.1.0: 4632 js-yaml@4.1.0:
4289 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 4633 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
4290 hasBin: true 4634 hasBin: true
...@@ -4423,24 +4767,28 @@ packages: ...@@ -4423,24 +4767,28 @@ packages:
4423 engines: {node: '>= 12.0.0'} 4767 engines: {node: '>= 12.0.0'}
4424 cpu: [arm64] 4768 cpu: [arm64]
4425 os: [linux] 4769 os: [linux]
4770 + libc: [glibc]
4426 4771
4427 lightningcss-linux-arm64-musl@1.30.1: 4772 lightningcss-linux-arm64-musl@1.30.1:
4428 resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} 4773 resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
4429 engines: {node: '>= 12.0.0'} 4774 engines: {node: '>= 12.0.0'}
4430 cpu: [arm64] 4775 cpu: [arm64]
4431 os: [linux] 4776 os: [linux]
4777 + libc: [musl]
4432 4778
4433 lightningcss-linux-x64-gnu@1.30.1: 4779 lightningcss-linux-x64-gnu@1.30.1:
4434 resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} 4780 resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
4435 engines: {node: '>= 12.0.0'} 4781 engines: {node: '>= 12.0.0'}
4436 cpu: [x64] 4782 cpu: [x64]
4437 os: [linux] 4783 os: [linux]
4784 + libc: [glibc]
4438 4785
4439 lightningcss-linux-x64-musl@1.30.1: 4786 lightningcss-linux-x64-musl@1.30.1:
4440 resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} 4787 resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
4441 engines: {node: '>= 12.0.0'} 4788 engines: {node: '>= 12.0.0'}
4442 cpu: [x64] 4789 cpu: [x64]
4443 os: [linux] 4790 os: [linux]
4791 + libc: [musl]
4444 4792
4445 lightningcss-win32-arm64-msvc@1.30.1: 4793 lightningcss-win32-arm64-msvc@1.30.1:
4446 resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} 4794 resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
...@@ -4465,6 +4813,15 @@ packages: ...@@ -4465,6 +4813,15 @@ packages:
4465 lines-and-columns@1.2.4: 4813 lines-and-columns@1.2.4:
4466 resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 4814 resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
4467 4815
4816 + lint-staged@16.2.7:
4817 + resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==}
4818 + engines: {node: '>=20.17'}
4819 + hasBin: true
4820 +
4821 + listr2@9.0.5:
4822 + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==}
4823 + engines: {node: '>=20.0.0'}
4824 +
4468 loader-runner@4.3.0: 4825 loader-runner@4.3.0:
4469 resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} 4826 resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
4470 engines: {node: '>=6.11.5'} 4827 engines: {node: '>=6.11.5'}
...@@ -4485,6 +4842,10 @@ packages: ...@@ -4485,6 +4842,10 @@ packages:
4485 resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 4842 resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
4486 engines: {node: '>=14'} 4843 engines: {node: '>=14'}
4487 4844
4845 + local-pkg@0.5.1:
4846 + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
4847 + engines: {node: '>=14'}
4848 +
4488 local-pkg@1.1.2: 4849 local-pkg@1.1.2:
4489 resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} 4850 resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
4490 engines: {node: '>=14'} 4851 engines: {node: '>=14'}
...@@ -4522,6 +4883,10 @@ packages: ...@@ -4522,6 +4883,10 @@ packages:
4522 resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 4883 resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
4523 engines: {node: '>=10'} 4884 engines: {node: '>=10'}
4524 4885
4886 + log-update@6.1.0:
4887 + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
4888 + engines: {node: '>=18'}
4889 +
4525 loglevel-plugin-prefix@0.8.4: 4890 loglevel-plugin-prefix@0.8.4:
4526 resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} 4891 resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==}
4527 4892
...@@ -4529,6 +4894,9 @@ packages: ...@@ -4529,6 +4894,9 @@ packages:
4529 resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} 4894 resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==}
4530 engines: {node: '>= 0.6.0'} 4895 engines: {node: '>= 0.6.0'}
4531 4896
4897 + loupe@2.3.7:
4898 + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
4899 +
4532 lower-case@1.1.4: 4900 lower-case@1.1.4:
4533 resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} 4901 resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==}
4534 4902
...@@ -4556,6 +4924,9 @@ packages: ...@@ -4556,6 +4924,9 @@ packages:
4556 magic-string@0.30.18: 4924 magic-string@0.30.18:
4557 resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} 4925 resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==}
4558 4926
4927 + magicast@0.3.5:
4928 + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
4929 +
4559 make-dir@1.3.0: 4930 make-dir@1.3.0:
4560 resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} 4931 resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
4561 engines: {node: '>=4'} 4932 engines: {node: '>=4'}
...@@ -4568,6 +4939,10 @@ packages: ...@@ -4568,6 +4939,10 @@ packages:
4568 resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 4939 resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
4569 engines: {node: '>=8'} 4940 engines: {node: '>=8'}
4570 4941
4942 + make-dir@4.0.0:
4943 + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
4944 + engines: {node: '>=10'}
4945 +
4571 make-fetch-happen@14.0.3: 4946 make-fetch-happen@14.0.3:
4572 resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} 4947 resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
4573 engines: {node: ^18.17.0 || >=20.5.0} 4948 engines: {node: ^18.17.0 || >=20.5.0}
...@@ -4640,6 +5015,14 @@ packages: ...@@ -4640,6 +5015,14 @@ packages:
4640 resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 5015 resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
4641 engines: {node: '>=6'} 5016 engines: {node: '>=6'}
4642 5017
5018 + mimic-fn@4.0.0:
5019 + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
5020 + engines: {node: '>=12'}
5021 +
5022 + mimic-function@5.0.1:
5023 + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
5024 + engines: {node: '>=18'}
5025 +
4643 mimic-response@1.0.1: 5026 mimic-response@1.0.1:
4644 resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 5027 resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
4645 engines: {node: '>=4'} 5028 engines: {node: '>=4'}
...@@ -4663,6 +5046,10 @@ packages: ...@@ -4663,6 +5046,10 @@ packages:
4663 minimatch@3.1.2: 5046 minimatch@3.1.2:
4664 resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 5047 resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
4665 5048
5049 + minimatch@9.0.1:
5050 + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
5051 + engines: {node: '>=16 || 14 >=14.17'}
5052 +
4666 minimatch@9.0.3: 5053 minimatch@9.0.3:
4667 resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 5054 resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
4668 engines: {node: '>=16 || 14 >=14.17'} 5055 engines: {node: '>=16 || 14 >=14.17'}
...@@ -4765,6 +5152,10 @@ packages: ...@@ -4765,6 +5152,10 @@ packages:
4765 mz@2.7.0: 5152 mz@2.7.0:
4766 resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 5153 resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
4767 5154
5155 + nano-spawn@2.0.0:
5156 + resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==}
5157 + engines: {node: '>=20.17'}
5158 +
4768 nanoid@3.3.11: 5159 nanoid@3.3.11:
4769 resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 5160 resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
4770 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 5161 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
...@@ -4810,6 +5201,11 @@ packages: ...@@ -4810,6 +5201,11 @@ packages:
4810 node-releases@2.0.19: 5201 node-releases@2.0.19:
4811 resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 5202 resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
4812 5203
5204 + nopt@7.2.1:
5205 + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
5206 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
5207 + hasBin: true
5208 +
4813 normalize-path@3.0.0: 5209 normalize-path@3.0.0:
4814 resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 5210 resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
4815 engines: {node: '>=0.10.0'} 5211 engines: {node: '>=0.10.0'}
...@@ -4842,6 +5238,10 @@ packages: ...@@ -4842,6 +5238,10 @@ packages:
4842 resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 5238 resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
4843 engines: {node: '>=8'} 5239 engines: {node: '>=8'}
4844 5240
5241 + npm-run-path@5.3.0:
5242 + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
5243 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
5244 +
4845 nth-check@2.1.1: 5245 nth-check@2.1.1:
4846 resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 5246 resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
4847 5247
...@@ -4906,6 +5306,14 @@ packages: ...@@ -4906,6 +5306,14 @@ packages:
4906 resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 5306 resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
4907 engines: {node: '>=6'} 5307 engines: {node: '>=6'}
4908 5308
5309 + onetime@6.0.0:
5310 + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
5311 + engines: {node: '>=12'}
5312 +
5313 + onetime@7.0.0:
5314 + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
5315 + engines: {node: '>=18'}
5316 +
4909 open@8.4.2: 5317 open@8.4.2:
4910 resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} 5318 resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
4911 engines: {node: '>=12'} 5319 engines: {node: '>=12'}
...@@ -4950,6 +5358,10 @@ packages: ...@@ -4950,6 +5358,10 @@ packages:
4950 resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 5358 resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
4951 engines: {node: '>=10'} 5359 engines: {node: '>=10'}
4952 5360
5361 + p-limit@5.0.0:
5362 + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
5363 + engines: {node: '>=18'}
5364 +
4953 p-locate@3.0.0: 5365 p-locate@3.0.0:
4954 resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} 5366 resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
4955 engines: {node: '>=6'} 5367 engines: {node: '>=6'}
...@@ -5033,6 +5445,10 @@ packages: ...@@ -5033,6 +5445,10 @@ packages:
5033 resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 5445 resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
5034 engines: {node: '>=8'} 5446 engines: {node: '>=8'}
5035 5447
5448 + path-key@4.0.0:
5449 + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
5450 + engines: {node: '>=12'}
5451 +
5036 path-parse@1.0.7: 5452 path-parse@1.0.7:
5037 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 5453 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
5038 5454
...@@ -5054,9 +5470,15 @@ packages: ...@@ -5054,9 +5470,15 @@ packages:
5054 resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} 5470 resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
5055 engines: {node: '>=18'} 5471 engines: {node: '>=18'}
5056 5472
5473 + pathe@1.1.2:
5474 + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
5475 +
5057 pathe@2.0.3: 5476 pathe@2.0.3:
5058 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 5477 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
5059 5478
5479 + pathval@1.1.1:
5480 + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
5481 +
5060 pend@1.2.0: 5482 pend@1.2.0:
5061 resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 5483 resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
5062 5484
...@@ -5077,6 +5499,11 @@ packages: ...@@ -5077,6 +5499,11 @@ packages:
5077 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 5499 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
5078 engines: {node: '>=12'} 5500 engines: {node: '>=12'}
5079 5501
5502 + pidtree@0.6.0:
5503 + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
5504 + engines: {node: '>=0.10'}
5505 + hasBin: true
5506 +
5080 pify@2.3.0: 5507 pify@2.3.0:
5081 resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 5508 resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
5082 engines: {node: '>=0.10.0'} 5509 engines: {node: '>=0.10.0'}
...@@ -5585,6 +6012,11 @@ packages: ...@@ -5585,6 +6012,11 @@ packages:
5585 resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} 6012 resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
5586 engines: {node: '>=4'} 6013 engines: {node: '>=4'}
5587 6014
6015 + prettier@3.8.1:
6016 + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
6017 + engines: {node: '>=14'}
6018 + hasBin: true
6019 +
5588 pretty-bytes@5.6.0: 6020 pretty-bytes@5.6.0:
5589 resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} 6021 resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
5590 engines: {node: '>=6'} 6022 engines: {node: '>=6'}
...@@ -5596,6 +6028,10 @@ packages: ...@@ -5596,6 +6028,10 @@ packages:
5596 resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} 6028 resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==}
5597 engines: {node: '>= 10'} 6029 engines: {node: '>= 10'}
5598 6030
6031 + pretty-format@29.7.0:
6032 + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
6033 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6034 +
5599 pretty-time@1.1.0: 6035 pretty-time@1.1.0:
5600 resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} 6036 resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==}
5601 engines: {node: '>=4'} 6037 engines: {node: '>=4'}
...@@ -5682,6 +6118,9 @@ packages: ...@@ -5682,6 +6118,9 @@ packages:
5682 react-is@17.0.2: 6118 react-is@17.0.2:
5683 resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 6119 resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
5684 6120
6121 + react-is@18.3.1:
6122 + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
6123 +
5685 react@19.1.1: 6124 react@19.1.1:
5686 resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} 6125 resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==}
5687 engines: {node: '>=0.10.0'} 6126 engines: {node: '>=0.10.0'}
...@@ -5788,6 +6227,10 @@ packages: ...@@ -5788,6 +6227,10 @@ packages:
5788 resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 6227 resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
5789 engines: {node: '>=8'} 6228 engines: {node: '>=8'}
5790 6229
6230 + restore-cursor@5.1.0:
6231 + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
6232 + engines: {node: '>=18'}
6233 +
5791 retry@0.12.0: 6234 retry@0.12.0:
5792 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 6235 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
5793 engines: {node: '>= 4'} 6236 engines: {node: '>= 4'}
...@@ -5813,6 +6256,11 @@ packages: ...@@ -5813,6 +6256,11 @@ packages:
5813 engines: {node: '>=14.18.0', npm: '>=8.0.0'} 6256 engines: {node: '>=14.18.0', npm: '>=8.0.0'}
5814 hasBin: true 6257 hasBin: true
5815 6258
6259 + rollup@4.57.1:
6260 + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==}
6261 + engines: {node: '>=18.0.0', npm: '>=8.0.0'}
6262 + hasBin: true
6263 +
5816 rrweb-cssom@0.7.1: 6264 rrweb-cssom@0.7.1:
5817 resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} 6265 resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
5818 6266
...@@ -6007,6 +6455,9 @@ packages: ...@@ -6007,6 +6455,9 @@ packages:
6007 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 6455 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
6008 engines: {node: '>= 0.4'} 6456 engines: {node: '>= 0.4'}
6009 6457
6458 + siginfo@2.0.0:
6459 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
6460 +
6010 signal-exit@3.0.7: 6461 signal-exit@3.0.7:
6011 resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 6462 resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
6012 6463
...@@ -6022,6 +6473,10 @@ packages: ...@@ -6022,6 +6473,10 @@ packages:
6022 resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} 6473 resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
6023 engines: {node: '>=14.16'} 6474 engines: {node: '>=14.16'}
6024 6475
6476 + slice-ansi@7.1.2:
6477 + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
6478 + engines: {node: '>=18'}
6479 +
6025 smart-buffer@4.2.0: 6480 smart-buffer@4.2.0:
6026 resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} 6481 resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
6027 engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 6482 engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
...@@ -6096,6 +6551,9 @@ packages: ...@@ -6096,6 +6551,9 @@ packages:
6096 resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} 6551 resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==}
6097 engines: {node: ^18.17.0 || >=20.5.0} 6552 engines: {node: ^18.17.0 || >=20.5.0}
6098 6553
6554 + stackback@0.0.2:
6555 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
6556 +
6099 statuses@1.5.0: 6557 statuses@1.5.0:
6100 resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} 6558 resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
6101 engines: {node: '>= 0.6'} 6559 engines: {node: '>= 0.6'}
...@@ -6115,6 +6573,10 @@ packages: ...@@ -6115,6 +6573,10 @@ packages:
6115 resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} 6573 resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
6116 engines: {node: '>=0.10.0'} 6574 engines: {node: '>=0.10.0'}
6117 6575
6576 + string-argv@0.3.2:
6577 + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
6578 + engines: {node: '>=0.6.19'}
6579 +
6118 string-width@4.2.3: 6580 string-width@4.2.3:
6119 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 6581 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
6120 engines: {node: '>=8'} 6582 engines: {node: '>=8'}
...@@ -6123,6 +6585,14 @@ packages: ...@@ -6123,6 +6585,14 @@ packages:
6123 resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 6585 resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
6124 engines: {node: '>=12'} 6586 engines: {node: '>=12'}
6125 6587
6588 + string-width@7.2.0:
6589 + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
6590 + engines: {node: '>=18'}
6591 +
6592 + string-width@8.1.1:
6593 + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==}
6594 + engines: {node: '>=20'}
6595 +
6126 string.fromcodepoint@0.2.1: 6596 string.fromcodepoint@0.2.1:
6127 resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} 6597 resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==}
6128 6598
...@@ -6163,6 +6633,10 @@ packages: ...@@ -6163,6 +6633,10 @@ packages:
6163 resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 6633 resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
6164 engines: {node: '>=6'} 6634 engines: {node: '>=6'}
6165 6635
6636 + strip-final-newline@3.0.0:
6637 + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
6638 + engines: {node: '>=12'}
6639 +
6166 strip-json-comments@2.0.1: 6640 strip-json-comments@2.0.1:
6167 resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 6641 resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
6168 engines: {node: '>=0.10.0'} 6642 engines: {node: '>=0.10.0'}
...@@ -6171,6 +6645,9 @@ packages: ...@@ -6171,6 +6645,9 @@ packages:
6171 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 6645 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
6172 engines: {node: '>=8'} 6646 engines: {node: '>=8'}
6173 6647
6648 + strip-literal@2.1.1:
6649 + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
6650 +
6174 strip-outer@1.0.1: 6651 strip-outer@1.0.1:
6175 resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} 6652 resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
6176 engines: {node: '>=0.10.0'} 6653 engines: {node: '>=0.10.0'}
...@@ -6305,6 +6782,10 @@ packages: ...@@ -6305,6 +6782,10 @@ packages:
6305 engines: {node: '>=10'} 6782 engines: {node: '>=10'}
6306 hasBin: true 6783 hasBin: true
6307 6784
6785 + test-exclude@6.0.0:
6786 + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
6787 + engines: {node: '>=8'}
6788 +
6308 text-table@0.2.0: 6789 text-table@0.2.0:
6309 resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 6790 resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
6310 6791
...@@ -6328,9 +6809,20 @@ packages: ...@@ -6328,9 +6809,20 @@ packages:
6328 tiny-case@1.0.3: 6809 tiny-case@1.0.3:
6329 resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} 6810 resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
6330 6811
6812 + tinybench@2.9.0:
6813 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
6814 +
6331 tinyexec@0.3.2: 6815 tinyexec@0.3.2:
6332 resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 6816 resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
6333 6817
6818 + tinypool@0.8.4:
6819 + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
6820 + engines: {node: '>=14.0.0'}
6821 +
6822 + tinyspy@2.2.1:
6823 + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
6824 + engines: {node: '>=14.0.0'}
6825 +
6334 to-buffer@1.2.1: 6826 to-buffer@1.2.1:
6335 resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} 6827 resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==}
6336 engines: {node: '>= 0.4'} 6828 engines: {node: '>= 0.4'}
...@@ -6390,6 +6882,10 @@ packages: ...@@ -6390,6 +6882,10 @@ packages:
6390 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 6882 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
6391 engines: {node: '>= 0.8.0'} 6883 engines: {node: '>= 0.8.0'}
6392 6884
6885 + type-detect@4.1.0:
6886 + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
6887 + engines: {node: '>=4'}
6888 +
6393 type-fest@0.20.2: 6889 type-fest@0.20.2:
6394 resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 6890 resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
6395 engines: {node: '>=10'} 6891 engines: {node: '>=10'}
...@@ -6570,12 +7066,76 @@ packages: ...@@ -6570,12 +7066,76 @@ packages:
6570 resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 7066 resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
6571 engines: {node: '>= 0.8'} 7067 engines: {node: '>= 0.8'}
6572 7068
7069 + vite-node@1.6.1:
7070 + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==}
7071 + engines: {node: ^18.0.0 || >=20.0.0}
7072 + hasBin: true
7073 +
7074 + vite@5.4.21:
7075 + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
7076 + engines: {node: ^18.0.0 || >=20.0.0}
7077 + hasBin: true
7078 + peerDependencies:
7079 + '@types/node': ^18.0.0 || >=20.0.0
7080 + less: '*'
7081 + lightningcss: ^1.21.0
7082 + sass: '*'
7083 + sass-embedded: '*'
7084 + stylus: '*'
7085 + sugarss: '*'
7086 + terser: ^5.4.0
7087 + peerDependenciesMeta:
7088 + '@types/node':
7089 + optional: true
7090 + less:
7091 + optional: true
7092 + lightningcss:
7093 + optional: true
7094 + sass:
7095 + optional: true
7096 + sass-embedded:
7097 + optional: true
7098 + stylus:
7099 + optional: true
7100 + sugarss:
7101 + optional: true
7102 + terser:
7103 + optional: true
7104 +
7105 + vitest@1.6.1:
7106 + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==}
7107 + engines: {node: ^18.0.0 || >=20.0.0}
7108 + hasBin: true
7109 + peerDependencies:
7110 + '@edge-runtime/vm': '*'
7111 + '@types/node': ^18.0.0 || >=20.0.0
7112 + '@vitest/browser': 1.6.1
7113 + '@vitest/ui': 1.6.1
7114 + happy-dom: '*'
7115 + jsdom: '*'
7116 + peerDependenciesMeta:
7117 + '@edge-runtime/vm':
7118 + optional: true
7119 + '@types/node':
7120 + optional: true
7121 + '@vitest/browser':
7122 + optional: true
7123 + '@vitest/ui':
7124 + optional: true
7125 + happy-dom:
7126 + optional: true
7127 + jsdom:
7128 + optional: true
7129 +
6573 vm2@3.9.19: 7130 vm2@3.9.19:
6574 resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==} 7131 resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==}
6575 engines: {node: '>=6.0'} 7132 engines: {node: '>=6.0'}
6576 deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm. 7133 deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.
6577 hasBin: true 7134 hasBin: true
6578 7135
7136 + vue-component-type-helpers@2.2.12:
7137 + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==}
7138 +
6579 vue-loader@17.4.2: 7139 vue-loader@17.4.2:
6580 resolution: {integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==} 7140 resolution: {integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==}
6581 peerDependencies: 7141 peerDependencies:
...@@ -6688,6 +7248,7 @@ packages: ...@@ -6688,6 +7248,7 @@ packages:
6688 whatwg-encoding@3.1.1: 7248 whatwg-encoding@3.1.1:
6689 resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} 7249 resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
6690 engines: {node: '>=18'} 7250 engines: {node: '>=18'}
7251 + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
6691 7252
6692 whatwg-fetch@3.6.20: 7253 whatwg-fetch@3.6.20:
6693 resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} 7254 resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
...@@ -6721,6 +7282,11 @@ packages: ...@@ -6721,6 +7282,11 @@ packages:
6721 engines: {node: '>= 8'} 7282 engines: {node: '>= 8'}
6722 hasBin: true 7283 hasBin: true
6723 7284
7285 + why-is-node-running@2.3.0:
7286 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
7287 + engines: {node: '>=8'}
7288 + hasBin: true
7289 +
6724 wildcard@2.0.1: 7290 wildcard@2.0.1:
6725 resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} 7291 resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
6726 7292
...@@ -6740,6 +7306,10 @@ packages: ...@@ -6740,6 +7306,10 @@ packages:
6740 resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 7306 resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
6741 engines: {node: '>=12'} 7307 engines: {node: '>=12'}
6742 7308
7309 + wrap-ansi@9.0.2:
7310 + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
7311 + engines: {node: '>=18'}
7312 +
6743 wrappy@1.0.2: 7313 wrappy@1.0.2:
6744 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 7314 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
6745 7315
...@@ -6803,6 +7373,10 @@ packages: ...@@ -6803,6 +7373,10 @@ packages:
6803 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 7373 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
6804 engines: {node: '>=10'} 7374 engines: {node: '>=10'}
6805 7375
7376 + yocto-queue@1.2.2:
7377 + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
7378 + engines: {node: '>=12.20'}
7379 +
6806 yup@1.7.0: 7380 yup@1.7.0:
6807 resolution: {integrity: sha512-VJce62dBd+JQvoc+fCVq+KZfPHr+hXaxCcVgotfwWvlR0Ja3ffYKaJBT8rptPOSKOGJDCUnW2C2JWpud7aRP6Q==} 7381 resolution: {integrity: sha512-VJce62dBd+JQvoc+fCVq+KZfPHr+hXaxCcVgotfwWvlR0Ja3ffYKaJBT8rptPOSKOGJDCUnW2C2JWpud7aRP6Q==}
6808 7382
...@@ -7557,6 +8131,8 @@ snapshots: ...@@ -7557,6 +8131,8 @@ snapshots:
7557 '@babel/helper-string-parser': 7.27.1 8131 '@babel/helper-string-parser': 7.27.1
7558 '@babel/helper-validator-identifier': 7.27.1 8132 '@babel/helper-validator-identifier': 7.27.1
7559 8133
8134 + '@bcoe/v8-coverage@0.2.3': {}
8135 +
7560 '@csstools/cascade-layer-name-parser@2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': 8136 '@csstools/cascade-layer-name-parser@2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
7561 dependencies: 8137 dependencies:
7562 '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) 8138 '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
...@@ -8065,6 +8641,8 @@ snapshots: ...@@ -8065,6 +8641,8 @@ snapshots:
8065 dependencies: 8641 dependencies:
8066 minipass: 7.1.2 8642 minipass: 7.1.2
8067 8643
8644 + '@istanbuljs/schema@0.1.3': {}
8645 +
8068 '@jest/schemas@29.6.3': 8646 '@jest/schemas@29.6.3':
8069 dependencies: 8647 dependencies:
8070 '@sinclair/typebox': 0.27.8 8648 '@sinclair/typebox': 0.27.8
...@@ -8155,6 +8733,8 @@ snapshots: ...@@ -8155,6 +8733,8 @@ snapshots:
8155 optionalDependencies: 8733 optionalDependencies:
8156 unplugin-vue-components: 0.26.0(@babel/parser@7.28.3)(rollup@3.29.5)(vue@3.5.20(typescript@5.9.2)) 8734 unplugin-vue-components: 0.26.0(@babel/parser@7.28.3)(rollup@3.29.5)(vue@3.5.20(typescript@5.9.2))
8157 8735
8736 + '@one-ini/wasm@0.1.1': {}
8737 +
8158 '@parcel/watcher-android-arm64@2.5.1': 8738 '@parcel/watcher-android-arm64@2.5.1':
8159 optional: true 8739 optional: true
8160 8740
...@@ -8240,7 +8820,82 @@ snapshots: ...@@ -8240,7 +8820,82 @@ snapshots:
8240 optionalDependencies: 8820 optionalDependencies:
8241 rollup: 3.29.5 8821 rollup: 3.29.5
8242 8822
8243 - '@rtsao/scc@1.1.0': {} 8823 + '@rollup/rollup-android-arm-eabi@4.57.1':
8824 + optional: true
8825 +
8826 + '@rollup/rollup-android-arm64@4.57.1':
8827 + optional: true
8828 +
8829 + '@rollup/rollup-darwin-arm64@4.57.1':
8830 + optional: true
8831 +
8832 + '@rollup/rollup-darwin-x64@4.57.1':
8833 + optional: true
8834 +
8835 + '@rollup/rollup-freebsd-arm64@4.57.1':
8836 + optional: true
8837 +
8838 + '@rollup/rollup-freebsd-x64@4.57.1':
8839 + optional: true
8840 +
8841 + '@rollup/rollup-linux-arm-gnueabihf@4.57.1':
8842 + optional: true
8843 +
8844 + '@rollup/rollup-linux-arm-musleabihf@4.57.1':
8845 + optional: true
8846 +
8847 + '@rollup/rollup-linux-arm64-gnu@4.57.1':
8848 + optional: true
8849 +
8850 + '@rollup/rollup-linux-arm64-musl@4.57.1':
8851 + optional: true
8852 +
8853 + '@rollup/rollup-linux-loong64-gnu@4.57.1':
8854 + optional: true
8855 +
8856 + '@rollup/rollup-linux-loong64-musl@4.57.1':
8857 + optional: true
8858 +
8859 + '@rollup/rollup-linux-ppc64-gnu@4.57.1':
8860 + optional: true
8861 +
8862 + '@rollup/rollup-linux-ppc64-musl@4.57.1':
8863 + optional: true
8864 +
8865 + '@rollup/rollup-linux-riscv64-gnu@4.57.1':
8866 + optional: true
8867 +
8868 + '@rollup/rollup-linux-riscv64-musl@4.57.1':
8869 + optional: true
8870 +
8871 + '@rollup/rollup-linux-s390x-gnu@4.57.1':
8872 + optional: true
8873 +
8874 + '@rollup/rollup-linux-x64-gnu@4.57.1':
8875 + optional: true
8876 +
8877 + '@rollup/rollup-linux-x64-musl@4.57.1':
8878 + optional: true
8879 +
8880 + '@rollup/rollup-openbsd-x64@4.57.1':
8881 + optional: true
8882 +
8883 + '@rollup/rollup-openharmony-arm64@4.57.1':
8884 + optional: true
8885 +
8886 + '@rollup/rollup-win32-arm64-msvc@4.57.1':
8887 + optional: true
8888 +
8889 + '@rollup/rollup-win32-ia32-msvc@4.57.1':
8890 + optional: true
8891 +
8892 + '@rollup/rollup-win32-x64-gnu@4.57.1':
8893 + optional: true
8894 +
8895 + '@rollup/rollup-win32-x64-msvc@4.57.1':
8896 + optional: true
8897 +
8898 + '@rtsao/scc@1.1.0': {}
8244 8899
8245 '@sideway/address@4.1.5': 8900 '@sideway/address@4.1.5':
8246 dependencies: 8901 dependencies:
...@@ -8323,10 +8978,10 @@ snapshots: ...@@ -8323,10 +8978,10 @@ snapshots:
8323 dependencies: 8978 dependencies:
8324 defer-to-connect: 1.1.3 8979 defer-to-connect: 1.1.3
8325 8980
8326 - '@tailwindcss-mangle/config@5.1.1': 8981 + '@tailwindcss-mangle/config@5.1.1(magicast@0.3.5)':
8327 dependencies: 8982 dependencies:
8328 '@tailwindcss-mangle/shared': 4.1.1 8983 '@tailwindcss-mangle/shared': 4.1.1
8329 - c12: 2.0.4 8984 + c12: 2.0.4(magicast@0.3.5)
8330 fs-extra: 11.3.1 8985 fs-extra: 11.3.1
8331 is-css-request: 1.0.1 8986 is-css-request: 1.0.1
8332 pathe: 2.0.3 8987 pathe: 2.0.3
...@@ -8506,7 +9161,7 @@ snapshots: ...@@ -8506,7 +9161,7 @@ snapshots:
8506 transitivePeerDependencies: 9161 transitivePeerDependencies:
8507 - supports-color 9162 - supports-color
8508 9163
8509 - '@tarojs/plugin-framework-vue3@4.1.7(@tarojs/helper@4.1.7)(@tarojs/runner-utils@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)(vue-loader@17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)))(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96))': 9164 + '@tarojs/plugin-framework-vue3@4.1.7(@tarojs/helper@4.1.7)(@tarojs/runner-utils@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)(@vitejs/plugin-vue@5.2.4(vue@3.5.20(typescript@5.9.2)))(vue-loader@17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)))(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96))':
8510 dependencies: 9165 dependencies:
8511 '@tarojs/helper': 4.1.7 9166 '@tarojs/helper': 4.1.7
8512 '@tarojs/runner-utils': 4.1.7 9167 '@tarojs/runner-utils': 4.1.7
...@@ -8517,6 +9172,8 @@ snapshots: ...@@ -8517,6 +9172,8 @@ snapshots:
8517 vue: 3.5.20(typescript@5.9.2) 9172 vue: 3.5.20(typescript@5.9.2)
8518 vue-loader: 17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)) 9173 vue-loader: 17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96))
8519 webpack: 5.78.0(@swc/core@1.3.96) 9174 webpack: 5.78.0(@swc/core@1.3.96)
9175 + optionalDependencies:
9176 + '@vitejs/plugin-vue': 5.2.4(vue@3.5.20(typescript@5.9.2))
8520 9177
8521 '@tarojs/plugin-html@4.1.7(@tarojs/helper@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)': 9178 '@tarojs/plugin-html@4.1.7(@tarojs/helper@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)':
8522 dependencies: 9179 dependencies:
...@@ -9023,6 +9680,58 @@ snapshots: ...@@ -9023,6 +9680,58 @@ snapshots:
9023 9680
9024 '@ungap/structured-clone@1.3.0': {} 9681 '@ungap/structured-clone@1.3.0': {}
9025 9682
9683 + '@vitejs/plugin-vue@5.2.4(vue@3.5.20(typescript@5.9.2))':
9684 + dependencies:
9685 + vue: 3.5.20(typescript@5.9.2)
9686 +
9687 + '@vitest/coverage-v8@1.6.1(vitest@1.6.1(@types/node@24.3.0)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1))':
9688 + dependencies:
9689 + '@ampproject/remapping': 2.3.0
9690 + '@bcoe/v8-coverage': 0.2.3
9691 + debug: 4.4.1
9692 + istanbul-lib-coverage: 3.2.2
9693 + istanbul-lib-report: 3.0.1
9694 + istanbul-lib-source-maps: 5.0.6
9695 + istanbul-reports: 3.2.0
9696 + magic-string: 0.30.18
9697 + magicast: 0.3.5
9698 + picocolors: 1.1.1
9699 + std-env: 3.9.0
9700 + strip-literal: 2.1.1
9701 + test-exclude: 6.0.0
9702 + vitest: 1.6.1(@types/node@24.3.0)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1)
9703 + transitivePeerDependencies:
9704 + - supports-color
9705 +
9706 + '@vitest/expect@1.6.1':
9707 + dependencies:
9708 + '@vitest/spy': 1.6.1
9709 + '@vitest/utils': 1.6.1
9710 + chai: 4.5.0
9711 +
9712 + '@vitest/runner@1.6.1':
9713 + dependencies:
9714 + '@vitest/utils': 1.6.1
9715 + p-limit: 5.0.0
9716 + pathe: 1.1.2
9717 +
9718 + '@vitest/snapshot@1.6.1':
9719 + dependencies:
9720 + magic-string: 0.30.18
9721 + pathe: 1.1.2
9722 + pretty-format: 29.7.0
9723 +
9724 + '@vitest/spy@1.6.1':
9725 + dependencies:
9726 + tinyspy: 2.2.1
9727 +
9728 + '@vitest/utils@1.6.1':
9729 + dependencies:
9730 + diff-sequences: 29.6.3
9731 + estree-walker: 3.0.3
9732 + loupe: 2.3.7
9733 + pretty-format: 29.7.0
9734 +
9026 '@vue/babel-helper-vue-transform-on@1.5.0': {} 9735 '@vue/babel-helper-vue-transform-on@1.5.0': {}
9027 9736
9028 '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.3)': 9737 '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.3)':
...@@ -9124,6 +9833,11 @@ snapshots: ...@@ -9124,6 +9833,11 @@ snapshots:
9124 9833
9125 '@vue/shared@3.5.20': {} 9834 '@vue/shared@3.5.20': {}
9126 9835
9836 + '@vue/test-utils@2.4.6':
9837 + dependencies:
9838 + js-beautify: 1.15.4
9839 + vue-component-type-helpers: 2.2.12
9840 +
9127 '@weapp-core/escape@4.0.1': {} 9841 '@weapp-core/escape@4.0.1': {}
9128 9842
9129 '@weapp-core/regex@1.0.1': {} 9843 '@weapp-core/regex@1.0.1': {}
...@@ -9239,6 +9953,8 @@ snapshots: ...@@ -9239,6 +9953,8 @@ snapshots:
9239 9953
9240 '@xtuc/long@4.2.2': {} 9954 '@xtuc/long@4.2.2': {}
9241 9955
9956 + abbrev@2.0.0: {}
9957 +
9242 abortcontroller-polyfill@1.7.8: {} 9958 abortcontroller-polyfill@1.7.8: {}
9243 9959
9244 accepts@1.3.8: 9960 accepts@1.3.8:
...@@ -9302,6 +10018,10 @@ snapshots: ...@@ -9302,6 +10018,10 @@ snapshots:
9302 dependencies: 10018 dependencies:
9303 type-fest: 0.21.3 10019 type-fest: 0.21.3
9304 10020
10021 + ansi-escapes@7.3.0:
10022 + dependencies:
10023 + environment: 1.1.0
10024 +
9305 ansi-html-community@0.0.8: {} 10025 ansi-html-community@0.0.8: {}
9306 10026
9307 ansi-regex@5.0.1: {} 10027 ansi-regex@5.0.1: {}
...@@ -9312,6 +10032,8 @@ snapshots: ...@@ -9312,6 +10032,8 @@ snapshots:
9312 dependencies: 10032 dependencies:
9313 color-convert: 2.0.1 10033 color-convert: 2.0.1
9314 10034
10035 + ansi-styles@5.2.0: {}
10036 +
9315 ansi-styles@6.2.1: {} 10037 ansi-styles@6.2.1: {}
9316 10038
9317 any-promise@1.3.0: {} 10039 any-promise@1.3.0: {}
...@@ -9385,6 +10107,8 @@ snapshots: ...@@ -9385,6 +10107,8 @@ snapshots:
9385 get-intrinsic: 1.3.0 10107 get-intrinsic: 1.3.0
9386 is-array-buffer: 3.0.5 10108 is-array-buffer: 3.0.5
9387 10109
10110 + assertion-error@1.1.0: {}
10111 +
9388 async-function@1.0.0: {} 10112 async-function@1.0.0: {}
9389 10113
9390 asynckit@0.4.0: {} 10114 asynckit@0.4.0: {}
...@@ -9591,7 +10315,7 @@ snapshots: ...@@ -9591,7 +10315,7 @@ snapshots:
9591 10315
9592 bytes@3.1.2: {} 10316 bytes@3.1.2: {}
9593 10317
9594 - c12@2.0.4: 10318 + c12@2.0.4(magicast@0.3.5):
9595 dependencies: 10319 dependencies:
9596 chokidar: 4.0.3 10320 chokidar: 4.0.3
9597 confbox: 0.1.8 10321 confbox: 0.1.8
...@@ -9605,6 +10329,8 @@ snapshots: ...@@ -9605,6 +10329,8 @@ snapshots:
9605 perfect-debounce: 1.0.0 10329 perfect-debounce: 1.0.0
9606 pkg-types: 1.3.1 10330 pkg-types: 1.3.1
9607 rc9: 2.1.2 10331 rc9: 2.1.2
10332 + optionalDependencies:
10333 + magicast: 0.3.5
9608 10334
9609 cac@6.7.14: {} 10335 cac@6.7.14: {}
9610 10336
...@@ -9698,6 +10424,16 @@ snapshots: ...@@ -9698,6 +10424,16 @@ snapshots:
9698 tunnel-agent: 0.6.0 10424 tunnel-agent: 0.6.0
9699 url-to-options: 1.0.1 10425 url-to-options: 1.0.1
9700 10426
10427 + chai@4.5.0:
10428 + dependencies:
10429 + assertion-error: 1.1.0
10430 + check-error: 1.0.3
10431 + deep-eql: 4.1.4
10432 + get-func-name: 2.0.2
10433 + loupe: 2.3.7
10434 + pathval: 1.1.1
10435 + type-detect: 4.1.0
10436 +
9701 chalk@3.0.0: 10437 chalk@3.0.0:
9702 dependencies: 10438 dependencies:
9703 ansi-styles: 4.3.0 10439 ansi-styles: 4.3.0
...@@ -9727,6 +10463,10 @@ snapshots: ...@@ -9727,6 +10463,10 @@ snapshots:
9727 10463
9728 charenc@0.0.2: {} 10464 charenc@0.0.2: {}
9729 10465
10466 + check-error@1.0.3:
10467 + dependencies:
10468 + get-func-name: 2.0.2
10469 +
9730 chokidar@3.6.0: 10470 chokidar@3.6.0:
9731 dependencies: 10471 dependencies:
9732 anymatch: 3.1.3 10472 anymatch: 3.1.3
...@@ -9769,6 +10509,10 @@ snapshots: ...@@ -9769,6 +10509,10 @@ snapshots:
9769 dependencies: 10509 dependencies:
9770 restore-cursor: 3.1.0 10510 restore-cursor: 3.1.0
9771 10511
10512 + cli-cursor@5.0.0:
10513 + dependencies:
10514 + restore-cursor: 5.1.0
10515 +
9772 cli-highlight@2.1.11: 10516 cli-highlight@2.1.11:
9773 dependencies: 10517 dependencies:
9774 chalk: 4.1.2 10518 chalk: 4.1.2
...@@ -9780,6 +10524,11 @@ snapshots: ...@@ -9780,6 +10524,11 @@ snapshots:
9780 10524
9781 cli-spinners@2.9.2: {} 10525 cli-spinners@2.9.2: {}
9782 10526
10527 + cli-truncate@5.1.1:
10528 + dependencies:
10529 + slice-ansi: 7.1.2
10530 + string-width: 8.1.1
10531 +
9783 cli-width@3.0.0: {} 10532 cli-width@3.0.0: {}
9784 10533
9785 cliui@7.0.4: 10534 cliui@7.0.4:
...@@ -9818,6 +10567,10 @@ snapshots: ...@@ -9818,6 +10567,10 @@ snapshots:
9818 dependencies: 10567 dependencies:
9819 delayed-stream: 1.0.0 10568 delayed-stream: 1.0.0
9820 10569
10570 + commander@10.0.1: {}
10571 +
10572 + commander@14.0.3: {}
10573 +
9821 commander@2.20.3: {} 10574 commander@2.20.3: {}
9822 10575
9823 commander@4.1.1: {} 10576 commander@4.1.1: {}
...@@ -10169,6 +10922,10 @@ snapshots: ...@@ -10169,6 +10922,10 @@ snapshots:
10169 pify: 2.3.0 10922 pify: 2.3.0
10170 strip-dirs: 2.1.0 10923 strip-dirs: 2.1.0
10171 10924
10925 + deep-eql@4.1.4:
10926 + dependencies:
10927 + type-detect: 4.1.0
10928 +
10172 deep-extend@0.6.0: {} 10929 deep-extend@0.6.0: {}
10173 10930
10174 deep-is@0.1.4: {} 10931 deep-is@0.1.4: {}
...@@ -10227,6 +10984,8 @@ snapshots: ...@@ -10227,6 +10984,8 @@ snapshots:
10227 10984
10228 didyoumean@1.2.2: {} 10985 didyoumean@1.2.2: {}
10229 10986
10987 + diff-sequences@29.6.3: {}
10988 +
10230 dingtalk-jsapi@2.15.6: 10989 dingtalk-jsapi@2.15.6:
10231 dependencies: 10990 dependencies:
10232 promise-polyfill: 7.1.2 10991 promise-polyfill: 7.1.2
...@@ -10329,10 +11088,19 @@ snapshots: ...@@ -10329,10 +11088,19 @@ snapshots:
10329 11088
10330 eastasianwidth@0.2.0: {} 11089 eastasianwidth@0.2.0: {}
10331 11090
11091 + editorconfig@1.0.4:
11092 + dependencies:
11093 + '@one-ini/wasm': 0.1.1
11094 + commander: 10.0.1
11095 + minimatch: 9.0.1
11096 + semver: 7.7.2
11097 +
10332 ee-first@1.1.1: {} 11098 ee-first@1.1.1: {}
10333 11099
10334 electron-to-chromium@1.5.211: {} 11100 electron-to-chromium@1.5.211: {}
10335 11101
11102 + emoji-regex@10.6.0: {}
11103 +
10336 emoji-regex@8.0.0: {} 11104 emoji-regex@8.0.0: {}
10337 11105
10338 emoji-regex@9.2.2: {} 11106 emoji-regex@9.2.2: {}
...@@ -10367,6 +11135,8 @@ snapshots: ...@@ -10367,6 +11135,8 @@ snapshots:
10367 11135
10368 envinfo@7.14.0: {} 11136 envinfo@7.14.0: {}
10369 11137
11138 + environment@1.1.0: {}
11139 +
10370 err-code@2.0.3: {} 11140 err-code@2.0.3: {}
10371 11141
10372 errno@0.1.8: 11142 errno@0.1.8:
...@@ -10717,12 +11487,18 @@ snapshots: ...@@ -10717,12 +11487,18 @@ snapshots:
10717 11487
10718 estree-walker@2.0.2: {} 11488 estree-walker@2.0.2: {}
10719 11489
11490 + estree-walker@3.0.3:
11491 + dependencies:
11492 + '@types/estree': 1.0.8
11493 +
10720 esutils@2.0.3: {} 11494 esutils@2.0.3: {}
10721 11495
10722 etag@1.8.1: {} 11496 etag@1.8.1: {}
10723 11497
10724 eventemitter3@4.0.7: {} 11498 eventemitter3@4.0.7: {}
10725 11499
11500 + eventemitter3@5.0.4: {}
11501 +
10726 events@3.3.0: {} 11502 events@3.3.0: {}
10727 11503
10728 execa@5.1.1: 11504 execa@5.1.1:
...@@ -10737,6 +11513,18 @@ snapshots: ...@@ -10737,6 +11513,18 @@ snapshots:
10737 signal-exit: 3.0.7 11513 signal-exit: 3.0.7
10738 strip-final-newline: 2.0.0 11514 strip-final-newline: 2.0.0
10739 11515
11516 + execa@8.0.1:
11517 + dependencies:
11518 + cross-spawn: 7.0.6
11519 + get-stream: 8.0.1
11520 + human-signals: 5.0.0
11521 + is-stream: 3.0.0
11522 + merge-stream: 2.0.0
11523 + npm-run-path: 5.3.0
11524 + onetime: 6.0.0
11525 + signal-exit: 4.1.0
11526 + strip-final-newline: 3.0.0
11527 +
10740 expr-parser@1.0.0: {} 11528 expr-parser@1.0.0: {}
10741 11529
10742 express@4.21.2: 11530 express@4.21.2:
...@@ -10963,6 +11751,10 @@ snapshots: ...@@ -10963,6 +11751,10 @@ snapshots:
10963 11751
10964 get-caller-file@2.0.5: {} 11752 get-caller-file@2.0.5: {}
10965 11753
11754 + get-east-asian-width@1.4.0: {}
11755 +
11756 + get-func-name@2.0.2: {}
11757 +
10966 get-intrinsic@1.3.0: 11758 get-intrinsic@1.3.0:
10967 dependencies: 11759 dependencies:
10968 call-bind-apply-helpers: 1.0.2 11760 call-bind-apply-helpers: 1.0.2
...@@ -11002,6 +11794,8 @@ snapshots: ...@@ -11002,6 +11794,8 @@ snapshots:
11002 11794
11003 get-stream@6.0.1: {} 11795 get-stream@6.0.1: {}
11004 11796
11797 + get-stream@8.0.1: {}
11798 +
11005 get-symbol-description@1.1.0: 11799 get-symbol-description@1.1.0:
11006 dependencies: 11800 dependencies:
11007 call-bound: 1.0.4 11801 call-bound: 1.0.4
...@@ -11207,6 +12001,8 @@ snapshots: ...@@ -11207,6 +12001,8 @@ snapshots:
11207 12001
11208 html-entities@2.6.0: {} 12002 html-entities@2.6.0: {}
11209 12003
12004 + html-escaper@2.0.2: {}
12005 +
11210 html-minifier-terser@6.1.0: 12006 html-minifier-terser@6.1.0:
11211 dependencies: 12007 dependencies:
11212 camel-case: 4.1.2 12008 camel-case: 4.1.2
...@@ -11310,6 +12106,10 @@ snapshots: ...@@ -11310,6 +12106,10 @@ snapshots:
11310 12106
11311 human-signals@2.1.0: {} 12107 human-signals@2.1.0: {}
11312 12108
12109 + human-signals@5.0.0: {}
12110 +
12111 + husky@9.1.7: {}
12112 +
11313 iconv-lite@0.4.24: 12113 iconv-lite@0.4.24:
11314 dependencies: 12114 dependencies:
11315 safer-buffer: 2.1.2 12115 safer-buffer: 2.1.2
...@@ -11462,6 +12262,10 @@ snapshots: ...@@ -11462,6 +12262,10 @@ snapshots:
11462 12262
11463 is-fullwidth-code-point@3.0.0: {} 12263 is-fullwidth-code-point@3.0.0: {}
11464 12264
12265 + is-fullwidth-code-point@5.1.0:
12266 + dependencies:
12267 + get-east-asian-width: 1.4.0
12268 +
11465 is-generator-function@1.1.0: 12269 is-generator-function@1.1.0:
11466 dependencies: 12270 dependencies:
11467 call-bound: 1.0.4 12271 call-bound: 1.0.4
...@@ -11525,6 +12329,8 @@ snapshots: ...@@ -11525,6 +12329,8 @@ snapshots:
11525 12329
11526 is-stream@2.0.1: {} 12330 is-stream@2.0.1: {}
11527 12331
12332 + is-stream@3.0.0: {}
12333 +
11528 is-string@1.1.1: 12334 is-string@1.1.1:
11529 dependencies: 12335 dependencies:
11530 call-bound: 1.0.4 12336 call-bound: 1.0.4
...@@ -11569,6 +12375,27 @@ snapshots: ...@@ -11569,6 +12375,27 @@ snapshots:
11569 12375
11570 isobject@3.0.1: {} 12376 isobject@3.0.1: {}
11571 12377
12378 + istanbul-lib-coverage@3.2.2: {}
12379 +
12380 + istanbul-lib-report@3.0.1:
12381 + dependencies:
12382 + istanbul-lib-coverage: 3.2.2
12383 + make-dir: 4.0.0
12384 + supports-color: 7.2.0
12385 +
12386 + istanbul-lib-source-maps@5.0.6:
12387 + dependencies:
12388 + '@jridgewell/trace-mapping': 0.3.30
12389 + debug: 4.4.1
12390 + istanbul-lib-coverage: 3.2.2
12391 + transitivePeerDependencies:
12392 + - supports-color
12393 +
12394 + istanbul-reports@3.2.0:
12395 + dependencies:
12396 + html-escaper: 2.0.2
12397 + istanbul-lib-report: 3.0.1
12398 +
11572 isurl@1.0.0: 12399 isurl@1.0.0:
11573 dependencies: 12400 dependencies:
11574 has-to-string-tag-x: 1.4.1 12401 has-to-string-tag-x: 1.4.1
...@@ -11628,8 +12455,20 @@ snapshots: ...@@ -11628,8 +12455,20 @@ snapshots:
11628 '@sideway/formula': 3.0.1 12455 '@sideway/formula': 3.0.1
11629 '@sideway/pinpoint': 2.0.0 12456 '@sideway/pinpoint': 2.0.0
11630 12457
12458 + js-beautify@1.15.4:
12459 + dependencies:
12460 + config-chain: 1.1.13
12461 + editorconfig: 1.0.4
12462 + glob: 10.4.5
12463 + js-cookie: 3.0.5
12464 + nopt: 7.2.1
12465 +
12466 + js-cookie@3.0.5: {}
12467 +
11631 js-tokens@4.0.0: {} 12468 js-tokens@4.0.0: {}
11632 12469
12470 + js-tokens@9.0.1: {}
12471 +
11633 js-yaml@4.1.0: 12472 js-yaml@4.1.0:
11634 dependencies: 12473 dependencies:
11635 argparse: 2.0.1 12474 argparse: 2.0.1
...@@ -11798,6 +12637,25 @@ snapshots: ...@@ -11798,6 +12637,25 @@ snapshots:
11798 12637
11799 lines-and-columns@1.2.4: {} 12638 lines-and-columns@1.2.4: {}
11800 12639
12640 + lint-staged@16.2.7:
12641 + dependencies:
12642 + commander: 14.0.3
12643 + listr2: 9.0.5
12644 + micromatch: 4.0.8
12645 + nano-spawn: 2.0.0
12646 + pidtree: 0.6.0
12647 + string-argv: 0.3.2
12648 + yaml: 2.8.1
12649 +
12650 + listr2@9.0.5:
12651 + dependencies:
12652 + cli-truncate: 5.1.1
12653 + colorette: 2.0.20
12654 + eventemitter3: 5.0.4
12655 + log-update: 6.1.0
12656 + rfdc: 1.4.1
12657 + wrap-ansi: 9.0.2
12658 +
11801 loader-runner@4.3.0: {} 12659 loader-runner@4.3.0: {}
11802 12660
11803 loader-utils@1.4.2: 12661 loader-utils@1.4.2:
...@@ -11816,6 +12674,11 @@ snapshots: ...@@ -11816,6 +12674,11 @@ snapshots:
11816 12674
11817 local-pkg@0.4.3: {} 12675 local-pkg@0.4.3: {}
11818 12676
12677 + local-pkg@0.5.1:
12678 + dependencies:
12679 + mlly: 1.8.0
12680 + pkg-types: 1.3.1
12681 +
11819 local-pkg@1.1.2: 12682 local-pkg@1.1.2:
11820 dependencies: 12683 dependencies:
11821 mlly: 1.8.0 12684 mlly: 1.8.0
...@@ -11850,10 +12713,22 @@ snapshots: ...@@ -11850,10 +12713,22 @@ snapshots:
11850 chalk: 4.1.2 12713 chalk: 4.1.2
11851 is-unicode-supported: 0.1.0 12714 is-unicode-supported: 0.1.0
11852 12715
12716 + log-update@6.1.0:
12717 + dependencies:
12718 + ansi-escapes: 7.3.0
12719 + cli-cursor: 5.0.0
12720 + slice-ansi: 7.1.2
12721 + strip-ansi: 7.1.0
12722 + wrap-ansi: 9.0.2
12723 +
11853 loglevel-plugin-prefix@0.8.4: {} 12724 loglevel-plugin-prefix@0.8.4: {}
11854 12725
11855 loglevel@1.9.2: {} 12726 loglevel@1.9.2: {}
11856 12727
12728 + loupe@2.3.7:
12729 + dependencies:
12730 + get-func-name: 2.0.2
12731 +
11857 lower-case@1.1.4: {} 12732 lower-case@1.1.4: {}
11858 12733
11859 lower-case@2.0.2: 12734 lower-case@2.0.2:
...@@ -11876,6 +12751,12 @@ snapshots: ...@@ -11876,6 +12751,12 @@ snapshots:
11876 dependencies: 12751 dependencies:
11877 '@jridgewell/sourcemap-codec': 1.5.5 12752 '@jridgewell/sourcemap-codec': 1.5.5
11878 12753
12754 + magicast@0.3.5:
12755 + dependencies:
12756 + '@babel/parser': 7.28.3
12757 + '@babel/types': 7.28.2
12758 + source-map-js: 1.2.1
12759 +
11879 make-dir@1.3.0: 12760 make-dir@1.3.0:
11880 dependencies: 12761 dependencies:
11881 pify: 3.0.0 12762 pify: 3.0.0
...@@ -11889,6 +12770,10 @@ snapshots: ...@@ -11889,6 +12770,10 @@ snapshots:
11889 dependencies: 12770 dependencies:
11890 semver: 6.3.1 12771 semver: 6.3.1
11891 12772
12773 + make-dir@4.0.0:
12774 + dependencies:
12775 + semver: 7.7.2
12776 +
11892 make-fetch-happen@14.0.3: 12777 make-fetch-happen@14.0.3:
11893 dependencies: 12778 dependencies:
11894 '@npmcli/agent': 3.0.0 12779 '@npmcli/agent': 3.0.0
...@@ -11952,6 +12837,10 @@ snapshots: ...@@ -11952,6 +12837,10 @@ snapshots:
11952 12837
11953 mimic-fn@2.1.0: {} 12838 mimic-fn@2.1.0: {}
11954 12839
12840 + mimic-fn@4.0.0: {}
12841 +
12842 + mimic-function@5.0.1: {}
12843 +
11955 mimic-response@1.0.1: {} 12844 mimic-response@1.0.1: {}
11956 12845
11957 mini-css-extract-plugin@2.9.4(webpack@5.78.0(@swc/core@1.3.96)): 12846 mini-css-extract-plugin@2.9.4(webpack@5.78.0(@swc/core@1.3.96)):
...@@ -11974,6 +12863,10 @@ snapshots: ...@@ -11974,6 +12863,10 @@ snapshots:
11974 dependencies: 12863 dependencies:
11975 brace-expansion: 1.1.12 12864 brace-expansion: 1.1.12
11976 12865
12866 + minimatch@9.0.1:
12867 + dependencies:
12868 + brace-expansion: 2.0.2
12869 +
11977 minimatch@9.0.3: 12870 minimatch@9.0.3:
11978 dependencies: 12871 dependencies:
11979 brace-expansion: 2.0.2 12872 brace-expansion: 2.0.2
...@@ -12077,6 +12970,8 @@ snapshots: ...@@ -12077,6 +12970,8 @@ snapshots:
12077 object-assign: 4.1.1 12970 object-assign: 4.1.1
12078 thenify-all: 1.6.0 12971 thenify-all: 1.6.0
12079 12972
12973 + nano-spawn@2.0.0: {}
12974 +
12080 nanoid@3.3.11: {} 12975 nanoid@3.3.11: {}
12081 12976
12082 native-request@1.1.2: 12977 native-request@1.1.2:
...@@ -12110,6 +13005,10 @@ snapshots: ...@@ -12110,6 +13005,10 @@ snapshots:
12110 13005
12111 node-releases@2.0.19: {} 13006 node-releases@2.0.19: {}
12112 13007
13008 + nopt@7.2.1:
13009 + dependencies:
13010 + abbrev: 2.0.0
13011 +
12113 normalize-path@3.0.0: {} 13012 normalize-path@3.0.0: {}
12114 13013
12115 normalize-range@0.1.2: {} 13014 normalize-range@0.1.2: {}
...@@ -12151,6 +13050,10 @@ snapshots: ...@@ -12151,6 +13050,10 @@ snapshots:
12151 dependencies: 13050 dependencies:
12152 path-key: 3.1.1 13051 path-key: 3.1.1
12153 13052
13053 + npm-run-path@5.3.0:
13054 + dependencies:
13055 + path-key: 4.0.0
13056 +
12154 nth-check@2.1.1: 13057 nth-check@2.1.1:
12155 dependencies: 13058 dependencies:
12156 boolbase: 1.0.0 13059 boolbase: 1.0.0
...@@ -12221,6 +13124,14 @@ snapshots: ...@@ -12221,6 +13124,14 @@ snapshots:
12221 dependencies: 13124 dependencies:
12222 mimic-fn: 2.1.0 13125 mimic-fn: 2.1.0
12223 13126
13127 + onetime@6.0.0:
13128 + dependencies:
13129 + mimic-fn: 4.0.0
13130 +
13131 + onetime@7.0.0:
13132 + dependencies:
13133 + mimic-function: 5.0.1
13134 +
12224 open@8.4.2: 13135 open@8.4.2:
12225 dependencies: 13136 dependencies:
12226 define-lazy-prop: 2.0.0 13137 define-lazy-prop: 2.0.0
...@@ -12274,6 +13185,10 @@ snapshots: ...@@ -12274,6 +13185,10 @@ snapshots:
12274 dependencies: 13185 dependencies:
12275 yocto-queue: 0.1.0 13186 yocto-queue: 0.1.0
12276 13187
13188 + p-limit@5.0.0:
13189 + dependencies:
13190 + yocto-queue: 1.2.2
13191 +
12277 p-locate@3.0.0: 13192 p-locate@3.0.0:
12278 dependencies: 13193 dependencies:
12279 p-limit: 2.3.0 13194 p-limit: 2.3.0
...@@ -12356,6 +13271,8 @@ snapshots: ...@@ -12356,6 +13271,8 @@ snapshots:
12356 13271
12357 path-key@3.1.1: {} 13272 path-key@3.1.1: {}
12358 13273
13274 + path-key@4.0.0: {}
13275 +
12359 path-parse@1.0.7: {} 13276 path-parse@1.0.7: {}
12360 13277
12361 path-scurry@1.11.1: 13278 path-scurry@1.11.1:
...@@ -12371,8 +13288,12 @@ snapshots: ...@@ -12371,8 +13288,12 @@ snapshots:
12371 13288
12372 path-type@6.0.0: {} 13289 path-type@6.0.0: {}
12373 13290
13291 + pathe@1.1.2: {}
13292 +
12374 pathe@2.0.3: {} 13293 pathe@2.0.3: {}
12375 13294
13295 + pathval@1.1.1: {}
13296 +
12376 pend@1.2.0: {} 13297 pend@1.2.0: {}
12377 13298
12378 perfect-debounce@1.0.0: {} 13299 perfect-debounce@1.0.0: {}
...@@ -12385,6 +13306,8 @@ snapshots: ...@@ -12385,6 +13306,8 @@ snapshots:
12385 13306
12386 picomatch@4.0.3: {} 13307 picomatch@4.0.3: {}
12387 13308
13309 + pidtree@0.6.0: {}
13310 +
12388 pify@2.3.0: {} 13311 pify@2.3.0: {}
12389 13312
12390 pify@3.0.0: {} 13313 pify@3.0.0: {}
...@@ -12921,6 +13844,8 @@ snapshots: ...@@ -12921,6 +13844,8 @@ snapshots:
12921 13844
12922 prepend-http@2.0.0: {} 13845 prepend-http@2.0.0: {}
12923 13846
13847 + prettier@3.8.1: {}
13848 +
12924 pretty-bytes@5.6.0: {} 13849 pretty-bytes@5.6.0: {}
12925 13850
12926 pretty-error@4.0.0: 13851 pretty-error@4.0.0:
...@@ -12935,6 +13860,12 @@ snapshots: ...@@ -12935,6 +13860,12 @@ snapshots:
12935 ansi-styles: 4.3.0 13860 ansi-styles: 4.3.0
12936 react-is: 17.0.2 13861 react-is: 17.0.2
12937 13862
13863 + pretty-format@29.7.0:
13864 + dependencies:
13865 + '@jest/schemas': 29.6.3
13866 + ansi-styles: 5.2.0
13867 + react-is: 18.3.1
13868 +
12938 pretty-time@1.1.0: {} 13869 pretty-time@1.1.0: {}
12939 13870
12940 proc-log@5.0.0: {} 13871 proc-log@5.0.0: {}
...@@ -13022,6 +13953,8 @@ snapshots: ...@@ -13022,6 +13953,8 @@ snapshots:
13022 13953
13023 react-is@17.0.2: {} 13954 react-is@17.0.2: {}
13024 13955
13956 + react-is@18.3.1: {}
13957 +
13025 react@19.1.1: {} 13958 react@19.1.1: {}
13026 13959
13027 read-cache@1.0.0: 13960 read-cache@1.0.0:
...@@ -13148,6 +14081,11 @@ snapshots: ...@@ -13148,6 +14081,11 @@ snapshots:
13148 onetime: 5.1.2 14081 onetime: 5.1.2
13149 signal-exit: 3.0.7 14082 signal-exit: 3.0.7
13150 14083
14084 + restore-cursor@5.1.0:
14085 + dependencies:
14086 + onetime: 7.0.0
14087 + signal-exit: 4.1.0
14088 +
13151 retry@0.12.0: {} 14089 retry@0.12.0: {}
13152 14090
13153 retry@0.13.1: {} 14091 retry@0.13.1: {}
...@@ -13164,6 +14102,37 @@ snapshots: ...@@ -13164,6 +14102,37 @@ snapshots:
13164 optionalDependencies: 14102 optionalDependencies:
13165 fsevents: 2.3.3 14103 fsevents: 2.3.3
13166 14104
14105 + rollup@4.57.1:
14106 + dependencies:
14107 + '@types/estree': 1.0.8
14108 + optionalDependencies:
14109 + '@rollup/rollup-android-arm-eabi': 4.57.1
14110 + '@rollup/rollup-android-arm64': 4.57.1
14111 + '@rollup/rollup-darwin-arm64': 4.57.1
14112 + '@rollup/rollup-darwin-x64': 4.57.1
14113 + '@rollup/rollup-freebsd-arm64': 4.57.1
14114 + '@rollup/rollup-freebsd-x64': 4.57.1
14115 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1
14116 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1
14117 + '@rollup/rollup-linux-arm64-gnu': 4.57.1
14118 + '@rollup/rollup-linux-arm64-musl': 4.57.1
14119 + '@rollup/rollup-linux-loong64-gnu': 4.57.1
14120 + '@rollup/rollup-linux-loong64-musl': 4.57.1
14121 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1
14122 + '@rollup/rollup-linux-ppc64-musl': 4.57.1
14123 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1
14124 + '@rollup/rollup-linux-riscv64-musl': 4.57.1
14125 + '@rollup/rollup-linux-s390x-gnu': 4.57.1
14126 + '@rollup/rollup-linux-x64-gnu': 4.57.1
14127 + '@rollup/rollup-linux-x64-musl': 4.57.1
14128 + '@rollup/rollup-openbsd-x64': 4.57.1
14129 + '@rollup/rollup-openharmony-arm64': 4.57.1
14130 + '@rollup/rollup-win32-arm64-msvc': 4.57.1
14131 + '@rollup/rollup-win32-ia32-msvc': 4.57.1
14132 + '@rollup/rollup-win32-x64-gnu': 4.57.1
14133 + '@rollup/rollup-win32-x64-msvc': 4.57.1
14134 + fsevents: 2.3.3
14135 +
13167 rrweb-cssom@0.7.1: {} 14136 rrweb-cssom@0.7.1: {}
13168 14137
13169 rrweb-cssom@0.8.0: {} 14138 rrweb-cssom@0.8.0: {}
...@@ -13406,6 +14375,8 @@ snapshots: ...@@ -13406,6 +14375,8 @@ snapshots:
13406 side-channel-map: 1.0.1 14375 side-channel-map: 1.0.1
13407 side-channel-weakmap: 1.0.2 14376 side-channel-weakmap: 1.0.2
13408 14377
14378 + siginfo@2.0.0: {}
14379 +
13409 signal-exit@3.0.7: {} 14380 signal-exit@3.0.7: {}
13410 14381
13411 signal-exit@4.1.0: {} 14382 signal-exit@4.1.0: {}
...@@ -13414,6 +14385,11 @@ snapshots: ...@@ -13414,6 +14385,11 @@ snapshots:
13414 14385
13415 slash@5.1.0: {} 14386 slash@5.1.0: {}
13416 14387
14388 + slice-ansi@7.1.2:
14389 + dependencies:
14390 + ansi-styles: 6.2.1
14391 + is-fullwidth-code-point: 5.1.0
14392 +
13417 smart-buffer@4.2.0: {} 14393 smart-buffer@4.2.0: {}
13418 14394
13419 snake-case@3.0.4: 14395 snake-case@3.0.4:
...@@ -13502,6 +14478,8 @@ snapshots: ...@@ -13502,6 +14478,8 @@ snapshots:
13502 dependencies: 14478 dependencies:
13503 minipass: 7.1.2 14479 minipass: 7.1.2
13504 14480
14481 + stackback@0.0.2: {}
14482 +
13505 statuses@1.5.0: {} 14483 statuses@1.5.0: {}
13506 14484
13507 statuses@2.0.1: {} 14485 statuses@2.0.1: {}
...@@ -13515,6 +14493,8 @@ snapshots: ...@@ -13515,6 +14493,8 @@ snapshots:
13515 14493
13516 strict-uri-encode@1.1.0: {} 14494 strict-uri-encode@1.1.0: {}
13517 14495
14496 + string-argv@0.3.2: {}
14497 +
13518 string-width@4.2.3: 14498 string-width@4.2.3:
13519 dependencies: 14499 dependencies:
13520 emoji-regex: 8.0.0 14500 emoji-regex: 8.0.0
...@@ -13527,6 +14507,17 @@ snapshots: ...@@ -13527,6 +14507,17 @@ snapshots:
13527 emoji-regex: 9.2.2 14507 emoji-regex: 9.2.2
13528 strip-ansi: 7.1.0 14508 strip-ansi: 7.1.0
13529 14509
14510 + string-width@7.2.0:
14511 + dependencies:
14512 + emoji-regex: 10.6.0
14513 + get-east-asian-width: 1.4.0
14514 + strip-ansi: 7.1.0
14515 +
14516 + string-width@8.1.1:
14517 + dependencies:
14518 + get-east-asian-width: 1.4.0
14519 + strip-ansi: 7.1.0
14520 +
13530 string.fromcodepoint@0.2.1: {} 14521 string.fromcodepoint@0.2.1: {}
13531 14522
13532 string.prototype.trim@1.2.10: 14523 string.prototype.trim@1.2.10:
...@@ -13576,10 +14567,16 @@ snapshots: ...@@ -13576,10 +14567,16 @@ snapshots:
13576 14567
13577 strip-final-newline@2.0.0: {} 14568 strip-final-newline@2.0.0: {}
13578 14569
14570 + strip-final-newline@3.0.0: {}
14571 +
13579 strip-json-comments@2.0.1: {} 14572 strip-json-comments@2.0.1: {}
13580 14573
13581 strip-json-comments@3.1.1: {} 14574 strip-json-comments@3.1.1: {}
13582 14575
14576 + strip-literal@2.1.1:
14577 + dependencies:
14578 + js-tokens: 9.0.1
14579 +
13583 strip-outer@1.0.1: 14580 strip-outer@1.0.1:
13584 dependencies: 14581 dependencies:
13585 escape-string-regexp: 1.0.5 14582 escape-string-regexp: 1.0.5
...@@ -13666,13 +14663,13 @@ snapshots: ...@@ -13666,13 +14663,13 @@ snapshots:
13666 jiti: 2.5.1 14663 jiti: 2.5.1
13667 lilconfig: 3.1.3 14664 lilconfig: 3.1.3
13668 14665
13669 - tailwindcss-patch@7.1.4(tailwindcss@3.4.17): 14666 + tailwindcss-patch@7.1.4(magicast@0.3.5)(tailwindcss@3.4.17):
13670 dependencies: 14667 dependencies:
13671 '@babel/generator': 7.28.3 14668 '@babel/generator': 7.28.3
13672 '@babel/parser': 7.28.3 14669 '@babel/parser': 7.28.3
13673 '@babel/traverse': 7.28.3 14670 '@babel/traverse': 7.28.3
13674 '@babel/types': 7.28.2 14671 '@babel/types': 7.28.2
13675 - '@tailwindcss-mangle/config': 5.1.1 14672 + '@tailwindcss-mangle/config': 5.1.1(magicast@0.3.5)
13676 cac: 6.7.14 14673 cac: 6.7.14
13677 consola: 3.4.2 14674 consola: 3.4.2
13678 fs-extra: 11.3.1 14675 fs-extra: 11.3.1
...@@ -13765,6 +14762,12 @@ snapshots: ...@@ -13765,6 +14762,12 @@ snapshots:
13765 commander: 2.20.3 14762 commander: 2.20.3
13766 source-map-support: 0.5.21 14763 source-map-support: 0.5.21
13767 14764
14765 + test-exclude@6.0.0:
14766 + dependencies:
14767 + '@istanbuljs/schema': 0.1.3
14768 + glob: 7.2.3
14769 + minimatch: 3.1.2
14770 +
13768 text-table@0.2.0: {} 14771 text-table@0.2.0: {}
13769 14772
13770 thenify-all@1.6.0: 14773 thenify-all@1.6.0:
...@@ -13783,8 +14786,14 @@ snapshots: ...@@ -13783,8 +14786,14 @@ snapshots:
13783 14786
13784 tiny-case@1.0.3: {} 14787 tiny-case@1.0.3: {}
13785 14788
14789 + tinybench@2.9.0: {}
14790 +
13786 tinyexec@0.3.2: {} 14791 tinyexec@0.3.2: {}
13787 14792
14793 + tinypool@0.8.4: {}
14794 +
14795 + tinyspy@2.2.1: {}
14796 +
13788 to-buffer@1.2.1: 14797 to-buffer@1.2.1:
13789 dependencies: 14798 dependencies:
13790 isarray: 2.0.5 14799 isarray: 2.0.5
...@@ -13843,6 +14852,8 @@ snapshots: ...@@ -13843,6 +14852,8 @@ snapshots:
13843 dependencies: 14852 dependencies:
13844 prelude-ls: 1.2.1 14853 prelude-ls: 1.2.1
13845 14854
14855 + type-detect@4.1.0: {}
14856 +
13846 type-fest@0.20.2: {} 14857 type-fest@0.20.2: {}
13847 14858
13848 type-fest@0.21.3: {} 14859 type-fest@0.21.3: {}
...@@ -14015,11 +15026,80 @@ snapshots: ...@@ -14015,11 +15026,80 @@ snapshots:
14015 15026
14016 vary@1.1.2: {} 15027 vary@1.1.2: {}
14017 15028
15029 + vite-node@1.6.1(@types/node@24.3.0)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1):
15030 + dependencies:
15031 + cac: 6.7.14
15032 + debug: 4.4.1
15033 + pathe: 1.1.2
15034 + picocolors: 1.1.1
15035 + vite: 5.4.21(@types/node@24.3.0)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1)
15036 + transitivePeerDependencies:
15037 + - '@types/node'
15038 + - less
15039 + - lightningcss
15040 + - sass
15041 + - sass-embedded
15042 + - stylus
15043 + - sugarss
15044 + - supports-color
15045 + - terser
15046 +
15047 + vite@5.4.21(@types/node@24.3.0)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1):
15048 + dependencies:
15049 + esbuild: 0.21.5
15050 + postcss: 8.5.6
15051 + rollup: 4.57.1
15052 + optionalDependencies:
15053 + '@types/node': 24.3.0
15054 + fsevents: 2.3.3
15055 + less: 3.13.1
15056 + lightningcss: 1.30.1
15057 + sass: 1.91.0
15058 + stylus: 0.64.0
15059 + terser: 5.43.1
15060 +
15061 + vitest@1.6.1(@types/node@24.3.0)(jsdom@24.1.3)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1):
15062 + dependencies:
15063 + '@vitest/expect': 1.6.1
15064 + '@vitest/runner': 1.6.1
15065 + '@vitest/snapshot': 1.6.1
15066 + '@vitest/spy': 1.6.1
15067 + '@vitest/utils': 1.6.1
15068 + acorn-walk: 8.3.4
15069 + chai: 4.5.0
15070 + debug: 4.4.1
15071 + execa: 8.0.1
15072 + local-pkg: 0.5.1
15073 + magic-string: 0.30.18
15074 + pathe: 1.1.2
15075 + picocolors: 1.1.1
15076 + std-env: 3.9.0
15077 + strip-literal: 2.1.1
15078 + tinybench: 2.9.0
15079 + tinypool: 0.8.4
15080 + vite: 5.4.21(@types/node@24.3.0)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1)
15081 + vite-node: 1.6.1(@types/node@24.3.0)(less@3.13.1)(lightningcss@1.30.1)(sass@1.91.0)(stylus@0.64.0)(terser@5.43.1)
15082 + why-is-node-running: 2.3.0
15083 + optionalDependencies:
15084 + '@types/node': 24.3.0
15085 + jsdom: 24.1.3
15086 + transitivePeerDependencies:
15087 + - less
15088 + - lightningcss
15089 + - sass
15090 + - sass-embedded
15091 + - stylus
15092 + - sugarss
15093 + - supports-color
15094 + - terser
15095 +
14018 vm2@3.9.19: 15096 vm2@3.9.19:
14019 dependencies: 15097 dependencies:
14020 acorn: 8.15.0 15098 acorn: 8.15.0
14021 acorn-walk: 8.3.4 15099 acorn-walk: 8.3.4
14022 15100
15101 + vue-component-type-helpers@2.2.12: {}
15102 +
14023 vue-loader@17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)): 15103 vue-loader@17.4.2(@vue/compiler-sfc@3.5.20)(vue@3.5.20(typescript@5.9.2))(webpack@5.78.0(@swc/core@1.3.96)):
14024 dependencies: 15104 dependencies:
14025 chalk: 4.1.2 15105 chalk: 4.1.2
...@@ -14057,7 +15137,7 @@ snapshots: ...@@ -14057,7 +15137,7 @@ snapshots:
14057 dependencies: 15137 dependencies:
14058 defaults: 1.0.4 15138 defaults: 1.0.4
14059 15139
14060 - weapp-tailwindcss@4.2.6(tailwindcss@3.4.17)(typescript@5.9.2): 15140 + weapp-tailwindcss@4.2.6(magicast@0.3.5)(tailwindcss@3.4.17)(typescript@5.9.2):
14061 dependencies: 15141 dependencies:
14062 '@ast-core/escape': 1.0.1 15142 '@ast-core/escape': 1.0.1
14063 '@babel/parser': 7.28.3 15143 '@babel/parser': 7.28.3
...@@ -14078,7 +15158,7 @@ snapshots: ...@@ -14078,7 +15158,7 @@ snapshots:
14078 lru-cache: 10.4.3 15158 lru-cache: 10.4.3
14079 magic-string: 0.30.18 15159 magic-string: 0.30.18
14080 semver: 7.7.2 15160 semver: 7.7.2
14081 - tailwindcss-patch: 7.1.4(tailwindcss@3.4.17) 15161 + tailwindcss-patch: 7.1.4(magicast@0.3.5)(tailwindcss@3.4.17)
14082 vue: 3.5.20(typescript@5.9.2) 15162 vue: 3.5.20(typescript@5.9.2)
14083 webpack-sources: 3.3.3 15163 webpack-sources: 3.3.3
14084 transitivePeerDependencies: 15164 transitivePeerDependencies:
...@@ -14267,6 +15347,11 @@ snapshots: ...@@ -14267,6 +15347,11 @@ snapshots:
14267 dependencies: 15347 dependencies:
14268 isexe: 2.0.0 15348 isexe: 2.0.0
14269 15349
15350 + why-is-node-running@2.3.0:
15351 + dependencies:
15352 + siginfo: 2.0.0
15353 + stackback: 0.0.2
15354 +
14270 wildcard@2.0.1: {} 15355 wildcard@2.0.1: {}
14271 15356
14272 word-wrap@1.2.5: {} 15357 word-wrap@1.2.5: {}
...@@ -14289,6 +15374,12 @@ snapshots: ...@@ -14289,6 +15374,12 @@ snapshots:
14289 string-width: 5.1.2 15374 string-width: 5.1.2
14290 strip-ansi: 7.1.0 15375 strip-ansi: 7.1.0
14291 15376
15377 + wrap-ansi@9.0.2:
15378 + dependencies:
15379 + ansi-styles: 6.2.1
15380 + string-width: 7.2.0
15381 + strip-ansi: 7.1.0
15382 +
14292 wrappy@1.0.2: {} 15383 wrappy@1.0.2: {}
14293 15384
14294 ws@8.18.3: {} 15385 ws@8.18.3: {}
...@@ -14332,6 +15423,8 @@ snapshots: ...@@ -14332,6 +15423,8 @@ snapshots:
14332 15423
14333 yocto-queue@0.1.0: {} 15424 yocto-queue@0.1.0: {}
14334 15425
15426 + yocto-queue@1.2.2: {}
15427 +
14335 yup@1.7.0: 15428 yup@1.7.0:
14336 dependencies: 15429 dependencies:
14337 property-expr: 2.0.6 15430 property-expr: 2.0.6
......
1 +<claude-mem-context>
2 +# Recent Activity
3 +
4 +<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5 +
6 +### Feb 3, 2026
7 +
8 +| ID | Time | T | Title | Read |
9 +|----|------|---|-------|------|
10 +| #114 | 4:02 PM | 🔵 | FeedbackList page config has standard navigation bar settings | ~169 |
11 +| #110 | " | 🔵 | Examined reference FeedbackList LESS styles showing simple scrolling without scroll-view | ~225 |
12 +| #100 | 3:54 PM | 🔵 | Reference FeedbackList uses simple view without scroll-view component | ~204 |
13 +</claude-mem-context>
...\ No newline at end of file ...\ No newline at end of file
1 +<claude-mem-context>
2 +# Recent Activity
3 +
4 +<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5 +
6 +### Feb 3, 2026
7 +
8 +| ID | Time | T | Title | Read |
9 +|----|------|---|-------|------|
10 +| #101 | 3:55 PM | 🔵 | Found working scroll-view implementation in PointsList reference page | ~278 |
11 +</claude-mem-context>
...\ No newline at end of file ...\ No newline at end of file
1 +/**
2 + * 工具函数测试示例
3 + */
4 +
5 +import { describe, it, expect, vi } from 'vitest'
6 +
7 +// 示例:日期格式化测试
8 +describe('formatDate', () => {
9 + it('should format date string correctly', () => {
10 + // 假设 tools.js 中有 formatDate 函数
11 + // const result = formatDate('2026-02-05')
12 + // expect(result).toBe('2026年02月05日')
13 +
14 + // 临时示例
15 + const date = '2026-02-05'
16 + expect(date).toBeTruthy()
17 + })
18 +
19 + it('should handle invalid date', () => {
20 + const invalidDate = 'invalid-date'
21 + expect(invalidDate).toBe('invalid-date')
22 + })
23 +})
24 +
25 +// 示例:平台检测测试
26 +describe('wxInfo', () => {
27 + it('should detect platform correctly', () => {
28 + // Mock Taro.getSystemInfoSync
29 + const mockSystemInfo = {
30 + model: 'iPhone',
31 + system: 'iOS 14.0',
32 + platform: 'ios',
33 + }
34 +
35 + expect(mockSystemInfo.platform).toBe('ios')
36 + })
37 +})
38 +
39 +// 示例:文本溢出检测测试
40 +describe('hasEllipsis', () => {
41 + it('should detect text overflow', () => {
42 + const text = 'This is a very long text that might overflow...'
43 + const maxLength = 20
44 +
45 + const hasOverflow = text.length > maxLength
46 + expect(hasOverflow).toBe(true)
47 + })
48 +})
1 +/**
2 + * 组件测试示例
3 + */
4 +
5 +import { describe, it, expect } from 'vitest'
6 +import { mount } from '@vue/test-utils'
7 +import PrimaryButton from '@/components/PrimaryButton.vue'
8 +
9 +describe('PrimaryButton', () => {
10 + it('should render button with text', () => {
11 + const wrapper = mount(PrimaryButton, {
12 + props: {
13 + text: '点击按钮',
14 + },
15 + })
16 +
17 + expect(wrapper.text()).toContain('点击按钮')
18 + })
19 +
20 + it('should emit click event when clicked', async () => {
21 + const wrapper = mount(PrimaryButton, {
22 + props: {
23 + text: '点击',
24 + },
25 + })
26 +
27 + await wrapper.trigger('click')
28 + expect(wrapper.emitted('click')).toBeTruthy()
29 + })
30 +
31 + it('should be disabled when disabled prop is true', () => {
32 + const wrapper = mount(PrimaryButton, {
33 + props: {
34 + text: '点击',
35 + disabled: true,
36 + },
37 + })
38 +
39 + const button = wrapper.find('button')
40 + expect(button.attributes('disabled')).toBeDefined()
41 + })
42 +})
1 +/**
2 + * Vitest 测试环境设置
3 + */
4 +
5 +import { vi } from 'vitest'
6 +import { config } from '@vue/test-utils'
7 +
8 +// 全局 Mock
9 +config.global.mocks = {
10 + $t: key => key, // i18n Mock
11 + $router: {
12 + push: vi.fn(),
13 + replace: vi.fn(),
14 + },
15 +}
16 +
17 +// Mock localStorage
18 +const localStorageMock = {
19 + getItem: vi.fn(),
20 + setItem: vi.fn(),
21 + removeItem: vi.fn(),
22 + clear: vi.fn(),
23 +}
24 +global.localStorage = localStorageMock
25 +
26 +// Mock Taro API
27 +global.Taro = {
28 + getStorage: vi.fn(),
29 + setStorage: vi.fn(),
30 + removeStorage: vi.fn(),
31 + getStorageSync: vi.fn(() => ''),
32 + setStorageSync: vi.fn(),
33 + removeStorageSync: vi.fn(),
34 + navigateTo: vi.fn(),
35 + redirectTo: vi.fn(),
36 + switchTab: vi.fn(),
37 + navigateBack: vi.fn(),
38 + showToast: vi.fn(),
39 + showLoading: vi.fn(),
40 + hideLoading: vi.fn(),
41 + showModal: vi.fn(),
42 + showActionSheet: vi.fn(),
43 + createSelectorQuery: vi.fn(() => ({
44 + select: vi.fn().mockReturnThis(),
45 + exec: vi.fn(callback => callback([])),
46 + })),
47 + request: vi.fn(),
48 + getLocation: vi.fn(),
49 + chooseImage: vi.fn(),
50 + previewImage: vi.fn(),
51 + uploadFile: vi.fn(),
52 + downloadFile: vi.fn(),
53 + login: vi.fn(),
54 + getUserInfo: vi.fn(),
55 + openSetting: vi.fn(),
56 + getSystemInfo: vi.fn(),
57 + getSystemInfoSync: vi.fn(() => ({
58 + model: 'iPhone',
59 + system: 'iOS 14.0',
60 + platform: 'ios',
61 + })),
62 +}
63 +
64 +// Mock wx API
65 +global.wx = {
66 + getStorageSync: vi.fn(() => ''),
67 + setStorageSync: vi.fn(),
68 + removeStorageSync: vi.fn(),
69 + request: vi.fn(),
70 + login: vi.fn(),
71 + getUserInfo: vi.fn(),
72 +}
73 +
74 +// Mock axios
75 +vi.mock('axios-miniprogram', () => ({
76 + default: {
77 + create: vi.fn(() => ({
78 + interceptors: {
79 + request: { use: vi.fn() },
80 + response: { use: vi.fn() },
81 + },
82 + get: vi.fn(),
83 + post: vi.fn(),
84 + })),
85 + },
86 +}))
1 +import { defineConfig } from 'vitest/config'
2 +import vue from '@vitejs/plugin-vue'
3 +import { resolve } from 'path'
4 +
5 +export default defineConfig({
6 + plugins: [vue()],
7 + test: {
8 + // 全局 API(describe, it, expect)
9 + globals: true,
10 + // 运行环境
11 + environment: 'jsdom',
12 + // 设置文件
13 + setupFiles: ['./test/setup.js'],
14 + // 覆盖率配置
15 + coverage: {
16 + provider: 'v8',
17 + reporter: ['text', 'json', 'html'],
18 + // 排除文件
19 + exclude: [
20 + 'node_modules/',
21 + 'test/',
22 + 'dist/',
23 + '**/*.test.js',
24 + '**/*.spec.js',
25 + '**/*.config.js',
26 + 'src/app.js',
27 + 'src/app.config.js',
28 + ],
29 + },
30 + // 别名配置(与 Taro 配置保持一致)
31 + alias: {
32 + '@/utils': resolve(__dirname, 'src/utils'),
33 + '@/components': resolve(__dirname, 'src/components'),
34 + '@/images': resolve(__dirname, 'src/assets/images'),
35 + '@/assets': resolve(__dirname, 'src/assets'),
36 + '@/composables': resolve(__dirname, 'src/composables'),
37 + '@/api': resolve(__dirname, 'src/api'),
38 + '@/stores': resolve(__dirname, 'src/stores'),
39 + '@/hooks': resolve(__dirname, 'src/hooks'),
40 + },
41 + },
42 + resolve: {
43 + alias: {
44 + '@/utils': resolve(__dirname, 'src/utils'),
45 + '@/components': resolve(__dirname, 'src/components'),
46 + '@/images': resolve(__dirname, 'src/assets/images'),
47 + '@/assets': resolve(__dirname, 'src/assets'),
48 + '@/composables': resolve(__dirname, 'src/composables'),
49 + '@/api': resolve(__dirname, 'src/api'),
50 + '@/stores': resolve(__dirname, 'src/stores'),
51 + '@/hooks': resolve(__dirname, 'src/hooks'),
52 + },
53 + },
54 +})