commit 2774a539bf541d302d1a9a6371584f96327b2858
Author: WangMing <2747639460@qq.com>
Date: Tue Jan 27 18:06:04 2026 +0800
初始化参股
diff --git a/前端/App.uvue b/前端/App.uvue
new file mode 100644
index 0000000..f82a870
--- /dev/null
+++ b/前端/App.uvue
@@ -0,0 +1,48 @@
+
+
+
\ No newline at end of file
diff --git a/前端/README.md b/前端/README.md
new file mode 100644
index 0000000..29278ec
--- /dev/null
+++ b/前端/README.md
@@ -0,0 +1,142 @@
+# 优艺家沙发翻新小程序
+
+## 项目简介
+
+基于 uni-app x 开发的沙发翻新案例展示小程序,支持微信小程序、H5等多端运行。
+
+## 技术栈
+
+- **框架**:uni-app x (Vue 3 + UTS)
+- **样式**:SCSS
+- **状态管理**:组合式 API (Composition API)
+
+## 项目结构
+
+```
+├── api/ # API接口定义
+│ └── index.uts # 接口统一管理
+├── components/ # 公共组件
+│ ├── case-card/ # 案例卡片组件
+│ ├── before-after/ # 翻新前后对比组件
+│ ├── nav-bar/ # 自定义导航栏
+│ ├── section-header/ # 区块标题组件
+│ └── service-card/ # 服务卡片组件
+├── pages/ # 页面文件
+│ ├── index/ # 首页
+│ ├── cases/ # 案例模块
+│ │ ├── list.uvue # 案例列表
+│ │ └── detail.uvue # 案例详情
+│ ├── service/ # 服务介绍
+│ ├── about/ # 关于我们
+│ ├── booking/ # 预约咨询
+│ └── user/ # 用户中心
+├── static/ # 静态资源
+│ ├── icons/ # 图标文件
+│ ├── images/ # 图片资源
+│ └── mock/ # Mock图片
+├── utils/ # 工具函数
+│ ├── config.uts # 配置文件
+│ ├── request.uts # 网络请求封装
+│ └── mock.uts # Mock数据
+├── pages.json # 页面配置
+├── manifest.json # 应用配置
+└── uni.scss # 全局样式变量
+```
+
+## 功能模块
+
+### 1. 首页
+- 轮播图展示
+- 服务类型入口
+- 公司优势展示
+- 热门案例推荐
+- 预约入口
+
+### 2. 案例展示
+- 分类筛选(皮沙发/布艺沙发/功能沙发等)
+- 案例列表(瀑布流/列表展示)
+- 案例详情(翻新前后对比、详细信息)
+
+### 3. 服务介绍
+- 服务类型说明
+- 服务流程展示
+- 材质说明
+- 常见问题
+
+### 4. 预约咨询
+- 预约表单
+- 图片上传
+- 表单验证
+
+### 5. 用户中心
+- 用户登录
+- 我的预约
+- 我的收藏
+- 设置功能
+
+## 开发说明
+
+### 安装依赖
+
+```bash
+# 使用 HBuilderX 打开项目
+```
+
+### 运行项目
+
+1. 使用 HBuilderX 打开项目
+2. 点击运行 -> 运行到小程序模拟器 -> 微信开发者工具
+
+### Mock 数据
+
+项目默认使用 Mock 数据,修改 `utils/config.uts` 中的 `useMock` 变量:
+
+```typescript
+// 是否使用Mock数据
+export const useMock = true // 开发阶段
+export const useMock = false // 对接后端
+```
+
+### 后端接口
+
+项目已预留后端接口,接口定义在 `api/index.uts` 中:
+
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /banners | GET | 获取轮播图 |
+| /cases | GET | 获取案例列表 |
+| /cases/:id | GET | 获取案例详情 |
+| /cases/hot | GET | 获取热门案例 |
+| /service/process | GET | 获取服务流程 |
+| /company/info | GET | 获取公司信息 |
+| /booking | POST | 提交预约 |
+| /user/info | GET | 获取用户信息 |
+| /user/favorites | GET/POST | 收藏管理 |
+
+## 后续开发计划
+
+### 前端待完善
+- [ ] 添加 TabBar 图标
+- [ ] 添加案例图片资源
+- [ ] 完善图片预览功能
+- [ ] 添加下拉刷新
+- [ ] 完善分享功能
+- [ ] 添加骨架屏加载
+
+### 后端开发
+- [ ] 用户认证模块
+- [ ] 案例管理接口
+- [ ] 预约管理接口
+- [ ] 文件上传接口
+- [ ] 管理后台
+
+## 注意事项
+
+1. 运行前请确保已安装 HBuilderX
+2. 微信小程序需配置 appid
+3. 图片资源需自行准备
+4. 正式上线前关闭 Mock 数据
+
+## 联系方式
+
+如有问题,请联系开发团队。
diff --git a/前端/api/index.uts b/前端/api/index.uts
new file mode 100644
index 0000000..c20cbc6
--- /dev/null
+++ b/前端/api/index.uts
@@ -0,0 +1,126 @@
+/**
+ * API接口统一管理
+ */
+import { get, post } from '../utils/request.uts'
+
+/**
+ * 获取轮播图 (临时从配置获取,后续可从后端获取)
+ */
+export const getBanners = () => {
+ // 由于后端暂时没有轮播图API,先返回固定数据
+ return Promise.resolve({
+ code: 0,
+ message: 'success',
+ data: [
+ {
+ id: '1',
+ image: '/static/mock/banner1.svg',
+ title: '专业沙发翻新服务',
+ link: '/pages/service/index'
+ },
+ {
+ id: '2',
+ image: '/static/mock/banner2.svg',
+ title: '十年品质保证',
+ link: '/pages/about/index'
+ },
+ {
+ id: '3',
+ image: '/static/mock/banner3.svg',
+ title: '免费上门评估',
+ link: '/pages/booking/index'
+ }
+ ]
+ })
+}
+
+/**
+ * 获取案例列表
+ */
+export const getCaseList = (params ?: UTSJSONObject) => {
+ // 后端使用page和limit参数,需要转换
+ const queryParams = params ? {
+ page: params['page'] || 1,
+ limit: params['pageSize'] || params['limit'] || 10,
+ serviceType: params['category'], // 后端使用serviceType
+ status: 'published' // 只获取已发布的案例
+ } : {}
+ return get('/cases', queryParams as UTSJSONObject)
+}
+
+/**
+ * 获取案例详情
+ */
+export const getCaseDetail = (id : string) => {
+ return get(`/cases/${id}`)
+}
+
+/**
+ * 获取热门案例 (临时使用前4条案例)
+ */
+export const getHotCases = () => {
+ return get('/cases', { limit: 4, status: 'published' } as UTSJSONObject)
+}
+
+/**
+ * 获取服务流程 (使用服务列表替代)
+ */
+export const getServiceProcess = () => {
+ return get('/services')
+}
+
+/**
+ * 获取有效服务列表
+ */
+export const getActiveServices = () => {
+ return get('/services/active')
+}
+
+/**
+ * 获取公司信息
+ */
+export const getCompanyInfo = () => {
+ return get('/company/info')
+}
+
+/**
+ * 提交预约
+ */
+export const submitBooking = (data : UTSJSONObject) => {
+ return post('/booking', data)
+}
+
+/**
+ * 获取用户信息
+ */
+export const getUserInfo = () => {
+ return get('/user/info')
+}
+
+/**
+ * 获取用户收藏列表
+ */
+export const getFavorites = () => {
+ return get('/user/favorites')
+}
+
+/**
+ * 添加收藏
+ */
+export const addFavorite = (caseId : string) => {
+ return post('/user/favorites', { caseId: caseId } as UTSJSONObject)
+}
+
+/**
+ * 取消收藏
+ */
+export const removeFavorite = (caseId : string) => {
+ return post('/user/favorites/remove', { caseId: caseId } as UTSJSONObject)
+}
+
+/**
+ * 获取预约记录
+ */
+export const getBookingList = () => {
+ return get('/user/bookings')
+}
diff --git a/前端/components/before-after/before-after.uvue b/前端/components/before-after/before-after.uvue
new file mode 100644
index 0000000..a2b4af6
--- /dev/null
+++ b/前端/components/before-after/before-after.uvue
@@ -0,0 +1,125 @@
+
+
+
+ 翻新前后对比
+
+
+
+
+
+
+ 翻新前
+
+
+
+
+
+
+ →
+
+
+
+
+
+ 翻新后
+
+
+
+
+
+
+
+
+
+
diff --git a/前端/components/case-card/case-card.uvue b/前端/components/case-card/case-card.uvue
new file mode 100644
index 0000000..24ed5f1
--- /dev/null
+++ b/前端/components/case-card/case-card.uvue
@@ -0,0 +1,154 @@
+
+
+
+
+
+ {{ caseData.categoryName }}
+
+
+
+
+ {{ caseData.title }}
+
+
+ 材质:
+ {{ caseData.material }}
+
+
+ 工期:
+ {{ caseData.duration }}
+
+
+
+
+
+
+
+
+
+
diff --git a/前端/components/nav-bar/nav-bar.uvue b/前端/components/nav-bar/nav-bar.uvue
new file mode 100644
index 0000000..ed996bf
--- /dev/null
+++ b/前端/components/nav-bar/nav-bar.uvue
@@ -0,0 +1,105 @@
+
+
+
+
+
+ ←
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/前端/components/section-header/section-header.uvue b/前端/components/section-header/section-header.uvue
new file mode 100644
index 0000000..477fc84
--- /dev/null
+++ b/前端/components/section-header/section-header.uvue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
diff --git a/前端/components/service-card/service-card.uvue b/前端/components/service-card/service-card.uvue
new file mode 100644
index 0000000..2e16eb8
--- /dev/null
+++ b/前端/components/service-card/service-card.uvue
@@ -0,0 +1,56 @@
+
+
+
+
+
+ {{ name }}
+
+
+
+
+
+
diff --git a/前端/convert-icons.js b/前端/convert-icons.js
new file mode 100644
index 0000000..e8d897f
--- /dev/null
+++ b/前端/convert-icons.js
@@ -0,0 +1,58 @@
+/**
+ * 图标转换脚本
+ * 将 SVG 图标转换为 PNG 格式
+ *
+ * 使用方法:
+ * 1. npm install sharp
+ * 2. node convert-icons.js
+ */
+
+const sharp = require('sharp');
+const fs = require('fs');
+const path = require('path');
+
+const iconsDir = path.join(__dirname, 'static/icons');
+const outputSize = 81;
+
+const svgFiles = [
+ 'home.svg',
+ 'home-active.svg',
+ 'cases.svg',
+ 'cases-active.svg',
+ 'service.svg',
+ 'service-active.svg',
+ 'user.svg',
+ 'user-active.svg'
+];
+
+async function convertSvgToPng(svgFile) {
+ const inputPath = path.join(iconsDir, svgFile);
+ const outputPath = path.join(iconsDir, svgFile.replace('.svg', '.png'));
+
+ try {
+ await sharp(inputPath)
+ .resize(outputSize, outputSize)
+ .png()
+ .toFile(outputPath);
+ console.log(`✓ 转换成功: ${svgFile} -> ${svgFile.replace('.svg', '.png')}`);
+ } catch (error) {
+ console.error(`✗ 转换失败: ${svgFile}`, error.message);
+ }
+}
+
+async function main() {
+ console.log('开始转换图标...\n');
+
+ for (const file of svgFiles) {
+ const filePath = path.join(iconsDir, file);
+ if (fs.existsSync(filePath)) {
+ await convertSvgToPng(file);
+ } else {
+ console.log(`⚠ 文件不存在: ${file}`);
+ }
+ }
+
+ console.log('\n转换完成!');
+}
+
+main();
diff --git a/前端/docs/backend-plan.md b/前端/docs/backend-plan.md
new file mode 100644
index 0000000..0ab80cb
--- /dev/null
+++ b/前端/docs/backend-plan.md
@@ -0,0 +1,394 @@
+# 后端开发规划
+
+## 一、技术选型
+
+| 项目 | 技术方案 | 说明 |
+|------|----------|------|
+| 框架 | Node.js + Express / Koa | 或 Python FastAPI / Java Spring Boot |
+| 数据库 | MySQL / PostgreSQL | 关系型数据库存储业务数据 |
+| 缓存 | Redis | 缓存热点数据、会话管理 |
+| 文件存储 | 阿里云OSS / 腾讯云COS | 图片、文件存储 |
+| 认证 | JWT + 微信登录 | 用户身份认证 |
+
+## 二、数据库设计
+
+### 2.1 用户表 (users)
+
+```sql
+CREATE TABLE users (
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
+ open_id VARCHAR(64) UNIQUE NOT NULL COMMENT '微信openid',
+ union_id VARCHAR(64) COMMENT '微信unionid',
+ nick_name VARCHAR(64) COMMENT '昵称',
+ avatar VARCHAR(255) COMMENT '头像URL',
+ phone VARCHAR(20) COMMENT '手机号',
+ gender TINYINT DEFAULT 0 COMMENT '性别 0未知 1男 2女',
+ status TINYINT DEFAULT 1 COMMENT '状态 0禁用 1正常',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ INDEX idx_open_id (open_id),
+ INDEX idx_phone (phone)
+);
+```
+
+### 2.2 案例分类表 (categories)
+
+```sql
+CREATE TABLE categories (
+ id INT PRIMARY KEY AUTO_INCREMENT,
+ name VARCHAR(32) NOT NULL COMMENT '分类名称',
+ code VARCHAR(32) UNIQUE NOT NULL COMMENT '分类编码',
+ icon VARCHAR(255) COMMENT '图标URL',
+ sort_order INT DEFAULT 0 COMMENT '排序',
+ status TINYINT DEFAULT 1 COMMENT '状态 0禁用 1正常',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+);
+
+-- 初始数据
+INSERT INTO categories (name, code, sort_order) VALUES
+('皮沙发', 'leather', 1),
+('布艺沙发', 'fabric', 2),
+('功能沙发', 'functional', 3),
+('古典沙发', 'antique', 4),
+('办公沙发', 'office', 5);
+```
+
+### 2.3 案例表 (cases)
+
+```sql
+CREATE TABLE cases (
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
+ title VARCHAR(128) NOT NULL COMMENT '案例标题',
+ category_id INT NOT NULL COMMENT '分类ID',
+ cover_image VARCHAR(255) NOT NULL COMMENT '封面图',
+ before_images JSON COMMENT '翻新前图片JSON数组',
+ after_images JSON COMMENT '翻新后图片JSON数组',
+ description TEXT COMMENT '案例描述',
+ material VARCHAR(128) COMMENT '使用材质',
+ duration VARCHAR(32) COMMENT '工期',
+ price VARCHAR(32) COMMENT '参考价格',
+ views INT DEFAULT 0 COMMENT '浏览量',
+ likes INT DEFAULT 0 COMMENT '点赞数',
+ is_hot TINYINT DEFAULT 0 COMMENT '是否热门 0否 1是',
+ is_recommend TINYINT DEFAULT 0 COMMENT '是否推荐 0否 1是',
+ status TINYINT DEFAULT 1 COMMENT '状态 0下架 1上架',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ INDEX idx_category (category_id),
+ INDEX idx_status (status),
+ INDEX idx_hot (is_hot),
+ INDEX idx_created (created_at)
+);
+```
+
+### 2.4 预约表 (bookings)
+
+```sql
+CREATE TABLE bookings (
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
+ booking_no VARCHAR(32) UNIQUE NOT NULL COMMENT '预约编号',
+ user_id BIGINT COMMENT '用户ID',
+ user_name VARCHAR(32) NOT NULL COMMENT '客户姓名',
+ phone VARCHAR(20) NOT NULL COMMENT '联系电话',
+ address VARCHAR(255) NOT NULL COMMENT '地址',
+ sofa_type VARCHAR(32) COMMENT '沙发类型',
+ problem TEXT COMMENT '问题描述',
+ images JSON COMMENT '上传图片JSON数组',
+ status TINYINT DEFAULT 0 COMMENT '状态 0待确认 1已确认 2已上门 3已完成 4已取消',
+ remark TEXT COMMENT '备注',
+ assigned_to BIGINT COMMENT '指派给(员工ID)',
+ visited_at DATETIME COMMENT '上门时间',
+ completed_at DATETIME COMMENT '完成时间',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ INDEX idx_user (user_id),
+ INDEX idx_phone (phone),
+ INDEX idx_status (status),
+ INDEX idx_created (created_at)
+);
+```
+
+### 2.5 收藏表 (favorites)
+
+```sql
+CREATE TABLE favorites (
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
+ user_id BIGINT NOT NULL COMMENT '用户ID',
+ case_id BIGINT NOT NULL COMMENT '案例ID',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE KEY uk_user_case (user_id, case_id),
+ INDEX idx_user (user_id)
+);
+```
+
+### 2.6 轮播图表 (banners)
+
+```sql
+CREATE TABLE banners (
+ id INT PRIMARY KEY AUTO_INCREMENT,
+ title VARCHAR(64) COMMENT '标题',
+ image VARCHAR(255) NOT NULL COMMENT '图片URL',
+ link VARCHAR(255) COMMENT '跳转链接',
+ sort_order INT DEFAULT 0 COMMENT '排序',
+ status TINYINT DEFAULT 1 COMMENT '状态 0禁用 1正常',
+ start_time DATETIME COMMENT '开始时间',
+ end_time DATETIME COMMENT '结束时间',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+);
+```
+
+### 2.7 系统配置表 (settings)
+
+```sql
+CREATE TABLE settings (
+ id INT PRIMARY KEY AUTO_INCREMENT,
+ setting_key VARCHAR(64) UNIQUE NOT NULL COMMENT '配置键',
+ setting_value TEXT COMMENT '配置值',
+ description VARCHAR(255) COMMENT '说明',
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+);
+
+-- 初始配置
+INSERT INTO settings (setting_key, setting_value, description) VALUES
+('company_name', '优艺家沙发翻新', '公司名称'),
+('company_slogan', '让旧沙发焕发新生', '公司标语'),
+('company_description', '优艺家是一家专业从事沙发翻新、维修、改色的服务公司...', '公司介绍'),
+('contact_phone', '400-888-8888', '客服电话'),
+('contact_wechat', 'youyijia2026', '微信号'),
+('company_address', '上海市浦东新区张江高科技园区', '公司地址'),
+('work_time', '周一至周日 9:00-18:00', '营业时间');
+```
+
+## 三、API接口设计
+
+### 3.1 公共接口
+
+| 接口 | 方法 | 说明 | 认证 |
+|------|------|------|------|
+| POST /api/auth/wxlogin | POST | 微信登录 | 否 |
+| GET /api/banners | GET | 获取轮播图 | 否 |
+| GET /api/categories | GET | 获取分类列表 | 否 |
+| GET /api/company/info | GET | 获取公司信息 | 否 |
+| GET /api/service/process | GET | 获取服务流程 | 否 |
+
+### 3.2 案例接口
+
+| 接口 | 方法 | 说明 | 认证 |
+|------|------|------|------|
+| GET /api/cases | GET | 获取案例列表 | 否 |
+| GET /api/cases/hot | GET | 获取热门案例 | 否 |
+| GET /api/cases/:id | GET | 获取案例详情 | 否 |
+| POST /api/cases/:id/view | POST | 增加浏览量 | 否 |
+| POST /api/cases/:id/like | POST | 点赞 | 是 |
+
+### 3.3 用户接口
+
+| 接口 | 方法 | 说明 | 认证 |
+|------|------|------|------|
+| GET /api/user/info | GET | 获取用户信息 | 是 |
+| PUT /api/user/info | PUT | 更新用户信息 | 是 |
+| GET /api/user/favorites | GET | 获取收藏列表 | 是 |
+| POST /api/user/favorites | POST | 添加收藏 | 是 |
+| DELETE /api/user/favorites/:caseId | DELETE | 取消收藏 | 是 |
+
+### 3.4 预约接口
+
+| 接口 | 方法 | 说明 | 认证 |
+|------|------|------|------|
+| POST /api/booking | POST | 提交预约 | 否 |
+| GET /api/user/bookings | GET | 获取我的预约 | 是 |
+| GET /api/user/bookings/:id | GET | 获取预约详情 | 是 |
+| PUT /api/user/bookings/:id/cancel | PUT | 取消预约 | 是 |
+
+### 3.5 文件接口
+
+| 接口 | 方法 | 说明 | 认证 |
+|------|------|------|------|
+| POST /api/upload/image | POST | 上传图片 | 是 |
+
+## 四、接口详细定义
+
+### 4.1 微信登录
+
+```
+POST /api/auth/wxlogin
+
+Request:
+{
+ "code": "微信登录code",
+ "userInfo": {
+ "nickName": "昵称",
+ "avatarUrl": "头像"
+ }
+}
+
+Response:
+{
+ "code": 0,
+ "message": "success",
+ "data": {
+ "token": "jwt_token_xxx",
+ "userInfo": {
+ "id": "1",
+ "nickName": "昵称",
+ "avatar": "头像URL",
+ "phone": ""
+ }
+ }
+}
+```
+
+### 4.2 获取案例列表
+
+```
+GET /api/cases?category=leather&page=1&pageSize=10&keyword=
+
+Request Params:
+- category: 分类code,可选
+- page: 页码,默认1
+- pageSize: 每页数量,默认10
+- keyword: 搜索关键词,可选
+
+Response:
+{
+ "code": 0,
+ "message": "success",
+ "data": {
+ "list": [
+ {
+ "id": "1",
+ "title": "欧式真皮沙发翻新",
+ "category": "leather",
+ "categoryName": "皮沙发",
+ "coverImage": "https://xxx/cover.jpg",
+ "material": "进口头层牛皮",
+ "duration": "7天",
+ "price": "¥3800",
+ "views": 1256,
+ "likes": 89,
+ "createTime": "2026-01-15"
+ }
+ ],
+ "total": 100,
+ "page": 1,
+ "pageSize": 10
+ }
+}
+```
+
+### 4.3 获取案例详情
+
+```
+GET /api/cases/:id
+
+Response:
+{
+ "code": 0,
+ "message": "success",
+ "data": {
+ "id": "1",
+ "title": "欧式真皮沙发翻新",
+ "category": "leather",
+ "categoryName": "皮沙发",
+ "beforeImages": ["https://xxx/before1.jpg"],
+ "afterImages": ["https://xxx/after1.jpg"],
+ "description": "案例描述...",
+ "material": "进口头层牛皮",
+ "duration": "7天",
+ "price": "¥3800",
+ "views": 1256,
+ "likes": 89,
+ "createTime": "2026-01-15",
+ "isFavorite": false
+ }
+}
+```
+
+### 4.4 提交预约
+
+```
+POST /api/booking
+
+Request:
+{
+ "userName": "张三",
+ "phone": "13800138000",
+ "address": "上海市浦东新区xxx",
+ "sofaType": "leather",
+ "problem": "皮面开裂、褪色",
+ "images": ["https://xxx/1.jpg", "https://xxx/2.jpg"]
+}
+
+Response:
+{
+ "code": 0,
+ "message": "success",
+ "data": {
+ "bookingId": "BK20260126001",
+ "status": "pending",
+ "message": "预约成功,我们会尽快与您联系"
+ }
+}
+```
+
+## 五、管理后台功能
+
+### 5.1 功能模块
+
+| 模块 | 功能 |
+|------|------|
+| 仪表盘 | 数据概览、预约统计、案例统计 |
+| 案例管理 | 案例列表、新增/编辑/删除、上下架 |
+| 分类管理 | 分类列表、新增/编辑/删除 |
+| 预约管理 | 预约列表、状态更新、指派处理 |
+| 用户管理 | 用户列表、状态管理 |
+| 轮播图管理 | 轮播图列表、新增/编辑/删除 |
+| 系统设置 | 公司信息、联系方式、服务流程 |
+
+### 5.2 角色权限
+
+| 角色 | 权限 |
+|------|------|
+| 超级管理员 | 所有权限 |
+| 运营人员 | 案例管理、轮播图、系统设置 |
+| 客服人员 | 预约管理、用户管理 |
+
+## 六、部署架构
+
+```
+ ┌─────────────┐
+ │ Nginx │
+ │ (反向代理) │
+ └──────┬──────┘
+ │
+ ┌───────────────┼───────────────┐
+ │ │ │
+ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
+ │ 小程序API │ │ 管理后台 │ │ 静态资源 │
+ │ Server │ │ Server │ │ CDN │
+ └──────┬──────┘ └──────┬──────┘ └─────────────┘
+ │ │
+ └───────┬───────┘
+ │
+ ┌───────▼───────┐
+ │ MySQL │
+ │ Redis │
+ └───────────────┘
+```
+
+## 七、开发计划
+
+| 阶段 | 时间 | 任务 |
+|------|------|------|
+| 第一阶段 | 3天 | 数据库设计、项目搭建、基础接口 |
+| 第二阶段 | 3天 | 案例模块、分类模块、轮播图 |
+| 第三阶段 | 2天 | 用户模块、微信登录、收藏功能 |
+| 第四阶段 | 2天 | 预约模块、文件上传 |
+| 第五阶段 | 3天 | 管理后台开发 |
+| 第六阶段 | 2天 | 联调测试、部署上线 |
+
+**总计:约15个工作日**
+
+---
+
+准备好开始后端开发时,告诉我你选择的技术栈(Node.js/Python/Java),我将为你生成完整的后端代码。
diff --git a/前端/docs/后端对接报告.md b/前端/docs/后端对接报告.md
new file mode 100644
index 0000000..f93cfe3
--- /dev/null
+++ b/前端/docs/后端对接报告.md
@@ -0,0 +1,82 @@
+# 后端API对接完成报告
+
+## 🎯 对接状态
+✅ **已成功对接后端API服务器**
+- 后端运行在:http://localhost:3000
+- API文档地址:http://localhost:3000/docs
+- API基础路径:http://localhost:3000/api
+
+## 🔧 已完成的配置修改
+
+### 1. 关闭Mock数据模式
+- 文件:`utils/config.uts`
+- 修改:`useMock = false`
+- 说明:已切换到真实后端API
+
+### 2. 更新API接口调用
+- 文件:`api/index.uts`
+- 修改内容:
+ - ✅ `getCaseList()` - 适配后端分页参数(page/limit)
+ - ✅ `getHotCases()` - 使用案例列表API获取前4条数据
+ - ✅ `getBanners()` - 临时使用固定数据(后端暂无此API)
+ - ✅ `getServiceProcess()` - 改用服务列表API
+
+### 3. 适配数据格式
+- 文件:`pages/cases/list.uvue`, `pages/index/index.uvue`
+- 修改:适应后端返回的数据结构
+ - 后端格式:`{ items: [], total: 0, page: 1, limit: 10 }`
+ - 前端适配:正确解析 `items` 字段
+
+## 📊 API端点映射
+
+| 功能 | 前端调用 | 后端端点 | 状态 |
+|------|----------|----------|------|
+| 案例列表 | `getCaseList()` | `GET /api/cases` | ✅ 已对接 |
+| 案例详情 | `getCaseDetail(id)` | `GET /api/cases/:id` | ✅ 已对接 |
+| 服务列表 | `getActiveServices()` | `GET /api/services/active` | ✅ 已对接 |
+| 轮播图 | `getBanners()` | - | ⚠️ 临时使用固定数据 |
+| 用户相关 | - | `GET /api/users/*` | ✅ 后端已准备 |
+| 预约管理 | `submitBooking()` | `POST /api/booking` | 🔄 需要确认端点 |
+
+## 🧪 测试验证
+
+### 已验证的API
+- ✅ `GET /api/cases` - 返回空列表(正常,暂无数据)
+- ✅ `GET /api/services` - 返回空列表(正常,暂无数据)
+- ✅ API文档页面 - 可正常访问
+
+### 临时解决方案
+1. **轮播图**:使用硬编码数据,后续可添加后端API
+2. **空数据处理**:前端已正确处理空列表情况
+
+## 📝 下一步工作
+
+### 推荐优先级
+1. **高优先级**
+ - 为后端添加示例数据(案例、服务)
+ - 验证预约提交API端点
+ - 添加轮播图管理API
+
+2. **中优先级**
+ - 添加用户认证功能测试
+ - 完善错误处理机制
+ - 添加图片上传功能
+
+3. **低优先级**
+ - API响应缓存机制
+ - 离线数据支持
+
+## 🚀 启动应用测试
+
+现在您可以:
+1. 确保后端服务运行在 `http://localhost:3000`
+2. 启动前端应用(uni-app)
+3. 查看控制台API调用日志
+4. 验证数据正确显示(目前为空列表)
+
+## 📞 技术支持
+
+如遇到问题,请检查:
+- 后端服务是否正常运行
+- 网络连接是否正常
+- 控制台是否有错误信息
\ No newline at end of file
diff --git a/前端/index.html b/前端/index.html
new file mode 100644
index 0000000..8793fef
--- /dev/null
+++ b/前端/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/前端/main.uts b/前端/main.uts
new file mode 100644
index 0000000..8bdcc86
--- /dev/null
+++ b/前端/main.uts
@@ -0,0 +1,9 @@
+import App from './App.uvue'
+
+import { createSSRApp } from 'vue'
+export function createApp() {
+ const app = createSSRApp(App)
+ return {
+ app
+ }
+}
\ No newline at end of file
diff --git a/前端/manifest.json b/前端/manifest.json
new file mode 100644
index 0000000..439337e
--- /dev/null
+++ b/前端/manifest.json
@@ -0,0 +1,64 @@
+{
+ "name": "优艺家沙发翻新",
+ "appid": "",
+ "description": "",
+ "versionName": "1.0.0",
+ "versionCode": "100",
+ "uni-app-x": {},
+ /* 快应用特有相关 */
+ "quickapp": {},
+ /* 小程序特有相关 */
+ "mp-weixin": {
+ "appid": "wx89f1cd89fbc55f54",
+ "setting": {
+ "urlCheck": false
+ },
+ "usingComponents": true
+ },
+ "mp-alipay": {
+ "usingComponents": true
+ },
+ "mp-baidu": {
+ "usingComponents": true
+ },
+ "mp-toutiao": {
+ "usingComponents": true
+ },
+ "uniStatistics": {
+ "enable": false
+ },
+ "vueVersion": "3",
+ "app": {
+ "distribute": {
+ "icons": {
+ "android": {
+ "hdpi": "",
+ "xhdpi": "",
+ "xxhdpi": "",
+ "xxxhdpi": ""
+ }
+ }
+ }
+ },
+ "app-android": {
+ "distribute": {
+ "modules": {},
+ "icons": {
+ "hdpi": "",
+ "xhdpi": "",
+ "xxhdpi": "",
+ "xxxhdpi": ""
+ },
+ "splashScreens": {
+ "default": {}
+ }
+ }
+ },
+ "app-ios": {
+ "distribute": {
+ "modules": {},
+ "icons": {},
+ "splashScreens": {}
+ }
+ }
+}
\ No newline at end of file
diff --git a/前端/pages.json b/前端/pages.json
new file mode 100644
index 0000000..3616eda
--- /dev/null
+++ b/前端/pages.json
@@ -0,0 +1,87 @@
+{
+ "pages": [
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "优艺家沙发翻新",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/cases/list",
+ "style": {
+ "navigationBarTitleText": "案例展示"
+ }
+ },
+ {
+ "path": "pages/cases/detail",
+ "style": {
+ "navigationBarTitleText": "案例详情",
+ "navigationBarBackgroundColor": "#ffffff"
+ }
+ },
+ {
+ "path": "pages/service/index",
+ "style": {
+ "navigationBarTitleText": "服务介绍"
+ }
+ },
+ {
+ "path": "pages/about/index",
+ "style": {
+ "navigationBarTitleText": "关于我们"
+ }
+ },
+ {
+ "path": "pages/booking/index",
+ "style": {
+ "navigationBarTitleText": "预约咨询"
+ }
+ },
+ {
+ "path": "pages/user/index",
+ "style": {
+ "navigationBarTitleText": "我的"
+ }
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "优艺家沙发翻新",
+ "navigationBarBackgroundColor": "#ffffff",
+ "backgroundColor": "#f5f5f5"
+ },
+ "tabBar": {
+ "color": "#999999",
+ "selectedColor": "#D4A574",
+ "borderStyle": "black",
+ "backgroundColor": "#ffffff",
+ "list": [
+ {
+ "pagePath": "pages/index/index",
+ "iconPath": "static/icons/home.png",
+ "selectedIconPath": "static/icons/home-active.png",
+ "text": "首页"
+ },
+ {
+ "pagePath": "pages/cases/list",
+ "iconPath": "static/icons/cases.png",
+ "selectedIconPath": "static/icons/cases-active.png",
+ "text": "案例"
+ },
+ {
+ "pagePath": "pages/service/index",
+ "iconPath": "static/icons/service.png",
+ "selectedIconPath": "static/icons/service-active.png",
+ "text": "服务"
+ },
+ {
+ "pagePath": "pages/user/index",
+ "iconPath": "static/icons/user.png",
+ "selectedIconPath": "static/icons/user-active.png",
+ "text": "我的"
+ }
+ ]
+ },
+ "uniIdRouter": {}
+}
diff --git a/前端/pages/about/index.uvue b/前端/pages/about/index.uvue
new file mode 100644
index 0000000..288c46f
--- /dev/null
+++ b/前端/pages/about/index.uvue
@@ -0,0 +1,362 @@
+
+
+
+
+
+
+
+
+
+
+ {{ companyInfo.description }}
+
+
+
+
+
+
+
+
+
+ ✓
+
+ {{ item.title }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+ 📞
+
+
+ 客服电话
+ {{ companyInfo.phone }}
+
+ ›
+
+
+
+
+ 💬
+
+
+ 微信号
+ {{ companyInfo.wechat }}
+
+ ›
+
+
+
+
+ 📍
+
+
+ 公司地址
+ {{ companyInfo.address }}
+
+ ›
+
+
+
+
+ 🕐
+
+
+ 营业时间
+ {{ companyInfo.workTime }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/前端/pages/booking/index.uvue b/前端/pages/booking/index.uvue
new file mode 100644
index 0000000..ae53833
--- /dev/null
+++ b/前端/pages/booking/index.uvue
@@ -0,0 +1,489 @@
+
+
+
+
+
+
+
+
+
+
+
+ *
+ 您的姓名
+
+
+
+
+
+
+
+ *
+ 联系电话
+
+
+
+
+
+
+
+ *
+ 您的地址
+
+
+
+
+
+
+ 沙发类型
+
+
+ {{ item.name }}
+
+
+
+
+
+
+ 问题描述
+
+ {{ formData.problem.length }}/500
+
+
+
+
+ 上传图片(可选)
+
+
+
+
+ ×
+
+
+
+ +
+ 添加图片
+
+
+ 最多可上传9张图片
+
+
+
+
+
+
+
+
+
+
+ 提交预约
+
+
+
+
+
+
+
+
diff --git a/前端/pages/cases/detail.uvue b/前端/pages/cases/detail.uvue
new file mode 100644
index 0000000..ee26acf
--- /dev/null
+++ b/前端/pages/cases/detail.uvue
@@ -0,0 +1,438 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ caseDetail.categoryName }}
+
+
+
+
+
+ {{ caseDetail.title }}
+
+ {{ caseDetail.price }}
+
+ 👁 {{ caseDetail.views }}
+ ❤ {{ caseDetail.likes }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用材质
+ {{ caseDetail.material }}
+
+
+ 翻新工期
+ {{ caseDetail.duration }}
+
+
+ 完成日期
+ {{ caseDetail.createTime }}
+
+
+
+
+ 案例描述
+ {{ caseDetail.description }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ isFavorite ? '❤️' : '🤍' }}
+ 收藏
+
+
+ 📤
+ 分享
+
+
+
+
+ 在线咨询
+
+
+ 立即预约
+
+
+
+
+
+
+
+
+
diff --git a/前端/pages/cases/list.uvue b/前端/pages/cases/list.uvue
new file mode 100644
index 0000000..b9d8be8
--- /dev/null
+++ b/前端/pages/cases/list.uvue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 加载中...
+ 没有更多了
+
+
+
+
+ 📭
+ 暂无相关案例
+
+
+
+
+
+
+
+
+
+
+
diff --git a/前端/pages/index/index.uvue b/前端/pages/index/index.uvue
new file mode 100644
index 0000000..6cce32d
--- /dev/null
+++ b/前端/pages/index/index.uvue
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.icon }}
+
+ {{ item.title }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 免费上门评估
+ 专业师傅免费上门,为您的沙发量身定制翻新方案
+
+
+ 立即预约
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/前端/pages/service/index.uvue b/前端/pages/service/index.uvue
new file mode 100644
index 0000000..48b8dc2
--- /dev/null
+++ b/前端/pages/service/index.uvue
@@ -0,0 +1,537 @@
+
+
+
+
+
+
+ 专业沙发翻新服务
+ 让旧沙发焕发新生
+
+
+
+
+
+
+
+
+
+ {{ item.emoji }}
+
+ {{ item.name }}
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.step }}
+
+
+ {{ item.title }}
+ {{ item.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.desc }}
+
+ {{ tag }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.answer }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 免费上门评估
+ 专业师傅为您量身定制方案
+
+
+ 立即预约
+
+
+
+
+
+
+
+
diff --git a/前端/pages/user/index.uvue b/前端/pages/user/index.uvue
new file mode 100644
index 0000000..057135b
--- /dev/null
+++ b/前端/pages/user/index.uvue
@@ -0,0 +1,488 @@
+
+
+
+
+
+
+
+
+
+
+ {{ userInfo.nickName || '点击登录' }}
+ {{ userInfo.phone }}
+
+
+ 登录
+
+
+
+
+
+
+
+
+
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/前端/static/README.md b/前端/static/README.md
new file mode 100644
index 0000000..365682d
--- /dev/null
+++ b/前端/static/README.md
@@ -0,0 +1,48 @@
+# 静态资源说明
+
+## 目录结构
+
+```
+static/
+├── icons/ # 图标文件
+│ ├── home.svg # 首页图标(未选中)
+│ ├── home-active.svg # 首页图标(选中)
+│ ├── cases.svg # 案例图标(未选中)
+│ ├── cases-active.svg # 案例图标(选中)
+│ ├── service.svg # 服务图标(未选中)
+│ ├── service-active.svg # 服务图标(选中)
+│ ├── user.svg # 我的图标(未选中)
+│ ├── user-active.svg # 我的图标(选中)
+│ └── README.md # 图标转换说明
+├── images/ # 图片资源
+│ ├── default-avatar.svg # 默认头像
+│ └── logo.svg # 公司Logo
+└── mock/ # Mock数据图片
+ ├── banner1.svg # 轮播图1
+ ├── banner2.svg # 轮播图2
+ ├── banner3.svg # 轮播图3
+ ├── case1-before.svg # 案例1翻新前
+ ├── case1-after.svg # 案例1翻新后
+ └── ... # 更多案例图片
+```
+
+## 重要说明
+
+### TabBar 图标
+微信小程序 TabBar **只支持 PNG 格式**,请参考 `icons/README.md` 将 SVG 转换为 PNG。
+
+### 图片尺寸规范
+
+1. **轮播图**:建议尺寸 750x320 像素
+2. **案例图片**:建议尺寸 750x500 像素
+3. **图标**:建议使用 PNG 格式,支持透明背景
+4. **颜色规范**:
+ - 主色:#D4A574
+ - 选中色:#D4A574
+ - 未选中色:#999999
+
+## 注意事项
+
+- 图片需要进行压缩优化,减小文件体积
+- 图标建议使用纯色,便于主题切换
+- 正式上线前需替换 Mock 图片为真实图片
diff --git a/前端/static/icons/README.md b/前端/static/icons/README.md
new file mode 100644
index 0000000..a691990
--- /dev/null
+++ b/前端/static/icons/README.md
@@ -0,0 +1,54 @@
+# 图标转换说明
+
+## 问题
+微信小程序 TabBar 图标只支持 PNG 格式,不支持 SVG。
+
+## 解决方案
+
+### 方法一:在线转换(推荐)
+1. 访问 https://svgtopng.com/ 或 https://cloudconvert.com/svg-to-png
+2. 上传 SVG 文件
+3. 设置输出尺寸为 81x81 像素
+4. 下载 PNG 文件并替换到 static/icons/ 目录
+
+### 方法二:使用设计工具
+1. 使用 Figma / Sketch / PS 打开 SVG
+2. 导出为 81x81 像素的 PNG
+3. 保存到 static/icons/ 目录
+
+### 方法三:使用命令行工具
+安装 sharp 或 imagemagick:
+
+```bash
+# 使用 Node.js sharp
+npm install sharp
+node convert-icons.js
+
+# 或使用 ImageMagick
+convert home.svg -resize 81x81 home.png
+```
+
+## 需要转换的文件
+
+| SVG 文件 | 输出 PNG | 尺寸 |
+|----------|----------|------|
+| home.svg | home.png | 81x81 |
+| home-active.svg | home-active.png | 81x81 |
+| cases.svg | cases.png | 81x81 |
+| cases-active.svg | cases-active.png | 81x81 |
+| service.svg | service.png | 81x81 |
+| service-active.svg | service-active.png | 81x81 |
+| user.svg | user.png | 81x81 |
+| user-active.svg | user-active.png | 81x81 |
+
+## 配色参考
+
+- 未选中颜色:#999999
+- 选中颜色:#D4A574(主题色)
+
+## 图标设计规范
+
+1. 图标尺寸:81x81 像素
+2. 安全区域:边距 10 像素
+3. 图标风格:线性或填充图标
+4. 背景:透明
diff --git a/前端/static/icons/cases-active.png b/前端/static/icons/cases-active.png
new file mode 100644
index 0000000..5c71117
Binary files /dev/null and b/前端/static/icons/cases-active.png differ
diff --git a/前端/static/icons/cases.png b/前端/static/icons/cases.png
new file mode 100644
index 0000000..76aec1a
Binary files /dev/null and b/前端/static/icons/cases.png differ
diff --git a/前端/static/icons/home-active.png b/前端/static/icons/home-active.png
new file mode 100644
index 0000000..f8893ee
Binary files /dev/null and b/前端/static/icons/home-active.png differ
diff --git a/前端/static/icons/home.png b/前端/static/icons/home.png
new file mode 100644
index 0000000..af7546e
Binary files /dev/null and b/前端/static/icons/home.png differ
diff --git a/前端/static/icons/service-active.png b/前端/static/icons/service-active.png
new file mode 100644
index 0000000..1c0ae8f
Binary files /dev/null and b/前端/static/icons/service-active.png differ
diff --git a/前端/static/icons/service.png b/前端/static/icons/service.png
new file mode 100644
index 0000000..02e1e45
Binary files /dev/null and b/前端/static/icons/service.png differ
diff --git a/前端/static/icons/user-active.png b/前端/static/icons/user-active.png
new file mode 100644
index 0000000..1263fa1
Binary files /dev/null and b/前端/static/icons/user-active.png differ
diff --git a/前端/static/icons/user.png b/前端/static/icons/user.png
new file mode 100644
index 0000000..d3b5269
Binary files /dev/null and b/前端/static/icons/user.png differ
diff --git a/前端/static/images/default-avatar.svg b/前端/static/images/default-avatar.svg
new file mode 100644
index 0000000..21b1ca5
--- /dev/null
+++ b/前端/static/images/default-avatar.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/images/logo.svg b/前端/static/images/logo.svg
new file mode 100644
index 0000000..4e7aee9
--- /dev/null
+++ b/前端/static/images/logo.svg
@@ -0,0 +1,10 @@
+
diff --git a/前端/static/logo.png b/前端/static/logo.png
new file mode 100644
index 0000000..b5771e2
Binary files /dev/null and b/前端/static/logo.png differ
diff --git a/前端/static/mock/banner1.svg b/前端/static/mock/banner1.svg
new file mode 100644
index 0000000..717c063
--- /dev/null
+++ b/前端/static/mock/banner1.svg
@@ -0,0 +1,11 @@
+
diff --git a/前端/static/mock/banner2.svg b/前端/static/mock/banner2.svg
new file mode 100644
index 0000000..3126977
--- /dev/null
+++ b/前端/static/mock/banner2.svg
@@ -0,0 +1,11 @@
+
diff --git a/前端/static/mock/banner3.svg b/前端/static/mock/banner3.svg
new file mode 100644
index 0000000..d600aab
--- /dev/null
+++ b/前端/static/mock/banner3.svg
@@ -0,0 +1,11 @@
+
diff --git a/前端/static/mock/case1-after.svg b/前端/static/mock/case1-after.svg
new file mode 100644
index 0000000..5c1f2eb
--- /dev/null
+++ b/前端/static/mock/case1-after.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case1-before.svg b/前端/static/mock/case1-before.svg
new file mode 100644
index 0000000..7c7a8f7
--- /dev/null
+++ b/前端/static/mock/case1-before.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case2-after.svg b/前端/static/mock/case2-after.svg
new file mode 100644
index 0000000..ed6d2ad
--- /dev/null
+++ b/前端/static/mock/case2-after.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case2-before.svg b/前端/static/mock/case2-before.svg
new file mode 100644
index 0000000..af4ab8a
--- /dev/null
+++ b/前端/static/mock/case2-before.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case3-after.svg b/前端/static/mock/case3-after.svg
new file mode 100644
index 0000000..c55c817
--- /dev/null
+++ b/前端/static/mock/case3-after.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case3-before.svg b/前端/static/mock/case3-before.svg
new file mode 100644
index 0000000..b96e6f4
--- /dev/null
+++ b/前端/static/mock/case3-before.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case4-after.svg b/前端/static/mock/case4-after.svg
new file mode 100644
index 0000000..a46e0f8
--- /dev/null
+++ b/前端/static/mock/case4-after.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case4-before.svg b/前端/static/mock/case4-before.svg
new file mode 100644
index 0000000..4cc3230
--- /dev/null
+++ b/前端/static/mock/case4-before.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case5-after.svg b/前端/static/mock/case5-after.svg
new file mode 100644
index 0000000..6eb24da
--- /dev/null
+++ b/前端/static/mock/case5-after.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case5-before.svg b/前端/static/mock/case5-before.svg
new file mode 100644
index 0000000..49d8f3c
--- /dev/null
+++ b/前端/static/mock/case5-before.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case6-after.svg b/前端/static/mock/case6-after.svg
new file mode 100644
index 0000000..2d4c90a
--- /dev/null
+++ b/前端/static/mock/case6-after.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/static/mock/case6-before.svg b/前端/static/mock/case6-before.svg
new file mode 100644
index 0000000..400680e
--- /dev/null
+++ b/前端/static/mock/case6-before.svg
@@ -0,0 +1,5 @@
+
diff --git a/前端/uni.scss b/前端/uni.scss
new file mode 100644
index 0000000..fa2eae3
--- /dev/null
+++ b/前端/uni.scss
@@ -0,0 +1,110 @@
+/**
+ * 优艺家沙发翻新 - 全局样式变量
+ */
+
+/* ========== 项目主题色 ========== */
+$primary-color: #D4A574;
+$primary-light: #E8C9A8;
+$primary-dark: #B8895A;
+
+/* 辅助色 */
+$success-color: #67C23A;
+$warning-color: #E6A23C;
+$danger-color: #F56C6C;
+$info-color: #909399;
+
+/* 文字颜色 */
+$text-primary: #333333;
+$text-regular: #606266;
+$text-secondary: #909399;
+$text-placeholder: #C0C4CC;
+
+/* 背景色 */
+$bg-color: #f5f5f5;
+$bg-white: #ffffff;
+$bg-gray: #fafafa;
+
+/* 边框颜色 */
+$border-color: #EBEEF5;
+$border-light: #F2F6FC;
+
+/* 间距 */
+$spacing-xs: 8rpx;
+$spacing-sm: 16rpx;
+$spacing-md: 24rpx;
+$spacing-lg: 32rpx;
+$spacing-xl: 48rpx;
+
+/* 圆角 */
+$radius-sm: 8rpx;
+$radius-md: 16rpx;
+$radius-lg: 24rpx;
+$radius-round: 999rpx;
+
+/* 阴影 */
+$shadow-sm: 0 2rpx 8rpx rgba(0, 0, 0, 0.08);
+$shadow-md: 0 4rpx 16rpx rgba(0, 0, 0, 0.1);
+$shadow-lg: 0 8rpx 32rpx rgba(0, 0, 0, 0.12);
+
+/* ========== uni-app 内置变量 ========== */
+
+/* 行为相关颜色 */
+$uni-color-primary: #D4A574;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/152451553bd13cc2aa75a3754b4096295a65a123 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/152451553bd13cc2aa75a3754b4096295a65a123
new file mode 100644
index 0000000..e44c34c
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/152451553bd13cc2aa75a3754b4096295a65a123
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { o as _o, gei as _gei, sei as _sei, e as _e } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'before-after',\n props: {\n beforeImage: {},\n afterImage: {},\n showTitle: { type: Boolean }\n },\n setup(__props) {\n const props = __props;\n // 预览图片\n const previewImage = (url, type) => {\n const urls = type == 'before' ? [props.beforeImage] : [props.afterImage];\n uni.previewImage({\n current: url,\n urls: urls\n });\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _ctx.showTitle\n }, _ctx.showTitle ? {} : {}, {\n b: _ctx.beforeImage,\n c: _o($event => { return previewImage(_ctx.beforeImage, 'before'); }),\n d: _ctx.afterImage,\n e: _o($event => { return previewImage(_ctx.afterImage, 'after'); }),\n f: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/before-after/before-after.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.previewImage"],"map":"{\"version\":3,\"file\":\"before-after.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"before-after.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAA;AAGhE,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE;QACL,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KAC7B;IACD,KAAK,CAAC,OAAY;QAEnB,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,OAAO;QACP,MAAM,YAAY,GAAG,CAAC,GAAY,EAAE,IAAa;YAChD,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YACxE,GAAG,CAAC,YAAY,CAAC;gBAChB,OAAO,EAAE,GAAG;gBACZ,IAAI,EAAE,IAAI;aACV,CAAC,CAAA;QACH,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,CAAC,EAAE,IAAI,CAAC,SAAS;aAClB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3B,CAAC,EAAE,IAAI,CAAC,WAAW;gBACnB,CAAC,EAAE,EAAE,CAAC,MAAM,MAAI,OAAA,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAxC,CAAwC,CAAC;gBACzD,CAAC,EAAE,IAAI,CAAC,UAAU;gBAClB,CAAC,EAAE,EAAE,CAAC,MAAM,MAAI,OAAA,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAtC,CAAsC,CAAC;gBACvD,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;aAChC,CAAC,CAAA;YACA,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/18321a10d8c434d956f79bceab9bdf299338846d b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/18321a10d8c434d956f79bceab9bdf299338846d
new file mode 100644
index 0000000..38f96d4
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/18321a10d8c434d956f79bceab9bdf299338846d
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, toDisplayString as _toDisplayString, t as _t, resolveComponent as _resolveComponent, p as _p, f as _f, o as _o, gei as _gei, sei as _sei } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"section-header\":{\"name\":\"_easycom_section_header\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_section_header_1 = _resolveComponent(\"section-header\");\n (_easycom_section_header_1)();\n}\nimport _easycom_section_header from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue';\nif (!Math) {\n (_easycom_section_header)();\n}\nimport { getCompanyInfo } from \"@/api/index\";\nclass FeatureItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n title: { type: String, optional: false },\n desc: { type: String, optional: false }\n };\n },\n name: \"FeatureItem\"\n };\n }\n constructor(options, metadata = FeatureItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.title = this.__props__.title;\n this.desc = this.__props__.desc;\n delete this.__props__;\n }\n}\nclass CompanyInfo extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n name: { type: String, optional: false },\n slogan: { type: String, optional: false },\n description: { type: String, optional: false },\n phone: { type: String, optional: false },\n wechat: { type: String, optional: false },\n address: { type: String, optional: false },\n workTime: { type: String, optional: false },\n features: { type: UTS.UTSType.withGenerics(Array, [FeatureItem]), optional: false }\n };\n },\n name: \"CompanyInfo\"\n };\n }\n constructor(options, metadata = CompanyInfo.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.name = this.__props__.name;\n this.slogan = this.__props__.slogan;\n this.description = this.__props__.description;\n this.phone = this.__props__.phone;\n this.wechat = this.__props__.wechat;\n this.address = this.__props__.address;\n this.workTime = this.__props__.workTime;\n this.features = this.__props__.features;\n delete this.__props__;\n }\n}\n// 公司信息\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const companyInfo = ref(new CompanyInfo({\n name: '优艺家沙发翻新',\n slogan: '让旧沙发焕发新生',\n description: '',\n phone: '400-888-8888',\n wechat: 'youyijia2026',\n address: '',\n workTime: '',\n features: []\n }));\n // 获取公司信息\n const fetchCompanyInfo = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getCompanyInfo();\n const data = res.data;\n const featuresData = data['features'];\n const features = featuresData.map((item) => {\n return new FeatureItem({\n title: item['title'],\n desc: item['desc']\n });\n });\n companyInfo.value = new CompanyInfo({\n name: data['name'],\n slogan: data['slogan'],\n description: data['description'],\n phone: data['phone'],\n wechat: data['wechat'],\n address: data['address'],\n workTime: data['workTime'],\n features: features\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/about/index.uvue:148', '获取公司信息失败', e);\n }\n }); };\n // 拨打电话\n const callPhone = () => {\n uni.makePhoneCall({\n phoneNumber: companyInfo.value.phone,\n fail: () => {\n uni.showToast({\n title: '拨打电话失败',\n icon: 'none'\n });\n }\n });\n };\n // 复制微信号\n const copyWechat = () => {\n uni.setClipboardData({\n data: companyInfo.value.wechat,\n success: () => {\n uni.showToast({\n title: '微信号已复制',\n icon: 'success'\n });\n }\n });\n };\n // 打开位置\n const openLocation = () => {\n uni.openLocation({\n latitude: 31.2,\n longitude: 121.5,\n name: companyInfo.value.name,\n address: companyInfo.value.address,\n fail: () => {\n uni.showToast({\n title: '无法打开地图',\n icon: 'none'\n });\n }\n });\n };\n onLoad(() => {\n fetchCompanyInfo();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _t(_unref(companyInfo).name),\n b: _t(_unref(companyInfo).slogan),\n c: _p({\n title: '\\u516C\\u53F8\\u7B80\\u4ECB'\n }),\n d: _t(_unref(companyInfo).description),\n e: _p({\n title: '\\u6211\\u4EEC\\u7684\\u4F18\\u52BF'\n }),\n f: _f(_unref(companyInfo).features, (item, k0, i0) => {\n return {\n a: _t(item.title),\n b: _t(item.desc),\n c: item.title\n };\n }),\n g: _p({\n title: '\\u8054\\u7CFB\\u6211\\u4EEC'\n }),\n h: _t(_unref(companyInfo).phone),\n i: _o(callPhone),\n j: _t(_unref(companyInfo).wechat),\n k: _o(copyWechat),\n l: _t(_unref(companyInfo).address),\n m: _o(openLocation),\n n: _t(_unref(companyInfo).workTime),\n o: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/about/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue.ts"],"uniExtApis":["uni.__f__","uni.showToast","uni.makePhoneCall","uni.setClipboardData","uni.openLocation"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\";AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/K,MAAM,sBAAsB,GAAG,wEAAwE,CAAA;AACvG,IAAI,CAAC,KAAK,EAAE;IAAC,MAAM,yBAAuB,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAAA,CAAC,yBAAuB,CAAC,EAAE,CAAA;CAAC;AAC7G,OAAO,uBAAuB,MAAM,+EAA+E,CAAC;AACpH,IAAI,CAAC,IAAI,EAAE;IAAE,CAAC,uBAAuB,CAAC,EAAE,CAAA;CAAE;OAEnC,EAAE,cAAc,EAAE;MAGnB,WAAW;;;;;;;;;;;;;;;;;;;;;MAMX,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWhB,OAAO;AAER,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,OAAO;IACf,KAAK,CAAC,OAAO;QAEd,MAAM,WAAW,GAAG,GAAG,iBAAc;YACpC,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,UAAU;YAClB,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;SACZ,EAAC,CAAA;QAEF,SAAS;QACT,MAAM,gBAAgB,GAAG;YACxB,IAAI;gBACH,MAAM,GAAG,GAAG,MAAM,cAAc,EAAE,CAAA;gBAClC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAqB,CAAA;gBAEtC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAoB,CAAA;gBACxD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI;oBACtC,uBAAO;wBACN,KAAK,EAAE,IAAI,CAAC,OAAO,CAAW;wBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;qBACb,EAAA;gBACjB,CAAC,CAAC,CAAA;gBAEF,WAAW,CAAC,KAAK,mBAAG;oBACnB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;oBAC5B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAW;oBAChC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAW;oBAC1C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAW;oBAC9B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAW;oBAChC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAW;oBAClC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAW;oBACpC,QAAQ,EAAE,QAAQ;iBACH,CAAA,CAAA;aAChB;YAAC,OAAO,CAAC,EAAE;gBACX,GAAG,CAAC,KAAK,CAAC,OAAO,EAAC,+BAA+B,EAAC,UAAU,EAAE,CAAC,CAAC,CAAA;aAChE;QACF,CAAC,IAAA,CAAA;QAED,OAAO;QACP,MAAM,SAAS,GAAG;YACjB,GAAG,CAAC,aAAa,CAAC;gBACjB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK;gBACpC,IAAI,EAAE;oBACL,GAAG,CAAC,SAAS,CAAC;wBACb,KAAK,EAAE,QAAQ;wBACf,IAAI,EAAE,MAAM;qBACZ,CAAC,CAAA;gBACH,CAAC;aACD,CAAC,CAAA;QACH,CAAC,CAAA;QAED,QAAQ;QACR,MAAM,UAAU,GAAG;YAClB,GAAG,CAAC,gBAAgB,CAAC;gBACpB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;gBAC9B,OAAO,EAAE;oBACR,GAAG,CAAC,SAAS,CAAC;wBACb,KAAK,EAAE,QAAQ;wBACf,IAAI,EAAE,SAAS;qBACf,CAAC,CAAA;gBACH,CAAC;aACD,CAAC,CAAA;QACH,CAAC,CAAA;QAED,OAAO;QACP,MAAM,YAAY,GAAG;YACpB,GAAG,CAAC,YAAY,CAAC;gBAChB,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI;gBAC5B,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO;gBAClC,IAAI,EAAE;oBACL,GAAG,CAAC,SAAS,CAAC;wBACb,KAAK,EAAE,QAAQ;wBACf,IAAI,EAAE,MAAM;qBACZ,CAAC,CAAA;gBACH,CAAC;aACD,CAAC,CAAA;QACH,CAAC,CAAA;QAED,MAAM,CAAC;YACN,gBAAgB,EAAE,CAAA;QACnB,CAAC,CAAC,CAAA;QAEH,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG;gBACrB,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;gBAC/B,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;gBACjC,CAAC,EAAE,EAAE,CAAC;oBACJ,KAAK,EAAE,0BAA0B;iBAClC,CAAC;gBACF,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC;gBACtC,CAAC,EAAE,EAAE,CAAC;oBACJ,KAAK,EAAE,gCAAgC;iBACxC,CAAC;gBACF,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;oBAC/C,OAAO;wBACL,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;wBACjB,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;wBAChB,CAAC,EAAE,IAAI,CAAC,KAAK;qBACd,CAAC;gBACJ,CAAC,CAAC;gBACF,CAAC,EAAE,EAAE,CAAC;oBACJ,KAAK,EAAE,0BAA0B;iBAClC,CAAC;gBACF,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;gBAChC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;gBAChB,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;gBACjC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;gBACjB,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBAClC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC;gBACnB,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;gBACnC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;aAChC,CAAA;YACC,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/1f20882143a2837e0f3e4e0738b00b1fca3207b8 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/1f20882143a2837e0f3e4e0738b00b1fca3207b8
new file mode 100644
index 0000000..3744b06
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/1f20882143a2837e0f3e4e0738b00b1fca3207b8
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, o as _o, toDisplayString as _toDisplayString, t as _t, f as _f, gei as _gei, sei as _sei, e as _e } from \"vue\";\nimport { submitBooking } from \"@/api/index\";\nimport { SOFA_CATEGORIES } from \"@/utils/config\";\nclass FormData extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n userName: { type: String, optional: false },\n phone: { type: String, optional: false },\n address: { type: String, optional: false },\n sofaType: { type: String, optional: false },\n problem: { type: String, optional: false }\n };\n },\n name: \"FormData\"\n };\n }\n constructor(options, metadata = FormData.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.userName = this.__props__.userName;\n this.phone = this.__props__.phone;\n this.address = this.__props__.address;\n this.sofaType = this.__props__.sofaType;\n this.problem = this.__props__.problem;\n delete this.__props__;\n }\n}\nclass SofaType extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false }\n };\n },\n name: \"SofaType\"\n };\n }\n constructor(options, metadata = SofaType.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n delete this.__props__;\n }\n}\n// 表单数据\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const formData = ref(new FormData({\n userName: '',\n phone: '',\n address: '',\n sofaType: '',\n problem: ''\n }));\n // 图片列表\n const imageList = ref([]);\n // 沙发类型列表\n const sofaTypes = ref([]);\n // 提交中\n const submitting = ref(false);\n // 初始化沙发类型\n const initSofaTypes = () => {\n sofaTypes.value = SOFA_CATEGORIES.filter((item) => { return item.id != 'all'; }).map((item) => {\n return new SofaType({\n id: item.id,\n name: item.name\n });\n });\n };\n // 选择沙发类型\n const selectSofaType = (id) => {\n formData.value.sofaType = id;\n };\n // 选择图片\n const chooseImage = () => {\n uni.chooseImage(new UTSJSONObject({\n count: 9 - imageList.value.length,\n sizeType: ['compressed'],\n sourceType: ['album', 'camera'],\n success: (res) => {\n imageList.value = [...imageList.value, ...res.tempFilePaths];\n }\n }));\n };\n // 删除图片\n const deleteImage = (index) => {\n imageList.value.splice(index, 1);\n };\n // 验证表单\n const validateForm = () => {\n if (formData.value.userName.trim() == '') {\n uni.showToast({\n title: '请输入您的姓名',\n icon: 'none'\n });\n return false;\n }\n const phone = formData.value.phone.trim();\n if (phone == '') {\n uni.showToast({\n title: '请输入联系电话',\n icon: 'none'\n });\n return false;\n }\n // 简单验证手机号\n if (phone.length != 11) {\n uni.showToast({\n title: '请输入正确的手机号',\n icon: 'none'\n });\n return false;\n }\n if (formData.value.address.trim() == '') {\n uni.showToast({\n title: '请输入您的地址',\n icon: 'none'\n });\n return false;\n }\n return true;\n };\n // 提交预约\n const handleSubmit = () => { return __awaiter(this, void 0, void 0, function* () {\n if (!validateForm())\n return Promise.resolve(null);\n if (submitting.value)\n return Promise.resolve(null);\n submitting.value = true;\n try {\n const data = new UTSJSONObject({\n userName: formData.value.userName,\n phone: formData.value.phone,\n address: formData.value.address,\n sofaType: formData.value.sofaType,\n problem: formData.value.problem,\n images: imageList.value\n });\n const res = yield submitBooking(data);\n const result = res.data;\n uni.showModal(new UTSJSONObject({\n title: '预约成功',\n content: result['message'],\n showCancel: false,\n success: () => {\n // 返回上一页或首页\n uni.navigateBack(new UTSJSONObject({\n fail: () => {\n uni.switchTab({\n url: '/pages/index/index'\n });\n }\n }));\n }\n }));\n }\n catch (e) {\n uni.__f__('error', 'at pages/booking/index.uvue:270', '提交预约失败', e);\n uni.showToast({\n title: '提交失败,请重试',\n icon: 'none'\n });\n }\n submitting.value = false;\n }); };\n onLoad(() => {\n initSofaTypes();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _unref(formData).userName,\n b: _o($event => { return _unref(formData).userName = $event.detail.value; }),\n c: _unref(formData).phone,\n d: _o($event => { return _unref(formData).phone = $event.detail.value; }),\n e: _unref(formData).address,\n f: _o($event => { return _unref(formData).address = $event.detail.value; }),\n g: _f(_unref(sofaTypes), (item, k0, i0) => {\n return {\n a: _t(item.name),\n b: _unref(formData).sofaType == item.id ? 1 : '',\n c: _unref(formData).sofaType == item.id ? 1 : '',\n d: item.id,\n e: _o($event => { return selectSofaType(item.id); }, item.id)\n };\n }),\n h: _unref(formData).problem,\n i: _o($event => { return _unref(formData).problem = $event.detail.value; }),\n j: _t(_unref(formData).problem.length),\n k: _f(_unref(imageList), (item, index, i0) => {\n return {\n a: item,\n b: _o($event => { return deleteImage(index); }, index),\n c: index\n };\n }),\n l: _unref(imageList).length < 9\n }, _unref(imageList).length < 9 ? {\n m: _o(chooseImage)\n } : {}, {\n n: _o(handleSubmit),\n o: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/booking/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.chooseImage","uni.showToast","uni.switchTab","uni.navigateBack","uni.showModal","uni.__f__"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/4e8299cad3ffd24bd85f45cc608ddd2bf2a905e7 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/4e8299cad3ffd24bd85f45cc608ddd2bf2a905e7
new file mode 100644
index 0000000..6cba976
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/4e8299cad3ffd24bd85f45cc608ddd2bf2a905e7
@@ -0,0 +1 @@
+{"code":"import {} from \"vue\";\nexport default defineComponent({\n onLaunch() {\n uni.__f__('log', 'at App.uvue:7', 'App Launch');\n },\n onShow() {\n uni.__f__('log', 'at App.uvue:10', 'App Show');\n },\n onHide() {\n uni.__f__('log', 'at App.uvue:13', 'App Hide');\n },\n onExit() {\n uni.__f__('log', 'at App.uvue:34', 'App Exit');\n },\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/App.uvue?vue&type=script&lang.uts.js.map","references":[],"uniExtApis":["uni.__f__"],"map":"{\"version\":3,\"file\":\"App.uvue?vue&type=script&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"App.uvue?vue&type=script&lang.uts\"],\"names\":[],\"mappings\":\";AAIC,+BAAe;IACd,QAAQ;QACP,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,eAAe,EAAC,YAAY,CAAC,CAAA;IAC9C,CAAC;IACD,MAAM;QACL,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM;QACL,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;IAmBD,MAAM;QACL,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;CACD,EAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/75990f3808ed5b787ba8c01c69f145a9e26d7223 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/75990f3808ed5b787ba8c01c69f145a9e26d7223
new file mode 100644
index 0000000..abace3c
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/75990f3808ed5b787ba8c01c69f145a9e26d7223
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'service-card',\n props: {\n id: {},\n name: {},\n icon: {}\n },\n emits: [\"click\"],\n setup(__props, _a) {\n var __emit = _a.emit;\n const props = __props;\n const emit = __emit;\n const handleClick = () => {\n emit('click', props.id);\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _ctx.icon,\n b: _t(_ctx.name),\n c: _sei(_gei(_ctx, ''), 'view'),\n d: _o(handleClick)\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/service-card/service-card.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"service-card.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"service-card.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,CAAA;AAGrG,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE;QACL,EAAE,EAAE,EAAE;QACN,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;KACT;IACD,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,KAAK,CAAC,OAAY,EAAE,EAAgB;YAAR,MAAM,UAAA;QAEnC,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,MAAM,WAAW,GAAG;YACnB,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG;gBACrB,CAAC,EAAE,IAAI,CAAC,IAAI;gBACZ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;gBAC/B,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;aACnB,CAAA;YACC,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/8c18e740dbb3c9f8136db47026b4ded95dd11703 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/8c18e740dbb3c9f8136db47026b4ded95dd11703
new file mode 100644
index 0000000..780fb52
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/8c18e740dbb3c9f8136db47026b4ded95dd11703
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, o as _o, toDisplayString as _toDisplayString, t as _t, e as _e } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'nav-bar',\n props: {\n title: {},\n showBack: { type: Boolean },\n titleColor: {},\n bgColor: {}\n },\n setup(__props) {\n const props = __props;\n // 状态栏高度\n const statusBarHeight = ref(20);\n // 导航栏高度\n const navBarHeight = ref(44);\n onMounted(() => {\n const sysInfo = uni.getSystemInfoSync();\n statusBarHeight.value = sysInfo.statusBarHeight;\n const menuButtonInfo = uni.getMenuButtonBoundingClientRect();\n navBarHeight.value = (menuButtonInfo.top - sysInfo.statusBarHeight) * 2 + menuButtonInfo.height;\n });\n const handleBack = () => {\n uni.navigateBack(new UTSJSONObject({\n fail: () => {\n uni.switchTab({\n url: '/pages/index/index'\n });\n }\n }));\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _ctx.showBack\n }, _ctx.showBack ? {\n b: _o(handleBack)\n } : {}, {\n c: _t(_ctx.title),\n d: _ctx.titleColor,\n e: _unref(navBarHeight) + 'px',\n f: _unref(statusBarHeight) + 'px',\n g: _unref(statusBarHeight) + _unref(navBarHeight) + 'px'\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/nav-bar/nav-bar.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.getSystemInfoSync","uni.getMenuButtonBoundingClientRect","uni.switchTab","uni.navigateBack"],"map":"{\"version\":3,\"file\":\"nav-bar.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"nav-bar.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAA;AAGrG,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE;QACL,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QAC3B,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,EAAE;KACZ;IACD,KAAK,CAAC,OAAY;QAEnB,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,QAAQ;QACR,MAAM,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,QAAQ;QACR,MAAM,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;QAE5B,SAAS,CAAC;YACT,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAA;YACvC,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC,eAAe,CAAA;YAE/C,MAAM,cAAc,GAAG,GAAG,CAAC,+BAA+B,EAAE,CAAA;YAC5D,YAAY,CAAC,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAA;QAEhG,CAAC,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG;YAClB,GAAG,CAAC,YAAY,mBAAC;gBAChB,IAAI,EAAE;oBACL,GAAG,CAAC,SAAS,CAAC;wBACb,GAAG,EAAE,oBAAoB;qBACzB,CAAC,CAAA;gBACH,CAAC;aACD,EAAC,CAAA;QACH,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,CAAC,EAAE,IAAI,CAAC,QAAQ;aACjB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjB,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;aAClB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACN,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjB,CAAC,EAAE,IAAI,CAAC,UAAU;gBAClB,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI;gBAC9B,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI;gBACjC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI;aACzD,CAAC,CAAA;YACA,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/af8c903fd6e24b220c4b052bb79bc02b7674d6ea b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/af8c903fd6e24b220c4b052bb79bc02b7674d6ea
new file mode 100644
index 0000000..f9637f2
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/af8c903fd6e24b220c4b052bb79bc02b7674d6ea
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { resolveComponent as _resolveComponent, p as _p, unref as _unref, o as _o, f as _f, toDisplayString as _toDisplayString, t as _t, gei as _gei, sei as _sei } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"nav-bar\":{\"name\":\"_easycom_nav_bar\",\"type\":\"unknown\"},\"service-card\":{\"name\":\"_easycom_service_card\",\"type\":\"unknown\"},\"section-header\":{\"name\":\"_easycom_section_header\",\"type\":\"unknown\"},\"case-card\":{\"name\":\"_easycom_case_card\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_nav_bar_1 = _resolveComponent(\"nav-bar\");\n const _easycom_service_card_1 = _resolveComponent(\"service-card\");\n const _easycom_section_header_1 = _resolveComponent(\"section-header\");\n const _easycom_case_card_1 = _resolveComponent(\"case-card\");\n (_easycom_nav_bar_1 + _easycom_service_card_1 + _easycom_section_header_1 + _easycom_case_card_1)();\n}\nimport _easycom_nav_bar from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/nav-bar/nav-bar.uvue';\nimport _easycom_service_card from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/service-card/service-card.uvue';\nimport _easycom_section_header from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue';\nimport _easycom_case_card from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue';\nif (!Math) {\n (_easycom_nav_bar + _easycom_service_card + _easycom_section_header + _easycom_case_card)();\n}\nimport { getBanners, getHotCases } from \"@/api/index\";\nimport { SERVICE_TYPES } from \"@/utils/config\";\nclass BannerItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n image: { type: String, optional: false },\n title: { type: String, optional: false },\n link: { type: String, optional: false }\n };\n },\n name: \"BannerItem\"\n };\n }\n constructor(options, metadata = BannerItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.image = this.__props__.image;\n this.title = this.__props__.title;\n this.link = this.__props__.link;\n delete this.__props__;\n }\n}\nclass CaseItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n coverImage: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false }\n };\n },\n name: \"CaseItem\"\n };\n }\n constructor(options, metadata = CaseItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.coverImage = this.__props__.coverImage;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n delete this.__props__;\n }\n}\nclass ServiceType extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false },\n icon: { type: String, optional: false }\n };\n },\n name: \"ServiceType\"\n };\n }\n constructor(options, metadata = ServiceType.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n this.icon = this.__props__.icon;\n delete this.__props__;\n }\n}\nclass AdvantageItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n icon: { type: String, optional: false },\n title: { type: String, optional: false },\n desc: { type: String, optional: false }\n };\n },\n name: \"AdvantageItem\"\n };\n }\n constructor(options, metadata = AdvantageItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.icon = this.__props__.icon;\n this.title = this.__props__.title;\n this.desc = this.__props__.desc;\n delete this.__props__;\n }\n}\n// 轮播图数据\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const bannerList = ref([]);\n // 服务类型\n const serviceTypes = ref([]);\n // 热门案例\n const hotCases = ref([]);\n // 公司优势\n const advantages = ref([\n new AdvantageItem({ icon: '👨🔧', title: '专业团队', desc: '10年+经验' }),\n new AdvantageItem({ icon: '✅', title: '品质保证', desc: '质保2年' }),\n new AdvantageItem({ icon: '🚗', title: '上门服务', desc: '免费评估' }),\n new AdvantageItem({ icon: '💰', title: '价格透明', desc: '无隐形消费' })\n ]);\n // 初始化服务类型\n const initServiceTypes = () => {\n serviceTypes.value = SERVICE_TYPES.map((item) => {\n return new ServiceType({\n id: item.id,\n name: item.name,\n icon: item.icon\n });\n });\n };\n // 获取轮播图\n const fetchBanners = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getBanners();\n const data = res.data;\n bannerList.value = data.map((item) => {\n return new BannerItem({\n id: item['id'],\n image: item['image'],\n title: item['title'],\n link: item['link']\n });\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/index/index.uvue:174', '获取轮播图失败', e);\n }\n }); };\n // 获取热门案例\n const fetchHotCases = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getHotCases();\n const data = res.data;\n // 适应后端返回格式:{ items: [], total: 0 }\n const list = data['items'] || [];\n hotCases.value = list.map((item) => {\n return new CaseItem({\n id: item['id'],\n title: item['title'],\n category: item['category'],\n categoryName: item['categoryName'],\n coverImage: item['coverImage'],\n material: item['material'],\n duration: item['duration'],\n price: item['price'],\n views: item['views'],\n likes: item['likes']\n });\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/index/index.uvue:200', '获取热门案例失败', e);\n }\n }); };\n // 轮播图点击\n const handleBannerClick = (item) => {\n if (item.link != '') {\n uni.navigateTo({\n url: item.link,\n fail: () => {\n uni.switchTab({\n url: item.link\n });\n }\n });\n }\n };\n // 服务点击\n const handleServiceClick = (id) => {\n uni.switchTab({\n url: '/pages/service/index'\n });\n };\n // 查看更多案例\n const goToCaseList = () => {\n uni.switchTab({\n url: '/pages/cases/list'\n });\n };\n // 查看案例详情\n const goToCaseDetail = (id) => {\n uni.navigateTo({\n url: `/pages/cases/detail?id=${id}`\n });\n };\n // 去预约\n const goToBooking = () => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n // API测试方法\n const testAPI = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n uni.__f__('log', 'at pages/index/index.uvue:249', '开始API对接测试...');\n // 测试轮播图(使用Mock数据)\n const bannerRes = yield getBanners();\n uni.__f__('log', 'at pages/index/index.uvue:253', '轮播图API响应:', bannerRes);\n // 测试案例列表\n const caseRes = yield getCaseList();\n uni.__f__('log', 'at pages/index/index.uvue:257', '案例列表API响应:', caseRes);\n uni.showToast({\n title: 'API测试完成,请查看控制台',\n icon: 'success'\n });\n }\n catch (error) {\n uni.__f__('error', 'at pages/index/index.uvue:264', 'API测试失败:', error);\n uni.showToast({\n title: 'API测试失败',\n icon: 'error'\n });\n }\n }); };\n onLoad(() => {\n initServiceTypes();\n fetchBanners();\n fetchHotCases();\n // 开发环境下自动进行API测试\n // testAPI()\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _p({\n title: '\\u4F18\\u827A\\u5BB6\\u6C99\\u53D1\\u7FFB\\u65B0'\n }),\n b: _f(_unref(bannerList), (item, k0, i0) => {\n return {\n a: item.image,\n b: _o($event => { return handleBannerClick(item); }, item.id),\n c: item.id\n };\n }),\n c: _f(_unref(serviceTypes), (item, k0, i0) => {\n return {\n a: item.id,\n b: item.id,\n c: _o(handleServiceClick, item.id),\n d: '767a328a-1' + '-' + i0,\n e: _p({\n id: item.id,\n name: item.name,\n icon: item.icon\n })\n };\n }),\n d: _f(_unref(advantages), (item, k0, i0) => {\n return {\n a: _t(item.icon),\n b: _t(item.title),\n c: _t(item.desc),\n d: item.title\n };\n }),\n e: _o(goToCaseList),\n f: _p({\n title: '\\u70ED\\u95E8\\u6848\\u4F8B',\n showMore: true\n }),\n g: _f(_unref(hotCases), (item, k0, i0) => {\n return {\n a: item.id,\n b: _o(goToCaseDetail, item.id),\n c: '767a328a-3' + '-' + i0,\n d: _p({\n caseData: item\n })\n };\n }),\n h: _o(goToBooking),\n i: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/index/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/nav-bar/nav-bar.uvue.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/service-card/service-card.uvue.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue.ts"],"uniExtApis":["uni.__f__","uni.switchTab","uni.navigateTo","uni.showToast"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c40df9f46b55ec7c9fcde7bb1869ecd5916d90c8 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c40df9f46b55ec7c9fcde7bb1869ecd5916d90c8
new file mode 100644
index 0000000..c1098c4
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c40df9f46b55ec7c9fcde7bb1869ecd5916d90c8
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, toDisplayString as _toDisplayString, t as _t, o as _o, f as _f, resolveComponent as _resolveComponent, p as _p, gei as _gei, sei as _sei, e as _e } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"case-card\":{\"name\":\"_easycom_case_card\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_case_card_1 = _resolveComponent(\"case-card\");\n (_easycom_case_card_1)();\n}\nimport _easycom_case_card from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue';\nif (!Math) {\n (_easycom_case_card)();\n}\nimport { getCaseList } from \"@/api/index\";\nimport { SOFA_CATEGORIES, PAGE_SIZE } from \"@/utils/config\";\nclass CategoryItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false }\n };\n },\n name: \"CategoryItem\"\n };\n }\n constructor(options, metadata = CategoryItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n delete this.__props__;\n }\n}\nclass CaseItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n coverImage: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false }\n };\n },\n name: \"CaseItem\"\n };\n }\n constructor(options, metadata = CaseItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.coverImage = this.__props__.coverImage;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n delete this.__props__;\n }\n}\n// 分类列表\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'list',\n setup(__props) {\n const categories = ref([]);\n // 当前分类\n const currentCategory = ref('all');\n // 案例列表\n const caseList = ref([]);\n // 分页\n const page = ref(1);\n const total = ref(0);\n // 加载状态\n const loading = ref(false);\n const noMore = ref(false);\n // 初始化分类\n const initCategories = () => {\n categories.value = SOFA_CATEGORIES.map((item) => {\n return new CategoryItem({\n id: item.id,\n name: item.name\n });\n });\n };\n // 选择分类\n const selectCategory = (id) => {\n if (currentCategory.value == id)\n return null;\n currentCategory.value = id;\n page.value = 1;\n caseList.value = [];\n noMore.value = false;\n fetchCaseList();\n };\n // 获取案例列表\n const fetchCaseList = () => { return __awaiter(this, void 0, void 0, function* () {\n if (loading.value || noMore.value)\n return Promise.resolve(null);\n loading.value = true;\n try {\n const params = new UTSJSONObject({\n category: currentCategory.value,\n page: page.value,\n pageSize: PAGE_SIZE\n });\n const res = yield getCaseList(params);\n const data = res.data;\n // 适应后端返回格式:{ items: [], total: 0, page: 1, limit: 10 }\n const list = data['items'] || [];\n total.value = data['total'] || 0;\n const newList = list.map((item) => {\n return new CaseItem({\n id: item['id'],\n title: item['title'],\n category: item['category'],\n categoryName: item['categoryName'],\n coverImage: item['coverImage'],\n material: item['material'],\n duration: item['duration'],\n price: item['price'],\n views: item['views'],\n likes: item['likes']\n });\n });\n if (page.value == 1) {\n caseList.value = newList;\n }\n else {\n caseList.value = [...caseList.value, ...newList];\n }\n if (caseList.value.length >= total.value) {\n noMore.value = true;\n }\n }\n catch (e) {\n uni.__f__('error', 'at pages/cases/list.uvue:160', '获取案例列表失败', e);\n }\n loading.value = false;\n }); };\n // 加载更多\n const loadMore = () => {\n if (!noMore.value && !loading.value) {\n page.value++;\n fetchCaseList();\n }\n };\n // 跳转详情\n const goToDetail = (id) => {\n uni.navigateTo({\n url: `/pages/cases/detail?id=${id}`\n });\n };\n onLoad(() => {\n initCategories();\n fetchCaseList();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _f(_unref(categories), (item, k0, i0) => {\n return {\n a: _t(item.name),\n b: _unref(currentCategory) == item.id ? 1 : '',\n c: _unref(currentCategory) == item.id ? 1 : '',\n d: item.id,\n e: _o($event => { return selectCategory(item.id); }, item.id)\n };\n }),\n b: _f(_unref(caseList), (item, k0, i0) => {\n return {\n a: item.id,\n b: _o(goToDetail, item.id),\n c: '15d594f8-0' + '-' + i0,\n d: _p({\n caseData: item\n })\n };\n }),\n c: _unref(loading)\n }, _unref(loading) ? {} : _unref(noMore) ? {} : {}, {\n d: _unref(noMore),\n e: !_unref(loading) && _unref(caseList).length == 0\n }, !_unref(loading) && _unref(caseList).length == 0 ? {} : {}, {\n f: _o(loadMore),\n g: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/cases/list.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue.ts"],"uniExtApis":["uni.__f__","uni.navigateTo"],"map":"{\"version\":3,\"file\":\"list.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"list.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c52bb86f08c58eec980d4b33c0241ce0aca87aa3 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c52bb86f08c58eec980d4b33c0241ce0aca87aa3
new file mode 100644
index 0000000..3fa0d61
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c52bb86f08c58eec980d4b33c0241ce0aca87aa3
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei, e as _e } from \"vue\";\nimport { STORAGE_KEYS } from \"@/utils/config\";\nclass UserInfo extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n nickName: { type: String, optional: false },\n avatar: { type: String, optional: false },\n phone: { type: String, optional: false }\n };\n },\n name: \"UserInfo\"\n };\n }\n constructor(options, metadata = UserInfo.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.nickName = this.__props__.nickName;\n this.avatar = this.__props__.avatar;\n this.phone = this.__props__.phone;\n delete this.__props__;\n }\n}\n// 用户信息\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const userInfo = ref(new UserInfo({\n id: '',\n nickName: '',\n avatar: '',\n phone: ''\n }));\n // 是否登录\n const isLoggedIn = ref(false);\n // 预约数量\n const bookingCount = ref(0);\n // 收藏数量\n const favoriteCount = ref(0);\n // 缓存大小\n const cacheSize = ref('0KB');\n // 检查登录状态\n const checkLoginStatus = () => {\n var _a, _b, _c, _d;\n const token = uni.getStorageSync(STORAGE_KEYS.TOKEN);\n isLoggedIn.value = token != '';\n if (isLoggedIn.value) {\n // 获取用户信息\n const info = uni.getStorageSync(STORAGE_KEYS.USER_INFO);\n if (info != null) {\n userInfo.value = new UserInfo({\n id: ((_a = info['id']) !== null && _a !== void 0 ? _a : ''),\n nickName: ((_b = info['nickName']) !== null && _b !== void 0 ? _b : ''),\n avatar: ((_c = info['avatar']) !== null && _c !== void 0 ? _c : ''),\n phone: ((_d = info['phone']) !== null && _d !== void 0 ? _d : '')\n });\n }\n }\n };\n // 获取缓存大小\n const getCacheSize = () => {\n uni.getStorageInfo(new UTSJSONObject({\n success: (res) => {\n const size = res.currentSize;\n if (size < 1024) {\n cacheSize.value = `${size}KB`;\n }\n else {\n cacheSize.value = `${(size / 1024).toFixed(2)}MB`;\n }\n }\n }));\n };\n // 登录\n const handleLogin = () => {\n uni.getUserProfile(new UTSJSONObject({\n desc: '用于完善用户资料',\n success: (res = null) => {\n userInfo.value = new UserInfo({\n id: '',\n nickName: res.userInfo.nickName,\n avatar: res.userInfo.avatarUrl,\n phone: ''\n }\n // 保存用户信息\n );\n // 保存用户信息\n uni.setStorageSync(STORAGE_KEYS.USER_INFO, new UTSJSONObject({\n nickName: res.userInfo.nickName,\n avatar: res.userInfo.avatarUrl\n }));\n uni.setStorageSync(STORAGE_KEYS.TOKEN, 'mock_token_' + Date.now().toString());\n isLoggedIn.value = true;\n uni.showToast({\n title: '登录成功',\n icon: 'success'\n });\n },\n fail: () => {\n uni.showToast({\n title: '登录失败',\n icon: 'none'\n });\n }\n }));\n };\n // 退出登录\n const handleLogout = () => {\n uni.showModal(new UTSJSONObject({\n title: '提示',\n content: '确定要退出登录吗?',\n success: (res) => {\n if (res.confirm) {\n uni.removeStorageSync(STORAGE_KEYS.TOKEN);\n uni.removeStorageSync(STORAGE_KEYS.USER_INFO);\n isLoggedIn.value = false;\n userInfo.value = new UserInfo({\n id: '',\n nickName: '',\n avatar: '',\n phone: ''\n });\n uni.showToast({\n title: '已退出登录',\n icon: 'success'\n });\n }\n }\n }));\n };\n // 跳转预约列表\n const goToBookingList = () => {\n uni.showToast({\n title: '功能开发中',\n icon: 'none'\n });\n };\n // 跳转收藏列表\n const goToFavorites = () => {\n uni.showToast({\n title: '功能开发中',\n icon: 'none'\n });\n };\n // 关于我们\n const goToAbout = () => {\n uni.navigateTo({\n url: '/pages/about/index'\n });\n };\n // 联系客服\n const callService = () => {\n uni.makePhoneCall({\n phoneNumber: '400-888-8888',\n fail: () => {\n uni.showToast({\n title: '拨打电话失败',\n icon: 'none'\n });\n }\n });\n };\n // 意见反馈\n const openFeedback = () => {\n // 微信小程序可以使用feedback\n uni.showToast({\n title: '功能开发中',\n icon: 'none'\n });\n };\n // 检查更新\n const checkUpdate = () => {\n uni.showToast({\n title: '已是最新版本',\n icon: 'success'\n });\n };\n // 清除缓存\n const clearCache = () => {\n uni.showModal(new UTSJSONObject({\n title: '提示',\n content: '确定要清除缓存吗?',\n success: (res) => {\n if (res.confirm) {\n uni.clearStorage(new UTSJSONObject({\n success: () => {\n cacheSize.value = '0KB';\n uni.showToast({\n title: '清除成功',\n icon: 'success'\n });\n }\n }));\n }\n }\n }));\n };\n onShow(() => {\n checkLoginStatus();\n getCacheSize();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _unref(userInfo).avatar || '/static/images/default-avatar.png',\n b: _t(_unref(userInfo).nickName || '点击登录'),\n c: _unref(userInfo).phone\n }, _unref(userInfo).phone ? {\n d: _t(_unref(userInfo).phone)\n } : {}, {\n e: !_unref(isLoggedIn)\n }, !_unref(isLoggedIn) ? {\n f: _o(handleLogin)\n } : {}, {\n g: _unref(bookingCount) > 0\n }, _unref(bookingCount) > 0 ? {\n h: _t(_unref(bookingCount))\n } : {}, {\n i: _o(goToBookingList),\n j: _unref(favoriteCount) > 0\n }, _unref(favoriteCount) > 0 ? {\n k: _t(_unref(favoriteCount))\n } : {}, {\n l: _o(goToFavorites),\n m: _o(goToAbout),\n n: _o(callService),\n o: _o(openFeedback),\n p: _o(checkUpdate),\n q: _t(_unref(cacheSize)),\n r: _o(clearCache),\n s: _unref(isLoggedIn)\n }, _unref(isLoggedIn) ? {\n t: _o(handleLogout)\n } : {}, {\n v: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/user/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.getStorageSync","uni.getStorageInfo","uni.setStorageSync","uni.showToast","uni.getUserProfile","uni.removeStorageSync","uni.showModal","uni.navigateTo","uni.makePhoneCall","uni.clearStorage"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c8ca354b6903842c1b702b6197f5528bba7da9da b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c8ca354b6903842c1b702b6197f5528bba7da9da
new file mode 100644
index 0000000..49e4afa
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/c8ca354b6903842c1b702b6197f5528bba7da9da
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { resolveComponent as _resolveComponent, p as _p, unref as _unref, toDisplayString as _toDisplayString, t as _t, o as _o, f as _f, gei as _gei, sei as _sei, e as _e } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"section-header\":{\"name\":\"_easycom_section_header\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_section_header_1 = _resolveComponent(\"section-header\");\n (_easycom_section_header_1)();\n}\nimport _easycom_section_header from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue';\nif (!Math) {\n (_easycom_section_header)();\n}\nimport { getServiceProcess } from \"@/api/index\";\nclass ServiceType extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false },\n desc: { type: String, optional: false },\n emoji: { type: String, optional: false }\n };\n },\n name: \"ServiceType\"\n };\n }\n constructor(options, metadata = ServiceType.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n this.desc = this.__props__.desc;\n this.emoji = this.__props__.emoji;\n delete this.__props__;\n }\n}\nclass ProcessItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n step: { type: Number, optional: false },\n title: { type: String, optional: false },\n description: { type: String, optional: false }\n };\n },\n name: \"ProcessItem\"\n };\n }\n constructor(options, metadata = ProcessItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.step = this.__props__.step;\n this.title = this.__props__.title;\n this.description = this.__props__.description;\n delete this.__props__;\n }\n}\nclass MaterialItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n name: { type: String, optional: false },\n price: { type: String, optional: false },\n desc: { type: String, optional: false },\n tags: { type: UTS.UTSType.withGenerics(Array, [String]), optional: false }\n };\n },\n name: \"MaterialItem\"\n };\n }\n constructor(options, metadata = MaterialItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.name = this.__props__.name;\n this.price = this.__props__.price;\n this.desc = this.__props__.desc;\n this.tags = this.__props__.tags;\n delete this.__props__;\n }\n}\nclass FaqItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n question: { type: String, optional: false },\n answer: { type: String, optional: false },\n expanded: { type: Boolean, optional: false }\n };\n },\n name: \"FaqItem\"\n };\n }\n constructor(options, metadata = FaqItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.question = this.__props__.question;\n this.answer = this.__props__.answer;\n this.expanded = this.__props__.expanded;\n delete this.__props__;\n }\n}\n// 服务类型数据\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const serviceTypes = ref([\n new ServiceType({ id: 'repair', name: '局部修复', desc: '破损、划痕修复', emoji: '🔧' }),\n new ServiceType({ id: 'recolor', name: '改色翻新', desc: '皮面改色换新', emoji: '🎨' }),\n new ServiceType({ id: 'refurbish', name: '整体翻新', desc: '全面翻新升级', emoji: '✨' }),\n new ServiceType({ id: 'custom', name: '定制换皮', desc: '个性化定制', emoji: '💎' })\n ]);\n // 服务流程\n const processList = ref([]);\n // 材质说明\n const materials = ref([\n new MaterialItem({\n name: '头层牛皮',\n price: '¥800-1500/平',\n desc: '采用进口头层牛皮,质地柔软,透气性好,使用寿命长',\n tags: ['进口原料', '透气舒适', '耐用耐磨']\n }),\n new MaterialItem({\n name: '二层牛皮',\n price: '¥400-800/平',\n desc: '经济实惠的选择,经过特殊处理后外观与头层相近',\n tags: ['性价比高', '外观精美', '易打理']\n }),\n new MaterialItem({\n name: '科技布',\n price: '¥200-500/平',\n desc: '新型环保面料,防水防污,清洁方便,触感舒适',\n tags: ['防水防污', '易清洁', '环保健康']\n }),\n new MaterialItem({\n name: '棉麻布艺',\n price: '¥150-400/平',\n desc: '天然面料,透气舒适,适合追求自然风格的客户',\n tags: ['天然环保', '透气清爽', '风格多样']\n })\n ]);\n // 常见问题\n const faqList = ref([\n new FaqItem({\n question: '翻新需要多长时间?',\n answer: '根据沙发的大小和翻新程度不同,一般需要3-10个工作日。局部修复1-3天,整体翻新5-10天。',\n expanded: false\n }),\n new FaqItem({\n question: '翻新后能保证多久?',\n answer: '我们提供2年质保服务,质保期内如有非人为损坏,免费维修。头层牛皮正常使用可达10年以上。',\n expanded: false\n }),\n new FaqItem({\n question: '可以上门取送吗?',\n answer: '是的,我们提供免费上门取送服务(市区范围内),郊区会收取少量运输费用。',\n expanded: false\n }),\n new FaqItem({\n question: '如何报价?',\n answer: '我们提供免费上门评估服务,师傅会根据沙发的实际情况给出详细报价,价格透明无隐形消费。',\n expanded: false\n }),\n new FaqItem({\n question: '定金和尾款如何支付?',\n answer: '确认订单后支付30%定金,翻新完成验收满意后支付尾款。支持微信、支付宝、银行转账等多种方式。',\n expanded: false\n })\n ]);\n // 获取服务流程\n const fetchServiceProcess = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getServiceProcess();\n const data = res.data;\n processList.value = data.map((item) => {\n return new ProcessItem({\n step: item['step'],\n title: item['title'],\n description: item['description']\n });\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/service/index.uvue:217', '获取服务流程失败', e);\n }\n }); };\n // 切换FAQ展开\n const toggleFaq = (index) => {\n faqList.value[index].expanded = !faqList.value[index].expanded;\n };\n // 服务点击\n const handleServiceClick = (item) => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n // 去预约\n const goToBooking = () => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n onLoad(() => {\n fetchServiceProcess();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _p({\n title: '\\u670D\\u52A1\\u7C7B\\u578B'\n }),\n b: _f(_unref(serviceTypes), (item, k0, i0) => {\n return {\n a: _t(item.emoji),\n b: _t(item.name),\n c: _t(item.desc),\n d: item.id,\n e: _o($event => { return handleServiceClick(item); }, item.id)\n };\n }),\n c: _p({\n title: '\\u670D\\u52A1\\u6D41\\u7A0B'\n }),\n d: _f(_unref(processList), (item, index, i0) => {\n return _e({\n a: _t(item.step),\n b: _t(item.title),\n c: _t(item.description),\n d: index < _unref(processList).length - 1\n }, index < _unref(processList).length - 1 ? {} : {}, {\n e: item.step\n });\n }),\n e: _p({\n title: '\\u6750\\u8D28\\u8BF4\\u660E'\n }),\n f: _f(_unref(materials), (item, k0, i0) => {\n return {\n a: _t(item.name),\n b: _t(item.price),\n c: _t(item.desc),\n d: _f(item.tags, (tag, k1, i1) => {\n return {\n a: _t(tag),\n b: tag\n };\n }),\n e: item.name\n };\n }),\n g: _p({\n title: '\\u5E38\\u89C1\\u95EE\\u9898'\n }),\n h: _f(_unref(faqList), (item, index, i0) => {\n return _e({\n a: _t(item.question),\n b: _t(item.expanded ? '−' : '+'),\n c: item.expanded\n }, item.expanded ? {\n d: _t(item.answer)\n } : {}, {\n e: index,\n f: _o($event => { return toggleFaq(index); }, index)\n });\n }),\n i: _o(goToBooking),\n j: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/service/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue.ts"],"uniExtApis":["uni.__f__","uni.navigateTo"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/e87e6f0ff4ed1406279f0aadf0c5adfaef60ebdf b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/e87e6f0ff4ed1406279f0aadf0c5adfaef60ebdf
new file mode 100644
index 0000000..2398721
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/e87e6f0ff4ed1406279f0aadf0c5adfaef60ebdf
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei } from \"vue\";\nclass CaseItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n coverImage: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false }\n };\n },\n name: \"CaseItem\"\n };\n }\n constructor(options, metadata = CaseItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.coverImage = this.__props__.coverImage;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n delete this.__props__;\n }\n}\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'case-card',\n props: {\n caseData: {}\n },\n emits: [\"click\"],\n setup(__props, _a) {\n var __emit = _a.emit;\n // 定义Props类型\n const props = __props;\n const emit = __emit;\n const handleClick = () => {\n emit('click', props.caseData.id);\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _ctx.caseData.coverImage,\n b: _t(_ctx.caseData.categoryName),\n c: _t(_ctx.caseData.title),\n d: _t(_ctx.caseData.material),\n e: _t(_ctx.caseData.duration),\n f: _t(_ctx.caseData.price),\n g: _t(_ctx.caseData.views),\n h: _t(_ctx.caseData.likes),\n i: _sei(_gei(_ctx, ''), 'view'),\n j: _o(handleClick)\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/case-card/case-card.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"case-card.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"case-card.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,CAAA;MAEhG,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcb,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;KACb;IACD,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,KAAK,CAAC,OAAY,EAAE,EAAgB;YAAR,MAAM,UAAA;QAEnC,YAAY;QACZ,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,MAAM,WAAW,GAAG;YACnB,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjC,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG;gBACrB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;gBAC3B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACjC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC7B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC7B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;gBAC/B,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;aACnB,CAAA;YACC,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/f2a4af02bbb394158735afb1a29a8852c0d4f9dd b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/f2a4af02bbb394158735afb1a29a8852c0d4f9dd
new file mode 100644
index 0000000..db8b909
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/f2a4af02bbb394158735afb1a29a8852c0d4f9dd
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei, e as _e } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'section-header',\n props: {\n title: {},\n showMore: { type: Boolean }\n },\n emits: [\"more\"],\n setup(__props, _a) {\n var __emit = _a.emit;\n const props = __props;\n const emit = __emit;\n const handleMore = () => {\n emit('more');\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _t(_ctx.title),\n b: _ctx.showMore\n }, _ctx.showMore ? {\n c: _o(handleMore)\n } : {}, {\n d: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/section-header/section-header.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"section-header.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"section-header.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAA;AAG9G,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE;QACL,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KAC5B;IACD,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,KAAK,CAAC,OAAY,EAAE,EAAgB;YAAR,MAAM,UAAA;QAEnC,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,MAAM,UAAU,GAAG;YAClB,IAAI,CAAC,MAAM,CAAC,CAAA;QACb,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjB,CAAC,EAAE,IAAI,CAAC,QAAQ;aACjB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjB,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;aAClB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACN,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;aAChC,CAAC,CAAA;YACA,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/f9da72c0809811a822b679cf37c76b3162611e36 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/f9da72c0809811a822b679cf37c76b3162611e36
new file mode 100644
index 0000000..d37db8f
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/code/cache/f9da72c0809811a822b679cf37c76b3162611e36
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, o as _o, f as _f, toDisplayString as _toDisplayString, t as _t, resolveComponent as _resolveComponent, p as _p, gei as _gei, sei as _sei } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"before-after\":{\"name\":\"_easycom_before_after\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_before_after_1 = _resolveComponent(\"before-after\");\n (_easycom_before_after_1)();\n}\nimport _easycom_before_after from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/before-after/before-after.uvue';\nif (!Math) {\n (_easycom_before_after)();\n}\nimport { getCaseDetail } from \"@/api/index\";\nclass CaseDetail extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n beforeImages: { type: UTS.UTSType.withGenerics(Array, [String]), optional: false },\n afterImages: { type: UTS.UTSType.withGenerics(Array, [String]), optional: false },\n description: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false },\n createTime: { type: String, optional: false }\n };\n },\n name: \"CaseDetail\"\n };\n }\n constructor(options, metadata = CaseDetail.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.beforeImages = this.__props__.beforeImages;\n this.afterImages = this.__props__.afterImages;\n this.description = this.__props__.description;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n this.createTime = this.__props__.createTime;\n delete this.__props__;\n }\n}\n// 案例ID\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'detail',\n setup(__props) {\n const caseId = ref('');\n // 案例详情\n const caseDetail = ref(new CaseDetail({\n id: '',\n title: '',\n category: '',\n categoryName: '',\n beforeImages: [],\n afterImages: [],\n description: '',\n material: '',\n duration: '',\n price: '',\n views: 0,\n likes: 0,\n createTime: ''\n }));\n // 是否收藏\n const isFavorite = ref(false);\n // 获取案例详情\n const fetchCaseDetail = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getCaseDetail(caseId.value);\n const data = res.data;\n caseDetail.value = new CaseDetail({\n id: data['id'],\n title: data['title'],\n category: data['category'],\n categoryName: data['categoryName'],\n beforeImages: data['beforeImages'],\n afterImages: data['afterImages'],\n description: data['description'],\n material: data['material'],\n duration: data['duration'],\n price: data['price'],\n views: data['views'],\n likes: data['likes'],\n createTime: data['createTime']\n }\n // 更新标题\n );\n // 更新标题\n uni.setNavigationBarTitle({\n title: caseDetail.value.title\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/cases/detail.uvue:173', '获取案例详情失败', e);\n }\n }); };\n // 预览图片\n const previewImages = (index) => {\n uni.previewImage({\n current: index,\n urls: caseDetail.value.afterImages\n });\n };\n // 收藏\n const handleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n uni.showToast({\n title: isFavorite.value ? '已收藏' : '已取消收藏',\n icon: 'none'\n });\n };\n // 分享\n const handleShare = () => {\n // 微信小程序触发分享\n uni.showToast({\n title: '分享功能开发中',\n icon: 'none'\n });\n };\n // 在线咨询\n const handleContact = () => {\n uni.makePhoneCall({\n phoneNumber: '400-888-8888',\n fail: () => {\n uni.showToast({\n title: '拨打电话失败',\n icon: 'none'\n });\n }\n });\n };\n // 预约\n const goToBooking = () => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n onLoad((options) => {\n var _a;\n caseId.value = (_a = options['id']) !== null && _a !== void 0 ? _a : '';\n if (caseId.value != '') {\n fetchCaseDetail();\n }\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _f(_unref(caseDetail).afterImages, (item, index, i0) => {\n return {\n a: item,\n b: _o($event => { return previewImages(index); }, index),\n c: index\n };\n }),\n b: _t(_unref(caseDetail).categoryName),\n c: _t(_unref(caseDetail).title),\n d: _t(_unref(caseDetail).price),\n e: _t(_unref(caseDetail).views),\n f: _t(_unref(caseDetail).likes),\n g: _p({\n beforeImage: _unref(caseDetail).beforeImages[0] || '',\n afterImage: _unref(caseDetail).afterImages[0] || '',\n showTitle: true\n }),\n h: _t(_unref(caseDetail).material),\n i: _t(_unref(caseDetail).duration),\n j: _t(_unref(caseDetail).createTime),\n k: _t(_unref(caseDetail).description),\n l: _t(_unref(isFavorite) ? '❤️' : '🤍'),\n m: _o(handleFavorite),\n n: _o(handleShare),\n o: _o(handleContact),\n p: _o(goToBooking),\n q: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/cases/detail.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/before-after/before-after.uvue.ts"],"uniExtApis":["uni.setNavigationBarTitle","uni.__f__","uni.previewImage","uni.showToast","uni.makePhoneCall","uni.navigateTo"],"map":"{\"version\":3,\"file\":\"detail.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"detail.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/1076f79d056155ba44812137fcb7d1b8ab456190 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/1076f79d056155ba44812137fcb7d1b8ab456190
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/1208e4225b6925044f0528f917ff2bb5b2aceb07 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/1208e4225b6925044f0528f917ff2bb5b2aceb07
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/7afdeeec7e9b9be6dfb484b7d9ee8ae065a9f63c b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/7afdeeec7e9b9be6dfb484b7d9ee8ae065a9f63c
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/9262efd0604b7e7bd3c3f56bb39ef15e545c2c01 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/9262efd0604b7e7bd3c3f56bb39ef15e545c2c01
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/d37a9038bbd7f5dcc4b9e17cae591bf2636d0ea6 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/d37a9038bbd7f5dcc4b9e17cae591bf2636d0ea6
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/f2072003b5e43b99dbf5806e8a31f3f3c2cb97ec b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_5fec6bbc12da99e0dc1478e0da1fd9e82c9a9d59/types/cache/f2072003b5e43b99dbf5806e8a31f3f3c2cb97ec
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/097550fd279632e2ab2005b8d3c424db389f3b96 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/097550fd279632e2ab2005b8d3c424db389f3b96
new file mode 100644
index 0000000..876ae04
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/097550fd279632e2ab2005b8d3c424db389f3b96
@@ -0,0 +1 @@
+{"code":"import { get, post } from \"../utils/request\";\n/**\n * 获取轮播图\n */\nexport const getBanners = () => {\n return get('/banners');\n};\n/**\n * 获取案例列表\n */\nexport const getCaseList = (params) => {\n return get('/cases', params);\n};\n/**\n * 获取案例详情\n */\nexport const getCaseDetail = (id) => {\n return get(`/cases/${id}`);\n};\n/**\n * 获取热门案例\n */\nexport const getHotCases = () => {\n return get('/cases/hot');\n};\n/**\n * 获取服务流程\n */\nexport const getServiceProcess = () => {\n return get('/service/process');\n};\n/**\n * 获取公司信息\n */\nexport const getCompanyInfo = () => {\n return get('/company/info');\n};\n/**\n * 提交预约\n */\nexport const submitBooking = (data) => {\n return post('/booking', data);\n};\n/**\n * 获取用户信息\n */\nexport const getUserInfo = () => {\n return get('/user/info');\n};\n/**\n * 获取用户收藏列表\n */\nexport const getFavorites = () => {\n return get('/user/favorites');\n};\n/**\n * 添加收藏\n */\nexport const addFavorite = (caseId) => {\n return post('/user/favorites', new UTSJSONObject({ caseId: caseId }));\n};\n/**\n * 取消收藏\n */\nexport const removeFavorite = (caseId) => {\n return post('/user/favorites/remove', new UTSJSONObject({ caseId: caseId }));\n};\n/**\n * 获取预约记录\n */\nexport const getBookingList = () => {\n return get('/user/bookings');\n};\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/api/index.uts.js.map","references":[],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"index.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uts\"],\"names\":[],\"mappings\":\"OAGO,EAAE,GAAG,EAAE,IAAI,EAAE;AAEpB;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,OAAO,GAAG,CAAC,UAAU,CAAC,CAAA;AACvB,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAsB;IACjD,OAAO,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;AAC7B,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAW;IACxC,OAAO,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,OAAO,GAAG,CAAC,YAAY,CAAC,CAAA;AACzB,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAChC,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,OAAO,GAAG,CAAC,eAAe,CAAC,CAAA;AAC5B,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAoB;IACjD,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,OAAO,GAAG,CAAC,YAAY,CAAC,CAAA;AACzB,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAe;IAC1C,OAAO,IAAI,CAAC,iBAAiB,oBAAE,EAAE,MAAM,EAAE,MAAM,EAAmB,EAAC,CAAA;AACpE,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAe;IAC7C,OAAO,IAAI,CAAC,wBAAwB,oBAAE,EAAE,MAAM,EAAE,MAAM,EAAmB,EAAC,CAAA;AAC3E,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,OAAO,GAAG,CAAC,gBAAgB,CAAC,CAAA;AAC7B,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/152451553bd13cc2aa75a3754b4096295a65a123 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/152451553bd13cc2aa75a3754b4096295a65a123
new file mode 100644
index 0000000..e44c34c
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/152451553bd13cc2aa75a3754b4096295a65a123
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { o as _o, gei as _gei, sei as _sei, e as _e } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'before-after',\n props: {\n beforeImage: {},\n afterImage: {},\n showTitle: { type: Boolean }\n },\n setup(__props) {\n const props = __props;\n // 预览图片\n const previewImage = (url, type) => {\n const urls = type == 'before' ? [props.beforeImage] : [props.afterImage];\n uni.previewImage({\n current: url,\n urls: urls\n });\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _ctx.showTitle\n }, _ctx.showTitle ? {} : {}, {\n b: _ctx.beforeImage,\n c: _o($event => { return previewImage(_ctx.beforeImage, 'before'); }),\n d: _ctx.afterImage,\n e: _o($event => { return previewImage(_ctx.afterImage, 'after'); }),\n f: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/before-after/before-after.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.previewImage"],"map":"{\"version\":3,\"file\":\"before-after.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"before-after.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAA;AAGhE,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE;QACL,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KAC7B;IACD,KAAK,CAAC,OAAY;QAEnB,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,OAAO;QACP,MAAM,YAAY,GAAG,CAAC,GAAY,EAAE,IAAa;YAChD,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YACxE,GAAG,CAAC,YAAY,CAAC;gBAChB,OAAO,EAAE,GAAG;gBACZ,IAAI,EAAE,IAAI;aACV,CAAC,CAAA;QACH,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,CAAC,EAAE,IAAI,CAAC,SAAS;aAClB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3B,CAAC,EAAE,IAAI,CAAC,WAAW;gBACnB,CAAC,EAAE,EAAE,CAAC,MAAM,MAAI,OAAA,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAxC,CAAwC,CAAC;gBACzD,CAAC,EAAE,IAAI,CAAC,UAAU;gBAClB,CAAC,EAAE,EAAE,CAAC,MAAM,MAAI,OAAA,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAtC,CAAsC,CAAC;gBACvD,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;aAChC,CAAC,CAAA;YACA,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/18321a10d8c434d956f79bceab9bdf299338846d b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/18321a10d8c434d956f79bceab9bdf299338846d
new file mode 100644
index 0000000..38f96d4
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/18321a10d8c434d956f79bceab9bdf299338846d
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, toDisplayString as _toDisplayString, t as _t, resolveComponent as _resolveComponent, p as _p, f as _f, o as _o, gei as _gei, sei as _sei } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"section-header\":{\"name\":\"_easycom_section_header\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_section_header_1 = _resolveComponent(\"section-header\");\n (_easycom_section_header_1)();\n}\nimport _easycom_section_header from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue';\nif (!Math) {\n (_easycom_section_header)();\n}\nimport { getCompanyInfo } from \"@/api/index\";\nclass FeatureItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n title: { type: String, optional: false },\n desc: { type: String, optional: false }\n };\n },\n name: \"FeatureItem\"\n };\n }\n constructor(options, metadata = FeatureItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.title = this.__props__.title;\n this.desc = this.__props__.desc;\n delete this.__props__;\n }\n}\nclass CompanyInfo extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n name: { type: String, optional: false },\n slogan: { type: String, optional: false },\n description: { type: String, optional: false },\n phone: { type: String, optional: false },\n wechat: { type: String, optional: false },\n address: { type: String, optional: false },\n workTime: { type: String, optional: false },\n features: { type: UTS.UTSType.withGenerics(Array, [FeatureItem]), optional: false }\n };\n },\n name: \"CompanyInfo\"\n };\n }\n constructor(options, metadata = CompanyInfo.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.name = this.__props__.name;\n this.slogan = this.__props__.slogan;\n this.description = this.__props__.description;\n this.phone = this.__props__.phone;\n this.wechat = this.__props__.wechat;\n this.address = this.__props__.address;\n this.workTime = this.__props__.workTime;\n this.features = this.__props__.features;\n delete this.__props__;\n }\n}\n// 公司信息\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const companyInfo = ref(new CompanyInfo({\n name: '优艺家沙发翻新',\n slogan: '让旧沙发焕发新生',\n description: '',\n phone: '400-888-8888',\n wechat: 'youyijia2026',\n address: '',\n workTime: '',\n features: []\n }));\n // 获取公司信息\n const fetchCompanyInfo = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getCompanyInfo();\n const data = res.data;\n const featuresData = data['features'];\n const features = featuresData.map((item) => {\n return new FeatureItem({\n title: item['title'],\n desc: item['desc']\n });\n });\n companyInfo.value = new CompanyInfo({\n name: data['name'],\n slogan: data['slogan'],\n description: data['description'],\n phone: data['phone'],\n wechat: data['wechat'],\n address: data['address'],\n workTime: data['workTime'],\n features: features\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/about/index.uvue:148', '获取公司信息失败', e);\n }\n }); };\n // 拨打电话\n const callPhone = () => {\n uni.makePhoneCall({\n phoneNumber: companyInfo.value.phone,\n fail: () => {\n uni.showToast({\n title: '拨打电话失败',\n icon: 'none'\n });\n }\n });\n };\n // 复制微信号\n const copyWechat = () => {\n uni.setClipboardData({\n data: companyInfo.value.wechat,\n success: () => {\n uni.showToast({\n title: '微信号已复制',\n icon: 'success'\n });\n }\n });\n };\n // 打开位置\n const openLocation = () => {\n uni.openLocation({\n latitude: 31.2,\n longitude: 121.5,\n name: companyInfo.value.name,\n address: companyInfo.value.address,\n fail: () => {\n uni.showToast({\n title: '无法打开地图',\n icon: 'none'\n });\n }\n });\n };\n onLoad(() => {\n fetchCompanyInfo();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _t(_unref(companyInfo).name),\n b: _t(_unref(companyInfo).slogan),\n c: _p({\n title: '\\u516C\\u53F8\\u7B80\\u4ECB'\n }),\n d: _t(_unref(companyInfo).description),\n e: _p({\n title: '\\u6211\\u4EEC\\u7684\\u4F18\\u52BF'\n }),\n f: _f(_unref(companyInfo).features, (item, k0, i0) => {\n return {\n a: _t(item.title),\n b: _t(item.desc),\n c: item.title\n };\n }),\n g: _p({\n title: '\\u8054\\u7CFB\\u6211\\u4EEC'\n }),\n h: _t(_unref(companyInfo).phone),\n i: _o(callPhone),\n j: _t(_unref(companyInfo).wechat),\n k: _o(copyWechat),\n l: _t(_unref(companyInfo).address),\n m: _o(openLocation),\n n: _t(_unref(companyInfo).workTime),\n o: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/about/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue.ts"],"uniExtApis":["uni.__f__","uni.showToast","uni.makePhoneCall","uni.setClipboardData","uni.openLocation"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/1f20882143a2837e0f3e4e0738b00b1fca3207b8 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/1f20882143a2837e0f3e4e0738b00b1fca3207b8
new file mode 100644
index 0000000..3744b06
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/1f20882143a2837e0f3e4e0738b00b1fca3207b8
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, o as _o, toDisplayString as _toDisplayString, t as _t, f as _f, gei as _gei, sei as _sei, e as _e } from \"vue\";\nimport { submitBooking } from \"@/api/index\";\nimport { SOFA_CATEGORIES } from \"@/utils/config\";\nclass FormData extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n userName: { type: String, optional: false },\n phone: { type: String, optional: false },\n address: { type: String, optional: false },\n sofaType: { type: String, optional: false },\n problem: { type: String, optional: false }\n };\n },\n name: \"FormData\"\n };\n }\n constructor(options, metadata = FormData.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.userName = this.__props__.userName;\n this.phone = this.__props__.phone;\n this.address = this.__props__.address;\n this.sofaType = this.__props__.sofaType;\n this.problem = this.__props__.problem;\n delete this.__props__;\n }\n}\nclass SofaType extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false }\n };\n },\n name: \"SofaType\"\n };\n }\n constructor(options, metadata = SofaType.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n delete this.__props__;\n }\n}\n// 表单数据\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const formData = ref(new FormData({\n userName: '',\n phone: '',\n address: '',\n sofaType: '',\n problem: ''\n }));\n // 图片列表\n const imageList = ref([]);\n // 沙发类型列表\n const sofaTypes = ref([]);\n // 提交中\n const submitting = ref(false);\n // 初始化沙发类型\n const initSofaTypes = () => {\n sofaTypes.value = SOFA_CATEGORIES.filter((item) => { return item.id != 'all'; }).map((item) => {\n return new SofaType({\n id: item.id,\n name: item.name\n });\n });\n };\n // 选择沙发类型\n const selectSofaType = (id) => {\n formData.value.sofaType = id;\n };\n // 选择图片\n const chooseImage = () => {\n uni.chooseImage(new UTSJSONObject({\n count: 9 - imageList.value.length,\n sizeType: ['compressed'],\n sourceType: ['album', 'camera'],\n success: (res) => {\n imageList.value = [...imageList.value, ...res.tempFilePaths];\n }\n }));\n };\n // 删除图片\n const deleteImage = (index) => {\n imageList.value.splice(index, 1);\n };\n // 验证表单\n const validateForm = () => {\n if (formData.value.userName.trim() == '') {\n uni.showToast({\n title: '请输入您的姓名',\n icon: 'none'\n });\n return false;\n }\n const phone = formData.value.phone.trim();\n if (phone == '') {\n uni.showToast({\n title: '请输入联系电话',\n icon: 'none'\n });\n return false;\n }\n // 简单验证手机号\n if (phone.length != 11) {\n uni.showToast({\n title: '请输入正确的手机号',\n icon: 'none'\n });\n return false;\n }\n if (formData.value.address.trim() == '') {\n uni.showToast({\n title: '请输入您的地址',\n icon: 'none'\n });\n return false;\n }\n return true;\n };\n // 提交预约\n const handleSubmit = () => { return __awaiter(this, void 0, void 0, function* () {\n if (!validateForm())\n return Promise.resolve(null);\n if (submitting.value)\n return Promise.resolve(null);\n submitting.value = true;\n try {\n const data = new UTSJSONObject({\n userName: formData.value.userName,\n phone: formData.value.phone,\n address: formData.value.address,\n sofaType: formData.value.sofaType,\n problem: formData.value.problem,\n images: imageList.value\n });\n const res = yield submitBooking(data);\n const result = res.data;\n uni.showModal(new UTSJSONObject({\n title: '预约成功',\n content: result['message'],\n showCancel: false,\n success: () => {\n // 返回上一页或首页\n uni.navigateBack(new UTSJSONObject({\n fail: () => {\n uni.switchTab({\n url: '/pages/index/index'\n });\n }\n }));\n }\n }));\n }\n catch (e) {\n uni.__f__('error', 'at pages/booking/index.uvue:270', '提交预约失败', e);\n uni.showToast({\n title: '提交失败,请重试',\n icon: 'none'\n });\n }\n submitting.value = false;\n }); };\n onLoad(() => {\n initSofaTypes();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _unref(formData).userName,\n b: _o($event => { return _unref(formData).userName = $event.detail.value; }),\n c: _unref(formData).phone,\n d: _o($event => { return _unref(formData).phone = $event.detail.value; }),\n e: _unref(formData).address,\n f: _o($event => { return _unref(formData).address = $event.detail.value; }),\n g: _f(_unref(sofaTypes), (item, k0, i0) => {\n return {\n a: _t(item.name),\n b: _unref(formData).sofaType == item.id ? 1 : '',\n c: _unref(formData).sofaType == item.id ? 1 : '',\n d: item.id,\n e: _o($event => { return selectSofaType(item.id); }, item.id)\n };\n }),\n h: _unref(formData).problem,\n i: _o($event => { return _unref(formData).problem = $event.detail.value; }),\n j: _t(_unref(formData).problem.length),\n k: _f(_unref(imageList), (item, index, i0) => {\n return {\n a: item,\n b: _o($event => { return deleteImage(index); }, index),\n c: index\n };\n }),\n l: _unref(imageList).length < 9\n }, _unref(imageList).length < 9 ? {\n m: _o(chooseImage)\n } : {}, {\n n: _o(handleSubmit),\n o: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/booking/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.chooseImage","uni.showToast","uni.switchTab","uni.navigateBack","uni.showModal","uni.__f__"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/2925df6830c2e285931f193ced21f510359ccffc b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/2925df6830c2e285931f193ced21f510359ccffc
new file mode 100644
index 0000000..d914171
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/2925df6830c2e285931f193ced21f510359ccffc
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, toDisplayString as _toDisplayString, t as _t, o as _o, f as _f, resolveComponent as _resolveComponent, p as _p, gei as _gei, sei as _sei, e as _e } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"case-card\":{\"name\":\"_easycom_case_card\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_case_card_1 = _resolveComponent(\"case-card\");\n (_easycom_case_card_1)();\n}\nimport _easycom_case_card from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue';\nif (!Math) {\n (_easycom_case_card)();\n}\nimport { getCaseList } from \"@/api/index\";\nimport { SOFA_CATEGORIES, PAGE_SIZE } from \"@/utils/config\";\nclass CategoryItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false }\n };\n },\n name: \"CategoryItem\"\n };\n }\n constructor(options, metadata = CategoryItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n delete this.__props__;\n }\n}\nclass CaseItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n coverImage: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false }\n };\n },\n name: \"CaseItem\"\n };\n }\n constructor(options, metadata = CaseItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.coverImage = this.__props__.coverImage;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n delete this.__props__;\n }\n}\n// 分类列表\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'list',\n setup(__props) {\n const categories = ref([]);\n // 当前分类\n const currentCategory = ref('all');\n // 案例列表\n const caseList = ref([]);\n // 分页\n const page = ref(1);\n const total = ref(0);\n // 加载状态\n const loading = ref(false);\n const noMore = ref(false);\n // 初始化分类\n const initCategories = () => {\n categories.value = SOFA_CATEGORIES.map((item) => {\n return new CategoryItem({\n id: item.id,\n name: item.name\n });\n });\n };\n // 选择分类\n const selectCategory = (id) => {\n if (currentCategory.value == id)\n return null;\n currentCategory.value = id;\n page.value = 1;\n caseList.value = [];\n noMore.value = false;\n fetchCaseList();\n };\n // 获取案例列表\n const fetchCaseList = () => { return __awaiter(this, void 0, void 0, function* () {\n if (loading.value || noMore.value)\n return Promise.resolve(null);\n loading.value = true;\n try {\n const params = new UTSJSONObject({\n category: currentCategory.value,\n page: page.value,\n pageSize: PAGE_SIZE\n });\n const res = yield getCaseList(params);\n const data = res.data;\n const list = data['list'];\n total.value = data['total'];\n const newList = list.map((item) => {\n return new CaseItem({\n id: item['id'],\n title: item['title'],\n category: item['category'],\n categoryName: item['categoryName'],\n coverImage: item['coverImage'],\n material: item['material'],\n duration: item['duration'],\n price: item['price'],\n views: item['views'],\n likes: item['likes']\n });\n });\n if (page.value == 1) {\n caseList.value = newList;\n }\n else {\n caseList.value = [...caseList.value, ...newList];\n }\n if (caseList.value.length >= total.value) {\n noMore.value = true;\n }\n }\n catch (e) {\n uni.__f__('error', 'at pages/cases/list.uvue:159', '获取案例列表失败', e);\n }\n loading.value = false;\n }); };\n // 加载更多\n const loadMore = () => {\n if (!noMore.value && !loading.value) {\n page.value++;\n fetchCaseList();\n }\n };\n // 跳转详情\n const goToDetail = (id) => {\n uni.navigateTo({\n url: `/pages/cases/detail?id=${id}`\n });\n };\n onLoad(() => {\n initCategories();\n fetchCaseList();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _f(_unref(categories), (item, k0, i0) => {\n return {\n a: _t(item.name),\n b: _unref(currentCategory) == item.id ? 1 : '',\n c: _unref(currentCategory) == item.id ? 1 : '',\n d: item.id,\n e: _o($event => { return selectCategory(item.id); }, item.id)\n };\n }),\n b: _f(_unref(caseList), (item, k0, i0) => {\n return {\n a: item.id,\n b: _o(goToDetail, item.id),\n c: '15d594f8-0' + '-' + i0,\n d: _p({\n caseData: item\n })\n };\n }),\n c: _unref(loading)\n }, _unref(loading) ? {} : _unref(noMore) ? {} : {}, {\n d: _unref(noMore),\n e: !_unref(loading) && _unref(caseList).length == 0\n }, !_unref(loading) && _unref(caseList).length == 0 ? {} : {}, {\n f: _o(loadMore),\n g: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/cases/list.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue.ts"],"uniExtApis":["uni.__f__","uni.navigateTo"],"map":"{\"version\":3,\"file\":\"list.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"list.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/404512bcb3b40fb17aee1ce7b37ac55f1018a0fd b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/404512bcb3b40fb17aee1ce7b37ac55f1018a0fd
new file mode 100644
index 0000000..b702d66
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/404512bcb3b40fb17aee1ce7b37ac55f1018a0fd
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { resolveComponent as _resolveComponent, p as _p, unref as _unref, o as _o, f as _f, toDisplayString as _toDisplayString, t as _t, gei as _gei, sei as _sei } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"nav-bar\":{\"name\":\"_easycom_nav_bar\",\"type\":\"unknown\"},\"service-card\":{\"name\":\"_easycom_service_card\",\"type\":\"unknown\"},\"section-header\":{\"name\":\"_easycom_section_header\",\"type\":\"unknown\"},\"case-card\":{\"name\":\"_easycom_case_card\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_nav_bar_1 = _resolveComponent(\"nav-bar\");\n const _easycom_service_card_1 = _resolveComponent(\"service-card\");\n const _easycom_section_header_1 = _resolveComponent(\"section-header\");\n const _easycom_case_card_1 = _resolveComponent(\"case-card\");\n (_easycom_nav_bar_1 + _easycom_service_card_1 + _easycom_section_header_1 + _easycom_case_card_1)();\n}\nimport _easycom_nav_bar from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/nav-bar/nav-bar.uvue';\nimport _easycom_service_card from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/service-card/service-card.uvue';\nimport _easycom_section_header from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue';\nimport _easycom_case_card from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue';\nif (!Math) {\n (_easycom_nav_bar + _easycom_service_card + _easycom_section_header + _easycom_case_card)();\n}\nimport { getBanners, getHotCases } from \"@/api/index\";\nimport { SERVICE_TYPES } from \"@/utils/config\";\nclass BannerItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n image: { type: String, optional: false },\n title: { type: String, optional: false },\n link: { type: String, optional: false }\n };\n },\n name: \"BannerItem\"\n };\n }\n constructor(options, metadata = BannerItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.image = this.__props__.image;\n this.title = this.__props__.title;\n this.link = this.__props__.link;\n delete this.__props__;\n }\n}\nclass CaseItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n coverImage: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false }\n };\n },\n name: \"CaseItem\"\n };\n }\n constructor(options, metadata = CaseItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.coverImage = this.__props__.coverImage;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n delete this.__props__;\n }\n}\nclass ServiceType extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false },\n icon: { type: String, optional: false }\n };\n },\n name: \"ServiceType\"\n };\n }\n constructor(options, metadata = ServiceType.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n this.icon = this.__props__.icon;\n delete this.__props__;\n }\n}\nclass AdvantageItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n icon: { type: String, optional: false },\n title: { type: String, optional: false },\n desc: { type: String, optional: false }\n };\n },\n name: \"AdvantageItem\"\n };\n }\n constructor(options, metadata = AdvantageItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.icon = this.__props__.icon;\n this.title = this.__props__.title;\n this.desc = this.__props__.desc;\n delete this.__props__;\n }\n}\n// 轮播图数据\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const bannerList = ref([]);\n // 服务类型\n const serviceTypes = ref([]);\n // 热门案例\n const hotCases = ref([]);\n // 公司优势\n const advantages = ref([\n new AdvantageItem({ icon: '👨🔧', title: '专业团队', desc: '10年+经验' }),\n new AdvantageItem({ icon: '✅', title: '品质保证', desc: '质保2年' }),\n new AdvantageItem({ icon: '🚗', title: '上门服务', desc: '免费评估' }),\n new AdvantageItem({ icon: '💰', title: '价格透明', desc: '无隐形消费' })\n ]);\n // 初始化服务类型\n const initServiceTypes = () => {\n serviceTypes.value = SERVICE_TYPES.map((item) => {\n return new ServiceType({\n id: item.id,\n name: item.name,\n icon: item.icon\n });\n });\n };\n // 获取轮播图\n const fetchBanners = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getBanners();\n const data = res.data;\n bannerList.value = data.map((item) => {\n return new BannerItem({\n id: item['id'],\n image: item['image'],\n title: item['title'],\n link: item['link']\n });\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/index/index.uvue:174', '获取轮播图失败', e);\n }\n }); };\n // 获取热门案例\n const fetchHotCases = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getHotCases();\n const data = res.data;\n hotCases.value = data.map((item) => {\n return new CaseItem({\n id: item['id'],\n title: item['title'],\n category: item['category'],\n categoryName: item['categoryName'],\n coverImage: item['coverImage'],\n material: item['material'],\n duration: item['duration'],\n price: item['price'],\n views: item['views'],\n likes: item['likes']\n });\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/index/index.uvue:198', '获取热门案例失败', e);\n }\n }); };\n // 轮播图点击\n const handleBannerClick = (item) => {\n if (item.link != '') {\n uni.navigateTo({\n url: item.link,\n fail: () => {\n uni.switchTab({\n url: item.link\n });\n }\n });\n }\n };\n // 服务点击\n const handleServiceClick = (id) => {\n uni.switchTab({\n url: '/pages/service/index'\n });\n };\n // 查看更多案例\n const goToCaseList = () => {\n uni.switchTab({\n url: '/pages/cases/list'\n });\n };\n // 查看案例详情\n const goToCaseDetail = (id) => {\n uni.navigateTo({\n url: `/pages/cases/detail?id=${id}`\n });\n };\n // 去预约\n const goToBooking = () => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n onLoad(() => {\n initServiceTypes();\n fetchBanners();\n fetchHotCases();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _p({\n title: '\\u4F18\\u827A\\u5BB6\\u6C99\\u53D1\\u7FFB\\u65B0'\n }),\n b: _f(_unref(bannerList), (item, k0, i0) => {\n return {\n a: item.image,\n b: _o($event => { return handleBannerClick(item); }, item.id),\n c: item.id\n };\n }),\n c: _f(_unref(serviceTypes), (item, k0, i0) => {\n return {\n a: item.id,\n b: item.id,\n c: _o(handleServiceClick, item.id),\n d: '767a328a-1' + '-' + i0,\n e: _p({\n id: item.id,\n name: item.name,\n icon: item.icon\n })\n };\n }),\n d: _f(_unref(advantages), (item, k0, i0) => {\n return {\n a: _t(item.icon),\n b: _t(item.title),\n c: _t(item.desc),\n d: item.title\n };\n }),\n e: _o(goToCaseList),\n f: _p({\n title: '\\u70ED\\u95E8\\u6848\\u4F8B',\n showMore: true\n }),\n g: _f(_unref(hotCases), (item, k0, i0) => {\n return {\n a: item.id,\n b: _o(goToCaseDetail, item.id),\n c: '767a328a-3' + '-' + i0,\n d: _p({\n caseData: item\n })\n };\n }),\n h: _o(goToBooking),\n i: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/index/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/nav-bar/nav-bar.uvue.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/service-card/service-card.uvue.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue.ts"],"uniExtApis":["uni.__f__","uni.switchTab","uni.navigateTo"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/694ac2c4b1dfff8b3b673285d007a7e00eb8c0ee b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/694ac2c4b1dfff8b3b673285d007a7e00eb8c0ee
new file mode 100644
index 0000000..bc30c27
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/694ac2c4b1dfff8b3b673285d007a7e00eb8c0ee
@@ -0,0 +1 @@
+{"code":"/**\n * 项目配置文件\n */\n// 环境配置\nexport const ENV = new UTSJSONObject({\n // 开发环境\n development: new UTSJSONObject({\n baseUrl: 'http://localhost:3000/api',\n imageBaseUrl: 'http://localhost:3000'\n }),\n // 生产环境\n production: new UTSJSONObject({\n baseUrl: 'https://api.youyijia.com/api',\n imageBaseUrl: 'https://api.youyijia.com'\n })\n}\n// 当前环境 - 切换为 'production' 上线\n);\n// 当前环境 - 切换为 'production' 上线\nexport const currentEnv = 'development';\n// 获取当前环境配置\nexport const getEnvConfig = () => {\n if (currentEnv == 'production') {\n return new UTSJSONObject({\n baseUrl: ENV.production.baseUrl,\n imageBaseUrl: ENV.production.imageBaseUrl\n });\n }\n return new UTSJSONObject({\n baseUrl: ENV.development.baseUrl,\n imageBaseUrl: ENV.development.imageBaseUrl\n });\n};\n// 是否使用Mock数据\nexport const useMock = true;\n// 分页配置\nexport const PAGE_SIZE = 10;\n// 图片上传配置\nexport const UPLOAD_CONFIG = new UTSJSONObject({\n maxSize: 5 * 1024 * 1024,\n maxCount: 9,\n accept: ['image/jpeg', 'image/png', 'image/gif']\n}\n// 缓存Key\n);\n// 缓存Key\nexport const STORAGE_KEYS = new UTSJSONObject({\n TOKEN: 'user_token',\n USER_INFO: 'user_info',\n FAVORITES: 'user_favorites',\n SEARCH_HISTORY: 'search_history'\n}\n// 沙发分类\n);\n// 沙发分类\nexport const SOFA_CATEGORIES = [\n new UTSJSONObject({ id: 'all', name: '全部' }),\n new UTSJSONObject({ id: 'leather', name: '皮沙发' }),\n new UTSJSONObject({ id: 'fabric', name: '布艺沙发' }),\n new UTSJSONObject({ id: 'functional', name: '功能沙发' }),\n new UTSJSONObject({ id: 'antique', name: '古典沙发' }),\n new UTSJSONObject({ id: 'office', name: '办公沙发' })\n];\n// 翻新服务类型\nexport const SERVICE_TYPES = [\n new UTSJSONObject({ id: 'repair', name: '局部修复', icon: '/static/icons/repair.png' }),\n new UTSJSONObject({ id: 'recolor', name: '改色翻新', icon: '/static/icons/recolor.png' }),\n new UTSJSONObject({ id: 'refurbish', name: '整体翻新', icon: '/static/icons/refurbish.png' }),\n new UTSJSONObject({ id: 'custom', name: '定制换皮', icon: '/static/icons/custom.png' })\n];\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/utils/config.uts.js.map","references":[],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"config.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"config.uts\"],\"names\":[],\"mappings\":\"AAAA;;GAEG;AAEH,OAAO;AACP,MAAM,CAAC,MAAM,GAAG,qBAAG;IAClB,OAAO;IACP,WAAW,oBAAE;QACZ,OAAO,EAAE,2BAA2B;QACpC,YAAY,EAAE,uBAAuB;KACrC,CAAA;IACD,OAAO;IACP,UAAU,oBAAE;QACX,OAAO,EAAE,8BAA8B;QACvC,YAAY,EAAE,0BAA0B;KACxC,CAAA;CACD;AAED,6BAA6B;CAF5B,CAAA;AAED,6BAA6B;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAA;AAEvC,WAAW;AACX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,IAAI,UAAU,IAAI,YAAY,EAAE;QAC/B,yBAAO;YACN,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO;YAC/B,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,YAAY;SACxB,EAAA;KAClB;IACD,yBAAO;QACN,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,OAAO;QAChC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,YAAY;KACzB,EAAA;AACnB,CAAC,CAAA;AAED,aAAa;AACb,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAA;AAE3B,OAAO;AACP,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAA;AAE3B,SAAS;AACT,MAAM,CAAC,MAAM,aAAa,qBAAG;IAC5B,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IACxB,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC;CAChD;AAED,QAAQ;CAFP,CAAA;AAED,QAAQ;AACR,MAAM,CAAC,MAAM,YAAY,qBAAG;IAC3B,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,gBAAgB;IAC3B,cAAc,EAAE,gBAAgB;CAChC;AAED,OAAO;CAFN,CAAA;AAED,OAAO;AACP,MAAM,CAAC,MAAM,eAAe,GAAG;sBAC9B,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;sBACzB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;sBAC9B,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;sBAC9B,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE;sBAClC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;sBAC/B,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;CAC9B,CAAA;AAED,SAAS;AACT,MAAM,CAAC,MAAM,aAAa,GAAG;sBAC5B,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE;sBAChE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;sBAClE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE;sBACtE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAChE,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/75990f3808ed5b787ba8c01c69f145a9e26d7223 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/75990f3808ed5b787ba8c01c69f145a9e26d7223
new file mode 100644
index 0000000..abace3c
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/75990f3808ed5b787ba8c01c69f145a9e26d7223
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'service-card',\n props: {\n id: {},\n name: {},\n icon: {}\n },\n emits: [\"click\"],\n setup(__props, _a) {\n var __emit = _a.emit;\n const props = __props;\n const emit = __emit;\n const handleClick = () => {\n emit('click', props.id);\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _ctx.icon,\n b: _t(_ctx.name),\n c: _sei(_gei(_ctx, ''), 'view'),\n d: _o(handleClick)\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/service-card/service-card.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"service-card.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"service-card.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,CAAA;AAGrG,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE;QACL,EAAE,EAAE,EAAE;QACN,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;KACT;IACD,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,KAAK,CAAC,OAAY,EAAE,EAAgB;YAAR,MAAM,UAAA;QAEnC,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,MAAM,WAAW,GAAG;YACnB,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG;gBACrB,CAAC,EAAE,IAAI,CAAC,IAAI;gBACZ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;gBAC/B,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;aACnB,CAAA;YACC,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/7c13045b87c02c60f99dff26290480004448847f b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/7c13045b87c02c60f99dff26290480004448847f
new file mode 100644
index 0000000..6cba976
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/7c13045b87c02c60f99dff26290480004448847f
@@ -0,0 +1 @@
+{"code":"import {} from \"vue\";\nexport default defineComponent({\n onLaunch() {\n uni.__f__('log', 'at App.uvue:7', 'App Launch');\n },\n onShow() {\n uni.__f__('log', 'at App.uvue:10', 'App Show');\n },\n onHide() {\n uni.__f__('log', 'at App.uvue:13', 'App Hide');\n },\n onExit() {\n uni.__f__('log', 'at App.uvue:34', 'App Exit');\n },\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/App.uvue?vue&type=script&lang.uts.js.map","references":[],"uniExtApis":["uni.__f__"],"map":"{\"version\":3,\"file\":\"App.uvue?vue&type=script&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"App.uvue?vue&type=script&lang.uts\"],\"names\":[],\"mappings\":\";AAIC,+BAAe;IACd,QAAQ;QACP,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,eAAe,EAAC,YAAY,CAAC,CAAA;IAC9C,CAAC;IACD,MAAM;QACL,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM;QACL,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;IAmBD,MAAM;QACL,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,gBAAgB,EAAC,UAAU,CAAC,CAAA;IAC7C,CAAC;CACD,EAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/8c18e740dbb3c9f8136db47026b4ded95dd11703 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/8c18e740dbb3c9f8136db47026b4ded95dd11703
new file mode 100644
index 0000000..780fb52
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/8c18e740dbb3c9f8136db47026b4ded95dd11703
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, o as _o, toDisplayString as _toDisplayString, t as _t, e as _e } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'nav-bar',\n props: {\n title: {},\n showBack: { type: Boolean },\n titleColor: {},\n bgColor: {}\n },\n setup(__props) {\n const props = __props;\n // 状态栏高度\n const statusBarHeight = ref(20);\n // 导航栏高度\n const navBarHeight = ref(44);\n onMounted(() => {\n const sysInfo = uni.getSystemInfoSync();\n statusBarHeight.value = sysInfo.statusBarHeight;\n const menuButtonInfo = uni.getMenuButtonBoundingClientRect();\n navBarHeight.value = (menuButtonInfo.top - sysInfo.statusBarHeight) * 2 + menuButtonInfo.height;\n });\n const handleBack = () => {\n uni.navigateBack(new UTSJSONObject({\n fail: () => {\n uni.switchTab({\n url: '/pages/index/index'\n });\n }\n }));\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _ctx.showBack\n }, _ctx.showBack ? {\n b: _o(handleBack)\n } : {}, {\n c: _t(_ctx.title),\n d: _ctx.titleColor,\n e: _unref(navBarHeight) + 'px',\n f: _unref(statusBarHeight) + 'px',\n g: _unref(statusBarHeight) + _unref(navBarHeight) + 'px'\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/nav-bar/nav-bar.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.getSystemInfoSync","uni.getMenuButtonBoundingClientRect","uni.switchTab","uni.navigateBack"],"map":"{\"version\":3,\"file\":\"nav-bar.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"nav-bar.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAA;AAGrG,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE;QACL,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QAC3B,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,EAAE;KACZ;IACD,KAAK,CAAC,OAAY;QAEnB,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,QAAQ;QACR,MAAM,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,QAAQ;QACR,MAAM,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;QAE5B,SAAS,CAAC;YACT,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAA;YACvC,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC,eAAe,CAAA;YAE/C,MAAM,cAAc,GAAG,GAAG,CAAC,+BAA+B,EAAE,CAAA;YAC5D,YAAY,CAAC,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAA;QAEhG,CAAC,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG;YAClB,GAAG,CAAC,YAAY,mBAAC;gBAChB,IAAI,EAAE;oBACL,GAAG,CAAC,SAAS,CAAC;wBACb,GAAG,EAAE,oBAAoB;qBACzB,CAAC,CAAA;gBACH,CAAC;aACD,EAAC,CAAA;QACH,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,CAAC,EAAE,IAAI,CAAC,QAAQ;aACjB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjB,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;aAClB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACN,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjB,CAAC,EAAE,IAAI,CAAC,UAAU;gBAClB,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI;gBAC9B,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI;gBACjC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI;aACzD,CAAC,CAAA;YACA,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/9f72df530b76c5b2923ac56b4159fec5ef6d1d11 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/9f72df530b76c5b2923ac56b4159fec5ef6d1d11
new file mode 100644
index 0000000..3326f3b
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/9f72df530b76c5b2923ac56b4159fec5ef6d1d11
@@ -0,0 +1 @@
+{"code":"/**\n * Mock数据 - 开发阶段使用\n * 后端开发完成后可关闭\n */\n// 轮播图数据\nconst bannerList = [\n new UTSJSONObject({\n id: '1',\n image: '/static/mock/banner1.svg',\n title: '专业沙发翻新服务',\n link: '/pages/service/index'\n }),\n new UTSJSONObject({\n id: '2',\n image: '/static/mock/banner2.svg',\n title: '十年品质保证',\n link: '/pages/about/index'\n }),\n new UTSJSONObject({\n id: '3',\n image: '/static/mock/banner3.svg',\n title: '免费上门评估',\n link: '/pages/booking/index'\n })\n];\n// 案例数据\nconst caseList = [\n new UTSJSONObject({\n id: '1',\n title: '欧式真皮沙发翻新',\n category: 'leather',\n categoryName: '皮沙发',\n beforeImages: ['/static/mock/case1-before.svg'],\n afterImages: ['/static/mock/case1-after.svg'],\n coverImage: '/static/mock/case1-after.svg',\n description: '这款欧式真皮沙发使用多年后出现皮面老化、褪色问题,经过我们专业的翻新处理,焕然一新。采用进口头层牛皮,色泽均匀,手感细腻。',\n material: '进口头层牛皮',\n duration: '7天',\n price: '¥3800',\n views: 1256,\n likes: 89,\n createTime: '2026-01-15'\n }),\n new UTSJSONObject({\n id: '2',\n title: '现代简约布艺沙发翻新',\n category: 'fabric',\n categoryName: '布艺沙发',\n beforeImages: ['/static/mock/case2-before.svg'],\n afterImages: ['/static/mock/case2-after.svg'],\n coverImage: '/static/mock/case2-after.svg',\n description: '布艺沙发使用时间长了容易脏污、起球,这款沙发经过整体换布处理,选用高品质科技布,防水防污,易于打理。',\n material: '高品质科技布',\n duration: '5天',\n price: '¥2200',\n views: 986,\n likes: 67,\n createTime: '2026-01-12'\n }),\n new UTSJSONObject({\n id: '3',\n title: '美式复古沙发改色翻新',\n category: 'leather',\n categoryName: '皮沙发',\n beforeImages: ['/static/mock/case3-before.svg'],\n afterImages: ['/static/mock/case3-after.svg'],\n coverImage: '/static/mock/case3-after.svg',\n description: '客户希望将原本深棕色的沙发改为更现代的米白色,我们采用专业改色工艺,色泽持久不脱落,触感保持柔软。',\n material: '专业皮革改色',\n duration: '6天',\n price: '¥2800',\n views: 756,\n likes: 45,\n createTime: '2026-01-10'\n }),\n new UTSJSONObject({\n id: '4',\n title: '功能沙发维修翻新',\n category: 'functional',\n categoryName: '功能沙发',\n beforeImages: ['/static/mock/case4-before.svg'],\n afterImages: ['/static/mock/case4-after.svg'],\n coverImage: '/static/mock/case4-after.svg',\n description: '功能沙发的电动机构出现故障,同时皮面也有磨损。我们更换了电机和控制系统,并对皮面进行了局部修复。',\n material: '原装配件+局部修复',\n duration: '4天',\n price: '¥1800',\n views: 623,\n likes: 38,\n createTime: '2026-01-08'\n }),\n new UTSJSONObject({\n id: '5',\n title: '中式红木沙发垫翻新',\n category: 'antique',\n categoryName: '古典沙发',\n beforeImages: ['/static/mock/case5-before.svg'],\n afterImages: ['/static/mock/case5-after.svg'],\n coverImage: '/static/mock/case5-after.svg',\n description: '红木沙发的坐垫和靠垫使用多年已经塌陷变形,我们重新填充高密度海绵,并更换了丝绸面料,古典韵味十足。',\n material: '高密度海绵+丝绸面料',\n duration: '5天',\n price: '¥2500',\n views: 512,\n likes: 32,\n createTime: '2026-01-05'\n }),\n new UTSJSONObject({\n id: '6',\n title: '办公室皮沙发组合翻新',\n category: 'office',\n categoryName: '办公沙发',\n beforeImages: ['/static/mock/case6-before.svg'],\n afterImages: ['/static/mock/case6-after.svg'],\n coverImage: '/static/mock/case6-after.svg',\n description: '企业办公室的沙发组合整体翻新,包括一套3+1+1沙发。采用耐磨商务皮革,简约大气,提升企业形象。',\n material: '商务耐磨皮革',\n duration: '10天',\n price: '¥8800',\n views: 445,\n likes: 28,\n createTime: '2026-01-02'\n })\n];\n// 服务流程数据\nconst serviceProcess = [\n new UTSJSONObject({\n step: 1,\n title: '在线预约',\n description: '通过小程序或电话预约上门服务',\n icon: '/static/icons/step1.png'\n }),\n new UTSJSONObject({\n step: 2,\n title: '上门评估',\n description: '专业师傅免费上门查看沙发状况',\n icon: '/static/icons/step2.png'\n }),\n new UTSJSONObject({\n step: 3,\n title: '方案报价',\n description: '根据沙发情况提供翻新方案和报价',\n icon: '/static/icons/step3.png'\n }),\n new UTSJSONObject({\n step: 4,\n title: '确认订单',\n description: '确认方案后签订服务合同',\n icon: '/static/icons/step4.png'\n }),\n new UTSJSONObject({\n step: 5,\n title: '专业翻新',\n description: '工厂或上门进行专业翻新作业',\n icon: '/static/icons/step5.png'\n }),\n new UTSJSONObject({\n step: 6,\n title: '验收交付',\n description: '翻新完成后客户验收,满意付款',\n icon: '/static/icons/step6.png'\n })\n];\n// 公司信息\nconst companyInfo = new UTSJSONObject({\n name: '优艺家沙发翻新',\n slogan: '让旧沙发焕发新生',\n description: '优艺家是一家专业从事沙发翻新、维修、改色的服务公司,拥有十余年行业经验。我们秉承\"品质至上、客户第一\"的服务理念,为千家万户提供专业的沙发翻新服务。',\n phone: '400-888-8888',\n wechat: 'youyijia2026',\n address: '上海市浦东新区张江高科技园区',\n workTime: '周一至周日 9:00-18:00',\n features: [\n new UTSJSONObject({ title: '专业团队', desc: '10年+从业经验' }),\n new UTSJSONObject({ title: '品质保证', desc: '质保期内免费维护' }),\n new UTSJSONObject({ title: '上门服务', desc: '免费上门评估' }),\n new UTSJSONObject({ title: '价格透明', desc: '无隐形消费' })\n ]\n}\n/**\n * 获取Mock数据\n */\n);\n/**\n * 获取Mock数据\n */\nexport const getMockData = (url, method, params = null) => {\n var _a, _b;\n // 轮播图\n if (url == '/banners') {\n return bannerList;\n }\n // 案例列表\n if (url == '/cases' && method == 'GET') {\n const category = params === null || params === void 0 ? null : params['category'];\n const page = ((_a = params === null || params === void 0 ? null : params['page']) !== null && _a !== void 0 ? _a : 1);\n const pageSize = ((_b = params === null || params === void 0 ? null : params['pageSize']) !== null && _b !== void 0 ? _b : 10);\n let filteredList = caseList;\n if (category != null && category != '' && category != 'all') {\n filteredList = caseList.filter((item) => { return item.category == category; });\n }\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n const list = filteredList.slice(start, end);\n return new UTSJSONObject({\n list: list,\n total: filteredList.length,\n page: page,\n pageSize: pageSize\n });\n }\n // 案例详情\n if (url.startsWith('/cases/') && method == 'GET') {\n const id = url.replace('/cases/', '');\n const caseItem = UTS.arrayFind(caseList, (item) => { return item.id == id; });\n return caseItem;\n }\n // 热门案例\n if (url == '/cases/hot') {\n return caseList.slice(0, 4);\n }\n // 服务流程\n if (url == '/service/process') {\n return serviceProcess;\n }\n // 公司信息\n if (url == '/company/info') {\n return companyInfo;\n }\n // 提交预约\n if (url == '/booking' && method == 'POST') {\n return new UTSJSONObject({\n bookingId: 'BK' + Date.now().toString(),\n status: 'pending',\n message: '预约成功,我们会尽快与您联系'\n });\n }\n return null;\n};\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/utils/mock.uts.js.map","references":[],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"mock.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"mock.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/c52bb86f08c58eec980d4b33c0241ce0aca87aa3 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/c52bb86f08c58eec980d4b33c0241ce0aca87aa3
new file mode 100644
index 0000000..3fa0d61
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/c52bb86f08c58eec980d4b33c0241ce0aca87aa3
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei, e as _e } from \"vue\";\nimport { STORAGE_KEYS } from \"@/utils/config\";\nclass UserInfo extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n nickName: { type: String, optional: false },\n avatar: { type: String, optional: false },\n phone: { type: String, optional: false }\n };\n },\n name: \"UserInfo\"\n };\n }\n constructor(options, metadata = UserInfo.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.nickName = this.__props__.nickName;\n this.avatar = this.__props__.avatar;\n this.phone = this.__props__.phone;\n delete this.__props__;\n }\n}\n// 用户信息\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const userInfo = ref(new UserInfo({\n id: '',\n nickName: '',\n avatar: '',\n phone: ''\n }));\n // 是否登录\n const isLoggedIn = ref(false);\n // 预约数量\n const bookingCount = ref(0);\n // 收藏数量\n const favoriteCount = ref(0);\n // 缓存大小\n const cacheSize = ref('0KB');\n // 检查登录状态\n const checkLoginStatus = () => {\n var _a, _b, _c, _d;\n const token = uni.getStorageSync(STORAGE_KEYS.TOKEN);\n isLoggedIn.value = token != '';\n if (isLoggedIn.value) {\n // 获取用户信息\n const info = uni.getStorageSync(STORAGE_KEYS.USER_INFO);\n if (info != null) {\n userInfo.value = new UserInfo({\n id: ((_a = info['id']) !== null && _a !== void 0 ? _a : ''),\n nickName: ((_b = info['nickName']) !== null && _b !== void 0 ? _b : ''),\n avatar: ((_c = info['avatar']) !== null && _c !== void 0 ? _c : ''),\n phone: ((_d = info['phone']) !== null && _d !== void 0 ? _d : '')\n });\n }\n }\n };\n // 获取缓存大小\n const getCacheSize = () => {\n uni.getStorageInfo(new UTSJSONObject({\n success: (res) => {\n const size = res.currentSize;\n if (size < 1024) {\n cacheSize.value = `${size}KB`;\n }\n else {\n cacheSize.value = `${(size / 1024).toFixed(2)}MB`;\n }\n }\n }));\n };\n // 登录\n const handleLogin = () => {\n uni.getUserProfile(new UTSJSONObject({\n desc: '用于完善用户资料',\n success: (res = null) => {\n userInfo.value = new UserInfo({\n id: '',\n nickName: res.userInfo.nickName,\n avatar: res.userInfo.avatarUrl,\n phone: ''\n }\n // 保存用户信息\n );\n // 保存用户信息\n uni.setStorageSync(STORAGE_KEYS.USER_INFO, new UTSJSONObject({\n nickName: res.userInfo.nickName,\n avatar: res.userInfo.avatarUrl\n }));\n uni.setStorageSync(STORAGE_KEYS.TOKEN, 'mock_token_' + Date.now().toString());\n isLoggedIn.value = true;\n uni.showToast({\n title: '登录成功',\n icon: 'success'\n });\n },\n fail: () => {\n uni.showToast({\n title: '登录失败',\n icon: 'none'\n });\n }\n }));\n };\n // 退出登录\n const handleLogout = () => {\n uni.showModal(new UTSJSONObject({\n title: '提示',\n content: '确定要退出登录吗?',\n success: (res) => {\n if (res.confirm) {\n uni.removeStorageSync(STORAGE_KEYS.TOKEN);\n uni.removeStorageSync(STORAGE_KEYS.USER_INFO);\n isLoggedIn.value = false;\n userInfo.value = new UserInfo({\n id: '',\n nickName: '',\n avatar: '',\n phone: ''\n });\n uni.showToast({\n title: '已退出登录',\n icon: 'success'\n });\n }\n }\n }));\n };\n // 跳转预约列表\n const goToBookingList = () => {\n uni.showToast({\n title: '功能开发中',\n icon: 'none'\n });\n };\n // 跳转收藏列表\n const goToFavorites = () => {\n uni.showToast({\n title: '功能开发中',\n icon: 'none'\n });\n };\n // 关于我们\n const goToAbout = () => {\n uni.navigateTo({\n url: '/pages/about/index'\n });\n };\n // 联系客服\n const callService = () => {\n uni.makePhoneCall({\n phoneNumber: '400-888-8888',\n fail: () => {\n uni.showToast({\n title: '拨打电话失败',\n icon: 'none'\n });\n }\n });\n };\n // 意见反馈\n const openFeedback = () => {\n // 微信小程序可以使用feedback\n uni.showToast({\n title: '功能开发中',\n icon: 'none'\n });\n };\n // 检查更新\n const checkUpdate = () => {\n uni.showToast({\n title: '已是最新版本',\n icon: 'success'\n });\n };\n // 清除缓存\n const clearCache = () => {\n uni.showModal(new UTSJSONObject({\n title: '提示',\n content: '确定要清除缓存吗?',\n success: (res) => {\n if (res.confirm) {\n uni.clearStorage(new UTSJSONObject({\n success: () => {\n cacheSize.value = '0KB';\n uni.showToast({\n title: '清除成功',\n icon: 'success'\n });\n }\n }));\n }\n }\n }));\n };\n onShow(() => {\n checkLoginStatus();\n getCacheSize();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _unref(userInfo).avatar || '/static/images/default-avatar.png',\n b: _t(_unref(userInfo).nickName || '点击登录'),\n c: _unref(userInfo).phone\n }, _unref(userInfo).phone ? {\n d: _t(_unref(userInfo).phone)\n } : {}, {\n e: !_unref(isLoggedIn)\n }, !_unref(isLoggedIn) ? {\n f: _o(handleLogin)\n } : {}, {\n g: _unref(bookingCount) > 0\n }, _unref(bookingCount) > 0 ? {\n h: _t(_unref(bookingCount))\n } : {}, {\n i: _o(goToBookingList),\n j: _unref(favoriteCount) > 0\n }, _unref(favoriteCount) > 0 ? {\n k: _t(_unref(favoriteCount))\n } : {}, {\n l: _o(goToFavorites),\n m: _o(goToAbout),\n n: _o(callService),\n o: _o(openFeedback),\n p: _o(checkUpdate),\n q: _t(_unref(cacheSize)),\n r: _o(clearCache),\n s: _unref(isLoggedIn)\n }, _unref(isLoggedIn) ? {\n t: _o(handleLogout)\n } : {}, {\n v: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/user/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":["uni.getStorageSync","uni.getStorageInfo","uni.setStorageSync","uni.showToast","uni.getUserProfile","uni.removeStorageSync","uni.showModal","uni.navigateTo","uni.makePhoneCall","uni.clearStorage"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/c8ca354b6903842c1b702b6197f5528bba7da9da b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/c8ca354b6903842c1b702b6197f5528bba7da9da
new file mode 100644
index 0000000..49e4afa
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/c8ca354b6903842c1b702b6197f5528bba7da9da
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { resolveComponent as _resolveComponent, p as _p, unref as _unref, toDisplayString as _toDisplayString, t as _t, o as _o, f as _f, gei as _gei, sei as _sei, e as _e } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"section-header\":{\"name\":\"_easycom_section_header\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_section_header_1 = _resolveComponent(\"section-header\");\n (_easycom_section_header_1)();\n}\nimport _easycom_section_header from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue';\nif (!Math) {\n (_easycom_section_header)();\n}\nimport { getServiceProcess } from \"@/api/index\";\nclass ServiceType extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n name: { type: String, optional: false },\n desc: { type: String, optional: false },\n emoji: { type: String, optional: false }\n };\n },\n name: \"ServiceType\"\n };\n }\n constructor(options, metadata = ServiceType.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.name = this.__props__.name;\n this.desc = this.__props__.desc;\n this.emoji = this.__props__.emoji;\n delete this.__props__;\n }\n}\nclass ProcessItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n step: { type: Number, optional: false },\n title: { type: String, optional: false },\n description: { type: String, optional: false }\n };\n },\n name: \"ProcessItem\"\n };\n }\n constructor(options, metadata = ProcessItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.step = this.__props__.step;\n this.title = this.__props__.title;\n this.description = this.__props__.description;\n delete this.__props__;\n }\n}\nclass MaterialItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n name: { type: String, optional: false },\n price: { type: String, optional: false },\n desc: { type: String, optional: false },\n tags: { type: UTS.UTSType.withGenerics(Array, [String]), optional: false }\n };\n },\n name: \"MaterialItem\"\n };\n }\n constructor(options, metadata = MaterialItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.name = this.__props__.name;\n this.price = this.__props__.price;\n this.desc = this.__props__.desc;\n this.tags = this.__props__.tags;\n delete this.__props__;\n }\n}\nclass FaqItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n question: { type: String, optional: false },\n answer: { type: String, optional: false },\n expanded: { type: Boolean, optional: false }\n };\n },\n name: \"FaqItem\"\n };\n }\n constructor(options, metadata = FaqItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.question = this.__props__.question;\n this.answer = this.__props__.answer;\n this.expanded = this.__props__.expanded;\n delete this.__props__;\n }\n}\n// 服务类型数据\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'index',\n setup(__props) {\n const serviceTypes = ref([\n new ServiceType({ id: 'repair', name: '局部修复', desc: '破损、划痕修复', emoji: '🔧' }),\n new ServiceType({ id: 'recolor', name: '改色翻新', desc: '皮面改色换新', emoji: '🎨' }),\n new ServiceType({ id: 'refurbish', name: '整体翻新', desc: '全面翻新升级', emoji: '✨' }),\n new ServiceType({ id: 'custom', name: '定制换皮', desc: '个性化定制', emoji: '💎' })\n ]);\n // 服务流程\n const processList = ref([]);\n // 材质说明\n const materials = ref([\n new MaterialItem({\n name: '头层牛皮',\n price: '¥800-1500/平',\n desc: '采用进口头层牛皮,质地柔软,透气性好,使用寿命长',\n tags: ['进口原料', '透气舒适', '耐用耐磨']\n }),\n new MaterialItem({\n name: '二层牛皮',\n price: '¥400-800/平',\n desc: '经济实惠的选择,经过特殊处理后外观与头层相近',\n tags: ['性价比高', '外观精美', '易打理']\n }),\n new MaterialItem({\n name: '科技布',\n price: '¥200-500/平',\n desc: '新型环保面料,防水防污,清洁方便,触感舒适',\n tags: ['防水防污', '易清洁', '环保健康']\n }),\n new MaterialItem({\n name: '棉麻布艺',\n price: '¥150-400/平',\n desc: '天然面料,透气舒适,适合追求自然风格的客户',\n tags: ['天然环保', '透气清爽', '风格多样']\n })\n ]);\n // 常见问题\n const faqList = ref([\n new FaqItem({\n question: '翻新需要多长时间?',\n answer: '根据沙发的大小和翻新程度不同,一般需要3-10个工作日。局部修复1-3天,整体翻新5-10天。',\n expanded: false\n }),\n new FaqItem({\n question: '翻新后能保证多久?',\n answer: '我们提供2年质保服务,质保期内如有非人为损坏,免费维修。头层牛皮正常使用可达10年以上。',\n expanded: false\n }),\n new FaqItem({\n question: '可以上门取送吗?',\n answer: '是的,我们提供免费上门取送服务(市区范围内),郊区会收取少量运输费用。',\n expanded: false\n }),\n new FaqItem({\n question: '如何报价?',\n answer: '我们提供免费上门评估服务,师傅会根据沙发的实际情况给出详细报价,价格透明无隐形消费。',\n expanded: false\n }),\n new FaqItem({\n question: '定金和尾款如何支付?',\n answer: '确认订单后支付30%定金,翻新完成验收满意后支付尾款。支持微信、支付宝、银行转账等多种方式。',\n expanded: false\n })\n ]);\n // 获取服务流程\n const fetchServiceProcess = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getServiceProcess();\n const data = res.data;\n processList.value = data.map((item) => {\n return new ProcessItem({\n step: item['step'],\n title: item['title'],\n description: item['description']\n });\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/service/index.uvue:217', '获取服务流程失败', e);\n }\n }); };\n // 切换FAQ展开\n const toggleFaq = (index) => {\n faqList.value[index].expanded = !faqList.value[index].expanded;\n };\n // 服务点击\n const handleServiceClick = (item) => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n // 去预约\n const goToBooking = () => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n onLoad(() => {\n fetchServiceProcess();\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _p({\n title: '\\u670D\\u52A1\\u7C7B\\u578B'\n }),\n b: _f(_unref(serviceTypes), (item, k0, i0) => {\n return {\n a: _t(item.emoji),\n b: _t(item.name),\n c: _t(item.desc),\n d: item.id,\n e: _o($event => { return handleServiceClick(item); }, item.id)\n };\n }),\n c: _p({\n title: '\\u670D\\u52A1\\u6D41\\u7A0B'\n }),\n d: _f(_unref(processList), (item, index, i0) => {\n return _e({\n a: _t(item.step),\n b: _t(item.title),\n c: _t(item.description),\n d: index < _unref(processList).length - 1\n }, index < _unref(processList).length - 1 ? {} : {}, {\n e: item.step\n });\n }),\n e: _p({\n title: '\\u6750\\u8D28\\u8BF4\\u660E'\n }),\n f: _f(_unref(materials), (item, k0, i0) => {\n return {\n a: _t(item.name),\n b: _t(item.price),\n c: _t(item.desc),\n d: _f(item.tags, (tag, k1, i1) => {\n return {\n a: _t(tag),\n b: tag\n };\n }),\n e: item.name\n };\n }),\n g: _p({\n title: '\\u5E38\\u89C1\\u95EE\\u9898'\n }),\n h: _f(_unref(faqList), (item, index, i0) => {\n return _e({\n a: _t(item.question),\n b: _t(item.expanded ? '−' : '+'),\n c: item.expanded\n }, item.expanded ? {\n d: _t(item.answer)\n } : {}, {\n e: index,\n f: _o($event => { return toggleFaq(index); }, index)\n });\n }),\n i: _o(goToBooking),\n j: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/service/index.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue.ts"],"uniExtApis":["uni.__f__","uni.navigateTo"],"map":"{\"version\":3,\"file\":\"index.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"index.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/e87e6f0ff4ed1406279f0aadf0c5adfaef60ebdf b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/e87e6f0ff4ed1406279f0aadf0c5adfaef60ebdf
new file mode 100644
index 0000000..2398721
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/e87e6f0ff4ed1406279f0aadf0c5adfaef60ebdf
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei } from \"vue\";\nclass CaseItem extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n coverImage: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false }\n };\n },\n name: \"CaseItem\"\n };\n }\n constructor(options, metadata = CaseItem.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.coverImage = this.__props__.coverImage;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n delete this.__props__;\n }\n}\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'case-card',\n props: {\n caseData: {}\n },\n emits: [\"click\"],\n setup(__props, _a) {\n var __emit = _a.emit;\n // 定义Props类型\n const props = __props;\n const emit = __emit;\n const handleClick = () => {\n emit('click', props.caseData.id);\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _ctx.caseData.coverImage,\n b: _t(_ctx.caseData.categoryName),\n c: _t(_ctx.caseData.title),\n d: _t(_ctx.caseData.material),\n e: _t(_ctx.caseData.duration),\n f: _t(_ctx.caseData.price),\n g: _t(_ctx.caseData.views),\n h: _t(_ctx.caseData.likes),\n i: _sei(_gei(_ctx, ''), 'view'),\n j: _o(handleClick)\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/case-card/case-card.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"case-card.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"case-card.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,CAAA;MAEhG,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcb,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;KACb;IACD,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,KAAK,CAAC,OAAY,EAAE,EAAgB;YAAR,MAAM,UAAA;QAEnC,YAAY;QACZ,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,MAAM,WAAW,GAAG;YACnB,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjC,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG;gBACrB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;gBAC3B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACjC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC7B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC7B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;gBAC/B,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;aACnB,CAAA;YACC,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/e96b6baeb69c81bb27b42e9b5fd582662fb8977e b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/e96b6baeb69c81bb27b42e9b5fd582662fb8977e
new file mode 100644
index 0000000..5a508e5
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/e96b6baeb69c81bb27b42e9b5fd582662fb8977e
@@ -0,0 +1 @@
+{"code":"import '\u0000plugin-vue:export-helper';\nimport 'uni-mp-runtime';\nimport './pages-json-js';\nimport App from './App.uvue';\nimport { createSSRApp } from 'vue';\nexport function createApp() {\n const app = createSSRApp(App);\n return {\n app\n };\n}\n;\ncreateApp().app.mount(\"#app\");\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/main.uts.js.map","references":["D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/App.uvue.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"main.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"main.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,2BAA2B,CAAC;AAAA,OAAO,gBAAgB,CAAC;AAAA,OAAO,iBAAiB,CAAC;AAAA,OAAO,GAAG,MAAM,YAAY,CAAA;AAEhH,OAAO,EAAE,YAAY,EAAE,MAAM,KAAK,CAAA;AAClC,MAAM,UAAU,SAAS;IACxB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO;QACN,GAAG;KACH,CAAA;AACF,CAAC;AAAA,CAAC;AACF,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/eef1e45833674d64ef39c13503f5abb554278398 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/eef1e45833674d64ef39c13503f5abb554278398
new file mode 100644
index 0000000..c38b385
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/eef1e45833674d64ef39c13503f5abb554278398
@@ -0,0 +1 @@
+{"code":"import { getEnvConfig, useMock, STORAGE_KEYS } from \"./config\";\nimport { getMockData } from \"./mock\";\nclass RequestOptions extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n url: { type: String, optional: false },\n method: { type: \"Unknown\", optional: true },\n data: { type: \"Unknown\", optional: true },\n header: { type: \"Unknown\", optional: true },\n showLoading: { type: Boolean, optional: true },\n loadingText: { type: String, optional: true }\n };\n },\n name: \"RequestOptions\"\n };\n }\n constructor(options, metadata = RequestOptions.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.url = this.__props__.url;\n this.method = this.__props__.method;\n this.data = this.__props__.data;\n this.header = this.__props__.header;\n this.showLoading = this.__props__.showLoading;\n this.loadingText = this.__props__.loadingText;\n delete this.__props__;\n }\n}\nclass ResponseData extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n code: { type: Number, optional: false },\n message: { type: String, optional: false },\n data: { type: \"Any\", optional: false }\n };\n },\n name: \"ResponseData\"\n };\n }\n constructor(options, metadata = ResponseData.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.code = this.__props__.code;\n this.message = this.__props__.message;\n this.data = this.__props__.data;\n delete this.__props__;\n }\n}\n/**\n * 请求拦截器\n */\nconst requestInterceptor = (options) => {\n // 添加token\n const token = uni.getStorageSync(STORAGE_KEYS.TOKEN);\n if (token != '') {\n if (options.header == null) {\n options.header = new UTSJSONObject({});\n }\n options.header['Authorization'] = `Bearer ${token}`;\n }\n return options;\n};\n/**\n * 响应拦截器\n */\nconst responseInterceptor = (response) => {\n var _a, _b, _c;\n const statusCode = response['statusCode'];\n const data = response['data'];\n if (statusCode == 200) {\n const code = ((_a = data['code']) !== null && _a !== void 0 ? _a : 0);\n if (code == 0 || code == 200) {\n return new ResponseData({\n code: 0,\n message: 'success',\n data: data['data']\n });\n }\n else if (code == 401) {\n // token过期,跳转登录\n uni.removeStorageSync(STORAGE_KEYS.TOKEN);\n uni.showToast({\n title: '请重新登录',\n icon: 'none'\n });\n return new ResponseData({\n code: code,\n message: ((_b = data['message']) !== null && _b !== void 0 ? _b : '请重新登录'),\n data: null\n });\n }\n else {\n return new ResponseData({\n code: code,\n message: ((_c = data['message']) !== null && _c !== void 0 ? _c : '请求失败'),\n data: null\n });\n }\n }\n else {\n return new ResponseData({\n code: statusCode,\n message: '网络请求失败',\n data: null\n });\n }\n};\n/**\n * 统一请求方法\n */\nexport const request = (options) => {\n return new Promise((resolve, reject) => {\n var _a, _b, _c;\n // 使用Mock数据\n if (useMock) {\n const mockData = getMockData(options.url, (_a = options.method) !== null && _a !== void 0 ? _a : 'GET', options.data);\n if (mockData != null) {\n setTimeout(() => {\n resolve(new ResponseData({\n code: 0,\n message: 'success',\n data: mockData\n }));\n }, 300); // 模拟网络延迟\n return null;\n }\n }\n // 请求拦截\n const finalOptions = requestInterceptor(options);\n // 显示loading\n if (finalOptions.showLoading == true) {\n uni.showLoading({\n title: (_b = finalOptions.loadingText) !== null && _b !== void 0 ? _b : '加载中...'\n });\n }\n const config = getEnvConfig();\n const baseUrl = config['baseUrl'];\n uni.request({\n url: baseUrl + finalOptions.url,\n method: (_c = finalOptions.method) !== null && _c !== void 0 ? _c : 'GET',\n data: finalOptions.data,\n header: finalOptions.header,\n success: (res) => {\n if (finalOptions.showLoading == true) {\n uni.hideLoading();\n }\n const result = responseInterceptor(res);\n if (result.code == 0) {\n resolve(result);\n }\n else {\n uni.showToast({\n title: result.message,\n icon: 'none'\n });\n reject(result);\n }\n },\n fail: (err) => {\n if (finalOptions.showLoading == true) {\n uni.hideLoading();\n }\n uni.showToast({\n title: '网络连接失败',\n icon: 'none'\n });\n reject(new ResponseData({\n code: -1,\n message: '网络连接失败',\n data: null\n }));\n }\n });\n });\n};\n/**\n * GET请求\n */\nexport const get = (url, data = null) => {\n return request(new RequestOptions({\n url: url,\n method: 'GET',\n data: data\n }));\n};\n/**\n * POST请求\n */\nexport const post = (url, data = null) => {\n return request(new RequestOptions({\n url: url,\n method: 'POST',\n data: data\n }));\n};\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/utils/request.uts.js.map","references":[],"uniExtApis":["uni.getStorageSync","uni.removeStorageSync","uni.showToast","uni.showLoading","uni.hideLoading","uni.request"],"map":"{\"version\":3,\"file\":\"request.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"request.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/f2a4af02bbb394158735afb1a29a8852c0d4f9dd b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/f2a4af02bbb394158735afb1a29a8852c0d4f9dd
new file mode 100644
index 0000000..db8b909
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/f2a4af02bbb394158735afb1a29a8852c0d4f9dd
@@ -0,0 +1 @@
+{"code":"import { defineComponent as _defineComponent } from 'vue';\nimport { toDisplayString as _toDisplayString, t as _t, o as _o, gei as _gei, sei as _sei, e as _e } from \"vue\";\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'section-header',\n props: {\n title: {},\n showMore: { type: Boolean }\n },\n emits: [\"more\"],\n setup(__props, _a) {\n var __emit = _a.emit;\n const props = __props;\n const emit = __emit;\n const handleMore = () => {\n emit('more');\n };\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = _e({\n a: _t(_ctx.title),\n b: _ctx.showMore\n }, _ctx.showMore ? {\n c: _o(handleMore)\n } : {}, {\n d: _sei(_gei(_ctx, ''), 'view')\n });\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/components/section-header/section-header.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts"],"uniExtApis":[],"map":"{\"version\":3,\"file\":\"section-header.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"section-header.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAA;AAG9G,eAAe,aAAa,CAAA,gBAAgB,CAAC;IAC3C,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE;QACL,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KAC5B;IACD,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,KAAK,CAAC,OAAY,EAAE,EAAgB;YAAR,MAAM,UAAA;QAEnC,MAAM,KAAK,GAAG,OAAO,CAAA;QAErB,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,MAAM,UAAU,GAAG;YAClB,IAAI,CAAC,MAAM,CAAC,CAAA;QACb,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,MAAM;YAAO,QAAQ,CAAA;YACjC,MAAM,YAAY,GAAG,EAAE,CAAC;gBACxB,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjB,CAAC,EAAE,IAAI,CAAC,QAAQ;aACjB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjB,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;aAClB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACN,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;aAChC,CAAC,CAAA;YACA,OAAO,YAAY,CAAA;QACrB,CAAC,CAAA;IACD,CAAC;CAEA,CAAC,CAAA\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/f9da72c0809811a822b679cf37c76b3162611e36 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/f9da72c0809811a822b679cf37c76b3162611e36
new file mode 100644
index 0000000..d37db8f
--- /dev/null
+++ b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/code/cache/f9da72c0809811a822b679cf37c76b3162611e36
@@ -0,0 +1 @@
+{"code":"import { __awaiter } from \"tslib\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, o as _o, f as _f, toDisplayString as _toDisplayString, t as _t, resolveComponent as _resolveComponent, p as _p, gei as _gei, sei as _sei } from \"vue\";\nconst __BINDING_COMPONENTS__ = '{\"before-after\":{\"name\":\"_easycom_before_after\",\"type\":\"unknown\"}}';\nif (!Array) {\n const _easycom_before_after_1 = _resolveComponent(\"before-after\");\n (_easycom_before_after_1)();\n}\nimport _easycom_before_after from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/before-after/before-after.uvue';\nif (!Math) {\n (_easycom_before_after)();\n}\nimport { getCaseDetail } from \"@/api/index\";\nclass CaseDetail extends UTS.UTSType {\n static get$UTSMetadata$() {\n return {\n kind: 2,\n get fields() {\n return {\n id: { type: String, optional: false },\n title: { type: String, optional: false },\n category: { type: String, optional: false },\n categoryName: { type: String, optional: false },\n beforeImages: { type: UTS.UTSType.withGenerics(Array, [String]), optional: false },\n afterImages: { type: UTS.UTSType.withGenerics(Array, [String]), optional: false },\n description: { type: String, optional: false },\n material: { type: String, optional: false },\n duration: { type: String, optional: false },\n price: { type: String, optional: false },\n views: { type: Number, optional: false },\n likes: { type: Number, optional: false },\n createTime: { type: String, optional: false }\n };\n },\n name: \"CaseDetail\"\n };\n }\n constructor(options, metadata = CaseDetail.get$UTSMetadata$(), isJSONParse = false) {\n super();\n this.__props__ = UTS.UTSType.initProps(options, metadata, isJSONParse);\n this.id = this.__props__.id;\n this.title = this.__props__.title;\n this.category = this.__props__.category;\n this.categoryName = this.__props__.categoryName;\n this.beforeImages = this.__props__.beforeImages;\n this.afterImages = this.__props__.afterImages;\n this.description = this.__props__.description;\n this.material = this.__props__.material;\n this.duration = this.__props__.duration;\n this.price = this.__props__.price;\n this.views = this.__props__.views;\n this.likes = this.__props__.likes;\n this.createTime = this.__props__.createTime;\n delete this.__props__;\n }\n}\n// 案例ID\nexport default /*#__PURE__*/ _defineComponent({\n __name: 'detail',\n setup(__props) {\n const caseId = ref('');\n // 案例详情\n const caseDetail = ref(new CaseDetail({\n id: '',\n title: '',\n category: '',\n categoryName: '',\n beforeImages: [],\n afterImages: [],\n description: '',\n material: '',\n duration: '',\n price: '',\n views: 0,\n likes: 0,\n createTime: ''\n }));\n // 是否收藏\n const isFavorite = ref(false);\n // 获取案例详情\n const fetchCaseDetail = () => { return __awaiter(this, void 0, void 0, function* () {\n try {\n const res = yield getCaseDetail(caseId.value);\n const data = res.data;\n caseDetail.value = new CaseDetail({\n id: data['id'],\n title: data['title'],\n category: data['category'],\n categoryName: data['categoryName'],\n beforeImages: data['beforeImages'],\n afterImages: data['afterImages'],\n description: data['description'],\n material: data['material'],\n duration: data['duration'],\n price: data['price'],\n views: data['views'],\n likes: data['likes'],\n createTime: data['createTime']\n }\n // 更新标题\n );\n // 更新标题\n uni.setNavigationBarTitle({\n title: caseDetail.value.title\n });\n }\n catch (e) {\n uni.__f__('error', 'at pages/cases/detail.uvue:173', '获取案例详情失败', e);\n }\n }); };\n // 预览图片\n const previewImages = (index) => {\n uni.previewImage({\n current: index,\n urls: caseDetail.value.afterImages\n });\n };\n // 收藏\n const handleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n uni.showToast({\n title: isFavorite.value ? '已收藏' : '已取消收藏',\n icon: 'none'\n });\n };\n // 分享\n const handleShare = () => {\n // 微信小程序触发分享\n uni.showToast({\n title: '分享功能开发中',\n icon: 'none'\n });\n };\n // 在线咨询\n const handleContact = () => {\n uni.makePhoneCall({\n phoneNumber: '400-888-8888',\n fail: () => {\n uni.showToast({\n title: '拨打电话失败',\n icon: 'none'\n });\n }\n });\n };\n // 预约\n const goToBooking = () => {\n uni.navigateTo({\n url: '/pages/booking/index'\n });\n };\n onLoad((options) => {\n var _a;\n caseId.value = (_a = options['id']) !== null && _a !== void 0 ? _a : '';\n if (caseId.value != '') {\n fetchCaseDetail();\n }\n });\n return (_ctx, _cache) => {\n \"raw js\";\n const __returned__ = {\n a: _f(_unref(caseDetail).afterImages, (item, index, i0) => {\n return {\n a: item,\n b: _o($event => { return previewImages(index); }, index),\n c: index\n };\n }),\n b: _t(_unref(caseDetail).categoryName),\n c: _t(_unref(caseDetail).title),\n d: _t(_unref(caseDetail).price),\n e: _t(_unref(caseDetail).views),\n f: _t(_unref(caseDetail).likes),\n g: _p({\n beforeImage: _unref(caseDetail).beforeImages[0] || '',\n afterImage: _unref(caseDetail).afterImages[0] || '',\n showTitle: true\n }),\n h: _t(_unref(caseDetail).material),\n i: _t(_unref(caseDetail).duration),\n j: _t(_unref(caseDetail).createTime),\n k: _t(_unref(caseDetail).description),\n l: _t(_unref(isFavorite) ? '❤️' : '🤍'),\n m: _o(handleFavorite),\n n: _o(handleShare),\n o: _o(handleContact),\n p: _o(goToBooking),\n q: _sei(_gei(_ctx, ''), 'view')\n };\n return __returned__;\n };\n }\n});\n//# sourceMappingURL=D:/Project/Self/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/%E4%BC%98%E8%89%BA%E5%AE%B6%E6%B2%99%E5%8F%91%E7%BF%BB%E6%96%B0/pages/cases/detail.uvue?vue&type=script&setup=true&lang.uts.js.map","references":["D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/before-after/before-after.uvue.ts"],"uniExtApis":["uni.setNavigationBarTitle","uni.__f__","uni.previewImage","uni.showToast","uni.makePhoneCall","uni.navigateTo"],"map":"{\"version\":3,\"file\":\"detail.uvue?vue&type=script&setup=true&lang.uts.js\",\"sourceRoot\":\"\",\"sources\":[\"detail.uvue?vue&type=script&setup=true&lang.uts\"],\"names\":[],\"mappings\":\"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\"}"}
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/07201c5d305f0b8c3518a2933781165cb5e42697 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/07201c5d305f0b8c3518a2933781165cb5e42697
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/3574da3a3a2c4dfbeaa977aeb822b78b93c9bbe3 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/3574da3a3a2c4dfbeaa977aeb822b78b93c9bbe3
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/6e5256decc81db29d508fb227528dfc797a40519 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/6e5256decc81db29d508fb227528dfc797a40519
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/7b1ad40f3d936a00037c413f0775f13c4676df56 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/7b1ad40f3d936a00037c413f0775f13c4676df56
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/96f1d10e43755cf65e6e6de9da25c1c1755e9781 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/96f1d10e43755cf65e6e6de9da25c1c1755e9781
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/9952036af8bfd85e7ab04763e139e39a48512193 b/前端/unpackage/cache/.mp-weixin/.uts2js/cache/uts_dfaba98a1efb6f86417e537d61d5d9f1d5d32fe7/types/cache/9952036af8bfd85e7ab04763e139e39a48512193
new file mode 100644
index 0000000..e69de29
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/api/index.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/api/index.js.map
new file mode 100644
index 0000000..ff4757a
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/api/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["api/index.uts"],"sourcesContent":["/**\r\n * API接口统一管理\r\n */\r\nimport { get, post } from '../utils/request.uts'\r\n\r\n/**\r\n * 获取轮播图 (临时从配置获取,后续可从后端获取)\r\n */\r\nexport const getBanners = () => {\r\n\t// 由于后端暂时没有轮播图API,先返回固定数据\r\n\treturn Promise.resolve({\r\n\t\tcode: 0,\r\n\t\tmessage: 'success',\r\n\t\tdata: [\r\n\t\t\t{\r\n\t\t\t\tid: '1',\r\n\t\t\t\timage: '/static/mock/banner1.svg',\r\n\t\t\t\ttitle: '专业沙发翻新服务',\r\n\t\t\t\tlink: '/pages/service/index'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: '2',\r\n\t\t\t\timage: '/static/mock/banner2.svg', \r\n\t\t\t\ttitle: '十年品质保证',\r\n\t\t\t\tlink: '/pages/about/index'\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tid: '3',\r\n\t\t\t\timage: '/static/mock/banner3.svg',\r\n\t\t\t\ttitle: '免费上门评估', \r\n\t\t\t\tlink: '/pages/booking/index'\r\n\t\t\t}\r\n\t\t]\r\n\t})\r\n}\r\n\r\n/**\r\n * 获取案例列表\r\n */\r\nexport const getCaseList = (params ?: UTSJSONObject) => {\r\n\t// 后端使用page和limit参数,需要转换\r\n\tconst queryParams = params ? {\r\n\t\tpage: params['page'] || 1,\r\n\t\tlimit: params['pageSize'] || params['limit'] || 10,\r\n\t\tserviceType: params['category'], // 后端使用serviceType\r\n\t\tstatus: 'published' // 只获取已发布的案例\r\n\t} : {}\r\n\treturn get('/cases', queryParams as UTSJSONObject)\r\n}\r\n\r\n/**\r\n * 获取案例详情\r\n */\r\nexport const getCaseDetail = (id : string) => {\r\n\treturn get(`/cases/${id}`)\r\n}\r\n\r\n/**\r\n * 获取热门案例 (临时使用前4条案例)\r\n */\r\nexport const getHotCases = () => {\r\n\treturn get('/cases', { limit: 4, status: 'published' } as UTSJSONObject)\r\n}\r\n\r\n/**\r\n * 获取服务流程 (使用服务列表替代)\r\n */\r\nexport const getServiceProcess = () => {\r\n\treturn get('/services')\r\n}\r\n\r\n/**\r\n * 获取有效服务列表\r\n */\r\nexport const getActiveServices = () => {\r\n\treturn get('/services/active')\r\n}\r\n\r\n/**\r\n * 获取公司信息\r\n */\r\nexport const getCompanyInfo = () => {\r\n\treturn get('/company/info')\r\n}\r\n\r\n/**\r\n * 提交预约\r\n */\r\nexport const submitBooking = (data : UTSJSONObject) => {\r\n\treturn post('/booking', data)\r\n}\r\n\r\n/**\r\n * 获取用户信息\r\n */\r\nexport const getUserInfo = () => {\r\n\treturn get('/user/info')\r\n}\r\n\r\n/**\r\n * 获取用户收藏列表\r\n */\r\nexport const getFavorites = () => {\r\n\treturn get('/user/favorites')\r\n}\r\n\r\n/**\r\n * 添加收藏\r\n */\r\nexport const addFavorite = (caseId : string) => {\r\n\treturn post('/user/favorites', { caseId: caseId } as UTSJSONObject)\r\n}\r\n\r\n/**\r\n * 取消收藏\r\n */\r\nexport const removeFavorite = (caseId : string) => {\r\n\treturn post('/user/favorites/remove', { caseId: caseId } as UTSJSONObject)\r\n}\r\n\r\n/**\r\n * 获取预约记录\r\n */\r\nexport const getBookingList = () => {\r\n\treturn get('/user/bookings')\r\n}\r\n"],"names":["get","post"],"mappings":";;AAQa,MAAA,aAAa,MAAA;AAEzB,SAAO,QAAQ,QAAQ,IAAA,cAAA;AAAA,IACtB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,MACL,IAAA,cAAA;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACN,CAAA;AAAA,MACD,IAAA,cAAA;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACN,CAAA;AAAA,MACD,IAAA,cAAA;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACN,CAAA;AAAA,IACD;AAAA,EACD,CAAA,CAAA;AACF;AAKO,MAAM,cAAc,CAAC,SAAuB,SAAA;AAElD,QAAM,cAAc,SAAS,IAAA,cAAA;AAAA,IAC5B,MAAM,OAAO,MAAM,KAAK;AAAA,IACxB,OAAO,OAAO,UAAU,KAAK,OAAO,OAAO,KAAK;AAAA,IAChD,aAAa,OAAO,UAAU;AAAA,IAC9B,QAAQ;AAAA;AAAA,EACR,CAAA,IAAE,IAAA,cAAC,CAAA,CAAE;AACN,SAAOA,cAAG,IAAC,UAAU,WAA4B;AAClD;AAKO,MAAM,gBAAgB,CAAC,OAAW;AACxC,SAAOA,cAAG,IAAC,UAAU,EAAE,EAAE;AAC1B;AAKa,MAAA,cAAc,MAAA;AAC1B,SAAOA,cAAG,IAAC,UAAQ,IAAA,cAAE,EAAE,OAAO,GAAG,QAAQ,YAA8B,CAAA;AACxE;AAKa,MAAA,oBAAoB,MAAA;AAChC,SAAOA,cAAAA,IAAI,WAAW;AACvB;AAYa,MAAA,iBAAiB,MAAA;AAC7B,SAAOA,cAAAA,IAAI,eAAe;AAC3B;AAKO,MAAM,gBAAgB,CAAC,SAAoB;AACjD,SAAOC,cAAI,KAAC,YAAY,IAAI;AAC7B;;;;;;;;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map
new file mode 100644
index 0000000..4472daa
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.js","sources":["App.uvue","main.uts"],"sourcesContent":["\r\n\r\n","import App from './App.uvue'\r\n\r\nimport { createSSRApp } from 'vue'\r\nexport function createApp() {\r\n\tconst app = createSSRApp(App)\r\n\treturn {\r\n\t\tapp\r\n\t}\r\n}"],"names":["defineComponent","uni","createSSRApp","App"],"mappings":";;;;;;;;;;;;AAIC,MAAA,YAAeA,8BAAA;AAAA,EACd,WAAQ;AACPC,kBAAAA,MAAI,MAAM,OAAM,iBAAgB,YAAY;AAAA,EAC5C;AAAA,EACD,SAAM;AACLA,kBAAAA,MAAI,MAAM,OAAM,kBAAiB,UAAU;AAAA,EAC3C;AAAA,EACD,SAAM;AACLA,kBAAAA,MAAI,MAAM,OAAM,kBAAiB,UAAU;AAAA,EAC3C;AAAA,EAmBD,SAAM;AACLA,kBAAAA,MAAI,MAAM,OAAM,kBAAiB,UAAU;AAAA,EAC3C;CACF;SChCe,YAAS;AACxB,QAAM,MAAMC,2BAAaC,SAAG;AAC5B,SAAO;AAAA,IACN;AAAA;AAEF;AACA,YAAY,IAAI,MAAM,MAAM;;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/common/assets.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/common/assets.js.map
new file mode 100644
index 0000000..81c5d3f
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/common/assets.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"assets.js","sources":["static/logo.png"],"sourcesContent":["export default \"__VITE_ASSET__46719607__\""],"names":[],"mappings":";AAAA,MAAe,aAAA;;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
new file mode 100644
index 0000000..9977645
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"vendor.js","sources":["../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-i18n/dist/uni-i18n.es.js","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-shared/dist/uni-shared.es.js","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-vue/dist-x/vue.runtime.esm.js","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-weixin/dist-x/uni.api.esm.js","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-console/dist/mp.esm.js","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-weixin/dist-x/uni.mp.esm.js","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-app/dist-x/uni-app.es.js"],"sourcesContent":["/**\n* @vue/shared v3.4.21\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nfunction makeMap(str, expectsLowerCase) {\n const set = new Set(str.split(\",\"));\n return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val);\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction((str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n});\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](arg);\n }\n};\nconst def = (obj, key, value) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"HOISTED\": -1,\n \"-1\": \"HOISTED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `HOISTED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length)\n continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n let ret = \"\";\n if (!styles || isString(styles)) {\n return ret;\n }\n for (const key in styles) {\n const value = styles[key];\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n if (isString(value) || typeof value === \"number\") {\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props)\n return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>| looseEqual(item, val));\n}\n\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (val && val.__v_isRef) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v;\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, genPropsAccessExp, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","const isObject = (val) => val !== null && typeof val === 'object';\nconst defaultDelimiters = ['{', '}'];\nclass BaseFormatter {\n constructor() {\n this._caches = Object.create(null);\n }\n interpolate(message, values, delimiters = defaultDelimiters) {\n if (!values) {\n return [message];\n }\n let tokens = this._caches[message];\n if (!tokens) {\n tokens = parse(message, delimiters);\n this._caches[message] = tokens;\n }\n return compile(tokens, values);\n }\n}\nconst RE_TOKEN_LIST_VALUE = /^(?:\\d)+/;\nconst RE_TOKEN_NAMED_VALUE = /^(?:\\w)+/;\nfunction parse(format, [startDelimiter, endDelimiter]) {\n const tokens = [];\n let position = 0;\n let text = '';\n while (position < format.length) {\n let char = format[position++];\n if (char === startDelimiter) {\n if (text) {\n tokens.push({ type: 'text', value: text });\n }\n text = '';\n let sub = '';\n char = format[position++];\n while (char !== undefined && char !== endDelimiter) {\n sub += char;\n char = format[position++];\n }\n const isClosed = char === endDelimiter;\n const type = RE_TOKEN_LIST_VALUE.test(sub)\n ? 'list'\n : isClosed && RE_TOKEN_NAMED_VALUE.test(sub)\n ? 'named'\n : 'unknown';\n tokens.push({ value: sub, type });\n }\n // else if (char === '%') {\n // // when found rails i18n syntax, skip text capture\n // if (format[position] !== '{') {\n // text += char\n // }\n // }\n else {\n text += char;\n }\n }\n text && tokens.push({ type: 'text', value: text });\n return tokens;\n}\nfunction compile(tokens, values) {\n const compiled = [];\n let index = 0;\n const mode = Array.isArray(values)\n ? 'list'\n : isObject(values)\n ? 'named'\n : 'unknown';\n if (mode === 'unknown') {\n return compiled;\n }\n while (index < tokens.length) {\n const token = tokens[index];\n switch (token.type) {\n case 'text':\n compiled.push(token.value);\n break;\n case 'list':\n compiled.push(values[parseInt(token.value, 10)]);\n break;\n case 'named':\n if (mode === 'named') {\n compiled.push(values[token.value]);\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Type of token '${token.type}' and format of value '${mode}' don't match!`);\n }\n }\n break;\n case 'unknown':\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Detect 'unknown' type of token!`);\n }\n break;\n }\n index++;\n }\n return compiled;\n}\n\nconst LOCALE_ZH_HANS = 'zh-Hans';\nconst LOCALE_ZH_HANT = 'zh-Hant';\nconst LOCALE_EN = 'en';\nconst LOCALE_FR = 'fr';\nconst LOCALE_ES = 'es';\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst defaultFormatter = new BaseFormatter();\nfunction include(str, parts) {\n return !!parts.find((part) => str.indexOf(part) !== -1);\n}\nfunction startsWith(str, parts) {\n return parts.find((part) => str.indexOf(part) === 0);\n}\nfunction normalizeLocale(locale, messages) {\n if (!locale) {\n return;\n }\n locale = locale.trim().replace(/_/g, '-');\n if (messages && messages[locale]) {\n return locale;\n }\n locale = locale.toLowerCase();\n if (locale === 'chinese') {\n // 支付宝\n return LOCALE_ZH_HANS;\n }\n if (locale.indexOf('zh') === 0) {\n if (locale.indexOf('-hans') > -1) {\n return LOCALE_ZH_HANS;\n }\n if (locale.indexOf('-hant') > -1) {\n return LOCALE_ZH_HANT;\n }\n if (include(locale, ['-tw', '-hk', '-mo', '-cht'])) {\n return LOCALE_ZH_HANT;\n }\n return LOCALE_ZH_HANS;\n }\n let locales = [LOCALE_EN, LOCALE_FR, LOCALE_ES];\n if (messages && Object.keys(messages).length > 0) {\n locales = Object.keys(messages);\n }\n const lang = startsWith(locale, locales);\n if (lang) {\n return lang;\n }\n}\nclass I18n {\n constructor({ locale, fallbackLocale, messages, watcher, formater, }) {\n this.locale = LOCALE_EN;\n this.fallbackLocale = LOCALE_EN;\n this.message = {};\n this.messages = {};\n this.watchers = [];\n if (fallbackLocale) {\n this.fallbackLocale = fallbackLocale;\n }\n this.formater = formater || defaultFormatter;\n this.messages = messages || {};\n this.setLocale(locale || LOCALE_EN);\n if (watcher) {\n this.watchLocale(watcher);\n }\n }\n setLocale(locale) {\n const oldLocale = this.locale;\n this.locale = normalizeLocale(locale, this.messages) || this.fallbackLocale;\n if (!this.messages[this.locale]) {\n // 可能初始化时不存在\n this.messages[this.locale] = {};\n }\n this.message = this.messages[this.locale];\n // 仅发生变化时,通知\n if (oldLocale !== this.locale) {\n this.watchers.forEach((watcher) => {\n watcher(this.locale, oldLocale);\n });\n }\n }\n getLocale() {\n return this.locale;\n }\n watchLocale(fn) {\n const index = this.watchers.push(fn) - 1;\n return () => {\n this.watchers.splice(index, 1);\n };\n }\n add(locale, message, override = true) {\n const curMessages = this.messages[locale];\n if (curMessages) {\n if (override) {\n Object.assign(curMessages, message);\n }\n else {\n Object.keys(message).forEach((key) => {\n if (!hasOwn(curMessages, key)) {\n curMessages[key] = message[key];\n }\n });\n }\n }\n else {\n this.messages[locale] = message;\n }\n }\n f(message, values, delimiters) {\n return this.formater.interpolate(message, values, delimiters).join('');\n }\n t(key, locale, values) {\n let message = this.message;\n if (typeof locale === 'string') {\n locale = normalizeLocale(locale, this.messages);\n locale && (message = this.messages[locale]);\n }\n else {\n values = locale;\n }\n if (!hasOwn(message, key)) {\n console.warn(`Cannot translate the value of keypath ${key}. Use the value of keypath as default.`);\n return key;\n }\n return this.formater.interpolate(message[key], values).join('');\n }\n}\n\nfunction watchAppLocale(appVm, i18n) {\n // 需要保证 watch 的触发在组件渲染之前\n if (appVm.$watchLocale) {\n // vue2\n appVm.$watchLocale((newLocale) => {\n i18n.setLocale(newLocale);\n });\n }\n else {\n appVm.$watch(() => appVm.$locale, (newLocale) => {\n i18n.setLocale(newLocale);\n });\n }\n}\nfunction getDefaultLocale() {\n if (typeof uni !== 'undefined' && uni.getLocale) {\n return uni.getLocale();\n }\n // 小程序平台,uni 和 uni-i18n 互相引用,导致访问不到 uni,故在 global 上挂了 getLocale\n if (typeof global !== 'undefined' && global.getLocale) {\n return global.getLocale();\n }\n return LOCALE_EN;\n}\nfunction initVueI18n(locale, messages = {}, fallbackLocale, watcher) {\n // 兼容旧版本入参\n if (typeof locale !== 'string') {\n // ;[locale, messages] = [\n // messages as unknown as string,\n // locale as unknown as LocaleMessages,\n // ]\n // 暂不使用数组解构,uts编译器暂未支持。\n const options = [\n messages,\n locale,\n ];\n locale = options[0];\n messages = options[1];\n }\n if (typeof locale !== 'string') {\n // 因为小程序平台,uni-i18n 和 uni 互相引用,导致此时访问 uni 时,为 undefined\n locale = getDefaultLocale();\n }\n if (typeof fallbackLocale !== 'string') {\n fallbackLocale =\n (typeof __uniConfig !== 'undefined' && __uniConfig.fallbackLocale) ||\n LOCALE_EN;\n }\n const i18n = new I18n({\n locale,\n fallbackLocale,\n messages,\n watcher,\n });\n let t = (key, values) => {\n if (typeof getApp !== 'function') {\n // app view\n /* eslint-disable no-func-assign */\n t = function (key, values) {\n return i18n.t(key, values);\n };\n }\n else {\n let isWatchedAppLocale = false;\n t = function (key, values) {\n const appVm = getApp().$vm;\n // 可能$vm还不存在,比如在支付宝小程序中,组件定义较早,在props的default里使用了t()函数(如uni-goods-nav),此时app还未初始化\n // options: {\n // \ttype: Array,\n // \tdefault () {\n // \t\treturn [{\n // \t\t\ticon: 'shop',\n // \t\t\ttext: t(\"uni-goods-nav.options.shop\"),\n // \t\t}, {\n // \t\t\ticon: 'cart',\n // \t\t\ttext: t(\"uni-goods-nav.options.cart\")\n // \t\t}]\n // \t}\n // },\n if (appVm) {\n // 触发响应式\n appVm.$locale;\n if (!isWatchedAppLocale) {\n isWatchedAppLocale = true;\n watchAppLocale(appVm, i18n);\n }\n }\n return i18n.t(key, values);\n };\n }\n return t(key, values);\n };\n return {\n i18n,\n f(message, values, delimiters) {\n return i18n.f(message, values, delimiters);\n },\n t(key, values) {\n return t(key, values);\n },\n add(locale, message, override = true) {\n return i18n.add(locale, message, override);\n },\n watch(fn) {\n return i18n.watchLocale(fn);\n },\n getLocale() {\n return i18n.getLocale();\n },\n setLocale(newLocale) {\n return i18n.setLocale(newLocale);\n },\n };\n}\n\nconst isString = (val) => typeof val === 'string';\nlet formater;\nfunction hasI18nJson(jsonObj, delimiters) {\n if (!formater) {\n formater = new BaseFormatter();\n }\n return walkJsonObj(jsonObj, (jsonObj, key) => {\n const value = jsonObj[key];\n if (isString(value)) {\n if (isI18nStr(value, delimiters)) {\n return true;\n }\n }\n else {\n return hasI18nJson(value, delimiters);\n }\n });\n}\nfunction parseI18nJson(jsonObj, values, delimiters) {\n if (!formater) {\n formater = new BaseFormatter();\n }\n walkJsonObj(jsonObj, (jsonObj, key) => {\n const value = jsonObj[key];\n if (isString(value)) {\n if (isI18nStr(value, delimiters)) {\n jsonObj[key] = compileStr(value, values, delimiters);\n }\n }\n else {\n parseI18nJson(value, values, delimiters);\n }\n });\n return jsonObj;\n}\nfunction compileI18nJsonStr(jsonStr, { locale, locales, delimiters, }) {\n if (!isI18nStr(jsonStr, delimiters)) {\n return jsonStr;\n }\n if (!formater) {\n formater = new BaseFormatter();\n }\n const localeValues = [];\n Object.keys(locales).forEach((name) => {\n if (name !== locale) {\n localeValues.push({\n locale: name,\n values: locales[name],\n });\n }\n });\n localeValues.unshift({ locale, values: locales[locale] });\n try {\n return JSON.stringify(compileJsonObj(JSON.parse(jsonStr), localeValues, delimiters), null, 2);\n }\n catch (e) { }\n return jsonStr;\n}\nfunction isI18nStr(value, delimiters) {\n return value.indexOf(delimiters[0]) > -1;\n}\nfunction compileStr(value, values, delimiters) {\n return formater.interpolate(value, values, delimiters).join('');\n}\nfunction compileValue(jsonObj, key, localeValues, delimiters) {\n const value = jsonObj[key];\n if (isString(value)) {\n // 存在国际化\n if (isI18nStr(value, delimiters)) {\n jsonObj[key] = compileStr(value, localeValues[0].values, delimiters);\n if (localeValues.length > 1) {\n // 格式化国际化语言\n const valueLocales = (jsonObj[key + 'Locales'] = {});\n localeValues.forEach((localValue) => {\n valueLocales[localValue.locale] = compileStr(value, localValue.values, delimiters);\n });\n }\n }\n }\n else {\n compileJsonObj(value, localeValues, delimiters);\n }\n}\nfunction compileJsonObj(jsonObj, localeValues, delimiters) {\n walkJsonObj(jsonObj, (jsonObj, key) => {\n compileValue(jsonObj, key, localeValues, delimiters);\n });\n return jsonObj;\n}\nfunction walkJsonObj(jsonObj, walk) {\n if (Array.isArray(jsonObj)) {\n for (let i = 0; i < jsonObj.length; i++) {\n if (walk(jsonObj, i)) {\n return true;\n }\n }\n }\n else if (isObject(jsonObj)) {\n for (const key in jsonObj) {\n if (walk(jsonObj, key)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction resolveLocale(locales) {\n return (locale) => {\n if (!locale) {\n return locale;\n }\n locale = normalizeLocale(locale) || locale;\n return resolveLocaleChain(locale).find((locale) => locales.indexOf(locale) > -1);\n };\n}\nfunction resolveLocaleChain(locale) {\n const chain = [];\n const tokens = locale.split('-');\n while (tokens.length) {\n chain.push(tokens.join('-'));\n tokens.pop();\n }\n return chain;\n}\n\nexport { BaseFormatter as Formatter, I18n, LOCALE_EN, LOCALE_ES, LOCALE_FR, LOCALE_ZH_HANS, LOCALE_ZH_HANT, compileI18nJsonStr, hasI18nJson, initVueI18n, isI18nStr, isString, normalizeLocale, parseI18nJson, resolveLocale };\n","import { isHTMLTag, isSVGTag, isVoidTag, isString, isFunction, isPlainObject, hyphenate, camelize, normalizeStyle as normalizeStyle$1, parseStringStyle, isArray, normalizeClass as normalizeClass$1, extend, capitalize, makeMap } from '@vue/shared';\n\nconst BUILT_IN_TAG_NAMES = [\n 'ad',\n 'ad-content-page',\n 'ad-draw',\n 'audio',\n 'button',\n 'camera',\n 'canvas',\n 'checkbox',\n 'checkbox-group',\n 'cover-image',\n 'cover-view',\n 'editor',\n 'form',\n 'functional-page-navigator',\n 'icon',\n 'image',\n 'input',\n 'label',\n 'live-player',\n 'live-pusher',\n 'map',\n 'movable-area',\n 'movable-view',\n 'navigator',\n 'official-account',\n 'open-data',\n 'picker',\n 'picker-view',\n 'picker-view-column',\n 'progress',\n 'radio',\n 'radio-group',\n 'rich-text',\n 'scroll-view',\n 'slider',\n 'swiper',\n 'swiper-item',\n 'switch',\n 'text',\n 'textarea',\n 'video',\n 'view',\n 'web-view',\n 'location-picker',\n 'location-view',\n];\nconst BUILT_IN_TAGS = BUILT_IN_TAG_NAMES.map((tag) => 'uni-' + tag);\nconst TAGS = [\n 'app',\n 'layout',\n 'content',\n 'main',\n 'top-window',\n 'left-window',\n 'right-window',\n 'tabbar',\n 'page',\n 'page-head',\n 'page-wrapper',\n 'page-body',\n 'page-refresh',\n 'actionsheet',\n 'modal',\n 'toast',\n 'resize-sensor',\n 'shadow-root',\n].map((tag) => 'uni-' + tag);\nconst NVUE_BUILT_IN_TAGS = [\n 'svg',\n 'view',\n 'a',\n 'div',\n 'img',\n 'image',\n 'text',\n 'span',\n 'input',\n 'textarea',\n 'spinner',\n 'select',\n // slider 被自定义 u-slider 替代\n // 'slider',\n 'slider-neighbor',\n 'indicator',\n 'canvas',\n 'list',\n 'cell',\n 'header',\n 'loading',\n 'loading-indicator',\n 'refresh',\n 'scrollable',\n 'scroller',\n 'video',\n 'web',\n 'embed',\n 'tabbar',\n 'tabheader',\n 'datepicker',\n 'timepicker',\n 'marquee',\n 'countdown',\n 'dc-switch',\n 'waterfall',\n 'richtext',\n 'recycle-list',\n 'u-scalable',\n 'barcode',\n 'gcanvas',\n];\nconst UVUE_BUILT_IN_TAGS = [\n 'ad',\n 'ad-content-page',\n 'ad-draw',\n 'native-view',\n 'loading-indicator',\n 'list-view',\n 'list-item',\n 'swiper',\n 'swiper-item',\n 'rich-text',\n 'sticky-view',\n 'sticky-header',\n 'sticky-section',\n // 自定义\n 'uni-slider',\n // 原生实现\n 'button',\n 'nested-scroll-header',\n 'nested-scroll-body',\n 'waterflow',\n 'flow-item',\n 'share-element',\n 'cover-view',\n 'cover-image',\n // custom element\n 'match-media',\n // 'checkbox',\n // 'checkbox-group',\n // 'form',\n // 'navigator',\n // 'picker-view',\n // 'picker-view-column',\n // 'progress',\n // 'slider',\n // 'switch',\n // 'radio',\n // 'radio-group',\n];\nconst UVUE_WEB_BUILT_IN_TAGS = [\n 'list-view',\n 'list-item',\n 'sticky-section',\n 'sticky-header',\n 'cloud-db-element',\n].map((tag) => 'uni-' + tag);\nconst UVUE_IOS_BUILT_IN_TAGS = [\n 'scroll-view',\n 'web-view',\n 'slider',\n 'form',\n 'switch',\n];\nconst UVUE_HARMONY_BUILT_IN_TAGS = [\n // TODO 列出完整列表\n ...BUILT_IN_TAG_NAMES,\n 'volume-panel',\n];\nconst NVUE_U_BUILT_IN_TAGS = [\n 'u-text',\n 'u-image',\n 'u-input',\n 'u-textarea',\n 'u-video',\n 'u-web-view',\n 'u-slider',\n 'u-ad',\n 'u-ad-draw',\n 'u-rich-text',\n];\nconst UVUE_WEB_BUILT_IN_CUSTOM_ELEMENTS = ['match-media'];\nconst UNI_UI_CONFLICT_TAGS = ['list-item'].map((tag) => 'uni-' + tag);\nfunction isBuiltInComponent(tag) {\n if (UNI_UI_CONFLICT_TAGS.indexOf(tag) !== -1) {\n return false;\n }\n // h5 平台会被转换为 v-uni-\n const realTag = 'uni-' + tag.replace('v-uni-', '');\n // TODO 区分x和非x\n return (BUILT_IN_TAGS.indexOf(realTag) !== -1 ||\n UVUE_WEB_BUILT_IN_TAGS.indexOf(realTag) !== -1);\n}\nfunction isH5CustomElement(tag, isX = false) {\n if (isX && UVUE_WEB_BUILT_IN_TAGS.indexOf(tag) !== -1) {\n return true;\n }\n return TAGS.indexOf(tag) !== -1 || BUILT_IN_TAGS.indexOf(tag) !== -1;\n}\nfunction isUniXElement(name) {\n return /^I?Uni.*Element(?:Impl)?$/.test(name);\n}\nfunction isH5NativeTag(tag) {\n return (tag !== 'head' &&\n (isHTMLTag(tag) || isSVGTag(tag)) &&\n !isBuiltInComponent(tag));\n}\nfunction isAppNativeTag(tag) {\n return isHTMLTag(tag) || isSVGTag(tag) || isBuiltInComponent(tag);\n}\nconst NVUE_CUSTOM_COMPONENTS = [\n 'ad',\n 'ad-draw',\n 'button',\n 'checkbox-group',\n 'checkbox',\n 'form',\n 'icon',\n 'label',\n 'movable-area',\n 'movable-view',\n 'navigator',\n 'picker',\n 'progress',\n 'radio-group',\n 'radio',\n 'rich-text',\n 'swiper-item',\n 'swiper',\n 'switch',\n 'slider',\n 'picker-view',\n 'picker-view-column',\n];\nconst UNI_AD_PLUGINS = ['uniad-plugin', 'uniad-plugin-wx'];\n// 内置的easycom组件\nconst UVUE_BUILT_IN_EASY_COMPONENTS = [\n 'map',\n 'camera',\n 'live-player',\n 'live-pusher',\n];\nfunction isAppUVueBuiltInEasyComponent(tag) {\n return UVUE_BUILT_IN_EASY_COMPONENTS.includes(tag);\n}\n// 主要是指前端实现的组件列表\nconst UVUE_CUSTOM_COMPONENTS = [\n ...NVUE_CUSTOM_COMPONENTS,\n ...UVUE_BUILT_IN_EASY_COMPONENTS,\n];\nfunction isAppUVueNativeTag(tag) {\n // 前端实现的内置组件都会注册一个根组件\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n if (UVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_CUSTOM_COMPONENTS.includes(tag)) {\n return false;\n }\n if (isBuiltInComponent(tag)) {\n return true;\n }\n // u-text,u-video...\n if (NVUE_U_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isAppIOSUVueNativeTag(tag) {\n // 前端实现的内置组件都会注册一个根组件\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n if (NVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n // TODO\n if ([\n 'checkbox',\n 'checkbox-group',\n 'form',\n 'picker-view',\n 'picker-view-column',\n 'progress',\n 'switch',\n 'radio',\n 'radio-group',\n ].includes(tag)) {\n return true;\n }\n if (\n // && tag != 'navigator' && tag != 'slider'\n UVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_IOS_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isAppHarmonyUVueNativeTag(tag) {\n // video 目前是easycom实现的\n if (tag === 'video' || tag === 'map') {\n return false;\n }\n // 前端实现的内置组件都会注册一个根组件\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n if (NVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_HARMONY_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isAppNVueNativeTag(tag) {\n if (NVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (NVUE_CUSTOM_COMPONENTS.includes(tag)) {\n return false;\n }\n if (isBuiltInComponent(tag)) {\n return true;\n }\n // u-text,u-video...\n if (NVUE_U_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isMiniProgramNativeTag(tag) {\n return isBuiltInComponent(tag);\n}\nfunction isMiniProgramUVueNativeTag(tag) {\n // 小程序平台内置的自定义元素,会被转换为 view\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n return isBuiltInComponent(tag);\n}\nfunction createIsCustomElement(tags = []) {\n return function isCustomElement(tag) {\n return tags.includes(tag);\n };\n}\nfunction isComponentTag(tag) {\n return tag[0].toLowerCase() + tag.slice(1) === 'component';\n}\nconst COMPONENT_SELECTOR_PREFIX = 'uni-';\nconst COMPONENT_PREFIX = 'v-' + COMPONENT_SELECTOR_PREFIX;\n// TODO 是否还存在其他需要特殊处理的 void 标签?\nconst APP_VOID_TAGS = ['textarea'];\nfunction isAppVoidTag(tag) {\n return APP_VOID_TAGS.includes(tag) || isVoidTag(tag);\n}\n\nconst LINEFEED = '\\n';\nconst NAVBAR_HEIGHT = 44;\nconst TABBAR_HEIGHT = 50;\nconst ON_REACH_BOTTOM_DISTANCE = 50;\nconst RESPONSIVE_MIN_WIDTH = 768;\nconst UNI_STORAGE_LOCALE = 'UNI_LOCALE';\n// quickapp-webview 不能使用 default 作为插槽名称\nconst SLOT_DEFAULT_NAME = 'd';\nconst COMPONENT_NAME_PREFIX = 'VUni';\nconst I18N_JSON_DELIMITERS = ['%', '%'];\nconst PRIMARY_COLOR = '#007aff';\nconst SELECTED_COLOR = '#0062cc'; // 选中的颜色,如选项卡默认的选中颜色\nconst BACKGROUND_COLOR = '#f7f7f7'; // 背景色,如标题栏默认背景色\nconst UNI_SSR = '__uniSSR';\nconst UNI_SSR_TITLE = 'title';\nconst UNI_SSR_STORE = 'store';\nconst UNI_SSR_DATA = 'data';\nconst UNI_SSR_GLOBAL_DATA = 'globalData';\nconst SCHEME_RE = /^([a-z-]+:)?\\/\\//i;\nconst DATA_RE = /^data:.*,.*/;\nconst WEB_INVOKE_APPSERVICE = 'WEB_INVOKE_APPSERVICE';\nconst WXS_PROTOCOL = 'wxs://';\nconst JSON_PROTOCOL = 'json://';\nconst WXS_MODULES = 'wxsModules';\nconst RENDERJS_MODULES = 'renderjsModules';\n// lifecycle\n// App and Page\nconst ON_SHOW = 'onShow';\nconst ON_HIDE = 'onHide';\n//App\nconst ON_LAUNCH = 'onLaunch';\nconst ON_ERROR = 'onError';\nconst ON_THEME_CHANGE = 'onThemeChange';\nconst OFF_THEME_CHANGE = 'offThemeChange';\nconst ON_HOST_THEME_CHANGE = 'onHostThemeChange';\nconst OFF_HOST_THEME_CHANGE = 'offHostThemeChange';\nconst ON_KEYBOARD_HEIGHT_CHANGE = 'onKeyboardHeightChange';\nconst ON_PAGE_NOT_FOUND = 'onPageNotFound';\nconst ON_UNHANDLE_REJECTION = 'onUnhandledRejection';\nconst ON_LAST_PAGE_BACK_PRESS = 'onLastPageBackPress';\nconst ON_EXIT = 'onExit';\n//Page\nconst ON_LOAD = 'onLoad';\nconst ON_READY = 'onReady';\nconst ON_UNLOAD = 'onUnload';\n// 百度特有\nconst ON_INIT = 'onInit';\n// 微信特有\nconst ON_SAVE_EXIT_STATE = 'onSaveExitState';\nconst ON_RESIZE = 'onResize';\nconst ON_BACK_PRESS = 'onBackPress';\nconst ON_PAGE_SCROLL = 'onPageScroll';\nconst ON_TAB_ITEM_TAP = 'onTabItemTap';\nconst ON_REACH_BOTTOM = 'onReachBottom';\nconst ON_PULL_DOWN_REFRESH = 'onPullDownRefresh';\nconst ON_SHARE_TIMELINE = 'onShareTimeline';\nconst ON_SHARE_CHAT = 'onShareChat'; // xhs-share\nconst ON_ADD_TO_FAVORITES = 'onAddToFavorites';\nconst ON_SHARE_APP_MESSAGE = 'onShareAppMessage';\n// navigationBar\nconst ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap';\nconst ON_NAVIGATION_BAR_CHANGE = 'onNavigationBarChange';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = 'onNavigationBarSearchInputClicked';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = 'onNavigationBarSearchInputChanged';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = 'onNavigationBarSearchInputConfirmed';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = 'onNavigationBarSearchInputFocusChanged';\n// framework\nconst ON_APP_ENTER_FOREGROUND = 'onAppEnterForeground';\nconst ON_APP_ENTER_BACKGROUND = 'onAppEnterBackground';\nconst ON_WEB_INVOKE_APP_SERVICE = 'onWebInvokeAppService';\nconst ON_WXS_INVOKE_CALL_METHOD = 'onWxsInvokeCallMethod';\n// mergeVirtualHostAttributes\nconst VIRTUAL_HOST_STYLE = 'virtualHostStyle';\nconst VIRTUAL_HOST_CLASS = 'virtualHostClass';\nconst VIRTUAL_HOST_HIDDEN = 'virtualHostHidden';\nconst VIRTUAL_HOST_ID = 'virtualHostId';\n\nfunction cache(fn) {\n const cache = Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nfunction cacheStringFunction(fn) {\n return cache(fn);\n}\nfunction getLen(str = '') {\n return ('' + str).replace(/[^\\x00-\\xff]/g, '**').length;\n}\nfunction hasLeadingSlash(str) {\n return str.indexOf('/') === 0;\n}\nfunction addLeadingSlash(str) {\n return hasLeadingSlash(str) ? str : '/' + str;\n}\nfunction removeLeadingSlash(str) {\n return hasLeadingSlash(str) ? str.slice(1) : str;\n}\nconst invokeArrayFns = (fns, arg) => {\n let ret;\n for (let i = 0; i < fns.length; i++) {\n ret = fns[i](arg);\n }\n return ret;\n};\nfunction updateElementStyle(element, styles) {\n for (const attrName in styles) {\n element.style[attrName] = styles[attrName];\n }\n}\nfunction once(fn, ctx = null) {\n let res;\n return ((...args) => {\n if (fn) {\n res = fn.apply(ctx, args);\n fn = null;\n }\n return res;\n });\n}\nconst sanitise = (val) => (val && JSON.parse(JSON.stringify(val))) || val;\nconst _completeValue = (value) => (value > 9 ? value : '0' + value);\nfunction formatDateTime({ date = new Date(), mode = 'date' }) {\n if (mode === 'time') {\n return (_completeValue(date.getHours()) + ':' + _completeValue(date.getMinutes()));\n }\n else {\n return (date.getFullYear() +\n '-' +\n _completeValue(date.getMonth() + 1) +\n '-' +\n _completeValue(date.getDate()));\n }\n}\nfunction callOptions(options, data) {\n options = options || {};\n if (isString(data)) {\n data = {\n errMsg: data,\n };\n }\n if (/:ok$/.test(data.errMsg)) {\n if (isFunction(options.success)) {\n options.success(data);\n }\n }\n else {\n if (isFunction(options.fail)) {\n options.fail(data);\n }\n }\n if (isFunction(options.complete)) {\n options.complete(data);\n }\n}\nfunction getValueByDataPath(obj, path) {\n if (!isString(path)) {\n return;\n }\n path = path.replace(/\\[(\\d+)\\]/g, '.$1');\n const parts = path.split('.');\n let key = parts[0];\n if (!obj) {\n obj = {};\n }\n if (parts.length === 1) {\n return obj[key];\n }\n return getValueByDataPath(obj[key], parts.slice(1).join('.'));\n}\nfunction sortObject(obj) {\n let sortObj = {};\n if (isPlainObject(obj)) {\n Object.keys(obj)\n .sort()\n .forEach((key) => {\n const _key = key;\n sortObj[_key] = obj[_key];\n });\n }\n return !Object.keys(sortObj) ? obj : sortObj;\n}\nfunction getGlobalOnce() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n // worker\n if (typeof self !== 'undefined') {\n return self;\n }\n // browser\n if (typeof window !== 'undefined') {\n return window;\n }\n // nodejs\n // if (typeof global !== 'undefined') {\n // return global\n // }\n function g() {\n return this;\n }\n if (typeof g() !== 'undefined') {\n return g();\n }\n return (function () {\n return new Function('return this')();\n })();\n}\nlet g = undefined;\nfunction getGlobal() {\n if (g) {\n return g;\n }\n g = getGlobalOnce();\n return g;\n}\n\nfunction isComponentInternalInstance(vm) {\n return !!vm.appContext;\n}\nfunction resolveComponentInstance(instance) {\n return (instance &&\n (isComponentInternalInstance(instance) ? instance.proxy : instance));\n}\nfunction resolveOwnerVm(vm) {\n if (!vm) {\n return;\n }\n let componentName = vm.type.name;\n while (componentName && isBuiltInComponent(hyphenate(componentName))) {\n // ownerInstance 内置组件需要使用父 vm\n vm = vm.parent;\n componentName = vm.type.name;\n }\n return vm.proxy;\n}\nfunction isElement(el) {\n // Element\n return el.nodeType === 1;\n}\nfunction resolveOwnerEl(instance, multi = false) {\n const { vnode } = instance;\n if (isElement(vnode.el)) {\n return multi ? (vnode.el ? [vnode.el] : []) : vnode.el;\n }\n const { subTree } = instance;\n // ShapeFlags.ARRAY_CHILDREN = 1<<4\n if (subTree.shapeFlag & 16) {\n const elemVNodes = subTree.children.filter((vnode) => vnode.el && isElement(vnode.el));\n if (elemVNodes.length > 0) {\n if (multi) {\n return elemVNodes.map((node) => node.el);\n }\n return elemVNodes[0].el;\n }\n }\n return multi ? (vnode.el ? [vnode.el] : []) : vnode.el;\n}\nfunction dynamicSlotName(name) {\n return name === 'default' ? SLOT_DEFAULT_NAME : name;\n}\nconst customizeRE = /:/g;\nfunction customizeEvent(str) {\n return camelize(str.replace(customizeRE, '-'));\n}\nfunction normalizeStyle(value) {\n const g = getGlobal();\n if (g && g.UTSJSONObject && value instanceof g.UTSJSONObject) {\n const styleObject = {};\n g.UTSJSONObject.keys(value).forEach((key) => {\n styleObject[key] = value[key];\n });\n return normalizeStyle$1(styleObject);\n }\n else if (value instanceof Map) {\n const styleObject = {};\n value.forEach((value, key) => {\n styleObject[key] = value;\n });\n return normalizeStyle$1(styleObject);\n }\n else if (isString(value)) {\n return parseStringStyle(value);\n }\n else if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item)\n ? parseStringStyle(item)\n : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n }\n else {\n return normalizeStyle$1(value);\n }\n}\nfunction normalizeClass(value) {\n let res = '';\n const g = getGlobal();\n if (g && g.UTSJSONObject && value instanceof g.UTSJSONObject) {\n g.UTSJSONObject.keys(value).forEach((key) => {\n if (value[key]) {\n res += key + ' ';\n }\n });\n }\n else if (value instanceof Map) {\n value.forEach((value, key) => {\n if (value) {\n res += key + ' ';\n }\n });\n }\n else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + ' ';\n }\n }\n }\n else {\n res = normalizeClass$1(value);\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props)\n return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nlet lastLogTime = 0;\nfunction formatLog(module, ...args) {\n const now = Date.now();\n const diff = lastLogTime ? now - lastLogTime : 0;\n lastLogTime = now;\n return `[${now}][${diff}ms][${module}]:${args\n .map((arg) => JSON.stringify(arg))\n .join(' ')}`;\n}\n\nfunction formatKey(key) {\n return camelize(key.substring(5));\n}\n// question/139181,增加副作用,避免 initCustomDataset 在 build 下被 tree-shaking\nconst initCustomDatasetOnce = /*#__PURE__*/ once((isBuiltInElement) => {\n isBuiltInElement =\n isBuiltInElement || ((el) => el.tagName.startsWith('UNI-'));\n const prototype = HTMLElement.prototype;\n const setAttribute = prototype.setAttribute;\n prototype.setAttribute = function (key, value) {\n if (key.startsWith('data-') && isBuiltInElement(this)) {\n const dataset = this.__uniDataset ||\n (this.__uniDataset = {});\n dataset[formatKey(key)] = value;\n }\n setAttribute.call(this, key, value);\n };\n const removeAttribute = prototype.removeAttribute;\n prototype.removeAttribute = function (key) {\n if (this.__uniDataset &&\n key.startsWith('data-') &&\n isBuiltInElement(this)) {\n delete this.__uniDataset[formatKey(key)];\n }\n removeAttribute.call(this, key);\n };\n});\nfunction getCustomDataset(el) {\n return extend({}, el.dataset, el.__uniDataset);\n}\n\nconst unitRE = new RegExp(`\"[^\"]+\"|'[^']+'|url\\\\([^)]+\\\\)|(\\\\d*\\\\.?\\\\d+)[r|u]px`, 'g');\nfunction toFixed(number, precision) {\n const multiplier = Math.pow(10, precision + 1);\n const wholeNumber = Math.floor(number * multiplier);\n return (Math.round(wholeNumber / 10) * 10) / multiplier;\n}\nconst defaultRpx2Unit = {\n unit: 'rem',\n unitRatio: 10 / 320,\n unitPrecision: 5,\n};\nconst defaultMiniProgramRpx2Unit = {\n unit: 'rpx',\n unitRatio: 1,\n unitPrecision: 1,\n};\nconst defaultNVueRpx2Unit = defaultMiniProgramRpx2Unit;\nfunction createRpx2Unit(unit, unitRatio, unitPrecision) {\n // ignore: rpxCalcIncludeWidth\n return (val) => val.replace(unitRE, (m, $1) => {\n if (!$1) {\n return m;\n }\n if (unitRatio === 1) {\n return `${$1}${unit}`;\n }\n const value = toFixed(parseFloat($1) * unitRatio, unitPrecision);\n return value === 0 ? '0' : `${value}${unit}`;\n });\n}\n\nfunction passive(passive) {\n return { passive };\n}\nfunction normalizeDataset(el) {\n // TODO\n return JSON.parse(JSON.stringify(el.dataset || {}));\n}\nfunction normalizeTarget(el) {\n const { id, offsetTop, offsetLeft } = el;\n return {\n id,\n dataset: getCustomDataset(el),\n offsetTop,\n offsetLeft,\n };\n}\nfunction addFont(family, source, desc) {\n const fonts = document.fonts;\n if (fonts) {\n const fontFace = new FontFace(family, source, desc);\n return fontFace.load().then(() => {\n fonts.add && fonts.add(fontFace);\n });\n }\n return new Promise((resolve) => {\n const style = document.createElement('style');\n const values = [];\n if (desc) {\n const { style, weight, stretch, unicodeRange, variant, featureSettings } = desc;\n style && values.push(`font-style:${style}`);\n weight && values.push(`font-weight:${weight}`);\n stretch && values.push(`font-stretch:${stretch}`);\n unicodeRange && values.push(`unicode-range:${unicodeRange}`);\n variant && values.push(`font-variant:${variant}`);\n featureSettings && values.push(`font-feature-settings:${featureSettings}`);\n }\n style.innerText = `@font-face{font-family:\"${family}\";src:${source};${values.join(';')}}`;\n document.head.appendChild(style);\n resolve();\n });\n}\nfunction scrollTo(scrollTop, duration, isH5) {\n if (isString(scrollTop)) {\n const el = document.querySelector(scrollTop);\n if (el) {\n const { top } = el.getBoundingClientRect();\n scrollTop = top + window.pageYOffset;\n // 如果存在,减去 高度\n const pageHeader = document.querySelector('uni-page-head');\n if (pageHeader) {\n scrollTop -= pageHeader.offsetHeight;\n }\n }\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n const documentElement = document.documentElement;\n const { clientHeight, scrollHeight } = documentElement;\n scrollTop = Math.min(scrollTop, scrollHeight - clientHeight);\n if (duration === 0) {\n // 部分浏览器(比如微信)中 scrollTop 的值需要通过 document.body 来控制\n documentElement.scrollTop = document.body.scrollTop = scrollTop;\n return;\n }\n if (window.scrollY === scrollTop) {\n return;\n }\n const scrollTo = (duration) => {\n if (duration <= 0) {\n window.scrollTo(0, scrollTop);\n return;\n }\n const distaince = scrollTop - window.scrollY;\n requestAnimationFrame(function () {\n window.scrollTo(0, window.scrollY + (distaince / duration) * 10);\n scrollTo(duration - 10);\n });\n };\n scrollTo(duration);\n}\n\nconst encode = encodeURIComponent;\nfunction stringifyQuery(obj, encodeStr = encode) {\n const res = obj\n ? Object.keys(obj)\n .map((key) => {\n let val = obj[key];\n if (typeof val === undefined || val === null) {\n val = '';\n }\n else if (isPlainObject(val)) {\n val = JSON.stringify(val);\n }\n return encodeStr(key) + '=' + encodeStr(val);\n })\n .filter((x) => x.length > 0)\n .join('&')\n : null;\n return res ? `?${res}` : '';\n}\n/**\n * Decode text using `decodeURIComponent`. Returns the original text if it\n * fails.\n *\n * @param text - string to decode\n * @returns decoded string\n */\nfunction decode(text) {\n try {\n return decodeURIComponent('' + text);\n }\n catch (err) { }\n return '' + text;\n}\nfunction decodedQuery(query = {}) {\n const decodedQuery = {};\n Object.keys(query).forEach((name) => {\n try {\n decodedQuery[name] = decode(query[name]);\n }\n catch (e) {\n decodedQuery[name] = query[name];\n }\n });\n return decodedQuery;\n}\nconst PLUS_RE = /\\+/g; // %2B\n/**\n * https://github.com/vuejs/vue-router-next/blob/master/src/query.ts\n * @internal\n *\n * @param search - search string to parse\n * @returns a query object\n */\nfunction parseQuery(search) {\n const query = {};\n // avoid creating an object with an empty key and empty value\n // because of split('&')\n if (search === '' || search === '?')\n return query;\n const hasLeadingIM = search[0] === '?';\n const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&');\n for (let i = 0; i < searchParams.length; ++i) {\n // pre decode the + into space\n const searchParam = searchParams[i].replace(PLUS_RE, ' ');\n // allow the = character\n let eqPos = searchParam.indexOf('=');\n let key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n let value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n if (key in query) {\n // an extra variable for ts types\n let currentValue = query[key];\n if (!isArray(currentValue)) {\n currentValue = query[key] = [currentValue];\n }\n currentValue.push(value);\n }\n else {\n query[key] = value;\n }\n }\n return query;\n}\n\nfunction parseUrl(url) {\n const [path, querystring] = url.split('?', 2);\n return {\n path,\n query: parseQuery(querystring || ''),\n };\n}\n\nfunction parseNVueDataset(attr) {\n const dataset = {};\n if (attr) {\n Object.keys(attr).forEach((key) => {\n if (key.indexOf('data-') === 0) {\n dataset[key.replace('data-', '')] = attr[key];\n }\n });\n }\n return dataset;\n}\n\nfunction plusReady(callback) {\n if (!isFunction(callback)) {\n return;\n }\n if (window.plus) {\n return callback();\n }\n document.addEventListener('plusready', callback);\n}\n\nclass DOMException extends Error {\n constructor(message) {\n super(message);\n this.name = 'DOMException';\n }\n}\n\nfunction normalizeEventType(type, options) {\n if (options) {\n if (options.capture) {\n type += 'Capture';\n }\n if (options.once) {\n type += 'Once';\n }\n if (options.passive) {\n type += 'Passive';\n }\n }\n return `on${capitalize(camelize(type))}`;\n}\nclass UniEvent {\n constructor(type, opts) {\n this.defaultPrevented = false;\n this.timeStamp = Date.now();\n this._stop = false;\n this._end = false;\n this.type = type;\n this.bubbles = !!opts.bubbles;\n this.cancelable = !!opts.cancelable;\n }\n preventDefault() {\n this.defaultPrevented = true;\n }\n stopImmediatePropagation() {\n this._end = this._stop = true;\n }\n stopPropagation() {\n this._stop = true;\n }\n}\nfunction createUniEvent(evt) {\n if (evt instanceof UniEvent) {\n return evt;\n }\n const [type] = parseEventName(evt.type);\n const uniEvent = new UniEvent(type, {\n bubbles: false,\n cancelable: false,\n });\n extend(uniEvent, evt);\n return uniEvent;\n}\nclass UniEventTarget {\n constructor() {\n this.listeners = Object.create(null);\n }\n dispatchEvent(evt) {\n const listeners = this.listeners[evt.type];\n if (!listeners) {\n if ((process.env.NODE_ENV !== 'production')) {\n console.error(formatLog('dispatchEvent', this.nodeId), evt.type, 'not found');\n }\n return false;\n }\n // 格式化事件类型\n const event = createUniEvent(evt);\n const len = listeners.length;\n for (let i = 0; i < len; i++) {\n listeners[i].call(this, event);\n if (event._end) {\n break;\n }\n }\n return event.cancelable && event.defaultPrevented;\n }\n addEventListener(type, listener, options) {\n type = normalizeEventType(type, options);\n (this.listeners[type] || (this.listeners[type] = [])).push(listener);\n }\n removeEventListener(type, callback, options) {\n type = normalizeEventType(type, options);\n const listeners = this.listeners[type];\n if (!listeners) {\n return;\n }\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseEventName(name) {\n let options;\n if (optionsModifierRE.test(name)) {\n options = {};\n let m;\n while ((m = name.match(optionsModifierRE))) {\n name = name.slice(0, name.length - m[0].length);\n options[m[0].toLowerCase()] = true;\n }\n }\n return [hyphenate(name.slice(2)), options];\n}\n\nconst EventModifierFlags = /*#__PURE__*/ (() => {\n return {\n stop: 1,\n prevent: 1 << 1,\n self: 1 << 2,\n };\n})();\nfunction encodeModifier(modifiers) {\n let flag = 0;\n if (modifiers.includes('stop')) {\n flag |= EventModifierFlags.stop;\n }\n if (modifiers.includes('prevent')) {\n flag |= EventModifierFlags.prevent;\n }\n if (modifiers.includes('self')) {\n flag |= EventModifierFlags.self;\n }\n return flag;\n}\n\nconst NODE_TYPE_PAGE = 0;\nconst NODE_TYPE_ELEMENT = 1;\nconst NODE_TYPE_TEXT = 3;\nconst NODE_TYPE_COMMENT = 8;\nfunction sibling(node, type) {\n const { parentNode } = node;\n if (!parentNode) {\n return null;\n }\n const { childNodes } = parentNode;\n return childNodes[childNodes.indexOf(node) + (type === 'n' ? 1 : -1)] || null;\n}\nfunction removeNode(node) {\n const { parentNode } = node;\n if (parentNode) {\n const { childNodes } = parentNode;\n const index = childNodes.indexOf(node);\n if (index > -1) {\n node.parentNode = null;\n childNodes.splice(index, 1);\n }\n }\n}\nfunction checkNodeId(node) {\n if (!node.nodeId && node.pageNode) {\n node.nodeId = node.pageNode.genId();\n }\n}\n// 为优化性能,各平台不使用proxy来实现node的操作拦截,而是直接通过pageNode定制\nclass UniNode extends UniEventTarget {\n constructor(nodeType, nodeName, container) {\n super();\n this.pageNode = null;\n this.parentNode = null;\n this._text = null;\n if (container) {\n const { pageNode } = container;\n if (pageNode) {\n this.pageNode = pageNode;\n this.nodeId = pageNode.genId();\n !pageNode.isUnmounted && pageNode.onCreate(this, nodeName);\n }\n }\n this.nodeType = nodeType;\n this.nodeName = nodeName;\n this.childNodes = [];\n }\n get firstChild() {\n return this.childNodes[0] || null;\n }\n get lastChild() {\n const { childNodes } = this;\n const length = childNodes.length;\n return length ? childNodes[length - 1] : null;\n }\n get nextSibling() {\n return sibling(this, 'n');\n }\n get nodeValue() {\n return null;\n }\n set nodeValue(_val) { }\n get textContent() {\n return this._text || '';\n }\n set textContent(text) {\n this._text = text;\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onTextContent(this, text);\n }\n }\n get parentElement() {\n const { parentNode } = this;\n if (parentNode && parentNode.nodeType === NODE_TYPE_ELEMENT) {\n return parentNode;\n }\n return null;\n }\n get previousSibling() {\n return sibling(this, 'p');\n }\n appendChild(newChild) {\n return this.insertBefore(newChild, null);\n }\n cloneNode(deep) {\n const cloned = extend(Object.create(Object.getPrototypeOf(this)), this);\n const { attributes } = cloned;\n if (attributes) {\n cloned.attributes = extend({}, attributes);\n }\n if (deep) {\n cloned.childNodes = cloned.childNodes.map((childNode) => childNode.cloneNode(true));\n }\n return cloned;\n }\n insertBefore(newChild, refChild) {\n // 先从现在的父节点移除(注意:不能触发onRemoveChild,否则会生成先remove该 id,再 insert)\n removeNode(newChild);\n newChild.pageNode = this.pageNode;\n newChild.parentNode = this;\n checkNodeId(newChild);\n const { childNodes } = this;\n if (refChild) {\n const index = childNodes.indexOf(refChild);\n if (index === -1) {\n throw new DOMException(`Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.`);\n }\n childNodes.splice(index, 0, newChild);\n }\n else {\n childNodes.push(newChild);\n }\n return this.pageNode && !this.pageNode.isUnmounted\n ? this.pageNode.onInsertBefore(this, newChild, refChild)\n : newChild;\n }\n removeChild(oldChild) {\n const { childNodes } = this;\n const index = childNodes.indexOf(oldChild);\n if (index === -1) {\n throw new DOMException(`Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.`);\n }\n oldChild.parentNode = null;\n childNodes.splice(index, 1);\n return this.pageNode && !this.pageNode.isUnmounted\n ? this.pageNode.onRemoveChild(oldChild)\n : oldChild;\n }\n}\nconst ATTR_CLASS = 'class';\nconst ATTR_STYLE = 'style';\nconst ATTR_INNER_HTML = 'innerHTML';\nconst ATTR_TEXT_CONTENT = 'textContent';\nconst ATTR_V_SHOW = '.vShow';\nconst ATTR_V_OWNER_ID = '.vOwnerId';\nconst ATTR_V_RENDERJS = '.vRenderjs';\nconst ATTR_CHANGE_PREFIX = 'change:';\nclass UniBaseNode extends UniNode {\n constructor(nodeType, nodeName, container) {\n super(nodeType, nodeName, container);\n this.attributes = Object.create(null);\n this.style = null;\n this.vShow = null;\n this._html = null;\n }\n get className() {\n return (this.attributes[ATTR_CLASS] || '');\n }\n set className(val) {\n this.setAttribute(ATTR_CLASS, val);\n }\n get innerHTML() {\n return '';\n }\n set innerHTML(html) {\n this._html = html;\n }\n addEventListener(type, listener, options) {\n super.addEventListener(type, listener, options);\n if (this.pageNode && !this.pageNode.isUnmounted) {\n if (listener.wxsEvent) {\n this.pageNode.onAddWxsEvent(this, normalizeEventType(type, options), listener.wxsEvent, encodeModifier(listener.modifiers || []));\n }\n else {\n this.pageNode.onAddEvent(this, normalizeEventType(type, options), encodeModifier(listener.modifiers || []));\n }\n }\n }\n removeEventListener(type, callback, options) {\n super.removeEventListener(type, callback, options);\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onRemoveEvent(this, normalizeEventType(type, options));\n }\n }\n getAttribute(qualifiedName) {\n if (qualifiedName === ATTR_STYLE) {\n return this.style;\n }\n return this.attributes[qualifiedName];\n }\n removeAttribute(qualifiedName) {\n if (qualifiedName == ATTR_STYLE) {\n this.style = null;\n }\n else {\n delete this.attributes[qualifiedName];\n }\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onRemoveAttribute(this, qualifiedName);\n }\n }\n setAttribute(qualifiedName, value) {\n if (qualifiedName === ATTR_STYLE) {\n this.style = value;\n }\n else {\n this.attributes[qualifiedName] = value;\n }\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onSetAttribute(this, qualifiedName, value);\n }\n }\n toJSON({ attr, normalize, } = {}) {\n const { attributes, style, listeners, _text } = this;\n const res = {};\n if (Object.keys(attributes).length) {\n res.a = normalize ? normalize(attributes) : attributes;\n }\n const events = Object.keys(listeners);\n if (events.length) {\n let w = undefined;\n const e = {};\n events.forEach((name) => {\n const handlers = listeners[name];\n if (handlers.length) {\n // 可能存在多个 handler 且不同 modifiers 吗?\n const { wxsEvent, modifiers } = handlers[0];\n const modifier = encodeModifier(modifiers || []);\n if (!wxsEvent) {\n e[name] = modifier;\n }\n else {\n if (!w) {\n w = {};\n }\n w[name] = [normalize ? normalize(wxsEvent) : wxsEvent, modifier];\n }\n }\n });\n res.e = normalize ? normalize(e, false) : e;\n if (w) {\n res.w = normalize ? normalize(w, false) : w;\n }\n }\n if (style !== null) {\n res.s = normalize ? normalize(style) : style;\n }\n if (!attr) {\n res.i = this.nodeId;\n res.n = this.nodeName;\n }\n if (_text !== null) {\n res.t = normalize ? normalize(_text) : _text;\n }\n return res;\n }\n}\n\nclass UniCommentNode extends UniNode {\n constructor(text, container) {\n super(NODE_TYPE_COMMENT, '#comment', container);\n this._text = (process.env.NODE_ENV !== 'production') ? text : '';\n }\n toJSON(opts = {}) {\n // 暂时不传递 text 到 view 层,没啥意义,节省点数据量\n return opts.attr\n ? {}\n : {\n i: this.nodeId,\n };\n // return opts.attr\n // ? { t: this._text as string }\n // : {\n // i: this.nodeId!,\n // t: this._text as string,\n // }\n }\n}\n\nclass UniElement extends UniBaseNode {\n constructor(nodeName, container) {\n super(NODE_TYPE_ELEMENT, nodeName.toUpperCase(), container);\n this.tagName = this.nodeName;\n }\n}\nclass UniInputElement extends UniElement {\n get value() {\n return this.getAttribute('value');\n }\n set value(val) {\n this.setAttribute('value', val);\n }\n}\nclass UniTextAreaElement extends UniInputElement {\n}\n\nclass UniTextNode extends UniBaseNode {\n constructor(text, container) {\n super(NODE_TYPE_TEXT, '#text', container);\n this._text = text;\n }\n get nodeValue() {\n return this._text || '';\n }\n set nodeValue(text) {\n this._text = text;\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onNodeValue(this, text);\n }\n }\n}\n\nconst forcePatchProps = {\n AD: ['data'],\n 'AD-DRAW': ['data'],\n 'LIVE-PLAYER': ['picture-in-picture-mode'],\n MAP: [\n 'markers',\n 'polyline',\n 'circles',\n 'controls',\n 'include-points',\n 'polygons',\n ],\n PICKER: ['range', 'value'],\n 'PICKER-VIEW': ['value'],\n 'RICH-TEXT': ['nodes'],\n VIDEO: ['danmu-list', 'header'],\n 'WEB-VIEW': ['webview-styles'],\n};\nconst forcePatchPropKeys = ['animation'];\n\nconst forcePatchProp = (el, key) => {\n if (forcePatchPropKeys.indexOf(key) > -1) {\n return true;\n }\n const keys = forcePatchProps[el.nodeName];\n if (keys && keys.indexOf(key) > -1) {\n return true;\n }\n return false;\n};\n\nconst ACTION_TYPE_PAGE_CREATE = 1;\nconst ACTION_TYPE_PAGE_CREATED = 2;\nconst ACTION_TYPE_CREATE = 3;\nconst ACTION_TYPE_INSERT = 4;\nconst ACTION_TYPE_REMOVE = 5;\nconst ACTION_TYPE_SET_ATTRIBUTE = 6;\nconst ACTION_TYPE_REMOVE_ATTRIBUTE = 7;\nconst ACTION_TYPE_ADD_EVENT = 8;\nconst ACTION_TYPE_REMOVE_EVENT = 9;\nconst ACTION_TYPE_SET_TEXT = 10;\nconst ACTION_TYPE_ADD_WXS_EVENT = 12;\nconst ACTION_TYPE_PAGE_SCROLL = 15;\nconst ACTION_TYPE_EVENT = 20;\n\n/**\n * 需要手动传入 timer,主要是解决 App 平台的定制 timer\n */\nfunction debounce(fn, delay, { clearTimeout, setTimeout }) {\n let timeout;\n const newFn = function () {\n clearTimeout(timeout);\n const timerFn = () => fn.apply(this, arguments);\n timeout = setTimeout(timerFn, delay);\n };\n newFn.cancel = function () {\n clearTimeout(timeout);\n };\n return newFn;\n}\n\nclass EventChannel {\n constructor(id, events) {\n this.id = id;\n this.listener = {};\n this.emitCache = [];\n if (events) {\n Object.keys(events).forEach((name) => {\n this.on(name, events[name]);\n });\n }\n }\n emit(eventName, ...args) {\n const fns = this.listener[eventName];\n if (!fns) {\n return this.emitCache.push({\n eventName,\n args,\n });\n }\n fns.forEach((opt) => {\n opt.fn.apply(opt.fn, args);\n });\n this.listener[eventName] = fns.filter((opt) => opt.type !== 'once');\n }\n on(eventName, fn) {\n this._addListener(eventName, 'on', fn);\n this._clearCache(eventName);\n }\n once(eventName, fn) {\n this._addListener(eventName, 'once', fn);\n this._clearCache(eventName);\n }\n off(eventName, fn) {\n const fns = this.listener[eventName];\n if (!fns) {\n return;\n }\n if (fn) {\n for (let i = 0; i < fns.length;) {\n if (fns[i].fn === fn) {\n fns.splice(i, 1);\n i--;\n }\n i++;\n }\n }\n else {\n delete this.listener[eventName];\n }\n }\n _clearCache(eventName) {\n for (let index = 0; index < this.emitCache.length; index++) {\n const cache = this.emitCache[index];\n const _name = eventName\n ? cache.eventName === eventName\n ? eventName\n : null\n : cache.eventName;\n if (!_name)\n continue;\n const location = this.emit.apply(this, [_name, ...cache.args]);\n if (typeof location === 'number') {\n this.emitCache.pop();\n continue;\n }\n this.emitCache.splice(index, 1);\n index--;\n }\n }\n _addListener(eventName, type, fn) {\n (this.listener[eventName] || (this.listener[eventName] = [])).push({\n fn,\n type,\n });\n }\n}\n\nconst PAGE_HOOKS = [\n ON_INIT,\n ON_LOAD,\n ON_SHOW,\n ON_HIDE,\n ON_UNLOAD,\n ON_BACK_PRESS,\n ON_PAGE_SCROLL,\n ON_TAB_ITEM_TAP,\n ON_REACH_BOTTOM,\n ON_PULL_DOWN_REFRESH,\n ON_SHARE_TIMELINE,\n ON_SHARE_APP_MESSAGE,\n ON_SHARE_CHAT,\n ON_ADD_TO_FAVORITES,\n ON_SAVE_EXIT_STATE,\n ON_NAVIGATION_BAR_BUTTON_TAP,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED,\n];\nfunction isRootImmediateHook(name) {\n const PAGE_SYNC_HOOKS = [ON_LOAD, ON_SHOW];\n return PAGE_SYNC_HOOKS.indexOf(name) > -1;\n}\n// isRootImmediateHookX deprecated\nfunction isRootHook(name) {\n return PAGE_HOOKS.indexOf(name) > -1;\n}\nconst UniLifecycleHooks = [\n ON_SHOW,\n ON_HIDE,\n ON_LAUNCH,\n ON_ERROR,\n ON_THEME_CHANGE,\n ON_PAGE_NOT_FOUND,\n ON_UNHANDLE_REJECTION,\n ON_EXIT,\n ON_INIT,\n ON_LOAD,\n ON_READY,\n ON_UNLOAD,\n ON_RESIZE,\n ON_BACK_PRESS,\n ON_PAGE_SCROLL,\n ON_TAB_ITEM_TAP,\n ON_REACH_BOTTOM,\n ON_PULL_DOWN_REFRESH,\n ON_SHARE_TIMELINE,\n ON_ADD_TO_FAVORITES,\n ON_SHARE_APP_MESSAGE,\n ON_SHARE_CHAT,\n ON_SAVE_EXIT_STATE,\n ON_NAVIGATION_BAR_BUTTON_TAP,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED,\n];\nconst MINI_PROGRAM_PAGE_RUNTIME_HOOKS = /*#__PURE__*/ (() => {\n return {\n onPageScroll: 1,\n onShareAppMessage: 1 << 1,\n onShareTimeline: 1 << 2,\n onShareChat: 1 << 3,\n };\n})();\nfunction isUniLifecycleHook(name, value, checkType = true) {\n // 检查类型\n if (checkType && !isFunction(value)) {\n return false;\n }\n if (UniLifecycleHooks.indexOf(name) > -1) {\n // 已预定义\n return true;\n }\n else if (name.indexOf('on') === 0) {\n // 以 on 开头\n return true;\n }\n return false;\n}\n\nlet vueApp;\nconst createVueAppHooks = [];\n/**\n * 提供 createApp 的回调事件,方便三方插件接收 App 对象,处理挂靠全局 mixin 之类的逻辑\n */\nfunction onCreateVueApp(hook) {\n // TODO 每个 nvue 页面都会触发\n if (vueApp) {\n return hook(vueApp);\n }\n createVueAppHooks.push(hook);\n}\nfunction invokeCreateVueAppHook(app) {\n vueApp = app;\n createVueAppHooks.forEach((hook) => hook(app));\n}\nconst invokeCreateErrorHandler = once((app, createErrorHandler) => {\n // 不再判断开发者是否监听了onError,直接返回 createErrorHandler,内部 errorHandler 会调用开发者自定义的 errorHandler,以及判断开发者是否监听了onError\n return createErrorHandler(app);\n});\n\nconst E = function () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n};\nE.prototype = {\n _id: 1,\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx,\n _id: this._id,\n });\n return this._id++;\n },\n once: function (name, callback, ctx) {\n var self = this;\n function listener() {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n }\n listener._ = callback;\n return this.on(name, listener, ctx);\n },\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n return this;\n },\n off: function (name, event) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n if (evts && event) {\n for (var i = evts.length - 1; i >= 0; i--) {\n if (evts[i].fn === event ||\n evts[i].fn._ === event ||\n evts[i]._id === event) {\n evts.splice(i, 1);\n break;\n }\n }\n liveEvents = evts;\n }\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n liveEvents.length ? (e[name] = liveEvents) : delete e[name];\n return this;\n },\n};\nvar E$1 = E;\n\nconst borderStyles = {\n black: 'rgba(0,0,0,0.4)',\n white: 'rgba(255,255,255,0.4)',\n};\nfunction normalizeTabBarStyles(borderStyle) {\n if (borderStyle && borderStyle in borderStyles) {\n return borderStyles[borderStyle];\n }\n return borderStyle;\n}\nfunction normalizeTitleColor(titleColor) {\n return titleColor === 'black' ? '#000000' : '#ffffff';\n}\nfunction resolveStringStyleItem(modeStyle, styleItem, key) {\n if (isString(styleItem) && styleItem.startsWith('@')) {\n const _key = styleItem.replace('@', '');\n let _styleItem = modeStyle[_key] || styleItem;\n switch (key) {\n case 'titleColor':\n _styleItem = normalizeTitleColor(_styleItem);\n break;\n case 'borderStyle':\n _styleItem = normalizeTabBarStyles(_styleItem);\n break;\n }\n return _styleItem;\n }\n return styleItem;\n}\nfunction normalizeStyles(pageStyle, themeConfig = {}, mode = 'light') {\n const modeStyle = themeConfig[mode];\n const styles = {};\n if (typeof modeStyle === 'undefined' || !pageStyle)\n return pageStyle;\n Object.keys(pageStyle).forEach((key) => {\n const styleItem = pageStyle[key]; // Object Array String\n const parseStyleItem = () => {\n if (isPlainObject(styleItem))\n return normalizeStyles(styleItem, themeConfig, mode);\n if (isArray(styleItem))\n return styleItem.map((item) => {\n if (isPlainObject(item))\n return normalizeStyles(item, themeConfig, mode);\n return resolveStringStyleItem(modeStyle, item);\n });\n return resolveStringStyleItem(modeStyle, styleItem, key);\n };\n styles[key] = parseStyleItem();\n });\n return styles;\n}\n\nfunction getEnvLocale() {\n const { env } = process;\n const lang = env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE;\n return (lang && lang.replace(/[.:].*/, '')) || 'en';\n}\n\nconst isStringIntegerKey = (key) => typeof key === 'string' &&\n key !== 'NaN' &&\n key[0] !== '-' &&\n '' + parseInt(key, 10) === key;\nconst isNumberIntegerKey = (key) => typeof key === 'number' &&\n !isNaN(key) &&\n key >= 0 &&\n parseInt(key + '', 10) === key;\n/**\n * 用于替代@vue/shared的isIntegerKey,原始方法在鸿蒙arkts中会引发bug。根本原因是arkts的数组的key是数字而不是字符串。\n * 目前这个方法使用的地方都和数组有关,切记不能挪作他用。\n * @param key\n * @returns\n */\nconst isIntegerKey = (key) => isNumberIntegerKey(key) || isStringIntegerKey(key);\n\nconst GLOBALS_ALLOWED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +\n 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +\n 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,' +\n 'uni';\nconst isGloballyAllowed = /*#__PURE__*/ makeMap(GLOBALS_ALLOWED);\n\nexport { ACTION_TYPE_ADD_EVENT, ACTION_TYPE_ADD_WXS_EVENT, ACTION_TYPE_CREATE, ACTION_TYPE_EVENT, ACTION_TYPE_INSERT, ACTION_TYPE_PAGE_CREATE, ACTION_TYPE_PAGE_CREATED, ACTION_TYPE_PAGE_SCROLL, ACTION_TYPE_REMOVE, ACTION_TYPE_REMOVE_ATTRIBUTE, ACTION_TYPE_REMOVE_EVENT, ACTION_TYPE_SET_ATTRIBUTE, ACTION_TYPE_SET_TEXT, ATTR_CHANGE_PREFIX, ATTR_CLASS, ATTR_INNER_HTML, ATTR_STYLE, ATTR_TEXT_CONTENT, ATTR_V_OWNER_ID, ATTR_V_RENDERJS, ATTR_V_SHOW, BACKGROUND_COLOR, BUILT_IN_TAGS, BUILT_IN_TAG_NAMES, COMPONENT_NAME_PREFIX, COMPONENT_PREFIX, COMPONENT_SELECTOR_PREFIX, DATA_RE, E$1 as Emitter, EventChannel, EventModifierFlags, I18N_JSON_DELIMITERS, JSON_PROTOCOL, LINEFEED, MINI_PROGRAM_PAGE_RUNTIME_HOOKS, NAVBAR_HEIGHT, NODE_TYPE_COMMENT, NODE_TYPE_ELEMENT, NODE_TYPE_PAGE, NODE_TYPE_TEXT, NVUE_BUILT_IN_TAGS, NVUE_U_BUILT_IN_TAGS, OFF_HOST_THEME_CHANGE, OFF_THEME_CHANGE, ON_ADD_TO_FAVORITES, ON_APP_ENTER_BACKGROUND, ON_APP_ENTER_FOREGROUND, ON_BACK_PRESS, ON_ERROR, ON_EXIT, ON_HIDE, ON_HOST_THEME_CHANGE, ON_INIT, ON_KEYBOARD_HEIGHT_CHANGE, ON_LAST_PAGE_BACK_PRESS, ON_LAUNCH, ON_LOAD, ON_NAVIGATION_BAR_BUTTON_TAP, ON_NAVIGATION_BAR_CHANGE, ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, ON_PAGE_NOT_FOUND, ON_PAGE_SCROLL, ON_PULL_DOWN_REFRESH, ON_REACH_BOTTOM, ON_REACH_BOTTOM_DISTANCE, ON_READY, ON_RESIZE, ON_SAVE_EXIT_STATE, ON_SHARE_APP_MESSAGE, ON_SHARE_CHAT, ON_SHARE_TIMELINE, ON_SHOW, ON_TAB_ITEM_TAP, ON_THEME_CHANGE, ON_UNHANDLE_REJECTION, ON_UNLOAD, ON_WEB_INVOKE_APP_SERVICE, ON_WXS_INVOKE_CALL_METHOD, PLUS_RE, PRIMARY_COLOR, RENDERJS_MODULES, RESPONSIVE_MIN_WIDTH, SCHEME_RE, SELECTED_COLOR, SLOT_DEFAULT_NAME, TABBAR_HEIGHT, TAGS, UNI_AD_PLUGINS, UNI_SSR, UNI_SSR_DATA, UNI_SSR_GLOBAL_DATA, UNI_SSR_STORE, UNI_SSR_TITLE, UNI_STORAGE_LOCALE, UNI_UI_CONFLICT_TAGS, UVUE_BUILT_IN_TAGS, UVUE_HARMONY_BUILT_IN_TAGS, UVUE_IOS_BUILT_IN_TAGS, UVUE_WEB_BUILT_IN_CUSTOM_ELEMENTS, UVUE_WEB_BUILT_IN_TAGS, UniBaseNode, UniCommentNode, UniElement, UniEvent, UniInputElement, UniLifecycleHooks, UniNode, UniTextAreaElement, UniTextNode, VIRTUAL_HOST_CLASS, VIRTUAL_HOST_HIDDEN, VIRTUAL_HOST_ID, VIRTUAL_HOST_STYLE, WEB_INVOKE_APPSERVICE, WXS_MODULES, WXS_PROTOCOL, addFont, addLeadingSlash, borderStyles, cache, cacheStringFunction, callOptions, createIsCustomElement, createRpx2Unit, createUniEvent, customizeEvent, debounce, decode, decodedQuery, defaultMiniProgramRpx2Unit, defaultNVueRpx2Unit, defaultRpx2Unit, dynamicSlotName, forcePatchProp, formatDateTime, formatLog, getCustomDataset, getEnvLocale, getGlobal, getLen, getValueByDataPath, initCustomDatasetOnce, invokeArrayFns, invokeCreateErrorHandler, invokeCreateVueAppHook, isAppHarmonyUVueNativeTag, isAppIOSUVueNativeTag, isAppNVueNativeTag, isAppNativeTag, isAppUVueBuiltInEasyComponent, isAppUVueNativeTag, isAppVoidTag, isBuiltInComponent, isComponentInternalInstance, isComponentTag, isGloballyAllowed, isH5CustomElement, isH5NativeTag, isIntegerKey, isMiniProgramNativeTag, isMiniProgramUVueNativeTag, isRootHook, isRootImmediateHook, isUniLifecycleHook, isUniXElement, normalizeClass, normalizeDataset, normalizeEventType, normalizeProps, normalizeStyle, normalizeStyles, normalizeTabBarStyles, normalizeTarget, normalizeTitleColor, onCreateVueApp, once, parseEventName, parseNVueDataset, parseQuery, parseUrl, passive, plusReady, removeLeadingSlash, resolveComponentInstance, resolveOwnerEl, resolveOwnerVm, sanitise, scrollTo, sortObject, stringifyQuery, updateElementStyle };\n","import { isRootHook, getValueByDataPath, isUniLifecycleHook, ON_ERROR, UniLifecycleHooks, invokeCreateErrorHandler, normalizeStyle as normalizeStyle$1, dynamicSlotName, normalizeClass as normalizeClass$1 } from '@dcloudio/uni-shared';\nimport { NOOP, extend, isSymbol, isObject, def, hasChanged, isFunction, isArray, isPromise, camelize, capitalize, EMPTY_OBJ, remove, toHandlerKey, hasOwn, hyphenate, isReservedProp, toRawType, isString, normalizeClass, normalizeStyle, isOn, toTypeString, isMap, isIntegerKey, isSet, isPlainObject, makeMap, invokeArrayFns, isBuiltInDirective, looseToNumber, NO, EMPTY_ARR, isModelListener, toNumber, toDisplayString } from '@vue/shared';\nexport { EMPTY_OBJ, camelize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\n/**\n* @dcloudio/uni-mp-vue v3.4.21\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n\nfunction warn$2(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n activeEffectScope = this;\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n activeEffectScope = this.parent;\n }\n stop(fromParent) {\n if (this._active) {\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n this._active = false;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction recordEffectScope(effect, scope = activeEffectScope) {\n if (scope && scope.active) {\n scope.effects.push(effect);\n }\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeEffect;\nclass ReactiveEffect {\n constructor(fn, trigger, scheduler, scope) {\n this.fn = fn;\n this.trigger = trigger;\n this.scheduler = scheduler;\n this.active = true;\n this.deps = [];\n /**\n * @internal\n */\n this._dirtyLevel = 4;\n /**\n * @internal\n */\n this._trackId = 0;\n /**\n * @internal\n */\n this._runnings = 0;\n /**\n * @internal\n */\n this._shouldSchedule = false;\n /**\n * @internal\n */\n this._depsLength = 0;\n recordEffectScope(this, scope);\n }\n get dirty() {\n if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {\n this._dirtyLevel = 1;\n pauseTracking();\n for (let i = 0; i < this._depsLength; i++) {\n const dep = this.deps[i];\n if (dep.computed) {\n triggerComputed(dep.computed);\n if (this._dirtyLevel >= 4) {\n break;\n }\n }\n }\n if (this._dirtyLevel === 1) {\n this._dirtyLevel = 0;\n }\n resetTracking();\n }\n return this._dirtyLevel >= 4;\n }\n set dirty(v) {\n this._dirtyLevel = v ? 4 : 0;\n }\n run() {\n this._dirtyLevel = 0;\n if (!this.active) {\n return this.fn();\n }\n let lastShouldTrack = shouldTrack;\n let lastEffect = activeEffect;\n try {\n shouldTrack = true;\n activeEffect = this;\n this._runnings++;\n preCleanupEffect(this);\n return this.fn();\n } finally {\n postCleanupEffect(this);\n this._runnings--;\n activeEffect = lastEffect;\n shouldTrack = lastShouldTrack;\n }\n }\n stop() {\n var _a;\n if (this.active) {\n preCleanupEffect(this);\n postCleanupEffect(this);\n (_a = this.onStop) == null ? void 0 : _a.call(this);\n this.active = false;\n }\n }\n}\nfunction triggerComputed(computed) {\n return computed.value;\n}\nfunction preCleanupEffect(effect2) {\n effect2._trackId++;\n effect2._depsLength = 0;\n}\nfunction postCleanupEffect(effect2) {\n if (effect2.deps.length > effect2._depsLength) {\n for (let i = effect2._depsLength; i < effect2.deps.length; i++) {\n cleanupDepEffect(effect2.deps[i], effect2);\n }\n effect2.deps.length = effect2._depsLength;\n }\n}\nfunction cleanupDepEffect(dep, effect2) {\n const trackId = dep.get(effect2);\n if (trackId !== void 0 && effect2._trackId !== trackId) {\n dep.delete(effect2);\n if (dep.size === 0) {\n dep.cleanup();\n }\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const _effect = new ReactiveEffect(fn, NOOP, () => {\n if (_effect.dirty) {\n _effect.run();\n }\n });\n if (options) {\n extend(_effect, options);\n if (options.scope)\n recordEffectScope(_effect, options.scope);\n }\n if (!options || !options.lazy) {\n _effect.run();\n }\n const runner = _effect.run.bind(_effect);\n runner.effect = _effect;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nlet pauseScheduleStack = 0;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction pauseScheduling() {\n pauseScheduleStack++;\n}\nfunction resetScheduling() {\n pauseScheduleStack--;\n while (!pauseScheduleStack && queueEffectSchedulers.length) {\n queueEffectSchedulers.shift()();\n }\n}\nfunction trackEffect(effect2, dep, debuggerEventExtraInfo) {\n var _a;\n if (dep.get(effect2) !== effect2._trackId) {\n dep.set(effect2, effect2._trackId);\n const oldDep = effect2.deps[effect2._depsLength];\n if (oldDep !== dep) {\n if (oldDep) {\n cleanupDepEffect(oldDep, effect2);\n }\n effect2.deps[effect2._depsLength++] = dep;\n } else {\n effect2._depsLength++;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n }\n }\n}\nconst queueEffectSchedulers = [];\nfunction triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {\n var _a;\n pauseScheduling();\n for (const effect2 of dep.keys()) {\n let tracking;\n if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);\n effect2._dirtyLevel = dirtyLevel;\n }\n if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n }\n effect2.trigger();\n if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {\n effect2._shouldSchedule = false;\n if (effect2.scheduler) {\n queueEffectSchedulers.push(effect2.scheduler);\n }\n }\n }\n }\n resetScheduling();\n}\n\nconst createDep = (cleanup, computed) => {\n const dep = /* @__PURE__ */ new Map();\n dep.cleanup = cleanup;\n dep.computed = computed;\n return dep;\n};\n\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"iterate\" : \"\");\nconst MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"Map key iterate\" : \"\");\nfunction track(target, type, key) {\n if (shouldTrack && activeEffect) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = createDep(() => depsMap.delete(key)));\n }\n trackEffect(\n activeEffect,\n dep,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target,\n type,\n key\n } : void 0\n );\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n let deps = [];\n if (type === \"clear\") {\n deps = [...depsMap.values()];\n } else if (key === \"length\" && isArray(target)) {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || !isSymbol(key2) && key2 >= newLength) {\n deps.push(dep);\n }\n });\n } else {\n if (key !== void 0) {\n deps.push(depsMap.get(key));\n }\n switch (type) {\n case \"add\":\n if (!isArray(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isIntegerKey(key)) {\n deps.push(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!isArray(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n pauseScheduling();\n for (const dep of deps) {\n if (dep) {\n triggerEffects(\n dep,\n 4,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n } : void 0\n );\n }\n }\n resetScheduling();\n}\nfunction getDepFromReactive(object, key) {\n var _a;\n return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nconst arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n for (let i = 0, l = this.length; i < l; i++) {\n track(arr, \"get\", i + \"\");\n }\n const res = arr[key](...args);\n if (res === -1 || res === false) {\n return arr[key](...args.map(toRaw));\n } else {\n return res;\n }\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n pauseTracking();\n pauseScheduling();\n const res = toRaw(this)[key].apply(this, args);\n resetScheduling();\n resetTracking();\n return res;\n };\n });\n return instrumentations;\n}\nfunction hasOwnProperty(key) {\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the reciever is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n if (targetIsArray && hasOwn(arrayInstrumentations, key)) {\n return Reflect.get(arrayInstrumentations, key, receiver);\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(target, key, receiver);\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n return false;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(target, key, value, receiver);\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(\n true\n);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get(target, key, isReadonly = false, isShallow = false) {\n target = target[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!isReadonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has: has2 } = getProto(rawTarget);\n const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n if (has2.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has2.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n}\nfunction has(key, isReadonly = false) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!isReadonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly = false) {\n target = target[\"__v_raw\"];\n !isReadonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return Reflect.get(target, \"size\", target);\n}\nfunction add(value) {\n value = toRaw(value);\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n}\nfunction set$1(key, value) {\n value = toRaw(value);\n const target = toRaw(this);\n const { has: has2, get: get2 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has2.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get2.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n}\nfunction deleteEntry(key) {\n const target = toRaw(this);\n const { has: has2, get: get2 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has2.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get2 ? get2.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n}\nfunction clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(target, \"clear\", void 0, void 0, oldTarget);\n }\n return result;\n}\nfunction createForEach(isReadonly, isShallow) {\n return function forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n !isReadonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n };\n}\nfunction createIterableMethod(method, isReadonly, isShallow) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n !isReadonly && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn$2(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations() {\n const mutableInstrumentations2 = {\n get(key) {\n return get(this, key);\n },\n get size() {\n return size(this);\n },\n has,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, false)\n };\n const shallowInstrumentations2 = {\n get(key) {\n return get(this, key, false, true);\n },\n get size() {\n return size(this);\n },\n has,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, true)\n };\n const readonlyInstrumentations2 = {\n get(key) {\n return get(this, key, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has.call(this, key, true);\n },\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\"),\n forEach: createForEach(true, false)\n };\n const shallowReadonlyInstrumentations2 = {\n get(key) {\n return get(this, key, true, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has.call(this, key, true);\n },\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\"),\n forEach: createForEach(true, true)\n };\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n mutableInstrumentations2[method] = createIterableMethod(method, false, false);\n readonlyInstrumentations2[method] = createIterableMethod(method, true, false);\n shallowInstrumentations2[method] = createIterableMethod(method, false, true);\n shallowReadonlyInstrumentations2[method] = createIterableMethod(\n method,\n true,\n true\n );\n });\n return [\n mutableInstrumentations2,\n readonlyInstrumentations2,\n shallowInstrumentations2,\n shallowReadonlyInstrumentations2\n ];\n}\nconst [\n mutableInstrumentations,\n readonlyInstrumentations,\n shallowInstrumentations,\n shallowReadonlyInstrumentations\n] = /* @__PURE__ */ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly, shallow) {\n const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has2, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has2.call(target, rawKey)) {\n const type = toRawType(target);\n warn$2(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(`value cannot be made reactive: ${String(target)}`);\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return isReactive(value) || isReadonly(value);\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nconst COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;\nclass ComputedRefImpl {\n constructor(getter, _setter, isReadonly, isSSR) {\n this.getter = getter;\n this._setter = _setter;\n this.dep = void 0;\n this.__v_isRef = true;\n this[\"__v_isReadonly\"] = false;\n this.effect = new ReactiveEffect(\n () => getter(this._value),\n () => triggerRefValue(\n this,\n this.effect._dirtyLevel === 2 ? 2 : 3\n )\n );\n this.effect.computed = this;\n this.effect.active = this._cacheable = !isSSR;\n this[\"__v_isReadonly\"] = isReadonly;\n }\n get value() {\n const self = toRaw(this);\n if ((!self._cacheable || self.effect.dirty) && hasChanged(self._value, self._value = self.effect.run())) {\n triggerRefValue(self, 4);\n }\n trackRefValue(self);\n if (self.effect._dirtyLevel >= 2) {\n if (!!(process.env.NODE_ENV !== \"production\") && this._warnRecursive) {\n warn$2(COMPUTED_SIDE_EFFECT_WARN, `\n\ngetter: `, this.getter);\n }\n triggerRefValue(self, 2);\n }\n return self._value;\n }\n set value(newValue) {\n this._setter(newValue);\n }\n // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x\n get _dirty() {\n return this.effect.dirty;\n }\n set _dirty(v) {\n this.effect.dirty = v;\n }\n // #endregion\n}\nfunction computed$1(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n const onlyGetter = isFunction(getterOrOptions);\n if (onlyGetter) {\n getter = getterOrOptions;\n setter = !!(process.env.NODE_ENV !== \"production\") ? () => {\n warn$2(\"Write operation failed: computed value is readonly\");\n } : NOOP;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.effect.onTrack = debugOptions.onTrack;\n cRef.effect.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nfunction trackRefValue(ref2) {\n var _a;\n if (shouldTrack && activeEffect) {\n ref2 = toRaw(ref2);\n trackEffect(\n activeEffect,\n (_a = ref2.dep) != null ? _a : ref2.dep = createDep(\n () => ref2.dep = void 0,\n ref2 instanceof ComputedRefImpl ? ref2 : void 0\n ),\n !!(process.env.NODE_ENV !== \"production\") ? {\n target: ref2,\n type: \"get\",\n key: \"value\"\n } : void 0\n );\n }\n}\nfunction triggerRefValue(ref2, dirtyLevel = 4, newVal) {\n ref2 = toRaw(ref2);\n const dep = ref2.dep;\n if (dep) {\n triggerEffects(\n dep,\n dirtyLevel,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: newVal\n } : void 0\n );\n }\n}\nfunction isRef(r) {\n return !!(r && r.__v_isRef === true);\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, __v_isShallow) {\n this.__v_isShallow = __v_isShallow;\n this.dep = void 0;\n this.__v_isRef = true;\n this._rawValue = __v_isShallow ? value : toRaw(value);\n this._value = __v_isShallow ? value : toReactive(value);\n }\n get value() {\n trackRefValue(this);\n return this._value;\n }\n set value(newVal) {\n const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);\n newVal = useDirectValue ? newVal : toRaw(newVal);\n if (hasChanged(newVal, this._rawValue)) {\n this._rawValue = newVal;\n this._value = useDirectValue ? newVal : toReactive(newVal);\n triggerRefValue(this, 4, newVal);\n }\n }\n}\nfunction triggerRef(ref2) {\n triggerRefValue(ref2, 4, !!(process.env.NODE_ENV !== \"production\") ? ref2.value : void 0);\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this.dep = void 0;\n this.__v_isRef = true;\n const { get, set } = factory(\n () => trackRefValue(this),\n () => triggerRefValue(this)\n );\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn$2(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this.__v_isRef = true;\n }\n get value() {\n const val = this._object[this._key];\n return val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(toRaw(this._object), this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this.__v_isRef = true;\n this.__v_isReadonly = true;\n }\n get value() {\n return this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n const val = source[key];\n return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nfunction warn$1(msg, ...args) {\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\n\nconst ErrorTypeStrings = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core .\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings[type] || type : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n const appErrorHandler = instance.appContext.config.errorHandler;\n if (appErrorHandler) {\n callWithErrorHandling(\n appErrorHandler,\n null,\n 10,\n [err, exposedInstance, errorInfo]\n );\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev);\n}\nfunction logError(err, type, contextVNode, throwInDev = true) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings[type] || type;\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n console.error(err);\n } else {\n console.error(err);\n }\n } else {\n console.error(err);\n }\n}\n\nlet isFlushing = false;\nlet isFlushPending = false;\nconst queue = [];\nlet flushIndex = 0;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick$1(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.pre) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!queue.length || !queue.includes(\n job,\n isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex\n )) {\n if (job.id == null) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(job.id), 0, job);\n }\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!isFlushing && !isFlushPending) {\n isFlushPending = true;\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction hasQueueJob(job) {\n return queue.indexOf(job) > -1;\n}\nfunction invalidateJob(job) {\n const i = queue.indexOf(job);\n if (i > flushIndex) {\n queue.splice(i, 1);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (!activePostFlushCbs || !activePostFlushCbs.includes(\n cb,\n cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex\n )) {\n pendingPostFlushCbs.push(cb);\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.pre) {\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n cb();\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {\n continue;\n }\n activePostFlushCbs[postFlushIndex]();\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? Infinity : job.id;\nconst comparator = (a, b) => {\n const diff = getId(a) - getId(b);\n if (diff === 0) {\n if (a.pre && !b.pre)\n return -1;\n if (b.pre && !a.pre)\n return 1;\n }\n return diff;\n};\nfunction flushJobs(seen) {\n isFlushPending = false;\n isFlushing = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n queue.sort(comparator);\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && job.active !== false) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n callWithErrorHandling(job, null, 14);\n }\n }\n } finally {\n flushIndex = 0;\n queue.length = 0;\n flushPostFlushCbs(seen);\n isFlushing = false;\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n if (!seen.has(fn)) {\n seen.set(fn, 1);\n } else {\n const count = seen.get(fn);\n if (count > RECURSION_LIMIT) {\n const instance = fn.ownerInstance;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n } else {\n seen.set(fn, count + 1);\n }\n }\n}\n\nlet devtools;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools) {\n devtools.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook(hook, target) {\n var _a, _b;\n devtools = hook;\n if (devtools) {\n devtools.enabled = true;\n buffer.forEach(({ event, args }) => devtools.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook(newHook, target);\n });\n setTimeout(() => {\n if (!devtools) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:added\" /* COMPONENT_ADDED */\n);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools && typeof devtools.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n // fixed by xxxxxx\n // 为 0 是 App,无 parent 是 Page 指向 App\n component.uid === 0 ? void 0 : component.parent ? component.parent.uid : 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\n \"perf:start\" /* PERFORMANCE_START */\n);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\n \"perf:end\" /* PERFORMANCE_END */\n);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nfunction emit(instance, event, ...rawArgs) {\n if (instance.isUnmounted)\n return;\n const props = instance.vnode.props || EMPTY_OBJ;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const {\n emitsOptions,\n propsOptions: [propsOptions]\n } = instance;\n if (emitsOptions) {\n if (!(event in emitsOptions) && true) {\n if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {\n warn$1(\n `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(event)}\" prop.`\n );\n }\n } else {\n const validator = emitsOptions[event];\n if (isFunction(validator)) {\n const isValid = validator(...rawArgs);\n if (!isValid) {\n warn$1(\n `Invalid event arguments: event validation failed for event \"${event}\".`\n );\n }\n }\n }\n }\n }\n let args = rawArgs;\n const isModelListener = event.startsWith(\"update:\");\n const modelArg = isModelListener && event.slice(7);\n if (modelArg && modelArg in props) {\n const modifiersKey = `${modelArg === \"modelValue\" ? \"model\" : modelArg}Modifiers`;\n const { number, trim } = props[modifiersKey] || EMPTY_OBJ;\n if (trim) {\n args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n }\n if (number) {\n args = rawArgs.map(looseToNumber);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentEmit(instance, event, args);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const lowerCaseEvent = event.toLowerCase();\n if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n warn$1(\n `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n instance,\n instance.type\n )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(\n event\n )}\" instead of \"${event}\".`\n );\n }\n }\n let handlerName;\n let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n props[handlerName = toHandlerKey(camelize(event))];\n if (!handler && isModelListener) {\n handler = props[handlerName = toHandlerKey(hyphenate(event))];\n }\n if (handler) {\n callWithAsyncErrorHandling(\n handler,\n instance,\n 6,\n args\n );\n }\n const onceHandler = props[handlerName + `Once`];\n if (onceHandler) {\n if (!instance.emitted) {\n instance.emitted = {};\n } else if (instance.emitted[handlerName]) {\n return;\n }\n instance.emitted[handlerName] = true;\n callWithAsyncErrorHandling(\n onceHandler,\n instance,\n 6,\n args\n );\n }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n const cache = appContext.emitsCache;\n const cached = cache.get(comp);\n if (cached !== void 0) {\n return cached;\n }\n const raw = comp.emits;\n let normalized = {};\n let hasExtends = false;\n if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n const extendEmits = (raw2) => {\n const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n if (normalizedFromExtend) {\n hasExtends = true;\n extend(normalized, normalizedFromExtend);\n }\n };\n if (!asMixin && appContext.mixins.length) {\n appContext.mixins.forEach(extendEmits);\n }\n if (comp.extends) {\n extendEmits(comp.extends);\n }\n if (comp.mixins) {\n comp.mixins.forEach(extendEmits);\n }\n }\n if (!raw && !hasExtends) {\n if (isObject(comp)) {\n cache.set(comp, null);\n }\n return null;\n }\n if (isArray(raw)) {\n raw.forEach((key) => normalized[key] = null);\n } else {\n extend(normalized, raw);\n }\n if (isObject(comp)) {\n cache.set(comp, normalized);\n }\n return normalized;\n}\nfunction isEmitListener(options, key) {\n if (!options || !isOn(key)) {\n return false;\n }\n key = key.slice(2).replace(/Once$/, \"\");\n return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx)\n return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction markAttrsAccessed() {\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nconst ssrContextKey = Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nconst INITIAL_WATCHER_VALUE = {};\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, {\n immediate,\n deep,\n flush,\n once,\n onTrack,\n onTrigger\n} = EMPTY_OBJ) {\n if (cb && once) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n unwatch();\n };\n }\n if (!!(process.env.NODE_ENV !== \"production\") && deep !== void 0 && typeof deep === \"number\") {\n warn$1(\n `watch() \"deep\" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.`\n );\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const warnInvalidSource = (s) => {\n warn$1(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const instance = currentInstance;\n const reactiveGetter = (source2) => deep === true ? source2 : (\n // for deep: false, only traverse root-level properties\n traverse(source2, deep === false ? 1 : void 0)\n );\n let getter;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return callWithErrorHandling(s, instance, 2);\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = () => callWithErrorHandling(source, instance, 2);\n } else {\n getter = () => {\n if (cleanup) {\n cleanup();\n }\n return callWithAsyncErrorHandling(\n source,\n instance,\n 3,\n [onCleanup]\n );\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n getter = () => traverse(baseGetter());\n }\n let cleanup;\n let onCleanup = (fn) => {\n cleanup = effect.onStop = () => {\n callWithErrorHandling(fn, instance, 4);\n cleanup = effect.onStop = void 0;\n };\n };\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = () => {\n if (!effect.active || !effect.dirty) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {\n if (cleanup) {\n cleanup();\n }\n callWithAsyncErrorHandling(cb, instance, 3, [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n onCleanup\n ]);\n oldValue = newValue;\n }\n } else {\n effect.run();\n }\n };\n job.allowRecurse = !!cb;\n let scheduler;\n if (flush === \"sync\") {\n scheduler = job;\n } else if (flush === \"post\") {\n scheduler = () => queuePostRenderEffect$1(job, instance && instance.suspense);\n } else {\n job.pre = true;\n if (instance)\n job.id = instance.uid;\n scheduler = () => queueJob(job);\n }\n const effect = new ReactiveEffect(getter, NOOP, scheduler);\n const scope = getCurrentScope();\n const unwatch = () => {\n effect.stop();\n if (scope) {\n remove(scope.effects, effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = onTrack;\n effect.onTrigger = onTrigger;\n }\n if (cb) {\n if (immediate) {\n job();\n } else {\n oldValue = effect.run();\n }\n } else if (flush === \"post\") {\n queuePostRenderEffect$1(\n effect.run.bind(effect),\n instance && instance.suspense\n );\n } else {\n effect.run();\n }\n return unwatch;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\nfunction traverse(value, depth, currentDepth = 0, seen) {\n if (!isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n if (depth && depth > 0) {\n if (currentDepth >= depth) {\n return value;\n }\n currentDepth++;\n }\n seen = seen || /* @__PURE__ */ new Set();\n if (seen.has(value)) {\n return value;\n }\n seen.add(value);\n if (isRef(value)) {\n traverse(value.value, depth, currentDepth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, currentDepth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, currentDepth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, currentDepth, seen);\n }\n }\n return value;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getExposeProxy(currentRenderingInstance) || currentRenderingInstance.proxy;\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\n\nfunction createAppContext() {\n return {\n app: null,\n config: {\n isNativeTag: NO,\n performance: false,\n globalProperties: {},\n optionMergeStrategies: {},\n errorHandler: void 0,\n warnHandler: void 0,\n compilerOptions: {}\n },\n mixins: [],\n components: {},\n directives: {},\n provides: /* @__PURE__ */ Object.create(null),\n optionsCache: /* @__PURE__ */ new WeakMap(),\n propsCache: /* @__PURE__ */ new WeakMap(),\n emitsCache: /* @__PURE__ */ new WeakMap()\n };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n return function createApp(rootComponent, rootProps = null) {\n if (!isFunction(rootComponent)) {\n rootComponent = extend({}, rootComponent);\n }\n if (rootProps != null && !isObject(rootProps)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`root props passed to app.mount() must be an object.`);\n rootProps = null;\n }\n const context = createAppContext();\n const installedPlugins = /* @__PURE__ */ new WeakSet();\n const app = context.app = {\n _uid: uid$1++,\n _component: rootComponent,\n _props: rootProps,\n _container: null,\n _context: context,\n _instance: null,\n version,\n get config() {\n return context.config;\n },\n set config(v) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `app.config cannot be replaced. Modify individual options instead.`\n );\n }\n },\n use(plugin, ...options) {\n if (installedPlugins.has(plugin)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`Plugin has already been applied to target app.`);\n } else if (plugin && isFunction(plugin.install)) {\n installedPlugins.add(plugin);\n plugin.install(app, ...options);\n } else if (isFunction(plugin)) {\n installedPlugins.add(plugin);\n plugin(app, ...options);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `A plugin must either be a function or an object with an \"install\" function.`\n );\n }\n return app;\n },\n mixin(mixin) {\n if (__VUE_OPTIONS_API__) {\n if (!context.mixins.includes(mixin)) {\n context.mixins.push(mixin);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n );\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Mixins are only available in builds supporting Options API\");\n }\n return app;\n },\n component(name, component) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateComponentName(name, context.config);\n }\n if (!component) {\n return context.components[name];\n }\n if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n warn$1(`Component \"${name}\" has already been registered in target app.`);\n }\n context.components[name] = component;\n return app;\n },\n directive(name, directive) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateDirectiveName(name);\n }\n if (!directive) {\n return context.directives[name];\n }\n if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n warn$1(`Directive \"${name}\" has already been registered in target app.`);\n }\n context.directives[name] = directive;\n return app;\n },\n // fixed by xxxxxx\n mount() {\n },\n // fixed by xxxxxx\n unmount() {\n },\n provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n warn$1(\n `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n );\n }\n context.provides[key] = value;\n return app;\n },\n runWithContext(fn) {\n const lastApp = currentApp;\n currentApp = app;\n try {\n return fn();\n } finally {\n currentApp = lastApp;\n }\n }\n };\n return app;\n };\n}\nlet currentApp = null;\n\nfunction provide(key, value) {\n if (!currentInstance) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`provide() can only be used inside setup().`);\n }\n } else {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n if (currentInstance.type.mpType === \"app\") {\n currentInstance.appContext.app.provide(key, value);\n }\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = currentInstance || currentRenderingInstance;\n if (instance || currentApp) {\n const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(currentInstance || currentRenderingInstance || currentApp);\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8326: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n if (isRootHook(type)) {\n target = target.root;\n }\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n if (target.isUnmounted) {\n return;\n }\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(\n (ErrorTypeStrings[type] || type.replace(/^on/, \"\")).replace(/ hook$/, \"\")\n );\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (``)\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => (\n // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)\n (!isInSSRComponentSetup || lifecycle === \"sp\") && injectHook(lifecycle, (...args) => hook(...args), target)\n);\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\"bu\");\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\"bum\");\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\"sp\");\nconst onRenderTriggered = createHook(\n \"rtg\"\n);\nconst onRenderTracked = createHook(\n \"rtc\"\n);\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i)\n return null;\n if (isStatefulComponent(i))\n return getExposeProxy(i) || i.proxy;\n return getPublicInstance(i.parent);\n};\nfunction getComponentInternalInstance(i) {\n return i;\n}\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n // fixed by xxxxxx\n $: getComponentInternalInstance,\n // fixed by xxxxxx vue-i18n 在 dev 模式,访问了 $el,故模拟一个假的\n // $el: i => i.vnode.el,\n $el: (i) => i.__$el || (i.__$el = {}),\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n i.effect.dirty = true;\n queueJob(i.update);\n }),\n // $nextTick: i => i.n || (i.n = nextTick.bind(i.proxy!)),// fixed by xxxxxx\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n let normalizedProps;\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (\n // only cache other properties when instance has declared (thus stable)\n // props\n (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n ) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance, \"get\", key);\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \r\n\r\n\r\n","import Component from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/before-after/before-after.uvue'\nwx.createComponent(Component)"],"names":["uni","Component"],"mappings":";;;;;;;;;;AAwCC,UAAM,QAAQ;AAOd,UAAM,eAAe,CAAC,KAAc,SAAa;AAChD,YAAM,OAAO,QAAQ,WAAW,CAAC,MAAM,WAAW,IAAI,CAAC,MAAM,UAAU;AACvEA,oBAAAA,MAAI,aAAa;AAAA,QAChB,SAAS;AAAA,QACT;AAAA,MACA,CAAA;AAAA,IACF;;;;;;;;;;;;;;;;;;;;ACpDD,GAAG,gBAAgBC,SAAS;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/case-card/case-card.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/case-card/case-card.js.map
new file mode 100644
index 0000000..fe924ae
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/case-card/case-card.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"case-card.js","sources":["components/case-card/case-card.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovUHJvamVjdC9TZWxmL-S8mOiJuuWutuaymeWPkee_u-aWsC_kvJjoibrlrrbmspnlj5Hnv7vmlrAvY29tcG9uZW50cy9jYXNlLWNhcmQvY2FzZS1jYXJkLnV2dWU"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t{{ caseData.categoryName }}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t{{ caseData.title }}\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t材质:\r\n\t\t\t\t\t{{ caseData.material }}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t工期:\r\n\t\t\t\t\t{{ caseData.duration }}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import Component from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/case-card/case-card.uvue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;MAsCM,iBAAQ,IAAA,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAab,UAAM,QAAQ;AAId,UAAM,OAAO;AAIb,UAAM,cAAc,MAAA;AACnB,WAAK,SAAS,MAAM,SAAS,EAAE;AAAA,IAChC;;;;;;;;;;;;;;;;;;;AC5DD,GAAG,gBAAgBA,SAAS;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/nav-bar/nav-bar.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/nav-bar/nav-bar.js.map
new file mode 100644
index 0000000..5985f7f
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/nav-bar/nav-bar.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"nav-bar.js","sources":["components/nav-bar/nav-bar.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovUHJvamVjdC9TZWxmL-S8mOiJuuWutuaymeWPkee_u-aWsC_kvJjoibrlrrbmspnlj5Hnv7vmlrAvY29tcG9uZW50cy9uYXYtYmFyL25hdi1iYXIudXZ1ZQ"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t←\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t{{ title }}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import Component from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/nav-bar/nav-bar.uvue'\nwx.createComponent(Component)"],"names":["ref","onMounted","uni","Component"],"mappings":";;;;;;;;;;;AAkCC,UAAM,kBAAkBA,kBAAI,EAAE;AAE9B,UAAM,eAAeA,kBAAI,EAAE;AAE3BC,kBAAAA,UAAU,MAAA;AACT,YAAM,UAAUC,oBAAI;AACpB,sBAAgB,QAAQ,QAAQ;AAEhC,YAAM,iBAAiBA,oBAAI;AAC3B,mBAAa,SAAS,eAAe,MAAM,QAAQ,mBAAmB,IAAI,eAAe;AAAA,IAE1F,CAAC;AAED,UAAM,aAAa,MAAA;AAClBA,0BAAI,aAAa,IAAA,cAAA;AAAA,QAChB,MAAM,MAAA;AACLA,wBAAAA,MAAI,UAAU;AAAA,YACb,KAAK;AAAA,UACL,CAAA;AAAA,QACF;AAAA,MACA,CAAA,CAAA;AAAA,IACF;;;;;;;;;;;;;;;;;;ACtDD,GAAG,gBAAgBC,SAAS;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/section-header/section-header.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/section-header/section-header.js.map
new file mode 100644
index 0000000..a59d553
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/section-header/section-header.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"section-header.js","sources":["components/section-header/section-header.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovUHJvamVjdC9TZWxmL-S8mOiJuuWutuaymeWPkee_u-aWsC_kvJjoibrlrrbmspnlj5Hnv7vmlrAvY29tcG9uZW50cy9zZWN0aW9uLWhlYWRlci9zZWN0aW9uLWhlYWRlci51dnVl"],"sourcesContent":["\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import Component from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/section-header/section-header.uvue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;;;;;;;;;;AAmBC,UAAM,OAAO;AAIb,UAAM,aAAa,MAAA;AAClB,WAAK,MAAM;AAAA,IACZ;;;;;;;;;;;;;;;ACxBD,GAAG,gBAAgBA,SAAS;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/service-card/service-card.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/service-card/service-card.js.map
new file mode 100644
index 0000000..5bed8fa
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/components/service-card/service-card.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"service-card.js","sources":["components/service-card/service-card.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovUHJvamVjdC9TZWxmL-S8mOiJuuWutuaymeWPkee_u-aWsC_kvJjoibrlrrbmspnlj5Hnv7vmlrAvY29tcG9uZW50cy9zZXJ2aWNlLWNhcmQvc2VydmljZS1jYXJkLnV2dWU"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t{{ name }}\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import Component from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/components/service-card/service-card.uvue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;;;;;;;;;;;AAUC,UAAM,QAAQ;AAMd,UAAM,OAAO;AAIb,UAAM,cAAc,MAAA;AACnB,WAAK,SAAS,MAAM,EAAE;AAAA,IACvB;;;;;;;;;;;;;ACrBD,GAAG,gBAAgBA,SAAS;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/about/index.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/about/index.js.map
new file mode 100644
index 0000000..ef32c70
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/about/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["pages/about/index.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvYWJvdXQvaW5kZXgudXZ1ZQ"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{{ companyInfo.description }}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t✓\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{{ item.title }}\r\n\t\t\t\t\t\t{{ item.desc }}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t📞\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t客服电话\r\n\t\t\t\t\t\t\t{{ companyInfo.phone }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t›\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t💬\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t微信号\r\n\t\t\t\t\t\t\t{{ companyInfo.wechat }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t›\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t📍\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t公司地址\r\n\t\t\t\t\t\t\t{{ companyInfo.address }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t›\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t🕐\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t营业时间\r\n\t\t\t\t\t\t\t{{ companyInfo.workTime }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/pages/about/index.uvue'\nwx.createPage(MiniProgramPage)"],"names":["ref","__awaiter","getCompanyInfo","uni","onLoad","MiniProgramPage"],"mappings":";;;;;;;;;;;MA6FM,oBAAW,IAAA,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;MAMX,oBAAW,IAAA,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYhB,UAAM,cAAcA,kBAAiB,IAAA,YAAA;AAAA,MACpC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU,CAAE;AAAA,IACZ,CAAA,CAAA;AAGD,UAAM,mBAAmB,MAAA;AAAA,aAAAC,cAAA,UAAA,MAAA,QAAA,QAAA,aAAA;AACxB,YAAI;AACH,gBAAM,MAAM,MAAMC,UAAAA;AAClB,gBAAM,OAAO,IAAI;AAEjB,gBAAM,eAAe,KAAK,UAAU;AACpC,gBAAM,WAAW,aAAa,IAAI,CAAC,SAAI;AACtC,mBAAO,IAAA,YAAA;AAAA,cACN,OAAO,KAAK,OAAO;AAAA,cACnB,MAAM,KAAK,MAAM;AAAA,aACF;AAAA,UACjB,CAAC;AAED,sBAAY,QAAQ,IAAA,YAAA;AAAA,YACnB,MAAM,KAAK,MAAM;AAAA,YACjB,QAAQ,KAAK,QAAQ;AAAA,YACrB,aAAa,KAAK,aAAa;AAAA,YAC/B,OAAO,KAAK,OAAO;AAAA,YACnB,QAAQ,KAAK,QAAQ;AAAA,YACrB,SAAS,KAAK,SAAS;AAAA,YACvB,UAAU,KAAK,UAAU;AAAA,YACzB;AAAA,UACe,CAAA;AAAA,QAChB,SAAQ,GAAG;AACXC,wBAAG,MAAC,MAAM,SAAQ,iCAAgC,YAAY,CAAC;AAAA,QAC/D;AAAA,MACD,CAAA;AAAA;AAGD,UAAM,YAAY,MAAA;AACjBA,oBAAAA,MAAI,cAAc;AAAA,QACjB,aAAa,YAAY,MAAM;AAAA,QAC/B,MAAM,MAAA;AACLA,wBAAAA,MAAI,UAAU;AAAA,YACb,OAAO;AAAA,YACP,MAAM;AAAA,UACN,CAAA;AAAA,QACF;AAAA,MACA,CAAA;AAAA,IACF;AAGA,UAAM,aAAa,MAAA;AAClBA,oBAAAA,MAAI,iBAAiB;AAAA,QACpB,MAAM,YAAY,MAAM;AAAA,QACxB,SAAS,MAAA;AACRA,wBAAAA,MAAI,UAAU;AAAA,YACb,OAAO;AAAA,YACP,MAAM;AAAA,UACN,CAAA;AAAA,QACF;AAAA,MACA,CAAA;AAAA,IACF;AAGA,UAAM,eAAe,MAAA;AACpBA,oBAAAA,MAAI,aAAa;AAAA,QAChB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,MAAM,YAAY,MAAM;AAAA,QACxB,SAAS,YAAY,MAAM;AAAA,QAC3B,MAAM,MAAA;AACLA,wBAAAA,MAAI,UAAU;AAAA,YACb,OAAO;AAAA,YACP,MAAM;AAAA,UACN,CAAA;AAAA,QACF;AAAA,MACA,CAAA;AAAA,IACF;AAEAC,kBAAAA,OAAO,MAAA;AACN;IACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClMF,GAAG,WAAWC,SAAe;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/booking/index.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/booking/index.js.map
new file mode 100644
index 0000000..ff3d2a3
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/booking/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["pages/booking/index.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvYm9va2luZy9pbmRleC51dnVl"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t*\r\n\t\t\t\t\t\t您的姓名\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t*\r\n\t\t\t\t\t\t联系电话\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t*\r\n\t\t\t\t\t\t您的地址\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t沙发类型\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{{ item.name }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t问题描述\r\n\t\t\t\t\t\r\n\t\t\t\t\t{{ formData.problem.length }}/500\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t上传图片(可选)\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t×\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t+\r\n\t\t\t\t\t\t\t添加图片\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t最多可上传9张图片\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t提交预约\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/pages/booking/index.uvue'\nwx.createPage(MiniProgramPage)"],"names":["ref","SOFA_CATEGORIES","uni","__awaiter","submitBooking","onLoad","MiniProgramPage"],"mappings":"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"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/cases/detail.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/cases/detail.js.map
new file mode 100644
index 0000000..c951aa2
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/cases/detail.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"detail.js","sources":["pages/cases/detail.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvY2FzZXMvZGV0YWlsLnV2dWU"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{{ caseDetail.categoryName }}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t{{ caseDetail.title }}\r\n\t\t\t\t\r\n\t\t\t\t\t{{ caseDetail.price }}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t👁 {{ caseDetail.views }}\r\n\t\t\t\t\t\t❤ {{ caseDetail.likes }}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t使用材质\r\n\t\t\t\t\t\t{{ caseDetail.material }}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t翻新工期\r\n\t\t\t\t\t\t{{ caseDetail.duration }}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t完成日期\r\n\t\t\t\t\t\t{{ caseDetail.createTime }}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t案例描述\r\n\t\t\t\t\t{{ caseDetail.description }}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{{ isFavorite ? '❤️' : '🤍' }}\r\n\t\t\t\t\t收藏\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t📤\r\n\t\t\t\t\t分享\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t在线咨询\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t立即预约\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/pages/cases/detail.uvue'\nwx.createPage(MiniProgramPage)"],"names":["ref","__awaiter","getCaseDetail","uni","onLoad","MiniProgramPage"],"mappings":";;;;;;;;;;;MA0GM,mBAAU,IAAA,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBf,UAAM,SAASA,kBAAI,EAAE;AAGrB,UAAM,aAAaA,kBAAgB,IAAA,WAAA;AAAA,MAClC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc,CAAE;AAAA,MAChB,aAAa,CAAE;AAAA,MACf,aAAa;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACZ,CAAA,CAAA;AAGD,UAAM,aAAaA,kBAAI,KAAK;AAG5B,UAAM,kBAAkB,MAAA;AAAA,aAAAC,cAAA,UAAA,MAAA,QAAA,QAAA,aAAA;AACvB,YAAI;AACH,gBAAM,MAAM,MAAMC,UAAAA,cAAc,OAAO,KAAK;AAC5C,gBAAM,OAAO,IAAI;AAEjB,qBAAW,QAAQ,IAAA;AAAA,YAAA;AAAA,cAClB,IAAI,KAAK,IAAI;AAAA,cACb,OAAO,KAAK,OAAO;AAAA,cACnB,UAAU,KAAK,UAAU;AAAA,cACzB,cAAc,KAAK,cAAc;AAAA,cACjC,cAAc,KAAK,cAAc;AAAA,cACjC,aAAa,KAAK,aAAa;AAAA,cAC/B,aAAa,KAAK,aAAa;AAAA,cAC/B,UAAU,KAAK,UAAU;AAAA,cACzB,UAAU,KAAK,UAAU;AAAA,cACzB,OAAO,KAAK,OAAO;AAAA,cACnB,OAAO,KAAK,OAAO;AAAA,cACnB,OAAO,KAAK,OAAO;AAAA,cACnB,YAAY,KAAK,YAAY;AAAA,YACf;AAAA;AAAA;AAGfC,wBAAAA,MAAI,sBAAsB;AAAA,YACzB,OAAO,WAAW,MAAM;AAAA,UACxB,CAAA;AAAA,QACD,SAAQ,GAAG;AACXA,wBAAG,MAAC,MAAM,SAAQ,kCAAiC,YAAY,CAAC;AAAA,QAChE;AAAA,MACD,CAAA;AAAA;AAGD,UAAM,gBAAgB,CAAC,UAAc;AACpCA,oBAAAA,MAAI,aAAa;AAAA,QAChB,SAAS;AAAA,QACT,MAAM,WAAW,MAAM;AAAA,MACvB,CAAA;AAAA,IACF;AAGA,UAAM,iBAAiB,MAAA;AACtB,iBAAW,QAAQ,CAAC,WAAW;AAC/BA,oBAAAA,MAAI,UAAU;AAAA,QACb,OAAO,WAAW,QAAQ,QAAQ;AAAA,QAClC,MAAM;AAAA,MACN,CAAA;AAAA,IACF;AAGA,UAAM,cAAc,MAAA;AAInBA,oBAAAA,MAAI,UAAU;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,MACN,CAAA;AAAA,IACF;AAGA,UAAM,gBAAgB,MAAA;AACrBA,oBAAAA,MAAI,cAAc;AAAA,QACjB,aAAa;AAAA,QACb,MAAM,MAAA;AACLA,wBAAAA,MAAI,UAAU;AAAA,YACb,OAAO;AAAA,YACP,MAAM;AAAA,UACN,CAAA;AAAA,QACF;AAAA,MACA,CAAA;AAAA,IACF;AAGA,UAAM,cAAc,MAAA;AACnBA,oBAAAA,MAAI,WAAW;AAAA,QACd,KAAK;AAAA,MACL,CAAA;AAAA,IACF;AAEAC,kBAAM,OAAC,CAAC,YAAuB;;AAC9B,aAAO,SAAQ,KAAA,QAAQ,IAAI,OAAK,QAAA,OAAA,SAAA,KAAA;AAChC,UAAI,OAAO,SAAS,IAAI;AACvB;MACA;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpOF,GAAG,WAAWC,SAAe;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/cases/list.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/cases/list.js.map
new file mode 100644
index 0000000..807cb46
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/cases/list.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"list.js","sources":["pages/cases/list.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvY2FzZXMvbGlzdC51dnVl"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{{ item.name }}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t加载中...\r\n\t\t\t\t没有更多了\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t📭\r\n\t\t\t\t暂无相关案例\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/pages/cases/list.uvue'\nwx.createPage(MiniProgramPage)"],"names":["ref","SOFA_CATEGORIES","__awaiter","PAGE_SIZE","getCaseList","uni","onLoad","MiniProgramPage"],"mappings":";;;;;;;;;;;;MA4DM,qBAAY,IAAA,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;MAMZ,iBAAQ,IAAA,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcb,UAAM,aAAaA,kBAAoB,CAAA,CAAE;AAGzC,UAAM,kBAAkBA,kBAAI,KAAK;AAGjC,UAAM,WAAWA,kBAAgB,CAAA,CAAE;AAGnC,UAAM,OAAOA,kBAAI,CAAC;AAClB,UAAM,QAAQA,kBAAI,CAAC;AAGnB,UAAM,UAAUA,kBAAI,KAAK;AACzB,UAAM,SAASA,kBAAI,KAAK;AAGxB,UAAM,iBAAiB,MAAA;AACtB,iBAAW,QAAQC,aAAAA,gBAAgB,IAAI,CAAC,SAAI;AAC3C,eAAO,IAAA,aAAA;AAAA,UACN,IAAI,KAAK;AAAA,UACT,MAAM,KAAK;AAAA,SACK;AAAA,MAClB,CAAC;AAAA,IACF;AAGA,UAAM,iBAAiB,CAAC,OAAW;AAClC,UAAI,gBAAgB,SAAS;AAAI,eAAM;AACvC,sBAAgB,QAAQ;AACxB,WAAK,QAAQ;AACb,eAAS,QAAQ;AACjB,aAAO,QAAQ;AACf;IACD;AAGA,UAAM,gBAAgB,MAAA;AAAA,aAAAC,cAAA,UAAA,MAAA,QAAA,QAAA,aAAA;AACrB,YAAI,QAAQ,SAAS,OAAO;AAAO,iBAAM,QAAA,QAAA,IAAA;AAEzC,gBAAQ,QAAQ;AAChB,YAAI;AACH,gBAAM,SAAS,IAAA,cAAA;AAAA,YACd,UAAU,gBAAgB;AAAA,YAC1B,MAAM,KAAK;AAAA,YACX,UAAUC,aAAS;AAAA,UACF,CAAA;AAElB,gBAAM,MAAM,MAAMC,sBAAY,MAAM;AACpC,gBAAM,OAAO,IAAI;AAEjB,gBAAM,OAAO,KAAK,OAAO,KAAwB,CAAA;AACjD,gBAAM,QAAQ,KAAK,OAAO,KAAe;AAEzC,gBAAM,UAAU,KAAK,IAAI,CAAC,SAAI;AAC7B,mBAAO,IAAA,SAAA;AAAA,cACN,IAAI,KAAK,IAAI;AAAA,cACb,OAAO,KAAK,OAAO;AAAA,cACnB,UAAU,KAAK,UAAU;AAAA,cACzB,cAAc,KAAK,cAAc;AAAA,cACjC,YAAY,KAAK,YAAY;AAAA,cAC7B,UAAU,KAAK,UAAU;AAAA,cACzB,UAAU,KAAK,UAAU;AAAA,cACzB,OAAO,KAAK,OAAO;AAAA,cACnB,OAAO,KAAK,OAAO;AAAA,cACnB,OAAO,KAAK,OAAO;AAAA,aACP;AAAA,UACd,CAAC;AAED,cAAI,KAAK,SAAS,GAAG;AACpB,qBAAS,QAAQ;AAAA,UACjB,OAAM;AACN,qBAAS,QAAQ,CAAC,GAAG,SAAS,OAAO,GAAG,OAAO;AAAA,UAC/C;AAED,cAAI,SAAS,MAAM,UAAU,MAAM,OAAO;AACzC,mBAAO,QAAQ;AAAA,UACf;AAAA,QACD,SAAQ,GAAG;AACXC,wBAAG,MAAC,MAAM,SAAQ,gCAA+B,YAAY,CAAC;AAAA,QAC9D;AACD,gBAAQ,QAAQ;AAAA,MAChB,CAAA;AAAA;AAGD,UAAM,WAAW,MAAA;AAChB,UAAI,CAAC,OAAO,SAAS,CAAC,QAAQ,OAAO;AACpC,aAAK;AACL;MACA;AAAA,IACF;AAGA,UAAM,aAAa,CAAC,OAAW;AAC9BA,oBAAAA,MAAI,WAAW;AAAA,QACd,KAAK,0BAA0B,EAAE;AAAA,MACjC,CAAA;AAAA,IACF;AAEAC,kBAAAA,OAAO,MAAA;AACN;AACA;IACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrLF,GAAG,WAAWC,SAAe;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
new file mode 100644
index 0000000..06aaf35
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["pages/index/index.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvaW5kZXgvaW5kZXgudXZ1ZQ"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{{ item.icon }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{{ item.title }}\r\n\t\t\t\t\t\t\t{{ item.desc }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t免费上门评估\r\n\t\t\t\t\t\t专业师傅免费上门,为您的沙发量身定制翻新方案\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t立即预约\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/pages/index/index.uvue'\nwx.createPage(MiniProgramPage)"],"names":["ref","SERVICE_TYPES","__awaiter","getBanners","uni","getHotCases","onLoad","MiniProgramPage"],"mappings":"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"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/service/index.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/service/index.js.map
new file mode 100644
index 0000000..91f6c9d
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/service/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["pages/service/index.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvc2VydmljZS9pbmRleC51dnVl"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t专业沙发翻新服务\r\n\t\t\t\t\t让旧沙发焕发新生\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{{ item.emoji }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{{ item.name }}\r\n\t\t\t\t\t\t{{ item.desc }}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{{ item.step }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{{ item.title }}\r\n\t\t\t\t\t\t\t{{ item.description }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{{ item.desc }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{{ tag }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{{ item.answer }}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t免费上门评估\r\n\t\t\t\t专业师傅为您量身定制方案\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t立即预约\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/pages/service/index.uvue'\nwx.createPage(MiniProgramPage)"],"names":["ref","__awaiter","getServiceProcess","uni","onLoad","MiniProgramPage"],"mappings":"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"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/user/index.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/user/index.js.map
new file mode 100644
index 0000000..13ffe94
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/pages/user/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["pages/user/index.uvue","../../../../Soft/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvdXNlci9pbmRleC51dnVl"],"sourcesContent":["\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{{ userInfo.nickName || '点击登录' }}\r\n\t\t\t\t\t\t{{ userInfo.phone }}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t登录\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t退出登录\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/Project/Self/优艺家沙发翻新/优艺家沙发翻新/pages/user/index.uvue'\nwx.createPage(MiniProgramPage)"],"names":["ref","uni","STORAGE_KEYS","onShow","MiniProgramPage"],"mappings":"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"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/config.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/config.js.map
new file mode 100644
index 0000000..12885b3
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/config.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"config.js","sources":["utils/config.uts"],"sourcesContent":["/**\r\n * 项目配置文件\r\n */\r\n\r\n// 环境配置\r\nexport const ENV = {\r\n\t// 开发环境\r\n\tdevelopment: {\r\n\t\tbaseUrl: 'http://localhost:3000/api',\r\n\t\timageBaseUrl: 'http://localhost:3000'\r\n\t},\r\n\t// 生产环境\r\n\tproduction: {\r\n\t\tbaseUrl: 'https://api.youyijia.com/api',\r\n\t\timageBaseUrl: 'https://api.youyijia.com'\r\n\t}\r\n}\r\n\r\n// 当前环境 - 切换为 'production' 上线\r\nexport const currentEnv = 'development'\r\n\r\n// 获取当前环境配置\r\nexport const getEnvConfig = () : UTSJSONObject => {\r\n\tif (currentEnv == 'production') {\r\n\t\treturn {\r\n\t\t\tbaseUrl: ENV.production.baseUrl,\r\n\t\t\timageBaseUrl: ENV.production.imageBaseUrl\r\n\t\t} as UTSJSONObject\r\n\t}\r\n\treturn {\r\n\t\tbaseUrl: ENV.development.baseUrl,\r\n\t\timageBaseUrl: ENV.development.imageBaseUrl\r\n\t} as UTSJSONObject\r\n}\r\n\r\n// 是否使用Mock数据 - 已关闭,对接真实后端\r\nexport const useMock = false\r\n\r\n// 分页配置\r\nexport const PAGE_SIZE = 10\r\n\r\n// 图片上传配置\r\nexport const UPLOAD_CONFIG = {\r\n\tmaxSize: 5 * 1024 * 1024, // 5MB\r\n\tmaxCount: 9,\r\n\taccept: ['image/jpeg', 'image/png', 'image/gif']\r\n}\r\n\r\n// 缓存Key\r\nexport const STORAGE_KEYS = {\r\n\tTOKEN: 'user_token',\r\n\tUSER_INFO: 'user_info',\r\n\tFAVORITES: 'user_favorites',\r\n\tSEARCH_HISTORY: 'search_history'\r\n}\r\n\r\n// 沙发分类\r\nexport const SOFA_CATEGORIES = [\r\n\t{ id: 'all', name: '全部' },\r\n\t{ id: 'leather', name: '皮沙发' },\r\n\t{ id: 'fabric', name: '布艺沙发' },\r\n\t{ id: 'functional', name: '功能沙发' },\r\n\t{ id: 'antique', name: '古典沙发' },\r\n\t{ id: 'office', name: '办公沙发' }\r\n]\r\n\r\n// 翻新服务类型\r\nexport const SERVICE_TYPES = [\r\n\t{ id: 'repair', name: '局部修复', icon: '/static/icons/repair.png' },\r\n\t{ id: 'recolor', name: '改色翻新', icon: '/static/icons/recolor.png' },\r\n\t{ id: 'refurbish', name: '整体翻新', icon: '/static/icons/refurbish.png' },\r\n\t{ id: 'custom', name: '定制换皮', icon: '/static/icons/custom.png' }\r\n]\r\n"],"names":[],"mappings":";AAKO,MAAM,MAAM,IAAA;AAAA,EAAA;AAAA;AAAA,IAElB,aAAa,IAAA,cAAA;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA,KACd;AAAA;AAAA,IAED,YAAY,IAAA,cAAA;AAAA,MACX,SAAS;AAAA,MACT,cAAc;AAAA,KACd;AAAA,EACD;AAAA;;AAMY,MAAA,eAAe,MAAA;AAO3B,SAAO,IAAA,cAAA;AAAA,IACN,SAAS,IAAI,YAAY;AAAA,IACzB,cAAc,IAAI,YAAY;AAAA,GACb;AACnB;AAMO,MAAM,YAAY;AAGI,IAAA;AAAA,EAAA;AAAA,IAC5B,SAAS,IAAI,OAAO;AAAA,IACpB,UAAU;AAAA,IACV,QAAQ,CAAC,cAAc,aAAa,WAAW;AAAA,EAC/C;AAAA;;AAGY,MAAA,eAAe,IAAA;AAAA,EAAA;AAAA,IAC3B,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,gBAAgB;AAAA,EAChB;AAAA;;AAGY,MAAA,kBAAkB;AAAA,EAC9B,IAAA,cAAA,EAAE,IAAI,OAAO,MAAM,KAAI,CAAE;AAAA,EACzB,IAAA,cAAA,EAAE,IAAI,WAAW,MAAM,MAAK,CAAE;AAAA,EAC9B,IAAA,cAAA,EAAE,IAAI,UAAU,MAAM,OAAM,CAAE;AAAA,EAC9B,IAAA,cAAA,EAAE,IAAI,cAAc,MAAM,OAAM,CAAE;AAAA,EAClC,IAAA,cAAA,EAAE,IAAI,WAAW,MAAM,OAAM,CAAE;AAAA,EAC/B,IAAA,cAAA,EAAE,IAAI,UAAU,MAAM,OAAM,CAAE;;AAIlB,MAAA,gBAAgB;AAAA,oBAC5B,EAAE,IAAI,UAAU,MAAM,QAAQ,MAAM,4BAA4B;AAAA,oBAChE,EAAE,IAAI,WAAW,MAAM,QAAQ,MAAM,6BAA6B;AAAA,oBAClE,EAAE,IAAI,aAAa,MAAM,QAAQ,MAAM,+BAA+B;AAAA,oBACtE,EAAE,IAAI,UAAU,MAAM,QAAQ,MAAM,4BAA4B;;;;;;;"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/mock.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/mock.js.map
new file mode 100644
index 0000000..9dd6e8e
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/mock.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"mock.js","sources":["utils/mock.uts"],"sourcesContent":["/**\r\n * Mock数据 - 开发阶段使用\r\n * 后端开发完成后可关闭\r\n */\r\n\r\n// 轮播图数据\r\nconst bannerList = [\r\n\t{\r\n\t\tid: '1',\r\n\t\timage: '/static/mock/banner1.svg',\r\n\t\ttitle: '专业沙发翻新服务',\r\n\t\tlink: '/pages/service/index'\r\n\t},\r\n\t{\r\n\t\tid: '2',\r\n\t\timage: '/static/mock/banner2.svg',\r\n\t\ttitle: '十年品质保证',\r\n\t\tlink: '/pages/about/index'\r\n\t},\r\n\t{\r\n\t\tid: '3',\r\n\t\timage: '/static/mock/banner3.svg',\r\n\t\ttitle: '免费上门评估',\r\n\t\tlink: '/pages/booking/index'\r\n\t}\r\n]\r\n\r\n// 案例数据\r\nconst caseList = [\r\n\t{\r\n\t\tid: '1',\r\n\t\ttitle: '欧式真皮沙发翻新',\r\n\t\tcategory: 'leather',\r\n\t\tcategoryName: '皮沙发',\r\n\t\tbeforeImages: ['/static/mock/case1-before.svg'],\r\n\t\tafterImages: ['/static/mock/case1-after.svg'],\r\n\t\tcoverImage: '/static/mock/case1-after.svg',\r\n\t\tdescription: '这款欧式真皮沙发使用多年后出现皮面老化、褪色问题,经过我们专业的翻新处理,焕然一新。采用进口头层牛皮,色泽均匀,手感细腻。',\r\n\t\tmaterial: '进口头层牛皮',\r\n\t\tduration: '7天',\r\n\t\tprice: '¥3800',\r\n\t\tviews: 1256,\r\n\t\tlikes: 89,\r\n\t\tcreateTime: '2026-01-15'\r\n\t},\r\n\t{\r\n\t\tid: '2',\r\n\t\ttitle: '现代简约布艺沙发翻新',\r\n\t\tcategory: 'fabric',\r\n\t\tcategoryName: '布艺沙发',\r\n\t\tbeforeImages: ['/static/mock/case2-before.svg'],\r\n\t\tafterImages: ['/static/mock/case2-after.svg'],\r\n\t\tcoverImage: '/static/mock/case2-after.svg',\r\n\t\tdescription: '布艺沙发使用时间长了容易脏污、起球,这款沙发经过整体换布处理,选用高品质科技布,防水防污,易于打理。',\r\n\t\tmaterial: '高品质科技布',\r\n\t\tduration: '5天',\r\n\t\tprice: '¥2200',\r\n\t\tviews: 986,\r\n\t\tlikes: 67,\r\n\t\tcreateTime: '2026-01-12'\r\n\t},\r\n\t{\r\n\t\tid: '3',\r\n\t\ttitle: '美式复古沙发改色翻新',\r\n\t\tcategory: 'leather',\r\n\t\tcategoryName: '皮沙发',\r\n\t\tbeforeImages: ['/static/mock/case3-before.svg'],\r\n\t\tafterImages: ['/static/mock/case3-after.svg'],\r\n\t\tcoverImage: '/static/mock/case3-after.svg',\r\n\t\tdescription: '客户希望将原本深棕色的沙发改为更现代的米白色,我们采用专业改色工艺,色泽持久不脱落,触感保持柔软。',\r\n\t\tmaterial: '专业皮革改色',\r\n\t\tduration: '6天',\r\n\t\tprice: '¥2800',\r\n\t\tviews: 756,\r\n\t\tlikes: 45,\r\n\t\tcreateTime: '2026-01-10'\r\n\t},\r\n\t{\r\n\t\tid: '4',\r\n\t\ttitle: '功能沙发维修翻新',\r\n\t\tcategory: 'functional',\r\n\t\tcategoryName: '功能沙发',\r\n\t\tbeforeImages: ['/static/mock/case4-before.svg'],\r\n\t\tafterImages: ['/static/mock/case4-after.svg'],\r\n\t\tcoverImage: '/static/mock/case4-after.svg',\r\n\t\tdescription: '功能沙发的电动机构出现故障,同时皮面也有磨损。我们更换了电机和控制系统,并对皮面进行了局部修复。',\r\n\t\tmaterial: '原装配件+局部修复',\r\n\t\tduration: '4天',\r\n\t\tprice: '¥1800',\r\n\t\tviews: 623,\r\n\t\tlikes: 38,\r\n\t\tcreateTime: '2026-01-08'\r\n\t},\r\n\t{\r\n\t\tid: '5',\r\n\t\ttitle: '中式红木沙发垫翻新',\r\n\t\tcategory: 'antique',\r\n\t\tcategoryName: '古典沙发',\r\n\t\tbeforeImages: ['/static/mock/case5-before.svg'],\r\n\t\tafterImages: ['/static/mock/case5-after.svg'],\r\n\t\tcoverImage: '/static/mock/case5-after.svg',\r\n\t\tdescription: '红木沙发的坐垫和靠垫使用多年已经塌陷变形,我们重新填充高密度海绵,并更换了丝绸面料,古典韵味十足。',\r\n\t\tmaterial: '高密度海绵+丝绸面料',\r\n\t\tduration: '5天',\r\n\t\tprice: '¥2500',\r\n\t\tviews: 512,\r\n\t\tlikes: 32,\r\n\t\tcreateTime: '2026-01-05'\r\n\t},\r\n\t{\r\n\t\tid: '6',\r\n\t\ttitle: '办公室皮沙发组合翻新',\r\n\t\tcategory: 'office',\r\n\t\tcategoryName: '办公沙发',\r\n\t\tbeforeImages: ['/static/mock/case6-before.svg'],\r\n\t\tafterImages: ['/static/mock/case6-after.svg'],\r\n\t\tcoverImage: '/static/mock/case6-after.svg',\r\n\t\tdescription: '企业办公室的沙发组合整体翻新,包括一套3+1+1沙发。采用耐磨商务皮革,简约大气,提升企业形象。',\r\n\t\tmaterial: '商务耐磨皮革',\r\n\t\tduration: '10天',\r\n\t\tprice: '¥8800',\r\n\t\tviews: 445,\r\n\t\tlikes: 28,\r\n\t\tcreateTime: '2026-01-02'\r\n\t}\r\n]\r\n\r\n// 服务流程数据\r\nconst serviceProcess = [\r\n\t{\r\n\t\tstep: 1,\r\n\t\ttitle: '在线预约',\r\n\t\tdescription: '通过小程序或电话预约上门服务',\r\n\t\ticon: '/static/icons/step1.png'\r\n\t},\r\n\t{\r\n\t\tstep: 2,\r\n\t\ttitle: '上门评估',\r\n\t\tdescription: '专业师傅免费上门查看沙发状况',\r\n\t\ticon: '/static/icons/step2.png'\r\n\t},\r\n\t{\r\n\t\tstep: 3,\r\n\t\ttitle: '方案报价',\r\n\t\tdescription: '根据沙发情况提供翻新方案和报价',\r\n\t\ticon: '/static/icons/step3.png'\r\n\t},\r\n\t{\r\n\t\tstep: 4,\r\n\t\ttitle: '确认订单',\r\n\t\tdescription: '确认方案后签订服务合同',\r\n\t\ticon: '/static/icons/step4.png'\r\n\t},\r\n\t{\r\n\t\tstep: 5,\r\n\t\ttitle: '专业翻新',\r\n\t\tdescription: '工厂或上门进行专业翻新作业',\r\n\t\ticon: '/static/icons/step5.png'\r\n\t},\r\n\t{\r\n\t\tstep: 6,\r\n\t\ttitle: '验收交付',\r\n\t\tdescription: '翻新完成后客户验收,满意付款',\r\n\t\ticon: '/static/icons/step6.png'\r\n\t}\r\n]\r\n\r\n// 公司信息\r\nconst companyInfo = {\r\n\tname: '优艺家沙发翻新',\r\n\tslogan: '让旧沙发焕发新生',\r\n\tdescription: '优艺家是一家专业从事沙发翻新、维修、改色的服务公司,拥有十余年行业经验。我们秉承\"品质至上、客户第一\"的服务理念,为千家万户提供专业的沙发翻新服务。',\r\n\tphone: '400-888-8888',\r\n\twechat: 'youyijia2026',\r\n\taddress: '上海市浦东新区张江高科技园区',\r\n\tworkTime: '周一至周日 9:00-18:00',\r\n\tfeatures: [\r\n\t\t{ title: '专业团队', desc: '10年+从业经验' },\r\n\t\t{ title: '品质保证', desc: '质保期内免费维护' },\r\n\t\t{ title: '上门服务', desc: '免费上门评估' },\r\n\t\t{ title: '价格透明', desc: '无隐形消费' }\r\n\t]\r\n}\r\n\r\n/**\r\n * 获取Mock数据\r\n */\r\nexport const getMockData = (url : string, method : string, params ?: UTSJSONObject | null) : any | null => {\r\n\t// 轮播图\r\n\tif (url == '/banners') {\r\n\t\treturn bannerList\r\n\t}\r\n\t\r\n\t// 案例列表\r\n\tif (url == '/cases' && method == 'GET') {\r\n\t\tconst category = params?.['category'] as string | null\r\n\t\tconst page = (params?.['page'] ?? 1) as number\r\n\t\tconst pageSize = (params?.['pageSize'] ?? 10) as number\r\n\t\t\r\n\t\tlet filteredList = caseList\r\n\t\tif (category != null && category != '' && category != 'all') {\r\n\t\t\tfilteredList = caseList.filter((item) : boolean => item.category == category)\r\n\t\t}\r\n\t\t\r\n\t\tconst start = (page - 1) * pageSize\r\n\t\tconst end = start + pageSize\r\n\t\tconst list = filteredList.slice(start, end)\r\n\t\t\r\n\t\treturn {\r\n\t\t\tlist: list,\r\n\t\t\ttotal: filteredList.length,\r\n\t\t\tpage: page,\r\n\t\t\tpageSize: pageSize\r\n\t\t}\r\n\t}\r\n\t\r\n\t// 案例详情\r\n\tif (url.startsWith('/cases/') && method == 'GET') {\r\n\t\tconst id = url.replace('/cases/', '')\r\n\t\tconst caseItem = caseList.find((item) : boolean => item.id == id)\r\n\t\treturn caseItem\r\n\t}\r\n\t\r\n\t// 热门案例\r\n\tif (url == '/cases/hot') {\r\n\t\treturn caseList.slice(0, 4)\r\n\t}\r\n\t\r\n\t// 服务流程\r\n\tif (url == '/service/process') {\r\n\t\treturn serviceProcess\r\n\t}\r\n\t\r\n\t// 公司信息\r\n\tif (url == '/company/info') {\r\n\t\treturn companyInfo\r\n\t}\r\n\t\r\n\t// 提交预约\r\n\tif (url == '/booking' && method == 'POST') {\r\n\t\treturn {\r\n\t\t\tbookingId: 'BK' + Date.now().toString(),\r\n\t\t\tstatus: 'pending',\r\n\t\t\tmessage: '预约成功,我们会尽快与您联系'\r\n\t\t}\r\n\t}\r\n\t\r\n\treturn null\r\n}\r\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map
new file mode 100644
index 0000000..65b1a2c
--- /dev/null
+++ b/前端/unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"request.js","sources":["utils/request.uts"],"sourcesContent":["/**\r\n * 网络请求封装\r\n * 预留后端接口对接\r\n */\r\nimport { getEnvConfig, useMock, STORAGE_KEYS } from './config.uts'\r\nimport { getMockData } from './mock.uts'\r\n\r\n// 请求配置类型\r\ntype RequestOptions = {\r\n\turl : string\r\n\tmethod ?: 'GET' | 'POST' | 'PUT' | 'DELETE'\r\n\tdata ?: UTSJSONObject | null\r\n\theader ?: UTSJSONObject | null\r\n\tshowLoading ?: boolean\r\n\tloadingText ?: string\r\n}\r\n\r\n// 响应数据类型\r\ntype ResponseData = {\r\n\tcode : number\r\n\tmessage : string\r\n\tdata : any\r\n}\r\n\r\n/**\r\n * 请求拦截器\r\n */\r\nconst requestInterceptor = (options : RequestOptions) : RequestOptions => {\r\n\t// 添加token\r\n\tconst token = uni.getStorageSync(STORAGE_KEYS.TOKEN) as string\r\n\tif (token != '') {\r\n\t\tif (options.header == null) {\r\n\t\t\toptions.header = {} as UTSJSONObject\r\n\t\t}\r\n\t\toptions.header!['Authorization'] = `Bearer ${token}`\r\n\t}\r\n\treturn options\r\n}\r\n\r\n/**\r\n * 响应拦截器\r\n */\r\nconst responseInterceptor = (response : UTSJSONObject) : ResponseData => {\r\n\tconst statusCode = response['statusCode'] as number\r\n\tconst data = response['data'] as UTSJSONObject\r\n\t\r\n\tif (statusCode == 200) {\r\n\t\tconst code = (data['code'] ?? 0) as number\r\n\t\tif (code == 0 || code == 200) {\r\n\t\t\treturn {\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'success',\r\n\t\t\t\tdata: data['data']\r\n\t\t\t} as ResponseData\r\n\t\t} else if (code == 401) {\r\n\t\t\t// token过期,跳转登录\r\n\t\t\tuni.removeStorageSync(STORAGE_KEYS.TOKEN)\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请重新登录',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn {\r\n\t\t\t\tcode: code,\r\n\t\t\t\tmessage: (data['message'] ?? '请重新登录') as string,\r\n\t\t\t\tdata: null\r\n\t\t\t} as ResponseData\r\n\t\t} else {\r\n\t\t\treturn {\r\n\t\t\t\tcode: code,\r\n\t\t\t\tmessage: (data['message'] ?? '请求失败') as string,\r\n\t\t\t\tdata: null\r\n\t\t\t} as ResponseData\r\n\t\t}\r\n\t} else {\r\n\t\treturn {\r\n\t\t\tcode: statusCode,\r\n\t\t\tmessage: '网络请求失败',\r\n\t\t\tdata: null\r\n\t\t} as ResponseData\r\n\t}\r\n}\r\n\r\n/**\r\n * 统一请求方法\r\n */\r\nexport const request = (options : RequestOptions) : Promise => {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\t// 使用Mock数据\r\n\t\tif (useMock) {\r\n\t\t\tconst mockData = getMockData(options.url, options.method ?? 'GET', options.data)\r\n\t\t\tif (mockData != null) {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tresolve({\r\n\t\t\t\t\t\tcode: 0,\r\n\t\t\t\t\t\tmessage: 'success',\r\n\t\t\t\t\t\tdata: mockData\r\n\t\t\t\t\t} as ResponseData)\r\n\t\t\t\t}, 300) // 模拟网络延迟\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// 请求拦截\r\n\t\tconst finalOptions = requestInterceptor(options)\r\n\t\t\r\n\t\t// 显示loading\r\n\t\tif (finalOptions.showLoading == true) {\r\n\t\t\tuni.showLoading({\r\n\t\t\t\ttitle: finalOptions.loadingText ?? '加载中...'\r\n\t\t\t})\r\n\t\t}\r\n\t\t\r\n\t\tconst config = getEnvConfig()\r\n\t\tconst baseUrl = config['baseUrl'] as string\r\n\t\t\r\n\t\tuni.request({\r\n\t\t\turl: baseUrl + finalOptions.url,\r\n\t\t\tmethod: finalOptions.method ?? 'GET',\r\n\t\t\tdata: finalOptions.data as UTSJSONObject | null,\r\n\t\t\theader: finalOptions.header as UTSJSONObject | null,\r\n\t\t\tsuccess: (res) => {\r\n\t\t\t\tif (finalOptions.showLoading == true) {\r\n\t\t\t\t\tuni.hideLoading()\r\n\t\t\t\t}\r\n\t\t\t\tconst result = responseInterceptor(res as UTSJSONObject)\r\n\t\t\t\tif (result.code == 0) {\r\n\t\t\t\t\tresolve(result)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: result.message,\r\n\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t})\r\n\t\t\t\t\treject(result)\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tfail: (err) => {\r\n\t\t\t\tif (finalOptions.showLoading == true) {\r\n\t\t\t\t\tuni.hideLoading()\r\n\t\t\t\t}\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '网络连接失败',\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t})\r\n\t\t\t\treject({\r\n\t\t\t\t\tcode: -1,\r\n\t\t\t\t\tmessage: '网络连接失败',\r\n\t\t\t\t\tdata: null\r\n\t\t\t\t} as ResponseData)\r\n\t\t\t}\r\n\t\t})\r\n\t})\r\n}\r\n\r\n/**\r\n * GET请求\r\n */\r\nexport const get = (url : string, data ?: UTSJSONObject | null) : Promise => {\r\n\treturn request({\r\n\t\turl: url,\r\n\t\tmethod: 'GET',\r\n\t\tdata: data\r\n\t} as RequestOptions)\r\n}\r\n\r\n/**\r\n * POST请求\r\n */\r\nexport const post = (url : string, data ?: UTSJSONObject | null) : Promise => {\r\n\treturn request({\r\n\t\turl: url,\r\n\t\tmethod: 'POST',\r\n\t\tdata: data\r\n\t} as RequestOptions)\r\n}\r\n"],"names":["uni","STORAGE_KEYS","getEnvConfig"],"mappings":"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"}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/mp-weixin/api/index.js b/前端/unpackage/dist/dev/mp-weixin/api/index.js
new file mode 100644
index 0000000..b9212b1
--- /dev/null
+++ b/前端/unpackage/dist/dev/mp-weixin/api/index.js
@@ -0,0 +1,61 @@
+"use strict";
+const utils_request = require("../utils/request.js");
+const getBanners = () => {
+ return Promise.resolve(new UTSJSONObject({
+ code: 0,
+ message: "success",
+ data: [
+ new UTSJSONObject({
+ id: "1",
+ image: "/static/mock/banner1.svg",
+ title: "专业沙发翻新服务",
+ link: "/pages/service/index"
+ }),
+ new UTSJSONObject({
+ id: "2",
+ image: "/static/mock/banner2.svg",
+ title: "十年品质保证",
+ link: "/pages/about/index"
+ }),
+ new UTSJSONObject({
+ id: "3",
+ image: "/static/mock/banner3.svg",
+ title: "免费上门评估",
+ link: "/pages/booking/index"
+ })
+ ]
+ }));
+};
+const getCaseList = (params = null) => {
+ const queryParams = params ? new UTSJSONObject({
+ page: params["page"] || 1,
+ limit: params["pageSize"] || params["limit"] || 10,
+ serviceType: params["category"],
+ status: "published"
+ // 只获取已发布的案例
+ }) : new UTSJSONObject({});
+ return utils_request.get("/cases", queryParams);
+};
+const getCaseDetail = (id) => {
+ return utils_request.get(`/cases/${id}`);
+};
+const getHotCases = () => {
+ return utils_request.get("/cases", new UTSJSONObject({ limit: 4, status: "published" }));
+};
+const getServiceProcess = () => {
+ return utils_request.get("/services");
+};
+const getCompanyInfo = () => {
+ return utils_request.get("/company/info");
+};
+const submitBooking = (data) => {
+ return utils_request.post("/booking", data);
+};
+exports.getBanners = getBanners;
+exports.getCaseDetail = getCaseDetail;
+exports.getCaseList = getCaseList;
+exports.getCompanyInfo = getCompanyInfo;
+exports.getHotCases = getHotCases;
+exports.getServiceProcess = getServiceProcess;
+exports.submitBooking = submitBooking;
+//# sourceMappingURL=../../.sourcemap/mp-weixin/api/index.js.map
diff --git a/前端/unpackage/dist/dev/mp-weixin/app.js b/前端/unpackage/dist/dev/mp-weixin/app.js
new file mode 100644
index 0000000..f0fc71a
--- /dev/null
+++ b/前端/unpackage/dist/dev/mp-weixin/app.js
@@ -0,0 +1,35 @@
+"use strict";
+Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
+const common_vendor = require("./common/vendor.js");
+if (!Math) {
+ "./pages/index/index.js";
+ "./pages/cases/list.js";
+ "./pages/cases/detail.js";
+ "./pages/service/index.js";
+ "./pages/about/index.js";
+ "./pages/booking/index.js";
+ "./pages/user/index.js";
+}
+const _sfc_main = common_vendor.defineComponent({
+ onLaunch() {
+ common_vendor.index.__f__("log", "at App.uvue:7", "App Launch");
+ },
+ onShow() {
+ common_vendor.index.__f__("log", "at App.uvue:10", "App Show");
+ },
+ onHide() {
+ common_vendor.index.__f__("log", "at App.uvue:13", "App Hide");
+ },
+ onExit() {
+ common_vendor.index.__f__("log", "at App.uvue:34", "App Exit");
+ }
+});
+function createApp() {
+ const app = common_vendor.createSSRApp(_sfc_main);
+ return {
+ app
+ };
+}
+createApp().app.mount("#app");
+exports.createApp = createApp;
+//# sourceMappingURL=../.sourcemap/mp-weixin/app.js.map
diff --git a/前端/unpackage/dist/dev/mp-weixin/app.json b/前端/unpackage/dist/dev/mp-weixin/app.json
new file mode 100644
index 0000000..d09e953
--- /dev/null
+++ b/前端/unpackage/dist/dev/mp-weixin/app.json
@@ -0,0 +1,50 @@
+{
+ "pages": [
+ "pages/index/index",
+ "pages/cases/list",
+ "pages/cases/detail",
+ "pages/service/index",
+ "pages/about/index",
+ "pages/booking/index",
+ "pages/user/index"
+ ],
+ "window": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "优艺家沙发翻新",
+ "navigationBarBackgroundColor": "#ffffff",
+ "backgroundColor": "#f5f5f5"
+ },
+ "tabBar": {
+ "color": "#999999",
+ "selectedColor": "#D4A574",
+ "borderStyle": "black",
+ "backgroundColor": "#ffffff",
+ "list": [
+ {
+ "pagePath": "pages/index/index",
+ "iconPath": "static/icons/home.png",
+ "selectedIconPath": "static/icons/home-active.png",
+ "text": "首页"
+ },
+ {
+ "pagePath": "pages/cases/list",
+ "iconPath": "static/icons/cases.png",
+ "selectedIconPath": "static/icons/cases-active.png",
+ "text": "案例"
+ },
+ {
+ "pagePath": "pages/service/index",
+ "iconPath": "static/icons/service.png",
+ "selectedIconPath": "static/icons/service-active.png",
+ "text": "服务"
+ },
+ {
+ "pagePath": "pages/user/index",
+ "iconPath": "static/icons/user.png",
+ "selectedIconPath": "static/icons/user-active.png",
+ "text": "我的"
+ }
+ ]
+ },
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/mp-weixin/app.wxss b/前端/unpackage/dist/dev/mp-weixin/app.wxss
new file mode 100644
index 0000000..53b76e4
--- /dev/null
+++ b/前端/unpackage/dist/dev/mp-weixin/app.wxss
@@ -0,0 +1,9 @@
+
+ /*每个页面公共css */
+.uni-row {
+ flex-direction: row;
+}
+.uni-column {
+ flex-direction: column;
+}
+page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px;--uni-safe-area-inset-top:0px;--uni-safe-area-inset-left:0px;--uni-safe-area-inset-right:0px;--uni-safe-area-inset-bottom:0px;}[data-c-h="true"]{display: none !important;}
\ No newline at end of file
diff --git a/前端/unpackage/dist/dev/mp-weixin/common/uniView.wxs b/前端/unpackage/dist/dev/mp-weixin/common/uniView.wxs
new file mode 100644
index 0000000..561061f
--- /dev/null
+++ b/前端/unpackage/dist/dev/mp-weixin/common/uniView.wxs
@@ -0,0 +1,95 @@
+
+module.exports = {
+ sS: function (newValue, oldValue, _ownerInstance, instance) {
+ if (newValue) {
+ instance.setStyle(newValue)
+ }
+ },
+ sA: function (newValue, oldValue, _ownerInstance, instance) {
+ if (newValue) {
+ handleStartAnimation(newValue, _ownerInstance, instance)
+ }
+ },
+}
+
+function handleStartAnimation(newValue, _ownerInstance, instance) {
+ var info = {}
+ info = JSON.parse(newValue)
+ var element = _ownerInstance.selectComponent('#' + info.id)
+
+ // playState leftTimes
+ var state = element.getState()
+ state.playState = info.playState
+
+ var startTime = null
+
+ state.leftTimes = info.options.iterations || 1
+ var currentStep = 0
+
+ var duration =
+ info.options.direction === 'alternate'
+ ? info.options.duration * 2
+ : info.options.duration
+
+ function interpolateKeyframe(keyframes, usedTime) {
+ var index = 0
+ for (var i = 0; i < keyframes.length; i++) {
+ if (keyframes[i]._startTime + keyframes[i]._duration >= usedTime) {
+ index = i
+ break
+ }
+ }
+ var currentFrame = keyframes[index]
+ return {
+ style: currentFrame,
+ index: index,
+ }
+ }
+
+ function step() {
+ var isCancelled = state.playState === 'cancel'
+ var currentTime = Date.now()
+ if (startTime === null) {
+ startTime = currentTime
+ }
+ var elapsedTime = currentTime - startTime
+
+ if (isCancelled) {
+ var lastFrame = info.keyframes[info.keyframes.length - 1]
+ lastFrame.transition = 'none'
+ element.setStyle(lastFrame)
+ element.removeClass('__ct' + currentStep)
+ return
+ }
+
+ var res = interpolateKeyframe(info.keyframes, elapsedTime)
+
+ // currentStep removeClass
+ if (!element.hasClass('__ct' + res.index) && elapsedTime < duration) {
+ element.setStyle(res.style).addClass('__ct' + res.index)
+ }
+ if (currentStep !== res.index) {
+ element.removeClass('__ct' + currentStep)
+ currentStep = res.index
+ }
+
+ if (elapsedTime <= duration) {
+ instance.requestAnimationFrame(step)
+ } else {
+ // done
+ // element.callMethod('animationEnd')
+ if (state.leftTimes > 1) {
+ state.leftTimes--
+ startTime = null
+ instance.requestAnimationFrame(step)
+ return
+ } else if (state.leftTimes === -1) {
+ // handle infinite
+ startTime = null
+ instance.requestAnimationFrame(step)
+ }
+ }
+ }
+
+ instance.requestAnimationFrame(step)
+}
diff --git a/前端/unpackage/dist/dev/mp-weixin/common/vendor.js b/前端/unpackage/dist/dev/mp-weixin/common/vendor.js
new file mode 100644
index 0000000..97f432b
--- /dev/null
+++ b/前端/unpackage/dist/dev/mp-weixin/common/vendor.js
@@ -0,0 +1,9563 @@
+"use strict";
+/**
+* @vue/shared v3.4.21
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/
+function makeMap(str, expectsLowerCase) {
+ const set2 = new Set(str.split(","));
+ return expectsLowerCase ? (val) => set2.has(val.toLowerCase()) : (val) => set2.has(val);
+}
+const EMPTY_OBJ = Object.freeze({});
+const EMPTY_ARR = Object.freeze([]);
+const NOOP = () => {
+};
+const NO = () => false;
+const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter
+(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);
+const isModelListener = (key) => key.startsWith("onUpdate:");
+const extend = Object.assign;
+const remove = (arr, el) => {
+ const i = arr.indexOf(el);
+ if (i > -1) {
+ arr.splice(i, 1);
+ }
+};
+const hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+const hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
+const isArray = Array.isArray;
+const isMap = (val) => toTypeString(val) === "[object Map]";
+const isSet = (val) => toTypeString(val) === "[object Set]";
+const isFunction = (val) => typeof val === "function";
+const isString = (val) => typeof val === "string";
+const isSymbol = (val) => typeof val === "symbol";
+const isObject = (val) => val !== null && typeof val === "object";
+const isPromise = (val) => {
+ return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
+};
+const objectToString = Object.prototype.toString;
+const toTypeString = (value) => objectToString.call(value);
+const toRawType = (value) => {
+ return toTypeString(value).slice(8, -1);
+};
+const isPlainObject$1 = (val) => toTypeString(val) === "[object Object]";
+const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
+const isReservedProp = /* @__PURE__ */ makeMap(
+ // the leading comma is intentional so empty string "" is also included
+ ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
+);
+const isBuiltInDirective = /* @__PURE__ */ makeMap(
+ "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
+);
+const cacheStringFunction = (fn) => {
+ const cache = /* @__PURE__ */ Object.create(null);
+ return (str) => {
+ const hit = cache[str];
+ return hit || (cache[str] = fn(str));
+ };
+};
+const camelizeRE = /-(\w)/g;
+const camelize = cacheStringFunction((str) => {
+ return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
+});
+const hyphenateRE = /\B([A-Z])/g;
+const hyphenate = cacheStringFunction(
+ (str) => str.replace(hyphenateRE, "-$1").toLowerCase()
+);
+const capitalize = cacheStringFunction((str) => {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+});
+const toHandlerKey = cacheStringFunction((str) => {
+ const s = str ? `on${capitalize(str)}` : ``;
+ return s;
+});
+const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
+const invokeArrayFns$1 = (fns, arg) => {
+ for (let i = 0; i < fns.length; i++) {
+ fns[i](arg);
+ }
+};
+const def = (obj, key, value) => {
+ Object.defineProperty(obj, key, {
+ configurable: true,
+ enumerable: false,
+ value
+ });
+};
+const looseToNumber = (val) => {
+ const n = parseFloat(val);
+ return isNaN(n) ? val : n;
+};
+function normalizeStyle$1(value) {
+ if (isArray(value)) {
+ const res = {};
+ for (let i = 0; i < value.length; i++) {
+ const item = value[i];
+ const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle$1(item);
+ if (normalized) {
+ for (const key in normalized) {
+ res[key] = normalized[key];
+ }
+ }
+ }
+ return res;
+ } else if (isString(value) || isObject(value)) {
+ return value;
+ }
+}
+const listDelimiterRE = /;(?![^(]*\))/g;
+const propertyDelimiterRE = /:([^]+)/;
+const styleCommentRE = /\/\*[^]*?\*\//g;
+function parseStringStyle(cssText) {
+ const ret = {};
+ cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
+ if (item) {
+ const tmp = item.split(propertyDelimiterRE);
+ tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
+ }
+ });
+ return ret;
+}
+const toDisplayString = (val) => {
+ return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);
+};
+const replacer = (_key, val) => {
+ if (val && val.__v_isRef) {
+ return replacer(_key, val.value);
+ } else if (isMap(val)) {
+ return {
+ [`Map(${val.size})`]: [...val.entries()].reduce(
+ (entries, [key, val2], i) => {
+ entries[stringifySymbol(key, i) + " =>"] = val2;
+ return entries;
+ },
+ {}
+ )
+ };
+ } else if (isSet(val)) {
+ return {
+ [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))
+ };
+ } else if (isSymbol(val)) {
+ return stringifySymbol(val);
+ } else if (isObject(val) && !isArray(val) && !isPlainObject$1(val)) {
+ return String(val);
+ }
+ return val;
+};
+const stringifySymbol = (v, i = "") => {
+ var _a;
+ return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v;
+};
+const LOCALE_ZH_HANS = "zh-Hans";
+const LOCALE_ZH_HANT = "zh-Hant";
+const LOCALE_EN = "en";
+const LOCALE_FR = "fr";
+const LOCALE_ES = "es";
+function include(str, parts) {
+ return !!parts.find((part) => str.indexOf(part) !== -1);
+}
+function startsWith(str, parts) {
+ return parts.find((part) => str.indexOf(part) === 0);
+}
+function normalizeLocale(locale, messages) {
+ if (!locale) {
+ return;
+ }
+ locale = locale.trim().replace(/_/g, "-");
+ if (messages && messages[locale]) {
+ return locale;
+ }
+ locale = locale.toLowerCase();
+ if (locale === "chinese") {
+ return LOCALE_ZH_HANS;
+ }
+ if (locale.indexOf("zh") === 0) {
+ if (locale.indexOf("-hans") > -1) {
+ return LOCALE_ZH_HANS;
+ }
+ if (locale.indexOf("-hant") > -1) {
+ return LOCALE_ZH_HANT;
+ }
+ if (include(locale, ["-tw", "-hk", "-mo", "-cht"])) {
+ return LOCALE_ZH_HANT;
+ }
+ return LOCALE_ZH_HANS;
+ }
+ let locales = [LOCALE_EN, LOCALE_FR, LOCALE_ES];
+ if (messages && Object.keys(messages).length > 0) {
+ locales = Object.keys(messages);
+ }
+ const lang = startsWith(locale, locales);
+ if (lang) {
+ return lang;
+ }
+}
+const SLOT_DEFAULT_NAME = "d";
+const ON_SHOW = "onShow";
+const ON_HIDE = "onHide";
+const ON_LAUNCH = "onLaunch";
+const ON_ERROR = "onError";
+const ON_THEME_CHANGE = "onThemeChange";
+const ON_PAGE_NOT_FOUND = "onPageNotFound";
+const ON_UNHANDLE_REJECTION = "onUnhandledRejection";
+const ON_EXIT = "onExit";
+const ON_LOAD = "onLoad";
+const ON_READY = "onReady";
+const ON_UNLOAD = "onUnload";
+const ON_INIT = "onInit";
+const ON_SAVE_EXIT_STATE = "onSaveExitState";
+const ON_RESIZE = "onResize";
+const ON_BACK_PRESS = "onBackPress";
+const ON_PAGE_SCROLL = "onPageScroll";
+const ON_TAB_ITEM_TAP = "onTabItemTap";
+const ON_REACH_BOTTOM = "onReachBottom";
+const ON_PULL_DOWN_REFRESH = "onPullDownRefresh";
+const ON_SHARE_TIMELINE = "onShareTimeline";
+const ON_SHARE_CHAT = "onShareChat";
+const ON_ADD_TO_FAVORITES = "onAddToFavorites";
+const ON_SHARE_APP_MESSAGE = "onShareAppMessage";
+const ON_NAVIGATION_BAR_BUTTON_TAP = "onNavigationBarButtonTap";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = "onNavigationBarSearchInputClicked";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = "onNavigationBarSearchInputChanged";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = "onNavigationBarSearchInputConfirmed";
+const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = "onNavigationBarSearchInputFocusChanged";
+const VIRTUAL_HOST_STYLE = "virtualHostStyle";
+const VIRTUAL_HOST_CLASS = "virtualHostClass";
+const VIRTUAL_HOST_HIDDEN = "virtualHostHidden";
+const VIRTUAL_HOST_ID = "virtualHostId";
+function hasLeadingSlash(str) {
+ return str.indexOf("/") === 0;
+}
+function addLeadingSlash(str) {
+ return hasLeadingSlash(str) ? str : "/" + str;
+}
+const invokeArrayFns = (fns, arg) => {
+ let ret;
+ for (let i = 0; i < fns.length; i++) {
+ ret = fns[i](arg);
+ }
+ return ret;
+};
+function once(fn, ctx = null) {
+ let res;
+ return (...args) => {
+ if (fn) {
+ res = fn.apply(ctx, args);
+ fn = null;
+ }
+ return res;
+ };
+}
+function getValueByDataPath(obj, path) {
+ if (!isString(path)) {
+ return;
+ }
+ path = path.replace(/\[(\d+)\]/g, ".$1");
+ const parts = path.split(".");
+ let key = parts[0];
+ if (!obj) {
+ obj = {};
+ }
+ if (parts.length === 1) {
+ return obj[key];
+ }
+ return getValueByDataPath(obj[key], parts.slice(1).join("."));
+}
+function sortObject(obj) {
+ let sortObj = {};
+ if (isPlainObject$1(obj)) {
+ Object.keys(obj).sort().forEach((key) => {
+ const _key = key;
+ sortObj[_key] = obj[_key];
+ });
+ }
+ return !Object.keys(sortObj) ? obj : sortObj;
+}
+function getGlobalOnce() {
+ if (typeof globalThis !== "undefined") {
+ return globalThis;
+ }
+ if (typeof self !== "undefined") {
+ return self;
+ }
+ if (typeof window !== "undefined") {
+ return window;
+ }
+ function g2() {
+ return this;
+ }
+ if (typeof g2() !== "undefined") {
+ return g2();
+ }
+ return function() {
+ return new Function("return this")();
+ }();
+}
+let g = void 0;
+function getGlobal$1() {
+ if (g) {
+ return g;
+ }
+ g = getGlobalOnce();
+ return g;
+}
+const customizeRE = /:/g;
+function customizeEvent(str) {
+ return camelize(str.replace(customizeRE, "-"));
+}
+function normalizeStyle(value) {
+ const g2 = getGlobal$1();
+ if (g2 && g2.UTSJSONObject && value instanceof g2.UTSJSONObject) {
+ const styleObject = {};
+ g2.UTSJSONObject.keys(value).forEach((key) => {
+ styleObject[key] = value[key];
+ });
+ return normalizeStyle$1(styleObject);
+ } else if (value instanceof Map) {
+ const styleObject = {};
+ value.forEach((value2, key) => {
+ styleObject[key] = value2;
+ });
+ return normalizeStyle$1(styleObject);
+ } else if (isString(value)) {
+ return parseStringStyle(value);
+ } else if (isArray(value)) {
+ const res = {};
+ for (let i = 0; i < value.length; i++) {
+ const item = value[i];
+ const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
+ if (normalized) {
+ for (const key in normalized) {
+ res[key] = normalized[key];
+ }
+ }
+ }
+ return res;
+ } else {
+ return normalizeStyle$1(value);
+ }
+}
+const encode = encodeURIComponent;
+function stringifyQuery(obj, encodeStr = encode) {
+ const res = obj ? Object.keys(obj).map((key) => {
+ let val = obj[key];
+ if (typeof val === void 0 || val === null) {
+ val = "";
+ } else if (isPlainObject$1(val)) {
+ val = JSON.stringify(val);
+ }
+ return encodeStr(key) + "=" + encodeStr(val);
+ }).filter((x) => x.length > 0).join("&") : null;
+ return res ? `?${res}` : "";
+}
+const PAGE_HOOKS = [
+ ON_INIT,
+ ON_LOAD,
+ ON_SHOW,
+ ON_HIDE,
+ ON_UNLOAD,
+ ON_BACK_PRESS,
+ ON_PAGE_SCROLL,
+ ON_TAB_ITEM_TAP,
+ ON_REACH_BOTTOM,
+ ON_PULL_DOWN_REFRESH,
+ ON_SHARE_TIMELINE,
+ ON_SHARE_APP_MESSAGE,
+ ON_SHARE_CHAT,
+ ON_ADD_TO_FAVORITES,
+ ON_SAVE_EXIT_STATE,
+ ON_NAVIGATION_BAR_BUTTON_TAP,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED
+];
+function isRootHook(name) {
+ return PAGE_HOOKS.indexOf(name) > -1;
+}
+const UniLifecycleHooks = [
+ ON_SHOW,
+ ON_HIDE,
+ ON_LAUNCH,
+ ON_ERROR,
+ ON_THEME_CHANGE,
+ ON_PAGE_NOT_FOUND,
+ ON_UNHANDLE_REJECTION,
+ ON_EXIT,
+ ON_INIT,
+ ON_LOAD,
+ ON_READY,
+ ON_UNLOAD,
+ ON_RESIZE,
+ ON_BACK_PRESS,
+ ON_PAGE_SCROLL,
+ ON_TAB_ITEM_TAP,
+ ON_REACH_BOTTOM,
+ ON_PULL_DOWN_REFRESH,
+ ON_SHARE_TIMELINE,
+ ON_ADD_TO_FAVORITES,
+ ON_SHARE_APP_MESSAGE,
+ ON_SHARE_CHAT,
+ ON_SAVE_EXIT_STATE,
+ ON_NAVIGATION_BAR_BUTTON_TAP,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,
+ ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED
+];
+const MINI_PROGRAM_PAGE_RUNTIME_HOOKS = /* @__PURE__ */ (() => {
+ return {
+ onPageScroll: 1,
+ onShareAppMessage: 1 << 1,
+ onShareTimeline: 1 << 2,
+ onShareChat: 1 << 3
+ };
+})();
+function isUniLifecycleHook(name, value, checkType = true) {
+ if (checkType && !isFunction(value)) {
+ return false;
+ }
+ if (UniLifecycleHooks.indexOf(name) > -1) {
+ return true;
+ } else if (name.indexOf("on") === 0) {
+ return true;
+ }
+ return false;
+}
+let vueApp;
+const createVueAppHooks = [];
+function onCreateVueApp(hook) {
+ if (vueApp) {
+ return hook(vueApp);
+ }
+ createVueAppHooks.push(hook);
+}
+function invokeCreateVueAppHook(app) {
+ vueApp = app;
+ createVueAppHooks.forEach((hook) => hook(app));
+}
+const invokeCreateErrorHandler = once((app, createErrorHandler2) => {
+ return createErrorHandler2(app);
+});
+const E = function() {
+};
+E.prototype = {
+ _id: 1,
+ on: function(name, callback, ctx) {
+ var e2 = this.e || (this.e = {});
+ (e2[name] || (e2[name] = [])).push({
+ fn: callback,
+ ctx,
+ _id: this._id
+ });
+ return this._id++;
+ },
+ once: function(name, callback, ctx) {
+ var self2 = this;
+ function listener() {
+ self2.off(name, listener);
+ callback.apply(ctx, arguments);
+ }
+ listener._ = callback;
+ return this.on(name, listener, ctx);
+ },
+ emit: function(name) {
+ var data = [].slice.call(arguments, 1);
+ var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
+ var i = 0;
+ var len = evtArr.length;
+ for (i; i < len; i++) {
+ evtArr[i].fn.apply(evtArr[i].ctx, data);
+ }
+ return this;
+ },
+ off: function(name, event) {
+ var e2 = this.e || (this.e = {});
+ var evts = e2[name];
+ var liveEvents = [];
+ if (evts && event) {
+ for (var i = evts.length - 1; i >= 0; i--) {
+ if (evts[i].fn === event || evts[i].fn._ === event || evts[i]._id === event) {
+ evts.splice(i, 1);
+ break;
+ }
+ }
+ liveEvents = evts;
+ }
+ liveEvents.length ? e2[name] = liveEvents : delete e2[name];
+ return this;
+ }
+};
+var E$1 = E;
+/**
+* @dcloudio/uni-mp-vue v3.4.21
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/
+function warn$2(msg, ...args) {
+ console.warn(`[Vue warn] ${msg}`, ...args);
+}
+let activeEffectScope;
+class EffectScope {
+ constructor(detached = false) {
+ this.detached = detached;
+ this._active = true;
+ this.effects = [];
+ this.cleanups = [];
+ this.parent = activeEffectScope;
+ if (!detached && activeEffectScope) {
+ this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
+ this
+ ) - 1;
+ }
+ }
+ get active() {
+ return this._active;
+ }
+ run(fn) {
+ if (this._active) {
+ const currentEffectScope = activeEffectScope;
+ try {
+ activeEffectScope = this;
+ return fn();
+ } finally {
+ activeEffectScope = currentEffectScope;
+ }
+ } else {
+ warn$2(`cannot run an inactive effect scope.`);
+ }
+ }
+ /**
+ * This should only be called on non-detached scopes
+ * @internal
+ */
+ on() {
+ activeEffectScope = this;
+ }
+ /**
+ * This should only be called on non-detached scopes
+ * @internal
+ */
+ off() {
+ activeEffectScope = this.parent;
+ }
+ stop(fromParent) {
+ if (this._active) {
+ let i, l;
+ for (i = 0, l = this.effects.length; i < l; i++) {
+ this.effects[i].stop();
+ }
+ for (i = 0, l = this.cleanups.length; i < l; i++) {
+ this.cleanups[i]();
+ }
+ if (this.scopes) {
+ for (i = 0, l = this.scopes.length; i < l; i++) {
+ this.scopes[i].stop(true);
+ }
+ }
+ if (!this.detached && this.parent && !fromParent) {
+ const last = this.parent.scopes.pop();
+ if (last && last !== this) {
+ this.parent.scopes[this.index] = last;
+ last.index = this.index;
+ }
+ }
+ this.parent = void 0;
+ this._active = false;
+ }
+ }
+}
+function recordEffectScope(effect2, scope = activeEffectScope) {
+ if (scope && scope.active) {
+ scope.effects.push(effect2);
+ }
+}
+function getCurrentScope() {
+ return activeEffectScope;
+}
+let activeEffect;
+class ReactiveEffect {
+ constructor(fn, trigger2, scheduler, scope) {
+ this.fn = fn;
+ this.trigger = trigger2;
+ this.scheduler = scheduler;
+ this.active = true;
+ this.deps = [];
+ this._dirtyLevel = 4;
+ this._trackId = 0;
+ this._runnings = 0;
+ this._shouldSchedule = false;
+ this._depsLength = 0;
+ recordEffectScope(this, scope);
+ }
+ get dirty() {
+ if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {
+ this._dirtyLevel = 1;
+ pauseTracking();
+ for (let i = 0; i < this._depsLength; i++) {
+ const dep = this.deps[i];
+ if (dep.computed) {
+ triggerComputed(dep.computed);
+ if (this._dirtyLevel >= 4) {
+ break;
+ }
+ }
+ }
+ if (this._dirtyLevel === 1) {
+ this._dirtyLevel = 0;
+ }
+ resetTracking();
+ }
+ return this._dirtyLevel >= 4;
+ }
+ set dirty(v) {
+ this._dirtyLevel = v ? 4 : 0;
+ }
+ run() {
+ this._dirtyLevel = 0;
+ if (!this.active) {
+ return this.fn();
+ }
+ let lastShouldTrack = shouldTrack;
+ let lastEffect = activeEffect;
+ try {
+ shouldTrack = true;
+ activeEffect = this;
+ this._runnings++;
+ preCleanupEffect(this);
+ return this.fn();
+ } finally {
+ postCleanupEffect(this);
+ this._runnings--;
+ activeEffect = lastEffect;
+ shouldTrack = lastShouldTrack;
+ }
+ }
+ stop() {
+ var _a;
+ if (this.active) {
+ preCleanupEffect(this);
+ postCleanupEffect(this);
+ (_a = this.onStop) == null ? void 0 : _a.call(this);
+ this.active = false;
+ }
+ }
+}
+function triggerComputed(computed2) {
+ return computed2.value;
+}
+function preCleanupEffect(effect2) {
+ effect2._trackId++;
+ effect2._depsLength = 0;
+}
+function postCleanupEffect(effect2) {
+ if (effect2.deps.length > effect2._depsLength) {
+ for (let i = effect2._depsLength; i < effect2.deps.length; i++) {
+ cleanupDepEffect(effect2.deps[i], effect2);
+ }
+ effect2.deps.length = effect2._depsLength;
+ }
+}
+function cleanupDepEffect(dep, effect2) {
+ const trackId = dep.get(effect2);
+ if (trackId !== void 0 && effect2._trackId !== trackId) {
+ dep.delete(effect2);
+ if (dep.size === 0) {
+ dep.cleanup();
+ }
+ }
+}
+let shouldTrack = true;
+let pauseScheduleStack = 0;
+const trackStack = [];
+function pauseTracking() {
+ trackStack.push(shouldTrack);
+ shouldTrack = false;
+}
+function resetTracking() {
+ const last = trackStack.pop();
+ shouldTrack = last === void 0 ? true : last;
+}
+function pauseScheduling() {
+ pauseScheduleStack++;
+}
+function resetScheduling() {
+ pauseScheduleStack--;
+ while (!pauseScheduleStack && queueEffectSchedulers.length) {
+ queueEffectSchedulers.shift()();
+ }
+}
+function trackEffect(effect2, dep, debuggerEventExtraInfo) {
+ var _a;
+ if (dep.get(effect2) !== effect2._trackId) {
+ dep.set(effect2, effect2._trackId);
+ const oldDep = effect2.deps[effect2._depsLength];
+ if (oldDep !== dep) {
+ if (oldDep) {
+ cleanupDepEffect(oldDep, effect2);
+ }
+ effect2.deps[effect2._depsLength++] = dep;
+ } else {
+ effect2._depsLength++;
+ }
+ {
+ (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));
+ }
+ }
+}
+const queueEffectSchedulers = [];
+function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {
+ var _a;
+ pauseScheduling();
+ for (const effect2 of dep.keys()) {
+ let tracking;
+ if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
+ effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);
+ effect2._dirtyLevel = dirtyLevel;
+ }
+ if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {
+ {
+ (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));
+ }
+ effect2.trigger();
+ if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {
+ effect2._shouldSchedule = false;
+ if (effect2.scheduler) {
+ queueEffectSchedulers.push(effect2.scheduler);
+ }
+ }
+ }
+ }
+ resetScheduling();
+}
+const createDep = (cleanup, computed2) => {
+ const dep = /* @__PURE__ */ new Map();
+ dep.cleanup = cleanup;
+ dep.computed = computed2;
+ return dep;
+};
+const targetMap = /* @__PURE__ */ new WeakMap();
+const ITERATE_KEY = Symbol("iterate");
+const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate");
+function track(target, type, key) {
+ if (shouldTrack && activeEffect) {
+ let depsMap = targetMap.get(target);
+ if (!depsMap) {
+ targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
+ }
+ let dep = depsMap.get(key);
+ if (!dep) {
+ depsMap.set(key, dep = createDep(() => depsMap.delete(key)));
+ }
+ trackEffect(
+ activeEffect,
+ dep,
+ {
+ target,
+ type,
+ key
+ }
+ );
+ }
+}
+function trigger(target, type, key, newValue, oldValue, oldTarget) {
+ const depsMap = targetMap.get(target);
+ if (!depsMap) {
+ return;
+ }
+ let deps = [];
+ if (type === "clear") {
+ deps = [...depsMap.values()];
+ } else if (key === "length" && isArray(target)) {
+ const newLength = Number(newValue);
+ depsMap.forEach((dep, key2) => {
+ if (key2 === "length" || !isSymbol(key2) && key2 >= newLength) {
+ deps.push(dep);
+ }
+ });
+ } else {
+ if (key !== void 0) {
+ deps.push(depsMap.get(key));
+ }
+ switch (type) {
+ case "add":
+ if (!isArray(target)) {
+ deps.push(depsMap.get(ITERATE_KEY));
+ if (isMap(target)) {
+ deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+ }
+ } else if (isIntegerKey(key)) {
+ deps.push(depsMap.get("length"));
+ }
+ break;
+ case "delete":
+ if (!isArray(target)) {
+ deps.push(depsMap.get(ITERATE_KEY));
+ if (isMap(target)) {
+ deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
+ }
+ }
+ break;
+ case "set":
+ if (isMap(target)) {
+ deps.push(depsMap.get(ITERATE_KEY));
+ }
+ break;
+ }
+ }
+ pauseScheduling();
+ for (const dep of deps) {
+ if (dep) {
+ triggerEffects(
+ dep,
+ 4,
+ {
+ target,
+ type,
+ key,
+ newValue,
+ oldValue,
+ oldTarget
+ }
+ );
+ }
+ }
+ resetScheduling();
+}
+const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
+const builtInSymbols = new Set(
+ /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol)
+);
+const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
+function createArrayInstrumentations() {
+ const instrumentations = {};
+ ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
+ instrumentations[key] = function(...args) {
+ const arr = toRaw(this);
+ for (let i = 0, l = this.length; i < l; i++) {
+ track(arr, "get", i + "");
+ }
+ const res = arr[key](...args);
+ if (res === -1 || res === false) {
+ return arr[key](...args.map(toRaw));
+ } else {
+ return res;
+ }
+ };
+ });
+ ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
+ instrumentations[key] = function(...args) {
+ pauseTracking();
+ pauseScheduling();
+ const res = toRaw(this)[key].apply(this, args);
+ resetScheduling();
+ resetTracking();
+ return res;
+ };
+ });
+ return instrumentations;
+}
+function hasOwnProperty(key) {
+ const obj = toRaw(this);
+ track(obj, "has", key);
+ return obj.hasOwnProperty(key);
+}
+class BaseReactiveHandler {
+ constructor(_isReadonly = false, _isShallow = false) {
+ this._isReadonly = _isReadonly;
+ this._isShallow = _isShallow;
+ }
+ get(target, key, receiver) {
+ const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;
+ if (key === "__v_isReactive") {
+ return !isReadonly2;
+ } else if (key === "__v_isReadonly") {
+ return isReadonly2;
+ } else if (key === "__v_isShallow") {
+ return isShallow2;
+ } else if (key === "__v_raw") {
+ if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype
+ // this means the reciever is a user proxy of the reactive proxy
+ Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {
+ return target;
+ }
+ return;
+ }
+ const targetIsArray = isArray(target);
+ if (!isReadonly2) {
+ if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
+ return Reflect.get(arrayInstrumentations, key, receiver);
+ }
+ if (key === "hasOwnProperty") {
+ return hasOwnProperty;
+ }
+ }
+ const res = Reflect.get(target, key, receiver);
+ if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
+ return res;
+ }
+ if (!isReadonly2) {
+ track(target, "get", key);
+ }
+ if (isShallow2) {
+ return res;
+ }
+ if (isRef(res)) {
+ return targetIsArray && isIntegerKey(key) ? res : res.value;
+ }
+ if (isObject(res)) {
+ return isReadonly2 ? readonly(res) : reactive(res);
+ }
+ return res;
+ }
+}
+class MutableReactiveHandler extends BaseReactiveHandler {
+ constructor(isShallow2 = false) {
+ super(false, isShallow2);
+ }
+ set(target, key, value, receiver) {
+ let oldValue = target[key];
+ if (!this._isShallow) {
+ const isOldValueReadonly = isReadonly(oldValue);
+ if (!isShallow(value) && !isReadonly(value)) {
+ oldValue = toRaw(oldValue);
+ value = toRaw(value);
+ }
+ if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
+ if (isOldValueReadonly) {
+ return false;
+ } else {
+ oldValue.value = value;
+ return true;
+ }
+ }
+ }
+ const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
+ const result = Reflect.set(target, key, value, receiver);
+ if (target === toRaw(receiver)) {
+ if (!hadKey) {
+ trigger(target, "add", key, value);
+ } else if (hasChanged(value, oldValue)) {
+ trigger(target, "set", key, value, oldValue);
+ }
+ }
+ return result;
+ }
+ deleteProperty(target, key) {
+ const hadKey = hasOwn(target, key);
+ const oldValue = target[key];
+ const result = Reflect.deleteProperty(target, key);
+ if (result && hadKey) {
+ trigger(target, "delete", key, void 0, oldValue);
+ }
+ return result;
+ }
+ has(target, key) {
+ const result = Reflect.has(target, key);
+ if (!isSymbol(key) || !builtInSymbols.has(key)) {
+ track(target, "has", key);
+ }
+ return result;
+ }
+ ownKeys(target) {
+ track(
+ target,
+ "iterate",
+ isArray(target) ? "length" : ITERATE_KEY
+ );
+ return Reflect.ownKeys(target);
+ }
+}
+class ReadonlyReactiveHandler extends BaseReactiveHandler {
+ constructor(isShallow2 = false) {
+ super(true, isShallow2);
+ }
+ set(target, key) {
+ {
+ warn$2(
+ `Set operation on key "${String(key)}" failed: target is readonly.`,
+ target
+ );
+ }
+ return true;
+ }
+ deleteProperty(target, key) {
+ {
+ warn$2(
+ `Delete operation on key "${String(key)}" failed: target is readonly.`,
+ target
+ );
+ }
+ return true;
+ }
+}
+const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();
+const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();
+const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(
+ true
+);
+const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);
+const toShallow = (value) => value;
+const getProto = (v) => Reflect.getPrototypeOf(v);
+function get(target, key, isReadonly2 = false, isShallow2 = false) {
+ target = target["__v_raw"];
+ const rawTarget = toRaw(target);
+ const rawKey = toRaw(key);
+ if (!isReadonly2) {
+ if (hasChanged(key, rawKey)) {
+ track(rawTarget, "get", key);
+ }
+ track(rawTarget, "get", rawKey);
+ }
+ const { has: has2 } = getProto(rawTarget);
+ const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
+ if (has2.call(rawTarget, key)) {
+ return wrap(target.get(key));
+ } else if (has2.call(rawTarget, rawKey)) {
+ return wrap(target.get(rawKey));
+ } else if (target !== rawTarget) {
+ target.get(key);
+ }
+}
+function has$1(key, isReadonly2 = false) {
+ const target = this["__v_raw"];
+ const rawTarget = toRaw(target);
+ const rawKey = toRaw(key);
+ if (!isReadonly2) {
+ if (hasChanged(key, rawKey)) {
+ track(rawTarget, "has", key);
+ }
+ track(rawTarget, "has", rawKey);
+ }
+ return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
+}
+function size(target, isReadonly2 = false) {
+ target = target["__v_raw"];
+ !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY);
+ return Reflect.get(target, "size", target);
+}
+function add(value) {
+ value = toRaw(value);
+ const target = toRaw(this);
+ const proto = getProto(target);
+ const hadKey = proto.has.call(target, value);
+ if (!hadKey) {
+ target.add(value);
+ trigger(target, "add", value, value);
+ }
+ return this;
+}
+function set$1(key, value) {
+ value = toRaw(value);
+ const target = toRaw(this);
+ const { has: has2, get: get2 } = getProto(target);
+ let hadKey = has2.call(target, key);
+ if (!hadKey) {
+ key = toRaw(key);
+ hadKey = has2.call(target, key);
+ } else {
+ checkIdentityKeys(target, has2, key);
+ }
+ const oldValue = get2.call(target, key);
+ target.set(key, value);
+ if (!hadKey) {
+ trigger(target, "add", key, value);
+ } else if (hasChanged(value, oldValue)) {
+ trigger(target, "set", key, value, oldValue);
+ }
+ return this;
+}
+function deleteEntry(key) {
+ const target = toRaw(this);
+ const { has: has2, get: get2 } = getProto(target);
+ let hadKey = has2.call(target, key);
+ if (!hadKey) {
+ key = toRaw(key);
+ hadKey = has2.call(target, key);
+ } else {
+ checkIdentityKeys(target, has2, key);
+ }
+ const oldValue = get2 ? get2.call(target, key) : void 0;
+ const result = target.delete(key);
+ if (hadKey) {
+ trigger(target, "delete", key, void 0, oldValue);
+ }
+ return result;
+}
+function clear() {
+ const target = toRaw(this);
+ const hadItems = target.size !== 0;
+ const oldTarget = isMap(target) ? new Map(target) : new Set(target);
+ const result = target.clear();
+ if (hadItems) {
+ trigger(target, "clear", void 0, void 0, oldTarget);
+ }
+ return result;
+}
+function createForEach(isReadonly2, isShallow2) {
+ return function forEach(callback, thisArg) {
+ const observed = this;
+ const target = observed["__v_raw"];
+ const rawTarget = toRaw(target);
+ const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
+ !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY);
+ return target.forEach((value, key) => {
+ return callback.call(thisArg, wrap(value), wrap(key), observed);
+ });
+ };
+}
+function createIterableMethod(method, isReadonly2, isShallow2) {
+ return function(...args) {
+ const target = this["__v_raw"];
+ const rawTarget = toRaw(target);
+ const targetIsMap = isMap(rawTarget);
+ const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
+ const isKeyOnly = method === "keys" && targetIsMap;
+ const innerIterator = target[method](...args);
+ const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
+ !isReadonly2 && track(
+ rawTarget,
+ "iterate",
+ isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY
+ );
+ return {
+ // iterator protocol
+ next() {
+ const { value, done } = innerIterator.next();
+ return done ? { value, done } : {
+ value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
+ done
+ };
+ },
+ // iterable protocol
+ [Symbol.iterator]() {
+ return this;
+ }
+ };
+ };
+}
+function createReadonlyMethod(type) {
+ return function(...args) {
+ {
+ const key = args[0] ? `on key "${args[0]}" ` : ``;
+ warn$2(
+ `${capitalize(type)} operation ${key}failed: target is readonly.`,
+ toRaw(this)
+ );
+ }
+ return type === "delete" ? false : type === "clear" ? void 0 : this;
+ };
+}
+function createInstrumentations() {
+ const mutableInstrumentations2 = {
+ get(key) {
+ return get(this, key);
+ },
+ get size() {
+ return size(this);
+ },
+ has: has$1,
+ add,
+ set: set$1,
+ delete: deleteEntry,
+ clear,
+ forEach: createForEach(false, false)
+ };
+ const shallowInstrumentations2 = {
+ get(key) {
+ return get(this, key, false, true);
+ },
+ get size() {
+ return size(this);
+ },
+ has: has$1,
+ add,
+ set: set$1,
+ delete: deleteEntry,
+ clear,
+ forEach: createForEach(false, true)
+ };
+ const readonlyInstrumentations2 = {
+ get(key) {
+ return get(this, key, true);
+ },
+ get size() {
+ return size(this, true);
+ },
+ has(key) {
+ return has$1.call(this, key, true);
+ },
+ add: createReadonlyMethod("add"),
+ set: createReadonlyMethod("set"),
+ delete: createReadonlyMethod("delete"),
+ clear: createReadonlyMethod("clear"),
+ forEach: createForEach(true, false)
+ };
+ const shallowReadonlyInstrumentations2 = {
+ get(key) {
+ return get(this, key, true, true);
+ },
+ get size() {
+ return size(this, true);
+ },
+ has(key) {
+ return has$1.call(this, key, true);
+ },
+ add: createReadonlyMethod("add"),
+ set: createReadonlyMethod("set"),
+ delete: createReadonlyMethod("delete"),
+ clear: createReadonlyMethod("clear"),
+ forEach: createForEach(true, true)
+ };
+ const iteratorMethods = [
+ "keys",
+ "values",
+ "entries",
+ Symbol.iterator
+ ];
+ iteratorMethods.forEach((method) => {
+ mutableInstrumentations2[method] = createIterableMethod(method, false, false);
+ readonlyInstrumentations2[method] = createIterableMethod(method, true, false);
+ shallowInstrumentations2[method] = createIterableMethod(method, false, true);
+ shallowReadonlyInstrumentations2[method] = createIterableMethod(
+ method,
+ true,
+ true
+ );
+ });
+ return [
+ mutableInstrumentations2,
+ readonlyInstrumentations2,
+ shallowInstrumentations2,
+ shallowReadonlyInstrumentations2
+ ];
+}
+const [
+ mutableInstrumentations,
+ readonlyInstrumentations,
+ shallowInstrumentations,
+ shallowReadonlyInstrumentations
+] = /* @__PURE__ */ createInstrumentations();
+function createInstrumentationGetter(isReadonly2, shallow) {
+ const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations;
+ return (target, key, receiver) => {
+ if (key === "__v_isReactive") {
+ return !isReadonly2;
+ } else if (key === "__v_isReadonly") {
+ return isReadonly2;
+ } else if (key === "__v_raw") {
+ return target;
+ }
+ return Reflect.get(
+ hasOwn(instrumentations, key) && key in target ? instrumentations : target,
+ key,
+ receiver
+ );
+ };
+}
+const mutableCollectionHandlers = {
+ get: /* @__PURE__ */ createInstrumentationGetter(false, false)
+};
+const shallowCollectionHandlers = {
+ get: /* @__PURE__ */ createInstrumentationGetter(false, true)
+};
+const readonlyCollectionHandlers = {
+ get: /* @__PURE__ */ createInstrumentationGetter(true, false)
+};
+const shallowReadonlyCollectionHandlers = {
+ get: /* @__PURE__ */ createInstrumentationGetter(true, true)
+};
+function checkIdentityKeys(target, has2, key) {
+ const rawKey = toRaw(key);
+ if (rawKey !== key && has2.call(target, rawKey)) {
+ const type = toRawType(target);
+ warn$2(
+ `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`
+ );
+ }
+}
+const reactiveMap = /* @__PURE__ */ new WeakMap();
+const shallowReactiveMap = /* @__PURE__ */ new WeakMap();
+const readonlyMap = /* @__PURE__ */ new WeakMap();
+const shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
+function targetTypeMap(rawType) {
+ switch (rawType) {
+ case "Object":
+ case "Array":
+ return 1;
+ case "Map":
+ case "Set":
+ case "WeakMap":
+ case "WeakSet":
+ return 2;
+ default:
+ return 0;
+ }
+}
+function getTargetType(value) {
+ return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value));
+}
+function reactive(target) {
+ if (isReadonly(target)) {
+ return target;
+ }
+ return createReactiveObject(
+ target,
+ false,
+ mutableHandlers,
+ mutableCollectionHandlers,
+ reactiveMap
+ );
+}
+function shallowReactive(target) {
+ return createReactiveObject(
+ target,
+ false,
+ shallowReactiveHandlers,
+ shallowCollectionHandlers,
+ shallowReactiveMap
+ );
+}
+function readonly(target) {
+ return createReactiveObject(
+ target,
+ true,
+ readonlyHandlers,
+ readonlyCollectionHandlers,
+ readonlyMap
+ );
+}
+function shallowReadonly(target) {
+ return createReactiveObject(
+ target,
+ true,
+ shallowReadonlyHandlers,
+ shallowReadonlyCollectionHandlers,
+ shallowReadonlyMap
+ );
+}
+function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
+ if (!isObject(target)) {
+ {
+ warn$2(`value cannot be made reactive: ${String(target)}`);
+ }
+ return target;
+ }
+ if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) {
+ return target;
+ }
+ const existingProxy = proxyMap.get(target);
+ if (existingProxy) {
+ return existingProxy;
+ }
+ const targetType = getTargetType(target);
+ if (targetType === 0) {
+ return target;
+ }
+ const proxy = new Proxy(
+ target,
+ targetType === 2 ? collectionHandlers : baseHandlers
+ );
+ proxyMap.set(target, proxy);
+ return proxy;
+}
+function isReactive(value) {
+ if (isReadonly(value)) {
+ return isReactive(value["__v_raw"]);
+ }
+ return !!(value && value["__v_isReactive"]);
+}
+function isReadonly(value) {
+ return !!(value && value["__v_isReadonly"]);
+}
+function isShallow(value) {
+ return !!(value && value["__v_isShallow"]);
+}
+function isProxy(value) {
+ return isReactive(value) || isReadonly(value);
+}
+function toRaw(observed) {
+ const raw = observed && observed["__v_raw"];
+ return raw ? toRaw(raw) : observed;
+}
+function markRaw(value) {
+ if (Object.isExtensible(value)) {
+ def(value, "__v_skip", true);
+ }
+ return value;
+}
+const toReactive = (value) => isObject(value) ? reactive(value) : value;
+const toReadonly = (value) => isObject(value) ? readonly(value) : value;
+const COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;
+class ComputedRefImpl {
+ constructor(getter, _setter, isReadonly2, isSSR) {
+ this.getter = getter;
+ this._setter = _setter;
+ this.dep = void 0;
+ this.__v_isRef = true;
+ this["__v_isReadonly"] = false;
+ this.effect = new ReactiveEffect(
+ () => getter(this._value),
+ () => triggerRefValue(
+ this,
+ this.effect._dirtyLevel === 2 ? 2 : 3
+ )
+ );
+ this.effect.computed = this;
+ this.effect.active = this._cacheable = !isSSR;
+ this["__v_isReadonly"] = isReadonly2;
+ }
+ get value() {
+ const self2 = toRaw(this);
+ if ((!self2._cacheable || self2.effect.dirty) && hasChanged(self2._value, self2._value = self2.effect.run())) {
+ triggerRefValue(self2, 4);
+ }
+ trackRefValue(self2);
+ if (self2.effect._dirtyLevel >= 2) {
+ if (this._warnRecursive) {
+ warn$2(COMPUTED_SIDE_EFFECT_WARN, `
+
+getter: `, this.getter);
+ }
+ triggerRefValue(self2, 2);
+ }
+ return self2._value;
+ }
+ set value(newValue) {
+ this._setter(newValue);
+ }
+ // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x
+ get _dirty() {
+ return this.effect.dirty;
+ }
+ set _dirty(v) {
+ this.effect.dirty = v;
+ }
+ // #endregion
+}
+function computed$1(getterOrOptions, debugOptions, isSSR = false) {
+ let getter;
+ let setter;
+ const onlyGetter = isFunction(getterOrOptions);
+ if (onlyGetter) {
+ getter = getterOrOptions;
+ setter = () => {
+ warn$2("Write operation failed: computed value is readonly");
+ };
+ } else {
+ getter = getterOrOptions.get;
+ setter = getterOrOptions.set;
+ }
+ const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);
+ if (debugOptions && !isSSR) {
+ cRef.effect.onTrack = debugOptions.onTrack;
+ cRef.effect.onTrigger = debugOptions.onTrigger;
+ }
+ return cRef;
+}
+function trackRefValue(ref2) {
+ var _a;
+ if (shouldTrack && activeEffect) {
+ ref2 = toRaw(ref2);
+ trackEffect(
+ activeEffect,
+ (_a = ref2.dep) != null ? _a : ref2.dep = createDep(
+ () => ref2.dep = void 0,
+ ref2 instanceof ComputedRefImpl ? ref2 : void 0
+ ),
+ {
+ target: ref2,
+ type: "get",
+ key: "value"
+ }
+ );
+ }
+}
+function triggerRefValue(ref2, dirtyLevel = 4, newVal) {
+ ref2 = toRaw(ref2);
+ const dep = ref2.dep;
+ if (dep) {
+ triggerEffects(
+ dep,
+ dirtyLevel,
+ {
+ target: ref2,
+ type: "set",
+ key: "value",
+ newValue: newVal
+ }
+ );
+ }
+}
+function isRef(r2) {
+ return !!(r2 && r2.__v_isRef === true);
+}
+function ref(value) {
+ return createRef(value, false);
+}
+function createRef(rawValue, shallow) {
+ if (isRef(rawValue)) {
+ return rawValue;
+ }
+ return new RefImpl(rawValue, shallow);
+}
+class RefImpl {
+ constructor(value, __v_isShallow) {
+ this.__v_isShallow = __v_isShallow;
+ this.dep = void 0;
+ this.__v_isRef = true;
+ this._rawValue = __v_isShallow ? value : toRaw(value);
+ this._value = __v_isShallow ? value : toReactive(value);
+ }
+ get value() {
+ trackRefValue(this);
+ return this._value;
+ }
+ set value(newVal) {
+ const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
+ newVal = useDirectValue ? newVal : toRaw(newVal);
+ if (hasChanged(newVal, this._rawValue)) {
+ this._rawValue = newVal;
+ this._value = useDirectValue ? newVal : toReactive(newVal);
+ triggerRefValue(this, 4, newVal);
+ }
+ }
+}
+function unref(ref2) {
+ return isRef(ref2) ? ref2.value : ref2;
+}
+const shallowUnwrapHandlers = {
+ get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
+ set: (target, key, value, receiver) => {
+ const oldValue = target[key];
+ if (isRef(oldValue) && !isRef(value)) {
+ oldValue.value = value;
+ return true;
+ } else {
+ return Reflect.set(target, key, value, receiver);
+ }
+ }
+};
+function proxyRefs(objectWithRefs) {
+ return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
+}
+const stack = [];
+function pushWarningContext(vnode) {
+ stack.push(vnode);
+}
+function popWarningContext() {
+ stack.pop();
+}
+function warn$1(msg, ...args) {
+ pauseTracking();
+ const instance = stack.length ? stack[stack.length - 1].component : null;
+ const appWarnHandler = instance && instance.appContext.config.warnHandler;
+ const trace = getComponentTrace();
+ if (appWarnHandler) {
+ callWithErrorHandling(
+ appWarnHandler,
+ instance,
+ 11,
+ [
+ msg + args.map((a) => {
+ var _a, _b;
+ return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);
+ }).join(""),
+ instance && instance.proxy,
+ trace.map(
+ ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
+ ).join("\n"),
+ trace
+ ]
+ );
+ } else {
+ const warnArgs = [`[Vue warn]: ${msg}`, ...args];
+ if (trace.length && // avoid spamming console during tests
+ true) {
+ warnArgs.push(`
+`, ...formatTrace(trace));
+ }
+ console.warn(...warnArgs);
+ }
+ resetTracking();
+}
+function getComponentTrace() {
+ let currentVNode = stack[stack.length - 1];
+ if (!currentVNode) {
+ return [];
+ }
+ const normalizedStack = [];
+ while (currentVNode) {
+ const last = normalizedStack[0];
+ if (last && last.vnode === currentVNode) {
+ last.recurseCount++;
+ } else {
+ normalizedStack.push({
+ vnode: currentVNode,
+ recurseCount: 0
+ });
+ }
+ const parentInstance = currentVNode.component && currentVNode.component.parent;
+ currentVNode = parentInstance && parentInstance.vnode;
+ }
+ return normalizedStack;
+}
+function formatTrace(trace) {
+ const logs = [];
+ trace.forEach((entry, i) => {
+ logs.push(...i === 0 ? [] : [`
+`], ...formatTraceEntry(entry));
+ });
+ return logs;
+}
+function formatTraceEntry({ vnode, recurseCount }) {
+ const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;
+ const isRoot = vnode.component ? vnode.component.parent == null : false;
+ const open = ` at <${formatComponentName(
+ vnode.component,
+ vnode.type,
+ isRoot
+ )}`;
+ const close = `>` + postfix;
+ return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];
+}
+function formatProps(props) {
+ const res = [];
+ const keys = Object.keys(props);
+ keys.slice(0, 3).forEach((key) => {
+ res.push(...formatProp(key, props[key]));
+ });
+ if (keys.length > 3) {
+ res.push(` ...`);
+ }
+ return res;
+}
+function formatProp(key, value, raw) {
+ if (isString(value)) {
+ value = JSON.stringify(value);
+ return raw ? value : [`${key}=${value}`];
+ } else if (typeof value === "number" || typeof value === "boolean" || value == null) {
+ return raw ? value : [`${key}=${value}`];
+ } else if (isRef(value)) {
+ value = formatProp(key, toRaw(value.value), true);
+ return raw ? value : [`${key}=Ref<`, value, `>`];
+ } else if (isFunction(value)) {
+ return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];
+ } else {
+ value = toRaw(value);
+ return raw ? value : [`${key}=`, value];
+ }
+}
+const ErrorTypeStrings = {
+ ["sp"]: "serverPrefetch hook",
+ ["bc"]: "beforeCreate hook",
+ ["c"]: "created hook",
+ ["bm"]: "beforeMount hook",
+ ["m"]: "mounted hook",
+ ["bu"]: "beforeUpdate hook",
+ ["u"]: "updated",
+ ["bum"]: "beforeUnmount hook",
+ ["um"]: "unmounted hook",
+ ["a"]: "activated hook",
+ ["da"]: "deactivated hook",
+ ["ec"]: "errorCaptured hook",
+ ["rtc"]: "renderTracked hook",
+ ["rtg"]: "renderTriggered hook",
+ [0]: "setup function",
+ [1]: "render function",
+ [2]: "watcher getter",
+ [3]: "watcher callback",
+ [4]: "watcher cleanup function",
+ [5]: "native event handler",
+ [6]: "component event handler",
+ [7]: "vnode hook",
+ [8]: "directive hook",
+ [9]: "transition hook",
+ [10]: "app errorHandler",
+ [11]: "app warnHandler",
+ [12]: "ref function",
+ [13]: "async component loader",
+ [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ."
+};
+function callWithErrorHandling(fn, instance, type, args) {
+ try {
+ return args ? fn(...args) : fn();
+ } catch (err) {
+ handleError(err, instance, type);
+ }
+}
+function callWithAsyncErrorHandling(fn, instance, type, args) {
+ if (isFunction(fn)) {
+ const res = callWithErrorHandling(fn, instance, type, args);
+ if (res && isPromise(res)) {
+ res.catch((err) => {
+ handleError(err, instance, type);
+ });
+ }
+ return res;
+ }
+ const values = [];
+ for (let i = 0; i < fn.length; i++) {
+ values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
+ }
+ return values;
+}
+function handleError(err, instance, type, throwInDev = true) {
+ const contextVNode = instance ? instance.vnode : null;
+ if (instance) {
+ let cur = instance.parent;
+ const exposedInstance = instance.proxy;
+ const errorInfo = ErrorTypeStrings[type] || type;
+ while (cur) {
+ const errorCapturedHooks = cur.ec;
+ if (errorCapturedHooks) {
+ for (let i = 0; i < errorCapturedHooks.length; i++) {
+ if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {
+ return;
+ }
+ }
+ }
+ cur = cur.parent;
+ }
+ const appErrorHandler = instance.appContext.config.errorHandler;
+ if (appErrorHandler) {
+ callWithErrorHandling(
+ appErrorHandler,
+ null,
+ 10,
+ [err, exposedInstance, errorInfo]
+ );
+ return;
+ }
+ }
+ logError(err, type, contextVNode, throwInDev);
+}
+function logError(err, type, contextVNode, throwInDev = true) {
+ {
+ const info = ErrorTypeStrings[type] || type;
+ if (contextVNode) {
+ pushWarningContext(contextVNode);
+ }
+ warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);
+ if (contextVNode) {
+ popWarningContext();
+ }
+ if (throwInDev) {
+ console.error(err);
+ } else {
+ console.error(err);
+ }
+ }
+}
+let isFlushing = false;
+let isFlushPending = false;
+const queue$1 = [];
+let flushIndex = 0;
+const pendingPostFlushCbs = [];
+let activePostFlushCbs = null;
+let postFlushIndex = 0;
+const resolvedPromise = /* @__PURE__ */ Promise.resolve();
+let currentFlushPromise = null;
+const RECURSION_LIMIT = 100;
+function nextTick$1(fn) {
+ const p2 = currentFlushPromise || resolvedPromise;
+ return fn ? p2.then(this ? fn.bind(this) : fn) : p2;
+}
+function findInsertionIndex(id) {
+ let start = flushIndex + 1;
+ let end = queue$1.length;
+ while (start < end) {
+ const middle = start + end >>> 1;
+ const middleJob = queue$1[middle];
+ const middleJobId = getId(middleJob);
+ if (middleJobId < id || middleJobId === id && middleJob.pre) {
+ start = middle + 1;
+ } else {
+ end = middle;
+ }
+ }
+ return start;
+}
+function queueJob(job) {
+ if (!queue$1.length || !queue$1.includes(
+ job,
+ isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex
+ )) {
+ if (job.id == null) {
+ queue$1.push(job);
+ } else {
+ queue$1.splice(findInsertionIndex(job.id), 0, job);
+ }
+ queueFlush();
+ }
+}
+function queueFlush() {
+ if (!isFlushing && !isFlushPending) {
+ isFlushPending = true;
+ currentFlushPromise = resolvedPromise.then(flushJobs);
+ }
+}
+function hasQueueJob(job) {
+ return queue$1.indexOf(job) > -1;
+}
+function invalidateJob(job) {
+ const i = queue$1.indexOf(job);
+ if (i > flushIndex) {
+ queue$1.splice(i, 1);
+ }
+}
+function queuePostFlushCb(cb) {
+ if (!isArray(cb)) {
+ if (!activePostFlushCbs || !activePostFlushCbs.includes(
+ cb,
+ cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex
+ )) {
+ pendingPostFlushCbs.push(cb);
+ }
+ } else {
+ pendingPostFlushCbs.push(...cb);
+ }
+ queueFlush();
+}
+function flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) {
+ {
+ seen = seen || /* @__PURE__ */ new Map();
+ }
+ for (; i < queue$1.length; i++) {
+ const cb = queue$1[i];
+ if (cb && cb.pre) {
+ if (checkRecursiveUpdates(seen, cb)) {
+ continue;
+ }
+ queue$1.splice(i, 1);
+ i--;
+ cb();
+ }
+ }
+}
+function flushPostFlushCbs(seen) {
+ if (pendingPostFlushCbs.length) {
+ const deduped = [...new Set(pendingPostFlushCbs)].sort(
+ (a, b) => getId(a) - getId(b)
+ );
+ pendingPostFlushCbs.length = 0;
+ if (activePostFlushCbs) {
+ activePostFlushCbs.push(...deduped);
+ return;
+ }
+ activePostFlushCbs = deduped;
+ {
+ seen = seen || /* @__PURE__ */ new Map();
+ }
+ for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
+ if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {
+ continue;
+ }
+ activePostFlushCbs[postFlushIndex]();
+ }
+ activePostFlushCbs = null;
+ postFlushIndex = 0;
+ }
+}
+const getId = (job) => job.id == null ? Infinity : job.id;
+const comparator = (a, b) => {
+ const diff2 = getId(a) - getId(b);
+ if (diff2 === 0) {
+ if (a.pre && !b.pre)
+ return -1;
+ if (b.pre && !a.pre)
+ return 1;
+ }
+ return diff2;
+};
+function flushJobs(seen) {
+ isFlushPending = false;
+ isFlushing = true;
+ {
+ seen = seen || /* @__PURE__ */ new Map();
+ }
+ queue$1.sort(comparator);
+ const check = (job) => checkRecursiveUpdates(seen, job);
+ try {
+ for (flushIndex = 0; flushIndex < queue$1.length; flushIndex++) {
+ const job = queue$1[flushIndex];
+ if (job && job.active !== false) {
+ if (check(job)) {
+ continue;
+ }
+ callWithErrorHandling(job, null, 14);
+ }
+ }
+ } finally {
+ flushIndex = 0;
+ queue$1.length = 0;
+ flushPostFlushCbs(seen);
+ isFlushing = false;
+ currentFlushPromise = null;
+ if (queue$1.length || pendingPostFlushCbs.length) {
+ flushJobs(seen);
+ }
+ }
+}
+function checkRecursiveUpdates(seen, fn) {
+ if (!seen.has(fn)) {
+ seen.set(fn, 1);
+ } else {
+ const count = seen.get(fn);
+ if (count > RECURSION_LIMIT) {
+ const instance = fn.ownerInstance;
+ const componentName = instance && getComponentName(instance.type);
+ handleError(
+ `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,
+ null,
+ 10
+ );
+ return true;
+ } else {
+ seen.set(fn, count + 1);
+ }
+ }
+}
+let devtools;
+let buffer = [];
+let devtoolsNotInstalled = false;
+function emit$1(event, ...args) {
+ if (devtools) {
+ devtools.emit(event, ...args);
+ } else if (!devtoolsNotInstalled) {
+ buffer.push({ event, args });
+ }
+}
+function setDevtoolsHook(hook, target) {
+ var _a, _b;
+ devtools = hook;
+ if (devtools) {
+ devtools.enabled = true;
+ buffer.forEach(({ event, args }) => devtools.emit(event, ...args));
+ buffer = [];
+ } else if (
+ // handle late devtools injection - only do this if we are in an actual
+ // browser environment to avoid the timer handle stalling test runner exit
+ // (#4815)
+ typeof window !== "undefined" && // some envs mock window but not fully
+ window.HTMLElement && // also exclude jsdom
+ !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom"))
+ ) {
+ const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];
+ replay.push((newHook) => {
+ setDevtoolsHook(newHook, target);
+ });
+ setTimeout(() => {
+ if (!devtools) {
+ target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;
+ devtoolsNotInstalled = true;
+ buffer = [];
+ }
+ }, 3e3);
+ } else {
+ devtoolsNotInstalled = true;
+ buffer = [];
+ }
+}
+function devtoolsInitApp(app, version2) {
+ emit$1("app:init", app, version2, {
+ Fragment,
+ Text,
+ Comment,
+ Static
+ });
+}
+const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(
+ "component:added"
+ /* COMPONENT_ADDED */
+);
+const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(
+ "component:updated"
+ /* COMPONENT_UPDATED */
+);
+const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(
+ "component:removed"
+ /* COMPONENT_REMOVED */
+);
+const devtoolsComponentRemoved = (component) => {
+ if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered
+ !devtools.cleanupBuffer(component)) {
+ _devtoolsComponentRemoved(component);
+ }
+};
+/*! #__NO_SIDE_EFFECTS__ */
+// @__NO_SIDE_EFFECTS__
+function createDevtoolsComponentHook(hook) {
+ return (component) => {
+ emit$1(
+ hook,
+ component.appContext.app,
+ component.uid,
+ // fixed by xxxxxx
+ // 为 0 是 App,无 parent 是 Page 指向 App
+ component.uid === 0 ? void 0 : component.parent ? component.parent.uid : 0,
+ component
+ );
+ };
+}
+const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(
+ "perf:start"
+ /* PERFORMANCE_START */
+);
+const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(
+ "perf:end"
+ /* PERFORMANCE_END */
+);
+function createDevtoolsPerformanceHook(hook) {
+ return (component, type, time) => {
+ emit$1(hook, component.appContext.app, component.uid, component, type, time);
+ };
+}
+function devtoolsComponentEmit(component, event, params) {
+ emit$1(
+ "component:emit",
+ component.appContext.app,
+ component,
+ event,
+ params
+ );
+}
+function emit(instance, event, ...rawArgs) {
+ if (instance.isUnmounted)
+ return;
+ const props = instance.vnode.props || EMPTY_OBJ;
+ {
+ const {
+ emitsOptions,
+ propsOptions: [propsOptions]
+ } = instance;
+ if (emitsOptions) {
+ if (!(event in emitsOptions) && true) {
+ if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {
+ warn$1(
+ `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.`
+ );
+ }
+ } else {
+ const validator = emitsOptions[event];
+ if (isFunction(validator)) {
+ const isValid = validator(...rawArgs);
+ if (!isValid) {
+ warn$1(
+ `Invalid event arguments: event validation failed for event "${event}".`
+ );
+ }
+ }
+ }
+ }
+ }
+ let args = rawArgs;
+ const isModelListener2 = event.startsWith("update:");
+ const modelArg = isModelListener2 && event.slice(7);
+ if (modelArg && modelArg in props) {
+ const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`;
+ const { number, trim } = props[modifiersKey] || EMPTY_OBJ;
+ if (trim) {
+ args = rawArgs.map((a) => isString(a) ? a.trim() : a);
+ }
+ if (number) {
+ args = rawArgs.map(looseToNumber);
+ }
+ }
+ {
+ devtoolsComponentEmit(instance, event, args);
+ }
+ {
+ const lowerCaseEvent = event.toLowerCase();
+ if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {
+ warn$1(
+ `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName(
+ instance,
+ instance.type
+ )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(
+ event
+ )}" instead of "${event}".`
+ );
+ }
+ }
+ let handlerName;
+ let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)
+ props[handlerName = toHandlerKey(camelize(event))];
+ if (!handler && isModelListener2) {
+ handler = props[handlerName = toHandlerKey(hyphenate(event))];
+ }
+ if (handler) {
+ callWithAsyncErrorHandling(
+ handler,
+ instance,
+ 6,
+ args
+ );
+ }
+ const onceHandler = props[handlerName + `Once`];
+ if (onceHandler) {
+ if (!instance.emitted) {
+ instance.emitted = {};
+ } else if (instance.emitted[handlerName]) {
+ return;
+ }
+ instance.emitted[handlerName] = true;
+ callWithAsyncErrorHandling(
+ onceHandler,
+ instance,
+ 6,
+ args
+ );
+ }
+}
+function normalizeEmitsOptions(comp, appContext, asMixin = false) {
+ const cache = appContext.emitsCache;
+ const cached = cache.get(comp);
+ if (cached !== void 0) {
+ return cached;
+ }
+ const raw = comp.emits;
+ let normalized = {};
+ let hasExtends = false;
+ if (!isFunction(comp)) {
+ const extendEmits = (raw2) => {
+ const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
+ if (normalizedFromExtend) {
+ hasExtends = true;
+ extend(normalized, normalizedFromExtend);
+ }
+ };
+ if (!asMixin && appContext.mixins.length) {
+ appContext.mixins.forEach(extendEmits);
+ }
+ if (comp.extends) {
+ extendEmits(comp.extends);
+ }
+ if (comp.mixins) {
+ comp.mixins.forEach(extendEmits);
+ }
+ }
+ if (!raw && !hasExtends) {
+ if (isObject(comp)) {
+ cache.set(comp, null);
+ }
+ return null;
+ }
+ if (isArray(raw)) {
+ raw.forEach((key) => normalized[key] = null);
+ } else {
+ extend(normalized, raw);
+ }
+ if (isObject(comp)) {
+ cache.set(comp, normalized);
+ }
+ return normalized;
+}
+function isEmitListener(options, key) {
+ if (!options || !isOn(key)) {
+ return false;
+ }
+ key = key.slice(2).replace(/Once$/, "");
+ return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
+}
+let currentRenderingInstance = null;
+function setCurrentRenderingInstance(instance) {
+ const prev = currentRenderingInstance;
+ currentRenderingInstance = instance;
+ instance && instance.type.__scopeId || null;
+ return prev;
+}
+const COMPONENTS = "components";
+function resolveComponent(name, maybeSelfReference) {
+ return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;
+}
+function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {
+ const instance = currentRenderingInstance || currentInstance;
+ if (instance) {
+ const Component2 = instance.type;
+ if (type === COMPONENTS) {
+ const selfName = getComponentName(
+ Component2,
+ false
+ );
+ if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {
+ return Component2;
+ }
+ }
+ const res = (
+ // local registration
+ // check instance[type] first which is resolved for options API
+ resolve(instance[type] || Component2[type], name) || // global registration
+ resolve(instance.appContext[type], name)
+ );
+ if (!res && maybeSelfReference) {
+ return Component2;
+ }
+ if (warnMissing && !res) {
+ const extra = type === COMPONENTS ? `
+If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;
+ warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);
+ }
+ return res;
+ } else {
+ warn$1(
+ `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`
+ );
+ }
+}
+function resolve(registry, name) {
+ return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);
+}
+const INITIAL_WATCHER_VALUE = {};
+function watch(source, cb, options) {
+ if (!isFunction(cb)) {
+ warn$1(
+ `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.`
+ );
+ }
+ return doWatch(source, cb, options);
+}
+function doWatch(source, cb, {
+ immediate,
+ deep,
+ flush,
+ once: once2,
+ onTrack,
+ onTrigger
+} = EMPTY_OBJ) {
+ if (cb && once2) {
+ const _cb = cb;
+ cb = (...args) => {
+ _cb(...args);
+ unwatch();
+ };
+ }
+ if (deep !== void 0 && typeof deep === "number") {
+ warn$1(
+ `watch() "deep" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.`
+ );
+ }
+ if (!cb) {
+ if (immediate !== void 0) {
+ warn$1(
+ `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.`
+ );
+ }
+ if (deep !== void 0) {
+ warn$1(
+ `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.`
+ );
+ }
+ if (once2 !== void 0) {
+ warn$1(
+ `watch() "once" option is only respected when using the watch(source, callback, options?) signature.`
+ );
+ }
+ }
+ const warnInvalidSource = (s2) => {
+ warn$1(
+ `Invalid watch source: `,
+ s2,
+ `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`
+ );
+ };
+ const instance = currentInstance;
+ const reactiveGetter = (source2) => deep === true ? source2 : (
+ // for deep: false, only traverse root-level properties
+ traverse(source2, deep === false ? 1 : void 0)
+ );
+ let getter;
+ let forceTrigger = false;
+ let isMultiSource = false;
+ if (isRef(source)) {
+ getter = () => source.value;
+ forceTrigger = isShallow(source);
+ } else if (isReactive(source)) {
+ getter = () => reactiveGetter(source);
+ forceTrigger = true;
+ } else if (isArray(source)) {
+ isMultiSource = true;
+ forceTrigger = source.some((s2) => isReactive(s2) || isShallow(s2));
+ getter = () => source.map((s2) => {
+ if (isRef(s2)) {
+ return s2.value;
+ } else if (isReactive(s2)) {
+ return reactiveGetter(s2);
+ } else if (isFunction(s2)) {
+ return callWithErrorHandling(s2, instance, 2);
+ } else {
+ warnInvalidSource(s2);
+ }
+ });
+ } else if (isFunction(source)) {
+ if (cb) {
+ getter = () => callWithErrorHandling(source, instance, 2);
+ } else {
+ getter = () => {
+ if (cleanup) {
+ cleanup();
+ }
+ return callWithAsyncErrorHandling(
+ source,
+ instance,
+ 3,
+ [onCleanup]
+ );
+ };
+ }
+ } else {
+ getter = NOOP;
+ warnInvalidSource(source);
+ }
+ if (cb && deep) {
+ const baseGetter = getter;
+ getter = () => traverse(baseGetter());
+ }
+ let cleanup;
+ let onCleanup = (fn) => {
+ cleanup = effect2.onStop = () => {
+ callWithErrorHandling(fn, instance, 4);
+ cleanup = effect2.onStop = void 0;
+ };
+ };
+ let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
+ const job = () => {
+ if (!effect2.active || !effect2.dirty) {
+ return;
+ }
+ if (cb) {
+ const newValue = effect2.run();
+ if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {
+ if (cleanup) {
+ cleanup();
+ }
+ callWithAsyncErrorHandling(cb, instance, 3, [
+ newValue,
+ // pass undefined as the old value when it's changed for the first time
+ oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
+ onCleanup
+ ]);
+ oldValue = newValue;
+ }
+ } else {
+ effect2.run();
+ }
+ };
+ job.allowRecurse = !!cb;
+ let scheduler;
+ if (flush === "sync") {
+ scheduler = job;
+ } else if (flush === "post") {
+ scheduler = () => queuePostRenderEffect$1(job, instance && instance.suspense);
+ } else {
+ job.pre = true;
+ if (instance)
+ job.id = instance.uid;
+ scheduler = () => queueJob(job);
+ }
+ const effect2 = new ReactiveEffect(getter, NOOP, scheduler);
+ const scope = getCurrentScope();
+ const unwatch = () => {
+ effect2.stop();
+ if (scope) {
+ remove(scope.effects, effect2);
+ }
+ };
+ {
+ effect2.onTrack = onTrack;
+ effect2.onTrigger = onTrigger;
+ }
+ if (cb) {
+ if (immediate) {
+ job();
+ } else {
+ oldValue = effect2.run();
+ }
+ } else if (flush === "post") {
+ queuePostRenderEffect$1(
+ effect2.run.bind(effect2),
+ instance && instance.suspense
+ );
+ } else {
+ effect2.run();
+ }
+ return unwatch;
+}
+function instanceWatch(source, value, options) {
+ const publicThis = this.proxy;
+ const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
+ let cb;
+ if (isFunction(value)) {
+ cb = value;
+ } else {
+ cb = value.handler;
+ options = value;
+ }
+ const reset = setCurrentInstance(this);
+ const res = doWatch(getter, cb.bind(publicThis), options);
+ reset();
+ return res;
+}
+function createPathGetter(ctx, path) {
+ const segments = path.split(".");
+ return () => {
+ let cur = ctx;
+ for (let i = 0; i < segments.length && cur; i++) {
+ cur = cur[segments[i]];
+ }
+ return cur;
+ };
+}
+function traverse(value, depth, currentDepth = 0, seen) {
+ if (!isObject(value) || value["__v_skip"]) {
+ return value;
+ }
+ if (depth && depth > 0) {
+ if (currentDepth >= depth) {
+ return value;
+ }
+ currentDepth++;
+ }
+ seen = seen || /* @__PURE__ */ new Set();
+ if (seen.has(value)) {
+ return value;
+ }
+ seen.add(value);
+ if (isRef(value)) {
+ traverse(value.value, depth, currentDepth, seen);
+ } else if (isArray(value)) {
+ for (let i = 0; i < value.length; i++) {
+ traverse(value[i], depth, currentDepth, seen);
+ }
+ } else if (isSet(value) || isMap(value)) {
+ value.forEach((v) => {
+ traverse(v, depth, currentDepth, seen);
+ });
+ } else if (isPlainObject$1(value)) {
+ for (const key in value) {
+ traverse(value[key], depth, currentDepth, seen);
+ }
+ }
+ return value;
+}
+function validateDirectiveName(name) {
+ if (isBuiltInDirective(name)) {
+ warn$1("Do not use built-in directive ids as custom directive id: " + name);
+ }
+}
+function createAppContext() {
+ return {
+ app: null,
+ config: {
+ isNativeTag: NO,
+ performance: false,
+ globalProperties: {},
+ optionMergeStrategies: {},
+ errorHandler: void 0,
+ warnHandler: void 0,
+ compilerOptions: {}
+ },
+ mixins: [],
+ components: {},
+ directives: {},
+ provides: /* @__PURE__ */ Object.create(null),
+ optionsCache: /* @__PURE__ */ new WeakMap(),
+ propsCache: /* @__PURE__ */ new WeakMap(),
+ emitsCache: /* @__PURE__ */ new WeakMap()
+ };
+}
+let uid$1 = 0;
+function createAppAPI(render, hydrate) {
+ return function createApp2(rootComponent, rootProps = null) {
+ if (!isFunction(rootComponent)) {
+ rootComponent = extend({}, rootComponent);
+ }
+ if (rootProps != null && !isObject(rootProps)) {
+ warn$1(`root props passed to app.mount() must be an object.`);
+ rootProps = null;
+ }
+ const context = createAppContext();
+ const installedPlugins = /* @__PURE__ */ new WeakSet();
+ const app = context.app = {
+ _uid: uid$1++,
+ _component: rootComponent,
+ _props: rootProps,
+ _container: null,
+ _context: context,
+ _instance: null,
+ version,
+ get config() {
+ return context.config;
+ },
+ set config(v) {
+ {
+ warn$1(
+ `app.config cannot be replaced. Modify individual options instead.`
+ );
+ }
+ },
+ use(plugin2, ...options) {
+ if (installedPlugins.has(plugin2)) {
+ warn$1(`Plugin has already been applied to target app.`);
+ } else if (plugin2 && isFunction(plugin2.install)) {
+ installedPlugins.add(plugin2);
+ plugin2.install(app, ...options);
+ } else if (isFunction(plugin2)) {
+ installedPlugins.add(plugin2);
+ plugin2(app, ...options);
+ } else {
+ warn$1(
+ `A plugin must either be a function or an object with an "install" function.`
+ );
+ }
+ return app;
+ },
+ mixin(mixin) {
+ {
+ if (!context.mixins.includes(mixin)) {
+ context.mixins.push(mixin);
+ } else {
+ warn$1(
+ "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "")
+ );
+ }
+ }
+ return app;
+ },
+ component(name, component) {
+ {
+ validateComponentName(name, context.config);
+ }
+ if (!component) {
+ return context.components[name];
+ }
+ if (context.components[name]) {
+ warn$1(`Component "${name}" has already been registered in target app.`);
+ }
+ context.components[name] = component;
+ return app;
+ },
+ directive(name, directive) {
+ {
+ validateDirectiveName(name);
+ }
+ if (!directive) {
+ return context.directives[name];
+ }
+ if (context.directives[name]) {
+ warn$1(`Directive "${name}" has already been registered in target app.`);
+ }
+ context.directives[name] = directive;
+ return app;
+ },
+ // fixed by xxxxxx
+ mount() {
+ },
+ // fixed by xxxxxx
+ unmount() {
+ },
+ provide(key, value) {
+ if (key in context.provides) {
+ warn$1(
+ `App already provides property with key "${String(key)}". It will be overwritten with the new value.`
+ );
+ }
+ context.provides[key] = value;
+ return app;
+ },
+ runWithContext(fn) {
+ const lastApp = currentApp;
+ currentApp = app;
+ try {
+ return fn();
+ } finally {
+ currentApp = lastApp;
+ }
+ }
+ };
+ return app;
+ };
+}
+let currentApp = null;
+function provide(key, value) {
+ if (!currentInstance) {
+ {
+ warn$1(`provide() can only be used inside setup().`);
+ }
+ } else {
+ let provides = currentInstance.provides;
+ const parentProvides = currentInstance.parent && currentInstance.parent.provides;
+ if (parentProvides === provides) {
+ provides = currentInstance.provides = Object.create(parentProvides);
+ }
+ provides[key] = value;
+ if (currentInstance.type.mpType === "app") {
+ currentInstance.appContext.app.provide(key, value);
+ }
+ }
+}
+function inject(key, defaultValue, treatDefaultAsFactory = false) {
+ const instance = currentInstance || currentRenderingInstance;
+ if (instance || currentApp) {
+ const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;
+ if (provides && key in provides) {
+ return provides[key];
+ } else if (arguments.length > 1) {
+ return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
+ } else {
+ warn$1(`injection "${String(key)}" not found.`);
+ }
+ } else {
+ warn$1(`inject() can only be used inside setup() or functional components.`);
+ }
+}
+/*! #__NO_SIDE_EFFECTS__ */
+// @__NO_SIDE_EFFECTS__
+function defineComponent(options, extraOptions) {
+ return isFunction(options) ? (
+ // #8326: extend call and options.name access are considered side-effects
+ // by Rollup, so we have to wrap it in a pure-annotated IIFE.
+ /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()
+ ) : options;
+}
+const isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
+function onActivated(hook, target) {
+ registerKeepAliveHook(hook, "a", target);
+}
+function onDeactivated(hook, target) {
+ registerKeepAliveHook(hook, "da", target);
+}
+function registerKeepAliveHook(hook, type, target = currentInstance) {
+ const wrappedHook = hook.__wdc || (hook.__wdc = () => {
+ let current = target;
+ while (current) {
+ if (current.isDeactivated) {
+ return;
+ }
+ current = current.parent;
+ }
+ return hook();
+ });
+ injectHook(type, wrappedHook, target);
+ if (target) {
+ let current = target.parent;
+ while (current && current.parent) {
+ if (isKeepAlive(current.parent.vnode)) {
+ injectToKeepAliveRoot(wrappedHook, type, target, current);
+ }
+ current = current.parent;
+ }
+ }
+}
+function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
+ const injected = injectHook(
+ type,
+ hook,
+ keepAliveRoot,
+ true
+ /* prepend */
+ );
+ onUnmounted(() => {
+ remove(keepAliveRoot[type], injected);
+ }, target);
+}
+function injectHook(type, hook, target = currentInstance, prepend = false) {
+ if (target) {
+ if (isRootHook(type)) {
+ target = target.root;
+ }
+ const hooks = target[type] || (target[type] = []);
+ const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
+ if (target.isUnmounted) {
+ return;
+ }
+ pauseTracking();
+ const reset = setCurrentInstance(target);
+ const res = callWithAsyncErrorHandling(hook, target, type, args);
+ reset();
+ resetTracking();
+ return res;
+ });
+ if (prepend) {
+ hooks.unshift(wrappedHook);
+ } else {
+ hooks.push(wrappedHook);
+ }
+ return wrappedHook;
+ } else {
+ const apiName = toHandlerKey(
+ (ErrorTypeStrings[type] || type.replace(/^on/, "")).replace(/ hook$/, "")
+ );
+ warn$1(
+ `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().`
+ );
+ }
+}
+const createHook = (lifecycle) => (hook, target = currentInstance) => (
+ // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
+ (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target)
+);
+const onBeforeMount = createHook("bm");
+const onMounted = createHook("m");
+const onBeforeUpdate = createHook("bu");
+const onUpdated = createHook("u");
+const onBeforeUnmount = createHook("bum");
+const onUnmounted = createHook("um");
+const onServerPrefetch = createHook("sp");
+const onRenderTriggered = createHook(
+ "rtg"
+);
+const onRenderTracked = createHook(
+ "rtc"
+);
+function onErrorCaptured(hook, target = currentInstance) {
+ injectHook("ec", hook, target);
+}
+const getPublicInstance = (i) => {
+ if (!i)
+ return null;
+ if (isStatefulComponent(i))
+ return getExposeProxy(i) || i.proxy;
+ return getPublicInstance(i.parent);
+};
+function getComponentInternalInstance(i) {
+ return i;
+}
+const publicPropertiesMap = (
+ // Move PURE marker to new line to workaround compiler discarding it
+ // due to type annotation
+ /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {
+ // fixed by xxxxxx
+ $: getComponentInternalInstance,
+ // fixed by xxxxxx vue-i18n 在 dev 模式,访问了 $el,故模拟一个假的
+ // $el: i => i.vnode.el,
+ $el: (i) => i.__$el || (i.__$el = {}),
+ $data: (i) => i.data,
+ $props: (i) => shallowReadonly(i.props),
+ $attrs: (i) => shallowReadonly(i.attrs),
+ $slots: (i) => shallowReadonly(i.slots),
+ $refs: (i) => shallowReadonly(i.refs),
+ $parent: (i) => getPublicInstance(i.parent),
+ $root: (i) => getPublicInstance(i.root),
+ $emit: (i) => i.emit,
+ $options: (i) => resolveMergedOptions(i),
+ $forceUpdate: (i) => i.f || (i.f = () => {
+ i.effect.dirty = true;
+ queueJob(i.update);
+ }),
+ // $nextTick: i => i.n || (i.n = nextTick.bind(i.proxy!)),// fixed by xxxxxx
+ $watch: (i) => instanceWatch.bind(i)
+ })
+);
+const isReservedPrefix = (key) => key === "_" || key === "$";
+const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
+const PublicInstanceProxyHandlers = {
+ get({ _: instance }, key) {
+ const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
+ if (key === "__isVue") {
+ return true;
+ }
+ let normalizedProps;
+ if (key[0] !== "$") {
+ const n2 = accessCache[key];
+ if (n2 !== void 0) {
+ switch (n2) {
+ case 1:
+ return setupState[key];
+ case 2:
+ return data[key];
+ case 4:
+ return ctx[key];
+ case 3:
+ return props[key];
+ }
+ } else if (hasSetupBinding(setupState, key)) {
+ accessCache[key] = 1;
+ return setupState[key];
+ } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
+ accessCache[key] = 2;
+ return data[key];
+ } else if (
+ // only cache other properties when instance has declared (thus stable)
+ // props
+ (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)
+ ) {
+ accessCache[key] = 3;
+ return props[key];
+ } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+ accessCache[key] = 4;
+ return ctx[key];
+ } else if (shouldCacheAccess) {
+ accessCache[key] = 0;
+ }
+ }
+ const publicGetter = publicPropertiesMap[key];
+ let cssModule, globalProperties;
+ if (publicGetter) {
+ if (key === "$attrs") {
+ track(instance, "get", key);
+ } else if (key === "$slots") {
+ track(instance, "get", key);
+ }
+ return publicGetter(instance);
+ } else if (
+ // css module (injected by vue-loader)
+ (cssModule = type.__cssModules) && (cssModule = cssModule[key])
+ ) {
+ return cssModule;
+ } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
+ accessCache[key] = 4;
+ return ctx[key];
+ } else if (
+ // global properties
+ globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)
+ ) {
+ {
+ return globalProperties[key];
+ }
+ } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading
+ // to infinite warning loop
+ key.indexOf("__v") !== 0)) {
+ if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {
+ warn$1(
+ `Property ${JSON.stringify(
+ key
+ )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`
+ );
+ } else if (instance === currentRenderingInstance) {
+ warn$1(
+ `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`
+ );
+ }
+ }
+ },
+ set({ _: instance }, key, value) {
+ const { data, setupState, ctx } = instance;
+ if (hasSetupBinding(setupState, key)) {
+ setupState[key] = value;
+ return true;
+ } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) {
+ warn$1(`Cannot mutate
+
+
+```
+
+### 2. API请求拦截器
+
+```javascript
+// utils/request.js
+const BASE_URL = 'http://localhost:3000/api';
+
+// 请求拦截器
+uni.addInterceptor('request', {
+ invoke(args) {
+ // 添加基础URL
+ if (!args.url.startsWith('http')) {
+ args.url = BASE_URL + args.url;
+ }
+
+ // 添加认证头
+ const token = uni.getStorageSync('access_token');
+ if (token) {
+ args.header = {
+ ...args.header,
+ 'Authorization': `Bearer ${token}`
+ };
+ }
+
+ return args;
+ },
+
+ success(result) {
+ // 处理认证失败
+ if (result.statusCode === 401) {
+ // Token过期,尝试刷新或跳转登录
+ uni.removeStorageSync('access_token');
+ uni.removeStorageSync('userInfo');
+ uni.reLaunch({
+ url: '/pages/login/login'
+ });
+ }
+
+ return result;
+ }
+});
+
+export default {
+ // 封装请求方法
+ request(options) {
+ return uni.request({
+ ...options,
+ header: {
+ 'Content-Type': 'application/json',
+ ...options.header
+ }
+ });
+ }
+}
+```
+
+### 3. 用户信息获取
+
+```javascript
+// pages/profile/profile.vue
+export default {
+ data() {
+ return {
+ userInfo: {}
+ };
+ },
+
+ onLoad() {
+ this.getUserProfile();
+ },
+
+ methods: {
+ async getUserProfile() {
+ try {
+ const response = await uni.request({
+ url: '/users/profile',
+ method: 'GET'
+ });
+
+ if (response[1].statusCode === 200) {
+ this.userInfo = response[1].data;
+ }
+ } catch (error) {
+ console.error('获取用户信息失败:', error);
+ }
+ }
+ }
+}
+```
+
+## 配置说明
+
+### 1. 后端环境配置
+
+在 `.env` 文件中配置微信小程序信息:
+
+```env
+# 微信小程序配置
+WECHAT_APPID=你的小程序AppID
+WECHAT_SECRET=你的小程序AppSecret
+```
+
+### 2. 微信小程序配置
+
+在 `manifest.json` 中配置微信小程序:
+
+```json
+{
+ "mp-weixin": {
+ "appid": "你的小程序AppID",
+ "setting": {
+ "urlCheck": false
+ },
+ "requiredPrivateInfos": ["getUserProfile"]
+ }
+}
+```
+
+### 3. 请求域名配置
+
+在微信小程序后台配置服务器域名:
+- 开发环境: `http://localhost:3000`
+- 生产环境: `https://yourdomain.com`
+
+## 注意事项
+
+1. **获取微信AppID和AppSecret**:
+ - 登录微信小程序后台
+ - 在"开发" -> "开发管理" -> "开发设置"中获取
+
+2. **用户信息授权**:
+ - `getUserProfile` 需要用户主动触发
+ - 建议在用户首次登录时请求
+
+3. **Token管理**:
+ - 访问令牌有效期7天
+ - 刷新令牌有效期30天
+ - 建议在请求拦截器中处理token刷新
+
+4. **安全考虑**:
+ - AppSecret不要泄露到前端
+ - 生产环境使用HTTPS
+ - 定期更换JWT密钥
\ No newline at end of file
diff --git a/后端/eslint.config.mjs b/后端/eslint.config.mjs
new file mode 100644
index 0000000..4e9f827
--- /dev/null
+++ b/后端/eslint.config.mjs
@@ -0,0 +1,35 @@
+// @ts-check
+import eslint from '@eslint/js';
+import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
+import globals from 'globals';
+import tseslint from 'typescript-eslint';
+
+export default tseslint.config(
+ {
+ ignores: ['eslint.config.mjs'],
+ },
+ eslint.configs.recommended,
+ ...tseslint.configs.recommendedTypeChecked,
+ eslintPluginPrettierRecommended,
+ {
+ languageOptions: {
+ globals: {
+ ...globals.node,
+ ...globals.jest,
+ },
+ sourceType: 'commonjs',
+ parserOptions: {
+ projectService: true,
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+ },
+ {
+ rules: {
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-floating-promises': 'warn',
+ '@typescript-eslint/no-unsafe-argument': 'warn',
+ "prettier/prettier": ["error", { endOfLine: "auto" }],
+ },
+ },
+);
diff --git a/后端/nest-cli.json b/后端/nest-cli.json
new file mode 100644
index 0000000..f9aa683
--- /dev/null
+++ b/后端/nest-cli.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/nest-cli",
+ "collection": "@nestjs/schematics",
+ "sourceRoot": "src",
+ "compilerOptions": {
+ "deleteOutDir": true
+ }
+}
diff --git a/后端/package-lock.json b/后端/package-lock.json
new file mode 100644
index 0000000..25ecfa5
--- /dev/null
+++ b/后端/package-lock.json
@@ -0,0 +1,10570 @@
+{
+ "name": "youyijia-sofa-backend",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "youyijia-sofa-backend",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@nestjs/common": "^11.0.1",
+ "@nestjs/config": "^4.0.0",
+ "@nestjs/core": "^11.0.1",
+ "@nestjs/jwt": "^11.0.0",
+ "@nestjs/passport": "^11.0.0",
+ "@nestjs/platform-express": "^11.0.1",
+ "@nestjs/swagger": "^8.0.0",
+ "@nestjs/typeorm": "^11.0.0",
+ "axios": "^1.13.3",
+ "bcrypt": "^5.1.1",
+ "class-transformer": "^0.5.1",
+ "class-validator": "^0.14.0",
+ "dayjs": "^1.11.9",
+ "multer": "^1.4.5-lts.1",
+ "mysql2": "^3.6.0",
+ "passport": "^0.6.0",
+ "passport-jwt": "^4.0.1",
+ "passport-local": "^1.0.0",
+ "reflect-metadata": "^0.2.2",
+ "rxjs": "^7.8.1",
+ "typeorm": "^0.3.17",
+ "uuid": "^9.0.0"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3.2.0",
+ "@eslint/js": "^9.18.0",
+ "@nestjs/cli": "^11.0.0",
+ "@nestjs/schematics": "^11.0.0",
+ "@nestjs/testing": "^11.0.1",
+ "@types/bcrypt": "^5.0.0",
+ "@types/express": "^5.0.0",
+ "@types/jest": "^30.0.0",
+ "@types/multer": "^1.4.7",
+ "@types/node": "^22.10.7",
+ "@types/passport-jwt": "^3.0.9",
+ "@types/passport-local": "^1.0.35",
+ "@types/supertest": "^6.0.2",
+ "@types/uuid": "^9.0.2",
+ "eslint": "^9.18.0",
+ "eslint-config-prettier": "^10.0.1",
+ "eslint-plugin-prettier": "^5.2.2",
+ "globals": "^16.0.0",
+ "jest": "^30.0.0",
+ "prettier": "^3.4.2",
+ "source-map-support": "^0.5.21",
+ "supertest": "^7.0.0",
+ "ts-jest": "^29.2.5",
+ "ts-loader": "^9.5.2",
+ "ts-node": "^10.9.2",
+ "tsconfig-paths": "^4.2.0",
+ "typescript": "^5.7.3",
+ "typescript-eslint": "^8.20.0"
+ }
+ },
+ "node_modules/@angular-devkit/core": {
+ "version": "19.2.19",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.19.tgz",
+ "integrity": "sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "8.17.1",
+ "ajv-formats": "3.0.1",
+ "jsonc-parser": "3.3.1",
+ "picomatch": "4.0.2",
+ "rxjs": "7.8.1",
+ "source-map": "0.7.4"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "peerDependencies": {
+ "chokidar": "^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular-devkit/core/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/@angular-devkit/core/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@angular-devkit/schematics": {
+ "version": "19.2.19",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.19.tgz",
+ "integrity": "sha512-J4Jarr0SohdrHcb40gTL4wGPCQ952IMWF1G/MSAQfBAPvA9ZKApYhpxcY7PmehVePve+ujpus1dGsJ7dPxz8Kg==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.19",
+ "jsonc-parser": "3.3.1",
+ "magic-string": "0.30.17",
+ "ora": "5.4.1",
+ "rxjs": "7.8.1"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+ },
+ "node_modules/@angular-devkit/schematics-cli": {
+ "version": "19.2.19",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.19.tgz",
+ "integrity": "sha512-7q9UY6HK6sccL9F3cqGRUwKhM7b/XfD2YcVaZ2WD7VMaRlRm85v6mRjSrfKIAwxcQU0UK27kMc79NIIqaHjzxA==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.19",
+ "@angular-devkit/schematics": "19.2.19",
+ "@inquirer/prompts": "7.3.2",
+ "ansi-colors": "4.1.3",
+ "symbol-observable": "4.0.0",
+ "yargs-parser": "21.1.1"
+ },
+ "bin": {
+ "schematics": "bin/schematics.js"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+ },
+ "node_modules/@angular-devkit/schematics-cli/node_modules/@inquirer/prompts": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz",
+ "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/checkbox": "^4.1.2",
+ "@inquirer/confirm": "^5.1.6",
+ "@inquirer/editor": "^4.2.7",
+ "@inquirer/expand": "^4.0.9",
+ "@inquirer/input": "^4.1.6",
+ "@inquirer/number": "^3.0.9",
+ "@inquirer/password": "^4.0.9",
+ "@inquirer/rawlist": "^4.0.9",
+ "@inquirer/search": "^3.0.9",
+ "@inquirer/select": "^4.0.9"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular-devkit/schematics/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
+ "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
+ "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz",
+ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/generator": "^7.28.6",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
+ "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
+ "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.28.6"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz",
+ "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz",
+ "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+ "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
+ "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/generator": "^7.28.6",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.6",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
+ "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "node_modules/@borewit/text-codec": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz",
+ "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
+ "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
+ "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
+ "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@inquirer/ansi": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz",
+ "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/checkbox": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz",
+ "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/ansi": "^1.0.2",
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/figures": "^1.0.15",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "5.1.21",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz",
+ "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "10.3.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz",
+ "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/ansi": "^1.0.2",
+ "@inquirer/figures": "^1.0.15",
+ "@inquirer/type": "^3.0.10",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^2.0.0",
+ "signal-exit": "^4.1.0",
+ "wrap-ansi": "^6.2.0",
+ "yoctocolors-cjs": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/editor": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz",
+ "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/external-editor": "^1.0.3",
+ "@inquirer/type": "^3.0.10"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/expand": {
+ "version": "4.0.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz",
+ "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+ "dev": true,
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz",
+ "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/input": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz",
+ "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz",
+ "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/password": {
+ "version": "4.0.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz",
+ "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/ansi": "^1.0.2",
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/prompts": {
+ "version": "7.10.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz",
+ "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/checkbox": "^4.3.2",
+ "@inquirer/confirm": "^5.1.21",
+ "@inquirer/editor": "^4.2.23",
+ "@inquirer/expand": "^4.0.23",
+ "@inquirer/input": "^4.3.1",
+ "@inquirer/number": "^3.0.23",
+ "@inquirer/password": "^4.0.23",
+ "@inquirer/rawlist": "^4.1.11",
+ "@inquirer/search": "^3.2.2",
+ "@inquirer/select": "^4.4.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/rawlist": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz",
+ "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/search": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz",
+ "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/figures": "^1.0.15",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/select": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz",
+ "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/ansi": "^1.0.2",
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/figures": "^1.0.15",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz",
+ "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
+ "dev": true,
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz",
+ "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "jest-message-util": "30.2.0",
+ "jest-util": "30.2.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz",
+ "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "30.2.0",
+ "@jest/pattern": "30.0.1",
+ "@jest/reporters": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "ansi-escapes": "^4.3.2",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "exit-x": "^0.2.2",
+ "graceful-fs": "^4.2.11",
+ "jest-changed-files": "30.2.0",
+ "jest-config": "30.2.0",
+ "jest-haste-map": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.2.0",
+ "jest-resolve-dependencies": "30.2.0",
+ "jest-runner": "30.2.0",
+ "jest-runtime": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "jest-watcher": "30.2.0",
+ "micromatch": "^4.0.8",
+ "pretty-format": "30.2.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/diff-sequences": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz",
+ "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz",
+ "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==",
+ "dev": true,
+ "dependencies": {
+ "@jest/fake-timers": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "jest-mock": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz",
+ "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==",
+ "dev": true,
+ "dependencies": {
+ "expect": "30.2.0",
+ "jest-snapshot": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz",
+ "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/get-type": "30.1.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz",
+ "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "30.2.0",
+ "@sinonjs/fake-timers": "^13.0.0",
+ "@types/node": "*",
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/get-type": {
+ "version": "30.1.0",
+ "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz",
+ "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz",
+ "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "30.2.0",
+ "@jest/expect": "30.2.0",
+ "@jest/types": "30.2.0",
+ "jest-mock": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/pattern": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz",
+ "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "jest-regex-util": "30.0.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz",
+ "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==",
+ "dev": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "collect-v8-coverage": "^1.0.2",
+ "exit-x": "^0.2.2",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.11",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^5.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-worker": "30.2.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.2",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "node_modules/@jest/reporters/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz",
+ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==",
+ "dev": true,
+ "dependencies": {
+ "@sinclair/typebox": "^0.34.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/snapshot-utils": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz",
+ "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "30.2.0",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "natural-compare": "^1.4.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz",
+ "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "callsites": "^3.1.0",
+ "graceful-fs": "^4.2.11"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz",
+ "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/istanbul-lib-coverage": "^2.0.6",
+ "collect-v8-coverage": "^1.0.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz",
+ "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "30.2.0",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.2.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz",
+ "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.27.4",
+ "@jest/types": "30.2.0",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "babel-plugin-istanbul": "^7.0.1",
+ "chalk": "^4.1.2",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.2.0",
+ "jest-regex-util": "30.0.1",
+ "jest-util": "30.2.0",
+ "micromatch": "^4.0.8",
+ "pirates": "^4.0.7",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^5.0.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz",
+ "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/pattern": "30.0.1",
+ "@jest/schemas": "30.0.5",
+ "@types/istanbul-lib-coverage": "^2.0.6",
+ "@types/istanbul-reports": "^3.0.4",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.33",
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@lukeed/csprng": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz",
+ "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@microsoft/tsdoc": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz",
+ "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw=="
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@nestjs/cli": {
+ "version": "11.0.16",
+ "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.16.tgz",
+ "integrity": "sha512-P0H+Vcjki6P5160E5QnMt3Q0X5FTg4PZkP99Ig4lm/4JWqfw32j3EXv3YBTJ2DmxLwOQ/IS9F7dzKpMAgzKTGg==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.19",
+ "@angular-devkit/schematics": "19.2.19",
+ "@angular-devkit/schematics-cli": "19.2.19",
+ "@inquirer/prompts": "7.10.1",
+ "@nestjs/schematics": "^11.0.1",
+ "ansis": "4.2.0",
+ "chokidar": "4.0.3",
+ "cli-table3": "0.6.5",
+ "commander": "4.1.1",
+ "fork-ts-checker-webpack-plugin": "9.1.0",
+ "glob": "13.0.0",
+ "node-emoji": "1.11.0",
+ "ora": "5.4.1",
+ "tsconfig-paths": "4.2.0",
+ "tsconfig-paths-webpack-plugin": "4.2.0",
+ "typescript": "5.9.3",
+ "webpack": "5.104.1",
+ "webpack-node-externals": "3.0.0"
+ },
+ "bin": {
+ "nest": "bin/nest.js"
+ },
+ "engines": {
+ "node": ">= 20.11"
+ },
+ "peerDependencies": {
+ "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0",
+ "@swc/core": "^1.3.62"
+ },
+ "peerDependenciesMeta": {
+ "@swc/cli": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/common": {
+ "version": "11.1.12",
+ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.12.tgz",
+ "integrity": "sha512-v6U3O01YohHO+IE3EIFXuRuu3VJILWzyMmSYZXpyBbnp0hk0mFyHxK2w3dF4I5WnbwiRbWlEXdeXFvPQ7qaZzw==",
+ "dependencies": {
+ "file-type": "21.3.0",
+ "iterare": "1.2.1",
+ "load-esm": "1.0.3",
+ "tslib": "2.8.1",
+ "uid": "2.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "class-transformer": ">=0.4.1",
+ "class-validator": ">=0.13.2",
+ "reflect-metadata": "^0.1.12 || ^0.2.0",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "class-transformer": {
+ "optional": true
+ },
+ "class-validator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz",
+ "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==",
+ "dependencies": {
+ "dotenv": "16.4.7",
+ "dotenv-expand": "12.0.1",
+ "lodash": "4.17.21"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
+ "rxjs": "^7.1.0"
+ }
+ },
+ "node_modules/@nestjs/config/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@nestjs/core": {
+ "version": "11.1.12",
+ "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.12.tgz",
+ "integrity": "sha512-97DzTYMf5RtGAVvX1cjwpKRiCUpkeQ9CCzSAenqkAhOmNVVFaApbhuw+xrDt13rsCa2hHVOYPrV4dBgOYMJjsA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@nuxt/opencollective": "0.4.1",
+ "fast-safe-stringify": "2.1.1",
+ "iterare": "1.2.1",
+ "path-to-regexp": "8.3.0",
+ "tslib": "2.8.1",
+ "uid": "2.0.2"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^11.0.0",
+ "@nestjs/microservices": "^11.0.0",
+ "@nestjs/platform-express": "^11.0.0",
+ "@nestjs/websockets": "^11.0.0",
+ "reflect-metadata": "^0.1.12 || ^0.2.0",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@nestjs/microservices": {
+ "optional": true
+ },
+ "@nestjs/platform-express": {
+ "optional": true
+ },
+ "@nestjs/websockets": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/jwt": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.2.tgz",
+ "integrity": "sha512-rK8aE/3/Ma45gAWfCksAXUNbOoSOUudU0Kn3rT39htPF7wsYXtKfjALKeKKJbFrIWbLjsbqfXX5bIJNvgBugGA==",
+ "dependencies": {
+ "@types/jsonwebtoken": "9.0.10",
+ "jsonwebtoken": "9.0.3"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0"
+ }
+ },
+ "node_modules/@nestjs/mapped-types": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.6.tgz",
+ "integrity": "sha512-84ze+CPfp1OWdpRi1/lOu59hOhTz38eVzJvRKrg9ykRFwDz+XleKfMsG0gUqNZYFa6v53XYzeD+xItt8uDW7NQ==",
+ "peerDependencies": {
+ "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0",
+ "class-transformer": "^0.4.0 || ^0.5.0",
+ "class-validator": "^0.13.0 || ^0.14.0",
+ "reflect-metadata": "^0.1.12 || ^0.2.0"
+ },
+ "peerDependenciesMeta": {
+ "class-transformer": {
+ "optional": true
+ },
+ "class-validator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/passport": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz",
+ "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==",
+ "peerDependencies": {
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
+ "passport": "^0.5.0 || ^0.6.0 || ^0.7.0"
+ }
+ },
+ "node_modules/@nestjs/platform-express": {
+ "version": "11.1.12",
+ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.12.tgz",
+ "integrity": "sha512-GYK/vHI0SGz5m8mxr7v3Urx8b9t78Cf/dj5aJMZlGd9/1D9OI1hAl00BaphjEXINUJ/BQLxIlF2zUjrYsd6enQ==",
+ "dependencies": {
+ "cors": "2.8.5",
+ "express": "5.2.1",
+ "multer": "2.0.2",
+ "path-to-regexp": "8.3.0",
+ "tslib": "2.8.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^11.0.0",
+ "@nestjs/core": "^11.0.0"
+ }
+ },
+ "node_modules/@nestjs/platform-express/node_modules/concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "engines": [
+ "node >= 6.0"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/@nestjs/platform-express/node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@nestjs/platform-express/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@nestjs/platform-express/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@nestjs/platform-express/node_modules/multer": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
+ "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
+ "dependencies": {
+ "append-field": "^1.0.0",
+ "busboy": "^1.6.0",
+ "concat-stream": "^2.0.0",
+ "mkdirp": "^0.5.6",
+ "object-assign": "^4.1.1",
+ "type-is": "^1.6.18",
+ "xtend": "^4.0.2"
+ },
+ "engines": {
+ "node": ">= 10.16.0"
+ }
+ },
+ "node_modules/@nestjs/platform-express/node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@nestjs/schematics": {
+ "version": "11.0.9",
+ "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.9.tgz",
+ "integrity": "sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.17",
+ "@angular-devkit/schematics": "19.2.17",
+ "comment-json": "4.4.1",
+ "jsonc-parser": "3.3.1",
+ "pluralize": "8.0.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.2"
+ }
+ },
+ "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": {
+ "version": "19.2.17",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.17.tgz",
+ "integrity": "sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "8.17.1",
+ "ajv-formats": "3.0.1",
+ "jsonc-parser": "3.3.1",
+ "picomatch": "4.0.2",
+ "rxjs": "7.8.1",
+ "source-map": "0.7.4"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "peerDependencies": {
+ "chokidar": "^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": {
+ "version": "19.2.17",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.17.tgz",
+ "integrity": "sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.17",
+ "jsonc-parser": "3.3.1",
+ "magic-string": "0.30.17",
+ "ora": "5.4.1",
+ "rxjs": "7.8.1"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+ },
+ "node_modules/@nestjs/schematics/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@nestjs/schematics/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/@nestjs/schematics/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@nestjs/swagger": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-8.1.1.tgz",
+ "integrity": "sha512-5Mda7H1DKnhKtlsb0C7PYshcvILv8UFyUotHzxmWh0G65Z21R3LZH/J8wmpnlzL4bmXIfr42YwbEwRxgzpJ5sQ==",
+ "dependencies": {
+ "@microsoft/tsdoc": "^0.15.0",
+ "@nestjs/mapped-types": "2.0.6",
+ "js-yaml": "4.1.0",
+ "lodash": "4.17.21",
+ "path-to-regexp": "3.3.0",
+ "swagger-ui-dist": "5.18.2"
+ },
+ "peerDependencies": {
+ "@fastify/static": "^6.0.0 || ^7.0.0",
+ "@nestjs/common": "^9.0.0 || ^10.0.0",
+ "@nestjs/core": "^9.0.0 || ^10.0.0",
+ "class-transformer": "*",
+ "class-validator": "*",
+ "reflect-metadata": "^0.1.12 || ^0.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@fastify/static": {
+ "optional": true
+ },
+ "class-transformer": {
+ "optional": true
+ },
+ "class-validator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/swagger/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@nestjs/swagger/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@nestjs/swagger/node_modules/path-to-regexp": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
+ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw=="
+ },
+ "node_modules/@nestjs/testing": {
+ "version": "11.1.12",
+ "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.12.tgz",
+ "integrity": "sha512-W0M/i5nb9qRQpTQfJm+1mGT/+y4YezwwdcD7mxFG8JEZ5fz/ZEAk1Ayri2VBJKJUdo20B1ggnvqew4dlTMrSNg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "2.8.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^11.0.0",
+ "@nestjs/core": "^11.0.0",
+ "@nestjs/microservices": "^11.0.0",
+ "@nestjs/platform-express": "^11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@nestjs/microservices": {
+ "optional": true
+ },
+ "@nestjs/platform-express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/typeorm": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz",
+ "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==",
+ "peerDependencies": {
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
+ "@nestjs/core": "^10.0.0 || ^11.0.0",
+ "reflect-metadata": "^0.1.13 || ^0.2.0",
+ "rxjs": "^7.2.0",
+ "typeorm": "^0.3.0"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "dev": true,
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@nuxt/opencollective": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz",
+ "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==",
+ "dependencies": {
+ "consola": "^3.2.3"
+ },
+ "bin": {
+ "opencollective": "bin/opencollective.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0",
+ "npm": ">=5.10.0"
+ }
+ },
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz",
+ "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
+ "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/pkgr"
+ }
+ },
+ "node_modules/@scarf/scarf": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz",
+ "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==",
+ "hasInstallScript": true
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.34.48",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz",
+ "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==",
+ "dev": true
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "13.0.5",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz",
+ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.1"
+ }
+ },
+ "node_modules/@sqltools/formatter": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz",
+ "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw=="
+ },
+ "node_modules/@tokenizer/inflate": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
+ "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "token-types": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@tokenizer/token": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
+ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
+ "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/bcrypt": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz",
+ "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.6",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
+ "dev": true,
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/cookiejar": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz",
+ "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==",
+ "dev": true
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true
+ },
+ "node_modules/@types/express": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz",
+ "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==",
+ "dev": true,
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^5.0.0",
+ "@types/serve-static": "^2"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz",
+ "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "30.0.0",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz",
+ "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==",
+ "dev": true,
+ "dependencies": {
+ "expect": "^30.0.0",
+ "pretty-format": "^30.0.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/jsonwebtoken": {
+ "version": "9.0.10",
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz",
+ "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==",
+ "dependencies": {
+ "@types/ms": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/methods": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz",
+ "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==",
+ "dev": true
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="
+ },
+ "node_modules/@types/multer": {
+ "version": "1.4.13",
+ "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.13.tgz",
+ "integrity": "sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "22.19.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.7.tgz",
+ "integrity": "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/passport": {
+ "version": "1.0.17",
+ "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz",
+ "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/passport-jwt": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.13.tgz",
+ "integrity": "sha512-fjHaC6Bv8EpMMqzTnHP32SXlZGaNfBPC/Po5dmRGYi2Ky7ljXPbGnOy+SxZqa6iZvFgVhoJ1915Re3m93zmcfA==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*",
+ "@types/jsonwebtoken": "*",
+ "@types/passport-strategy": "*"
+ }
+ },
+ "node_modules/@types/passport-local": {
+ "version": "1.0.38",
+ "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz",
+ "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*",
+ "@types/passport": "*",
+ "@types/passport-strategy": "*"
+ }
+ },
+ "node_modules/@types/passport-strategy": {
+ "version": "0.2.38",
+ "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz",
+ "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*",
+ "@types/passport": "*"
+ }
+ },
+ "node_modules/@types/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+ "dev": true
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "dev": true
+ },
+ "node_modules/@types/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz",
+ "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true
+ },
+ "node_modules/@types/superagent": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz",
+ "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/cookiejar": "^2.1.5",
+ "@types/methods": "^1.1.4",
+ "@types/node": "*",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/@types/supertest": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz",
+ "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==",
+ "dev": true,
+ "dependencies": {
+ "@types/methods": "^1.1.4",
+ "@types/superagent": "^8.1.0"
+ }
+ },
+ "node_modules/@types/uuid": {
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
+ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
+ "dev": true
+ },
+ "node_modules/@types/validator": {
+ "version": "13.15.10",
+ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz",
+ "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA=="
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz",
+ "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/type-utils": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.54.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz",
+ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz",
+ "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.54.0",
+ "@typescript-eslint/types": "^8.54.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz",
+ "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz",
+ "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz",
+ "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz",
+ "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz",
+ "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.54.0",
+ "@typescript-eslint/tsconfig-utils": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/visitor-keys": "8.54.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz",
+ "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.54.0",
+ "@typescript-eslint/types": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz",
+ "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.54.0",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "dev": true
+ },
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+ "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+ "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
+ "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+ "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+ "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+ "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+ "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+ "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+ "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+ "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+ "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+ "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+ "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+ "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+ "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+ "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+ "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+ "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+ "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-phases": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
+ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "acorn": "^8.14.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ansis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
+ "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/app-root-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz",
+ "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/append-field": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
+ },
+ "node_modules/aproba": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz",
+ "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew=="
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "deprecated": "This package is no longer supported.",
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/array-timsort": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz",
+ "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==",
+ "dev": true
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/aws-ssl-profiles": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
+ "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.3.tgz",
+ "integrity": "sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz",
+ "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/transform": "30.2.0",
+ "@types/babel__core": "^7.20.5",
+ "babel-plugin-istanbul": "^7.0.1",
+ "babel-preset-jest": "30.2.0",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz",
+ "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==",
+ "dev": true,
+ "workspaces": [
+ "test/babel-8"
+ ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-instrument": "^6.0.2",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz",
+ "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==",
+ "dev": true,
+ "dependencies": {
+ "@types/babel__core": "^7.20.5"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
+ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz",
+ "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-jest-hoist": "30.2.0",
+ "babel-preset-current-node-syntax": "^1.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0 || ^8.0.0-beta.1"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.9.18",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz",
+ "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==",
+ "dev": true,
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/bcrypt": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
+ "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^1.0.11",
+ "node-addon-api": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.7.0",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.1",
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bs-logger": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+ "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+ "dev": true,
+ "dependencies": {
+ "fast-json-stable-stringify": "2.x"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001766",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz",
+ "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
+ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
+ "dev": true
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz",
+ "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==",
+ "dev": true
+ },
+ "node_modules/class-transformer": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz",
+ "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw=="
+ },
+ "node_modules/class-validator": {
+ "version": "0.14.3",
+ "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz",
+ "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==",
+ "dependencies": {
+ "@types/validator": "^13.15.3",
+ "libphonenumber-js": "^1.11.1",
+ "validator": "^13.15.20"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
+ "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
+ "dev": true
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/comment-json": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz",
+ "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==",
+ "dev": true,
+ "dependencies": {
+ "array-timsort": "^1.0.3",
+ "core-util-is": "^1.0.3",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
+ "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-stream/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "node_modules/concat-stream/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/concat-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/concat-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
+ },
+ "node_modules/content-disposition": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cookiejar": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
+ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
+ "dev": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.19",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
+ "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz",
+ "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
+ },
+ "node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dezalgo": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
+ "dev": true,
+ "dependencies": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/diff": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz",
+ "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==",
+ "dependencies": {
+ "dotenv": "^16.4.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.279",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz",
+ "integrity": "sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==",
+ "dev": true
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.4",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz",
+ "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
+ "dev": true
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz",
+ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.2",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-config-prettier"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.5.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz",
+ "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.1",
+ "synckit": "^0.11.12"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/exit-x": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz",
+ "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz",
+ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/expect-utils": "30.2.0",
+ "@jest/get-type": "30.1.0",
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ]
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "21.3.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.0.tgz",
+ "integrity": "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==",
+ "dependencies": {
+ "@tokenizer/inflate": "^0.4.1",
+ "strtok3": "^10.3.4",
+ "token-types": "^6.1.1",
+ "uint8array-extras": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz",
+ "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "chalk": "^4.1.2",
+ "chokidar": "^4.0.1",
+ "cosmiconfig": "^8.2.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^10.0.0",
+ "memfs": "^3.4.1",
+ "minimatch": "^3.0.4",
+ "node-abort-controller": "^3.0.1",
+ "schema-utils": "^3.1.1",
+ "semver": "^7.3.5",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "typescript": ">3.6.0",
+ "webpack": "^5.11.0"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz",
+ "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==",
+ "dev": true,
+ "dependencies": {
+ "@paralleldrive/cuid2": "^2.2.2",
+ "dezalgo": "^1.0.4",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz",
+ "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gauge": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "deprecated": "This package is no longer supported.",
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gauge/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
+ "node_modules/generate-function": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+ "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+ "dependencies": {
+ "is-property": "^1.0.2"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
+ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^10.1.1",
+ "minipass": "^7.1.2",
+ "path-scurry": "^2.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/brace-expansion": "^5.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/handlebars/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="
+ },
+ "node_modules/is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
+ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.23",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/iterare": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz",
+ "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jest": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
+ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
+ "dev": true,
+ "dependencies": {
+ "@jest/core": "30.2.0",
+ "@jest/types": "30.2.0",
+ "import-local": "^3.2.0",
+ "jest-cli": "30.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz",
+ "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.1.1",
+ "jest-util": "30.2.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz",
+ "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "30.2.0",
+ "@jest/expect": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "co": "^4.6.0",
+ "dedent": "^1.6.0",
+ "is-generator-fn": "^2.1.0",
+ "jest-each": "30.2.0",
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-runtime": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "30.2.0",
+ "pure-rand": "^7.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.6"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz",
+ "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/core": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
+ "chalk": "^4.1.2",
+ "exit-x": "^0.2.2",
+ "import-local": "^3.2.0",
+ "jest-config": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz",
+ "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.27.4",
+ "@jest/get-type": "30.1.0",
+ "@jest/pattern": "30.0.1",
+ "@jest/test-sequencer": "30.2.0",
+ "@jest/types": "30.2.0",
+ "babel-jest": "30.2.0",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "deepmerge": "^4.3.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.11",
+ "jest-circus": "30.2.0",
+ "jest-docblock": "30.2.0",
+ "jest-environment-node": "30.2.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.2.0",
+ "jest-runner": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "micromatch": "^4.0.8",
+ "parse-json": "^5.2.0",
+ "pretty-format": "30.2.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "esbuild-register": ">=3.4.0",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "esbuild-register": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-config/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "node_modules/jest-config/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-config/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz",
+ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==",
+ "dev": true,
+ "dependencies": {
+ "@jest/diff-sequences": "30.0.1",
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "pretty-format": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz",
+ "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==",
+ "dev": true,
+ "dependencies": {
+ "detect-newline": "^3.1.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz",
+ "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "@jest/types": "30.2.0",
+ "chalk": "^4.1.2",
+ "jest-util": "30.2.0",
+ "pretty-format": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz",
+ "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "30.2.0",
+ "@jest/fake-timers": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz",
+ "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "anymatch": "^3.1.3",
+ "fb-watchman": "^2.0.2",
+ "graceful-fs": "^4.2.11",
+ "jest-regex-util": "30.0.1",
+ "jest-util": "30.2.0",
+ "jest-worker": "30.2.0",
+ "micromatch": "^4.0.8",
+ "walker": "^1.0.8"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.3"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz",
+ "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "pretty-format": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz",
+ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "jest-diff": "30.2.0",
+ "pretty-format": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz",
+ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@jest/types": "30.2.0",
+ "@types/stack-utils": "^2.0.3",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "micromatch": "^4.0.8",
+ "pretty-format": "30.2.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.6"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz",
+ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "jest-util": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz",
+ "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz",
+ "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.2.0",
+ "jest-pnp-resolver": "^1.2.3",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "slash": "^3.0.0",
+ "unrs-resolver": "^1.7.11"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz",
+ "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==",
+ "dev": true,
+ "dependencies": {
+ "jest-regex-util": "30.0.1",
+ "jest-snapshot": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz",
+ "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "30.2.0",
+ "@jest/environment": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "emittery": "^0.13.1",
+ "exit-x": "^0.2.2",
+ "graceful-fs": "^4.2.11",
+ "jest-docblock": "30.2.0",
+ "jest-environment-node": "30.2.0",
+ "jest-haste-map": "30.2.0",
+ "jest-leak-detector": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-resolve": "30.2.0",
+ "jest-runtime": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-watcher": "30.2.0",
+ "jest-worker": "30.2.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz",
+ "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "30.2.0",
+ "@jest/fake-timers": "30.2.0",
+ "@jest/globals": "30.2.0",
+ "@jest/source-map": "30.0.1",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "cjs-module-lexer": "^2.1.0",
+ "collect-v8-coverage": "^1.0.2",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "node_modules/jest-runtime/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz",
+ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.27.4",
+ "@babel/generator": "^7.27.5",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.27.1",
+ "@babel/types": "^7.27.3",
+ "@jest/expect-utils": "30.2.0",
+ "@jest/get-type": "30.1.0",
+ "@jest/snapshot-utils": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
+ "babel-preset-current-node-syntax": "^1.2.0",
+ "chalk": "^4.1.2",
+ "expect": "30.2.0",
+ "graceful-fs": "^4.2.11",
+ "jest-diff": "30.2.0",
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-util": "30.2.0",
+ "pretty-format": "30.2.0",
+ "semver": "^7.7.2",
+ "synckit": "^0.11.8"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz",
+ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "graceful-fs": "^4.2.11",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz",
+ "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "@jest/types": "30.2.0",
+ "camelcase": "^6.3.0",
+ "chalk": "^4.1.2",
+ "leven": "^3.1.0",
+ "pretty-format": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz",
+ "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "ansi-escapes": "^4.3.2",
+ "chalk": "^4.1.2",
+ "emittery": "^0.13.1",
+ "jest-util": "30.2.0",
+ "string-length": "^4.0.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz",
+ "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@ungap/structured-clone": "^1.3.0",
+ "jest-util": "30.2.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.1.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
+ "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
+ "dependencies": {
+ "jws": "^4.0.1",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+ "dependencies": {
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
+ "dependencies": {
+ "jwa": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/libphonenumber-js": {
+ "version": "1.12.35",
+ "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.35.tgz",
+ "integrity": "sha512-T/Cz6iLcsZdb5jDncDcUNhSAJ0VlSC9TnsqtBNdpkaAmy24/R1RhErtNWVWBrcUZKs9hSgaVsBkc7HxYnazIfw=="
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/load-esm": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz",
+ "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://buymeacoffee.com/borewit"
+ }
+ ],
+ "engines": {
+ "node": ">=13.2.0"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
+ "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.11.5"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "dev": true
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/long": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lru.min": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.3.tgz",
+ "integrity": "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==",
+ "engines": {
+ "bun": ">=1.0.0",
+ "deno": ">=1.30.0",
+ "node": ">=8.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wellwelwel"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "dev": true,
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/multer": {
+ "version": "1.4.5-lts.2",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz",
+ "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==",
+ "deprecated": "Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version.",
+ "dependencies": {
+ "append-field": "^1.0.0",
+ "busboy": "^1.0.0",
+ "concat-stream": "^1.5.2",
+ "mkdirp": "^0.5.4",
+ "object-assign": "^4.1.1",
+ "type-is": "^1.6.4",
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/multer/node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/multer/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/multer/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/multer/node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/mysql2": {
+ "version": "3.16.2",
+ "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.16.2.tgz",
+ "integrity": "sha512-JsqBpYNy7pH20lGfPuSyRSIcCxSeAIwxWADpV64nP9KeyN3ZKpHZgjKXuBKsh7dH6FbOvf1bOgoVKjSUPXRMTw==",
+ "dependencies": {
+ "aws-ssl-profiles": "^1.1.2",
+ "denque": "^2.1.0",
+ "generate-function": "^2.3.1",
+ "iconv-lite": "^0.7.2",
+ "long": "^5.3.2",
+ "lru.min": "^1.1.3",
+ "named-placeholders": "^1.1.6",
+ "seq-queue": "^0.0.5",
+ "sqlstring": "^2.3.3"
+ },
+ "engines": {
+ "node": ">= 8.0"
+ }
+ },
+ "node_modules/named-placeholders": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz",
+ "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==",
+ "dependencies": {
+ "lru.min": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/napi-postinstall": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
+ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
+ "dev": true,
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/node-abort-controller": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
+ "dev": true
+ },
+ "node_modules/node-addon-api": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
+ },
+ "node_modules/node-emoji": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
+ "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "dev": true
+ },
+ "node_modules/nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npmlog": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "deprecated": "This package is no longer supported.",
+ "dependencies": {
+ "are-we-there-yet": "^2.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^3.0.0",
+ "set-blocking": "^2.0.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/passport": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
+ "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
+ "dependencies": {
+ "passport-strategy": "1.x.x",
+ "pause": "0.0.1",
+ "utils-merge": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jaredhanson"
+ }
+ },
+ "node_modules/passport-jwt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz",
+ "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==",
+ "dependencies": {
+ "jsonwebtoken": "^9.0.0",
+ "passport-strategy": "^1.0.0"
+ }
+ },
+ "node_modules/passport-local": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
+ "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==",
+ "dependencies": {
+ "passport-strategy": "1.x.x"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/passport-strategy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
+ "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "11.2.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz",
+ "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==",
+ "dev": true,
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pause": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
+ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz",
+ "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pure-rand": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz",
+ "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ]
+ },
+ "node_modules/qs": {
+ "version": "6.14.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
+ "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/reflect-metadata": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
+ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-cwd/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/seq-queue": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
+ "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.12",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz",
+ "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "safe-buffer": "^5.2.1",
+ "to-buffer": "^1.2.0"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/sql-highlight": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/sql-highlight/-/sql-highlight-6.1.0.tgz",
+ "integrity": "sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==",
+ "funding": [
+ "https://github.com/scriptcoded/sql-highlight?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/scriptcoded"
+ }
+ ],
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/sqlstring": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+ "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strtok3": {
+ "version": "10.3.4",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz",
+ "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==",
+ "dependencies": {
+ "@tokenizer/token": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/superagent": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz",
+ "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==",
+ "dev": true,
+ "dependencies": {
+ "component-emitter": "^1.3.1",
+ "cookiejar": "^2.1.4",
+ "debug": "^4.3.7",
+ "fast-safe-stringify": "^2.1.1",
+ "form-data": "^4.0.5",
+ "formidable": "^3.5.4",
+ "methods": "^1.1.2",
+ "mime": "2.6.0",
+ "qs": "^6.14.1"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/supertest": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz",
+ "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==",
+ "dev": true,
+ "dependencies": {
+ "cookie-signature": "^1.2.2",
+ "methods": "^1.1.2",
+ "superagent": "^10.3.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/swagger-ui-dist": {
+ "version": "5.18.2",
+ "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.18.2.tgz",
+ "integrity": "sha512-J+y4mCw/zXh1FOj5wGJvnAajq6XgHOyywsa9yITmwxIlJbMqITq3gYRZHaeqLVH/eV/HOPphE6NjF+nbSNC5Zw==",
+ "dependencies": {
+ "@scarf/scarf": "=1.4.0"
+ }
+ },
+ "node_modules/symbol-observable": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
+ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.11.12",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
+ "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/core": "^0.2.9"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/synckit"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/terser": {
+ "version": "5.46.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz",
+ "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.16",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
+ "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
+ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true
+ },
+ "node_modules/to-buffer": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz",
+ "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==",
+ "dependencies": {
+ "isarray": "^2.0.5",
+ "safe-buffer": "^5.2.1",
+ "typed-array-buffer": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/token-types": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
+ "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
+ "dependencies": {
+ "@borewit/text-codec": "^0.2.1",
+ "@tokenizer/token": "^0.3.0",
+ "ieee754": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
+ "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/ts-jest": {
+ "version": "29.4.6",
+ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz",
+ "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==",
+ "dev": true,
+ "dependencies": {
+ "bs-logger": "^0.2.6",
+ "fast-json-stable-stringify": "^2.1.0",
+ "handlebars": "^4.7.8",
+ "json5": "^2.2.3",
+ "lodash.memoize": "^4.1.2",
+ "make-error": "^1.3.6",
+ "semver": "^7.7.3",
+ "type-fest": "^4.41.0",
+ "yargs-parser": "^21.1.1"
+ },
+ "bin": {
+ "ts-jest": "cli.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=7.0.0-beta.0 <8",
+ "@jest/transform": "^29.0.0 || ^30.0.0",
+ "@jest/types": "^29.0.0 || ^30.0.0",
+ "babel-jest": "^29.0.0 || ^30.0.0",
+ "jest": "^29.0.0 || ^30.0.0",
+ "jest-util": "^29.0.0 || ^30.0.0",
+ "typescript": ">=4.3 <6"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "@jest/transform": {
+ "optional": true
+ },
+ "@jest/types": {
+ "optional": true
+ },
+ "babel-jest": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jest-util": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-jest/node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ts-loader": {
+ "version": "9.5.4",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz",
+ "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "enhanced-resolve": "^5.0.0",
+ "micromatch": "^4.0.0",
+ "semver": "^7.3.4",
+ "source-map": "^0.7.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "*",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "dev": true,
+ "dependencies": {
+ "json5": "^2.2.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tsconfig-paths-webpack-plugin": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz",
+ "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "enhanced-resolve": "^5.7.0",
+ "tapable": "^2.2.1",
+ "tsconfig-paths": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
+ "node_modules/typeorm": {
+ "version": "0.3.28",
+ "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.28.tgz",
+ "integrity": "sha512-6GH7wXhtfq2D33ZuRXYwIsl/qM5685WZcODZb7noOOcRMteM9KF2x2ap3H0EBjnSV0VO4gNAfJT5Ukp0PkOlvg==",
+ "dependencies": {
+ "@sqltools/formatter": "^1.2.5",
+ "ansis": "^4.2.0",
+ "app-root-path": "^3.1.0",
+ "buffer": "^6.0.3",
+ "dayjs": "^1.11.19",
+ "debug": "^4.4.3",
+ "dedent": "^1.7.0",
+ "dotenv": "^16.6.1",
+ "glob": "^10.5.0",
+ "reflect-metadata": "^0.2.2",
+ "sha.js": "^2.4.12",
+ "sql-highlight": "^6.1.0",
+ "tslib": "^2.8.1",
+ "uuid": "^11.1.0",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "typeorm": "cli.js",
+ "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js",
+ "typeorm-ts-node-esm": "cli-ts-node-esm.js"
+ },
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/typeorm"
+ },
+ "peerDependencies": {
+ "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@sap/hana-client": "^2.14.22",
+ "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0",
+ "ioredis": "^5.0.4",
+ "mongodb": "^5.8.0 || ^6.0.0",
+ "mssql": "^9.1.1 || ^10.0.0 || ^11.0.0 || ^12.0.0",
+ "mysql2": "^2.2.5 || ^3.0.1",
+ "oracledb": "^6.3.0",
+ "pg": "^8.5.1",
+ "pg-native": "^3.0.0",
+ "pg-query-stream": "^4.0.0",
+ "redis": "^3.1.1 || ^4.0.0 || ^5.0.14",
+ "sql.js": "^1.4.0",
+ "sqlite3": "^5.0.3",
+ "ts-node": "^10.7.0",
+ "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@google-cloud/spanner": {
+ "optional": true
+ },
+ "@sap/hana-client": {
+ "optional": true
+ },
+ "better-sqlite3": {
+ "optional": true
+ },
+ "ioredis": {
+ "optional": true
+ },
+ "mongodb": {
+ "optional": true
+ },
+ "mssql": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "oracledb": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "pg-native": {
+ "optional": true
+ },
+ "pg-query-stream": {
+ "optional": true
+ },
+ "redis": {
+ "optional": true
+ },
+ "sql.js": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ },
+ "typeorm-aurora-data-api-driver": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/typeorm/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/typeorm/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/typeorm/node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/typeorm/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/typeorm/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
+ },
+ "node_modules/typeorm/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/typeorm/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/typeorm/node_modules/uuid": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.54.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz",
+ "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.54.0",
+ "@typescript-eslint/parser": "8.54.0",
+ "@typescript-eslint/typescript-estree": "8.54.0",
+ "@typescript-eslint/utils": "8.54.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/uid": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz",
+ "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==",
+ "dependencies": {
+ "@lukeed/csprng": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/uint8array-extras": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
+ "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unrs-resolver": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "napi-postinstall": "^0.3.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+ "@unrs/resolver-binding-android-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-x64": "1.11.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/validator": {
+ "version": "13.15.26",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz",
+ "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz",
+ "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==",
+ "dev": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/webpack": {
+ "version": "5.104.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz",
+ "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.8",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.15.0",
+ "acorn-import-phases": "^1.0.3",
+ "browserslist": "^4.28.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.4",
+ "es-module-lexer": "^2.0.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.3.1",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.3",
+ "tapable": "^2.3.0",
+ "terser-webpack-plugin": "^5.3.16",
+ "watchpack": "^2.4.4",
+ "webpack-sources": "^3.3.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-node-externals": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz",
+ "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
+ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/webpack/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/webpack/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
+ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "dependencies": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors-cjs": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
+ "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/后端/package.json b/后端/package.json
new file mode 100644
index 0000000..32335e5
--- /dev/null
+++ b/后端/package.json
@@ -0,0 +1,94 @@
+{
+ "name": "youyijia-sofa-backend",
+ "version": "1.0.0",
+ "description": "优艺家沙发翻新小程序后端 API",
+ "author": "Your Name",
+ "private": true,
+ "license": "MIT",
+ "scripts": {
+ "build": "nest build",
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
+ "start": "nest start",
+ "start:dev": "nest start --watch",
+ "start:debug": "nest start --debug --watch",
+ "start:prod": "node dist/main",
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
+ "test": "jest",
+ "test:watch": "jest --watch",
+ "test:cov": "jest --coverage",
+ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
+ "test:e2e": "jest --config ./test/jest-e2e.json",
+ "typeorm": "typeorm-ts-node-commonjs"
+ },
+ "dependencies": {
+ "@nestjs/common": "^11.0.1",
+ "@nestjs/config": "^4.0.0",
+ "@nestjs/core": "^11.0.1",
+ "@nestjs/jwt": "^11.0.0",
+ "@nestjs/passport": "^11.0.0",
+ "@nestjs/platform-express": "^11.0.1",
+ "@nestjs/swagger": "^8.0.0",
+ "@nestjs/typeorm": "^11.0.0",
+ "axios": "^1.13.3",
+ "bcrypt": "^5.1.1",
+ "class-transformer": "^0.5.1",
+ "class-validator": "^0.14.0",
+ "dayjs": "^1.11.9",
+ "multer": "^1.4.5-lts.1",
+ "mysql2": "^3.6.0",
+ "passport": "^0.6.0",
+ "passport-jwt": "^4.0.1",
+ "passport-local": "^1.0.0",
+ "reflect-metadata": "^0.2.2",
+ "rxjs": "^7.8.1",
+ "typeorm": "^0.3.17",
+ "uuid": "^9.0.0"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3.2.0",
+ "@eslint/js": "^9.18.0",
+ "@nestjs/cli": "^11.0.0",
+ "@nestjs/schematics": "^11.0.0",
+ "@nestjs/testing": "^11.0.1",
+ "@types/bcrypt": "^5.0.0",
+ "@types/express": "^5.0.0",
+ "@types/jest": "^30.0.0",
+ "@types/multer": "^1.4.7",
+ "@types/node": "^22.10.7",
+ "@types/passport-jwt": "^3.0.9",
+ "@types/passport-local": "^1.0.35",
+ "@types/supertest": "^6.0.2",
+ "@types/uuid": "^9.0.2",
+ "eslint": "^9.18.0",
+ "eslint-config-prettier": "^10.0.1",
+ "eslint-plugin-prettier": "^5.2.2",
+ "globals": "^16.0.0",
+ "jest": "^30.0.0",
+ "prettier": "^3.4.2",
+ "source-map-support": "^0.5.21",
+ "supertest": "^7.0.0",
+ "ts-jest": "^29.2.5",
+ "ts-loader": "^9.5.2",
+ "ts-node": "^10.9.2",
+ "tsconfig-paths": "^4.2.0",
+ "typescript": "^5.7.3",
+ "typescript-eslint": "^8.20.0"
+ },
+ "jest": {
+ "moduleFileExtensions": [
+ "js",
+ "json",
+ "ts"
+ ],
+ "rootDir": "src",
+ "testRegex": ".*\\.spec\\.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ },
+ "collectCoverageFrom": [
+ "**/*.(t|j)s"
+ ],
+ "coverageDirectory": "../coverage",
+ "testEnvironment": "node"
+ }
+}
diff --git a/后端/src/app.controller.spec.ts b/后端/src/app.controller.spec.ts
new file mode 100644
index 0000000..d22f389
--- /dev/null
+++ b/后端/src/app.controller.spec.ts
@@ -0,0 +1,22 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { AppController } from './app.controller';
+import { AppService } from './app.service';
+
+describe('AppController', () => {
+ let appController: AppController;
+
+ beforeEach(async () => {
+ const app: TestingModule = await Test.createTestingModule({
+ controllers: [AppController],
+ providers: [AppService],
+ }).compile();
+
+ appController = app.get(AppController);
+ });
+
+ describe('root', () => {
+ it('should return "Hello World!"', () => {
+ expect(appController.getHello()).toBe('Hello World!');
+ });
+ });
+});
diff --git a/后端/src/app.controller.ts b/后端/src/app.controller.ts
new file mode 100644
index 0000000..cce879e
--- /dev/null
+++ b/后端/src/app.controller.ts
@@ -0,0 +1,12 @@
+import { Controller, Get } from '@nestjs/common';
+import { AppService } from './app.service';
+
+@Controller()
+export class AppController {
+ constructor(private readonly appService: AppService) {}
+
+ @Get()
+ getHello(): string {
+ return this.appService.getHello();
+ }
+}
diff --git a/后端/src/app.module.ts b/后端/src/app.module.ts
new file mode 100644
index 0000000..76e4742
--- /dev/null
+++ b/后端/src/app.module.ts
@@ -0,0 +1,52 @@
+import { Module } from '@nestjs/common';
+import { ConfigModule, ConfigService } from '@nestjs/config';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { AppController } from './app.controller';
+import { AppService } from './app.service';
+import databaseConfig from './config/database.config';
+import jwtConfig from './config/jwt.config';
+import { User } from './entities/user.entity';
+import { Case } from './entities/case.entity';
+import { Service } from './entities/service.entity';
+import { Booking } from './entities/booking.entity';
+import { AuthModule } from './auth/auth.module';
+import { UserModule } from './user/user.module';
+import { CaseModule } from './case/case.module';
+import { ServiceModule } from './service/service.module';
+
+@Module({
+ imports: [
+ ConfigModule.forRoot({
+ isGlobal: true,
+ load: [databaseConfig, jwtConfig],
+ envFilePath: '.env',
+ }),
+ TypeOrmModule.forRootAsync({
+ imports: [ConfigModule],
+ useFactory: (configService: ConfigService) => ({
+ type: 'mysql',
+ host: configService.get('database.host'),
+ port: configService.get('database.port'),
+ username: configService.get('database.username'),
+ password: configService.get('database.password'),
+ database: configService.get('database.database'),
+ entities: [User, Case, Service, Booking],
+ synchronize: configService.get('database.synchronize'),
+ logging: configService.get('database.logging'),
+ charset: configService.get('database.charset'),
+ timezone: configService.get('database.timezone'),
+ retryAttempts: 3, // 减少重试次数
+ retryDelay: 1000, // 重试延迟
+ autoLoadEntities: true,
+ }),
+ inject: [ConfigService],
+ }),
+ AuthModule,
+ UserModule,
+ CaseModule,
+ ServiceModule,
+ ],
+ controllers: [AppController],
+ providers: [AppService],
+})
+export class AppModule {}
diff --git a/后端/src/app.service.ts b/后端/src/app.service.ts
new file mode 100644
index 0000000..927d7cc
--- /dev/null
+++ b/后端/src/app.service.ts
@@ -0,0 +1,8 @@
+import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class AppService {
+ getHello(): string {
+ return 'Hello World!';
+ }
+}
diff --git a/后端/src/auth/auth.controller.ts b/后端/src/auth/auth.controller.ts
new file mode 100644
index 0000000..dad4d7c
--- /dev/null
+++ b/后端/src/auth/auth.controller.ts
@@ -0,0 +1,53 @@
+import { Controller, Post, Body, HttpStatus, HttpCode } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
+import { AuthService, AuthResult } from './auth.service';
+import { RegisterDto, LoginDto, WechatLoginDto, WechatUserInfoDto } from './dto/auth.dto';
+import { Public } from './guards/public.decorator';
+
+@ApiTags('认证')
+@Controller('auth')
+export class AuthController {
+ constructor(private readonly authService: AuthService) {}
+
+ @Public()
+ @Post('register')
+ @ApiOperation({ summary: '用户注册' })
+ @ApiResponse({ status: 201, description: '注册成功' })
+ @ApiResponse({ status: 409, description: '用户已存在' })
+ async register(@Body() registerDto: RegisterDto): Promise {
+ return this.authService.register(registerDto);
+ }
+
+ @Public()
+ @Post('login')
+ @HttpCode(HttpStatus.OK)
+ @ApiOperation({ summary: '用户登录' })
+ @ApiResponse({ status: 200, description: '登录成功' })
+ @ApiResponse({ status: 401, description: '用户名或密码错误' })
+ async login(@Body() loginDto: LoginDto): Promise {
+ return this.authService.login(loginDto);
+ }
+
+ @Public()
+ @Post('refresh')
+ @HttpCode(HttpStatus.OK)
+ @ApiOperation({ summary: '刷新访问令牌' })
+ @ApiResponse({ status: 200, description: '刷新成功' })
+ @ApiResponse({ status: 401, description: '刷新令牌无效' })
+ async refreshToken(@Body('refresh_token') refreshToken: string) {
+ return this.authService.refreshToken(refreshToken);
+ }
+
+ @Public()
+ @Post('wechat/login')
+ @HttpCode(HttpStatus.OK)
+ @ApiOperation({ summary: '微信小程序登录' })
+ @ApiResponse({ status: 200, description: '登录成功' })
+ @ApiResponse({ status: 400, description: '微信登录失败' })
+ async wechatLogin(
+ @Body() loginData: { wechatLogin: WechatLoginDto; userInfo?: WechatUserInfoDto }
+ ): Promise {
+ const { wechatLogin, userInfo } = loginData;
+ return this.authService.wechatLogin(wechatLogin, userInfo);
+ }
+}
\ No newline at end of file
diff --git a/后端/src/auth/auth.module.ts b/后端/src/auth/auth.module.ts
new file mode 100644
index 0000000..16946d9
--- /dev/null
+++ b/后端/src/auth/auth.module.ts
@@ -0,0 +1,43 @@
+import { Module } from '@nestjs/common';
+import { JwtModule } from '@nestjs/jwt';
+import { ConfigModule, ConfigService } from '@nestjs/config';
+import { PassportModule } from '@nestjs/passport';
+import { APP_GUARD } from '@nestjs/core';
+import { AuthController } from './auth.controller';
+import { AuthService } from './auth.service';
+import { WechatService } from './wechat.service';
+import { JwtStrategy } from './strategies/jwt.strategy';
+import { JwtAuthGuard } from './guards/jwt-auth.guard';
+import { RolesGuard } from './guards/roles.guard';
+import { UserModule } from '../user/user.module';
+
+@Module({
+ imports: [
+ UserModule,
+ PassportModule,
+ JwtModule.registerAsync({
+ imports: [ConfigModule],
+ useFactory: async (configService: ConfigService) => ({
+ secret: configService.get('jwt.secret'),
+ signOptions: configService.get('jwt.signOptions'),
+ }),
+ inject: [ConfigService],
+ }),
+ ],
+ controllers: [AuthController],
+ providers: [
+ AuthService,
+ WechatService,
+ JwtStrategy,
+ {
+ provide: APP_GUARD,
+ useClass: JwtAuthGuard,
+ },
+ {
+ provide: APP_GUARD,
+ useClass: RolesGuard,
+ },
+ ],
+ exports: [AuthService],
+})
+export class AuthModule {}
\ No newline at end of file
diff --git a/后端/src/auth/auth.service.ts b/后端/src/auth/auth.service.ts
new file mode 100644
index 0000000..43156c6
--- /dev/null
+++ b/后端/src/auth/auth.service.ts
@@ -0,0 +1,248 @@
+import { Injectable, ConflictException, UnauthorizedException, BadRequestException } from '@nestjs/common';
+import { JwtService } from '@nestjs/jwt';
+import { ConfigService } from '@nestjs/config';
+import * as bcrypt from 'bcrypt';
+import { UserService } from '../user/user.service';
+import { RegisterDto, LoginDto, WechatLoginDto, WechatUserInfoDto } from './dto/auth.dto';
+import { JwtPayload } from './strategies/jwt.strategy';
+import { WechatService } from './wechat.service';
+
+export interface AuthResult {
+ user: {
+ id: number;
+ username: string;
+ email: string;
+ realName: string;
+ phone: string;
+ avatar: string;
+ role: string;
+ status: string;
+ };
+ access_token: string;
+ refresh_token: string;
+}
+
+@Injectable()
+export class AuthService {
+ constructor(
+ private userService: UserService,
+ private jwtService: JwtService,
+ private configService: ConfigService,
+ private wechatService: WechatService,
+ ) {}
+
+ async register(registerDto: RegisterDto): Promise {
+ const { username, email, password, realName, phone } = registerDto;
+
+ // 检查用户名是否已存在
+ const existingUsername = await this.userService.findByUsername(username);
+ if (existingUsername) {
+ throw new ConflictException('用户名已存在');
+ }
+
+ // 检查邮箱是否已存在
+ const existingEmail = await this.userService.findByEmail(email);
+ if (existingEmail) {
+ throw new ConflictException('邮箱已存在');
+ }
+
+ // 加密密码
+ const saltRounds = 10;
+ const hashedPassword = await bcrypt.hash(password, saltRounds);
+
+ // 创建用户
+ const user = await this.userService.create({
+ username,
+ email,
+ password: hashedPassword,
+ realName,
+ phone,
+ role: 'customer',
+ status: 'active',
+ });
+
+ // 生成tokens
+ const tokens = await this.generateTokens(user);
+
+ return {
+ user: {
+ id: user.id,
+ username: user.username,
+ email: user.email,
+ realName: user.realName,
+ phone: user.phone,
+ avatar: user.avatar,
+ role: user.role,
+ status: user.status,
+ },
+ ...tokens,
+ };
+ }
+
+ async login(loginDto: LoginDto): Promise {
+ const { username, password } = loginDto;
+
+ // 查找用户(支持用户名或邮箱登录)
+ let user;
+ if (username.includes('@')) {
+ user = await this.userService.findByEmailWithPassword(username);
+ } else {
+ user = await this.userService.findByUsernameWithPassword(username);
+ }
+
+ if (!user) {
+ throw new UnauthorizedException('用户名或密码错误');
+ }
+
+ // 检查用户状态
+ if (user.status !== 'active') {
+ throw new UnauthorizedException('账户已被禁用,请联系管理员');
+ }
+
+ // 验证密码
+ const isPasswordValid = await bcrypt.compare(password, user.password);
+ if (!isPasswordValid) {
+ throw new UnauthorizedException('用户名或密码错误');
+ }
+
+ // 生成tokens
+ const tokens = await this.generateTokens(user);
+
+ return {
+ user: {
+ id: user.id,
+ username: user.username,
+ email: user.email,
+ realName: user.realName,
+ phone: user.phone,
+ avatar: user.avatar,
+ role: user.role,
+ status: user.status,
+ },
+ ...tokens,
+ };
+ }
+
+ async refreshToken(refreshToken: string): Promise<{ access_token: string }> {
+ try {
+ const payload = this.jwtService.verify(refreshToken, {
+ secret: this.configService.get('jwt.refreshSecret'),
+ });
+
+ const user = await this.userService.findById(payload.sub);
+ if (!user || user.status !== 'active') {
+ throw new UnauthorizedException('用户不存在或已被禁用');
+ }
+
+ const jwtPayload: JwtPayload = {
+ sub: user.id,
+ username: user.username,
+ email: user.email,
+ role: user.role,
+ };
+
+ return {
+ access_token: this.jwtService.sign(jwtPayload),
+ };
+ } catch (error) {
+ throw new UnauthorizedException('刷新令牌无效');
+ }
+ }
+
+ /**
+ * 微信小程序登录
+ */
+ async wechatLogin(wechatLoginDto: WechatLoginDto, userInfo?: WechatUserInfoDto): Promise {
+ const { code, encryptedData, iv, signature } = wechatLoginDto;
+
+ // 通过code获取微信session信息
+ const wechatSession = await this.wechatService.getWechatSession(code);
+ const { openid, session_key, unionid } = wechatSession;
+
+ // 查找是否已存在该微信用户
+ let user = await this.userService.findByOpenid(openid);
+
+ if (user) {
+ // 更新session_key
+ await this.userService.updateSessionKey(user.id, session_key);
+
+ // 生成tokens
+ const tokens = await this.generateTokens(user);
+
+ return {
+ user: {
+ id: user.id,
+ username: user.username,
+ email: user.email,
+ realName: user.realName,
+ phone: user.phone,
+ avatar: user.avatar,
+ role: user.role,
+ status: user.status,
+ },
+ ...tokens,
+ };
+ }
+
+ // 新用户注册流程
+ let decryptedUserInfo: any = null;
+
+ // 如果提供了加密数据,解密获取用户信息
+ if (encryptedData && iv) {
+ decryptedUserInfo = this.wechatService.decryptWechatData(encryptedData, iv, session_key);
+ }
+
+ // 生成唯一用户名
+ const username = this.wechatService.generateUniqueUsername(openid);
+
+ // 创建新用户
+ user = await this.userService.create({
+ username,
+ email: `${openid}@wechat.local`, // 临时邮箱
+ realName: decryptedUserInfo?.nickName || userInfo?.nickName || '微信用户',
+ avatar: decryptedUserInfo?.avatarUrl || userInfo?.avatarUrl || null,
+ role: 'customer',
+ status: 'active',
+ openid,
+ unionid,
+ sessionKey: session_key,
+ });
+
+ // 生成tokens
+ const tokens = await this.generateTokens(user);
+
+ return {
+ user: {
+ id: user.id,
+ username: user.username,
+ email: user.email,
+ realName: user.realName,
+ phone: user.phone,
+ avatar: user.avatar,
+ role: user.role,
+ status: user.status,
+ },
+ ...tokens,
+ };
+ }
+
+ private async generateTokens(user: any) {
+ const payload: JwtPayload = {
+ sub: user.id,
+ username: user.username,
+ email: user.email,
+ role: user.role,
+ };
+
+ const accessToken = this.jwtService.sign(payload);
+ const refreshToken = this.jwtService.sign(payload, {
+ secret: this.configService.get('jwt.refreshSecret'),
+ expiresIn: this.configService.get('jwt.refreshExpiresIn'),
+ });
+
+ return {
+ access_token: accessToken,
+ refresh_token: refreshToken,
+ };
+ }
+}
\ No newline at end of file
diff --git a/后端/src/auth/decorators/current-user.decorator.ts b/后端/src/auth/decorators/current-user.decorator.ts
new file mode 100644
index 0000000..b8978d0
--- /dev/null
+++ b/后端/src/auth/decorators/current-user.decorator.ts
@@ -0,0 +1,15 @@
+import { createParamDecorator, ExecutionContext } from '@nestjs/common';
+
+export interface CurrentUserData {
+ userId: number;
+ username: string;
+ email: string;
+ role: string;
+}
+
+export const CurrentUser = createParamDecorator(
+ (data: unknown, ctx: ExecutionContext): CurrentUserData => {
+ const request = ctx.switchToHttp().getRequest();
+ return request.user;
+ },
+);
\ No newline at end of file
diff --git a/后端/src/auth/dto/auth.dto.ts b/后端/src/auth/dto/auth.dto.ts
new file mode 100644
index 0000000..54ff4c1
--- /dev/null
+++ b/后端/src/auth/dto/auth.dto.ts
@@ -0,0 +1,75 @@
+import { IsEmail, IsNotEmpty, IsString, MinLength, IsOptional } from 'class-validator';
+
+export class RegisterDto {
+ @IsNotEmpty({ message: '用户名不能为空' })
+ @IsString({ message: '用户名必须为字符串' })
+ username: string;
+
+ @IsEmail({}, { message: '邮箱格式不正确' })
+ email: string;
+
+ @IsNotEmpty({ message: '密码不能为空' })
+ @MinLength(6, { message: '密码长度至少6位' })
+ password: string;
+
+ @IsOptional()
+ realName?: string;
+
+ @IsOptional()
+ phone?: string;
+}
+
+export class LoginDto {
+ @IsNotEmpty({ message: '登录名不能为空' })
+ @IsString()
+ username: string; // 可以是用户名或邮箱
+
+ @IsNotEmpty({ message: '密码不能为空' })
+ password: string;
+}
+
+// 微信小程序登录DTO
+export class WechatLoginDto {
+ @IsNotEmpty({ message: '微信登录码不能为空' })
+ @IsString()
+ code: string; // 微信小程序登录码
+
+ @IsOptional()
+ @IsString()
+ encryptedData?: string; // 加密数据
+
+ @IsOptional()
+ @IsString()
+ iv?: string; // 初始向量
+
+ @IsOptional()
+ @IsString()
+ signature?: string; // 数据签名
+}
+
+// 微信用户信息DTO
+export class WechatUserInfoDto {
+ @IsOptional()
+ @IsString()
+ nickName?: string;
+
+ @IsOptional()
+ @IsString()
+ avatarUrl?: string;
+
+ @IsOptional()
+ @IsString()
+ gender?: string;
+
+ @IsOptional()
+ @IsString()
+ city?: string;
+
+ @IsOptional()
+ @IsString()
+ province?: string;
+
+ @IsOptional()
+ @IsString()
+ country?: string;
+}
\ No newline at end of file
diff --git a/后端/src/auth/guards/jwt-auth.guard.ts b/后端/src/auth/guards/jwt-auth.guard.ts
new file mode 100644
index 0000000..d065b9c
--- /dev/null
+++ b/后端/src/auth/guards/jwt-auth.guard.ts
@@ -0,0 +1,29 @@
+import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
+import { Reflector } from '@nestjs/core';
+import { AuthGuard } from '@nestjs/passport';
+import { IS_PUBLIC_KEY } from './public.decorator';
+
+@Injectable()
+export class JwtAuthGuard extends AuthGuard('jwt') {
+ constructor(private reflector: Reflector) {
+ super();
+ }
+
+ canActivate(context: ExecutionContext) {
+ const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [
+ context.getHandler(),
+ context.getClass(),
+ ]);
+ if (isPublic) {
+ return true;
+ }
+ return super.canActivate(context);
+ }
+
+ handleRequest(err, user, info) {
+ if (err || !user) {
+ throw err || new UnauthorizedException('登录已过期,请重新登录');
+ }
+ return user;
+ }
+}
\ No newline at end of file
diff --git a/后端/src/auth/guards/public.decorator.ts b/后端/src/auth/guards/public.decorator.ts
new file mode 100644
index 0000000..5e0a0bb
--- /dev/null
+++ b/后端/src/auth/guards/public.decorator.ts
@@ -0,0 +1,4 @@
+import { SetMetadata } from '@nestjs/common';
+
+export const IS_PUBLIC_KEY = 'isPublic';
+export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
\ No newline at end of file
diff --git a/后端/src/auth/guards/roles.decorator.ts b/后端/src/auth/guards/roles.decorator.ts
new file mode 100644
index 0000000..e4a5641
--- /dev/null
+++ b/后端/src/auth/guards/roles.decorator.ts
@@ -0,0 +1,4 @@
+import { SetMetadata } from '@nestjs/common';
+
+export const ROLES_KEY = 'roles';
+export const Roles = (...roles: string[]) => SetMetadata(ROLES_KEY, roles);
\ No newline at end of file
diff --git a/后端/src/auth/guards/roles.guard.ts b/后端/src/auth/guards/roles.guard.ts
new file mode 100644
index 0000000..8bb85a6
--- /dev/null
+++ b/后端/src/auth/guards/roles.guard.ts
@@ -0,0 +1,27 @@
+import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common';
+import { Reflector } from '@nestjs/core';
+import { ROLES_KEY } from './roles.decorator';
+
+@Injectable()
+export class RolesGuard implements CanActivate {
+ constructor(private reflector: Reflector) {}
+
+ canActivate(context: ExecutionContext): boolean {
+ const requiredRoles = this.reflector.getAllAndOverride(ROLES_KEY, [
+ context.getHandler(),
+ context.getClass(),
+ ]);
+ if (!requiredRoles) {
+ return true;
+ }
+ const { user } = context.switchToHttp().getRequest();
+ if (!user) {
+ throw new ForbiddenException('用户未认证');
+ }
+ const hasRole = requiredRoles.includes(user.role);
+ if (!hasRole) {
+ throw new ForbiddenException('权限不足');
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/后端/src/auth/strategies/jwt.strategy.ts b/后端/src/auth/strategies/jwt.strategy.ts
new file mode 100644
index 0000000..7546f79
--- /dev/null
+++ b/后端/src/auth/strategies/jwt.strategy.ts
@@ -0,0 +1,39 @@
+import { Injectable } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { PassportStrategy } from '@nestjs/passport';
+import { ExtractJwt, Strategy } from 'passport-jwt';
+import { UserService } from '../../user/user.service';
+
+export interface JwtPayload {
+ sub: number;
+ username: string;
+ email: string;
+ role: string;
+}
+
+@Injectable()
+export class JwtStrategy extends PassportStrategy(Strategy) {
+ constructor(
+ private configService: ConfigService,
+ private userService: UserService,
+ ) {
+ super({
+ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
+ ignoreExpiration: false,
+ secretOrKey: configService.get('jwt.secret'),
+ });
+ }
+
+ async validate(payload: JwtPayload) {
+ const user = await this.userService.findById(payload.sub);
+ if (!user || user.status !== 'active') {
+ return null;
+ }
+ return {
+ userId: payload.sub,
+ username: payload.username,
+ email: payload.email,
+ role: payload.role,
+ };
+ }
+}
\ No newline at end of file
diff --git a/后端/src/auth/wechat.service.ts b/后端/src/auth/wechat.service.ts
new file mode 100644
index 0000000..5a0ba08
--- /dev/null
+++ b/后端/src/auth/wechat.service.ts
@@ -0,0 +1,125 @@
+import { Injectable, Logger, BadRequestException } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import axios from 'axios';
+import * as crypto from 'crypto';
+
+export interface WechatSession {
+ openid: string;
+ session_key: string;
+ unionid?: string;
+ errcode?: number;
+ errmsg?: string;
+}
+
+export interface WechatUserInfo {
+ openId: string;
+ nickName: string;
+ gender: number;
+ city: string;
+ province: string;
+ country: string;
+ avatarUrl: string;
+ unionId?: string;
+ watermark: {
+ timestamp: number;
+ appid: string;
+ };
+}
+
+@Injectable()
+export class WechatService {
+ private readonly logger = new Logger(WechatService.name);
+ private readonly appId: string;
+ private readonly appSecret: string;
+
+ constructor(private configService: ConfigService) {
+ this.appId = this.configService.get('WECHAT_APPID') || '';
+ this.appSecret = this.configService.get('WECHAT_SECRET') || '';
+ }
+
+ /**
+ * 通过code换取微信用户的openid和session_key
+ */
+ async getWechatSession(code: string): Promise {
+ try {
+ const response = await axios.get('https://api.weixin.qq.com/sns/jscode2session', {
+ params: {
+ appid: this.appId,
+ secret: this.appSecret,
+ js_code: code,
+ grant_type: 'authorization_code',
+ },
+ });
+
+ const data = response.data;
+
+ if (data.errcode) {
+ this.logger.error(`微信登录失败: ${data.errcode} - ${data.errmsg}`);
+ throw new BadRequestException(`微信登录失败: ${data.errmsg}`);
+ }
+
+ return {
+ openid: data.openid,
+ session_key: data.session_key,
+ unionid: data.unionid,
+ };
+ } catch (error) {
+ this.logger.error('调用微信API失败:', error);
+ throw new BadRequestException('微信登录服务暂时不可用');
+ }
+ }
+
+ /**
+ * 解密微信用户信息
+ */
+ decryptWechatData(encryptedData: string, iv: string, sessionKey: string): WechatUserInfo {
+ try {
+ const key = Buffer.from(sessionKey, 'base64');
+ const ivBuffer = Buffer.from(iv, 'base64');
+ const encrypted = Buffer.from(encryptedData, 'base64');
+
+ const decipher = crypto.createDecipheriv('aes-128-cbc', key, ivBuffer);
+ decipher.setAutoPadding(true);
+
+ let decrypted = decipher.update(encrypted, undefined, 'utf8');
+ decrypted += decipher.final('utf8');
+
+ const userInfo = JSON.parse(decrypted);
+
+ // 验证水印
+ if (userInfo.watermark.appid !== this.appId) {
+ throw new Error('水印验证失败');
+ }
+
+ return userInfo;
+ } catch (error) {
+ this.logger.error('解密微信用户信息失败:', error);
+ throw new BadRequestException('用户信息解密失败');
+ }
+ }
+
+ /**
+ * 验证数据签名
+ */
+ verifySignature(rawData: string, signature: string, sessionKey: string): boolean {
+ try {
+ const hmac = crypto.createHmac('sha1', sessionKey);
+ hmac.update(rawData);
+ const computedSignature = hmac.digest('hex');
+
+ return computedSignature === signature;
+ } catch (error) {
+ this.logger.error('验证签名失败:', error);
+ return false;
+ }
+ }
+
+ /**
+ * 生成唯一用户名
+ */
+ generateUniqueUsername(openid: string): string {
+ // 使用openid的一部分作为用户名后缀,确保唯一性
+ const suffix = openid.slice(-8);
+ return `wx_${suffix}`;
+ }
+}
\ No newline at end of file
diff --git a/后端/src/case/case.controller.ts b/后端/src/case/case.controller.ts
new file mode 100644
index 0000000..3f7dd97
--- /dev/null
+++ b/后端/src/case/case.controller.ts
@@ -0,0 +1,89 @@
+import { Controller, Get, Post, Body, Patch, Param, Delete, Query, UseGuards } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger';
+import { CaseService } from './case.service';
+import { CreateCaseDto, UpdateCaseDto, QueryCaseDto } from './dto/case.dto';
+import type { CurrentUserData } from '../auth/decorators/current-user.decorator';
+import { CurrentUser } from '../auth/decorators/current-user.decorator';
+import { Roles } from '../auth/guards/roles.decorator';
+import { Public } from '../auth/guards/public.decorator';
+
+@ApiTags('案例管理')
+@Controller('cases')
+export class CaseController {
+ constructor(private readonly caseService: CaseService) {}
+
+ @ApiBearerAuth()
+ @Post()
+ @Roles('admin', 'worker')
+ @ApiOperation({ summary: '创建案例' })
+ @ApiResponse({ status: 201, description: '创建成功' })
+ create(@Body() createCaseDto: CreateCaseDto, @CurrentUser() user: CurrentUserData) {
+ return this.caseService.create(createCaseDto, user.userId);
+ }
+
+ @Public()
+ @Get()
+ @ApiOperation({ summary: '获取案例列表' })
+ @ApiQuery({ name: 'serviceType', required: false, enum: ['fabric', 'leather', 'cleaning', 'repair', 'custom'] })
+ @ApiQuery({ name: 'status', required: false, enum: ['draft', 'published', 'archived'], description: '默认为published' })
+ @ApiQuery({ name: 'page', required: false, type: Number, description: '页码,默认为1' })
+ @ApiQuery({ name: 'limit', required: false, type: Number, description: '每页数量,默认为10' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ findAll(@Query() query: QueryCaseDto) {
+ return this.caseService.findAll(query);
+ }
+
+ @ApiBearerAuth()
+ @Get('my')
+ @ApiOperation({ summary: '获取我的案例列表' })
+ @ApiQuery({ name: 'serviceType', required: false, enum: ['fabric', 'leather', 'cleaning', 'repair', 'custom'] })
+ @ApiQuery({ name: 'status', required: false, enum: ['draft', 'published', 'archived'] })
+ @ApiQuery({ name: 'page', required: false, type: Number })
+ @ApiQuery({ name: 'limit', required: false, type: Number })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ getMyCases(@Query() query: QueryCaseDto, @CurrentUser() user: CurrentUserData) {
+ return this.caseService.getMyCases(user.userId, query);
+ }
+
+ @Public()
+ @Get(':id')
+ @ApiOperation({ summary: '根据ID获取案例详情' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ @ApiResponse({ status: 404, description: '案例不存在' })
+ findOne(@Param('id') id: string) {
+ return this.caseService.findOne(+id);
+ }
+
+ @ApiBearerAuth()
+ @Patch(':id')
+ @ApiOperation({ summary: '更新案例' })
+ @ApiResponse({ status: 200, description: '更新成功' })
+ @ApiResponse({ status: 404, description: '案例不存在' })
+ @ApiResponse({ status: 403, description: '没有权限' })
+ update(
+ @Param('id') id: string,
+ @Body() updateCaseDto: UpdateCaseDto,
+ @CurrentUser() user: CurrentUserData
+ ) {
+ return this.caseService.update(+id, updateCaseDto, user.userId, user.role);
+ }
+
+ @ApiBearerAuth()
+ @Delete(':id')
+ @ApiOperation({ summary: '删除案例' })
+ @ApiResponse({ status: 200, description: '删除成功' })
+ @ApiResponse({ status: 404, description: '案例不存在' })
+ @ApiResponse({ status: 403, description: '没有权限' })
+ remove(@Param('id') id: string, @CurrentUser() user: CurrentUserData) {
+ return this.caseService.remove(+id, user.userId, user.role);
+ }
+
+ @Public()
+ @Post(':id/like')
+ @ApiOperation({ summary: '点赞案例' })
+ @ApiResponse({ status: 200, description: '点赞成功' })
+ @ApiResponse({ status: 404, description: '案例不存在' })
+ like(@Param('id') id: string) {
+ return this.caseService.like(+id);
+ }
+}
\ No newline at end of file
diff --git a/后端/src/case/case.module.ts b/后端/src/case/case.module.ts
new file mode 100644
index 0000000..3350afd
--- /dev/null
+++ b/后端/src/case/case.module.ts
@@ -0,0 +1,13 @@
+import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { CaseService } from './case.service';
+import { CaseController } from './case.controller';
+import { Case } from '../entities/case.entity';
+
+@Module({
+ imports: [TypeOrmModule.forFeature([Case])],
+ controllers: [CaseController],
+ providers: [CaseService],
+ exports: [CaseService],
+})
+export class CaseModule {}
\ No newline at end of file
diff --git a/后端/src/case/case.service.ts b/后端/src/case/case.service.ts
new file mode 100644
index 0000000..c37a62a
--- /dev/null
+++ b/后端/src/case/case.service.ts
@@ -0,0 +1,207 @@
+import { Injectable, NotFoundException, ForbiddenException } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { Case } from '../entities/case.entity';
+import { CreateCaseDto, UpdateCaseDto, QueryCaseDto } from './dto/case.dto';
+
+@Injectable()
+export class CaseService {
+ constructor(
+ @InjectRepository(Case)
+ private caseRepository: Repository,
+ ) {}
+
+ async create(createCaseDto: CreateCaseDto, createdBy: number): Promise {
+ const caseEntity = this.caseRepository.create({
+ ...createCaseDto,
+ createdBy,
+ status: 'published',
+ });
+ return this.caseRepository.save(caseEntity);
+ }
+
+ async findAll(query: QueryCaseDto) {
+ const { serviceType, status, page = 1, limit = 10 } = query;
+ const queryBuilder = this.caseRepository
+ .createQueryBuilder('case')
+ .leftJoinAndSelect('case.creator', 'creator')
+ .select([
+ 'case.id',
+ 'case.title',
+ 'case.description',
+ 'case.beforeImages',
+ 'case.afterImages',
+ 'case.serviceType',
+ 'case.price',
+ 'case.materials',
+ 'case.duration',
+ 'case.status',
+ 'case.views',
+ 'case.likes',
+ 'case.createdAt',
+ 'case.updatedAt',
+ 'creator.id',
+ 'creator.username',
+ 'creator.realName',
+ ]);
+
+ if (serviceType) {
+ queryBuilder.andWhere('case.serviceType = :serviceType', { serviceType });
+ }
+
+ if (status) {
+ queryBuilder.andWhere('case.status = :status', { status });
+ }
+
+ const skip = (page - 1) * limit;
+ queryBuilder.skip(skip).take(limit);
+ queryBuilder.orderBy('case.createdAt', 'DESC');
+
+ const [items, total] = await queryBuilder.getManyAndCount();
+
+ return {
+ items,
+ total,
+ page,
+ limit,
+ totalPages: Math.ceil(total / limit),
+ };
+ }
+
+ async findOne(id: number): Promise {
+ const caseEntity = await this.caseRepository
+ .createQueryBuilder('case')
+ .leftJoinAndSelect('case.creator', 'creator')
+ .select([
+ 'case.id',
+ 'case.title',
+ 'case.description',
+ 'case.beforeImages',
+ 'case.afterImages',
+ 'case.serviceType',
+ 'case.price',
+ 'case.materials',
+ 'case.duration',
+ 'case.status',
+ 'case.views',
+ 'case.likes',
+ 'case.createdAt',
+ 'case.updatedAt',
+ 'creator.id',
+ 'creator.username',
+ 'creator.realName',
+ ])
+ .where('case.id = :id', { id })
+ .getOne();
+
+ if (!caseEntity) {
+ throw new NotFoundException('案例不存在');
+ }
+
+ // 增加浏览量
+ await this.caseRepository.update(id, { views: () => 'views + 1' });
+
+ return caseEntity;
+ }
+
+ async update(id: number, updateCaseDto: UpdateCaseDto, userId: number, userRole: string): Promise {
+ const caseEntity = await this.caseRepository.findOne({
+ where: { id },
+ relations: ['creator'],
+ });
+
+ if (!caseEntity) {
+ throw new NotFoundException('案例不存在');
+ }
+
+ // 检查权限:只有创建者或管理员可以修改
+ if (caseEntity.createdBy !== userId && userRole !== 'admin') {
+ throw new ForbiddenException('没有权限修改此案例');
+ }
+
+ await this.caseRepository.update(id, updateCaseDto);
+ return this.findOne(id);
+ }
+
+ async remove(id: number, userId: number, userRole: string): Promise {
+ const caseEntity = await this.caseRepository.findOne({
+ where: { id },
+ });
+
+ if (!caseEntity) {
+ throw new NotFoundException('案例不存在');
+ }
+
+ // 检查权限:只有创建者或管理员可以删除
+ if (caseEntity.createdBy !== userId && userRole !== 'admin') {
+ throw new ForbiddenException('没有权限删除此案例');
+ }
+
+ await this.caseRepository.remove(caseEntity);
+ }
+
+ async like(id: number): Promise<{ likes: number }> {
+ const caseEntity = await this.caseRepository.findOne({ where: { id } });
+ if (!caseEntity) {
+ throw new NotFoundException('案例不存在');
+ }
+
+ await this.caseRepository.update(id, { likes: () => 'likes + 1' });
+ const updatedCase = await this.caseRepository.findOne({ where: { id } });
+
+ if (!updatedCase) {
+ throw new NotFoundException('更新后案例不存在');
+ }
+
+ return { likes: updatedCase.likes };
+ }
+
+ async getMyCases(userId: number, query: QueryCaseDto) {
+ const { serviceType, status, page = 1, limit = 10 } = query;
+ const queryBuilder = this.caseRepository
+ .createQueryBuilder('case')
+ .leftJoinAndSelect('case.creator', 'creator')
+ .where('case.createdBy = :userId', { userId })
+ .select([
+ 'case.id',
+ 'case.title',
+ 'case.description',
+ 'case.beforeImages',
+ 'case.afterImages',
+ 'case.serviceType',
+ 'case.price',
+ 'case.materials',
+ 'case.duration',
+ 'case.status',
+ 'case.views',
+ 'case.likes',
+ 'case.createdAt',
+ 'case.updatedAt',
+ 'creator.id',
+ 'creator.username',
+ 'creator.realName',
+ ]);
+
+ if (serviceType) {
+ queryBuilder.andWhere('case.serviceType = :serviceType', { serviceType });
+ }
+
+ if (status) {
+ queryBuilder.andWhere('case.status = :status', { status });
+ }
+
+ const skip = (page - 1) * limit;
+ queryBuilder.skip(skip).take(limit);
+ queryBuilder.orderBy('case.createdAt', 'DESC');
+
+ const [items, total] = await queryBuilder.getManyAndCount();
+
+ return {
+ items,
+ total,
+ page,
+ limit,
+ totalPages: Math.ceil(total / limit),
+ };
+ }
+}
\ No newline at end of file
diff --git a/后端/src/case/dto/case.dto.ts b/后端/src/case/dto/case.dto.ts
new file mode 100644
index 0000000..637741c
--- /dev/null
+++ b/后端/src/case/dto/case.dto.ts
@@ -0,0 +1,103 @@
+import { IsNotEmpty, IsString, IsOptional, IsEnum, IsNumber, IsArray, Min } from 'class-validator';
+import { Type } from 'class-transformer';
+
+export class CreateCaseDto {
+ @IsNotEmpty({ message: '标题不能为空' })
+ @IsString()
+ title: string;
+
+ @IsNotEmpty({ message: '描述不能为空' })
+ @IsString()
+ description: string;
+
+ @IsOptional()
+ @IsArray()
+ beforeImages?: string[];
+
+ @IsOptional()
+ @IsArray()
+ afterImages?: string[];
+
+ @IsEnum(['fabric', 'leather', 'cleaning', 'repair', 'custom'])
+ serviceType: string;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(0)
+ price?: number;
+
+ @IsOptional()
+ @IsString()
+ materials?: string;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(0)
+ duration?: number;
+}
+
+export class UpdateCaseDto {
+ @IsOptional()
+ @IsString()
+ title?: string;
+
+ @IsOptional()
+ @IsString()
+ description?: string;
+
+ @IsOptional()
+ @IsArray()
+ beforeImages?: string[];
+
+ @IsOptional()
+ @IsArray()
+ afterImages?: string[];
+
+ @IsOptional()
+ @IsEnum(['fabric', 'leather', 'cleaning', 'repair', 'custom'])
+ serviceType?: string;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(0)
+ price?: number;
+
+ @IsOptional()
+ @IsString()
+ materials?: string;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(0)
+ duration?: number;
+
+ @IsOptional()
+ @IsEnum(['draft', 'published', 'archived'])
+ status?: string;
+}
+
+export class QueryCaseDto {
+ @IsOptional()
+ @IsEnum(['fabric', 'leather', 'cleaning', 'repair', 'custom'])
+ serviceType?: string;
+
+ @IsOptional()
+ @IsEnum(['draft', 'published', 'archived'])
+ status?: string = 'published';
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(1)
+ page?: number = 1;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(1)
+ limit?: number = 10;
+}
\ No newline at end of file
diff --git a/后端/src/config/database.config.ts b/后端/src/config/database.config.ts
new file mode 100644
index 0000000..4f8c092
--- /dev/null
+++ b/后端/src/config/database.config.ts
@@ -0,0 +1,15 @@
+import { registerAs } from '@nestjs/config';
+
+export default registerAs('database', () => ({
+ type: 'mysql',
+ host: process.env.DB_HOST || 'localhost',
+ port: parseInt(process.env.DB_PORT || '3306', 10),
+ username: process.env.DB_USER || 'root',
+ password: process.env.DB_PASS || '',
+ database: process.env.DB_NAME || 'sofa_renovation',
+ autoLoadEntities: true,
+ synchronize: process.env.NODE_ENV !== 'production', // 生产环境请设置为false,使用迁移
+ logging: process.env.NODE_ENV === 'development',
+ charset: 'utf8mb4',
+ timezone: '+08:00',
+}));
\ No newline at end of file
diff --git a/后端/src/config/jwt.config.ts b/后端/src/config/jwt.config.ts
new file mode 100644
index 0000000..bc7ebcb
--- /dev/null
+++ b/后端/src/config/jwt.config.ts
@@ -0,0 +1,10 @@
+import { registerAs } from '@nestjs/config';
+
+export default registerAs('jwt', () => ({
+ secret: process.env.JWT_SECRET || 'your-secret-key',
+ signOptions: {
+ expiresIn: process.env.JWT_EXPIRES_IN || '7d',
+ },
+ refreshSecret: process.env.JWT_REFRESH_SECRET || 'your-refresh-secret',
+ refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '30d',
+}));
\ No newline at end of file
diff --git a/后端/src/entities/booking.entity.ts b/后端/src/entities/booking.entity.ts
new file mode 100644
index 0000000..32d4384
--- /dev/null
+++ b/后端/src/entities/booking.entity.ts
@@ -0,0 +1,73 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { User } from './user.entity';
+import { Service } from './service.entity';
+
+@Entity('bookings')
+export class Booking {
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @Column({ length: 32, unique: true })
+ bookingNumber: string; // 预约编号
+
+ @ManyToOne(() => User)
+ @JoinColumn({ name: 'customerId' })
+ customer: User;
+
+ @Column()
+ customerId: number;
+
+ @ManyToOne(() => Service)
+ @JoinColumn({ name: 'serviceId' })
+ service: Service;
+
+ @Column()
+ serviceId: number;
+
+ @Column({ length: 50 })
+ contactName: string;
+
+ @Column({ length: 20 })
+ contactPhone: string;
+
+ @Column({ type: 'text' })
+ address: string;
+
+ @Column({ type: 'datetime' })
+ appointmentTime: Date;
+
+ @Column({ type: 'text', nullable: true })
+ requirements: string; // 特殊要求
+
+ @Column({ type: 'json', nullable: true })
+ images: string[]; // 沙发现状图片
+
+ @Column({
+ type: 'enum',
+ enum: ['pending', 'confirmed', 'in_progress', 'completed', 'cancelled'],
+ default: 'pending'
+ })
+ status: string;
+
+ @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+ quotedPrice: number; // 报价
+
+ @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+ finalPrice: number; // 最终价格
+
+ @Column({ type: 'text', nullable: true })
+ notes: string; // 备注
+
+ @ManyToOne(() => User, { nullable: true })
+ @JoinColumn({ name: 'assignedWorkerId' })
+ assignedWorker: User;
+
+ @Column({ nullable: true })
+ assignedWorkerId: number;
+
+ @CreateDateColumn()
+ createdAt: Date;
+
+ @UpdateDateColumn()
+ updatedAt: Date;
+}
\ No newline at end of file
diff --git a/后端/src/entities/case.entity.ts b/后端/src/entities/case.entity.ts
new file mode 100644
index 0000000..5bbcd9d
--- /dev/null
+++ b/后端/src/entities/case.entity.ts
@@ -0,0 +1,62 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm';
+import { User } from './user.entity';
+
+@Entity('cases')
+export class Case {
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @Column({ length: 100 })
+ title: string;
+
+ @Column({ type: 'text' })
+ description: string;
+
+ @Column({ type: 'json', nullable: true })
+ beforeImages: string[];
+
+ @Column({ type: 'json', nullable: true })
+ afterImages: string[];
+
+ @Column({
+ type: 'enum',
+ enum: ['fabric', 'leather', 'cleaning', 'repair', 'custom'],
+ default: 'fabric'
+ })
+ serviceType: string;
+
+ @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+ price: number;
+
+ @Column({ type: 'text', nullable: true })
+ materials: string;
+
+ @Column({ type: 'int', default: 0 })
+ duration: number; // 工作天数
+
+ @Column({
+ type: 'enum',
+ enum: ['draft', 'published', 'archived'],
+ default: 'published'
+ })
+ status: string;
+
+ @Column({ type: 'int', default: 0 })
+ views: number;
+
+ @Column({ type: 'int', default: 0 })
+ likes: number;
+
+ @ManyToOne(() => User)
+ @JoinColumn({ name: 'createdBy' })
+ creator: User;
+
+ @Column({ nullable: true })
+ createdBy: number;
+
+ @CreateDateColumn()
+ createdAt: Date;
+
+ @UpdateDateColumn()
+ updatedAt: Date;
+}
\ No newline at end of file
diff --git a/后端/src/entities/service.entity.ts b/后端/src/entities/service.entity.ts
new file mode 100644
index 0000000..88cbd02
--- /dev/null
+++ b/后端/src/entities/service.entity.ts
@@ -0,0 +1,48 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+
+@Entity('services')
+export class Service {
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @Column({ length: 100 })
+ name: string;
+
+ @Column({ type: 'text' })
+ description: string;
+
+ @Column({
+ type: 'enum',
+ enum: ['fabric', 'leather', 'cleaning', 'repair', 'custom'],
+ unique: true
+ })
+ type: string;
+
+ @Column({ type: 'decimal', precision: 10, scale: 2 })
+ basePrice: number;
+
+ @Column({ type: 'json', nullable: true })
+ images: string[];
+
+ @Column({ type: 'json', nullable: true })
+ features: string[]; // 服务特点
+
+ @Column({ type: 'int', default: 1 })
+ estimatedDays: number; // 预估工期
+
+ @Column({
+ type: 'enum',
+ enum: ['active', 'inactive'],
+ default: 'active'
+ })
+ status: string;
+
+ @Column({ type: 'int', default: 0 })
+ sortOrder: number;
+
+ @CreateDateColumn()
+ createdAt: Date;
+
+ @UpdateDateColumn()
+ updatedAt: Date;
+}
\ No newline at end of file
diff --git a/后端/src/entities/user.entity.ts b/后端/src/entities/user.entity.ts
new file mode 100644
index 0000000..01580cf
--- /dev/null
+++ b/后端/src/entities/user.entity.ts
@@ -0,0 +1,55 @@
+import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
+
+@Entity('users')
+export class User {
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @Column({ unique: true, length: 50, nullable: true })
+ username: string;
+
+ @Column({ unique: true, length: 100, nullable: true })
+ email: string;
+
+ @Column({ select: false, nullable: true })
+ password: string;
+
+ @Column({ length: 50, nullable: true })
+ realName: string;
+
+ @Column({ length: 20, nullable: true })
+ phone: string;
+
+ @Column({ type: 'text', nullable: true })
+ avatar: string;
+
+ // 微信小程序相关字段
+ @Column({ unique: true, length: 50, nullable: true })
+ openid: string; // 微信openid
+
+ @Column({ length: 100, nullable: true })
+ unionid: string; // 微信unionid
+
+ @Column({ type: 'text', nullable: true })
+ sessionKey: string; // 微信session_key
+
+ @Column({
+ type: 'enum',
+ enum: ['admin', 'customer', 'worker'],
+ default: 'customer'
+ })
+ role: string;
+
+ @Column({
+ type: 'enum',
+ enum: ['active', 'inactive', 'banned'],
+ default: 'active'
+ })
+ status: string;
+
+ @CreateDateColumn()
+ createdAt: Date;
+
+ @UpdateDateColumn()
+ updatedAt: Date;
+}
\ No newline at end of file
diff --git a/后端/src/main.ts b/后端/src/main.ts
new file mode 100644
index 0000000..3a2e45b
--- /dev/null
+++ b/后端/src/main.ts
@@ -0,0 +1,52 @@
+import { NestFactory } from '@nestjs/core';
+import { ValidationPipe } from '@nestjs/common';
+import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
+import { AppModule } from './app.module';
+
+async function bootstrap() {
+ const app = await NestFactory.create(AppModule);
+
+ // 启用全局验证管道
+ app.useGlobalPipes(new ValidationPipe({
+ transform: true,
+ whitelist: true,
+ forbidNonWhitelisted: true,
+ }));
+
+ // 启用 CORS
+ app.enableCors({
+ origin: process.env.FRONTEND_URL || true,
+ methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
+ credentials: true,
+ });
+
+ // API 前缀
+ app.setGlobalPrefix('api');
+
+ // Swagger 文档配置
+ const config = new DocumentBuilder()
+ .setTitle('优艺家沙发翻新 API')
+ .setDescription('沙发翻新小程序后端API文档')
+ .setVersion('1.0')
+ .addBearerAuth()
+ .addTag('认证', '用户认证相关接口')
+ .addTag('用户管理', '用户管理相关接口')
+ .addTag('案例管理', '案例展示相关接口')
+ .addTag('服务管理', '服务项目相关接口')
+ .addTag('预约管理', '预约订单相关接口')
+ .build();
+
+ const document = SwaggerModule.createDocument(app, config);
+ SwaggerModule.setup('docs', app, document, {
+ swaggerOptions: {
+ persistAuthorization: true,
+ },
+ });
+
+ const port = process.env.PORT || 3000;
+ await app.listen(port);
+
+ console.log(`🚀 Application is running on: http://localhost:${port}`);
+ console.log(`📚 API Documentation: http://localhost:${port}/docs`);
+}
+bootstrap();
diff --git a/后端/src/service/dto/service.dto.ts b/后端/src/service/dto/service.dto.ts
new file mode 100644
index 0000000..fd9d596
--- /dev/null
+++ b/后端/src/service/dto/service.dto.ts
@@ -0,0 +1,93 @@
+import { IsNotEmpty, IsString, IsOptional, IsEnum, IsNumber, IsArray, Min } from 'class-validator';
+import { Type } from 'class-transformer';
+
+export class CreateServiceDto {
+ @IsNotEmpty({ message: '服务名称不能为空' })
+ @IsString()
+ name: string;
+
+ @IsNotEmpty({ message: '服务描述不能为空' })
+ @IsString()
+ description: string;
+
+ @IsEnum(['fabric', 'leather', 'cleaning', 'repair', 'custom'])
+ type: string;
+
+ @IsNotEmpty({ message: '基础价格不能为空' })
+ @Type(() => Number)
+ @IsNumber()
+ @Min(0)
+ basePrice: number;
+
+ @IsOptional()
+ @IsArray()
+ images?: string[];
+
+ @IsOptional()
+ @IsArray()
+ features?: string[];
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(1)
+ estimatedDays?: number;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ sortOrder?: number;
+}
+
+export class UpdateServiceDto {
+ @IsOptional()
+ @IsString()
+ name?: string;
+
+ @IsOptional()
+ @IsString()
+ description?: string;
+
+ @IsOptional()
+ @IsEnum(['fabric', 'leather', 'cleaning', 'repair', 'custom'])
+ type?: string;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(0)
+ basePrice?: number;
+
+ @IsOptional()
+ @IsArray()
+ images?: string[];
+
+ @IsOptional()
+ @IsArray()
+ features?: string[];
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ @Min(1)
+ estimatedDays?: number;
+
+ @IsOptional()
+ @IsEnum(['active', 'inactive'])
+ status?: string;
+
+ @IsOptional()
+ @Type(() => Number)
+ @IsNumber()
+ sortOrder?: number;
+}
+
+export class QueryServiceDto {
+ @IsOptional()
+ @IsEnum(['fabric', 'leather', 'cleaning', 'repair', 'custom'])
+ type?: string;
+
+ @IsOptional()
+ @IsEnum(['active', 'inactive'])
+ status?: string = 'active';
+}
\ No newline at end of file
diff --git a/后端/src/service/service.controller.ts b/后端/src/service/service.controller.ts
new file mode 100644
index 0000000..ca91f88
--- /dev/null
+++ b/后端/src/service/service.controller.ts
@@ -0,0 +1,98 @@
+import { Controller, Get, Post, Body, Patch, Param, Delete, Query, UseGuards } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger';
+import { ServiceService } from './service.service';
+import { CreateServiceDto, UpdateServiceDto, QueryServiceDto } from './dto/service.dto';
+import { Roles } from '../auth/guards/roles.decorator';
+import { Public } from '../auth/guards/public.decorator';
+
+@ApiTags('服务管理')
+@Controller('services')
+export class ServiceController {
+ constructor(private readonly serviceService: ServiceService) {}
+
+ @ApiBearerAuth()
+ @Post()
+ @Roles('admin')
+ @ApiOperation({ summary: '创建服务(管理员)' })
+ @ApiResponse({ status: 201, description: '创建成功' })
+ @ApiResponse({ status: 409, description: '服务类型已存在' })
+ create(@Body() createServiceDto: CreateServiceDto) {
+ return this.serviceService.create(createServiceDto);
+ }
+
+ @Public()
+ @Get()
+ @ApiOperation({ summary: '获取服务列表' })
+ @ApiQuery({ name: 'type', required: false, enum: ['fabric', 'leather', 'cleaning', 'repair', 'custom'] })
+ @ApiQuery({ name: 'status', required: false, enum: ['active', 'inactive'], description: '默认为active' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ findAll(@Query() query: QueryServiceDto) {
+ return this.serviceService.findAll(query);
+ }
+
+ @Public()
+ @Get('active')
+ @ApiOperation({ summary: '获取所有有效服务' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ getActiveServices() {
+ return this.serviceService.getActiveServices();
+ }
+
+ @Public()
+ @Get(':id')
+ @ApiOperation({ summary: '根据ID获取服务详情' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ @ApiResponse({ status: 404, description: '服务不存在' })
+ findOne(@Param('id') id: string) {
+ return this.serviceService.findOne(+id);
+ }
+
+ @Public()
+ @Get('type/:type')
+ @ApiOperation({ summary: '根据类型获取服务' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ @ApiResponse({ status: 404, description: '服务类型不存在' })
+ findByType(@Param('type') type: string) {
+ return this.serviceService.findByType(type);
+ }
+
+ @ApiBearerAuth()
+ @Patch(':id')
+ @Roles('admin')
+ @ApiOperation({ summary: '更新服务(管理员)' })
+ @ApiResponse({ status: 200, description: '更新成功' })
+ @ApiResponse({ status: 404, description: '服务不存在' })
+ @ApiResponse({ status: 409, description: '服务类型已存在' })
+ update(@Param('id') id: string, @Body() updateServiceDto: UpdateServiceDto) {
+ return this.serviceService.update(+id, updateServiceDto);
+ }
+
+ @ApiBearerAuth()
+ @Delete(':id')
+ @Roles('admin')
+ @ApiOperation({ summary: '删除服务(管理员)' })
+ @ApiResponse({ status: 200, description: '删除成功' })
+ @ApiResponse({ status: 404, description: '服务不存在' })
+ remove(@Param('id') id: string) {
+ return this.serviceService.remove(+id);
+ }
+
+ @ApiBearerAuth()
+ @Patch(':id/toggle-status')
+ @Roles('admin')
+ @ApiOperation({ summary: '切换服务状态(管理员)' })
+ @ApiResponse({ status: 200, description: '状态切换成功' })
+ @ApiResponse({ status: 404, description: '服务不存在' })
+ toggleStatus(@Param('id') id: string) {
+ return this.serviceService.toggleStatus(+id);
+ }
+
+ @ApiBearerAuth()
+ @Patch('sort-order')
+ @Roles('admin')
+ @ApiOperation({ summary: '更新服务排序(管理员)' })
+ @ApiResponse({ status: 200, description: '排序更新成功' })
+ updateSortOrder(@Body() serviceOrders: { id: number; sortOrder: number }[]) {
+ return this.serviceService.updateSortOrder(serviceOrders);
+ }
+}
\ No newline at end of file
diff --git a/后端/src/service/service.module.ts b/后端/src/service/service.module.ts
new file mode 100644
index 0000000..655c6d4
--- /dev/null
+++ b/后端/src/service/service.module.ts
@@ -0,0 +1,13 @@
+import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ServiceService } from './service.service';
+import { ServiceController } from './service.controller';
+import { Service } from '../entities/service.entity';
+
+@Module({
+ imports: [TypeOrmModule.forFeature([Service])],
+ controllers: [ServiceController],
+ providers: [ServiceService],
+ exports: [ServiceService],
+})
+export class ServiceModule {}
\ No newline at end of file
diff --git a/后端/src/service/service.service.ts b/后端/src/service/service.service.ts
new file mode 100644
index 0000000..c6af16b
--- /dev/null
+++ b/后端/src/service/service.service.ts
@@ -0,0 +1,117 @@
+import { Injectable, NotFoundException, ConflictException } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { Service } from '../entities/service.entity';
+import { CreateServiceDto, UpdateServiceDto, QueryServiceDto } from './dto/service.dto';
+
+@Injectable()
+export class ServiceService {
+ constructor(
+ @InjectRepository(Service)
+ private serviceRepository: Repository,
+ ) {}
+
+ async create(createServiceDto: CreateServiceDto): Promise {
+ // 检查服务类型是否已存在
+ const existingService = await this.serviceRepository.findOne({
+ where: { type: createServiceDto.type }
+ });
+
+ if (existingService) {
+ throw new ConflictException('该服务类型已存在');
+ }
+
+ const service = this.serviceRepository.create({
+ ...createServiceDto,
+ status: 'active',
+ });
+
+ return this.serviceRepository.save(service);
+ }
+
+ async findAll(query: QueryServiceDto): Promise {
+ const { type, status } = query;
+ const queryBuilder = this.serviceRepository.createQueryBuilder('service');
+
+ if (type) {
+ queryBuilder.andWhere('service.type = :type', { type });
+ }
+
+ if (status) {
+ queryBuilder.andWhere('service.status = :status', { status });
+ }
+
+ queryBuilder.orderBy('service.sortOrder', 'ASC');
+ queryBuilder.addOrderBy('service.createdAt', 'DESC');
+
+ return queryBuilder.getMany();
+ }
+
+ async findOne(id: number): Promise {
+ const service = await this.serviceRepository.findOne({
+ where: { id }
+ });
+
+ if (!service) {
+ throw new NotFoundException('服务不存在');
+ }
+
+ return service;
+ }
+
+ async findByType(type: string): Promise {
+ const service = await this.serviceRepository.findOne({
+ where: { type }
+ });
+
+ if (!service) {
+ throw new NotFoundException('服务类型不存在');
+ }
+
+ return service;
+ }
+
+ async update(id: number, updateServiceDto: UpdateServiceDto): Promise {
+ const service = await this.findOne(id);
+
+ // 如果要更新服务类型,检查新类型是否已被其他服务使用
+ if (updateServiceDto.type && updateServiceDto.type !== service.type) {
+ const existingService = await this.serviceRepository.findOne({
+ where: { type: updateServiceDto.type }
+ });
+
+ if (existingService) {
+ throw new ConflictException('该服务类型已存在');
+ }
+ }
+
+ await this.serviceRepository.update(id, updateServiceDto);
+ return this.findOne(id);
+ }
+
+ async remove(id: number): Promise {
+ const service = await this.findOne(id);
+ await this.serviceRepository.remove(service);
+ }
+
+ async getActiveServices(): Promise {
+ return this.serviceRepository.find({
+ where: { status: 'active' },
+ order: { sortOrder: 'ASC', createdAt: 'DESC' }
+ });
+ }
+
+ async updateSortOrder(serviceOrders: { id: number; sortOrder: number }[]): Promise {
+ for (const { id, sortOrder } of serviceOrders) {
+ await this.serviceRepository.update(id, { sortOrder });
+ }
+ }
+
+ async toggleStatus(id: number): Promise {
+ const service = await this.findOne(id);
+ const newStatus = service.status === 'active' ? 'inactive' : 'active';
+
+ await this.serviceRepository.update(id, { status: newStatus });
+ return this.findOne(id);
+ }
+}
\ No newline at end of file
diff --git a/后端/src/user/dto/user.dto.ts b/后端/src/user/dto/user.dto.ts
new file mode 100644
index 0000000..e4a09b8
--- /dev/null
+++ b/后端/src/user/dto/user.dto.ts
@@ -0,0 +1,64 @@
+import { IsOptional, IsString, IsEmail, IsEnum } from 'class-validator';
+
+export class CreateUserDto {
+ @IsString()
+ username: string;
+
+ @IsEmail()
+ email: string;
+
+ @IsOptional()
+ @IsString()
+ password?: string;
+
+ @IsOptional()
+ @IsString()
+ realName?: string;
+
+ @IsOptional()
+ @IsString()
+ phone?: string;
+
+ @IsOptional()
+ @IsString()
+ avatar?: string;
+
+ @IsOptional()
+ @IsEnum(['admin', 'customer', 'worker'])
+ role?: string;
+
+ @IsOptional()
+ @IsEnum(['active', 'inactive', 'banned'])
+ status?: string;
+
+ // 微信相关字段
+ @IsOptional()
+ @IsString()
+ openid?: string;
+
+ @IsOptional()
+ @IsString()
+ unionid?: string;
+
+ @IsOptional()
+ @IsString()
+ sessionKey?: string;
+}
+
+export class UpdateUserDto {
+ @IsOptional()
+ @IsString()
+ realName?: string;
+
+ @IsOptional()
+ @IsString()
+ phone?: string;
+
+ @IsOptional()
+ @IsString()
+ avatar?: string;
+
+ @IsOptional()
+ @IsEnum(['active', 'inactive', 'banned'])
+ status?: string;
+}
\ No newline at end of file
diff --git a/后端/src/user/user.controller.ts b/后端/src/user/user.controller.ts
new file mode 100644
index 0000000..41eb04d
--- /dev/null
+++ b/后端/src/user/user.controller.ts
@@ -0,0 +1,71 @@
+import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth } from '@nestjs/swagger';
+import { UserService } from './user.service';
+import { CreateUserDto, UpdateUserDto } from './dto/user.dto';
+import type { CurrentUserData } from '../auth/decorators/current-user.decorator';
+import { CurrentUser } from '../auth/decorators/current-user.decorator';
+import { Roles } from '../auth/guards/roles.decorator';
+
+@ApiTags('用户管理')
+@ApiBearerAuth()
+@Controller('users')
+export class UserController {
+ constructor(private readonly userService: UserService) {}
+
+ @Post()
+ @Roles('admin')
+ @ApiOperation({ summary: '创建用户(管理员)' })
+ @ApiResponse({ status: 201, description: '创建成功' })
+ create(@Body() createUserDto: CreateUserDto) {
+ return this.userService.create(createUserDto);
+ }
+
+ @Get()
+ @Roles('admin')
+ @ApiOperation({ summary: '获取所有用户(管理员)' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ findAll() {
+ return this.userService.findAll();
+ }
+
+ @Get('profile')
+ @ApiOperation({ summary: '获取当前用户信息' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ getProfile(@CurrentUser() user: CurrentUserData) {
+ return this.userService.getUserProfile(user.userId);
+ }
+
+ @Get(':id')
+ @Roles('admin')
+ @ApiOperation({ summary: '根据ID获取用户(管理员)' })
+ @ApiResponse({ status: 200, description: '获取成功' })
+ @ApiResponse({ status: 404, description: '用户不存在' })
+ findOne(@Param('id') id: string) {
+ return this.userService.findById(+id);
+ }
+
+ @Patch('profile')
+ @ApiOperation({ summary: '更新当前用户信息' })
+ @ApiResponse({ status: 200, description: '更新成功' })
+ updateProfile(@CurrentUser() user: CurrentUserData, @Body() updateUserDto: UpdateUserDto) {
+ return this.userService.update(user.userId, updateUserDto);
+ }
+
+ @Patch(':id')
+ @Roles('admin')
+ @ApiOperation({ summary: '更新用户信息(管理员)' })
+ @ApiResponse({ status: 200, description: '更新成功' })
+ @ApiResponse({ status: 404, description: '用户不存在' })
+ update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
+ return this.userService.update(+id, updateUserDto);
+ }
+
+ @Delete(':id')
+ @Roles('admin')
+ @ApiOperation({ summary: '删除用户(管理员)' })
+ @ApiResponse({ status: 200, description: '删除成功' })
+ @ApiResponse({ status: 404, description: '用户不存在' })
+ remove(@Param('id') id: string) {
+ return this.userService.remove(+id);
+ }
+}
\ No newline at end of file
diff --git a/后端/src/user/user.module.ts b/后端/src/user/user.module.ts
new file mode 100644
index 0000000..a635901
--- /dev/null
+++ b/后端/src/user/user.module.ts
@@ -0,0 +1,13 @@
+import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { UserService } from './user.service';
+import { UserController } from './user.controller';
+import { User } from '../entities/user.entity';
+
+@Module({
+ imports: [TypeOrmModule.forFeature([User])],
+ controllers: [UserController],
+ providers: [UserService],
+ exports: [UserService],
+})
+export class UserModule {}
\ No newline at end of file
diff --git a/后端/src/user/user.service.ts b/后端/src/user/user.service.ts
new file mode 100644
index 0000000..6421aa3
--- /dev/null
+++ b/后端/src/user/user.service.ts
@@ -0,0 +1,100 @@
+import { Injectable, NotFoundException } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { User } from '../entities/user.entity';
+import { CreateUserDto, UpdateUserDto } from './dto/user.dto';
+
+@Injectable()
+export class UserService {
+ constructor(
+ @InjectRepository(User)
+ private userRepository: Repository,
+ ) {}
+
+ async create(createUserDto: CreateUserDto): Promise {
+ const user = this.userRepository.create(createUserDto);
+ return this.userRepository.save(user);
+ }
+
+ async findAll(): Promise {
+ return this.userRepository.find({
+ select: ['id', 'username', 'email', 'realName', 'phone', 'avatar', 'role', 'status', 'createdAt', 'updatedAt'],
+ });
+ }
+
+ async findById(id: number): Promise {
+ return this.userRepository.findOne({
+ where: { id },
+ select: ['id', 'username', 'email', 'realName', 'phone', 'avatar', 'role', 'status', 'createdAt', 'updatedAt'],
+ });
+ }
+
+ async findByUsername(username: string): Promise {
+ return this.userRepository.findOne({
+ where: { username },
+ select: ['id', 'username', 'email', 'realName', 'phone', 'avatar', 'role', 'status', 'createdAt', 'updatedAt'],
+ });
+ }
+
+ async findByEmail(email: string): Promise {
+ return this.userRepository.findOne({
+ where: { email },
+ select: ['id', 'username', 'email', 'realName', 'phone', 'avatar', 'role', 'status', 'createdAt', 'updatedAt'],
+ });
+ }
+
+ async findByUsernameWithPassword(username: string): Promise {
+ return this.userRepository.findOne({
+ where: { username },
+ select: ['id', 'username', 'email', 'password', 'realName', 'phone', 'avatar', 'role', 'status'],
+ });
+ }
+
+ async findByEmailWithPassword(email: string): Promise {
+ return this.userRepository.findOne({
+ where: { email },
+ select: ['id', 'username', 'email', 'password', 'realName', 'phone', 'avatar', 'role', 'status'],
+ });
+ }
+
+ async update(id: number, updateUserDto: UpdateUserDto): Promise {
+ const user = await this.findById(id);
+ if (!user) {
+ throw new NotFoundException('用户不存在');
+ }
+
+ await this.userRepository.update(id, updateUserDto);
+ const updatedUser = await this.findById(id);
+ if (!updatedUser) {
+ throw new NotFoundException('更新后用户不存在');
+ }
+ return updatedUser;
+ }
+
+ async remove(id: number): Promise {
+ const user = await this.findById(id);
+ if (!user) {
+ throw new NotFoundException('用户不存在');
+ }
+ await this.userRepository.remove(user);
+ }
+
+ async getUserProfile(id: number): Promise {
+ const user = await this.findById(id);
+ if (!user) {
+ throw new NotFoundException('用户不存在');
+ }
+ return user;
+ }
+
+ async findByOpenid(openid: string): Promise {
+ return this.userRepository.findOne({
+ where: { openid },
+ select: ['id', 'username', 'email', 'realName', 'phone', 'avatar', 'role', 'status', 'openid', 'unionid', 'createdAt', 'updatedAt'],
+ });
+ }
+
+ async updateSessionKey(userId: number, sessionKey: string): Promise {
+ await this.userRepository.update(userId, { sessionKey });
+ }
+}
\ No newline at end of file
diff --git a/后端/test/app.e2e-spec.ts b/后端/test/app.e2e-spec.ts
new file mode 100644
index 0000000..36852c5
--- /dev/null
+++ b/后端/test/app.e2e-spec.ts
@@ -0,0 +1,25 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { INestApplication } from '@nestjs/common';
+import request from 'supertest';
+import { App } from 'supertest/types';
+import { AppModule } from './../src/app.module';
+
+describe('AppController (e2e)', () => {
+ let app: INestApplication;
+
+ beforeEach(async () => {
+ const moduleFixture: TestingModule = await Test.createTestingModule({
+ imports: [AppModule],
+ }).compile();
+
+ app = moduleFixture.createNestApplication();
+ await app.init();
+ });
+
+ it('/ (GET)', () => {
+ return request(app.getHttpServer())
+ .get('/')
+ .expect(200)
+ .expect('Hello World!');
+ });
+});
diff --git a/后端/test/jest-e2e.json b/后端/test/jest-e2e.json
new file mode 100644
index 0000000..e9d912f
--- /dev/null
+++ b/后端/test/jest-e2e.json
@@ -0,0 +1,9 @@
+{
+ "moduleFileExtensions": ["js", "json", "ts"],
+ "rootDir": ".",
+ "testEnvironment": "node",
+ "testRegex": ".e2e-spec.ts$",
+ "transform": {
+ "^.+\\.(t|j)s$": "ts-jest"
+ }
+}
diff --git a/后端/tsconfig.build.json b/后端/tsconfig.build.json
new file mode 100644
index 0000000..64f86c6
--- /dev/null
+++ b/后端/tsconfig.build.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig.json",
+ "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
+}
diff --git a/后端/tsconfig.json b/后端/tsconfig.json
new file mode 100644
index 0000000..aba29b0
--- /dev/null
+++ b/后端/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "module": "nodenext",
+ "moduleResolution": "nodenext",
+ "resolvePackageJsonExports": true,
+ "esModuleInterop": true,
+ "isolatedModules": true,
+ "declaration": true,
+ "removeComments": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "allowSyntheticDefaultImports": true,
+ "target": "ES2023",
+ "sourceMap": true,
+ "outDir": "./dist",
+ "baseUrl": "./",
+ "incremental": true,
+ "skipLibCheck": true,
+ "strictNullChecks": true,
+ "forceConsistentCasingInFileNames": true,
+ "noImplicitAny": false,
+ "strictBindCallApply": false,
+ "noFallthroughCasesInSwitch": false
+ }
+}