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
// ESLint 配置
// https://eslint.vuejs.org/user-guide/#editor-integrations
module.exports = {
extends: ['taro/vue3'],
rules: {
// 自定义规则
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'vue/multi-word-component-names': 'off', // 允许单词组件名
'prefer-const': 'warn', // 建议使用 const
'no-var': 'error', // 禁止使用 var
eqeqeq: ['error', 'always'], // 必须使用 ===
curly: ['error', 'all'], // 必须使用大括号
'brace-style': ['error', '1tbs'], // 大括号风格
indent: ['error', 2, { SwitchCase: 1 }], // 缩进
quotes: ['error', 'single', { avoidEscape: true }], // 单引号
semi: ['error', 'never'], // 不使用分号
'comma-dangle': ['error', 'never'], // 不使用尾随逗号
'space-before-function-paren': [
'error',
{
anonymous: 'always',
named: 'never',
asyncArrow: 'always',
},
],
},
globals: {
// Taro 全局变量
wx: 'readonly',
Taro: 'readonly',
},
}
# 构建输出
dist/
deploy_versions/
.temp/
.rn_temp/
# 依赖
node_modules/
.DS_Store
package-lock.json
yarn.lock
# 缓存
.swc
.history
.cache
.tsbuildinfo
# 日志
*.log
logs/
# 编辑器
.DS_Store
.idea/
.vscode/
*.swp
*.swo
# 资源目录(如果有本地开发资源)
resource
CLAUDE.md
# 测试覆盖率
coverage/
# 环境变量
.env.local
.env.*.local
# 其他
.claude/
......
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
echo "🔍 运行 lint-staged..."
pnpm exec lint-staged
# 依赖
node_modules
pnpm-lock.yaml
package-lock.json
yarn.lock
# 构建输出
dist
build
# 缓存
.cache
.tsbuildinfo
# 日志
*.log
logs
# 其他
.DS_Store
*.md
{
"semi": false,
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"trailingComma": "es5",
"bracketSpacing": true,
"arrowParens": "avoid",
"endOfLine": "lf",
"vueIndentScriptAndStyle": false,
"overrides": [
{
"files": "*.vue",
"options": {
"parser": "vue"
}
},
{
"files": "*.js",
"options": {
"parser": "babel"
}
},
{
"files": "*.less",
"options": {
"parser": "less"
}
}
]
}
# CLAUDE.md
本文件为 Claude Code (claude.ai/code) 在此代码库中工作时提供指导。
## 项目概述
**lls_program** 是一个基于 Taro 4 + Vue 3 + NutUI 的微信小程序,名为"老来赛"。这是一个家庭活动和积分奖励管理系统。
## 技术栈
- **框架**: Taro 4.1.7 - 跨平台小程序框架
- **UI**: Vue 3.3 + Composition API (`<script setup>`)
- **UI 组件库**: NutUI Taro 4.3.13 (自动导入,无需手动引入)
- **样式**: TailwindCSS 3.4 + Less (组件特定样式)
- **状态管理**: Pinia 3.0 + taro-plugin-pinia
- **HTTP 请求**: axios-miniprogram 2.7.2
- **构建工具**: Webpack 5
## 开发命令
```bash
# 安装依赖
pnpm install
# 开发(微信小程序)
pnpm run dev:weapp
# 生产构建
pnpm run build:weapp
# 其他平台
pnpm run dev:h5 # H5 开发
pnpm run dev:alipay # 支付宝小程序
pnpm run dev:tt # 抖音小程序
```
## 架构设计
### 核心目录结构
```
src/
├── api/ # 按业务领域组织的 API 接口
├── assets/ # 静态资源(图片、样式)
├── components/ # 可复用的 Vue 组件
├── composables/ # Vue 3 组合式函数 (useXxx)
├── pages/ # Taro 页面(每个页面包含 index.vue + index.config.js)
├── stores/ # Pinia 状态管理
├── utils/ # 工具函数
├── app.config.js # Taro 应用配置(页面列表、窗口、权限)
└── app.less # 全局样式
```
### 路径别名 (config/index.js:30-38)
```javascript
@/utils src/utils
@/components src/components
@/images src/assets/images
@/assets src/assets
@/composables src/composables
@/api src/api
@/stores src/stores
@/hooks src/hooks
```
### 设计宽度配置
- **NutUI 组件**: 375px (自动处理)
- **其他所有内容**: 750px (Taro 标准)
- `config/index.js` 中的 `designWidth` 函数根据文件路径自动切换
## 核心 API 模式
### API 响应格式
所有 API 响应遵循以下结构:
```javascript
{
code: 1, // 1 = 成功,其他值 = 失败
data: {...}, // 响应数据
msg: "message" // 错误/成功消息
}
```
**始终检查** `res.code === 1`(而不是 `res.code`)来判断成功。
### 认证机制 (sessionid)
**关键**: 项目使用 `sessionid` 进行认证(存储在 `wx.storage` 中):
1. **获取**: `src/utils/request.js:23-30` - `getSessionId()``wx.getStorageSync("sessionid")` 读取
2. **设置**: 在 `miniProgramAuthAPI``loginAPI` 成功后设置
3. **使用**: 请求拦截器 (`request.js:75-78`) 设置 `config.headers.cookie = sessionid`
4. **清除**: 收到 401 响应或用户登出时
⚠️ **重要**: sessionid **不**由前端用于判断登录状态(后端通过 401 响应来判断)。它只是传递给服务器的凭证。
### 请求拦截器 (src/utils/request.js:66-80)
```javascript
service.interceptors.request.use(config => {
// 动态获取 sessionid 并设置到请求头
const sessionid = getSessionId();
if (sessionid) {
config.headers.cookie = sessionid;
}
return config;
})
```
### API 模块模式 (src/api/)
每个 API 文件导出调用中央 `fn()` 辅助函数的函数:
```javascript
// src/api/common.js
export const smsAPI = (params) => fn(fetch.post(Api.SMS, params));
```
关键 API 模块:
- `common.js` - 短信验证码、上传凭证
- `user.js` - 用户认证和个人信息
- `family.js` - 家庭管理
- `points.js` - 积分/奖励系统
- `photo.js` - 照片/媒体处理
- `organization.js` - 组织管理
## Taro 小程序限制
### ❌ 禁止使用 Web API
```javascript
// 禁止 - 在小程序中会崩溃
window.document.getElementById()
localStorage
window.location.href
fetch()
```
### ✅ 必须使用 Taro API
```javascript
// 正确 - 使用 Taro 等价 API
Taro.createSelectorQuery()
Taro.getStorage() / Taro.setStorage()
Taro.navigateTo()
Taro.request()
```
### 页面生命周期(使用 Taro Hooks)
```javascript
import { useLoad, useShow, useReady } from '@tarojs/taro'
useLoad((options) => {
// 页面加载(仅触发一次)- 适合获取路由参数
})
useShow(() => {
// 页面显示(每次显示都触发)- 适合刷新数据
})
useReady(() => {
// 页面首次渲染完成
})
```
### ❌ 页面中避免使用 Vue 生命周期
```javascript
// 不要使用 - 可能无法正常工作
onMounted(() => { ... })
onUnmounted(() => { ... })
```
## 组件指南
### 页面结构
每个页面目录包含:
- `index.vue` - 页面组件(必须使用 `<script setup>`
- `index.config.js` - 页面特定配置(navigationBarTitleText 等)
- `index.less` - 页面特定样式(scoped)
### 组件命名规范
- **页面**: 目录名(如 `pages/Dashboard/`
- **组件**: PascalCase 多单词命名(如 `PointsCollector.vue``FamilyAlbum.vue`
- **API 文件**: camelCase(如 `miniProgramAuthAPI`
### NutUI 自动导入
NutUI 组件通过 `unplugin-vue-components` 自动导入。**不要**手动导入:
```vue
<!-- ✅ 正确 - 自动导入 -->
<template>
<nut-button type="primary">点击</nut-button>
</template>
<!-- ❌ 错误 - 不要导入 -->
<script setup>
import { Button } from '@nutui/nutui-taro'
</script>
```
## 样式
### TailwindCSS + Less 混合使用
- **TailwindCSS**: 用于布局、间距、颜色、排版(80% 的样式)
- **Less**: 用于组件特定样式、动画、深度选择器(20%)
### Tailwind 配置
- **Content**: `./src/**/*.{html,js,ts,jsx,tsx,vue}` (tailwind.config.js:13)
- **Preflight**: 禁用(小程序不需要)
- **rem → rpx**: 由 `weapp-tailwindcss` 插件处理 (rem2rpx: true)
### 样式指南
```vue
<style lang="less" scoped>
/* ✅ 组件必须使用 scoped */
.page-container {
padding: 30px;
}
/* ✅ 使用 Less 处理深度选择器 */
.custom-element :deep(.nut-popup) {
background-color: #fff;
}
</style>
```
## 状态管理 (Pinia)
### Store 模式
```javascript
// src/stores/host.js
import { defineStore } from 'pinia'
export const hostStore = defineStore('host', {
state: () => ({
id: '',
join_id: ''
}),
actions: {
add(id) {
this.id = id
}
}
})
```
### 在组件中使用
```vue
<script setup>
import { hostStore } from '@/stores/host'
const host = hostStore()
host.add('123')
</script>
```
## 常用模式
### 页面导航
```javascript
import Taro from '@tarojs/taro'
// 跳转到页面
Taro.navigateTo({
url: '/pages/Detail/index?id=123'
})
// 重定向(无返回)
Taro.redirectTo({
url: '/pages/Login/index'
})
// 切换 Tab
Taro.switchTab({
url: '/pages/Dashboard/index'
})
// 获取路由参数
useLoad((options) => {
const { id } = options
})
```
### 本地存储
```javascript
// 异步(推荐)
await Taro.setStorage({ key: 'user', data: userInfo })
const { data } = await Taro.getStorage({ key: 'user' })
// 同步(谨慎使用)
Taro.setStorageSync('token', 'xxxx')
const token = Taro.getStorageSync('token')
```
### 提示/弹窗
```javascript
// Toast 提示
Taro.showToast({
title: '操作成功',
icon: 'success',
duration: 2000
})
// Modal 弹窗
Taro.showModal({
title: '提示',
content: '确定删除吗?',
success: (res) => {
if (res.confirm) {
// 用户点击了确定
}
}
})
```
## 页面注册
页面在 `src/app.config.js` 中注册:
```javascript
export default {
pages: [
'pages/Dashboard/index',
'pages/MyFamily/index',
'pages/Activities/index',
// ... 更多页面
]
}
```
**创建新页面时**: 必须将其添加到此数组中。
## 构建输出
- **开发环境**: `dist/` 目录
- **微信开发者工具**: 打开 `dist/` 作为项目根目录
## 重要文件说明
### `src/utils/request.js`
核心 HTTP 客户端,包含:
- SessionID 注入
- 401 响应处理
- 401 时静默授权重定向
- 错误处理
### `src/utils/authRedirect.js`
处理小程序登录流程的静默授权。
### `src/utils/tools.js`
通用工具函数:
- `formatDate()` - 使用 moment.js 格式化日期
- `wxInfo()` - 平台检测(Android/iOS/微信)
- `hasEllipsis()` - 文本溢出检测
## 开发注意事项
1. **始终使用 Taro API** 而非 Web API
2. **检查 `res.code === 1`** 判断 API 成功(不是 `res.code`
3. **NutUI 组件已自动导入** - 不要手动导入
4. **页面中使用 Taro 生命周期钩子**`useLoad``useShow`
5. **SessionID 动态获取** - 每次请求从存储中读取
6. **已配置路径别名** - 使用 `@/components` 代替相对路径
7. **设计宽度双模式**: NutUI 使用 375px,其他使用 750px
## 平台差异
项目通过 Taro 支持多平台:
- **微信 (weapp)**: 主要目标平台
- **H5**: Web 浏览器版本
- **支付宝 (alipay)**: 支付宝小程序
- **抖音 (tt)**: 字节跳动小程序
平台特定代码可使用:
```javascript
if (process.env.TARO_ENV === 'weapp') {
// 微信特定代码
}
```
# 项目变更日志
本文档记录项目的所有重要变更。
格式遵循:[Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)
---
## [2026-02-05] - 项目开发环境初始化
### 新增
- 创建 docs/ 目录结构(reports/、tasks/)
- 创建 CHANGELOG.md 变更日志
- 创建 PROJECT-STATUS.md 项目状态报告
- 创建 DEVELOPMENT-GUIDE.md 开发指南
- 创建规范文档目录
---
**详细信息**
- **影响文件**: docs/CHANGELOG.md, docs/PROJECT-STATUS.md, docs/DEVELOPMENT-GUIDE.md
- **技术栈**: 文档系统
- **测试状态**: N/A
- **备注**: 为后续开发建立完善的文档体系
# 代码规范
**更新时间**: 2026-02-05
本文档定义项目的代码规范。
---
## 📋 命名规范
### 文件命名
```
组件: PascalCase UserCard.vue
页面: PascalCase Dashboard/index.vue
API 文件: camelCase userAPI.js
工具函数: camelCase formatDate.js
常量文件: UPPER_CASE API_CONSTANTS.js
```
### 变量命名
```javascript
// ✅ 正确
const userList = ref([])
const isLoading = ref(false)
const MAX_COUNT = 100
// ❌ 错误
const UserList = ref([])
const is_loading = ref(false)
const max_count = 100
```
### 函数命名
```javascript
// ✅ 正确 - 动词开头
const fetchUserData = async () => {}
const handleSubmit = () => {}
const formatDate = (date) => {}
// ❌ 错误
const userData = async () => {} // 应该是 fetchUserData
const submit = () => {} // 应该是 handleSubmit
```
---
## 🎯 Vue 3 规范
### 组件定义
```vue
<script setup>
// 1. 导入
import { ref, computed, onMounted } from 'vue'
import { useLoad } from '@tarojs/taro'
import { userAPI } from '@/api/user'
// 2. Props 定义
const props = defineProps({
userId: {
type: Number,
required: true,
default: 0
}
})
// 3. Emits 定义
const emit = defineEmits(['update', 'delete'])
// 4. 响应式状态
const loading = ref(false)
const dataList = ref([])
// 5. 计算属性
const totalCount = computed(() => dataList.value.length)
// 6. 方法
const fetchData = async () => {
loading.value = true
try {
const res = await userAPI()
if (res.code === 1) {
dataList.value = res.data
}
} finally {
loading.value = false
}
}
// 7. 生命周期(Taro Hooks)
useLoad(() => {
fetchData()
})
</script>
```
### Props 验证
```javascript
// ✅ 正确 - 完整的类型和默认值
const props = defineProps({
userId: {
type: Number,
required: true,
default: 0
},
userName: {
type: String,
default: ''
},
isActive: {
type: Boolean,
default: false
}
})
// ❌ 错误 - 缺少类型
const props = defineProps(['userId', 'userName'])
```
### Emits 定义
```javascript
// ✅ 正确 - 定义事件名
const emit = defineEmits({
// 带验证的事件
update: (payload) => typeof payload.id === 'number',
// 无验证的事件
delete: null
})
// ❌ 错误 - 未定义事件
const emit = defineEmits()
```
---
## 🎨 样式规范
### TailwindCSS 优先
```vue
<template>
<!-- ✅ 优先使用 TailwindCSS -->
<view class="flex items-center justify-between p-4 bg-white">
<text class="text-xl font-bold text-gray-900">标题</text>
</view>
</template>
<style lang="less" scoped>
/* ✅ 仅在必要时使用 Less */
.custom-element {
// 深度选择器
:deep(.nut-popup) {
background-color: #fff;
}
// 复杂动画
@keyframes slide-in {
from { transform: translateX(-100%); }
to { transform: translateX(0); }
}
}
</style>
```
### 样式作用域
```vue
<!-- ✅ 页面组件必须使用 scoped -->
<template>
<view class="page-container">...</view>
</template>
<style lang="less" scoped>
.page-container {
padding: 30px;
}
</style>
```
---
## 📡 API 调用规范
### 统一错误处理
```javascript
// ✅ 正确 - 完整的错误处理
const fetchData = async () => {
loading.value = true
try {
const res = await userAPI()
if (res.code === 1) {
dataList.value = res.data
} else {
Taro.showToast({
title: res.msg || '请求失败',
icon: 'none'
})
}
} catch (err) {
console.error('请求失败:', err)
Taro.showToast({
title: '网络异常',
icon: 'none'
})
} finally {
loading.value = false
}
}
// ❌ 错误 - 没有错误处理
const fetchData = async () => {
const res = await userAPI()
dataList.value = res.data
}
```
### SessionID 管理
```javascript
// ✅ 正确 - sessionid 由请求拦截器自动注入
// 详见 src/utils/request.js:75-78
// ❌ 错误 - 手动设置 sessionid
const sessionid = Taro.getStorageSync('sessionid')
const res = await userAPI({ headers: { cookie: sessionid } })
```
---
## 🧪 测试规范
### 单元测试
```javascript
// ✅ 好的测试 - 清晰的描述和断言
describe('formatDate', () => {
it('should format date to YYYY-MM-DD', () => {
const result = formatDate('2026-02-05')
expect(result).toBe('2026-02-05')
})
it('should handle invalid date', () => {
const result = formatDate('invalid')
expect(result).toBe('')
})
})
```
### 测试覆盖率目标
- **全局覆盖率**: > 80%
- **核心业务逻辑**: > 90%
- **工具函数**: 100%
---
## 📝 注释规范
### JSDoc 注释
```javascript
/**
* 格式化日期
* @param {string|Date} date - 日期对象或日期字符串
* @param {string} format - 格式化模板(默认:'YYYY-MM-DD')
* @returns {string} 格式化后的日期字符串
* @example
* formatDate('2026-02-05', 'YYYY年MM月DD日')
* // 返回:'2026年02月05日'
*/
const formatDate = (date, format = 'YYYY-MM-DD') => {
// ...
}
```
### 复杂逻辑注释
```javascript
// 步骤 1: 验证用户权限
const hasPermission = await checkUserPermission()
if (!hasPermission) {
throw new Error('无权限操作')
}
// 步骤 2: 检查数据有效性
const isValid = validateData(data)
if (!isValid) {
throw new Error('数据格式错误')
}
// 步骤 3: 提交到服务器
const result = await submitData(data)
```
---
## 🔒 安全规范
### 防止 XSS
```vue
<!-- ❌ 危险 - 用户输入未转义 -->
<view v-html="userComment"></view>
<!-- ✅ 安全 - 使用 text 插值 -->
<view>{{ userComment }}</view>
```
### 敏感信息保护
```javascript
// ❌ 错误 - 硬编码密钥
const API_KEY = 'sk-proj-xxxxx'
// ✅ 正确 - 使用环境变量
const API_KEY = process.env.API_KEY
```
---
## ✅ 代码检查清单
提交代码前,确认:
- [ ] 代码可读性强,命名清晰
- [ ] 函数单一职责,长度 < 50 行
- [ ] 无深度嵌套(> 4 层)
- [ ] 无魔法数字,使用常量
- [ ] 无 console.log 或 debugger
- [ ] Props 有类型和默认值
- [ ] Emits 有事件名定义
- [ ] API 调用检查 `res.code === 1`
- [ ] 所有 async 函数有 try-catch
- [ ] 组件样式使用 scoped
- [ ] 优先使用 TailwindCSS
- [ ] 复杂逻辑有注释说明
- [ ] JSDoc 注释完整
---
**维护者**: 开发团队
**最后更新**: 2026-02-05
# 开发指南
**更新时间**: 2026-02-05
本文档提供老来赛项目的开发规范和最佳实践。
---
## 🚀 快速开始
### 1. 环境准备
```bash
# 安装依赖
pnpm install
# 启动开发服务器
pnpm run dev:weapp
# 在微信开发者工具中打开 dist/ 目录
```
### 2. 开发流程
1. **创建新页面**
```bash
# 在 src/pages/ 下创建页面目录
mkdir src/pages/YourPage
touch src/pages/YourPage/index.vue
touch src/pages/YourPage/index.config.js
```
2. **注册页面**(必须):
```javascript
// src/app.config.js
export default {
pages: [
// ... 其他页面
'pages/YourPage/index'
]
}
```
3. **启动开发**
```bash
pnpm run dev:weapp
```
---
## 📝 代码规范
### Vue 组件规范
#### ✅ 推荐做法
```vue
<script setup>
import { ref, computed } from 'vue'
// 1. Props 定义(有类型和默认值)
const props = defineProps({
userId: {
type: Number,
required: true
},
title: {
type: String,
default: ''
}
})
// 2. Emits 定义(有事件名)
const emit = defineEmits(['update', 'delete'])
// 3. 响应式状态
const loading = ref(false)
const dataList = ref([])
// 4. 计算属性
const totalCount = computed(() => dataList.value.length)
// 5. 方法
const fetchData = async () => {
loading.value = true
try {
const res = await yourAPI()
if (res.code === 1) {
dataList.value = res.data
}
} finally {
loading.value = false
}
}
// 6. 生命周期(使用 Taro Hooks)
import { useLoad, useShow } from '@tarojs/taro'
useLoad((options) => {
// 页面加载(只触发一次)
fetchData()
})
useShow(() => {
// 页面显示(每次显示都触发)
})
</script>
<template>
<view class="page-container">
<!-- 模板内容 -->
</view>
</template>
<style lang="less" scoped>
.page-container {
padding: 30px;
}
</style>
```
#### ❌ 避免做法
```vue
<script setup>
// ❌ 不要在页面中使用 Vue 生命周期
import { onMounted } from 'vue'
onMounted(() => {
// 可能无法正常工作
})
// ❌ 不要直接修改 props
props.title = 'new title'
// ❌ 不要使用 Web API
localStorage.setItem('key', 'value')
```
### API 调用规范
```javascript
// ✅ 正确 - 检查 res.code === 1
const fetchData = async () => {
try {
const res = await yourAPI()
if (res.code === 1) { // 重要:检查 === 1
// 处理成功
console.log(res.data)
} else {
// 处理业务错误
Taro.showToast({
title: res.msg || '请求失败',
icon: 'none'
})
}
} catch (err) {
// 处理网络错误
console.error('请求失败:', err)
Taro.showToast({
title: '网络异常',
icon: 'none'
})
}
}
// ❌ 错误 - 不检查或错误检查
const fetchData = async () => {
const res = await yourAPI()
if (res.code) { // 错误:应该检查 === 1
// ...
}
}
```
### 路径别名使用
```javascript
// ✅ 正确 - 使用路径别名
import { formatDate } from '@/utils/tools'
import UserCard from '@/components/UserCard.vue'
import { userAPI } from '@/api/user'
// ❌ 错误 - 使用相对路径
import { formatDate } from '../../utils/tools'
import UserCard from '../../components/UserCard.vue'
```
---
## 🎨 样式规范
### TailwindCSS + Less 混合使用
```vue
<template>
<!-- TailwindCSS 用于布局、间距、颜色(80%) -->
<view class="flex flex-col gap-4 p-4 bg-white">
<text class="text-xl font-bold text-gray-900">标题</text>
</view>
</template>
<style lang="less" scoped>
/* Less 用于组件特定样式(20%) */
.custom-element {
// 深度选择器修改第三方组件
:deep(.nut-popup) {
background-color: #fff;
}
// 复杂动画
@keyframes slide-in {
from { transform: translateX(-100%); }
to { transform: translateX(0); }
}
}
</style>
```
### 样式单位
```less
// ✅ 正确 - 使用 px(Taro 自动转换为 rpx)
.container {
width: 100px; // → 100rpx
height: 200px;
}
// ❌ 错误 - 直接写 rpx(除非明确需要)
.container {
width: 100rpx;
}
```
---
## 🔧 常用模式
### 路由导航
```javascript
import Taro from '@tarojs/taro'
// 跳转到新页面
Taro.navigateTo({
url: '/pages/Detail/index?id=123'
})
// 重定向(无返回)
Taro.redirectTo({
url: '/pages/Login/index'
})
// 切换 Tab
Taro.switchTab({
url: '/pages/Dashboard/index'
})
// 返回上一页
Taro.navigateBack({
delta: 1
})
```
### 获取路由参数
```javascript
import { useLoad } from '@tarojs/taro'
useLoad((options) => {
const { id, type } = options
console.log('页面参数:', id, type)
})
```
### 本地存储
```javascript
// 异步(推荐)
await Taro.setStorage({ key: 'user', data: userInfo })
const { data } = await Taro.getStorage({ key: 'user' })
// 同步(谨慎使用)
Taro.setStorageSync('token', 'xxxx')
const token = Taro.getStorageSync('token')
```
### 提示/弹窗
```javascript
// Toast
Taro.showToast({
title: '操作成功',
icon: 'success',
duration: 2000
})
// Modal
Taro.showModal({
title: '提示',
content: '确定删除吗?',
success: (res) => {
if (res.confirm) {
// 用户点击确定
}
}
})
```
---
## 🧪 测试规范
### 单元测试(待添加)
```javascript
// 示例:工具函数测试
import { describe, it, expect } from 'vitest'
import { formatDate } from '@/utils/tools'
describe('formatDate', () => {
it('should format date correctly', () => {
const result = formatDate('2026-02-05')
expect(result).toBe('2026年02月05日')
})
})
```
### E2E 测试(待添加)
```javascript
// 示例:关键流程测试
test('should login successfully', async ({ page }) => {
await page.goto('/pages/login/index')
await page.fill('input[name="phone"]', '13800138000')
await page.click('button[type="submit"]')
await expect(page).toHaveURL('/pages/dashboard/index')
})
```
---
## 📦 依赖管理
### 添加依赖
```bash
# 生产依赖
pnpm add package-name
# 开发依赖
pnpm add -D package-name
# NutUI 相关
pnpm add @nutui/nutui-taro
```
### NutUI 组件使用
```vue
<template>
<!-- ✅ 正确 - 自动导入,无需手动 import -->
<nut-button type="primary">按钮</nut-button>
<nut-popup v-model:visible="showPopup">
内容
</nut-popup>
</template>
<script setup>
// ❌ 错误 - 不要手动导入
// import { Button } from '@nutui/nutui-taro'
</script>
```
---
## 🚨 常见问题
### Q1: 页面不显示?
**检查清单**
- [ ] 页面是否在 `app.config.js` 中注册
- [ ] 页面路径是否正确
- [ ] 是否有语法错误
### Q2: API 请求失败?
**检查清单**
- [ ] 域名是否在微信小程序后台配置
- [ ] sessionid 是否正确设置
- [ ] 请求参数是否正确
- [ ] 网络是否正常
### Q3: 样式不生效?
**检查清单**
- [ ] 是否添加了 `scoped`
- [ ] 是否使用了不支持的 CSS
- [ ] 是否被全局样式覆盖
### Q4: 组件不显示?
**检查清单**
- [ ] 组件名称是否正确(PascalCase)
- [ ] NutUI 组件是否正确使用
- [ ] 组件路径是否正确
---
## 📚 参考资源
### 项目文档
- [CLAUDE.md](../CLAUDE.md) - 项目指南
- [PROJECT-STATUS.md](PROJECT-STATUS.md) - 项目状态
- [CHANGELOG.md](CHANGELOG.md) - 变更日志
### 外部资源
- [Taro 官方文档](https://docs.taro.zone/)
- [Vue 3 官方文档](https://cn.vuejs.org/)
- [NutUI Taro 文档](https://nutui.jd.com/4/taro/)
- [TailwindCSS 文档](https://tailwindcss.com/)
---
**维护者**: 开发团队
**最后更新**: 2026-02-05
# Git 工作流规范
**更新时间**: 2026-02-05
本文档定义项目的 Git 工作流和提交规范。
---
## 🌳 分支策略
### 主要分支
```
master - 生产环境(主分支)
develop - 开发环境(日常开发)
feature/* - 功能分支
bugfix/* - Bug 修复分支
hotfix/* - 紧急修复分支
```
### 分支命名
```bash
# 功能开发
feature/功能名称
feature/user-profile
feature/points-system
# Bug 修复
bugfix/问题描述
bugfix/login-error
# 紧急修复
hotfix/严重问题
hotfix/security-fix
```
---
## 🔄 工作流程
### 1. 开始新功能
```bash
# 从 develop 创建功能分支
git checkout develop
git pull origin develop
git checkout -b feature/your-feature-name
# 开发...
git add .
git commit -m "feat: 添加用户头像上传功能"
# 推送到远程
git push origin feature/your-feature-name
```
### 2. 完成 Bug 修复
```bash
# 从 develop 创建修复分支
git checkout develop
git pull origin develop
git checkout -b bugfix/login-error
# 修复...
git add .
git commit -m "fix: 修复登录页面验证码错误"
# 推送并创建 PR
git push origin bugfix/login-error
```
### 3. 合并到 develop
```bash
# 创建 Pull Request(GitHub/GitLab)
# 或 Merge Request(GitLab)
# 审查通过后合并
git checkout develop
git pull origin develop
git branch -d feature/your-feature-name
```
---
## 📝 Commit Message 规范
### 格式
```
<type>(<scope>): <subject>
<body>
<footer>
```
### Type(类型)
| 类型 | 说明 | 示例 |
|------|------|------|
| `feat` | 新功能 | feat(user): 添加用户头像上传 |
| `fix` | Bug 修复 | fix(login): 修复验证码倒计时 |
| `docs` | 文档更新 | docs(readme): 更新安装说明 |
| `style` | 代码格式(不影响功能) | style(component): 统一代码缩进 |
| `refactor` | 重构(不是新功能也不是修复) | refactor(api): 重构请求拦截器 |
| `perf` | 性能优化 | perf(list): 优化长列表渲染 |
| `test` | 测试相关 | test(utils): 添加工具函数测试 |
| `chore` | 构建/工具链相关 | chore(deps): 升级 Taro 版本 |
### Scope(范围)
根据项目自定义:
- `user` - 用户相关
- `family` - 家庭相关
- `points` - 积分相关
- `photo` - 照片相关
- `api` - API 接口
- `ui` - UI 组件
- `config` - 配置文件
### Subject(主题)
- 简短描述(不超过 50 字符)
- 使用中文
- 不以句号结尾
- 使用祈使句(如 "添加" 而非 "添加了")
### 示例
```
feat(user): 添加用户头像上传功能
- 实现图片选择功能
- 添加裁剪和压缩
- 集成到用户设置页面
Closes #123
```
```
fix(login): 修复验证码倒计时问题
- 修复页面切换后倒计时停止
- 添加 onUnmounted 清理定时器
Fixes #456
```
---
## 🚫 禁止事项
### ❌ 禁止直接提交到 master
```bash
# 错误
git checkout master
git commit -m "feat: 新功能"
# 正确
git checkout develop
git commit -m "feat: 新功能"
# 创建 PR 合并到 master
```
### ❌ 禁止推送未测试的代码
```bash
# 提交前必须测试
pnpm run lint # 代码检查
pnpm run test # 运行测试
```
### ❌ 禁止包含敏感信息
```bash
# 检查是否有敏感信息
git diff | grep -i "password\|token\|secret\|api_key"
```
---
## ✅ 提交前检查清单
在提交代码前,确认:
- [ ] 代码通过 ESLint 检查
- [ ] 代码通过 Prettier 格式化
- [ ] 测试通过(如果有)
- [ ] 无 console.log 或 debugger
- [ ] 无注释掉的代码
- [ ] 代码注释完整
- [ ] Commit Message 符合规范
- [ ] CHANGELOG.md 已更新(如有重大变更)
---
## 🔧 Git Hooks 配置(待添加)
### Husky + lint-staged
```bash
# 安装依赖
pnpm add -D husky lint-staged
# 初始化 Husky
pnpm prepare
# 配置 lint-staged
```
### .husky/pre-commit
```bash
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
# 代码检查
pnpm lint
# 运行测试
pnpm test
```
### package.json
```json
{
"scripts": {
"prepare": "husky install"
},
"lint-staged": {
"*.{js,vue}": [
"eslint --fix",
"prettier --write"
]
}
}
```
---
## 📚 参考资源
- [Conventional Commits](https://www.conventionalcommits.org/)
- [Angular Commit Guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit)
- [Commitlint](https://commitlint.js.org/)
---
**维护者**: 开发团队
**最后更新**: 2026-02-05
# 项目初始化完成总结
**完成时间**: 2026-02-05
---
## ✅ 已完成的工作
### 1. 文档系统建立
#### 核心文档
-**docs/CHANGELOG.md** - 项目变更日志
-**docs/PROJECT-STATUS.md** - 项目状态报告
-**docs/DEVELOPMENT-GUIDE.md** - 开发指南
-**docs/CODING-STANDARDS.md** - 代码规范
-**docs/GIT-WORKFLOW.md** - Git 工作流规范
-**docs/api-integration-log.md** - API 集成日志
-**docs/lessons-learned.md** - 经验教训总结
-**docs/README-TEMPLATE.md** - README 模板(可用于替换根目录的简单版本)
#### 目录结构
```
docs/
├── CHANGELOG.md # 变更日志
├── PROJECT-STATUS.md # 项目状态
├── DEVELOPMENT-GUIDE.md # 开发指南
├── CODING-STANDARDS.md # 代码规范
├── GIT-WORKFLOW.md # Git 工作流
├── api-integration-log.md # API 日志
├── lessons-learned.md # 经验教训
├── README-TEMPLATE.md # README 模板
├── reports/ # 代码审查和分析报告
│ └── YYYY-MM-DD/ # 按日期组织
└── tasks/ # 任务管理
├── done/ # 已完成任务
├── plan/ # 进行中任务
└── ideas/ # 需求池
```
### 2. 测试框架配置
#### 测试工具
-**vitest.config.js** - Vitest 测试配置
-**test/setup.js** - 测试环境设置(Mock Taro API、wx API、axios)
-**src/utils/tools.test.js** - 工具函数测试示例
-**test/components/PrimaryButton.test.js** - 组件测试示例
#### 测试脚本(已添加到 package.json)
```bash
pnpm run test # 运行测试
pnpm run test:ui # 测试 UI 界面
pnpm run test:coverage # 测试覆盖率
pnpm run test:run # 运行测试(CI 模式)
```
### 3. 代码质量工具
#### ESLint 配置
-**.eslintrc.js** - 完善的 ESLint 配置
- 扩展 `taro/vue3` 规则
- 自定义规则(no-console, prefer-const, eqeqeq 等)
- Taro 全局变量配置(wx, Taro)
#### Prettier 配置
-**.prettierrc** - Prettier 格式化配置
-**.prettierignore** - 忽略文件配置
#### 脚本命令
```bash
pnpm run lint # ESLint 检查
pnpm run format # Prettier 格式化
```
### 4. 项目配置优化
#### package.json 更新
- ✅ 添加测试相关依赖:
- `@vitejs/plugin-vue`
- `@vitest/coverage-v8`
- `@vue/test-utils`
- `vitest`
- `jsdom`
- `prettier`
- ✅ 添加测试和格式化脚本
#### .gitignore 优化
- ✅ 添加测试覆盖率目录(coverage/)
- ✅ 添加缓存文件(.cache, .tsbuildinfo)
- ✅ 添加日志文件(*.log, logs/)
- ✅ 添加编辑器配置(.vscode/, .idea/)
---
## 📦 后续需要安装的依赖
运行以下命令安装新增的依赖:
```bash
# 安装测试依赖
pnpm add -D vitest @vitejs/plugin-vue @vitest/coverage-v8 @vue/test-utils jsdom
# 安装代码质量工具
pnpm add -D prettier
```
---
## 🎯 后续建议
### 短期(1-2 周)
#### 1. 添加 Git Hooks(推荐)
```bash
# 安装 Husky 和 lint-staged
pnpm add -D husky lint-staged
# 初始化 Husky
pnpm prepare
# 配置 pre-commit hook
```
**.husky/pre-commit**:
```bash
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm lint
pnpm test:run
```
**package.json**:
```json
{
"lint-staged": {
"*.{js,vue}": [
"eslint --fix",
"prettier --write"
]
}
}
```
#### 2. 替换根目录 README
```bash
# 使用 docs/README-TEMPLATE.md 替换根目录的简单版本
cp docs/README-TEMPLATE.md ../README.md
```
#### 3. 编写核心功能测试
优先为以下模块编写测试:
- `src/utils/tools.js` - 工具函数
- `src/components/PrimaryButton.vue` - 基础组件
- `src/api/user.js` - 用户 API
### 中期(1 个月)
#### 1. 添加 E2E 测试
```bash
# 安装 Playwright
pnpm add -D @playwright/test
# 创建 E2E 测试
mkdir -p e2e
```
**e2e/login.spec.js**:
```javascript
import { test, expect } from '@playwright/test'
test('should login successfully', async ({ page }) => {
await page.goto('/pages/login/index')
await page.fill('input[name="phone"]', '13800138000')
await page.click('button[type="submit"]')
await expect(page).toHaveURL('/pages/dashboard/index')
})
```
#### 2. 添加 CI/CD 配置
创建 `.github/workflows/ci.yml`:
```yaml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
- uses: actions/setup-node@v3
- run: pnpm install
- run: pnpm run lint
- run: pnpm run test:run
- run: pnpm run build:weapp
```
#### 3. 性能监控
```bash
# 安装 web-vitals
pnpm add web-vitals
```
在关键页面添加性能监控:
```javascript
import { onLCP, onFID, onCLS } from 'web-vitals'
onLCP(console.log)
onFID(console.log)
onCLS(console.log)
```
### 长期(3 个月)
#### 1. TypeScript 迁移(可选)
```bash
# 项目已配置 TypeScript(tsconfig.json)
# 可以逐步迁移 .js 文件到 .ts
```
#### 2. 组件库文档化
```bash
# 安装文档工具
pnpm add -D vitepress
```
创建组件库文档站点。
#### 3. 监控和错误追踪
集成错误监控服务(如 Sentry)。
---
## 📚 文档使用指南
### 开发前必读
1. **CLAUDE.md** - 项目完整指南
2. **DEVELOPMENT-GUIDE.md** - 开发规范和最佳实践
3. **CODING-STANDARDS.md** - 代码风格和命名规范
### 开发过程中
1. **GIT-WORKFLOW.md** - Git 分支和提交规范
2. **lessons-learned.md** - 避免重复踩坑
3. **api-integration-log.md** - API 接口文档
### 代码审查
1. **CODING-STANDARDS.md** - 代码检查清单
2. **PROJECT-STATUS.md** - 了解项目规模和架构
### 项目维护
1. **CHANGELOG.md** - 更新变更日志
2. **docs/reports/** - 存放代码审查和性能分析报告
---
## 🎉 总结
通过本次初始化,项目已具备:
1.**完善的文档体系** - 8 个核心文档 + 目录结构
2.**测试框架配置** - Vitest + 测试示例
3.**代码质量工具** - ESLint + Prettier
4.**规范的工作流** - Git 规范 + 代码规范
5.**经验教训积累** - lessons-learned.md
现在可以开始高效开发了!🚀
---
## 📞 需要帮助?
- 查看项目文档:`docs/` 目录
- 查看项目指南:`CLAUDE.md`
- 查看经验教训:`docs/lessons-learned.md`
---
**初始化完成日期**: 2026-02-05
**维护者**: Claude Code
# 项目状态报告
**更新时间**: 2026-02-05
**项目名称**: lls_program (老来赛)
**技术栈**: Taro 4.1.7 + Vue 3.3 + NutUI 4.3.13
---
## 📋 项目概述
**老来赛** 是一个基于 Taro 4 + Vue 3 的微信小程序,专注于家庭活动和积分奖励管理。
**核心功能**
- 家庭管理(创建、加入、编辑)
- 积分系统(获取、兑换、排行榜)
- 打卡活动(上传照片、分享海报)
- 优惠券系统
---
## 🎯 开发环境状态
### ✅ 已配置
| 项目 | 状态 | 说明 |
|------|------|------|
| **构建工具** | ✅ 完成 | Webpack 5 + Taro CLI |
| **UI 组件库** | ✅ 完成 | NutUI Taro 4.3.13(自动导入) |
| **样式方案** | ✅ 完成 | TailwindCSS 3.4 + Less |
| **状态管理** | ✅ 完成 | Pinia 3.0 + taro-plugin-pinia |
| **HTTP 客户端** | ✅ 完成 | axios-miniprogram 2.7.2 |
| **路径别名** | ✅ 完成 | @/utils、@/components 等 |
| **代码规范** | ✅ 完成 | ESLint + EditorConfig |
| **认证系统** | ✅ 完成 | sessionid 认证(静默授权) |
### ⚠️ 待配置
| 项目 | 优先级 | 建议工具 | 说明 |
|------|--------|----------|------|
| **单元测试** | 🔴 高 | Vitest | 测试工具函数、Composables |
| **E2E 测试** | 🟡 中 | Playwright | 关键流程测试 |
| **Git Hooks** | 🟡 中 | Husky + lint-staged | 提交前自动检查 |
| **CI/CD** | 🟢 低 | GitHub Actions | 自动化部署 |
---
## 📊 项目规模统计
| 类别 | 数量 |
|------|------|
| **页面** | 36 个 |
| **组件** | 22 个 |
| **API 模块** | 12 个 |
| **Store** | 4 个 |
| **工具函数** | 7 个 |
---
## 🏗️ 架构特点
### 双设计宽度配置
```javascript
// config/index.js
designWidth (input) {
// NutUI 组件:375px
if (input?.file?.indexOf('@nutui') > -1) {
return 375
}
// 其他内容:750px(Taro 标准)
return 750
}
```
### 认证机制
- **SessionID 存储**`wx.storage` 中的 `sessionid`
- **请求拦截器**:自动注入 `config.headers.cookie`
- **401 处理**:自动清除 sessionid 并跳转登录
- **静默授权**:支持无感知登录流程
### API 响应格式
```javascript
{
code: 1, // 1 = 成功
data: {...}, // 响应数据
msg: "message" // 消息
}
```
**重要**:检查 `res.code === 1` 判断成功(不是 `res.code`
---
## 📁 目录结构
```
src/
├── api/ # API 接口(按业务领域组织)
│ ├── common.js # 短信验证码、上传凭证
│ ├── user.js # 用户认证和个人信息
│ ├── family.js # 家庭管理
│ ├── points.js # 积分/奖励系统
│ ├── photo.js # 照片/媒体处理
│ └── ...
├── components/ # 可复用组件(22 个)
├── composables/ # Vue 3 组合式函数
├── pages/ # Taro 页面(36 个)
├── stores/ # Pinia 状态管理
├── utils/ # 工具函数
├── assets/ # 静态资源
├── app.config.js # Taro 应用配置
├── app.js # 应用入口
└── app.less # 全局样式
```
---
## 🔧 开发命令
```bash
# 安装依赖
pnpm install
# 开发(微信小程序)
pnpm run dev:weapp
# 开发(H5)
pnpm run dev:h5
# 生产构建
pnpm run build:weapp
# 代码检查
pnpm run lint
```
---
## 📚 已有文档
| 文档 | 路径 | 说明 |
|------|------|------|
| **项目指南** | CLAUDE.md | 完整的开发指南 |
| **迁移指南** | 快速迁移指南.md | 静默授权功能迁移 |
| **合规分析** | 微信小程序审核合规性分析报告.md | 小程序审核要点 |
---
## ⚡ 性能优化建议
### 已实施
- ✅ NutUI 组件自动导入(按需加载)
- ✅ TailwindCSS Preflight 禁用(小程序不需要)
- ✅ 路径别名配置(避免复杂相对路径)
### 待优化
- ⚠️ 图片 CDN 优化(已使用 cdn.ipadbiz.cn,可添加参数优化)
- ⚠️ 长列表虚拟滚动(如有大量数据列表)
- ⚠️ 路由懒加载(页面级代码分割)
---
## 🚨 已知问题
### 1. 测试缺失
**影响**:代码质量无保障,重构风险高
**解决方案**
- 添加 Vitest 进行单元测试
- 添加 Playwright 进行 E2E 测试
- 目标覆盖率:> 80%
### 2. 缺少 CHANGELOG
**影响**:变更历史不清晰,版本管理混乱
**解决方案**:✅ 已创建 docs/CHANGELOG.md
### 3. 缺少开发规范文档
**影响**:团队协作效率低,代码风格不统一
**解决方案**:✅ 已创建 docs/DEVELOPMENT-GUIDE.md
---
## 📌 开发注意事项
### ❌ 禁止使用 Web API
```javascript
// 错误 - 会导致小程序崩溃
window.document.getElementById()
localStorage
window.location.href
fetch()
```
### ✅ 必须使用 Taro API
```javascript
// 正确
Taro.createSelectorQuery()
Taro.getStorage()
Taro.navigateTo()
Taro.request()
```
### 🔑 SessionID 管理
```javascript
// 请求拦截器自动注入
service.interceptors.request.use(config => {
const sessionid = getSessionId() // 从 wx.storage 读取
if (sessionid) {
config.headers.cookie = sessionid
}
return config
})
```
---
## 🎯 下一步计划
### 短期(1-2周)
- [ ] 添加 Vitest 单元测试
- [ ] 添加 Git Hooks(Husky + lint-staged)
- [ ] 完善核心功能的文档
### 中期(1个月)
- [ ] 添加 Playwright E2E 测试
- [ ] 性能优化(图片、长列表)
- [ ] CI/CD 配置
### 长期(3个月)
- [ ] TypeScript 迁移(可选)
- [ ] 组件库文档化
- [ ] 监控和错误追踪
---
**维护者**: 开发团队
**最后更新**: 2026-02-05
# 老来赛 (lls_program)
> 基于 Taro 4 + Vue 3 + NutUI 的微信小程序 - 家庭活动和积分奖励管理系统
[![Taro](https://img.shields.io/badge/Taro-4.1.7-blue)](https://docs.taro.zone/)
[![Vue](https://img.shields.io/badge/Vue-3.3-green)](https://cn.vuejs.org/)
[![NutUI](https://img.shields.io/badge/NutUI-4.3.13-orange)](https://nutui.jd.com/4/taro/)
---
## 📖 项目简介
**老来赛** 是一个专注于家庭活动和积分奖励管理的微信小程序,提供以下核心功能:
- 🏠 **家庭管理** - 创建家庭、邀请成员、管理成员权限
- 💎 **积分系统** - 获取积分、兑换奖励、排行榜竞争
- 📸 **打卡活动** - 上传照片、生成海报、分享成就
- 🎁 **优惠券** - 积分兑换、优惠券管理
---
## 🚀 快速开始
### 环境要求
- **Node.js** >= 16.x
- **pnpm** >= 8.x(推荐)或 npm >= 8.x
- **微信开发者工具** [下载地址](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)
### 安装依赖
```bash
# 使用 pnpm(推荐)
pnpm install
# 或使用 npm
npm install
```
### 开发模式
```bash
# 微信小程序
pnpm run dev:weapp
# H5
pnpm run dev:h5
# 支付宝小程序
pnpm run dev:alipay
# 抖音小程序
pnpm run dev:tt
```
### 构建生产版本
```bash
# 微信小程序
pnpm run build:weapp
# H5
pnpm run build:h5
```
### 在微信开发者工具中打开
1. 打开微信开发者工具
2. 导入项目,选择 `dist/` 目录
3. AppID 使用测试号或自己的 AppID
---
## 📚 文档导航
### 核心文档
- **[CLAUDE.md](../CLAUDE.md)** - 完整的项目开发指南
- **[项目状态报告](PROJECT-STATUS.md)** - 项目当前状态和规模
- **[开发指南](DEVELOPMENT-GUIDE.md)** - 开发规范和最佳实践
- **[代码规范](CODING-STANDARDS.md)** - 命名、注释、测试规范
- **[Git 工作流](GIT-WORKFLOW.md)** - 分支策略和提交规范
### 技术文档
- **[API 集成日志](api-integration-log.md)** - API 接口文档和集成经验
- **[快速迁移指南](../快速迁移指南.md)** - 静默授权功能迁移
- **[微信小程序审核合规性分析报告](../微信小程序审核合规性分析报告.md)** - 合规性要点
---
## 🛠️ 技术栈
### 核心框架
- **Taro 4.1.7** - 跨平台小程序开发框架
- **Vue 3.3** - 渐进式 JavaScript 框架
- **Pinia 3.0** - Vue 3 状态管理
### UI 组件
- **NutUI Taro 4.3.13** - 京东 Vue 3 移动端组件库(自动导入)
### 样式方案
- **TailwindCSS 3.4** - 原子化 CSS 框架
- **Less** - CSS 预处理器
### HTTP 客户端
- **axios-miniprogram 2.7.2** - 小程序 HTTP 客户端
---
## 📁 项目结构
```
src/
├── api/ # API 接口(按业务领域组织)
├── assets/ # 静态资源(图片、样式)
├── components/ # 可复用组件(22 个)
├── composables/ # Vue 3 组合式函数
├── pages/ # Taro 页面(36 个)
│ ├── Dashboard/ # 仪表盘(首页)
│ ├── MyFamily/ # 我的家庭
│ ├── Activities/ # 活动列表
│ └── ...
├── stores/ # Pinia 状态管理
├── utils/ # 工具函数
│ ├── request.js # HTTP 请求拦截器
│ ├── authRedirect.js # 静默授权
│ └── tools.js # 通用工具
├── app.config.js # Taro 应用配置
├── app.js # 应用入口
└── app.less # 全局样式
```
---
## 🔑 核心特性
### 双设计宽度配置
```javascript
// NutUI 组件:375px
// 其他内容:750px(Taro 标准)
designWidth (input) {
if (input?.file?.indexOf('@nutui') > -1) {
return 375
}
return 750
}
```
### SessionID 认证机制
```javascript
// 请求拦截器自动注入 sessionid
service.interceptors.request.use(config => {
const sessionid = getSessionId() // 从 wx.storage 读取
if (sessionid) {
config.headers.cookie = sessionid
}
return config
})
```
### 401 自动处理
```javascript
// 响应拦截器自动处理 401
service.interceptors.response.use(
response => response,
error => {
if (error.response?.status === 401) {
// 清除 sessionid 并跳转登录
wx.removeStorageSync('sessionid')
Taro.reLaunch({ url: '/pages/login/index' })
}
return Promise.reject(error)
}
)
```
---
## 📋 开发命令
```bash
# 开发
pnpm run dev:weapp # 微信小程序
pnpm run dev:h5 # H5
pnpm run dev:alipay # 支付宝小程序
# 构建
pnpm run build:weapp # 微信小程序
pnpm run build:h5 # H5
# 代码检查(待添加)
pnpm run lint # ESLint 检查
pnpm run format # Prettier 格式化
# 测试(待添加)
pnpm run test # 单元测试
pnpm run test:e2e # E2E 测试
```
---
## 🎯 开发注意事项
### ❌ 禁止使用 Web API
```javascript
// 错误 - 会导致小程序崩溃
window.document.getElementById()
localStorage
window.location.href
fetch()
```
### ✅ 必须使用 Taro API
```javascript
// 正确
Taro.createSelectorQuery()
Taro.getStorage()
Taro.navigateTo()
Taro.request()
```
### API 响应检查
```javascript
// ✅ 正确 - 检查 res.code === 1
if (res.code === 1) {
// 处理成功
}
// ❌ 错误 - 不检查或错误检查
if (res.code) { // 错误
// ...
}
```
---
## 📊 项目统计
| 类别 | 数量 |
|------|------|
| **页面** | 36 个 |
| **组件** | 22 个 |
| **API 模块** | 12 个 |
| **Store** | 4 个 |
| **工具函数** | 7 个 |
---
## 🤝 贡献指南
欢迎贡献代码!请遵循以下步骤:
1. Fork 本仓库
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'feat: 添加某个功能'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 创建 Pull Request
### Commit Message 规范
```
feat: 新功能
fix: Bug 修复
docs: 文档更新
style: 代码格式(不影响功能)
refactor: 重构
perf: 性能优化
test: 测试相关
chore: 构建/工具链相关
```
详见 [Git 工作流规范](GIT-WORKFLOW.md)
---
## 📄 许可证
[MIT](LICENSE)
---
## 🔗 相关链接
- [Taro 官方文档](https://docs.taro.zone/)
- [Vue 3 官方文档](https://cn.vuejs.org/)
- [NutUI Taro 文档](https://nutui.jd.com/4/taro/)
- [TailwindCSS 文档](https://tailwindcss.com/)
- [微信小程序开发文档](https://developers.weixin.qq.com/miniprogram/dev/framework/)
---
## 📞 联系方式
如有问题或建议,请提交 Issue 或 Pull Request。
---
**开发团队** | **最后更新**: 2026-02-05
# API 集成日志
**更新时间**: 2026-02-05
本文档记录项目 API 集成的历史和经验教训。
---
## 📡 API 概述
### API 基础信息
| 项目 | 值 |
|------|-----|
| **Base URL** | (待配置) |
| **认证方式** | sessionid(存储在 wx.storage) |
| **响应格式** | `{ code, data, msg }` |
| **成功标识** | `code === 1` |
### API 模块结构
```
src/api/
├── common.js # 短信验证码、上传凭证
├── user.js # 用户认证和个人信息
├── family.js # 家庭管理
├── points.js # 积分/奖励系统
├── photo.js # 照片/媒体处理
├── organization.js # 组织管理
├── coupon.js # 优惠券
├── feedback.js # 用户反馈
├── map.js # 地图相关
└── fn.js # 通用函数
```
---
## 🔑 认证机制
### SessionID 管理
#### 获取 SessionID
```javascript
// src/utils/request.js
const getSessionId = () => {
try {
return wx.getStorageSync('sessionid') || ''
} catch (e) {
console.error('获取 sessionid 失败', e)
return ''
}
}
```
#### 设置 SessionID
```javascript
// 登录成功后设置
const loginSuccess = (sessionid) => {
wx.setStorageSync('sessionid', sessionid)
}
// 小程序授权成功后设置
const authSuccess = (sessionid) => {
wx.setStorageSync('sessionid', sessionid)
}
```
#### 清除 SessionID
```javascript
// 401 响应时清除
const clearSessionId = () => {
wx.removeStorageSync('sessionid')
}
// 用户登出时清除
const logout = () => {
wx.removeStorageSync('sessionid')
Taro.reLaunch({ url: '/pages/login/index' })
}
```
### 请求拦截器
```javascript
// src/utils/request.js
service.interceptors.request.use(config => {
// 动态获取 sessionid 并设置到请求头
const sessionid = getSessionId()
if (sessionid) {
config.headers.cookie = sessionid
}
return config
})
```
---
## 📋 API 列表
### 用户相关 (user.js)
| API | 说明 | 方法 |
|-----|------|------|
| `miniProgramAuthAPI` | 小程序静默授权 | POST |
| `loginAPI` | 用户登录 | POST |
| `getUserInfoAPI` | 获取用户信息 | GET |
| `updateUserInfoAPI` | 更新用户信息 | POST |
### 家庭相关 (family.js)
| API | 说明 | 方法 |
|-----|------|------|
| `createFamilyAPI` | 创建家庭 | POST |
| `joinFamilyAPI` | 加入家庭 | POST |
| `getFamilyInfoAPI` | 获取家庭信息 | GET |
| `updateFamilyAPI` | 更新家庭信息 | POST |
### 积分相关 (points.js)
| API | 说明 | 方法 |
|-----|------|------|
| `getPointsListAPI` | 获取积分列表 | GET |
| `addPointsAPI` | 添加积分 | POST |
| `deductPointsAPI` | 扣除积分 | POST |
### 照片相关 (photo.js)
| API | 说明 | 方法 |
|-----|------|------|
| `uploadPhotoAPI` | 上传照片 | POST |
| `getPhotoListAPI` | 获取照片列表 | GET |
| `deletePhotoAPI` | 删除照片 | POST |
---
## 🔌 API 集成最佳实践
### 1. 统一错误处理
```javascript
// ✅ 正确 - 完整的错误处理
const fetchData = async () => {
loading.value = true
try {
const res = await yourAPI()
if (res.code === 1) {
dataList.value = res.data
} else {
Taro.showToast({
title: res.msg || '请求失败',
icon: 'none'
})
}
} catch (err) {
console.error('请求失败:', err)
Taro.showToast({
title: '网络异常',
icon: 'none'
})
} finally {
loading.value = false
}
}
```
### 2. 检查响应格式
```javascript
// ✅ 正确 - 检查 res.code === 1
if (res.code === 1) {
// 处理成功
}
// ❌ 错误 - 不检查或错误检查
if (res.code) { // 错误:应该检查 === 1
// ...
}
```
### 3. 加载状态管理
```javascript
const loading = ref(false)
const error = ref(null)
const fetchData = async () => {
loading.value = true
error.value = null
try {
const res = await yourAPI()
if (res.code === 1) {
dataList.value = res.data
} else {
error.value = res.msg
}
} catch (err) {
error.value = err.message
} finally {
loading.value = false
}
}
```
---
## ⚠️ 常见问题
### 问题 1: 401 未授权
**原因**: sessionid 过期或无效
**解决方案**:
```javascript
// 响应拦截器自动处理(已实现)
service.interceptors.response.use(
response => response,
error => {
if (error.response?.status === 401) {
// 清除 sessionid
wx.removeStorageSync('sessionid')
// 跳转登录页
Taro.reLaunch({ url: '/pages/login/index' })
}
return Promise.reject(error)
}
)
```
### 问题 2: 跨域问题
**原因**: 域名未在微信小程序后台配置
**解决方案**:
1. 登录微信小程序后台
2. 开发 → 开发管理 → 开发设置
3. 配置服务器域名白名单
### 问题 3: 请求超时
**原因**: 网络慢或服务器响应慢
**解决方案**:
```javascript
// 设置合理的超时时间
const request = axios.create({
timeout: 10000 // 10 秒
})
```
---
## 📝 API 变更日志
### 2026-02-05
- ✅ 创建 API 集成日志文档
- ✅ 整理现有 API 模块
- ✅ 记录认证机制
---
## 🔗 相关文档
- [CLAUDE.md](../CLAUDE.md) - 项目指南
- [CODING-STANDARDS.md](CODING-STANDARDS.md) - 代码规范
- [DEVELOPMENT-GUIDE.md](DEVELOPMENT-GUIDE.md) - 开发指南
---
**维护者**: 开发团队
**最后更新**: 2026-02-05
# 经验教训总结
**更新时间**: 2026-02-05
本文档记录项目开发过程中的经验教训,避免重复踩坑。
---
## 🔥 核心教训
### 1. 小程序 ≠ Web + 适配器
**教训**: Taro 不是简单的"Web + 适配器",而是完全不同的开发范式。
**问题**:
- 直接使用 `localStorage` 导致小程序崩溃
- 使用 `window.document` 无法操作 DOM
- 使用 `fetch` 发起请求失败
**解决方案**:
```javascript
// ❌ 错误 - 使用 Web API
localStorage.setItem('key', 'value')
window.document.getElementById()
fetch('/api/data')
// ✅ 正确 - 使用 Taro API
Taro.setStorage({ key: 'key', data: 'value' })
Taro.createSelectorQuery()
Taro.request({ url: '/api/data' })
```
**预防措施**:
- 开发前仔细阅读 [Taro 官方文档](https://docs.taro.zone/)
- 参考项目 [CLAUDE.md](../CLAUDE.md) 中的 API 使用规范
- 代码审查时检查是否使用了 Web API
---
### 2. SessionID 认证机制的理解偏差
**教训**: SessionID 前端不用于判断登录状态,而是传递给后端的凭证。
**问题**:
- 前端通过 sessionid 判断用户是否登录(错误)
- sessionid 过期后前端无法及时感知
**正确理解**:
```javascript
// ❌ 错误 - 前端判断登录状态
const isLoggedIn = !!getSessionId()
// ✅ 正确 - 后端通过 401 判断
// 前端只需在请求中携带 sessionid
// 后端返回 401 时前端清除 sessionid 并跳转登录
```
**预防措施**:
- 阅读 [API 集成日志](api-integration-log.md)
- 参考 `src/utils/request.js` 中的认证处理
- 401 响应由后端判断,前端统一处理
---
### 3. API 响应格式检查错误
**教训**: 必须检查 `res.code === 1`,而不是 `res.code``res.data`
**问题**:
```javascript
// ❌ 错误 - 不检查或错误检查
const res = await userAPI()
if (res.code) { // 错误:0 也是 truthy
// 处理成功
}
```
**解决方案**:
```javascript
// ✅ 正确 - 严格检查 === 1
const res = await userAPI()
if (res.code === 1) {
// 处理成功
} else {
// 处理业务错误
Taro.showToast({ title: res.msg, icon: 'none' })
}
```
**预防措施**:
- 所有 API 调用都检查 `res.code === 1`
- 代码审查时重点检查此模式
- 参考 [代码规范](CODING-STANDARDS.md)
---
### 4. 双设计宽度配置的必要性
**教训**: NutUI 组件和普通内容需要不同的设计宽度。
**问题**:
- NutUI 组件使用 750px 设计稿时尺寸过大
- 普通内容使用 375px 设计稿时尺寸过小
**解决方案**:
```javascript
// config/index.js
designWidth (input) {
// NutUI 组件:375px
if (input?.file?.indexOf('@nutui') > -1) {
return 375
}
// 其他内容:750px(Taro 标准)
return 750
}
```
**预防措施**:
- 项目初始化时配置好双设计宽度
- 新增 NutUI 组件时注意尺寸问题
- 参考项目配置文件
---
### 5. 生命周期 Hook 的正确使用
**教训**: Taro 页面组件必须使用 Taro 生命周期 Hook,而非 Vue 生命周期。
**问题**:
```javascript
// ❌ 错误 - 使用 Vue 生命周期
import { onMounted } from 'vue'
onMounted(() => {
// 可能不按预期工作
})
```
**解决方案**:
```javascript
// ✅ 正确 - 使用 Taro 生命周期
import { useLoad, useShow, useReady } from '@tarojs/taro'
useLoad((options) => {
// 页面加载(只触发一次)- 适合获取路由参数
})
useShow(() => {
// 页面显示(每次显示都触发)- 适合刷新数据
})
useReady(() => {
// 页面首次渲染完成
})
```
**预防措施**:
- 页面组件始终使用 `useLoad` / `useShow` / `useReady`
- Vue 生命周期仅用于非页面组件
- 参考项目 [CLAUDE.md](../CLAUDE.md)
---
## 📚 最佳实践总结
### 1. 组件拆分原则
**原则**: 单一职责、可复用、易测试。
**示例**:
```
✅ 好的组件
- UserCard.vue - 展示用户信息
- PointsCollector.vue - 积分收集器
- FamilyAlbum.vue - 家庭相册
❌ 避免的组件
- UserProfileAndSettingsAndOrders.vue - 职责混乱
- BigComponent.vue - 难以维护和测试
```
### 2. API 调用封装
**原则**: 统一封装、错误处理、加载状态。
**示例**:
```javascript
// ✅ 好的封装
const fetchData = async () => {
loading.value = true
try {
const res = await yourAPI()
if (res.code === 1) {
dataList.value = res.data
} else {
Taro.showToast({ title: res.msg, icon: 'none' })
}
} catch (err) {
Taro.showToast({ title: '网络异常', icon: 'none' })
} finally {
loading.value = false
}
}
```
### 3. 样式管理
**原则**: TailwindCSS 优先(80%)、Less 补充(20%)。
**示例**:
```vue
<template>
<!-- TailwindCSS 用于布局、间距、颜色 -->
<view class="flex items-center justify-between p-4 bg-white">
<text class="text-xl font-bold">标题</text>
</view>
</template>
<style lang="less" scoped>
/* Less 用于深度选择器、动画 */
.custom-element :deep(.nut-popup) {
background-color: #fff;
}
@keyframes slide-in {
from { transform: translateX(-100%); }
to { transform: translateX(0); }
}
</style>
```
### 4. 命名规范
**原则**: 清晰、一致、符合惯例。
**示例**:
```javascript
// 组件:PascalCase
UserCard.vue
PointsCollector.vue
// 函数:camelCase + 动词开头
const fetchData = () => {}
const handleSubmit = () => {}
const formatDate = () => {}
// 变量:camelCase
const userList = ref([])
const isLoading = ref(false)
// 常量:UPPER_CASE
const MAX_COUNT = 100
const API_BASE_URL = 'https://api.example.com'
```
---
## 🚫 常见陷阱
### 陷阱 1: 直接修改 props
```javascript
// ❌ 错误
props.userName = 'new name'
// ✅ 正确
emit('update:userName', 'new name')
```
### 陷阱 2: 解构 props 丢失响应性
```javascript
// ❌ 错误
const { userName } = props
// ✅ 正确
const { userName } = toRefs(props)
```
### 陷阱 3: 在模板中调用方法
```vue
<!-- ❌ 错误 - 每次渲染都执行 -->
<div>{{ formatDate(item.date) }}</div>
<!-- ✅ 正确 - 使用 computed -->
<div>{{ formattedDate }}</div>
```
### 陷阱 4: 滥用 deep: true
```javascript
// ❌ 性能问题
watch(largeObject, handler, { deep: true })
// ✅ 优化 - 监听具体属性
watch(() => largeObject.value.nested.prop, handler)
```
---
## 💡 性能优化建议
### 1. 长列表优化
```javascript
// 使用虚拟滚动(如有大量数据)
// 或使用分页加载
const page = ref(1)
const loadMore = async () => {
const res = await getMoreData(page.value)
dataList.value.push(...res.data)
page.value++
}
```
### 2. 图片优化
```javascript
// CDN 图片优化
function optimizeImageUrl(url, width = 750, quality = 70) {
if (!url.includes('cdn.ipadbiz.cn')) return url
return `${url}?imageMogr2/thumbnail/${width}x/quality/${quality}`
}
```
### 3. 计算属性缓存
```javascript
// ✅ 使用 computed(缓存)
const totalPrice = computed(() => {
return items.value.reduce((sum, item) => sum + item.price, 0)
})
// ❌ 避免方法(每次重新计算)
const getTotalPrice = () => {
return items.value.reduce((sum, item) => sum + item.price, 0)
}
```
---
## 📖 推荐阅读
### 项目文档
- [CLAUDE.md](../CLAUDE.md) - 完整的开发指南
- [代码规范](CODING-STANDARDS.md) - 代码风格和命名
- [开发指南](DEVELOPMENT-GUIDE.md) - 开发最佳实践
### 外部资源
- [Taro 官方文档](https://docs.taro.zone/)
- [Vue 3 官方文档](https://cn.vuejs.org/)
- [NutUI Taro 文档](https://nutui.jd.com/4/taro/)
- [小程序开发文档](https://developers.weixin.qq.com/miniprogram/dev/framework/)
---
## 🔄 持续更新
本文档会持续更新,记录新的经验教训。
**更新频率**: 每次遇到重要问题后更新
**维护者**: 开发团队
**最后更新**: 2026-02-05
---
## 📝 如何添加新经验
遇到新的问题后,按以下格式添加到本文档:
```markdown
### 问题标题
**教训**: 简短描述
**问题**:
- 问题描述
**解决方案**:
```javascript
// 代码示例
```
**预防措施**:
- 如何避免
```
---
**维护者**: 开发团队
**最后更新**: 2026-02-05
......@@ -26,7 +26,14 @@
"dev:rn": "npm run build:rn -- --watch",
"dev:qq": "npm run build:qq -- --watch",
"dev:quickapp": "npm run build:quickapp -- --watch",
"postinstall": "weapp-tw patch"
"postinstall": "weapp-tw patch",
"prepare": "husky install",
"test": "vitest",
"test:ui": "vitest --ui",
"test:coverage": "vitest --coverage",
"test:run": "vitest run",
"lint": "eslint ./src --ext .vue,.js",
"format": "prettier --write \"src/**/*.{js,vue,less}\""
},
"browserslist": [
"last 3 versions",
......@@ -67,20 +74,37 @@
"@tarojs/webpack5-runner": "4.1.7",
"@types/node": "^24.3.0",
"@types/webpack-env": "^1.13.6",
"@vitejs/plugin-vue": "^5.2.4",
"@vitest/coverage-v8": "^1.6.1",
"@vue/babel-plugin-jsx": "^1.0.6",
"@vue/compiler-sfc": "^3.0.0",
"@vue/test-utils": "^2.4.6",
"autoprefixer": "^10.4.21",
"babel-preset-taro": "4.1.7",
"css-loader": "3.4.2",
"eslint": "^8.12.0",
"eslint-config-taro": "4.1.7",
"husky": "^9.1.7",
"jsdom": "^24.1.3",
"lint-staged": "^16.2.7",
"postcss": "^8.5.6",
"prettier": "^3.0.0",
"style-loader": "1.3.0",
"tailwindcss": "^3.4.0",
"typescript": "^5.9.2",
"unplugin-vue-components": "^0.26.0",
"vitest": "^1.6.1",
"vue-loader": "^17.0.0",
"weapp-tailwindcss": "^4.1.10",
"webpack": "5.78.0"
},
"lint-staged": {
"*.{js,vue}": [
"eslint --fix",
"prettier --write"
],
"*.{less,css}": [
"prettier --write"
]
}
}
......
......@@ -28,7 +28,7 @@ importers:
version: 4.1.7
'@tarojs/plugin-framework-vue3':
specifier: 4.1.7
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))
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))
'@tarojs/plugin-html':
specifier: 4.1.7
version: 4.1.7(@tarojs/helper@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)
......@@ -96,12 +96,21 @@ importers:
'@types/webpack-env':
specifier: ^1.13.6
version: 1.18.8
'@vitejs/plugin-vue':
specifier: ^5.2.4
version: 5.2.4(vue@3.5.20(typescript@5.9.2))
'@vitest/coverage-v8':
specifier: ^1.6.1
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))
'@vue/babel-plugin-jsx':
specifier: ^1.0.6
version: 1.5.0(@babel/core@7.28.3)
'@vue/compiler-sfc':
specifier: ^3.0.0
version: 3.5.20
'@vue/test-utils':
specifier: ^2.4.6
version: 2.4.6
autoprefixer:
specifier: ^10.4.21
version: 10.4.21(postcss@8.5.6)
......@@ -117,9 +126,21 @@ importers:
eslint-config-taro:
specifier: 4.1.7
version: 4.1.7(@babel/core@7.28.3)(eslint@8.57.1)(typescript@5.9.2)
husky:
specifier: ^9.1.7
version: 9.1.7
jsdom:
specifier: ^24.1.3
version: 24.1.3
lint-staged:
specifier: ^16.2.7
version: 16.2.7
postcss:
specifier: ^8.5.6
version: 8.5.6
prettier:
specifier: ^3.0.0
version: 3.8.1
style-loader:
specifier: 1.3.0
version: 1.3.0(webpack@5.78.0(@swc/core@1.3.96))
......@@ -132,12 +153,15 @@ importers:
unplugin-vue-components:
specifier: ^0.26.0
version: 0.26.0(@babel/parser@7.28.3)(rollup@3.29.5)(vue@3.5.20(typescript@5.9.2))
vitest:
specifier: ^1.6.1
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)
vue-loader:
specifier: ^17.0.0
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))
weapp-tailwindcss:
specifier: ^4.1.10
version: 4.2.6(tailwindcss@3.4.17)(typescript@5.9.2)
version: 4.2.6(magicast@0.3.5)(tailwindcss@3.4.17)(typescript@5.9.2)
webpack:
specifier: 5.78.0
version: 5.78.0(@swc/core@1.3.96)
......@@ -716,6 +740,9 @@ packages:
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
engines: {node: '>=6.9.0'}
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
'@csstools/cascade-layer-name-parser@2.0.5':
resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==}
engines: {node: '>=18'}
......@@ -1351,6 +1378,10 @@ packages:
resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
engines: {node: '>=18.0.0'}
'@istanbuljs/schema@0.1.3':
resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
engines: {node: '>=8'}
'@jest/schemas@29.6.3':
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
......@@ -1430,6 +1461,9 @@ packages:
unplugin-vue-components:
optional: true
'@one-ini/wasm@0.1.1':
resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
'@parcel/watcher-android-arm64@2.5.1':
resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
engines: {node: '>= 10.0.0'}
......@@ -1459,36 +1493,42 @@ packages:
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
libc: [glibc]
'@parcel/watcher-linux-arm-musl@2.5.1':
resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
libc: [musl]
'@parcel/watcher-linux-arm64-glibc@2.5.1':
resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@parcel/watcher-linux-arm64-musl@2.5.1':
resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@parcel/watcher-linux-x64-glibc@2.5.1':
resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@parcel/watcher-linux-x64-musl@2.5.1':
resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
'@parcel/watcher-win32-arm64@2.5.1':
resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
......@@ -1544,6 +1584,144 @@ packages:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.57.1':
resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.57.1':
resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.57.1':
resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.57.1':
resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.57.1':
resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.57.1':
resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.57.1':
resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.57.1':
resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==}
cpu: [arm]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.57.1':
resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.57.1':
resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.57.1':
resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==}
cpu: [loong64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-loong64-musl@4.57.1':
resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==}
cpu: [loong64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-ppc64-gnu@4.57.1':
resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-ppc64-musl@4.57.1':
resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==}
cpu: [ppc64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-riscv64-gnu@4.57.1':
resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.57.1':
resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==}
cpu: [riscv64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.57.1':
resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.57.1':
resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.57.1':
resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==}
cpu: [x64]
os: [linux]
libc: [musl]
'@rollup/rollup-openbsd-x64@4.57.1':
resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==}
cpu: [x64]
os: [openbsd]
'@rollup/rollup-openharmony-arm64@4.57.1':
resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==}
cpu: [arm64]
os: [openharmony]
'@rollup/rollup-win32-arm64-msvc@4.57.1':
resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.57.1':
resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-gnu@4.57.1':
resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==}
cpu: [x64]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.57.1':
resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==}
cpu: [x64]
os: [win32]
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
......@@ -1599,24 +1777,28 @@ packages:
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@swc/core-linux-arm64-musl@1.3.96':
resolution: {integrity: sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@swc/core-linux-x64-gnu@1.3.96':
resolution: {integrity: sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@swc/core-linux-x64-musl@1.3.96':
resolution: {integrity: sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@swc/core-win32-arm64-msvc@1.3.96':
resolution: {integrity: sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==}
......@@ -1692,6 +1874,7 @@ packages:
engines: {node: '>= 18'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@tarojs/binding-win32-x64-msvc@4.1.7':
resolution: {integrity: sha512-treGgXFwNa9Q6xIsz0NSfI9R2J0s9GW9xb76jcOxMsjT4eIrmQ/NhNS4lHSM5dz6jwmh+Gzv5ow7nS+HEKN+Xw==}
......@@ -1757,24 +1940,28 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@tarojs/plugin-doctor-linux-arm64-musl@0.0.13':
resolution: {integrity: sha512-V1HnFITOLgHVyQ+OCa1oPFKOtGFRtP91vlbUGfOwMA4GeOVw9g28W/hfTyucTCkfZWlrssLehgW6L2AGAMXh2w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@tarojs/plugin-doctor-linux-x64-gnu@0.0.13':
resolution: {integrity: sha512-oetfzBW60uenPBBF4/NE6Mf0Iwkw1YGqIIBiN++aVQynbWrmMzWBsW8kleZ5vN1npxI9aud9EfRU1uM37DrG2A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@tarojs/plugin-doctor-linux-x64-musl@0.0.13':
resolution: {integrity: sha512-OdIF/kFwwM0kQPDnpkanhvfWRaAI6EtDmpM9rQA/Lu2QcJq86w5d7X/WSN0U2xF1nialAUrfl79NyIaEzp4Fcw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@tarojs/plugin-doctor-win32-ia32-msvc@0.0.13':
resolution: {integrity: sha512-nIbG2SliRhRwACLa1kNMskcfjsihp+3tZQMAxl+LoYUq6JRaWgP3vH2nHkDyZHTCheBTDtAaupqXWrYF3w+U6g==}
......@@ -2166,6 +2353,33 @@ packages:
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
'@vitejs/plugin-vue@5.2.4':
resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^5.0.0 || ^6.0.0
vue: ^3.2.25
'@vitest/coverage-v8@1.6.1':
resolution: {integrity: sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==}
peerDependencies:
vitest: 1.6.1
'@vitest/expect@1.6.1':
resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==}
'@vitest/runner@1.6.1':
resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==}
'@vitest/snapshot@1.6.1':
resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==}
'@vitest/spy@1.6.1':
resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==}
'@vitest/utils@1.6.1':
resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==}
'@vue/babel-helper-vue-transform-on@1.5.0':
resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==}
......@@ -2220,6 +2434,9 @@ packages:
'@vue/shared@3.5.20':
resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==}
'@vue/test-utils@2.4.6':
resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
'@weapp-core/escape@4.0.1':
resolution: {integrity: sha512-FuO9zTs/8VMhoZ+sZkMEMipcHd9FZhxstdhg9+Z3JlTgxMFAIvhBFOuFjM2bUyjDJ7O21nr9podHDjVjcVYu4Q==}
......@@ -2292,6 +2509,10 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
abbrev@2.0.0:
resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
abortcontroller-polyfill@1.7.8:
resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==}
......@@ -2363,6 +2584,10 @@ packages:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
ansi-escapes@7.3.0:
resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==}
engines: {node: '>=18'}
ansi-html-community@0.0.8:
resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
engines: {'0': node >= 0.8.0}
......@@ -2380,6 +2605,10 @@ packages:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
ansi-styles@5.2.0:
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
engines: {node: '>=10'}
ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
......@@ -2435,6 +2664,9 @@ packages:
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
assertion-error@1.1.0:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
async-function@1.0.0:
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
engines: {node: '>= 0.4'}
......@@ -2664,6 +2896,10 @@ packages:
resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==}
engines: {node: '>=4'}
chai@4.5.0:
resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
engines: {node: '>=4'}
chalk@3.0.0:
resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
engines: {node: '>=8'}
......@@ -2681,6 +2917,9 @@ packages:
charenc@0.0.2:
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
check-error@1.0.3:
resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
......@@ -2723,6 +2962,10 @@ packages:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
cli-cursor@5.0.0:
resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
engines: {node: '>=18'}
cli-highlight@2.1.11:
resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==}
engines: {node: '>=8.0.0', npm: '>=5.0.0'}
......@@ -2732,6 +2975,10 @@ packages:
resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
engines: {node: '>=6'}
cli-truncate@5.1.1:
resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==}
engines: {node: '>=20'}
cli-width@3.0.0:
resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
engines: {node: '>= 10'}
......@@ -2770,6 +3017,14 @@ packages:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
commander@10.0.1:
resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
engines: {node: '>=14'}
commander@14.0.3:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
......@@ -3093,6 +3348,10 @@ packages:
resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==}
engines: {node: '>=4'}
deep-eql@4.1.4:
resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
engines: {node: '>=6'}
deep-extend@0.6.0:
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
engines: {node: '>=4.0.0'}
......@@ -3168,6 +3427,10 @@ packages:
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
diff-sequences@29.6.3:
resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dingtalk-jsapi@2.15.6:
resolution: {integrity: sha512-804mFz2AFV/H9ysmo7dLqMjSGOQgREsgQIuep+Xg+yNQeQtnUOYntElEzlB798Sj/691e4mMKz9mtQ7v9qdjuA==}
......@@ -3244,12 +3507,20 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
editorconfig@1.0.4:
resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
engines: {node: '>=14'}
hasBin: true
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
electron-to-chromium@1.5.211:
resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
......@@ -3298,6 +3569,10 @@ packages:
engines: {node: '>=4'}
hasBin: true
environment@1.1.0:
resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
engines: {node: '>=18'}
err-code@2.0.3:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
......@@ -3473,6 +3748,9 @@ packages:
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
......@@ -3484,6 +3762,9 @@ packages:
eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
......@@ -3492,6 +3773,10 @@ packages:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
execa@8.0.1:
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
expr-parser@1.0.0:
resolution: {integrity: sha512-ncuWTCWH0M5KbaYikXxZ3FG3Q+FTYIEXeXAbxYscdZLFNnR5Le5gRU2r/a/JUZHnxwBDZcxWEWzCoPQlW9Engg==}
......@@ -3693,6 +3978,13 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
get-east-asian-width@1.4.0:
resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
engines: {node: '>=18'}
get-func-name@2.0.2:
resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
get-intrinsic@1.3.0:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
......@@ -3725,6 +4017,10 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
get-stream@8.0.1:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
get-symbol-description@1.1.0:
resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
engines: {node: '>= 0.4'}
......@@ -3882,6 +4178,9 @@ packages:
html-entities@2.6.0:
resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
html-minifier-terser@6.1.0:
resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
engines: {node: '>=12'}
......@@ -3955,6 +4254,15 @@ packages:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'}
human-signals@5.0.0:
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
engines: {node: '>=16.17.0'}
husky@9.1.7:
resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
engines: {node: '>=18'}
hasBin: true
iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
......@@ -4106,6 +4414,10 @@ packages:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
is-fullwidth-code-point@5.1.0:
resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
engines: {node: '>=18'}
is-generator-function@1.1.0:
resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
engines: {node: '>= 0.4'}
......@@ -4190,6 +4502,10 @@ packages:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
is-stream@3.0.0:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
is-string@1.1.1:
resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
engines: {node: '>= 0.4'}
......@@ -4242,6 +4558,22 @@ packages:
resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
engines: {node: '>=0.10.0'}
istanbul-lib-coverage@3.2.2:
resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
engines: {node: '>=8'}
istanbul-lib-report@3.0.1:
resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
engines: {node: '>=10'}
istanbul-lib-source-maps@5.0.6:
resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
engines: {node: '>=10'}
istanbul-reports@3.2.0:
resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==}
engines: {node: '>=8'}
isurl@1.0.0:
resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
engines: {node: '>= 4'}
......@@ -4282,9 +4614,21 @@ packages:
joi@17.13.3:
resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
js-beautify@1.15.4:
resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==}
engines: {node: '>=14'}
hasBin: true
js-cookie@3.0.5:
resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
engines: {node: '>=14'}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
js-tokens@9.0.1:
resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
......@@ -4423,24 +4767,28 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.30.1:
resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.30.1:
resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.30.1:
resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.30.1:
resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
......@@ -4465,6 +4813,15 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
lint-staged@16.2.7:
resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==}
engines: {node: '>=20.17'}
hasBin: true
listr2@9.0.5:
resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==}
engines: {node: '>=20.0.0'}
loader-runner@4.3.0:
resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
engines: {node: '>=6.11.5'}
......@@ -4485,6 +4842,10 @@ packages:
resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
engines: {node: '>=14'}
local-pkg@0.5.1:
resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
engines: {node: '>=14'}
local-pkg@1.1.2:
resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
engines: {node: '>=14'}
......@@ -4522,6 +4883,10 @@ packages:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
log-update@6.1.0:
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
engines: {node: '>=18'}
loglevel-plugin-prefix@0.8.4:
resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==}
......@@ -4529,6 +4894,9 @@ packages:
resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==}
engines: {node: '>= 0.6.0'}
loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
lower-case@1.1.4:
resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==}
......@@ -4556,6 +4924,9 @@ packages:
magic-string@0.30.18:
resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==}
magicast@0.3.5:
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
make-dir@1.3.0:
resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
engines: {node: '>=4'}
......@@ -4568,6 +4939,10 @@ packages:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
engines: {node: '>=8'}
make-dir@4.0.0:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
make-fetch-happen@14.0.3:
resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
engines: {node: ^18.17.0 || >=20.5.0}
......@@ -4640,6 +5015,14 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
mimic-fn@4.0.0:
resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
engines: {node: '>=12'}
mimic-function@5.0.1:
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
engines: {node: '>=18'}
mimic-response@1.0.1:
resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
engines: {node: '>=4'}
......@@ -4663,6 +5046,10 @@ packages:
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
minimatch@9.0.1:
resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
engines: {node: '>=16 || 14 >=14.17'}
minimatch@9.0.3:
resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
engines: {node: '>=16 || 14 >=14.17'}
......@@ -4765,6 +5152,10 @@ packages:
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
nano-spawn@2.0.0:
resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==}
engines: {node: '>=20.17'}
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
......@@ -4810,6 +5201,11 @@ packages:
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
nopt@7.2.1:
resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
hasBin: true
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
......@@ -4842,6 +5238,10 @@ packages:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
npm-run-path@5.3.0:
resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
......@@ -4906,6 +5306,14 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
onetime@6.0.0:
resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
engines: {node: '>=12'}
onetime@7.0.0:
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
open@8.4.2:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'}
......@@ -4950,6 +5358,10 @@ packages:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
p-limit@5.0.0:
resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
engines: {node: '>=18'}
p-locate@3.0.0:
resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
engines: {node: '>=6'}
......@@ -5033,6 +5445,10 @@ packages:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
path-key@4.0.0:
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
engines: {node: '>=12'}
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
......@@ -5054,9 +5470,15 @@ packages:
resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
engines: {node: '>=18'}
pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
pathval@1.1.1:
resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
......@@ -5077,6 +5499,11 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
pidtree@0.6.0:
resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
engines: {node: '>=0.10'}
hasBin: true
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
......@@ -5585,6 +6012,11 @@ packages:
resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
engines: {node: '>=4'}
prettier@3.8.1:
resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
engines: {node: '>=14'}
hasBin: true
pretty-bytes@5.6.0:
resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
engines: {node: '>=6'}
......@@ -5596,6 +6028,10 @@ packages:
resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==}
engines: {node: '>= 10'}
pretty-format@29.7.0:
resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
pretty-time@1.1.0:
resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==}
engines: {node: '>=4'}
......@@ -5682,6 +6118,9 @@ packages:
react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
react@19.1.1:
resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==}
engines: {node: '>=0.10.0'}
......@@ -5788,6 +6227,10 @@ packages:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
restore-cursor@5.1.0:
resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
engines: {node: '>=18'}
retry@0.12.0:
resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
engines: {node: '>= 4'}
......@@ -5813,6 +6256,11 @@ packages:
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
rollup@4.57.1:
resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
......@@ -6007,6 +6455,9 @@ packages:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
......@@ -6022,6 +6473,10 @@ packages:
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
engines: {node: '>=14.16'}
slice-ansi@7.1.2:
resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
engines: {node: '>=18'}
smart-buffer@4.2.0:
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
......@@ -6096,6 +6551,9 @@ packages:
resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==}
engines: {node: ^18.17.0 || >=20.5.0}
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
......@@ -6115,6 +6573,10 @@ packages:
resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
engines: {node: '>=0.10.0'}
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
......@@ -6123,6 +6585,14 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
string-width@8.1.1:
resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==}
engines: {node: '>=20'}
string.fromcodepoint@0.2.1:
resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==}
......@@ -6163,6 +6633,10 @@ packages:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
strip-final-newline@3.0.0:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
strip-json-comments@2.0.1:
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
engines: {node: '>=0.10.0'}
......@@ -6171,6 +6645,9 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
strip-literal@2.1.1:
resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
strip-outer@1.0.1:
resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
engines: {node: '>=0.10.0'}
......@@ -6305,6 +6782,10 @@ packages:
engines: {node: '>=10'}
hasBin: true
test-exclude@6.0.0:
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
engines: {node: '>=8'}
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
......@@ -6328,9 +6809,20 @@ packages:
tiny-case@1.0.3:
resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
tinypool@0.8.4:
resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
engines: {node: '>=14.0.0'}
tinyspy@2.2.1:
resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
engines: {node: '>=14.0.0'}
to-buffer@1.2.1:
resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==}
engines: {node: '>= 0.4'}
......@@ -6390,6 +6882,10 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
type-detect@4.1.0:
resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
engines: {node: '>=4'}
type-fest@0.20.2:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
......@@ -6570,12 +7066,76 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
vite-node@1.6.1:
resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
vite@5.4.21:
resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@types/node': ^18.0.0 || >=20.0.0
less: '*'
lightningcss: ^1.21.0
sass: '*'
sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
vitest@1.6.1:
resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/node': ^18.0.0 || >=20.0.0
'@vitest/browser': 1.6.1
'@vitest/ui': 1.6.1
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
'@types/node':
optional: true
'@vitest/browser':
optional: true
'@vitest/ui':
optional: true
happy-dom:
optional: true
jsdom:
optional: true
vm2@3.9.19:
resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==}
engines: {node: '>=6.0'}
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.
hasBin: true
vue-component-type-helpers@2.2.12:
resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==}
vue-loader@17.4.2:
resolution: {integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==}
peerDependencies:
......@@ -6688,6 +7248,7 @@ packages:
whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
whatwg-fetch@3.6.20:
resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
......@@ -6721,6 +7282,11 @@ packages:
engines: {node: '>= 8'}
hasBin: true
why-is-node-running@2.3.0:
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
engines: {node: '>=8'}
hasBin: true
wildcard@2.0.1:
resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
......@@ -6740,6 +7306,10 @@ packages:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
engines: {node: '>=12'}
wrap-ansi@9.0.2:
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
......@@ -6803,6 +7373,10 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
yocto-queue@1.2.2:
resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
engines: {node: '>=12.20'}
yup@1.7.0:
resolution: {integrity: sha512-VJce62dBd+JQvoc+fCVq+KZfPHr+hXaxCcVgotfwWvlR0Ja3ffYKaJBT8rptPOSKOGJDCUnW2C2JWpud7aRP6Q==}
......@@ -7557,6 +8131,8 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1
'@bcoe/v8-coverage@0.2.3': {}
'@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)':
dependencies:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
......@@ -8065,6 +8641,8 @@ snapshots:
dependencies:
minipass: 7.1.2
'@istanbuljs/schema@0.1.3': {}
'@jest/schemas@29.6.3':
dependencies:
'@sinclair/typebox': 0.27.8
......@@ -8155,6 +8733,8 @@ snapshots:
optionalDependencies:
unplugin-vue-components: 0.26.0(@babel/parser@7.28.3)(rollup@3.29.5)(vue@3.5.20(typescript@5.9.2))
'@one-ini/wasm@0.1.1': {}
'@parcel/watcher-android-arm64@2.5.1':
optional: true
......@@ -8240,7 +8820,82 @@ snapshots:
optionalDependencies:
rollup: 3.29.5
'@rtsao/scc@1.1.0': {}
'@rollup/rollup-android-arm-eabi@4.57.1':
optional: true
'@rollup/rollup-android-arm64@4.57.1':
optional: true
'@rollup/rollup-darwin-arm64@4.57.1':
optional: true
'@rollup/rollup-darwin-x64@4.57.1':
optional: true
'@rollup/rollup-freebsd-arm64@4.57.1':
optional: true
'@rollup/rollup-freebsd-x64@4.57.1':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.57.1':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.57.1':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.57.1':
optional: true
'@rollup/rollup-linux-arm64-musl@4.57.1':
optional: true
'@rollup/rollup-linux-loong64-gnu@4.57.1':
optional: true
'@rollup/rollup-linux-loong64-musl@4.57.1':
optional: true
'@rollup/rollup-linux-ppc64-gnu@4.57.1':
optional: true
'@rollup/rollup-linux-ppc64-musl@4.57.1':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.57.1':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.57.1':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.57.1':
optional: true
'@rollup/rollup-linux-x64-gnu@4.57.1':
optional: true
'@rollup/rollup-linux-x64-musl@4.57.1':
optional: true
'@rollup/rollup-openbsd-x64@4.57.1':
optional: true
'@rollup/rollup-openharmony-arm64@4.57.1':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.57.1':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.57.1':
optional: true
'@rollup/rollup-win32-x64-gnu@4.57.1':
optional: true
'@rollup/rollup-win32-x64-msvc@4.57.1':
optional: true
'@rtsao/scc@1.1.0': {}
'@sideway/address@4.1.5':
dependencies:
......@@ -8323,10 +8978,10 @@ snapshots:
dependencies:
defer-to-connect: 1.1.3
'@tailwindcss-mangle/config@5.1.1':
'@tailwindcss-mangle/config@5.1.1(magicast@0.3.5)':
dependencies:
'@tailwindcss-mangle/shared': 4.1.1
c12: 2.0.4
c12: 2.0.4(magicast@0.3.5)
fs-extra: 11.3.1
is-css-request: 1.0.1
pathe: 2.0.3
......@@ -8506,7 +9161,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@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))':
'@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))':
dependencies:
'@tarojs/helper': 4.1.7
'@tarojs/runner-utils': 4.1.7
......@@ -8517,6 +9172,8 @@ snapshots:
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))
webpack: 5.78.0(@swc/core@1.3.96)
optionalDependencies:
'@vitejs/plugin-vue': 5.2.4(vue@3.5.20(typescript@5.9.2))
'@tarojs/plugin-html@4.1.7(@tarojs/helper@4.1.7)(@tarojs/runtime@4.1.7)(@tarojs/shared@4.1.7)':
dependencies:
......@@ -9023,6 +9680,58 @@ snapshots:
'@ungap/structured-clone@1.3.0': {}
'@vitejs/plugin-vue@5.2.4(vue@3.5.20(typescript@5.9.2))':
dependencies:
vue: 3.5.20(typescript@5.9.2)
'@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))':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 0.2.3
debug: 4.4.1
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
istanbul-reports: 3.2.0
magic-string: 0.30.18
magicast: 0.3.5
picocolors: 1.1.1
std-env: 3.9.0
strip-literal: 2.1.1
test-exclude: 6.0.0
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)
transitivePeerDependencies:
- supports-color
'@vitest/expect@1.6.1':
dependencies:
'@vitest/spy': 1.6.1
'@vitest/utils': 1.6.1
chai: 4.5.0
'@vitest/runner@1.6.1':
dependencies:
'@vitest/utils': 1.6.1
p-limit: 5.0.0
pathe: 1.1.2
'@vitest/snapshot@1.6.1':
dependencies:
magic-string: 0.30.18
pathe: 1.1.2
pretty-format: 29.7.0
'@vitest/spy@1.6.1':
dependencies:
tinyspy: 2.2.1
'@vitest/utils@1.6.1':
dependencies:
diff-sequences: 29.6.3
estree-walker: 3.0.3
loupe: 2.3.7
pretty-format: 29.7.0
'@vue/babel-helper-vue-transform-on@1.5.0': {}
'@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.3)':
......@@ -9124,6 +9833,11 @@ snapshots:
'@vue/shared@3.5.20': {}
'@vue/test-utils@2.4.6':
dependencies:
js-beautify: 1.15.4
vue-component-type-helpers: 2.2.12
'@weapp-core/escape@4.0.1': {}
'@weapp-core/regex@1.0.1': {}
......@@ -9239,6 +9953,8 @@ snapshots:
'@xtuc/long@4.2.2': {}
abbrev@2.0.0: {}
abortcontroller-polyfill@1.7.8: {}
accepts@1.3.8:
......@@ -9302,6 +10018,10 @@ snapshots:
dependencies:
type-fest: 0.21.3
ansi-escapes@7.3.0:
dependencies:
environment: 1.1.0
ansi-html-community@0.0.8: {}
ansi-regex@5.0.1: {}
......@@ -9312,6 +10032,8 @@ snapshots:
dependencies:
color-convert: 2.0.1
ansi-styles@5.2.0: {}
ansi-styles@6.2.1: {}
any-promise@1.3.0: {}
......@@ -9385,6 +10107,8 @@ snapshots:
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
assertion-error@1.1.0: {}
async-function@1.0.0: {}
asynckit@0.4.0: {}
......@@ -9591,7 +10315,7 @@ snapshots:
bytes@3.1.2: {}
c12@2.0.4:
c12@2.0.4(magicast@0.3.5):
dependencies:
chokidar: 4.0.3
confbox: 0.1.8
......@@ -9605,6 +10329,8 @@ snapshots:
perfect-debounce: 1.0.0
pkg-types: 1.3.1
rc9: 2.1.2
optionalDependencies:
magicast: 0.3.5
cac@6.7.14: {}
......@@ -9698,6 +10424,16 @@ snapshots:
tunnel-agent: 0.6.0
url-to-options: 1.0.1
chai@4.5.0:
dependencies:
assertion-error: 1.1.0
check-error: 1.0.3
deep-eql: 4.1.4
get-func-name: 2.0.2
loupe: 2.3.7
pathval: 1.1.1
type-detect: 4.1.0
chalk@3.0.0:
dependencies:
ansi-styles: 4.3.0
......@@ -9727,6 +10463,10 @@ snapshots:
charenc@0.0.2: {}
check-error@1.0.3:
dependencies:
get-func-name: 2.0.2
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
......@@ -9769,6 +10509,10 @@ snapshots:
dependencies:
restore-cursor: 3.1.0
cli-cursor@5.0.0:
dependencies:
restore-cursor: 5.1.0
cli-highlight@2.1.11:
dependencies:
chalk: 4.1.2
......@@ -9780,6 +10524,11 @@ snapshots:
cli-spinners@2.9.2: {}
cli-truncate@5.1.1:
dependencies:
slice-ansi: 7.1.2
string-width: 8.1.1
cli-width@3.0.0: {}
cliui@7.0.4:
......@@ -9818,6 +10567,10 @@ snapshots:
dependencies:
delayed-stream: 1.0.0
commander@10.0.1: {}
commander@14.0.3: {}
commander@2.20.3: {}
commander@4.1.1: {}
......@@ -10169,6 +10922,10 @@ snapshots:
pify: 2.3.0
strip-dirs: 2.1.0
deep-eql@4.1.4:
dependencies:
type-detect: 4.1.0
deep-extend@0.6.0: {}
deep-is@0.1.4: {}
......@@ -10227,6 +10984,8 @@ snapshots:
didyoumean@1.2.2: {}
diff-sequences@29.6.3: {}
dingtalk-jsapi@2.15.6:
dependencies:
promise-polyfill: 7.1.2
......@@ -10329,10 +11088,19 @@ snapshots:
eastasianwidth@0.2.0: {}
editorconfig@1.0.4:
dependencies:
'@one-ini/wasm': 0.1.1
commander: 10.0.1
minimatch: 9.0.1
semver: 7.7.2
ee-first@1.1.1: {}
electron-to-chromium@1.5.211: {}
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
......@@ -10367,6 +11135,8 @@ snapshots:
envinfo@7.14.0: {}
environment@1.1.0: {}
err-code@2.0.3: {}
errno@0.1.8:
......@@ -10717,12 +11487,18 @@ snapshots:
estree-walker@2.0.2: {}
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.8
esutils@2.0.3: {}
etag@1.8.1: {}
eventemitter3@4.0.7: {}
eventemitter3@5.0.4: {}
events@3.3.0: {}
execa@5.1.1:
......@@ -10737,6 +11513,18 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 2.0.0
execa@8.0.1:
dependencies:
cross-spawn: 7.0.6
get-stream: 8.0.1
human-signals: 5.0.0
is-stream: 3.0.0
merge-stream: 2.0.0
npm-run-path: 5.3.0
onetime: 6.0.0
signal-exit: 4.1.0
strip-final-newline: 3.0.0
expr-parser@1.0.0: {}
express@4.21.2:
......@@ -10963,6 +11751,10 @@ snapshots:
get-caller-file@2.0.5: {}
get-east-asian-width@1.4.0: {}
get-func-name@2.0.2: {}
get-intrinsic@1.3.0:
dependencies:
call-bind-apply-helpers: 1.0.2
......@@ -11002,6 +11794,8 @@ snapshots:
get-stream@6.0.1: {}
get-stream@8.0.1: {}
get-symbol-description@1.1.0:
dependencies:
call-bound: 1.0.4
......@@ -11207,6 +12001,8 @@ snapshots:
html-entities@2.6.0: {}
html-escaper@2.0.2: {}
html-minifier-terser@6.1.0:
dependencies:
camel-case: 4.1.2
......@@ -11310,6 +12106,10 @@ snapshots:
human-signals@2.1.0: {}
human-signals@5.0.0: {}
husky@9.1.7: {}
iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
......@@ -11462,6 +12262,10 @@ snapshots:
is-fullwidth-code-point@3.0.0: {}
is-fullwidth-code-point@5.1.0:
dependencies:
get-east-asian-width: 1.4.0
is-generator-function@1.1.0:
dependencies:
call-bound: 1.0.4
......@@ -11525,6 +12329,8 @@ snapshots:
is-stream@2.0.1: {}
is-stream@3.0.0: {}
is-string@1.1.1:
dependencies:
call-bound: 1.0.4
......@@ -11569,6 +12375,27 @@ snapshots:
isobject@3.0.1: {}
istanbul-lib-coverage@3.2.2: {}
istanbul-lib-report@3.0.1:
dependencies:
istanbul-lib-coverage: 3.2.2
make-dir: 4.0.0
supports-color: 7.2.0
istanbul-lib-source-maps@5.0.6:
dependencies:
'@jridgewell/trace-mapping': 0.3.30
debug: 4.4.1
istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
- supports-color
istanbul-reports@3.2.0:
dependencies:
html-escaper: 2.0.2
istanbul-lib-report: 3.0.1
isurl@1.0.0:
dependencies:
has-to-string-tag-x: 1.4.1
......@@ -11628,8 +12455,20 @@ snapshots:
'@sideway/formula': 3.0.1
'@sideway/pinpoint': 2.0.0
js-beautify@1.15.4:
dependencies:
config-chain: 1.1.13
editorconfig: 1.0.4
glob: 10.4.5
js-cookie: 3.0.5
nopt: 7.2.1
js-cookie@3.0.5: {}
js-tokens@4.0.0: {}
js-tokens@9.0.1: {}
js-yaml@4.1.0:
dependencies:
argparse: 2.0.1
......@@ -11798,6 +12637,25 @@ snapshots:
lines-and-columns@1.2.4: {}
lint-staged@16.2.7:
dependencies:
commander: 14.0.3
listr2: 9.0.5
micromatch: 4.0.8
nano-spawn: 2.0.0
pidtree: 0.6.0
string-argv: 0.3.2
yaml: 2.8.1
listr2@9.0.5:
dependencies:
cli-truncate: 5.1.1
colorette: 2.0.20
eventemitter3: 5.0.4
log-update: 6.1.0
rfdc: 1.4.1
wrap-ansi: 9.0.2
loader-runner@4.3.0: {}
loader-utils@1.4.2:
......@@ -11816,6 +12674,11 @@ snapshots:
local-pkg@0.4.3: {}
local-pkg@0.5.1:
dependencies:
mlly: 1.8.0
pkg-types: 1.3.1
local-pkg@1.1.2:
dependencies:
mlly: 1.8.0
......@@ -11850,10 +12713,22 @@ snapshots:
chalk: 4.1.2
is-unicode-supported: 0.1.0
log-update@6.1.0:
dependencies:
ansi-escapes: 7.3.0
cli-cursor: 5.0.0
slice-ansi: 7.1.2
strip-ansi: 7.1.0
wrap-ansi: 9.0.2
loglevel-plugin-prefix@0.8.4: {}
loglevel@1.9.2: {}
loupe@2.3.7:
dependencies:
get-func-name: 2.0.2
lower-case@1.1.4: {}
lower-case@2.0.2:
......@@ -11876,6 +12751,12 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
magicast@0.3.5:
dependencies:
'@babel/parser': 7.28.3
'@babel/types': 7.28.2
source-map-js: 1.2.1
make-dir@1.3.0:
dependencies:
pify: 3.0.0
......@@ -11889,6 +12770,10 @@ snapshots:
dependencies:
semver: 6.3.1
make-dir@4.0.0:
dependencies:
semver: 7.7.2
make-fetch-happen@14.0.3:
dependencies:
'@npmcli/agent': 3.0.0
......@@ -11952,6 +12837,10 @@ snapshots:
mimic-fn@2.1.0: {}
mimic-fn@4.0.0: {}
mimic-function@5.0.1: {}
mimic-response@1.0.1: {}
mini-css-extract-plugin@2.9.4(webpack@5.78.0(@swc/core@1.3.96)):
......@@ -11974,6 +12863,10 @@ snapshots:
dependencies:
brace-expansion: 1.1.12
minimatch@9.0.1:
dependencies:
brace-expansion: 2.0.2
minimatch@9.0.3:
dependencies:
brace-expansion: 2.0.2
......@@ -12077,6 +12970,8 @@ snapshots:
object-assign: 4.1.1
thenify-all: 1.6.0
nano-spawn@2.0.0: {}
nanoid@3.3.11: {}
native-request@1.1.2:
......@@ -12110,6 +13005,10 @@ snapshots:
node-releases@2.0.19: {}
nopt@7.2.1:
dependencies:
abbrev: 2.0.0
normalize-path@3.0.0: {}
normalize-range@0.1.2: {}
......@@ -12151,6 +13050,10 @@ snapshots:
dependencies:
path-key: 3.1.1
npm-run-path@5.3.0:
dependencies:
path-key: 4.0.0
nth-check@2.1.1:
dependencies:
boolbase: 1.0.0
......@@ -12221,6 +13124,14 @@ snapshots:
dependencies:
mimic-fn: 2.1.0
onetime@6.0.0:
dependencies:
mimic-fn: 4.0.0
onetime@7.0.0:
dependencies:
mimic-function: 5.0.1
open@8.4.2:
dependencies:
define-lazy-prop: 2.0.0
......@@ -12274,6 +13185,10 @@ snapshots:
dependencies:
yocto-queue: 0.1.0
p-limit@5.0.0:
dependencies:
yocto-queue: 1.2.2
p-locate@3.0.0:
dependencies:
p-limit: 2.3.0
......@@ -12356,6 +13271,8 @@ snapshots:
path-key@3.1.1: {}
path-key@4.0.0: {}
path-parse@1.0.7: {}
path-scurry@1.11.1:
......@@ -12371,8 +13288,12 @@ snapshots:
path-type@6.0.0: {}
pathe@1.1.2: {}
pathe@2.0.3: {}
pathval@1.1.1: {}
pend@1.2.0: {}
perfect-debounce@1.0.0: {}
......@@ -12385,6 +13306,8 @@ snapshots:
picomatch@4.0.3: {}
pidtree@0.6.0: {}
pify@2.3.0: {}
pify@3.0.0: {}
......@@ -12921,6 +13844,8 @@ snapshots:
prepend-http@2.0.0: {}
prettier@3.8.1: {}
pretty-bytes@5.6.0: {}
pretty-error@4.0.0:
......@@ -12935,6 +13860,12 @@ snapshots:
ansi-styles: 4.3.0
react-is: 17.0.2
pretty-format@29.7.0:
dependencies:
'@jest/schemas': 29.6.3
ansi-styles: 5.2.0
react-is: 18.3.1
pretty-time@1.1.0: {}
proc-log@5.0.0: {}
......@@ -13022,6 +13953,8 @@ snapshots:
react-is@17.0.2: {}
react-is@18.3.1: {}
react@19.1.1: {}
read-cache@1.0.0:
......@@ -13148,6 +14081,11 @@ snapshots:
onetime: 5.1.2
signal-exit: 3.0.7
restore-cursor@5.1.0:
dependencies:
onetime: 7.0.0
signal-exit: 4.1.0
retry@0.12.0: {}
retry@0.13.1: {}
......@@ -13164,6 +14102,37 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
rollup@4.57.1:
dependencies:
'@types/estree': 1.0.8
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.57.1
'@rollup/rollup-android-arm64': 4.57.1
'@rollup/rollup-darwin-arm64': 4.57.1
'@rollup/rollup-darwin-x64': 4.57.1
'@rollup/rollup-freebsd-arm64': 4.57.1
'@rollup/rollup-freebsd-x64': 4.57.1
'@rollup/rollup-linux-arm-gnueabihf': 4.57.1
'@rollup/rollup-linux-arm-musleabihf': 4.57.1
'@rollup/rollup-linux-arm64-gnu': 4.57.1
'@rollup/rollup-linux-arm64-musl': 4.57.1
'@rollup/rollup-linux-loong64-gnu': 4.57.1
'@rollup/rollup-linux-loong64-musl': 4.57.1
'@rollup/rollup-linux-ppc64-gnu': 4.57.1
'@rollup/rollup-linux-ppc64-musl': 4.57.1
'@rollup/rollup-linux-riscv64-gnu': 4.57.1
'@rollup/rollup-linux-riscv64-musl': 4.57.1
'@rollup/rollup-linux-s390x-gnu': 4.57.1
'@rollup/rollup-linux-x64-gnu': 4.57.1
'@rollup/rollup-linux-x64-musl': 4.57.1
'@rollup/rollup-openbsd-x64': 4.57.1
'@rollup/rollup-openharmony-arm64': 4.57.1
'@rollup/rollup-win32-arm64-msvc': 4.57.1
'@rollup/rollup-win32-ia32-msvc': 4.57.1
'@rollup/rollup-win32-x64-gnu': 4.57.1
'@rollup/rollup-win32-x64-msvc': 4.57.1
fsevents: 2.3.3
rrweb-cssom@0.7.1: {}
rrweb-cssom@0.8.0: {}
......@@ -13406,6 +14375,8 @@ snapshots:
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
siginfo@2.0.0: {}
signal-exit@3.0.7: {}
signal-exit@4.1.0: {}
......@@ -13414,6 +14385,11 @@ snapshots:
slash@5.1.0: {}
slice-ansi@7.1.2:
dependencies:
ansi-styles: 6.2.1
is-fullwidth-code-point: 5.1.0
smart-buffer@4.2.0: {}
snake-case@3.0.4:
......@@ -13502,6 +14478,8 @@ snapshots:
dependencies:
minipass: 7.1.2
stackback@0.0.2: {}
statuses@1.5.0: {}
statuses@2.0.1: {}
......@@ -13515,6 +14493,8 @@ snapshots:
strict-uri-encode@1.1.0: {}
string-argv@0.3.2: {}
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
......@@ -13527,6 +14507,17 @@ snapshots:
emoji-regex: 9.2.2
strip-ansi: 7.1.0
string-width@7.2.0:
dependencies:
emoji-regex: 10.6.0
get-east-asian-width: 1.4.0
strip-ansi: 7.1.0
string-width@8.1.1:
dependencies:
get-east-asian-width: 1.4.0
strip-ansi: 7.1.0
string.fromcodepoint@0.2.1: {}
string.prototype.trim@1.2.10:
......@@ -13576,10 +14567,16 @@ snapshots:
strip-final-newline@2.0.0: {}
strip-final-newline@3.0.0: {}
strip-json-comments@2.0.1: {}
strip-json-comments@3.1.1: {}
strip-literal@2.1.1:
dependencies:
js-tokens: 9.0.1
strip-outer@1.0.1:
dependencies:
escape-string-regexp: 1.0.5
......@@ -13666,13 +14663,13 @@ snapshots:
jiti: 2.5.1
lilconfig: 3.1.3
tailwindcss-patch@7.1.4(tailwindcss@3.4.17):
tailwindcss-patch@7.1.4(magicast@0.3.5)(tailwindcss@3.4.17):
dependencies:
'@babel/generator': 7.28.3
'@babel/parser': 7.28.3
'@babel/traverse': 7.28.3
'@babel/types': 7.28.2
'@tailwindcss-mangle/config': 5.1.1
'@tailwindcss-mangle/config': 5.1.1(magicast@0.3.5)
cac: 6.7.14
consola: 3.4.2
fs-extra: 11.3.1
......@@ -13765,6 +14762,12 @@ snapshots:
commander: 2.20.3
source-map-support: 0.5.21
test-exclude@6.0.0:
dependencies:
'@istanbuljs/schema': 0.1.3
glob: 7.2.3
minimatch: 3.1.2
text-table@0.2.0: {}
thenify-all@1.6.0:
......@@ -13783,8 +14786,14 @@ snapshots:
tiny-case@1.0.3: {}
tinybench@2.9.0: {}
tinyexec@0.3.2: {}
tinypool@0.8.4: {}
tinyspy@2.2.1: {}
to-buffer@1.2.1:
dependencies:
isarray: 2.0.5
......@@ -13843,6 +14852,8 @@ snapshots:
dependencies:
prelude-ls: 1.2.1
type-detect@4.1.0: {}
type-fest@0.20.2: {}
type-fest@0.21.3: {}
......@@ -14015,11 +15026,80 @@ snapshots:
vary@1.1.2: {}
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):
dependencies:
cac: 6.7.14
debug: 4.4.1
pathe: 1.1.2
picocolors: 1.1.1
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)
transitivePeerDependencies:
- '@types/node'
- less
- lightningcss
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
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):
dependencies:
esbuild: 0.21.5
postcss: 8.5.6
rollup: 4.57.1
optionalDependencies:
'@types/node': 24.3.0
fsevents: 2.3.3
less: 3.13.1
lightningcss: 1.30.1
sass: 1.91.0
stylus: 0.64.0
terser: 5.43.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):
dependencies:
'@vitest/expect': 1.6.1
'@vitest/runner': 1.6.1
'@vitest/snapshot': 1.6.1
'@vitest/spy': 1.6.1
'@vitest/utils': 1.6.1
acorn-walk: 8.3.4
chai: 4.5.0
debug: 4.4.1
execa: 8.0.1
local-pkg: 0.5.1
magic-string: 0.30.18
pathe: 1.1.2
picocolors: 1.1.1
std-env: 3.9.0
strip-literal: 2.1.1
tinybench: 2.9.0
tinypool: 0.8.4
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)
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)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 24.3.0
jsdom: 24.1.3
transitivePeerDependencies:
- less
- lightningcss
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
vm2@3.9.19:
dependencies:
acorn: 8.15.0
acorn-walk: 8.3.4
vue-component-type-helpers@2.2.12: {}
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)):
dependencies:
chalk: 4.1.2
......@@ -14057,7 +15137,7 @@ snapshots:
dependencies:
defaults: 1.0.4
weapp-tailwindcss@4.2.6(tailwindcss@3.4.17)(typescript@5.9.2):
weapp-tailwindcss@4.2.6(magicast@0.3.5)(tailwindcss@3.4.17)(typescript@5.9.2):
dependencies:
'@ast-core/escape': 1.0.1
'@babel/parser': 7.28.3
......@@ -14078,7 +15158,7 @@ snapshots:
lru-cache: 10.4.3
magic-string: 0.30.18
semver: 7.7.2
tailwindcss-patch: 7.1.4(tailwindcss@3.4.17)
tailwindcss-patch: 7.1.4(magicast@0.3.5)(tailwindcss@3.4.17)
vue: 3.5.20(typescript@5.9.2)
webpack-sources: 3.3.3
transitivePeerDependencies:
......@@ -14267,6 +15347,11 @@ snapshots:
dependencies:
isexe: 2.0.0
why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
stackback: 0.0.2
wildcard@2.0.1: {}
word-wrap@1.2.5: {}
......@@ -14289,6 +15374,12 @@ snapshots:
string-width: 5.1.2
strip-ansi: 7.1.0
wrap-ansi@9.0.2:
dependencies:
ansi-styles: 6.2.1
string-width: 7.2.0
strip-ansi: 7.1.0
wrappy@1.0.2: {}
ws@8.18.3: {}
......@@ -14332,6 +15423,8 @@ snapshots:
yocto-queue@0.1.0: {}
yocto-queue@1.2.2: {}
yup@1.7.0:
dependencies:
property-expr: 2.0.6
......
<claude-mem-context>
# Recent Activity
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
### Feb 3, 2026
| ID | Time | T | Title | Read |
|----|------|---|-------|------|
| #114 | 4:02 PM | 🔵 | FeedbackList page config has standard navigation bar settings | ~169 |
| #110 | " | 🔵 | Examined reference FeedbackList LESS styles showing simple scrolling without scroll-view | ~225 |
| #100 | 3:54 PM | 🔵 | Reference FeedbackList uses simple view without scroll-view component | ~204 |
</claude-mem-context>
\ No newline at end of file
<claude-mem-context>
# Recent Activity
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
### Feb 3, 2026
| ID | Time | T | Title | Read |
|----|------|---|-------|------|
| #101 | 3:55 PM | 🔵 | Found working scroll-view implementation in PointsList reference page | ~278 |
</claude-mem-context>
\ No newline at end of file
/**
* 工具函数测试示例
*/
import { describe, it, expect, vi } from 'vitest'
// 示例:日期格式化测试
describe('formatDate', () => {
it('should format date string correctly', () => {
// 假设 tools.js 中有 formatDate 函数
// const result = formatDate('2026-02-05')
// expect(result).toBe('2026年02月05日')
// 临时示例
const date = '2026-02-05'
expect(date).toBeTruthy()
})
it('should handle invalid date', () => {
const invalidDate = 'invalid-date'
expect(invalidDate).toBe('invalid-date')
})
})
// 示例:平台检测测试
describe('wxInfo', () => {
it('should detect platform correctly', () => {
// Mock Taro.getSystemInfoSync
const mockSystemInfo = {
model: 'iPhone',
system: 'iOS 14.0',
platform: 'ios',
}
expect(mockSystemInfo.platform).toBe('ios')
})
})
// 示例:文本溢出检测测试
describe('hasEllipsis', () => {
it('should detect text overflow', () => {
const text = 'This is a very long text that might overflow...'
const maxLength = 20
const hasOverflow = text.length > maxLength
expect(hasOverflow).toBe(true)
})
})
/**
* 组件测试示例
*/
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import PrimaryButton from '@/components/PrimaryButton.vue'
describe('PrimaryButton', () => {
it('should render button with text', () => {
const wrapper = mount(PrimaryButton, {
props: {
text: '点击按钮',
},
})
expect(wrapper.text()).toContain('点击按钮')
})
it('should emit click event when clicked', async () => {
const wrapper = mount(PrimaryButton, {
props: {
text: '点击',
},
})
await wrapper.trigger('click')
expect(wrapper.emitted('click')).toBeTruthy()
})
it('should be disabled when disabled prop is true', () => {
const wrapper = mount(PrimaryButton, {
props: {
text: '点击',
disabled: true,
},
})
const button = wrapper.find('button')
expect(button.attributes('disabled')).toBeDefined()
})
})
/**
* Vitest 测试环境设置
*/
import { vi } from 'vitest'
import { config } from '@vue/test-utils'
// 全局 Mock
config.global.mocks = {
$t: key => key, // i18n Mock
$router: {
push: vi.fn(),
replace: vi.fn(),
},
}
// Mock localStorage
const localStorageMock = {
getItem: vi.fn(),
setItem: vi.fn(),
removeItem: vi.fn(),
clear: vi.fn(),
}
global.localStorage = localStorageMock
// Mock Taro API
global.Taro = {
getStorage: vi.fn(),
setStorage: vi.fn(),
removeStorage: vi.fn(),
getStorageSync: vi.fn(() => ''),
setStorageSync: vi.fn(),
removeStorageSync: vi.fn(),
navigateTo: vi.fn(),
redirectTo: vi.fn(),
switchTab: vi.fn(),
navigateBack: vi.fn(),
showToast: vi.fn(),
showLoading: vi.fn(),
hideLoading: vi.fn(),
showModal: vi.fn(),
showActionSheet: vi.fn(),
createSelectorQuery: vi.fn(() => ({
select: vi.fn().mockReturnThis(),
exec: vi.fn(callback => callback([])),
})),
request: vi.fn(),
getLocation: vi.fn(),
chooseImage: vi.fn(),
previewImage: vi.fn(),
uploadFile: vi.fn(),
downloadFile: vi.fn(),
login: vi.fn(),
getUserInfo: vi.fn(),
openSetting: vi.fn(),
getSystemInfo: vi.fn(),
getSystemInfoSync: vi.fn(() => ({
model: 'iPhone',
system: 'iOS 14.0',
platform: 'ios',
})),
}
// Mock wx API
global.wx = {
getStorageSync: vi.fn(() => ''),
setStorageSync: vi.fn(),
removeStorageSync: vi.fn(),
request: vi.fn(),
login: vi.fn(),
getUserInfo: vi.fn(),
}
// Mock axios
vi.mock('axios-miniprogram', () => ({
default: {
create: vi.fn(() => ({
interceptors: {
request: { use: vi.fn() },
response: { use: vi.fn() },
},
get: vi.fn(),
post: vi.fn(),
})),
},
}))
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
export default defineConfig({
plugins: [vue()],
test: {
// 全局 API(describe, it, expect)
globals: true,
// 运行环境
environment: 'jsdom',
// 设置文件
setupFiles: ['./test/setup.js'],
// 覆盖率配置
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
// 排除文件
exclude: [
'node_modules/',
'test/',
'dist/',
'**/*.test.js',
'**/*.spec.js',
'**/*.config.js',
'src/app.js',
'src/app.config.js',
],
},
// 别名配置(与 Taro 配置保持一致)
alias: {
'@/utils': resolve(__dirname, 'src/utils'),
'@/components': resolve(__dirname, 'src/components'),
'@/images': resolve(__dirname, 'src/assets/images'),
'@/assets': resolve(__dirname, 'src/assets'),
'@/composables': resolve(__dirname, 'src/composables'),
'@/api': resolve(__dirname, 'src/api'),
'@/stores': resolve(__dirname, 'src/stores'),
'@/hooks': resolve(__dirname, 'src/hooks'),
},
},
resolve: {
alias: {
'@/utils': resolve(__dirname, 'src/utils'),
'@/components': resolve(__dirname, 'src/components'),
'@/images': resolve(__dirname, 'src/assets/images'),
'@/assets': resolve(__dirname, 'src/assets'),
'@/composables': resolve(__dirname, 'src/composables'),
'@/api': resolve(__dirname, 'src/api'),
'@/stores': resolve(__dirname, 'src/stores'),
'@/hooks': resolve(__dirname, 'src/hooks'),
},
},
})