diff --git a/README.md b/README.md
index 08e7ebc..9175942 100644
--- a/README.md
+++ b/README.md
@@ -9,33 +9,9 @@ Ragflow-Plus,该名字不是说比 Ragflow 项目牛的意思,而是对标 D
## 新增功能介绍
-### 一. 用户批量注册/批量加入团队
-隐藏了原本用户注册的功能,改为管理员通过后台批量注册,并加入管理员团队,可共享团队知识库及默认模型配置
-
-使用方式:
-1. python环境安装依赖:
-
-参考python版本:python == 3.10.16
-```python
-pip install mysql-connector-python
-pip install pycryptodomex
-pip install werkzeug
-```
-
-2. 修改`python_sql\add.json`文件内容:
-
-- student_id 为 待添加用户学号
-- tenant_id 为 共享知识库的队长id,需要连接数据库查看
-
-3. 执行批量插入操作:
-
-```python
-python python_sql/add_sql_final.py
-```
-
-默认用户名为 `学号@xidian.cn`
-默认密码为 `学号`
+### 一. 用户后台管理系统
+移除原登陆页用户注册的通道,搭建用户后台管理系统,可对用户进行管理,包括用户注册、查询、删除、修改等功能。
### 二. 优化对话显示
微调了对话界面的样式,使其观感更为友好
@@ -44,6 +20,9 @@ python python_sql/add_sql_final.py
新增文档撰写全新的交互方式,支持直接导出为 Word 文档
## 使用方式
+
+### 前端文件替换
+
1. 克隆项目
```bash
git clone https://github.com/zstar1003/ragflow-plus.git
@@ -66,6 +45,8 @@ rm -rf /ragflow/web/dist
docker cp dist ragflow-server:/ragflow/web/
```
+### 管理系统运行
+
## Agent功能恢复
由于在我的应用场景中,不需要Agent功能,故隐藏了Agent按钮的入口,如需恢复Agent功能,可修改`web\src\layouts\components\header\index.tsx`,对以下内容取消注释:
@@ -77,23 +58,32 @@ docker cp dist ragflow-server:/ragflow/web/
同时可将排列样式进行重置,以还原原本的样式布局,修改`web\src\layouts\components\header\index.less`文件,替换为ragflow原始样式:`https://github.com/infiniflow/ragflow/blob/main/web/src/layouts/components/header/index.less`
-## TODO
+## Todo List
-- [ ] 用户批量注册可视化后台管理
-
-- [ ] 文档撰写插入图片
+- [x] 搭建用户后台管理
- [ ] 知识库批量上传解析
+- [ ] 文档撰写图表支持
+
## 交流群
如果有其它需求或问题建议,可加入交流群进行讨论
-
-
+
+

+
## License
版权说明:本项目在 Ragflow 项目基础上进行二开,需要遵守 Ragflow 的开源协议,如下
This repository is available under the [Ragflow
- Open Source License](LICENSE), which is essentially Apache 2.0 with a few additional restrictions.
\ No newline at end of file
+ Open Source License](LICENSE), which is essentially Apache 2.0 with a few additional restrictions.
+
+## 鸣谢
+
+本项目基于以下开源项目开发:
+
+- [ragflow](https://github.com/infiniflow/ragflow)
+
+- [v3-admin-vite](https://github.com/un-pany/v3-admin-vite)
\ No newline at end of file
diff --git a/management/Dockerfile b/management/Dockerfile
new file mode 100644
index 0000000..358c027
--- /dev/null
+++ b/management/Dockerfile
@@ -0,0 +1,30 @@
+# 前端构建阶段
+FROM node:18 AS frontend-builder
+WORKDIR /app/frontend
+COPY web /app/frontend
+# 安装 pnpm
+RUN npm install -g pnpm
+# 设置环境变量禁用交互式提示
+ENV CI=true
+# 安装依赖并构建
+RUN pnpm i && pnpm build
+
+# 前端服务阶段
+FROM nginx:alpine AS frontend
+COPY nginx.conf /etc/nginx/conf.d/default.conf
+COPY --from=frontend-builder /app/frontend/dist /usr/share/nginx/html
+# 暴露前端端口
+EXPOSE 80
+CMD ["nginx", "-g", "daemon off;"]
+
+# 后端构建阶段
+FROM python:3.10.16 AS backend
+WORKDIR /app
+COPY server/requirements.txt /app/
+# 安装依赖
+RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
+# 复制后端代码
+COPY server /app
+# 暴露后端端口
+EXPOSE 5000
+CMD ["python", "app.py"]
\ No newline at end of file
diff --git a/management/docker-compose.yml b/management/docker-compose.yml
new file mode 100644
index 0000000..e073099
--- /dev/null
+++ b/management/docker-compose.yml
@@ -0,0 +1,27 @@
+services:
+ frontend:
+ image: zstar1003/ragflowplus-management-web:v0.1.0
+ build:
+ context: .
+ dockerfile: Dockerfile
+ target: frontend
+ ports:
+ - "8080:80"
+ depends_on:
+ - backend
+ environment:
+ - API_URL=http://backend:5000
+
+ backend:
+ image: zstar1003/ragflowplus-management-server:v0.1.0
+ build:
+ context: .
+ dockerfile: Dockerfile
+ target: backend
+ ports:
+ - "5000:5000"
+ environment:
+ - FLASK_ENV=development
+ - CORS_ALLOWED_ORIGINS=http://localhost:8080,http://frontend
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
\ No newline at end of file
diff --git a/management/nginx.conf b/management/nginx.conf
new file mode 100644
index 0000000..e0db9a3
--- /dev/null
+++ b/management/nginx.conf
@@ -0,0 +1,13 @@
+server {
+ listen 80;
+
+ location / {
+ root /usr/share/nginx/html;
+ try_files $uri $uri/ /index.html;
+ }
+
+ location /v3-admin-vite/ {
+ alias /usr/share/nginx/html/;
+ try_files $uri $uri/ /index.html;
+ }
+}
\ No newline at end of file
diff --git a/management/server/app.py b/management/server/app.py
new file mode 100644
index 0000000..b72a63b
--- /dev/null
+++ b/management/server/app.py
@@ -0,0 +1,90 @@
+from flask import Flask, jsonify, request
+from flask_cors import CORS
+import mysql.connector
+import database
+
+app = Flask(__name__)
+# 启用CORS,允许前端访问
+CORS(app, resources={r"/api/*": {"origins": "*"}}, supports_credentials=True)
+
+# 添加 v1 前缀
+@app.route('/api/v1/auth/login', methods=['POST'])
+def login():
+ # 实现登录逻辑
+ return {"code": 0, "data": {"token": "your-token"}, "message": "登录成功"}
+
+
+@app.route('/api/v1/users/me', methods=['GET'])
+def get_current_user():
+ return jsonify({
+ "code": 0,
+ "data": {
+ "username": "admin",
+ "roles": ["admin"]
+ },
+ "message": "获取用户信息成功"
+ })
+
+
+@app.route('/api/v1/users', methods=['GET'])
+def get_users():
+ """获取用户的API端点,支持分页和条件查询"""
+ try:
+ # 获取查询参数
+ current_page = int(request.args.get('currentPage', 1))
+ page_size = int(request.args.get('size', 10))
+ username = request.args.get('username', '')
+ email = request.args.get('email', '')
+
+ # 调用数据库函数获取分页和筛选后的用户数据
+ users, total = database.get_users_with_pagination(current_page, page_size, username, email)
+
+ # 返回符合前端期望格式的数据
+ return jsonify({
+ "code": 0, # 成功状态码
+ "data": {
+ "list": users,
+ "total": total
+ },
+ "message": "获取用户列表成功"
+ })
+ except Exception as e:
+ # 错误处理
+ return jsonify({
+ "code": 500,
+ "message": f"获取用户列表失败: {str(e)}"
+ }), 500
+
+@app.route('/api/v1/users/', methods=['DELETE'])
+def delete_user(user_id):
+ """删除用户的API端点"""
+ database.delete_user(user_id)
+ return jsonify({
+ "code": 0,
+ "message": f"用户 {user_id} 删除成功"
+ })
+
+@app.route('/api/v1/users', methods=['POST'])
+def create_user():
+ """创建用户的API端点"""
+ data = request.json
+ # 创建用户
+ database.create_user(user_data=data)
+ return jsonify({
+ "code": 0,
+ "message": "用户创建成功"
+ })
+
+@app.route('/api/v1/users/', methods=['PUT'])
+def update_user(user_id):
+ """更新用户的API端点"""
+ data = request.json
+ user_id = data.get('id')
+ database.update_user(user_id=user_id, user_data=data)
+ return jsonify({
+ "code": 0,
+ "message": f"用户 {user_id} 更新成功"
+ })
+
+if __name__ == '__main__':
+ app.run(host='0.0.0.0', port=5000, debug=True)
\ No newline at end of file
diff --git a/management/server/database.py b/management/server/database.py
new file mode 100644
index 0000000..09e93b3
--- /dev/null
+++ b/management/server/database.py
@@ -0,0 +1,269 @@
+import mysql.connector
+from utils import generate_uuid, encrypt_password
+from datetime import datetime
+from tabulate import tabulate
+
+# 数据库连接配置
+db_config = {
+ "host": "host.docker.internal",
+ "port": 5455,
+ "user": "root",
+ "password": "infini_rag_flow",
+ "database": "rag_flow",
+}
+
+def get_users_with_pagination(current_page, page_size, username='', email=''):
+ """查询用户信息,支持分页和条件筛选"""
+ try:
+ # 建立数据库连接
+ conn = mysql.connector.connect(**db_config)
+ cursor = conn.cursor(dictionary=True)
+
+ # 构建WHERE子句和参数
+ where_clauses = []
+ params = []
+
+ if username:
+ where_clauses.append("nickname LIKE %s")
+ params.append(f"%{username}%")
+
+ if email:
+ where_clauses.append("email LIKE %s")
+ params.append(f"%{email}%")
+
+ # 组合WHERE子句
+ where_sql = " AND ".join(where_clauses) if where_clauses else "1=1"
+
+ # 查询总记录数
+ count_sql = f"SELECT COUNT(*) as total FROM user WHERE {where_sql}"
+ cursor.execute(count_sql, params)
+ total = cursor.fetchone()['total']
+
+ # 计算分页偏移量
+ offset = (current_page - 1) * page_size
+
+ # 执行分页查询
+ query = f"""
+ SELECT id, nickname, email, create_date, update_date, status, is_superuser
+ FROM user
+ WHERE {where_sql}
+ ORDER BY id DESC
+ LIMIT %s OFFSET %s
+ """
+ cursor.execute(query, params + [page_size, offset])
+ results = cursor.fetchall()
+
+ # 关闭连接
+ cursor.close()
+ conn.close()
+
+ # 格式化结果
+ formatted_users = []
+ for user in results:
+ formatted_users.append({
+ "id": user["id"],
+ "username": user["nickname"],
+ "email": user["email"],
+ "createTime": user["create_date"].strftime("%Y-%m-%d %H:%M:%S") if user["create_date"] else "",
+ "updateTime": user["update_date"].strftime("%Y-%m-%d %H:%M:%S") if user["update_date"] else "",
+ })
+
+ return formatted_users, total
+
+ except mysql.connector.Error as err:
+ print(f"数据库错误: {err}")
+ return [], 0
+
+def delete_user(user_id):
+ """删除指定ID的用户"""
+ try:
+ conn = mysql.connector.connect(**db_config)
+ cursor = conn.cursor()
+
+ # 删除 user 表中的用户记录
+ query = "DELETE FROM user WHERE id = %s"
+ cursor.execute(query, (user_id,))
+
+ # 删除 user_tenant 表中的关联记录
+ user_tenant_query = "DELETE FROM user_tenant WHERE user_id = %s"
+ cursor.execute(user_tenant_query, (user_id,))
+
+ # 删除 tenant 表中的关联记录
+ tenant_query = "DELETE FROM tenant WHERE id = %s"
+ cursor.execute(tenant_query, (user_id,))
+
+ # 删除 tenant_llm 表中的关联记录
+ tenant_llm_query = "DELETE FROM tenant_llm WHERE tenant_id = %s"
+ cursor.execute(tenant_llm_query, (user_id,))
+
+ conn.commit()
+ cursor.close()
+ conn.close()
+
+ return True
+ except mysql.connector.Error as err:
+ print(f"删除用户错误: {err}")
+ return False
+
+def create_user(user_data):
+ """创建新用户,并加入最早用户的团队,并使用相同的模型配置"""
+ try:
+ conn = mysql.connector.connect(**db_config)
+ cursor = conn.cursor(dictionary=True)
+
+ # 查询最早创建的tenant配置
+ query_earliest_tenant = """
+ SELECT id, llm_id, embd_id, asr_id, img2txt_id, rerank_id, tts_id, parser_ids, credit
+ FROM tenant
+ WHERE create_time = (SELECT MIN(create_time) FROM tenant)
+ LIMIT 1
+ """
+ cursor.execute(query_earliest_tenant)
+ earliest_tenant = cursor.fetchone()
+
+ # 查询最早创建的tenant配置
+ query_earliest_tenant_llm = """
+ SELECT llm_factory, model_type, llm_name, api_key, api_base, max_tokens, used_tokens
+ FROM tenant_llm
+ WHERE create_time = (SELECT MIN(create_time) FROM tenant_llm)
+ LIMIT 1
+ """
+ cursor.execute(query_earliest_tenant_llm)
+ earliest_tenant_llm = cursor.fetchone()
+
+ # 开始插入
+ user_id = generate_uuid()
+ # 获取基本信息
+ username = user_data.get("username")
+ email = user_data.get("email")
+ password = user_data.get("password")
+ # 加密密码
+ encrypted_password = encrypt_password(password)
+
+ current_datetime = datetime.now()
+ create_time = int(current_datetime.timestamp() * 1000)
+ current_date = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
+
+ # 插入用户表
+ user_insert_query = """
+ INSERT INTO user (
+ id, create_time, create_date, update_time, update_date, access_token,
+ nickname, password, email, avatar, language, color_schema, timezone,
+ last_login_time, is_authenticated, is_active, is_anonymous, login_channel,
+ status, is_superuser
+ ) VALUES (
+ %s, %s, %s, %s, %s, %s,
+ %s, %s, %s, %s, %s, %s, %s,
+ %s, %s, %s, %s, %s,
+ %s, %s
+ )
+ """
+ user_data = (
+ user_id, create_time, current_date, create_time, current_date, None,
+ username, encrypted_password, email, None, "Chinese", "Bright", "UTC+8 Asia/Shanghai",
+ current_date, 1, 1, 0, "password",
+ 1, 0
+ )
+ cursor.execute(user_insert_query, user_data)
+
+ # 插入租户表
+ tenant_insert_query = """
+ INSERT INTO tenant (
+ id, create_time, create_date, update_time, update_date, name,
+ public_key, llm_id, embd_id, asr_id, img2txt_id, rerank_id, tts_id,
+ parser_ids, credit, status
+ ) VALUES (
+ %s, %s, %s, %s, %s, %s,
+ %s, %s, %s, %s, %s, %s, %s,
+ %s, %s, %s
+ )
+ """
+ tenant_data = (
+ user_id, create_time, current_date, create_time, current_date, username + "'s Kingdom",
+ None, str(earliest_tenant['llm_id']), str(earliest_tenant['embd_id']),
+ str(earliest_tenant['asr_id']), str(earliest_tenant['img2txt_id']),
+ str(earliest_tenant['rerank_id']), str(earliest_tenant['tts_id']),
+ str(earliest_tenant['parser_ids']), str(earliest_tenant['credit']), 1
+ )
+ cursor.execute(tenant_insert_query, tenant_data)
+
+ # 插入用户租户关系表(owner角色)
+ user_tenant_insert_owner_query = """
+ INSERT INTO user_tenant (
+ id, create_time, create_date, update_time, update_date, user_id,
+ tenant_id, role, invited_by, status
+ ) VALUES (
+ %s, %s, %s, %s, %s, %s,
+ %s, %s, %s, %s
+ )
+ """
+ user_tenant_data_owner = (
+ generate_uuid(), create_time, current_date, create_time, current_date, user_id,
+ user_id, "owner", user_id, 1
+ )
+ cursor.execute(user_tenant_insert_owner_query, user_tenant_data_owner)
+
+ # 插入用户租户关系表(normal角色)
+ user_tenant_insert_normal_query = """
+ INSERT INTO user_tenant (
+ id, create_time, create_date, update_time, update_date, user_id,
+ tenant_id, role, invited_by, status
+ ) VALUES (
+ %s, %s, %s, %s, %s, %s,
+ %s, %s, %s, %s
+ )
+ """
+ user_tenant_data_normal = (
+ generate_uuid(), create_time, current_date, create_time, current_date, user_id,
+ earliest_tenant['id'], "normal", earliest_tenant['id'], 1
+ )
+ cursor.execute(user_tenant_insert_normal_query, user_tenant_data_normal)
+
+ # 插入租户LLM配置表
+ tenant_llm_insert_query = """
+ INSERT INTO tenant_llm (
+ create_time, create_date, update_time, update_date, tenant_id,
+ llm_factory, model_type, llm_name, api_key, api_base, max_tokens, used_tokens
+ ) VALUES (
+ %s, %s, %s, %s, %s,
+ %s, %s, %s, %s, %s, %s, %s
+ )
+ """
+ tenant_llm_data = (
+ create_time, current_date, create_time, current_date, user_id,
+ str(earliest_tenant_llm['llm_factory']), str(earliest_tenant_llm['model_type']), str(earliest_tenant_llm['llm_name']),
+ str(earliest_tenant_llm['api_key']), str(earliest_tenant_llm['api_base']), str(earliest_tenant_llm['max_tokens']), 0
+ )
+ cursor.execute(tenant_llm_insert_query, tenant_llm_data)
+
+ conn.commit()
+ cursor.close()
+ conn.close()
+
+ return True
+ except mysql.connector.Error as err:
+ print(f"创建用户错误: {err}")
+ return False
+
+def update_user(user_id, user_data):
+ """更新用户信息"""
+ try:
+ conn = mysql.connector.connect(**db_config)
+ cursor = conn.cursor()
+
+ query = """
+ UPDATE user SET nickname = %s WHERE id = %s
+ """
+ cursor.execute(query, (
+ user_data.get("username"),
+ user_id
+ ))
+ conn.commit()
+
+ cursor.close()
+ conn.close()
+
+ return True
+ except mysql.connector.Error as err:
+ print(f"更新用户错误: {err}")
+ return False
\ No newline at end of file
diff --git a/management/server/requirements.txt b/management/server/requirements.txt
new file mode 100644
index 0000000..d7dc9c1
--- /dev/null
+++ b/management/server/requirements.txt
@@ -0,0 +1,6 @@
+Flask==3.1.0
+flask_cors==5.0.1
+mysql-connector-python==9.2.0
+pycryptodomex==3.20.0
+tabulate==0.9.0
+Werkzeug==3.1.3
\ No newline at end of file
diff --git a/management/server/utils.py b/management/server/utils.py
new file mode 100644
index 0000000..8dcc70c
--- /dev/null
+++ b/management/server/utils.py
@@ -0,0 +1,28 @@
+import uuid
+import base64
+from datetime import datetime
+from Cryptodome.PublicKey import RSA
+from Cryptodome.Cipher import PKCS1_v1_5
+from werkzeug.security import generate_password_hash
+
+
+# 生成随机的 UUID 作为 id
+def generate_uuid():
+ return str(uuid.uuid4()).replace("-", "")
+
+# RSA 加密密码
+def rsa_psw(password: str) -> str:
+ pub_key = """-----BEGIN PUBLIC KEY-----
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArq9XTUSeYr2+N1h3Afl/z8Dse/2yD0ZGrKwx+EEEcdsBLca9Ynmx3nIB5obmLlSfmskLpBo0UACBmB5rEjBp2Q2f3AG3Hjd4B+gNCG6BDaawuDlgANIhGnaTLrIqWrrcm4EMzJOnAOI1fgzJRsOOUEfaS318Eq9OVO3apEyCCt0lOQK6PuksduOjVxtltDav+guVAA068NrPYmRNabVKRNLJpL8w4D44sfth5RvZ3q9t+6RTArpEtc5sh5ChzvqPOzKGMXW83C95TxmXqpbK6olN4RevSfVjEAgCydH6HN6OhtOQEcnrU97r9H0iZOWwbw3pVrZiUkuRD1R56Wzs2wIDAQAB
+ -----END PUBLIC KEY-----"""
+
+ rsa_key = RSA.import_key(pub_key)
+ cipher = PKCS1_v1_5.new(rsa_key)
+ encrypted_data = cipher.encrypt(base64.b64encode(password.encode()))
+ return base64.b64encode(encrypted_data).decode()
+
+# 加密密码
+def encrypt_password(raw_password: str) -> str:
+ base64_password = base64.b64encode(raw_password.encode()).decode()
+ encrypted_password = rsa_psw(base64_password)
+ return generate_password_hash(base64_password)
\ No newline at end of file
diff --git a/management/web/.editorconfig b/management/web/.editorconfig
new file mode 100644
index 0000000..1104dd5
--- /dev/null
+++ b/management/web/.editorconfig
@@ -0,0 +1,24 @@
+# 配置项文档:https://editorconfig.org(修改配置后重启编辑器)
+
+## 告知 EditorConfig 插件,当前即是根文件
+root = true
+
+## 适用全部文件
+[*]
+### 设置字符集
+charset = utf-8
+### 缩进风格 space | tab,建议 space
+indent_style = space
+### 缩进的空格数
+indent_size = 2
+### 换行符类型 lf | cr | crlf,一般都是设置为 lf
+end_of_line = lf
+### 是否在文件末尾插入空白行
+insert_final_newline = true
+### 是否删除一行中的前后空格
+trim_trailing_whitespace = true
+
+## 适用 .md 文件
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/management/web/.env b/management/web/.env
new file mode 100644
index 0000000..4d97a03
--- /dev/null
+++ b/management/web/.env
@@ -0,0 +1,7 @@
+# 所有环境的环境变量(命名必须以 VITE_ 开头)
+
+## 项目标题
+VITE_APP_TITLE = Ragflow Plus
+
+## 路由模式 hash 或 html5
+VITE_ROUTER_HISTORY = hash
diff --git a/management/web/.env.development b/management/web/.env.development
new file mode 100644
index 0000000..fe768a9
--- /dev/null
+++ b/management/web/.env.development
@@ -0,0 +1,7 @@
+# 开发环境的环境变量(命名必须以 VITE_ 开头)
+
+## 后端接口地址(如果解决跨域问题采用反向代理就只需写相对路径)
+VITE_BASE_URL = /api
+
+## 开发环境域名和静态资源公共路径(一般 / 或 ./ 都可以)
+VITE_PUBLIC_PATH = /
diff --git a/management/web/.env.production b/management/web/.env.production
new file mode 100644
index 0000000..7e59a62
--- /dev/null
+++ b/management/web/.env.production
@@ -0,0 +1,7 @@
+# 生产环境的环境变量(命名必须以 VITE_ 开头)
+
+## 后端接口地址(如果解决跨域问题采用 CORS 就需要写绝对路径)
+VITE_BASE_URL = http://localhost:5000
+
+## 打包构建静态资源公共路径(例如部署到 https://un-pany.github.io/v3-admin-vite/ 域名下就需要填写 /v3-admin-vite/)
+VITE_PUBLIC_PATH = /v3-admin-vite/
diff --git a/management/web/.env.staging b/management/web/.env.staging
new file mode 100644
index 0000000..2134b2c
--- /dev/null
+++ b/management/web/.env.staging
@@ -0,0 +1,7 @@
+# 预发布环境的环境变量(命名必须以 VITE_ 开头)
+
+## 后端接口地址(如果解决跨域问题采用 CORS 就需要写绝对路径)
+VITE_BASE_URL = http://localhost:5000
+
+## 打包构建静态资源公共路径(例如部署到 https://un-pany.github.io/ 域名下就需要填写 /)
+VITE_PUBLIC_PATH = /
diff --git a/management/web/.gitignore b/management/web/.gitignore
new file mode 100644
index 0000000..bb4bd4f
--- /dev/null
+++ b/management/web/.gitignore
@@ -0,0 +1,18 @@
+# Common
+dist
+node_modules
+.eslintcache
+vite.config.*.timestamp*
+
+# MacOS
+.DS_Store
+
+# Local env files
+*.local
+
+# Logs
+*.log
+
+# Use the pnpm
+package-lock.json
+yarn.lock
diff --git a/management/web/.npmrc b/management/web/.npmrc
new file mode 100644
index 0000000..1db20f5
--- /dev/null
+++ b/management/web/.npmrc
@@ -0,0 +1,5 @@
+# China mirror of npm
+registry = https://registry.npmmirror.com
+
+# 安装依赖时锁定版本号
+save-exact = true
diff --git a/management/web/eslint.config.js b/management/web/eslint.config.js
new file mode 100644
index 0000000..42c14df
--- /dev/null
+++ b/management/web/eslint.config.js
@@ -0,0 +1,43 @@
+import antfu from "@antfu/eslint-config"
+
+// 更多自定义配置可查阅仓库:https://github.com/antfu/eslint-config
+export default antfu(
+ {
+ // 使用外部格式化程序格式化 css、html、markdown 等文件
+ formatters: true,
+ // 启用样式规则
+ stylistic: {
+ // 缩进级别
+ indent: 2,
+ // 引号风格 'single' | 'double'
+ quotes: "double",
+ // 是否启用分号
+ semi: false
+ },
+ // 忽略文件
+ ignores: []
+ },
+ {
+ // 对所有文件都生效的规则
+ rules: {
+ // vue
+ "vue/block-order": ["error", { order: ["script", "template", "style"] }],
+ "vue/attributes-order": "off",
+ // ts
+ "ts/no-use-before-define": "off",
+ // node
+ "node/prefer-global/process": "off",
+ // style
+ "style/comma-dangle": ["error", "never"],
+ "style/brace-style": ["error", "1tbs"],
+ // regexp
+ "regexp/no-unused-capturing-group": "off",
+ // other
+ "no-console": "off",
+ "no-debugger": "off",
+ "symbol-description": "off",
+ "antfu/if-newline": "off",
+ "unicorn/no-instanceof-builtins": "off"
+ }
+ }
+)
diff --git a/management/web/index.html b/management/web/index.html
new file mode 100644
index 0000000..89002c2
--- /dev/null
+++ b/management/web/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ %VITE_APP_TITLE%
+
+
+
+
+
+
+
diff --git a/management/web/package.json b/management/web/package.json
new file mode 100644
index 0000000..86b5289
--- /dev/null
+++ b/management/web/package.json
@@ -0,0 +1,64 @@
+{
+ "name": "v3-admin-vite",
+ "type": "module",
+ "version": "5.0.0-beta.5",
+ "description": "A crafted admin template, built with Vue3, Vite, TypeScript, Element Plus, and more",
+ "author": "pany <939630029@qq.com> (https://github.com/pany-ang)",
+ "repository": "https://github.com/un-pany/v3-admin-vite",
+ "scripts": {
+ "dev": "vite",
+ "build:staging": "vue-tsc && vite build --mode staging",
+ "build": "vue-tsc && vite build",
+ "preview": "vite preview",
+ "lint": "eslint . --fix",
+ "prepare": "husky",
+ "test": "vitest"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "2.3.1",
+ "axios": "1.8.4",
+ "dayjs": "1.11.13",
+ "element-plus": "2.9.7",
+ "js-cookie": "3.0.5",
+ "lodash-es": "4.17.21",
+ "mitt": "3.0.1",
+ "normalize.css": "8.0.1",
+ "nprogress": "0.2.0",
+ "path-browserify": "1.0.1",
+ "path-to-regexp": "8.2.0",
+ "pinia": "3.0.1",
+ "screenfull": "6.0.2",
+ "vue": "3.5.13",
+ "vue-router": "4.5.0",
+ "vxe-table": "4.6.25"
+ },
+ "devDependencies": {
+ "@antfu/eslint-config": "4.11.0",
+ "@types/js-cookie": "3.0.6",
+ "@types/lodash-es": "4.17.12",
+ "@types/node": "22.13.14",
+ "@types/nprogress": "0.2.3",
+ "@types/path-browserify": "1.0.3",
+ "@vitejs/plugin-vue": "5.2.3",
+ "@vitejs/plugin-vue-jsx": "4.1.2",
+ "@vue/test-utils": "2.4.6",
+ "eslint": "9.23.0",
+ "eslint-plugin-format": "1.0.1",
+ "happy-dom": "17.4.4",
+ "husky": "9.1.7",
+ "lint-staged": "15.5.0",
+ "sass": "1.78.0",
+ "typescript": "5.8.2",
+ "unocss": "66.1.0-beta.7",
+ "unplugin-auto-import": "19.1.2",
+ "unplugin-svg-component": "0.12.1",
+ "unplugin-vue-components": "28.4.1",
+ "vite": "6.2.3",
+ "vite-svg-loader": "5.1.0",
+ "vitest": "3.0.9",
+ "vue-tsc": "2.2.8"
+ },
+ "lint-staged": {
+ "*": "eslint --fix"
+ }
+}
diff --git a/management/web/pnpm-lock.yaml b/management/web/pnpm-lock.yaml
new file mode 100644
index 0000000..c12a07e
--- /dev/null
+++ b/management/web/pnpm-lock.yaml
@@ -0,0 +1,7477 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@element-plus/icons-vue':
+ specifier: 2.3.1
+ version: 2.3.1(vue@3.5.13(typescript@5.8.2))
+ axios:
+ specifier: 1.8.4
+ version: 1.8.4
+ dayjs:
+ specifier: 1.11.13
+ version: 1.11.13
+ element-plus:
+ specifier: 2.9.7
+ version: 2.9.7(vue@3.5.13(typescript@5.8.2))
+ js-cookie:
+ specifier: 3.0.5
+ version: 3.0.5
+ lodash-es:
+ specifier: 4.17.21
+ version: 4.17.21
+ mitt:
+ specifier: 3.0.1
+ version: 3.0.1
+ normalize.css:
+ specifier: 8.0.1
+ version: 8.0.1
+ nprogress:
+ specifier: 0.2.0
+ version: 0.2.0
+ path-browserify:
+ specifier: 1.0.1
+ version: 1.0.1
+ path-to-regexp:
+ specifier: 8.2.0
+ version: 8.2.0
+ pinia:
+ specifier: 3.0.1
+ version: 3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))
+ screenfull:
+ specifier: 6.0.2
+ version: 6.0.2
+ vue:
+ specifier: 3.5.13
+ version: 3.5.13(typescript@5.8.2)
+ vue-router:
+ specifier: 4.5.0
+ version: 4.5.0(vue@3.5.13(typescript@5.8.2))
+ vxe-table:
+ specifier: 4.6.25
+ version: 4.6.25(vue@3.5.13(typescript@5.8.2))
+ devDependencies:
+ '@antfu/eslint-config':
+ specifier: 4.11.0
+ version: 4.11.0(@typescript-eslint/utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(@vue/compiler-sfc@3.5.13)(eslint-plugin-format@1.0.1(eslint@9.23.0(jiti@2.4.2)))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(happy-dom@17.4.4)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))
+ '@types/js-cookie':
+ specifier: 3.0.6
+ version: 3.0.6
+ '@types/lodash-es':
+ specifier: 4.17.12
+ version: 4.17.12
+ '@types/node':
+ specifier: 22.13.14
+ version: 22.13.14
+ '@types/nprogress':
+ specifier: 0.2.3
+ version: 0.2.3
+ '@types/path-browserify':
+ specifier: 1.0.3
+ version: 1.0.3
+ '@vitejs/plugin-vue':
+ specifier: 5.2.3
+ version: 5.2.3(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
+ '@vitejs/plugin-vue-jsx':
+ specifier: 4.1.2
+ version: 4.1.2(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
+ '@vue/test-utils':
+ specifier: 2.4.6
+ version: 2.4.6
+ eslint:
+ specifier: 9.23.0
+ version: 9.23.0(jiti@2.4.2)
+ eslint-plugin-format:
+ specifier: 1.0.1
+ version: 1.0.1(eslint@9.23.0(jiti@2.4.2))
+ happy-dom:
+ specifier: 17.4.4
+ version: 17.4.4
+ husky:
+ specifier: 9.1.7
+ version: 9.1.7
+ lint-staged:
+ specifier: 15.5.0
+ version: 15.5.0
+ sass:
+ specifier: 1.78.0
+ version: 1.78.0
+ typescript:
+ specifier: 5.8.2
+ version: 5.8.2
+ unocss:
+ specifier: 66.1.0-beta.7
+ version: 66.1.0-beta.7(postcss@8.5.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
+ unplugin-auto-import:
+ specifier: 19.1.2
+ version: 19.1.2(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2)))
+ unplugin-svg-component:
+ specifier: 0.12.1
+ version: 0.12.1
+ unplugin-vue-components:
+ specifier: 28.4.1
+ version: 28.4.1(@babel/parser@7.27.0)(vue@3.5.13(typescript@5.8.2))
+ vite:
+ specifier: 6.2.3
+ version: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ vite-svg-loader:
+ specifier: 5.1.0
+ version: 5.1.0(vue@3.5.13(typescript@5.8.2))
+ vitest:
+ specifier: 3.0.9
+ version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(happy-dom@17.4.4)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ vue-tsc:
+ specifier: 2.2.8
+ version: 2.2.8(typescript@5.8.2)
+
+packages:
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@antfu/eslint-config@4.11.0':
+ resolution: {integrity: sha512-KMLIrZflEFsOEF/N0Xl8iVaheLTdgT3gAwXVzdG5Ng8ieNhBsRsaThnqI7of10kh6psSBLJ6SkNK+ZF98fQIXQ==}
+ hasBin: true
+ peerDependencies:
+ '@eslint-react/eslint-plugin': ^1.19.0
+ '@prettier/plugin-xml': ^3.4.1
+ '@unocss/eslint-plugin': '>=0.50.0'
+ astro-eslint-parser: ^1.0.2
+ eslint: ^9.10.0
+ eslint-plugin-astro: ^1.2.0
+ eslint-plugin-format: '>=0.1.0'
+ eslint-plugin-react-hooks: ^5.2.0
+ eslint-plugin-react-refresh: ^0.4.19
+ eslint-plugin-solid: ^0.14.3
+ eslint-plugin-svelte: '>=2.35.1'
+ eslint-plugin-vuejs-accessibility: ^2.4.1
+ prettier-plugin-astro: ^0.14.0
+ prettier-plugin-slidev: ^1.0.5
+ svelte-eslint-parser: '>=0.37.0'
+ peerDependenciesMeta:
+ '@eslint-react/eslint-plugin':
+ optional: true
+ '@prettier/plugin-xml':
+ optional: true
+ '@unocss/eslint-plugin':
+ optional: true
+ astro-eslint-parser:
+ optional: true
+ eslint-plugin-astro:
+ optional: true
+ eslint-plugin-format:
+ optional: true
+ eslint-plugin-react-hooks:
+ optional: true
+ eslint-plugin-react-refresh:
+ optional: true
+ eslint-plugin-solid:
+ optional: true
+ eslint-plugin-svelte:
+ optional: true
+ eslint-plugin-vuejs-accessibility:
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-slidev:
+ optional: true
+ svelte-eslint-parser:
+ optional: true
+
+ '@antfu/install-pkg@1.0.0':
+ resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==}
+
+ '@antfu/utils@8.1.1':
+ resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
+
+ '@babel/code-frame@7.26.2':
+ resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.26.8':
+ resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.10':
+ resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.27.0':
+ resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.27.0':
+ resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.27.0':
+ resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-member-expression-to-functions@7.25.9':
+ resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.25.9':
+ resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.26.5':
+ resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-replace-supers@7.26.5':
+ resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+ resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.27.0':
+ resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.27.0':
+ resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.27.0':
+ resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/template@7.27.0':
+ resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.27.0':
+ resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.27.0':
+ resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
+ engines: {node: '>=6.9.0'}
+
+ '@clack/core@0.4.1':
+ resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==}
+
+ '@clack/prompts@0.10.0':
+ resolution: {integrity: sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ==}
+
+ '@colors/colors@1.6.0':
+ resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
+ engines: {node: '>=0.1.90'}
+
+ '@ctrl/tinycolor@3.6.1':
+ resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+ engines: {node: '>=10'}
+
+ '@dabh/diagnostics@2.0.3':
+ resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==}
+
+ '@dprint/formatter@0.3.0':
+ resolution: {integrity: sha512-N9fxCxbaBOrDkteSOzaCqwWjso5iAe+WJPsHC021JfHNj2ThInPNEF13ORDKta3llq5D1TlclODCvOvipH7bWQ==}
+
+ '@dprint/markdown@0.17.8':
+ resolution: {integrity: sha512-ukHFOg+RpG284aPdIg7iPrCYmMs3Dqy43S1ejybnwlJoFiW02b+6Bbr5cfZKFRYNP3dKGM86BqHEnMzBOyLvvA==}
+
+ '@dprint/toml@0.6.4':
+ resolution: {integrity: sha512-bZXIUjxr0LIuHWshZr/5mtUkOrnh0NKVZEF6ACojW5z7zkJu7s9sV2mMXm8XQDqN4cJzdHYUYzUyEGdfciaLJA==}
+
+ '@element-plus/icons-vue@2.3.1':
+ resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ '@emnapi/core@1.3.1':
+ resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==}
+
+ '@emnapi/runtime@1.3.1':
+ resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
+
+ '@emnapi/wasi-threads@1.0.1':
+ resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
+
+ '@es-joy/jsdoccomment@0.49.0':
+ resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==}
+ engines: {node: '>=16'}
+
+ '@es-joy/jsdoccomment@0.50.0':
+ resolution: {integrity: sha512-+zZymuVLH6zVwXPtCAtC+bDymxmEwEqDftdAK+f407IF1bnX49anIxvBhCA1AqUIfD6egj1jM1vUnSuijjNyYg==}
+ engines: {node: '>=18'}
+
+ '@esbuild/aix-ppc64@0.23.1':
+ resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.25.1':
+ resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.23.1':
+ resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.25.1':
+ resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.23.1':
+ resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.1':
+ resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.23.1':
+ resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.1':
+ resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.23.1':
+ resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.25.1':
+ resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.23.1':
+ resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.1':
+ resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.25.1':
+ resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.23.1':
+ resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.1':
+ resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.23.1':
+ resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.25.1':
+ resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.23.1':
+ resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.1':
+ resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.23.1':
+ resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.1':
+ resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.23.1':
+ resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.1':
+ resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.23.1':
+ resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.1':
+ resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.23.1':
+ resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.1':
+ resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.23.1':
+ resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.1':
+ resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.23.1':
+ resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.1':
+ resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.23.1':
+ resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.1':
+ resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.1':
+ resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.1':
+ resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-arm64@0.25.1':
+ resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.1':
+ resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.23.1':
+ resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.25.1':
+ resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.23.1':
+ resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.25.1':
+ resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.23.1':
+ resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.1':
+ resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.23.1':
+ resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.1':
+ resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-plugin-eslint-comments@4.4.1':
+ resolution: {integrity: sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
+ '@eslint-community/eslint-utils@4.5.1':
+ resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/compat@1.2.7':
+ resolution: {integrity: sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^9.10.0
+ peerDependenciesMeta:
+ eslint:
+ optional: true
+
+ '@eslint/config-array@0.19.2':
+ resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.2.0':
+ resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.10.0':
+ resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.12.0':
+ resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.1':
+ resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.23.0':
+ resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/markdown@6.3.0':
+ resolution: {integrity: sha512-8rj7wmuP5hwXZ0HWoad+WL9nftpN373bCCQz9QL6sA+clZiz7et8Pk0yDAKeo//xLlPONKQ6wCpjkOHCLkbYUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.6':
+ resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.2.7':
+ resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@floating-ui/core@1.6.9':
+ resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+
+ '@floating-ui/dom@1.6.13':
+ resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
+
+ '@floating-ui/utils@0.2.9':
+ resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.6':
+ resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+ engines: {node: '>=18.18'}
+
+ '@humanwhocodes/retry@0.4.2':
+ resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
+ engines: {node: '>=18.18'}
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@2.3.0':
+ resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@jridgewell/gen-mapping@0.3.8':
+ resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@napi-rs/wasm-runtime@0.2.7':
+ resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@one-ini/wasm@0.1.1':
+ resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@pkgr/core@0.1.2':
+ resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@pkgr/core@0.2.0':
+ resolution: {integrity: sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@polka/url@1.0.0-next.28':
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+
+ '@quansync/fs@0.1.1':
+ resolution: {integrity: sha512-sx8J1O/+j2lqs8MvsEz6rs/6UAUpCb4fu7C6EqtMqzbS3CmqLkTDTOMK+DrWukvyUuHzl8DhMjfNJzQDTqfGJg==}
+ engines: {node: '>=20.18.0'}
+
+ '@resvg/resvg-js-android-arm-eabi@2.6.2':
+ resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [android]
+
+ '@resvg/resvg-js-android-arm64@2.6.2':
+ resolution: {integrity: sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@resvg/resvg-js-darwin-arm64@2.6.2':
+ resolution: {integrity: sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@resvg/resvg-js-darwin-x64@2.6.2':
+ resolution: {integrity: sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2':
+ resolution: {integrity: sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@resvg/resvg-js-linux-arm64-gnu@2.6.2':
+ resolution: {integrity: sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@resvg/resvg-js-linux-arm64-musl@2.6.2':
+ resolution: {integrity: sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@resvg/resvg-js-linux-x64-gnu@2.6.2':
+ resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@resvg/resvg-js-linux-x64-musl@2.6.2':
+ resolution: {integrity: sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@resvg/resvg-js-win32-arm64-msvc@2.6.2':
+ resolution: {integrity: sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@resvg/resvg-js-win32-ia32-msvc@2.6.2':
+ resolution: {integrity: sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@resvg/resvg-js-win32-x64-msvc@2.6.2':
+ resolution: {integrity: sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@resvg/resvg-js@2.6.2':
+ resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==}
+ engines: {node: '>= 10'}
+
+ '@rollup/rollup-android-arm-eabi@4.37.0':
+ resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.37.0':
+ resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.37.0':
+ resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.37.0':
+ resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.37.0':
+ resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.37.0':
+ resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.37.0':
+ resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.37.0':
+ resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-arm64-gnu@4.37.0':
+ resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm64-musl@4.37.0':
+ resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.37.0':
+ resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.37.0':
+ resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.37.0':
+ resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-riscv64-musl@4.37.0':
+ resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-s390x-gnu@4.37.0':
+ resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-gnu@4.37.0':
+ resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-musl@4.37.0':
+ resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-win32-arm64-msvc@4.37.0':
+ resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.37.0':
+ resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.37.0':
+ resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@stylistic/eslint-plugin@4.2.0':
+ resolution: {integrity: sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: '>=9.0.0'
+
+ '@sxzz/popperjs-es@2.11.7':
+ resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+
+ '@trysound/sax@0.2.0':
+ resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+ engines: {node: '>=10.13.0'}
+
+ '@tybys/wasm-util@0.9.0':
+ resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/doctrine@0.0.9':
+ resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ '@types/estree@1.0.7':
+ resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+
+ '@types/js-cookie@3.0.6':
+ resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/lodash-es@4.17.12':
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+ '@types/lodash@4.17.16':
+ resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/node@22.13.14':
+ resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==}
+
+ '@types/normalize-package-data@2.4.4':
+ resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+
+ '@types/nprogress@0.2.3':
+ resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==}
+
+ '@types/path-browserify@1.0.3':
+ resolution: {integrity: sha512-ZmHivEbNCBtAfcrFeBCiTjdIc2dey0l7oCGNGpSuRTy8jP6UVND7oUowlvDujBy8r2Hoa8bfFUOCiPWfmtkfxw==}
+
+ '@types/triple-beam@1.3.5':
+ resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@types/web-bluetooth@0.0.16':
+ resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
+ '@typescript-eslint/eslint-plugin@8.28.0':
+ resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/parser@8.28.0':
+ resolution: {integrity: sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/scope-manager@8.28.0':
+ resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@8.28.0':
+ resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/types@8.28.0':
+ resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.28.0':
+ resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/utils@8.28.0':
+ resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/visitor-keys@8.28.0':
+ resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@unocss/astro@66.1.0-beta.7':
+ resolution: {integrity: sha512-cqimcWi/JNwNIMFHi3MCWUlF64y867AQmXd1/L3ZpGwb45EdYY2T7RsTsFwh4POdDQT1GRKwpAeYObOs8DhExQ==}
+ peerDependencies:
+ vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ '@unocss/cli@66.1.0-beta.7':
+ resolution: {integrity: sha512-fRof8VrgH77Ig/favY6bVjDi1OhsJINsNw6jslgKxuaOR3oiJOe9tprsNWIAl4W2/NZq3RMBpjErDBvGCA4UtA==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ '@unocss/config@66.1.0-beta.7':
+ resolution: {integrity: sha512-4FILwDExyRgBmZpky9OyJpgjHetCLUzythNhuU6wxBD+6xyfa8aZSrtC27bcMRbjLweXMKFVYk49bSkajmUWMw==}
+ engines: {node: '>=14'}
+
+ '@unocss/core@66.1.0-beta.7':
+ resolution: {integrity: sha512-l1/r+Jd9TbsRqR/geEdIV/Erzvs26GitTtMVsGcJfuaK1/WWOLtbSHRUDQAB/UpcOOWvuNuAv4UWsXX9Z0DFmw==}
+
+ '@unocss/extractor-arbitrary-variants@66.1.0-beta.7':
+ resolution: {integrity: sha512-LD8W9PlpHnFmuynI+TJzdE5z9OKY/tVaagY/Ak1mICFEWveH3jFuN13KH2jaI3/V2KaTwkcY/8tGQJXv8dKWAw==}
+
+ '@unocss/inspector@66.1.0-beta.7':
+ resolution: {integrity: sha512-kyldOXJKv04ctQWRjThQ20XIHsLCAv+IFPK3keltT5krs/BtuwZ6HjHViCRwtoAd6h96svnzUVmuUP+QxM15bQ==}
+
+ '@unocss/postcss@66.1.0-beta.7':
+ resolution: {integrity: sha512-5Bfbl0gzAXKD4Orztmx4/zr2wRAwHMEFev5Jfsv9Ao4nfkpmjWbb7Ro56UPeocqXOYbcceZgIluh2xFM48/woA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ '@unocss/preset-attributify@66.1.0-beta.7':
+ resolution: {integrity: sha512-WAighG842BQCjh8JS0O5uckxL7s+uS5pScYH8Ilx9KaJKIgLfMim76BZg4jRPlZ4gB0UjToqdNtOPH0aZ/mCuA==}
+
+ '@unocss/preset-icons@66.1.0-beta.7':
+ resolution: {integrity: sha512-KcPpFRytoVigVhD7UKk7n9Qz/gIMK3tRY6DL6tOY0V6WcNmZ/8EVgH4rQRbiTC6T318pQh3k9DgX8HGjwNXYVA==}
+
+ '@unocss/preset-mini@66.1.0-beta.7':
+ resolution: {integrity: sha512-5v9RNFTk2OMLbE45JVoYA0HtZKCDCI3j7uRAcuRLVP3O/yAd9JlP/b8ou3wvtgxHTXFEgk6Pt8dFDKPadA3Hrw==}
+
+ '@unocss/preset-tagify@66.1.0-beta.7':
+ resolution: {integrity: sha512-8eJLHiyfzwfKjqV4sIP+158h6RSTwuQ4AOC8UZij0AketU9bhFIyfOzgvFALiZBo71LFFDe1gSliZpK/eGan2g==}
+
+ '@unocss/preset-typography@66.1.0-beta.7':
+ resolution: {integrity: sha512-ouYVaQFndrH2bz1Pkc+knpxAF7o8+Gma9DEW6OraduXVZFr4NXtzM08O9D0wepr6ZkQbtMj3mub2L2P/0R646w==}
+
+ '@unocss/preset-uno@66.1.0-beta.7':
+ resolution: {integrity: sha512-0St/Tgh+HJyXmQIuZlvZrVHQotDpNDAlJnqs1IQs9h+8VEjeIXmrZazcMmqiWBpBb7GNDTsqpbeSfmoiBB8XAw==}
+
+ '@unocss/preset-web-fonts@66.1.0-beta.7':
+ resolution: {integrity: sha512-2ZTUhV1qGmBo38ZIIdxShqxrTww4qaFE0cLMT7pem6meBO6Wp5eux5fndWvaaHh1rRcbDUadsiBEzNDknm1AYg==}
+
+ '@unocss/preset-wind3@66.1.0-beta.7':
+ resolution: {integrity: sha512-JgiHl2L0J6VdmowGk45WB9NLYxO1tTQpr6GspMyhMz63pkcqjJtP5g8JfeIw5G0uwfWhoGubqG3RxKKaWHsoyg==}
+
+ '@unocss/preset-wind4@66.1.0-beta.7':
+ resolution: {integrity: sha512-R5PATx3onKKkawHOhwFRZpbRfQbQg1bOZjitIJR3/VsDELYo1abhIdCe48tD/c2QbYPiG5JJFVbv//RiQqK7TA==}
+
+ '@unocss/preset-wind@66.1.0-beta.7':
+ resolution: {integrity: sha512-bBZrsq2znTCuHrXY9s8Q5Nsm6zWx3YaRSU7HF/nnA1OFErANz4ZqGvZOT72JdOYyFIzCFjrkRsWpm+6zYZfEwg==}
+
+ '@unocss/reset@66.1.0-beta.7':
+ resolution: {integrity: sha512-6GAvIfcuEGkx3rryIHWaF6Uwh0QZJYJTmDog/88X2He8v1yGR2RfrUSrrYUf8KfmLQYSZ/u7WazLwJTVmpvjaQ==}
+
+ '@unocss/rule-utils@66.1.0-beta.7':
+ resolution: {integrity: sha512-oJ5lcHRgN1aabsszkBXoiYp0G6LLM011BJoAEfKOeRZ14FGFlg0zuOi/h7aKlVuIvBt6q8BWosJLlZSAQnNypg==}
+ engines: {node: '>=14'}
+
+ '@unocss/transformer-attributify-jsx@66.1.0-beta.7':
+ resolution: {integrity: sha512-4d5XqNmTW5HRIsrmTCEde5owor0jRfUIo0kDIkrCzmCQPkOPuZ0YSmtFWdiwZHGQ6P9XjITpUIGRkGuG88YQzQ==}
+
+ '@unocss/transformer-compile-class@66.1.0-beta.7':
+ resolution: {integrity: sha512-QuK8KQfsV2Ak3S5vhTlvLUOMBW98hJ8LDUt8AUgPu+OyhW4VE61wGzfStRYR3UCZXHob70Efd6VOuyuHE/yKcg==}
+
+ '@unocss/transformer-directives@66.1.0-beta.7':
+ resolution: {integrity: sha512-R3mLIcIjitsrVKvkrVPTUwPzZAV3S5Ka4X3PXLihq9gdRfl8kZVOCxXjSojdcwhCF5nggHDt2WD0ZAoFxG4zeA==}
+
+ '@unocss/transformer-variant-group@66.1.0-beta.7':
+ resolution: {integrity: sha512-4ECJ2dAcl0pW1kIHpAwpPc8qOZ2OJOwiRp8TJrQdK+sLl2XgHci0ERiSr1tED6BvIP9Mp4w2iJ3TtMWiGC4gXg==}
+
+ '@unocss/vite@66.1.0-beta.7':
+ resolution: {integrity: sha512-7dDdFdaO6Mz7xTd/jZYqe8NkBn4CjJFN7uPK9xLLZEPNFT6anOkTv2UB9qU5lb4NcHFr5dyCVrRtqb0X4rmOMQ==}
+ peerDependencies:
+ vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+
+ '@unrs/resolver-binding-darwin-arm64@1.3.2':
+ resolution: {integrity: sha512-ddnlXgRi0Fog5+7U5Q1qY62wl95Q1lB4tXQX1UIA9YHmRCHN2twaQW0/4tDVGCvTVEU3xEayU7VemEr7GcBYUw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-darwin-x64@1.3.2':
+ resolution: {integrity: sha512-tnl9xoEeg503jis+LW5cuq4hyLGQyqaoBL8VdPSqcewo/FL1C8POHbzl+AL25TidWYJD+R6bGUTE381kA1sT9w==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-freebsd-x64@1.3.2':
+ resolution: {integrity: sha512-zyPn9LFCCjhKPeCtECZaiMUgkYN/VpLb4a9Xv7QriJmTaQxsuDtXqOHifrzUXIhorJTyS+5MOKDuNL0X9I4EHA==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.2':
+ resolution: {integrity: sha512-UWx56Wh59Ro69fe+Wfvld4E1n9KG0e3zeouWLn8eSasyi/yVH/7ZW3CLTVFQ81oMKSpXwr5u6RpzttDXZKiO4g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.3.2':
+ resolution: {integrity: sha512-VYGQXsOEJtfaoY2fOm8Z9ii5idFaHFYlrq3yMFZPaFKo8ufOXYm8hnfru7qetbM9MX116iWaPC0ZX5sK+1Dr+g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.3.2':
+ resolution: {integrity: sha512-3zP420zxJfYPD1rGp2/OTIBxF8E3+/6VqCG+DEO6kkDgBiloa7Y8pw1o7N9BfgAC+VC8FPZsFXhV2lpx+lLRMQ==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.3.2':
+ resolution: {integrity: sha512-ZWjSleUgr88H4Kei7yT4PlPqySTuWN1OYDDcdbmMCtLWFly3ed+rkrcCb3gvqXdDbYrGOtzv3g2qPEN+WWNv5Q==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.3.2':
+ resolution: {integrity: sha512-p+5OvYJ2UOlpjes3WfBlxyvQok2u26hLyPxLFHkYlfzhZW0juhvBf/tvewz1LDFe30M7zL9cF4OOO5dcvtk+cw==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.3.2':
+ resolution: {integrity: sha512-yweY7I6SqNn3kvj6vE4PQRo7j8Oz6+NiUhmgciBNAUOuI3Jq0bnW29hbHJdxZRSN1kYkQnSkbbA1tT8VnK816w==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.3.2':
+ resolution: {integrity: sha512-fNIvtzJcGN9hzWTIayrTSk2+KHQrqKbbY+I88xMVMOFV9t4AXha4veJdKaIuuks+2JNr6GuuNdsL7+exywZ32w==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-x64-musl@1.3.2':
+ resolution: {integrity: sha512-OaFEw8WAjiwBGxutQgkWhoAGB5BQqZJ8Gjt/mW+m6DWNjimcxU22uWCuEtfw1CIwLlKPOzsgH0429fWmZcTGkg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@unrs/resolver-binding-wasm32-wasi@1.3.2':
+ resolution: {integrity: sha512-u+sumtO7M0AGQ9bNQrF4BHNpUyxo23FM/yXZfmVAicTQ+mXtG06O7pm5zQUw3Mr4jRs2I84uh4O0hd8bdouuvQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.3.2':
+ resolution: {integrity: sha512-ZAJKy95vmDIHsRFuPNqPQRON8r2mSMf3p9DoX+OMOhvu2c8OXGg8MvhGRf3PNg45ozRrPdXDnngURKgaFfpGoQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.3.2':
+ resolution: {integrity: sha512-nQG4YFAS2BLoKVQFK/FrWJvFATI5DQUWQrcPcsWG9Ve5BLLHZuPOrJ2SpAJwLXQrRv6XHSFAYGI8wQpBg/CiFA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.3.2':
+ resolution: {integrity: sha512-XBWpUP0mHya6yGBwNefhyEa6V7HgYKCxEAY4qhTm/PcAQyBPNmjj97VZJOJkVdUsyuuii7xmq0pXWX/c2aToHQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@vitejs/plugin-vue-jsx@4.1.2':
+ resolution: {integrity: sha512-4Rk0GdE0QCdsIkuMmWeg11gmM4x8UmTnZR/LWPm7QJ7+BsK4tq08udrN0isrrWqz5heFy9HLV/7bOLgFS8hUjA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0
+ vue: ^3.0.0
+
+ '@vitejs/plugin-vue@5.2.3':
+ resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0
+ vue: ^3.2.25
+
+ '@vitest/eslint-plugin@1.1.38':
+ resolution: {integrity: sha512-KcOTZyVz8RiM5HyriiDVrP1CyBGuhRxle+lBsmSs6NTJEO/8dKVAq+f5vQzHj1/Kc7bYXSDO6yBe62Zx0t5iaw==}
+ peerDependencies:
+ '@typescript-eslint/utils': ^8.24.0
+ eslint: '>= 8.57.0'
+ typescript: '>= 5.0.0'
+ vitest: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ vitest:
+ optional: true
+
+ '@vitest/expect@3.0.9':
+ resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==}
+
+ '@vitest/mocker@3.0.9':
+ resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0 || ^6.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/pretty-format@3.0.9':
+ resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==}
+
+ '@vitest/runner@3.0.9':
+ resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==}
+
+ '@vitest/snapshot@3.0.9':
+ resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==}
+
+ '@vitest/spy@3.0.9':
+ resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==}
+
+ '@vitest/utils@3.0.9':
+ resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==}
+
+ '@volar/language-core@2.4.12':
+ resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==}
+
+ '@volar/source-map@2.4.12':
+ resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==}
+
+ '@volar/typescript@2.4.12':
+ resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==}
+
+ '@vue/babel-helper-vue-transform-on@1.4.0':
+ resolution: {integrity: sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==}
+
+ '@vue/babel-plugin-jsx@1.4.0':
+ resolution: {integrity: sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+
+ '@vue/babel-plugin-resolve-type@1.4.0':
+ resolution: {integrity: sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@vue/compiler-core@3.5.13':
+ resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
+
+ '@vue/compiler-dom@3.5.13':
+ resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+
+ '@vue/compiler-sfc@3.5.13':
+ resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
+
+ '@vue/compiler-ssr@3.5.13':
+ resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
+
+ '@vue/compiler-vue2@2.7.16':
+ resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+ '@vue/devtools-api@6.6.4':
+ resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+ '@vue/devtools-api@7.7.2':
+ resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==}
+
+ '@vue/devtools-kit@7.7.2':
+ resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==}
+
+ '@vue/devtools-shared@7.7.2':
+ resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==}
+
+ '@vue/language-core@2.2.8':
+ resolution: {integrity: sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@vue/reactivity@3.5.13':
+ resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
+
+ '@vue/runtime-core@3.5.13':
+ resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
+
+ '@vue/runtime-dom@3.5.13':
+ resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
+
+ '@vue/server-renderer@3.5.13':
+ resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
+ peerDependencies:
+ vue: 3.5.13
+
+ '@vue/shared@3.5.13':
+ resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+ '@vue/test-utils@2.4.6':
+ resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
+
+ '@vueuse/core@9.13.0':
+ resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+
+ '@vueuse/metadata@9.13.0':
+ resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+
+ '@vueuse/shared@9.13.0':
+ resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+
+ '@xmldom/xmldom@0.8.10':
+ resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
+ engines: {node: '>=10.0.0'}
+
+ abbrev@2.0.0:
+ resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.14.1:
+ resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ alien-signals@1.0.8:
+ resolution: {integrity: sha512-5Tnk+Q3E7b4NgTgxAyoggQHeEzUicxgiZhcFvBQhM4catV+wFDTmoHPectL7FL5YzkCjz4zhB/y00Q7n3vwVGQ==}
+
+ ansi-escapes@7.0.0:
+ resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
+ engines: {node: '>=18'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ ansis@3.17.0:
+ resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==}
+ engines: {node: '>=14'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ are-docs-informative@0.0.2:
+ resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
+ engines: {node: '>=14'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ axios@1.8.4:
+ resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ birpc@0.2.19:
+ resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.24.4:
+ resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ builtin-modules@4.0.0:
+ resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==}
+ engines: {node: '>=18.20'}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ caniuse-lite@1.0.30001707:
+ resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ chai@5.2.0:
+ resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==}
+ engines: {node: '>=12'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.4.1:
+ resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ check-error@2.1.1:
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+ engines: {node: '>= 16'}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ ci-info@4.2.0:
+ resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==}
+ engines: {node: '>=8'}
+
+ clean-regexp@1.0.0:
+ resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+ engines: {node: '>=4'}
+
+ cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+
+ cli-truncate@4.0.0:
+ resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+ engines: {node: '>=18'}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clone-buffer@1.0.0:
+ resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==}
+ engines: {node: '>= 0.10'}
+
+ clone-stats@1.0.0:
+ resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==}
+
+ clone@2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+
+ cloneable-readable@1.1.3:
+ resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@3.2.1:
+ resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ colorspace@1.1.4:
+ resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+
+ commander@13.1.0:
+ resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
+ engines: {node: '>=18'}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ comment-parser@1.4.1:
+ resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
+ engines: {node: '>= 12.0.0'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.1:
+ resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==}
+
+ config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ copy-anything@3.0.5:
+ resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+ engines: {node: '>=12.13'}
+
+ core-js-compat@3.41.0:
+ resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ css-select@4.3.0:
+ resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
+ css-select@5.1.0:
+ resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+
+ css-selector-parser@1.4.1:
+ resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==}
+
+ css-tree@1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+ engines: {node: '>=8.0.0'}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-tree@3.1.0:
+ resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@4.2.0:
+ resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+ engines: {node: '>=8.0.0'}
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ cssom@0.5.0:
+ resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+ de-indent@1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.0:
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decode-named-character-reference@1.1.0:
+ resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==}
+
+ deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destr@2.0.3:
+ resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+
+ dom-serializer@1.4.1:
+ resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ dom-zindex@1.0.6:
+ resolution: {integrity: sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@4.3.1:
+ resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+ engines: {node: '>= 4'}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@2.8.0:
+ resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexer@0.1.2:
+ resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ editorconfig@1.0.4:
+ resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ electron-to-chromium@1.5.126:
+ resolution: {integrity: sha512-AtH1uLcTC72LA4vfYcEJJkrMk/MY/X0ub8Hv7QGAePW2JkeUFHEL/QfS4J77R6M87Sss8O0OcqReSaN1bpyA+Q==}
+
+ element-plus@2.9.7:
+ resolution: {integrity: sha512-6vjZh5SXBncLhUwJGTVKS5oDljfgGMh6J4zVTeAZK3YdMUN76FgpvHkwwFXocpJpMbii6rDYU3sgie64FyPerQ==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ enabled@2.0.0:
+ resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
+
+ enhanced-resolve@5.18.1:
+ resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
+ engines: {node: '>=10.13.0'}
+
+ entities@2.2.0:
+ resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@1.6.0:
+ resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.23.1:
+ resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ esbuild@0.25.1:
+ resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-compat-utils@0.5.1:
+ resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-compat-utils@0.6.4:
+ resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-config-flat-gitignore@2.1.0:
+ resolution: {integrity: sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==}
+ peerDependencies:
+ eslint: ^9.5.0
+
+ eslint-flat-config-utils@2.0.1:
+ resolution: {integrity: sha512-brf0eAgQ6JlKj3bKfOTuuI7VcCZvi8ZCD1MMTVoEvS/d38j8cByZViLFALH/36+eqB17ukmfmKq3bWzGvizejA==}
+
+ eslint-formatting-reporter@0.0.0:
+ resolution: {integrity: sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==}
+ peerDependencies:
+ eslint: '>=8.40.0'
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-json-compat-utils@0.2.1:
+ resolution: {integrity: sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@eslint/json': '*'
+ eslint: '*'
+ jsonc-eslint-parser: ^2.4.0
+ peerDependenciesMeta:
+ '@eslint/json':
+ optional: true
+
+ eslint-merge-processors@2.0.0:
+ resolution: {integrity: sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==}
+ peerDependencies:
+ eslint: '*'
+
+ eslint-parser-plain@0.1.1:
+ resolution: {integrity: sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==}
+
+ eslint-plugin-antfu@3.1.1:
+ resolution: {integrity: sha512-7Q+NhwLfHJFvopI2HBZbSxWXngTwBLKxW1AGXLr2lEGxcEIK/AsDs8pn8fvIizl5aZjBbVbVK5ujmMpBe4Tvdg==}
+ peerDependencies:
+ eslint: '*'
+
+ eslint-plugin-command@3.2.0:
+ resolution: {integrity: sha512-PSDOB9k7Wd57pp4HD/l3C1D93pKX8/wQo0kWDI4q6/UpgrfMTyNsavklipgiZqbXl1+VBABY1buCcQE5LDpg5g==}
+ peerDependencies:
+ eslint: '*'
+
+ eslint-plugin-es-x@7.8.0:
+ resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=8'
+
+ eslint-plugin-format@1.0.1:
+ resolution: {integrity: sha512-Tdns+CDjS+m7QrM85wwRi2yLae88XiWVdIOXjp9mDII0pmTBQlczPCmjpKnjiUIY3yPZNLqb5Ms/A/JXcBF2Dw==}
+ peerDependencies:
+ eslint: ^8.40.0 || ^9.0.0
+
+ eslint-plugin-import-x@4.9.3:
+ resolution: {integrity: sha512-NrPUarxpFzGpQVXdVWkGttDD8WIxBuM/dRNw5kKFxrlGdjAJ3l8ma0LK5hsK5Qp79GBGM+HY1zYVbHqateTklA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+
+ eslint-plugin-jsdoc@50.6.9:
+ resolution: {integrity: sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+
+ eslint-plugin-jsonc@2.20.0:
+ resolution: {integrity: sha512-FRgCn9Hzk5eKboCbVMrr9QrhM0eO4G+WKH8IFXoaeqhM/2kuWzbStJn4kkr0VWL8J5H8RYZF+Aoam1vlBaZVkw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-plugin-n@17.17.0:
+ resolution: {integrity: sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: '>=8.23.0'
+
+ eslint-plugin-no-only-tests@3.3.0:
+ resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==}
+ engines: {node: '>=5.0.0'}
+
+ eslint-plugin-perfectionist@4.10.1:
+ resolution: {integrity: sha512-GXwFfL47RfBLZRGQdrvGZw9Ali2T2GPW8p4Gyj2fyWQ9396R/HgJMf0m9kn7D6WXRwrINfTDGLS+QYIeok9qEg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ peerDependencies:
+ eslint: '>=8.45.0'
+
+ eslint-plugin-pnpm@0.3.1:
+ resolution: {integrity: sha512-vi5iHoELIAlBbX4AW8ZGzU3tUnfxuXhC/NKo3qRcI5o9igbz6zJUqSlQ03bPeMqWIGTPatZnbWsNR1RnlNERNQ==}
+ peerDependencies:
+ eslint: ^9.0.0
+
+ eslint-plugin-regexp@2.7.0:
+ resolution: {integrity: sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==}
+ engines: {node: ^18 || >=20}
+ peerDependencies:
+ eslint: '>=8.44.0'
+
+ eslint-plugin-toml@0.12.0:
+ resolution: {integrity: sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-plugin-unicorn@57.0.0:
+ resolution: {integrity: sha512-zUYYa6zfNdTeG9BISWDlcLmz16c+2Ck2o5ZDHh0UzXJz3DEP7xjmlVDTzbyV0W+XksgZ0q37WEWzN2D2Ze+g9Q==}
+ engines: {node: '>=18.18'}
+ peerDependencies:
+ eslint: '>=9.20.0'
+
+ eslint-plugin-unused-imports@4.1.4:
+ resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0
+ eslint: ^9.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+
+ eslint-plugin-vue@10.0.0:
+ resolution: {integrity: sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ vue-eslint-parser: ^10.0.0
+
+ eslint-plugin-yml@1.17.0:
+ resolution: {integrity: sha512-Q3LXFRnNpGYAK/PM0BY1Xs0IY1xTLfM0kC986nNQkx1l8tOGz+YS50N6wXkAJkrBpeUN9OxEMB7QJ+9MTDAqIQ==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-processor-vue-blocks@2.0.0:
+ resolution: {integrity: sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==}
+ peerDependencies:
+ '@vue/compiler-sfc': ^3.3.0
+ eslint: '>=9.0.0'
+
+ eslint-scope@8.3.0:
+ resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.0:
+ resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.23.0:
+ resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.3.0:
+ resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+
+ expect-type@1.2.0:
+ resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==}
+ engines: {node: '>=12.0.0'}
+
+ exsolve@1.0.4:
+ resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+ fdir@6.4.3:
+ resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ fecha@4.2.3:
+ resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up-simple@1.0.1:
+ resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==}
+ engines: {node: '>=18'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+ fn.name@1.1.0:
+ resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
+
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ foreground-child@3.3.1:
+ resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+ engines: {node: '>=14'}
+
+ form-data@4.0.2:
+ resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
+ engines: {node: '>= 6'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
+ get-tsconfig@4.10.0:
+ resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.15.0:
+ resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+ engines: {node: '>=18'}
+
+ globals@16.0.0:
+ resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
+ engines: {node: '>=18'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ gzip-size@6.0.0:
+ resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
+ engines: {node: '>=10'}
+
+ happy-dom@17.4.4:
+ resolution: {integrity: sha512-/Pb0ctk3HTZ5xEL3BZ0hK1AqDSAUuRQitOmROPHhfUYEWpmTImwfD8vFDGADmMAX0JYgbcgxWoLFKtsWhcpuVA==}
+ engines: {node: '>=18.0.0'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ hookable@5.5.3:
+ resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+ hosted-git-info@7.0.2:
+ resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
+ human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+
+ husky@9.1.7:
+ resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ immutable@4.3.7:
+ resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ indent-string@5.0.0:
+ resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
+ engines: {node: '>=12'}
+
+ index-to-position@1.0.0:
+ resolution: {integrity: sha512-sCO7uaLVhRJ25vz1o8s9IFM3nVS4DkuQnyjMwiQPKvQuBYBDmb8H7zx8ki7nVh4HJQOdVWebyvLE0qt+clruxA==}
+ engines: {node: '>=18'}
+
+ inflight@1.0.6:
+ resolution: {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.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-builtin-module@4.0.0:
+ resolution: {integrity: sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==}
+ engines: {node: '>=18.20'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+
+ is-fullwidth-code-point@5.0.0:
+ resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+ engines: {node: '>=18'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-what@4.1.16:
+ resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+ engines: {node: '>=12.13'}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ jiti@2.4.2:
+ resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+ hasBin: true
+
+ js-beautify@1.15.4:
+ resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ js-cookie@3.0.5:
+ resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+ engines: {node: '>=14'}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsdoc-type-pratt-parser@4.1.0:
+ resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
+ engines: {node: '>=12.0.0'}
+
+ jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-eslint-parser@2.4.0:
+ resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ kuler@2.0.0:
+ resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
+ lint-staged@15.5.0:
+ resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+
+ listr2@8.2.5:
+ resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==}
+ engines: {node: '>=18.0.0'}
+
+ local-pkg@0.5.1:
+ resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+ engines: {node: '>=14'}
+
+ local-pkg@1.1.1:
+ resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
+ engines: {node: '>=14'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+ lodash-unified@1.0.3:
+ resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+ peerDependencies:
+ '@types/lodash-es': '*'
+ lodash: '*'
+ lodash-es: '*'
+
+ lodash.escape@4.0.1:
+ resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-update@6.1.0:
+ resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+ engines: {node: '>=18'}
+
+ logform@2.7.0:
+ resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
+ engines: {node: '>= 12.0.0'}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loupe@3.1.3:
+ resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+ mdast-util-from-markdown@2.0.2:
+ resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.1.0:
+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ mdn-data@2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+
+ mdn-data@2.12.2:
+ resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
+
+ memoize-one@6.0.0:
+ resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromark-core-commonmark@2.0.3:
+ resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+ micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+ micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+ micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+ micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+ micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+ micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+ micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+ micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-subtokenize@2.1.0:
+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
+ micromark@4.0.2:
+ resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
+ minimatch@10.0.1:
+ resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
+ engines: {node: 20 || >=22}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.1:
+ resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mitt@3.0.1:
+ resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+ mlly@1.7.4:
+ resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
+
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ mustache@4.2.0:
+ resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
+ hasBin: true
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ natural-orderby@5.0.0:
+ resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==}
+ engines: {node: '>=18'}
+
+ node-fetch-native@1.6.6:
+ resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==}
+
+ node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+ nopt@7.2.1:
+ resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+
+ normalize-package-data@6.0.2:
+ resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-wheel-es@1.2.0:
+ resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
+ normalize.css@8.0.1:
+ resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ nprogress@0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ ofetch@1.4.1:
+ resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ one-time@1.0.0:
+ resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ package-manager-detector@0.2.11:
+ resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-gitignore@2.0.0:
+ resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==}
+ engines: {node: '>=14'}
+
+ parse-imports@2.2.1:
+ resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==}
+ engines: {node: '>= 18'}
+
+ parse-json@8.2.0:
+ resolution: {integrity: sha512-eONBZy4hm2AgxjNFd8a4nyDJnzUAH0g34xSQAwWEVGCjdZ4ZL7dKZBfq267GWP/JaS9zW62Xs2FeAdDvpHHJGQ==}
+ engines: {node: '>=18'}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-to-regexp@8.2.0:
+ resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
+ engines: {node: '>=16'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ pathval@2.0.0:
+ resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+ engines: {node: '>= 14.16'}
+
+ perfect-debounce@1.0.0:
+ resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
+ pidtree@0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ pinia@3.0.1:
+ resolution: {integrity: sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==}
+ peerDependencies:
+ typescript: '>=4.4.4'
+ vue: ^2.7.0 || ^3.5.11
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.1.0:
+ resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
+
+ pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+
+ pnpm-workspace-yaml@0.3.1:
+ resolution: {integrity: sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA==}
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss@8.5.3:
+ resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+
+ prettier@3.5.3:
+ resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ prettysize@2.0.0:
+ resolution: {integrity: sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg==}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ quansync@0.2.10:
+ resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ read-package-up@11.0.0:
+ resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==}
+ engines: {node: '>=18'}
+
+ read-pkg@9.0.1:
+ resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==}
+ engines: {node: '>=18'}
+
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ refa@0.12.1:
+ resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ regexp-ast-analysis@0.7.1:
+ resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ regexp-tree@0.1.27:
+ resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+ hasBin: true
+
+ regjsparser@0.12.0:
+ resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==}
+ hasBin: true
+
+ remove-trailing-separator@1.1.0:
+ resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==}
+
+ replace-ext@1.0.1:
+ resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==}
+ engines: {node: '>= 0.10'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rollup@4.37.0:
+ resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ sass@1.78.0:
+ resolution: {integrity: sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ screenfull@6.0.2:
+ resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+
+ scslre@0.3.0:
+ resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==}
+ engines: {node: ^14.0.0 || >=16.0.0}
+
+ scule@1.3.0:
+ resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.7.1:
+ resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
+ sirv@3.0.1:
+ resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
+ engines: {node: '>=18'}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ slashes@3.0.12:
+ resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==}
+
+ slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+
+ slice-ansi@7.1.0:
+ resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+ engines: {node: '>=18'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+ spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+
+ spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+ spdx-expression-parse@4.0.0:
+ resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
+
+ spdx-license-ids@3.0.21:
+ resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==}
+
+ speakingurl@14.0.1:
+ resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+ engines: {node: '>=0.10.0'}
+
+ stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+
+ stable@0.1.8:
+ resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+ deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+
+ stack-trace@0.0.10:
+ resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
+
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+ std-env@3.8.1:
+ resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==}
+
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ strip-indent@4.0.0:
+ resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
+ engines: {node: '>=12'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ strip-literal@3.0.0:
+ resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
+
+ superjson@2.2.2:
+ resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
+ engines: {node: '>=16'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svg-sprite@2.0.4:
+ resolution: {integrity: sha512-kjDoATgr4k6tdtfQczpkbuFW6RE7tPUPe/rbRd1n2NV92kdwaXEZMIxJqAZfMGOMfU/Kp1u89SUYsfHCbAvVHg==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ svgo@2.8.0:
+ resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ svgo@3.3.2:
+ resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ synckit@0.10.3:
+ resolution: {integrity: sha512-R1urvuyiTaWfeCggqEvpDJwAlDVdsT9NM+IP//Tk2x7qHCkSvBk/fwFgw/TLAHzZlrAnnazMcRw0ZD8HlYFTEQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ synckit@0.9.2:
+ resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
+ text-hex@1.0.0:
+ resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
+
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinyglobby@0.2.12:
+ resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
+ engines: {node: '>=12.0.0'}
+
+ tinypool@1.0.2:
+ resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@2.0.0:
+ resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+ engines: {node: '>=14.0.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toml-eslint-parser@0.10.0:
+ resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
+ triple-beam@1.4.1:
+ resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
+ engines: {node: '>= 14.0.0'}
+
+ ts-api-utils@2.1.0:
+ resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.19.2:
+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@4.38.0:
+ resolution: {integrity: sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==}
+ engines: {node: '>=16'}
+
+ typescript@5.8.2:
+ resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.5.4:
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+ unconfig@7.3.1:
+ resolution: {integrity: sha512-LH5WL+un92tGAzWS87k7LkAfwpMdm7V0IXG2FxEjZz/QxiIW5J5LkcrKQThj0aRz6+h/lFmKI9EUXmK/T0bcrw==}
+
+ undici-types@6.20.0:
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+ unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
+
+ unimport@4.1.2:
+ resolution: {integrity: sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==}
+ engines: {node: '>=18.12.0'}
+
+ unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+ unocss@66.1.0-beta.7:
+ resolution: {integrity: sha512-LFS45xWUOfu1+4EaFlSvpcXEJ6ZYwZ3HMmQpgKRvMmp6WAcv+WQEgvgM6Y/ar8TIFBpXwr5fvSM/OEXesqX7Ng==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@unocss/webpack': 66.1.0-beta.7
+ vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
+ peerDependenciesMeta:
+ '@unocss/webpack':
+ optional: true
+ vite:
+ optional: true
+
+ unplugin-auto-import@19.1.2:
+ resolution: {integrity: sha512-EkxNIJm4ZPYtV7rRaPBKnsscgTaifIZNrJF5DkMffTxkUOJOlJuKVypA6YBSBOjzPJDTFPjfVmCQPoBuOO+YYQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': ^3.2.2
+ '@vueuse/core': '*'
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+ '@vueuse/core':
+ optional: true
+
+ unplugin-svg-component@0.12.1:
+ resolution: {integrity: sha512-/K9I8+rsChiFOQgwL7FxiKqqUl8U/wozGC2sCdJL28EVo4dAu2IfZDlZg5dSKv65Gii4b8Gpj8K+ZkHTWnKyFg==}
+
+ unplugin-utils@0.2.4:
+ resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==}
+ engines: {node: '>=18.12.0'}
+
+ unplugin-vue-components@28.4.1:
+ resolution: {integrity: sha512-niGSc0vJD9ueAnsqcfAldmtpkppZ09B6p2G1dL7X5S8KPdgbk1P+txPwaaDCe7N+eZh2VG1aAypLXkuJs3OSUg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/parser': ^7.15.8
+ '@nuxt/kit': ^3.2.2
+ vue: 2 || 3
+ peerDependenciesMeta:
+ '@babel/parser':
+ optional: true
+ '@nuxt/kit':
+ optional: true
+
+ unplugin@1.16.1:
+ resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+ engines: {node: '>=14.0.0'}
+
+ unplugin@2.2.2:
+ resolution: {integrity: sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==}
+ engines: {node: '>=18.12.0'}
+
+ unrs-resolver@1.3.2:
+ resolution: {integrity: sha512-ZKQBC351Ubw0PY8xWhneIfb6dygTQeUHtCcNGd0QB618zabD/WbFMYdRyJ7xeVT+6G82K5v/oyZO0QSHFtbIuw==}
+
+ update-browserslist-db@1.1.3:
+ resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vinyl@2.2.1:
+ resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==}
+ engines: {node: '>= 0.10'}
+
+ vite-node@3.0.9:
+ resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+
+ vite-svg-loader@5.1.0:
+ resolution: {integrity: sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==}
+ peerDependencies:
+ vue: '>=3.2.13'
+
+ vite@6.2.3:
+ resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitest@3.0.9:
+ resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/debug': ^4.1.12
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ '@vitest/browser': 3.0.9
+ '@vitest/ui': 3.0.9
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/debug':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ vscode-uri@3.1.0:
+ resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+ vue-component-type-helpers@2.2.8:
+ resolution: {integrity: sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA==}
+
+ vue-demi@0.14.10:
+ resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+ engines: {node: '>=12'}
+ hasBin: true
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+
+ vue-eslint-parser@10.1.1:
+ resolution: {integrity: sha512-bh2Z/Au5slro9QJ3neFYLanZtb1jH+W2bKqGHXAoYD4vZgNG3KeotL7JpPv5xzY4UXUXJl7TrIsnzECH63kd3Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+
+ vue-flow-layout@0.1.1:
+ resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==}
+ peerDependencies:
+ vue: ^3.4.37
+
+ vue-router@4.5.0:
+ resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
+ peerDependencies:
+ vue: ^3.2.0
+
+ vue-tsc@2.2.8:
+ resolution: {integrity: sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.0.0'
+
+ vue@3.5.13:
+ resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ vxe-table@4.6.25:
+ resolution: {integrity: sha512-rFhGh8w+420cdnIasQKisiKagz9F/iNieB/z6v0j4GcsMfGHEmSJ72YrHcXogQh4wNlCzKVfb7rl7nREL5eIOg==}
+ peerDependencies:
+ vue: ^3.2.28
+
+ webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ whatwg-mimetype@3.0.0:
+ resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+ engines: {node: '>=12'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ winston-transport@4.9.0:
+ resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
+ engines: {node: '>= 12.0.0'}
+
+ winston@3.17.0:
+ resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==}
+ engines: {node: '>= 12.0.0'}
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ xe-utils@3.7.4:
+ resolution: {integrity: sha512-9yuCHLOU+og4OEkPWWtzrYk1Zt1hgN66U/NCJ0+vYJSx1MplBtoQRz8aEA+2RmCr3leLru98vQxNpw/vJsu/sg==}
+
+ xml-name-validator@4.0.0:
+ resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+ engines: {node: '>=12'}
+
+ xpath@0.0.34:
+ resolution: {integrity: sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==}
+ engines: {node: '>=0.6.0'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yaml-eslint-parser@1.3.0:
+ resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+
+ yaml@2.7.0:
+ resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@antfu/eslint-config@4.11.0(@typescript-eslint/utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(@vue/compiler-sfc@3.5.13)(eslint-plugin-format@1.0.1(eslint@9.23.0(jiti@2.4.2)))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(happy-dom@17.4.4)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))':
+ dependencies:
+ '@antfu/install-pkg': 1.0.0
+ '@clack/prompts': 0.10.0
+ '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.23.0(jiti@2.4.2))
+ '@eslint/markdown': 6.3.0
+ '@stylistic/eslint-plugin': 4.2.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ '@typescript-eslint/parser': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ '@vitest/eslint-plugin': 1.1.38(@typescript-eslint/utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(happy-dom@17.4.4)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))
+ ansis: 3.17.0
+ cac: 6.7.14
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-config-flat-gitignore: 2.1.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-flat-config-utils: 2.0.1
+ eslint-merge-processors: 2.0.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-antfu: 3.1.1(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-command: 3.2.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-import-x: 4.9.3(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ eslint-plugin-jsdoc: 50.6.9(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-jsonc: 2.20.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-n: 17.17.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-no-only-tests: 3.3.0
+ eslint-plugin-perfectionist: 4.10.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ eslint-plugin-pnpm: 0.3.1(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-regexp: 2.7.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-toml: 0.12.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-unicorn: 57.0.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))
+ eslint-plugin-vue: 10.0.0(eslint@9.23.0(jiti@2.4.2))(vue-eslint-parser@10.1.1(eslint@9.23.0(jiti@2.4.2)))
+ eslint-plugin-yml: 1.17.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.23.0(jiti@2.4.2))
+ globals: 16.0.0
+ jsonc-eslint-parser: 2.4.0
+ local-pkg: 1.1.1
+ parse-gitignore: 2.0.0
+ toml-eslint-parser: 0.10.0
+ vue-eslint-parser: 10.1.1(eslint@9.23.0(jiti@2.4.2))
+ yaml-eslint-parser: 1.3.0
+ optionalDependencies:
+ eslint-plugin-format: 1.0.1(eslint@9.23.0(jiti@2.4.2))
+ transitivePeerDependencies:
+ - '@eslint/json'
+ - '@typescript-eslint/utils'
+ - '@vue/compiler-sfc'
+ - supports-color
+ - typescript
+ - vitest
+
+ '@antfu/install-pkg@1.0.0':
+ dependencies:
+ package-manager-detector: 0.2.11
+ tinyexec: 0.3.2
+
+ '@antfu/utils@8.1.1': {}
+
+ '@babel/code-frame@7.26.2':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.26.8': {}
+
+ '@babel/core@7.26.10':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.27.0
+ '@babel/helper-compilation-targets': 7.27.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
+ '@babel/helpers': 7.27.0
+ '@babel/parser': 7.27.0
+ '@babel/template': 7.27.0
+ '@babel/traverse': 7.27.0
+ '@babel/types': 7.27.0
+ convert-source-map: 2.0.0
+ debug: 4.4.0
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.27.0':
+ dependencies:
+ '@babel/parser': 7.27.0
+ '@babel/types': 7.27.0
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ dependencies:
+ '@babel/types': 7.27.0
+
+ '@babel/helper-compilation-targets@7.27.0':
+ dependencies:
+ '@babel/compat-data': 7.26.8
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.4
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/traverse': 7.27.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-member-expression-to-functions@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.27.0
+ '@babel/types': 7.27.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.27.0
+ '@babel/types': 7.27.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.27.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.25.9':
+ dependencies:
+ '@babel/types': 7.27.0
+
+ '@babel/helper-plugin-utils@7.26.5': {}
+
+ '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/traverse': 7.27.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.27.0
+ '@babel/types': 7.27.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helpers@7.27.0':
+ dependencies:
+ '@babel/template': 7.27.0
+ '@babel/types': 7.27.0
+
+ '@babel/parser@7.27.0':
+ dependencies:
+ '@babel/types': 7.27.0
+
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/template@7.27.0':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/parser': 7.27.0
+ '@babel/types': 7.27.0
+
+ '@babel/traverse@7.27.0':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.27.0
+ '@babel/parser': 7.27.0
+ '@babel/template': 7.27.0
+ '@babel/types': 7.27.0
+ debug: 4.4.0
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.27.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@clack/core@0.4.1':
+ dependencies:
+ picocolors: 1.1.1
+ sisteransi: 1.0.5
+
+ '@clack/prompts@0.10.0':
+ dependencies:
+ '@clack/core': 0.4.1
+ picocolors: 1.1.1
+ sisteransi: 1.0.5
+
+ '@colors/colors@1.6.0': {}
+
+ '@ctrl/tinycolor@3.6.1': {}
+
+ '@dabh/diagnostics@2.0.3':
+ dependencies:
+ colorspace: 1.1.4
+ enabled: 2.0.0
+ kuler: 2.0.0
+
+ '@dprint/formatter@0.3.0': {}
+
+ '@dprint/markdown@0.17.8': {}
+
+ '@dprint/toml@0.6.4': {}
+
+ '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ vue: 3.5.13(typescript@5.8.2)
+
+ '@emnapi/core@1.3.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.0.1
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.3.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.0.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@es-joy/jsdoccomment@0.49.0':
+ dependencies:
+ comment-parser: 1.4.1
+ esquery: 1.6.0
+ jsdoc-type-pratt-parser: 4.1.0
+
+ '@es-joy/jsdoccomment@0.50.0':
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.7
+ '@typescript-eslint/types': 8.28.0
+ comment-parser: 1.4.1
+ esquery: 1.6.0
+ jsdoc-type-pratt-parser: 4.1.0
+
+ '@esbuild/aix-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.25.1':
+ optional: true
+
+ '@esbuild/android-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.1':
+ optional: true
+
+ '@esbuild/android-arm@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm@0.25.1':
+ optional: true
+
+ '@esbuild/android-x64@0.23.1':
+ optional: true
+
+ '@esbuild/android-x64@0.25.1':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.1':
+ optional: true
+
+ '@esbuild/darwin-x64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.1':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.1':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.1':
+ optional: true
+
+ '@esbuild/linux-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.1':
+ optional: true
+
+ '@esbuild/linux-arm@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.1':
+ optional: true
+
+ '@esbuild/linux-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.1':
+ optional: true
+
+ '@esbuild/linux-loong64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.1':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.23.1':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.1':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.1':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.1':
+ optional: true
+
+ '@esbuild/linux-s390x@0.23.1':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.1':
+ optional: true
+
+ '@esbuild/linux-x64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.1':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.1':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.1':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.1':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.1':
+ optional: true
+
+ '@esbuild/sunos-x64@0.23.1':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.1':
+ optional: true
+
+ '@esbuild/win32-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.1':
+ optional: true
+
+ '@esbuild/win32-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.1':
+ optional: true
+
+ '@esbuild/win32-x64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.1':
+ optional: true
+
+ '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.23.0(jiti@2.4.2))':
+ dependencies:
+ escape-string-regexp: 4.0.0
+ eslint: 9.23.0(jiti@2.4.2)
+ ignore: 5.3.2
+
+ '@eslint-community/eslint-utils@4.5.1(eslint@9.23.0(jiti@2.4.2))':
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/compat@1.2.7(eslint@9.23.0(jiti@2.4.2))':
+ optionalDependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+
+ '@eslint/config-array@0.19.2':
+ dependencies:
+ '@eslint/object-schema': 2.1.6
+ debug: 4.4.0
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.2.0': {}
+
+ '@eslint/core@0.10.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/core@0.12.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.1':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.0
+ espree: 10.3.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.23.0': {}
+
+ '@eslint/markdown@6.3.0':
+ dependencies:
+ '@eslint/core': 0.10.0
+ '@eslint/plugin-kit': 0.2.7
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm: 3.1.0
+ micromark-extension-gfm: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/object-schema@2.1.6': {}
+
+ '@eslint/plugin-kit@0.2.7':
+ dependencies:
+ '@eslint/core': 0.12.0
+ levn: 0.4.1
+
+ '@floating-ui/core@1.6.9':
+ dependencies:
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/dom@1.6.13':
+ dependencies:
+ '@floating-ui/core': 1.6.9
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/utils@0.2.9': {}
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.6':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@humanwhocodes/retry@0.4.2': {}
+
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@2.3.0':
+ dependencies:
+ '@antfu/install-pkg': 1.0.0
+ '@antfu/utils': 8.1.1
+ '@iconify/types': 2.0.0
+ debug: 4.4.0
+ globals: 15.15.0
+ kolorist: 1.8.0
+ local-pkg: 1.1.1
+ mlly: 1.7.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@jridgewell/gen-mapping@0.3.8':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@napi-rs/wasm-runtime@0.2.7':
+ dependencies:
+ '@emnapi/core': 1.3.1
+ '@emnapi/runtime': 1.3.1
+ '@tybys/wasm-util': 0.9.0
+ optional: true
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+
+ '@one-ini/wasm@0.1.1': {}
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@pkgr/core@0.1.2': {}
+
+ '@pkgr/core@0.2.0': {}
+
+ '@polka/url@1.0.0-next.28': {}
+
+ '@quansync/fs@0.1.1':
+ dependencies:
+ quansync: 0.2.10
+
+ '@resvg/resvg-js-android-arm-eabi@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-android-arm64@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-darwin-arm64@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-darwin-x64@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-linux-arm64-gnu@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-linux-arm64-musl@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-linux-x64-gnu@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-linux-x64-musl@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-win32-arm64-msvc@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-win32-ia32-msvc@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js-win32-x64-msvc@2.6.2':
+ optional: true
+
+ '@resvg/resvg-js@2.6.2':
+ optionalDependencies:
+ '@resvg/resvg-js-android-arm-eabi': 2.6.2
+ '@resvg/resvg-js-android-arm64': 2.6.2
+ '@resvg/resvg-js-darwin-arm64': 2.6.2
+ '@resvg/resvg-js-darwin-x64': 2.6.2
+ '@resvg/resvg-js-linux-arm-gnueabihf': 2.6.2
+ '@resvg/resvg-js-linux-arm64-gnu': 2.6.2
+ '@resvg/resvg-js-linux-arm64-musl': 2.6.2
+ '@resvg/resvg-js-linux-x64-gnu': 2.6.2
+ '@resvg/resvg-js-linux-x64-musl': 2.6.2
+ '@resvg/resvg-js-win32-arm64-msvc': 2.6.2
+ '@resvg/resvg-js-win32-ia32-msvc': 2.6.2
+ '@resvg/resvg-js-win32-x64-msvc': 2.6.2
+
+ '@rollup/rollup-android-arm-eabi@4.37.0':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.37.0':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.37.0':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.37.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.37.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.37.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.37.0':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.37.0':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.37.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.37.0':
+ optional: true
+
+ '@stylistic/eslint-plugin@4.2.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)':
+ dependencies:
+ '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+ estraverse: 5.3.0
+ picomatch: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@sxzz/popperjs-es@2.11.7': {}
+
+ '@trysound/sax@0.2.0': {}
+
+ '@tybys/wasm-util@0.9.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 2.1.0
+
+ '@types/doctrine@0.0.9': {}
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.7
+ '@types/json-schema': 7.0.15
+
+ '@types/estree@1.0.6': {}
+
+ '@types/estree@1.0.7': {}
+
+ '@types/js-cookie@3.0.6': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/lodash-es@4.17.12':
+ dependencies:
+ '@types/lodash': 4.17.16
+
+ '@types/lodash@4.17.16': {}
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/ms@2.1.0': {}
+
+ '@types/node@22.13.14':
+ dependencies:
+ undici-types: 6.20.0
+
+ '@types/normalize-package-data@2.4.4': {}
+
+ '@types/nprogress@0.2.3': {}
+
+ '@types/path-browserify@1.0.3': {}
+
+ '@types/triple-beam@1.3.5': {}
+
+ '@types/unist@3.0.3': {}
+
+ '@types/web-bluetooth@0.0.16': {}
+
+ '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ '@typescript-eslint/scope-manager': 8.28.0
+ '@typescript-eslint/type-utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ '@typescript-eslint/visitor-keys': 8.28.0
+ eslint: 9.23.0(jiti@2.4.2)
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 2.1.0(typescript@5.8.2)
+ typescript: 5.8.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.28.0
+ '@typescript-eslint/types': 8.28.0
+ '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2)
+ '@typescript-eslint/visitor-keys': 8.28.0
+ debug: 4.4.0
+ eslint: 9.23.0(jiti@2.4.2)
+ typescript: 5.8.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.28.0':
+ dependencies:
+ '@typescript-eslint/types': 8.28.0
+ '@typescript-eslint/visitor-keys': 8.28.0
+
+ '@typescript-eslint/type-utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2)
+ '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ debug: 4.4.0
+ eslint: 9.23.0(jiti@2.4.2)
+ ts-api-utils: 2.1.0(typescript@5.8.2)
+ typescript: 5.8.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.28.0': {}
+
+ '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.2)':
+ dependencies:
+ '@typescript-eslint/types': 8.28.0
+ '@typescript-eslint/visitor-keys': 8.28.0
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.7.1
+ ts-api-utils: 2.1.0(typescript@5.8.2)
+ typescript: 5.8.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ '@typescript-eslint/scope-manager': 8.28.0
+ '@typescript-eslint/types': 8.28.0
+ '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2)
+ eslint: 9.23.0(jiti@2.4.2)
+ typescript: 5.8.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.28.0':
+ dependencies:
+ '@typescript-eslint/types': 8.28.0
+ eslint-visitor-keys: 4.2.0
+
+ '@unocss/astro@66.1.0-beta.7(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/reset': 66.1.0-beta.7
+ '@unocss/vite': 66.1.0-beta.7(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
+ optionalDependencies:
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - vue
+
+ '@unocss/cli@66.1.0-beta.7':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@unocss/config': 66.1.0-beta.7
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/preset-uno': 66.1.0-beta.7
+ cac: 6.7.14
+ chokidar: 3.6.0
+ colorette: 2.0.20
+ consola: 3.4.2
+ magic-string: 0.30.17
+ pathe: 2.0.3
+ perfect-debounce: 1.0.0
+ tinyglobby: 0.2.12
+ unplugin-utils: 0.2.4
+
+ '@unocss/config@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ unconfig: 7.3.1
+
+ '@unocss/core@66.1.0-beta.7': {}
+
+ '@unocss/extractor-arbitrary-variants@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+
+ '@unocss/inspector@66.1.0-beta.7(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/rule-utils': 66.1.0-beta.7
+ colorette: 2.0.20
+ gzip-size: 6.0.0
+ sirv: 3.0.1
+ vue-flow-layout: 0.1.1(vue@3.5.13(typescript@5.8.2))
+ transitivePeerDependencies:
+ - vue
+
+ '@unocss/postcss@66.1.0-beta.7(postcss@8.5.3)':
+ dependencies:
+ '@unocss/config': 66.1.0-beta.7
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/rule-utils': 66.1.0-beta.7
+ css-tree: 3.1.0
+ postcss: 8.5.3
+ tinyglobby: 0.2.12
+
+ '@unocss/preset-attributify@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+
+ '@unocss/preset-icons@66.1.0-beta.7':
+ dependencies:
+ '@iconify/utils': 2.3.0
+ '@unocss/core': 66.1.0-beta.7
+ ofetch: 1.4.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@unocss/preset-mini@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/extractor-arbitrary-variants': 66.1.0-beta.7
+ '@unocss/rule-utils': 66.1.0-beta.7
+
+ '@unocss/preset-tagify@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+
+ '@unocss/preset-typography@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/preset-mini': 66.1.0-beta.7
+ '@unocss/rule-utils': 66.1.0-beta.7
+
+ '@unocss/preset-uno@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/preset-wind3': 66.1.0-beta.7
+
+ '@unocss/preset-web-fonts@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ ofetch: 1.4.1
+
+ '@unocss/preset-wind3@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/preset-mini': 66.1.0-beta.7
+ '@unocss/rule-utils': 66.1.0-beta.7
+
+ '@unocss/preset-wind4@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/extractor-arbitrary-variants': 66.1.0-beta.7
+ '@unocss/rule-utils': 66.1.0-beta.7
+
+ '@unocss/preset-wind@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/preset-wind3': 66.1.0-beta.7
+
+ '@unocss/reset@66.1.0-beta.7': {}
+
+ '@unocss/rule-utils@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ magic-string: 0.30.17
+
+ '@unocss/transformer-attributify-jsx@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+
+ '@unocss/transformer-compile-class@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+
+ '@unocss/transformer-directives@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/rule-utils': 66.1.0-beta.7
+ css-tree: 3.1.0
+
+ '@unocss/transformer-variant-group@66.1.0-beta.7':
+ dependencies:
+ '@unocss/core': 66.1.0-beta.7
+
+ '@unocss/vite@66.1.0-beta.7(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@unocss/config': 66.1.0-beta.7
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/inspector': 66.1.0-beta.7(vue@3.5.13(typescript@5.8.2))
+ chokidar: 3.6.0
+ magic-string: 0.30.17
+ tinyglobby: 0.2.12
+ unplugin-utils: 0.2.4
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - vue
+
+ '@unrs/resolver-binding-darwin-arm64@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-x64@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-freebsd-x64@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-musl@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-wasm32-wasi@1.3.2':
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.7
+ optional: true
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.3.2':
+ optional: true
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.3.2':
+ optional: true
+
+ '@vitejs/plugin-vue-jsx@4.1.2(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@babel/core': 7.26.10
+ '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10)
+ '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.26.10)
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ vue: 3.5.13(typescript@5.8.2)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ vue: 3.5.13(typescript@5.8.2)
+
+ '@vitest/eslint-plugin@1.1.38(@typescript-eslint/utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(happy-dom@17.4.4)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))':
+ dependencies:
+ '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ eslint: 9.23.0(jiti@2.4.2)
+ optionalDependencies:
+ typescript: 5.8.2
+ vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(happy-dom@17.4.4)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+
+ '@vitest/expect@3.0.9':
+ dependencies:
+ '@vitest/spy': 3.0.9
+ '@vitest/utils': 3.0.9
+ chai: 5.2.0
+ tinyrainbow: 2.0.0
+
+ '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))':
+ dependencies:
+ '@vitest/spy': 3.0.9
+ estree-walker: 3.0.3
+ magic-string: 0.30.17
+ optionalDependencies:
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+
+ '@vitest/pretty-format@3.0.9':
+ dependencies:
+ tinyrainbow: 2.0.0
+
+ '@vitest/runner@3.0.9':
+ dependencies:
+ '@vitest/utils': 3.0.9
+ pathe: 2.0.3
+
+ '@vitest/snapshot@3.0.9':
+ dependencies:
+ '@vitest/pretty-format': 3.0.9
+ magic-string: 0.30.17
+ pathe: 2.0.3
+
+ '@vitest/spy@3.0.9':
+ dependencies:
+ tinyspy: 3.0.2
+
+ '@vitest/utils@3.0.9':
+ dependencies:
+ '@vitest/pretty-format': 3.0.9
+ loupe: 3.1.3
+ tinyrainbow: 2.0.0
+
+ '@volar/language-core@2.4.12':
+ dependencies:
+ '@volar/source-map': 2.4.12
+
+ '@volar/source-map@2.4.12': {}
+
+ '@volar/typescript@2.4.12':
+ dependencies:
+ '@volar/language-core': 2.4.12
+ path-browserify: 1.0.1
+ vscode-uri: 3.1.0
+
+ '@vue/babel-helper-vue-transform-on@1.4.0': {}
+
+ '@vue/babel-plugin-jsx@1.4.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10)
+ '@babel/template': 7.27.0
+ '@babel/traverse': 7.27.0
+ '@babel/types': 7.27.0
+ '@vue/babel-helper-vue-transform-on': 1.4.0
+ '@vue/babel-plugin-resolve-type': 1.4.0(@babel/core@7.26.10)
+ '@vue/shared': 3.5.13
+ optionalDependencies:
+ '@babel/core': 7.26.10
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/babel-plugin-resolve-type@1.4.0(@babel/core@7.26.10)':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/core': 7.26.10
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/parser': 7.27.0
+ '@vue/compiler-sfc': 3.5.13
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vue/compiler-core@3.5.13':
+ dependencies:
+ '@babel/parser': 7.27.0
+ '@vue/shared': 3.5.13
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.13':
+ dependencies:
+ '@vue/compiler-core': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/compiler-sfc@3.5.13':
+ dependencies:
+ '@babel/parser': 7.27.0
+ '@vue/compiler-core': 3.5.13
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ estree-walker: 2.0.2
+ magic-string: 0.30.17
+ postcss: 8.5.3
+ source-map-js: 1.2.1
+
+ '@vue/compiler-ssr@3.5.13':
+ dependencies:
+ '@vue/compiler-dom': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/compiler-vue2@2.7.16':
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/devtools-api@6.6.4': {}
+
+ '@vue/devtools-api@7.7.2':
+ dependencies:
+ '@vue/devtools-kit': 7.7.2
+
+ '@vue/devtools-kit@7.7.2':
+ dependencies:
+ '@vue/devtools-shared': 7.7.2
+ birpc: 0.2.19
+ hookable: 5.5.3
+ mitt: 3.0.1
+ perfect-debounce: 1.0.0
+ speakingurl: 14.0.1
+ superjson: 2.2.2
+
+ '@vue/devtools-shared@7.7.2':
+ dependencies:
+ rfdc: 1.4.1
+
+ '@vue/language-core@2.2.8(typescript@5.8.2)':
+ dependencies:
+ '@volar/language-core': 2.4.12
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.5.13
+ alien-signals: 1.0.8
+ minimatch: 9.0.5
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ optionalDependencies:
+ typescript: 5.8.2
+
+ '@vue/reactivity@3.5.13':
+ dependencies:
+ '@vue/shared': 3.5.13
+
+ '@vue/runtime-core@3.5.13':
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/runtime-dom@3.5.13':
+ dependencies:
+ '@vue/reactivity': 3.5.13
+ '@vue/runtime-core': 3.5.13
+ '@vue/shared': 3.5.13
+ csstype: 3.1.3
+
+ '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ vue: 3.5.13(typescript@5.8.2)
+
+ '@vue/shared@3.5.13': {}
+
+ '@vue/test-utils@2.4.6':
+ dependencies:
+ js-beautify: 1.15.4
+ vue-component-type-helpers: 2.2.8
+
+ '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@types/web-bluetooth': 0.0.16
+ '@vueuse/metadata': 9.13.0
+ '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.8.2))
+ vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2))
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@vueuse/metadata@9.13.0': {}
+
+ '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2))
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
+ '@xmldom/xmldom@0.8.10': {}
+
+ abbrev@2.0.0: {}
+
+ acorn-jsx@5.3.2(acorn@8.14.1):
+ dependencies:
+ acorn: 8.14.1
+
+ acorn@8.14.1: {}
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ alien-signals@1.0.8: {}
+
+ ansi-escapes@7.0.0:
+ dependencies:
+ environment: 1.1.0
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.1: {}
+
+ ansis@3.17.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ are-docs-informative@0.0.2: {}
+
+ argparse@2.0.1: {}
+
+ assertion-error@2.0.1: {}
+
+ async-validator@4.2.5: {}
+
+ async@3.2.6: {}
+
+ asynckit@0.4.0: {}
+
+ axios@1.8.4:
+ dependencies:
+ follow-redirects: 1.15.9
+ form-data: 4.0.2
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ balanced-match@1.0.2: {}
+
+ binary-extensions@2.3.0: {}
+
+ birpc@0.2.19: {}
+
+ boolbase@1.0.0: {}
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.24.4:
+ dependencies:
+ caniuse-lite: 1.0.30001707
+ electron-to-chromium: 1.5.126
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.3(browserslist@4.24.4)
+
+ builtin-modules@4.0.0: {}
+
+ cac@6.7.14: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ callsites@3.1.0: {}
+
+ caniuse-lite@1.0.30001707: {}
+
+ ccount@2.0.1: {}
+
+ chai@5.2.0:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.1
+ deep-eql: 5.0.2
+ loupe: 3.1.3
+ pathval: 2.0.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.4.1: {}
+
+ character-entities@2.0.2: {}
+
+ check-error@2.1.1: {}
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ ci-info@4.2.0: {}
+
+ clean-regexp@1.0.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ cli-cursor@5.0.0:
+ dependencies:
+ restore-cursor: 5.1.0
+
+ cli-truncate@4.0.0:
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 7.2.0
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clone-buffer@1.0.0: {}
+
+ clone-stats@1.0.0: {}
+
+ clone@2.1.2: {}
+
+ cloneable-readable@1.1.3:
+ dependencies:
+ inherits: 2.0.4
+ process-nextick-args: 2.0.1
+ readable-stream: 2.3.8
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.3: {}
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+
+ color@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+ color-string: 1.9.1
+
+ colorette@2.0.20: {}
+
+ colorspace@1.1.4:
+ dependencies:
+ color: 3.2.1
+ text-hex: 1.0.0
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ commander@10.0.1: {}
+
+ commander@13.1.0: {}
+
+ commander@7.2.0: {}
+
+ comment-parser@1.4.1: {}
+
+ concat-map@0.0.1: {}
+
+ confbox@0.1.8: {}
+
+ confbox@0.2.1: {}
+
+ config-chain@1.1.13:
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+
+ consola@3.4.2: {}
+
+ convert-source-map@2.0.0: {}
+
+ copy-anything@3.0.5:
+ dependencies:
+ is-what: 4.1.16
+
+ core-js-compat@3.41.0:
+ dependencies:
+ browserslist: 4.24.4
+
+ core-util-is@1.0.3: {}
+
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css-select@4.3.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.1.1
+
+ css-select@5.1.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-selector-parser@1.4.1: {}
+
+ css-tree@1.1.3:
+ dependencies:
+ mdn-data: 2.0.14
+ source-map: 0.6.1
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@2.3.1:
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.2.1
+
+ css-tree@3.1.0:
+ dependencies:
+ mdn-data: 2.12.2
+ source-map-js: 1.2.1
+
+ css-what@6.1.0: {}
+
+ cssesc@3.0.0: {}
+
+ csso@4.2.0:
+ dependencies:
+ css-tree: 1.1.3
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
+ cssom@0.5.0: {}
+
+ csstype@3.1.3: {}
+
+ dayjs@1.11.13: {}
+
+ de-indent@1.0.2: {}
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.0:
+ dependencies:
+ ms: 2.1.3
+
+ decode-named-character-reference@1.1.0:
+ dependencies:
+ character-entities: 2.0.2
+
+ deep-eql@5.0.2: {}
+
+ deep-is@0.1.4: {}
+
+ defu@6.1.4: {}
+
+ delayed-stream@1.0.0: {}
+
+ dequal@2.0.3: {}
+
+ destr@2.0.3: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ doctrine@3.0.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dom-serializer@1.4.1:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ entities: 2.2.0
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ dom-zindex@1.0.6: {}
+
+ domelementtype@2.3.0: {}
+
+ domhandler@4.3.1:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@2.8.0:
+ dependencies:
+ dom-serializer: 1.4.1
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexer@0.1.2: {}
+
+ eastasianwidth@0.2.0: {}
+
+ editorconfig@1.0.4:
+ dependencies:
+ '@one-ini/wasm': 0.1.1
+ commander: 10.0.1
+ minimatch: 9.0.1
+ semver: 7.7.1
+
+ electron-to-chromium@1.5.126: {}
+
+ element-plus@2.9.7(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+ '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.8.2))
+ '@floating-ui/dom': 1.6.13
+ '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+ '@types/lodash': 4.17.16
+ '@types/lodash-es': 4.17.12
+ '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.8.2))
+ async-validator: 4.2.5
+ dayjs: 1.11.13
+ escape-html: 1.0.3
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
+ memoize-one: 6.0.0
+ normalize-wheel-es: 1.2.0
+ vue: 3.5.13(typescript@5.8.2)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+
+ emoji-regex@10.4.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ enabled@2.0.0: {}
+
+ enhanced-resolve@5.18.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+
+ entities@2.2.0: {}
+
+ entities@4.5.0: {}
+
+ environment@1.1.0: {}
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@1.6.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ esbuild@0.23.1:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.23.1
+ '@esbuild/android-arm': 0.23.1
+ '@esbuild/android-arm64': 0.23.1
+ '@esbuild/android-x64': 0.23.1
+ '@esbuild/darwin-arm64': 0.23.1
+ '@esbuild/darwin-x64': 0.23.1
+ '@esbuild/freebsd-arm64': 0.23.1
+ '@esbuild/freebsd-x64': 0.23.1
+ '@esbuild/linux-arm': 0.23.1
+ '@esbuild/linux-arm64': 0.23.1
+ '@esbuild/linux-ia32': 0.23.1
+ '@esbuild/linux-loong64': 0.23.1
+ '@esbuild/linux-mips64el': 0.23.1
+ '@esbuild/linux-ppc64': 0.23.1
+ '@esbuild/linux-riscv64': 0.23.1
+ '@esbuild/linux-s390x': 0.23.1
+ '@esbuild/linux-x64': 0.23.1
+ '@esbuild/netbsd-x64': 0.23.1
+ '@esbuild/openbsd-arm64': 0.23.1
+ '@esbuild/openbsd-x64': 0.23.1
+ '@esbuild/sunos-x64': 0.23.1
+ '@esbuild/win32-arm64': 0.23.1
+ '@esbuild/win32-ia32': 0.23.1
+ '@esbuild/win32-x64': 0.23.1
+ optional: true
+
+ esbuild@0.25.1:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.1
+ '@esbuild/android-arm': 0.25.1
+ '@esbuild/android-arm64': 0.25.1
+ '@esbuild/android-x64': 0.25.1
+ '@esbuild/darwin-arm64': 0.25.1
+ '@esbuild/darwin-x64': 0.25.1
+ '@esbuild/freebsd-arm64': 0.25.1
+ '@esbuild/freebsd-x64': 0.25.1
+ '@esbuild/linux-arm': 0.25.1
+ '@esbuild/linux-arm64': 0.25.1
+ '@esbuild/linux-ia32': 0.25.1
+ '@esbuild/linux-loong64': 0.25.1
+ '@esbuild/linux-mips64el': 0.25.1
+ '@esbuild/linux-ppc64': 0.25.1
+ '@esbuild/linux-riscv64': 0.25.1
+ '@esbuild/linux-s390x': 0.25.1
+ '@esbuild/linux-x64': 0.25.1
+ '@esbuild/netbsd-arm64': 0.25.1
+ '@esbuild/netbsd-x64': 0.25.1
+ '@esbuild/openbsd-arm64': 0.25.1
+ '@esbuild/openbsd-x64': 0.25.1
+ '@esbuild/sunos-x64': 0.25.1
+ '@esbuild/win32-arm64': 0.25.1
+ '@esbuild/win32-ia32': 0.25.1
+ '@esbuild/win32-x64': 0.25.1
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ eslint-compat-utils@0.5.1(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+ semver: 7.7.1
+
+ eslint-compat-utils@0.6.4(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+ semver: 7.7.1
+
+ eslint-config-flat-gitignore@2.1.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint/compat': 1.2.7(eslint@9.23.0(jiti@2.4.2))
+ eslint: 9.23.0(jiti@2.4.2)
+
+ eslint-flat-config-utils@2.0.1:
+ dependencies:
+ pathe: 2.0.3
+
+ eslint-formatting-reporter@0.0.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+ prettier-linter-helpers: 1.0.0
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.10
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-json-compat-utils@0.2.1(eslint@9.23.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+ esquery: 1.6.0
+ jsonc-eslint-parser: 2.4.0
+
+ eslint-merge-processors@2.0.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+
+ eslint-parser-plain@0.1.1: {}
+
+ eslint-plugin-antfu@3.1.1(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+
+ eslint-plugin-command@3.2.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@es-joy/jsdoccomment': 0.50.0
+ eslint: 9.23.0(jiti@2.4.2)
+
+ eslint-plugin-es-x@7.8.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ '@eslint-community/regexpp': 4.12.1
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-compat-utils: 0.5.1(eslint@9.23.0(jiti@2.4.2))
+
+ eslint-plugin-format@1.0.1(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@dprint/formatter': 0.3.0
+ '@dprint/markdown': 0.17.8
+ '@dprint/toml': 0.6.4
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-formatting-reporter: 0.0.0(eslint@9.23.0(jiti@2.4.2))
+ eslint-parser-plain: 0.1.1
+ prettier: 3.5.3
+ synckit: 0.9.2
+
+ eslint-plugin-import-x@4.9.3(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2):
+ dependencies:
+ '@types/doctrine': 0.0.9
+ '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ debug: 4.4.0
+ doctrine: 3.0.0
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-import-resolver-node: 0.3.9
+ get-tsconfig: 4.10.0
+ is-glob: 4.0.3
+ minimatch: 10.0.1
+ semver: 7.7.1
+ stable-hash: 0.0.5
+ tslib: 2.8.1
+ unrs-resolver: 1.3.2
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ eslint-plugin-jsdoc@50.6.9(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@es-joy/jsdoccomment': 0.49.0
+ are-docs-informative: 0.0.2
+ comment-parser: 1.4.1
+ debug: 4.4.0
+ escape-string-regexp: 4.0.0
+ eslint: 9.23.0(jiti@2.4.2)
+ espree: 10.3.0
+ esquery: 1.6.0
+ parse-imports: 2.2.1
+ semver: 7.7.1
+ spdx-expression-parse: 4.0.0
+ synckit: 0.9.2
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-jsonc@2.20.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-compat-utils: 0.6.4(eslint@9.23.0(jiti@2.4.2))
+ eslint-json-compat-utils: 0.2.1(eslint@9.23.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)
+ espree: 10.3.0
+ graphemer: 1.4.0
+ jsonc-eslint-parser: 2.4.0
+ natural-compare: 1.4.0
+ synckit: 0.10.3
+ transitivePeerDependencies:
+ - '@eslint/json'
+
+ eslint-plugin-n@17.17.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ enhanced-resolve: 5.18.1
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-plugin-es-x: 7.8.0(eslint@9.23.0(jiti@2.4.2))
+ get-tsconfig: 4.10.0
+ globals: 15.15.0
+ ignore: 5.3.2
+ minimatch: 9.0.5
+ semver: 7.7.1
+
+ eslint-plugin-no-only-tests@3.3.0: {}
+
+ eslint-plugin-perfectionist@4.10.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2):
+ dependencies:
+ '@typescript-eslint/types': 8.28.0
+ '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+ eslint: 9.23.0(jiti@2.4.2)
+ natural-orderby: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ eslint-plugin-pnpm@0.3.1(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+ find-up-simple: 1.0.1
+ jsonc-eslint-parser: 2.4.0
+ pathe: 2.0.3
+ pnpm-workspace-yaml: 0.3.1
+ tinyglobby: 0.2.12
+ yaml-eslint-parser: 1.3.0
+
+ eslint-plugin-regexp@2.7.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ '@eslint-community/regexpp': 4.12.1
+ comment-parser: 1.4.1
+ eslint: 9.23.0(jiti@2.4.2)
+ jsdoc-type-pratt-parser: 4.1.0
+ refa: 0.12.1
+ regexp-ast-analysis: 0.7.1
+ scslre: 0.3.0
+
+ eslint-plugin-toml@0.12.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ debug: 4.4.0
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-compat-utils: 0.6.4(eslint@9.23.0(jiti@2.4.2))
+ lodash: 4.17.21
+ toml-eslint-parser: 0.10.0
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-unicorn@57.0.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ ci-info: 4.2.0
+ clean-regexp: 1.0.0
+ core-js-compat: 3.41.0
+ eslint: 9.23.0(jiti@2.4.2)
+ esquery: 1.6.0
+ globals: 15.15.0
+ indent-string: 5.0.0
+ is-builtin-module: 4.0.0
+ jsesc: 3.1.0
+ pluralize: 8.0.0
+ read-package-up: 11.0.0
+ regexp-tree: 0.1.27
+ regjsparser: 0.12.0
+ semver: 7.7.1
+ strip-indent: 4.0.0
+
+ eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.23.0(jiti@2.4.2)
+ optionalDependencies:
+ '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)
+
+ eslint-plugin-vue@10.0.0(eslint@9.23.0(jiti@2.4.2))(vue-eslint-parser@10.1.1(eslint@9.23.0(jiti@2.4.2))):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ eslint: 9.23.0(jiti@2.4.2)
+ natural-compare: 1.4.0
+ nth-check: 2.1.1
+ postcss-selector-parser: 6.1.2
+ semver: 7.7.1
+ vue-eslint-parser: 10.1.1(eslint@9.23.0(jiti@2.4.2))
+ xml-name-validator: 4.0.0
+
+ eslint-plugin-yml@1.17.0(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ debug: 4.4.0
+ escape-string-regexp: 4.0.0
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-compat-utils: 0.6.4(eslint@9.23.0(jiti@2.4.2))
+ natural-compare: 1.4.0
+ yaml-eslint-parser: 1.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ '@vue/compiler-sfc': 3.5.13
+ eslint: 9.23.0(jiti@2.4.2)
+
+ eslint-scope@8.3.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.0: {}
+
+ eslint@9.23.0(jiti@2.4.2):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.19.2
+ '@eslint/config-helpers': 0.2.0
+ '@eslint/core': 0.12.0
+ '@eslint/eslintrc': 3.3.1
+ '@eslint/js': 9.23.0
+ '@eslint/plugin-kit': 0.2.7
+ '@humanfs/node': 0.16.6
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.2
+ '@types/estree': 1.0.7
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.3.0
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ 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.4
+ optionalDependencies:
+ jiti: 2.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.3.0:
+ dependencies:
+ acorn: 8.14.1
+ acorn-jsx: 5.3.2(acorn@8.14.1)
+ eslint-visitor-keys: 4.2.0
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.14.1
+ acorn-jsx: 5.3.2(acorn@8.14.1)
+ eslint-visitor-keys: 3.4.3
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.7
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ eventemitter3@5.0.1: {}
+
+ execa@8.0.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+
+ expect-type@1.2.0: {}
+
+ exsolve@1.0.4: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-diff@1.3.0: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.19.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.4.3(picomatch@4.0.2):
+ optionalDependencies:
+ picomatch: 4.0.2
+
+ fecha@4.2.3: {}
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up-simple@1.0.1: {}
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+
+ flatted@3.3.3: {}
+
+ fn.name@1.1.0: {}
+
+ follow-redirects@1.15.9: {}
+
+ foreground-child@3.3.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
+ form-data@4.0.2:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ mime-types: 2.1.35
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.3.0: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-stream@8.0.1: {}
+
+ get-tsconfig@4.10.0:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@10.4.5:
+ dependencies:
+ foreground-child: 3.3.1
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ globals@11.12.0: {}
+
+ globals@14.0.0: {}
+
+ globals@15.15.0: {}
+
+ globals@16.0.0: {}
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ gzip-size@6.0.0:
+ dependencies:
+ duplexer: 0.1.2
+
+ happy-dom@17.4.4:
+ dependencies:
+ webidl-conversions: 7.0.0
+ whatwg-mimetype: 3.0.0
+
+ has-flag@4.0.0: {}
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ he@1.2.0: {}
+
+ hookable@5.5.3: {}
+
+ hosted-git-info@7.0.2:
+ dependencies:
+ lru-cache: 10.4.3
+
+ human-signals@5.0.0: {}
+
+ husky@9.1.7: {}
+
+ ignore@5.3.2: {}
+
+ immutable@4.3.7: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@5.0.0: {}
+
+ index-to-position@1.0.0: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8: {}
+
+ is-arrayish@0.3.2: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-builtin-module@4.0.0:
+ dependencies:
+ builtin-modules: 4.0.0
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@4.0.0: {}
+
+ is-fullwidth-code-point@5.0.0:
+ dependencies:
+ get-east-asian-width: 1.3.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-number@7.0.0: {}
+
+ is-stream@2.0.1: {}
+
+ is-stream@3.0.0: {}
+
+ is-what@4.1.16: {}
+
+ isarray@1.0.0: {}
+
+ isexe@2.0.0: {}
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ jiti@2.4.2: {}
+
+ js-beautify@1.15.4:
+ dependencies:
+ config-chain: 1.1.13
+ editorconfig: 1.0.4
+ glob: 10.4.5
+ js-cookie: 3.0.5
+ nopt: 7.2.1
+
+ js-cookie@3.0.5: {}
+
+ js-tokens@4.0.0: {}
+
+ js-tokens@9.0.1: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsdoc-type-pratt-parser@4.1.0: {}
+
+ jsesc@3.0.2: {}
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@2.2.3: {}
+
+ jsonc-eslint-parser@2.4.0:
+ dependencies:
+ acorn: 8.14.1
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ semver: 7.7.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kolorist@1.8.0: {}
+
+ kuler@2.0.0: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lilconfig@3.1.3: {}
+
+ lint-staged@15.5.0:
+ dependencies:
+ chalk: 5.4.1
+ commander: 13.1.0
+ debug: 4.4.0
+ execa: 8.0.1
+ lilconfig: 3.1.3
+ listr2: 8.2.5
+ micromatch: 4.0.8
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ listr2@8.2.5:
+ dependencies:
+ cli-truncate: 4.0.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 6.1.0
+ rfdc: 1.4.1
+ wrap-ansi: 9.0.0
+
+ local-pkg@0.5.1:
+ dependencies:
+ mlly: 1.7.4
+ pkg-types: 1.3.1
+
+ local-pkg@1.1.1:
+ dependencies:
+ mlly: 1.7.4
+ pkg-types: 2.1.0
+ quansync: 0.2.10
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash-es@4.17.21: {}
+
+ lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+ dependencies:
+ '@types/lodash-es': 4.17.12
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+
+ lodash.escape@4.0.1: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash@4.17.21: {}
+
+ log-update@6.1.0:
+ dependencies:
+ ansi-escapes: 7.0.0
+ cli-cursor: 5.0.0
+ slice-ansi: 7.1.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 9.0.0
+
+ logform@2.7.0:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@types/triple-beam': 1.3.5
+ fecha: 4.2.3
+ ms: 2.1.3
+ safe-stable-stringify: 2.5.0
+ triple-beam: 1.4.1
+
+ longest-streak@3.1.0: {}
+
+ loupe@3.1.3: {}
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ magic-string@0.30.17:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ markdown-table@3.0.4: {}
+
+ math-intrinsics@1.1.0: {}
+
+ mdast-util-find-and-replace@3.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ mdast-util-from-markdown@2.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.1.0
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.2
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.2
+ micromark-util-character: 2.1.1
+
+ mdast-util-gfm-footnote@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.1.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.1.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.0
+
+ mdast-util-to-markdown@2.1.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ mdn-data@2.0.14: {}
+
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.0.30: {}
+
+ mdn-data@2.12.2: {}
+
+ memoize-one@6.0.0: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromark-core-commonmark@2.0.3:
+ dependencies:
+ decode-named-character-reference: 1.1.0
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-table@2.1.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-destination@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-label@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-space@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-title@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-whitespace@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-chunked@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-classify-character@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-combine-extensions@2.0.1:
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-decode-string@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-html-tag-name@2.0.1: {}
+
+ micromark-util-normalize-identifier@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-resolve-all@2.0.1:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-subtokenize@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-symbol@2.0.1: {}
+
+ micromark-util-types@2.0.2: {}
+
+ micromark@4.0.2:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.0
+ decode-named-character-reference: 1.1.0
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mimic-fn@4.0.0: {}
+
+ mimic-function@5.0.1: {}
+
+ min-indent@1.0.1: {}
+
+ minimatch@10.0.1:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@9.0.1:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minipass@7.1.2: {}
+
+ mitt@3.0.1: {}
+
+ mlly@1.7.4:
+ dependencies:
+ acorn: 8.14.1
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.5.4
+
+ mrmime@2.0.1: {}
+
+ ms@2.1.3: {}
+
+ muggle-string@0.4.1: {}
+
+ mustache@4.2.0: {}
+
+ nanoid@3.3.11: {}
+
+ natural-compare@1.4.0: {}
+
+ natural-orderby@5.0.0: {}
+
+ node-fetch-native@1.6.6: {}
+
+ node-releases@2.0.19: {}
+
+ nopt@7.2.1:
+ dependencies:
+ abbrev: 2.0.0
+
+ normalize-package-data@6.0.2:
+ dependencies:
+ hosted-git-info: 7.0.2
+ semver: 7.7.1
+ validate-npm-package-license: 3.0.4
+
+ normalize-path@3.0.0: {}
+
+ normalize-wheel-es@1.2.0: {}
+
+ normalize.css@8.0.1: {}
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ nprogress@0.2.0: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ object-assign@4.1.1: {}
+
+ ofetch@1.4.1:
+ dependencies:
+ destr: 2.0.3
+ node-fetch-native: 1.6.6
+ ufo: 1.5.4
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ one-time@1.0.0:
+ dependencies:
+ fn.name: 1.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ onetime@7.0.0:
+ dependencies:
+ mimic-function: 5.0.1
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ package-json-from-dist@1.0.1: {}
+
+ package-manager-detector@0.2.11:
+ dependencies:
+ quansync: 0.2.10
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-gitignore@2.0.0: {}
+
+ parse-imports@2.2.1:
+ dependencies:
+ es-module-lexer: 1.6.0
+ slashes: 3.0.12
+
+ parse-json@8.2.0:
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ index-to-position: 1.0.0
+ type-fest: 4.38.0
+
+ path-browserify@1.0.1: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ path-to-regexp@8.2.0: {}
+
+ pathe@2.0.3: {}
+
+ pathval@2.0.0: {}
+
+ perfect-debounce@1.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.2: {}
+
+ pidtree@0.6.0: {}
+
+ pinia@3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ '@vue/devtools-api': 7.7.2
+ vue: 3.5.13(typescript@5.8.2)
+ optionalDependencies:
+ typescript: 5.8.2
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.7.4
+ pathe: 2.0.3
+
+ pkg-types@2.1.0:
+ dependencies:
+ confbox: 0.2.1
+ exsolve: 1.0.4
+ pathe: 2.0.3
+
+ pluralize@8.0.0: {}
+
+ pnpm-workspace-yaml@0.3.1:
+ dependencies:
+ yaml: 2.7.0
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss@8.5.3:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prettier-linter-helpers@1.0.0:
+ dependencies:
+ fast-diff: 1.3.0
+
+ prettier@3.5.3: {}
+
+ prettysize@2.0.0: {}
+
+ process-nextick-args@2.0.1: {}
+
+ proto-list@1.2.4: {}
+
+ proxy-from-env@1.1.0: {}
+
+ punycode@2.3.1: {}
+
+ quansync@0.2.10: {}
+
+ queue-microtask@1.2.3: {}
+
+ read-package-up@11.0.0:
+ dependencies:
+ find-up-simple: 1.0.1
+ read-pkg: 9.0.1
+ type-fest: 4.38.0
+
+ read-pkg@9.0.1:
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 6.0.2
+ parse-json: 8.2.0
+ type-fest: 4.38.0
+ unicorn-magic: 0.1.0
+
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ refa@0.12.1:
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+
+ regexp-ast-analysis@0.7.1:
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ refa: 0.12.1
+
+ regexp-tree@0.1.27: {}
+
+ regjsparser@0.12.0:
+ dependencies:
+ jsesc: 3.0.2
+
+ remove-trailing-separator@1.1.0: {}
+
+ replace-ext@1.0.1: {}
+
+ require-directory@2.1.1: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.10:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@5.1.0:
+ dependencies:
+ onetime: 7.0.0
+ signal-exit: 4.1.0
+
+ reusify@1.1.0: {}
+
+ rfdc@1.4.1: {}
+
+ rollup@4.37.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.37.0
+ '@rollup/rollup-android-arm64': 4.37.0
+ '@rollup/rollup-darwin-arm64': 4.37.0
+ '@rollup/rollup-darwin-x64': 4.37.0
+ '@rollup/rollup-freebsd-arm64': 4.37.0
+ '@rollup/rollup-freebsd-x64': 4.37.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.37.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.37.0
+ '@rollup/rollup-linux-arm64-gnu': 4.37.0
+ '@rollup/rollup-linux-arm64-musl': 4.37.0
+ '@rollup/rollup-linux-loongarch64-gnu': 4.37.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.37.0
+ '@rollup/rollup-linux-riscv64-musl': 4.37.0
+ '@rollup/rollup-linux-s390x-gnu': 4.37.0
+ '@rollup/rollup-linux-x64-gnu': 4.37.0
+ '@rollup/rollup-linux-x64-musl': 4.37.0
+ '@rollup/rollup-win32-arm64-msvc': 4.37.0
+ '@rollup/rollup-win32-ia32-msvc': 4.37.0
+ '@rollup/rollup-win32-x64-msvc': 4.37.0
+ fsevents: 2.3.3
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-buffer@5.1.2: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-stable-stringify@2.5.0: {}
+
+ sass@1.78.0:
+ dependencies:
+ chokidar: 3.6.0
+ immutable: 4.3.7
+ source-map-js: 1.2.1
+
+ screenfull@6.0.2: {}
+
+ scslre@0.3.0:
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ refa: 0.12.1
+ regexp-ast-analysis: 0.7.1
+
+ scule@1.3.0: {}
+
+ semver@6.3.1: {}
+
+ semver@7.7.1: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ siginfo@2.0.0: {}
+
+ signal-exit@4.1.0: {}
+
+ simple-swizzle@0.2.2:
+ dependencies:
+ is-arrayish: 0.3.2
+
+ sirv@3.0.1:
+ dependencies:
+ '@polka/url': 1.0.0-next.28
+ mrmime: 2.0.1
+ totalist: 3.0.1
+
+ sisteransi@1.0.5: {}
+
+ slashes@3.0.12: {}
+
+ slice-ansi@5.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+
+ slice-ansi@7.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 5.0.0
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.6.1: {}
+
+ spdx-correct@3.2.0:
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.21
+
+ spdx-exceptions@2.5.0: {}
+
+ spdx-expression-parse@3.0.1:
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.21
+
+ spdx-expression-parse@4.0.0:
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.21
+
+ spdx-license-ids@3.0.21: {}
+
+ speakingurl@14.0.1: {}
+
+ stable-hash@0.0.5: {}
+
+ stable@0.1.8: {}
+
+ stack-trace@0.0.10: {}
+
+ stackback@0.0.2: {}
+
+ std-env@3.8.1: {}
+
+ string-argv@0.3.2: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
+
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-final-newline@3.0.0: {}
+
+ strip-indent@4.0.0:
+ dependencies:
+ min-indent: 1.0.1
+
+ strip-json-comments@3.1.1: {}
+
+ strip-literal@3.0.0:
+ dependencies:
+ js-tokens: 9.0.1
+
+ superjson@2.2.2:
+ dependencies:
+ copy-anything: 3.0.5
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ svg-sprite@2.0.4:
+ dependencies:
+ '@resvg/resvg-js': 2.6.2
+ '@xmldom/xmldom': 0.8.10
+ async: 3.2.6
+ css-selector-parser: 1.4.1
+ csso: 4.2.0
+ cssom: 0.5.0
+ glob: 7.2.3
+ js-yaml: 4.1.0
+ lodash.escape: 4.0.1
+ lodash.merge: 4.6.2
+ mustache: 4.2.0
+ prettysize: 2.0.0
+ svgo: 2.8.0
+ vinyl: 2.2.1
+ winston: 3.17.0
+ xpath: 0.0.34
+ yargs: 17.7.2
+
+ svgo@2.8.0:
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 4.3.0
+ css-tree: 1.1.3
+ csso: 4.2.0
+ picocolors: 1.1.1
+ stable: 0.1.8
+
+ svgo@3.3.2:
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 5.1.0
+ css-tree: 2.3.1
+ css-what: 6.1.0
+ csso: 5.0.5
+ picocolors: 1.1.1
+
+ synckit@0.10.3:
+ dependencies:
+ '@pkgr/core': 0.2.0
+ tslib: 2.8.1
+
+ synckit@0.9.2:
+ dependencies:
+ '@pkgr/core': 0.1.2
+ tslib: 2.8.1
+
+ tapable@2.2.1: {}
+
+ text-hex@1.0.0: {}
+
+ tinybench@2.9.0: {}
+
+ tinyexec@0.3.2: {}
+
+ tinyglobby@0.2.12:
+ dependencies:
+ fdir: 6.4.3(picomatch@4.0.2)
+ picomatch: 4.0.2
+
+ tinypool@1.0.2: {}
+
+ tinyrainbow@2.0.0: {}
+
+ tinyspy@3.0.2: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toml-eslint-parser@0.10.0:
+ dependencies:
+ eslint-visitor-keys: 3.4.3
+
+ totalist@3.0.1: {}
+
+ triple-beam@1.4.1: {}
+
+ ts-api-utils@2.1.0(typescript@5.8.2):
+ dependencies:
+ typescript: 5.8.2
+
+ tslib@2.8.1: {}
+
+ tsx@4.19.2:
+ dependencies:
+ esbuild: 0.23.1
+ get-tsconfig: 4.10.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ optional: true
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-fest@4.38.0: {}
+
+ typescript@5.8.2: {}
+
+ ufo@1.5.4: {}
+
+ unconfig@7.3.1:
+ dependencies:
+ '@quansync/fs': 0.1.1
+ defu: 6.1.4
+ jiti: 2.4.2
+ quansync: 0.2.10
+
+ undici-types@6.20.0: {}
+
+ unicorn-magic@0.1.0: {}
+
+ unimport@4.1.2:
+ dependencies:
+ acorn: 8.14.1
+ escape-string-regexp: 5.0.0
+ estree-walker: 3.0.3
+ local-pkg: 1.1.1
+ magic-string: 0.30.17
+ mlly: 1.7.4
+ pathe: 2.0.3
+ picomatch: 4.0.2
+ pkg-types: 1.3.1
+ scule: 1.3.0
+ strip-literal: 3.0.0
+ tinyglobby: 0.2.12
+ unplugin: 2.2.2
+ unplugin-utils: 0.2.4
+
+ unist-util-is@6.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ unocss@66.1.0-beta.7(postcss@8.5.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ '@unocss/astro': 66.1.0-beta.7(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
+ '@unocss/cli': 66.1.0-beta.7
+ '@unocss/core': 66.1.0-beta.7
+ '@unocss/postcss': 66.1.0-beta.7(postcss@8.5.3)
+ '@unocss/preset-attributify': 66.1.0-beta.7
+ '@unocss/preset-icons': 66.1.0-beta.7
+ '@unocss/preset-mini': 66.1.0-beta.7
+ '@unocss/preset-tagify': 66.1.0-beta.7
+ '@unocss/preset-typography': 66.1.0-beta.7
+ '@unocss/preset-uno': 66.1.0-beta.7
+ '@unocss/preset-web-fonts': 66.1.0-beta.7
+ '@unocss/preset-wind': 66.1.0-beta.7
+ '@unocss/preset-wind3': 66.1.0-beta.7
+ '@unocss/preset-wind4': 66.1.0-beta.7
+ '@unocss/transformer-attributify-jsx': 66.1.0-beta.7
+ '@unocss/transformer-compile-class': 66.1.0-beta.7
+ '@unocss/transformer-directives': 66.1.0-beta.7
+ '@unocss/transformer-variant-group': 66.1.0-beta.7
+ '@unocss/vite': 66.1.0-beta.7(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
+ optionalDependencies:
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - postcss
+ - supports-color
+ - vue
+
+ unplugin-auto-import@19.1.2(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2))):
+ dependencies:
+ local-pkg: 1.1.1
+ magic-string: 0.30.17
+ picomatch: 4.0.2
+ unimport: 4.1.2
+ unplugin: 2.2.2
+ unplugin-utils: 0.2.4
+ optionalDependencies:
+ '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.8.2))
+
+ unplugin-svg-component@0.12.1:
+ dependencies:
+ cors: 2.8.5
+ etag: 1.8.1
+ fast-glob: 3.3.3
+ local-pkg: 0.5.1
+ picocolors: 1.1.1
+ svg-sprite: 2.0.4
+ svgo: 3.3.2
+ unplugin: 1.16.1
+
+ unplugin-utils@0.2.4:
+ dependencies:
+ pathe: 2.0.3
+ picomatch: 4.0.2
+
+ unplugin-vue-components@28.4.1(@babel/parser@7.27.0)(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ chokidar: 3.6.0
+ debug: 4.4.0
+ local-pkg: 1.1.1
+ magic-string: 0.30.17
+ mlly: 1.7.4
+ tinyglobby: 0.2.12
+ unplugin: 2.2.2
+ unplugin-utils: 0.2.4
+ vue: 3.5.13(typescript@5.8.2)
+ optionalDependencies:
+ '@babel/parser': 7.27.0
+ transitivePeerDependencies:
+ - supports-color
+
+ unplugin@1.16.1:
+ dependencies:
+ acorn: 8.14.1
+ webpack-virtual-modules: 0.6.2
+
+ unplugin@2.2.2:
+ dependencies:
+ acorn: 8.14.1
+ webpack-virtual-modules: 0.6.2
+
+ unrs-resolver@1.3.2:
+ optionalDependencies:
+ '@unrs/resolver-binding-darwin-arm64': 1.3.2
+ '@unrs/resolver-binding-darwin-x64': 1.3.2
+ '@unrs/resolver-binding-freebsd-x64': 1.3.2
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.3.2
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.3.2
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.3.2
+ '@unrs/resolver-binding-linux-arm64-musl': 1.3.2
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.3.2
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.3.2
+ '@unrs/resolver-binding-linux-x64-gnu': 1.3.2
+ '@unrs/resolver-binding-linux-x64-musl': 1.3.2
+ '@unrs/resolver-binding-wasm32-wasi': 1.3.2
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.3.2
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.3.2
+ '@unrs/resolver-binding-win32-x64-msvc': 1.3.2
+
+ update-browserslist-db@1.1.3(browserslist@4.24.4):
+ dependencies:
+ browserslist: 4.24.4
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ util-deprecate@1.0.2: {}
+
+ validate-npm-package-license@3.0.4:
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+
+ vary@1.1.2: {}
+
+ vinyl@2.2.1:
+ dependencies:
+ clone: 2.1.2
+ clone-buffer: 1.0.0
+ clone-stats: 1.0.0
+ cloneable-readable: 1.1.3
+ remove-trailing-separator: 1.1.0
+ replace-ext: 1.0.1
+
+ vite-node@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.4.0
+ es-module-lexer: 1.6.0
+ pathe: 2.0.3
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ vite-svg-loader@5.1.0(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ svgo: 3.3.2
+ vue: 3.5.13(typescript@5.8.2)
+
+ vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0):
+ dependencies:
+ esbuild: 0.25.1
+ postcss: 8.5.3
+ rollup: 4.37.0
+ optionalDependencies:
+ '@types/node': 22.13.14
+ fsevents: 2.3.3
+ jiti: 2.4.2
+ sass: 1.78.0
+ tsx: 4.19.2
+ yaml: 2.7.0
+
+ vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.14)(happy-dom@17.4.4)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0):
+ dependencies:
+ '@vitest/expect': 3.0.9
+ '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0))
+ '@vitest/pretty-format': 3.0.9
+ '@vitest/runner': 3.0.9
+ '@vitest/snapshot': 3.0.9
+ '@vitest/spy': 3.0.9
+ '@vitest/utils': 3.0.9
+ chai: 5.2.0
+ debug: 4.4.0
+ expect-type: 1.2.0
+ magic-string: 0.30.17
+ pathe: 2.0.3
+ std-env: 3.8.1
+ tinybench: 2.9.0
+ tinyexec: 0.3.2
+ tinypool: 1.0.2
+ tinyrainbow: 2.0.0
+ vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(sass@1.78.0)(tsx@4.19.2)(yaml@2.7.0)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/debug': 4.1.12
+ '@types/node': 22.13.14
+ happy-dom: 17.4.4
+ transitivePeerDependencies:
+ - jiti
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ vscode-uri@3.1.0: {}
+
+ vue-component-type-helpers@2.2.8: {}
+
+ vue-demi@0.14.10(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ vue: 3.5.13(typescript@5.8.2)
+
+ vue-eslint-parser@10.1.1(eslint@9.23.0(jiti@2.4.2)):
+ dependencies:
+ debug: 4.4.0
+ eslint: 9.23.0(jiti@2.4.2)
+ eslint-scope: 8.3.0
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+ esquery: 1.6.0
+ lodash: 4.17.21
+ semver: 7.7.1
+ transitivePeerDependencies:
+ - supports-color
+
+ vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ vue: 3.5.13(typescript@5.8.2)
+
+ vue-router@4.5.0(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.13(typescript@5.8.2)
+
+ vue-tsc@2.2.8(typescript@5.8.2):
+ dependencies:
+ '@volar/typescript': 2.4.12
+ '@vue/language-core': 2.2.8(typescript@5.8.2)
+ typescript: 5.8.2
+
+ vue@3.5.13(typescript@5.8.2):
+ dependencies:
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-sfc': 3.5.13
+ '@vue/runtime-dom': 3.5.13
+ '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.2))
+ '@vue/shared': 3.5.13
+ optionalDependencies:
+ typescript: 5.8.2
+
+ vxe-table@4.6.25(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ dom-zindex: 1.0.6
+ vue: 3.5.13(typescript@5.8.2)
+ xe-utils: 3.7.4
+
+ webidl-conversions@7.0.0: {}
+
+ webpack-virtual-modules@0.6.2: {}
+
+ whatwg-mimetype@3.0.0: {}
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ why-is-node-running@2.3.0:
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+
+ winston-transport@4.9.0:
+ dependencies:
+ logform: 2.7.0
+ readable-stream: 3.6.2
+ triple-beam: 1.4.1
+
+ winston@3.17.0:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@dabh/diagnostics': 2.0.3
+ async: 3.2.6
+ is-stream: 2.0.1
+ logform: 2.7.0
+ one-time: 1.0.0
+ readable-stream: 3.6.2
+ safe-stable-stringify: 2.5.0
+ stack-trace: 0.0.10
+ triple-beam: 1.4.1
+ winston-transport: 4.9.0
+
+ word-wrap@1.2.5: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ wrap-ansi@9.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ xe-utils@3.7.4: {}
+
+ xml-name-validator@4.0.0: {}
+
+ xpath@0.0.34: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yaml-eslint-parser@1.3.0:
+ dependencies:
+ eslint-visitor-keys: 3.4.3
+ yaml: 2.7.0
+
+ yaml@2.7.0: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yocto-queue@0.1.0: {}
+
+ zwitch@2.0.4: {}
diff --git a/management/web/public/app-loading.css b/management/web/public/app-loading.css
new file mode 100644
index 0000000..13fdbc7
--- /dev/null
+++ b/management/web/public/app-loading.css
@@ -0,0 +1,45 @@
+/* 白屏阶段会执行的 CSS 加载动画 */
+
+#app-loading {
+ position: relative;
+ top: 45vh;
+ margin: 0 auto;
+ color: #409eff;
+ font-size: 12px;
+}
+
+#app-loading,
+#app-loading::before,
+#app-loading::after {
+ width: 2em;
+ height: 2em;
+ border-radius: 50%;
+ animation: 2s ease-in-out infinite app-loading-animation;
+}
+
+#app-loading::before,
+#app-loading::after {
+ content: "";
+ position: absolute;
+}
+
+#app-loading::before {
+ left: -4em;
+ animation-delay: -0.2s;
+}
+
+#app-loading::after {
+ left: 4em;
+ animation-delay: 0.2s;
+}
+
+@keyframes app-loading-animation {
+ 0%,
+ 80%,
+ 100% {
+ box-shadow: 0 2em 0 -2em;
+ }
+ 40% {
+ box-shadow: 0 2em 0 0;
+ }
+}
diff --git a/management/web/public/detect-ie.js b/management/web/public/detect-ie.js
new file mode 100644
index 0000000..6dc2f08
--- /dev/null
+++ b/management/web/public/detect-ie.js
@@ -0,0 +1,4 @@
+// Tip: Simple judgments may not fully cover
+if (/MSIE\s|Trident\//.test(navigator.userAgent)) {
+ document.body.innerHTML = "Sorry, this browser is currently not supported. We recommend using the latest version of a modern browser. For example, Chrome/Firefox/Edge."
+}
diff --git a/management/web/public/favicon.ico b/management/web/public/favicon.ico
new file mode 100644
index 0000000..c641cd0
Binary files /dev/null and b/management/web/public/favicon.ico differ
diff --git a/management/web/src/App.vue b/management/web/src/App.vue
new file mode 100644
index 0000000..9d210cc
--- /dev/null
+++ b/management/web/src/App.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/common/apis/tables/index.ts b/management/web/src/common/apis/tables/index.ts
new file mode 100644
index 0000000..d2018b9
--- /dev/null
+++ b/management/web/src/common/apis/tables/index.ts
@@ -0,0 +1,37 @@
+import type * as Tables from "./type"
+import { request } from "@/http/axios"
+
+/** 增 */
+export function createTableDataApi(data: Tables.CreateOrUpdateTableRequestData) {
+ return request({
+ url: "api/v1/users",
+ method: "post",
+ data
+ })
+}
+
+/** 删 */
+export function deleteTableDataApi(id: number) {
+ return request({
+ url: `api/v1/users/${id}`,
+ method: "delete"
+ })
+}
+
+/** 改 */
+export function updateTableDataApi(data: Tables.CreateOrUpdateTableRequestData) {
+ return request({
+ url: `api/v1/users/${data.id}`,
+ method: "put",
+ data
+ })
+}
+
+/** 查 */
+export function getTableDataApi(params: Tables.TableRequestData) {
+ return request({
+ url: "api/v1/users",
+ method: "get",
+ params
+ })
+}
diff --git a/management/web/src/common/apis/tables/type.ts b/management/web/src/common/apis/tables/type.ts
new file mode 100644
index 0000000..52d3ba6
--- /dev/null
+++ b/management/web/src/common/apis/tables/type.ts
@@ -0,0 +1,30 @@
+export interface CreateOrUpdateTableRequestData {
+ id?: number
+ username: string
+ email?: string
+ password?: string
+}
+
+export interface TableRequestData {
+ /** 当前页码 */
+ currentPage: number
+ /** 查询条数 */
+ size: number
+ /** 查询参数:用户名 */
+ username?: string
+ /** 查询参数:邮箱 */
+ email?: string
+}
+
+export interface TableData {
+ id: number
+ username: string
+ email: string
+ createTime: string
+ updateTime: string
+}
+
+export type TableResponseData = ApiResponseData<{
+ list: TableData[]
+ total: number
+}>
diff --git a/management/web/src/common/apis/users/index.ts b/management/web/src/common/apis/users/index.ts
new file mode 100644
index 0000000..b3c3d78
--- /dev/null
+++ b/management/web/src/common/apis/users/index.ts
@@ -0,0 +1,10 @@
+import type * as Users from "./type"
+import { request } from "@/http/axios"
+
+/** 获取当前登录用户详情 */
+export function getCurrentUserApi() {
+ return request({
+ url: "api/v1/users/me",
+ method: "get"
+ })
+}
diff --git a/management/web/src/common/apis/users/type.ts b/management/web/src/common/apis/users/type.ts
new file mode 100644
index 0000000..6423d98
--- /dev/null
+++ b/management/web/src/common/apis/users/type.ts
@@ -0,0 +1 @@
+export type CurrentUserResponseData = ApiResponseData<{ username: string, roles: string[] }>
diff --git a/management/web/src/common/assets/icons/dashboard.svg b/management/web/src/common/assets/icons/dashboard.svg
new file mode 100644
index 0000000..c8863a0
--- /dev/null
+++ b/management/web/src/common/assets/icons/dashboard.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/icons/fullscreen-exit.svg b/management/web/src/common/assets/icons/fullscreen-exit.svg
new file mode 100644
index 0000000..42aa505
--- /dev/null
+++ b/management/web/src/common/assets/icons/fullscreen-exit.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/icons/fullscreen.svg b/management/web/src/common/assets/icons/fullscreen.svg
new file mode 100644
index 0000000..a97be9e
--- /dev/null
+++ b/management/web/src/common/assets/icons/fullscreen.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/icons/keyboard-down.svg b/management/web/src/common/assets/icons/keyboard-down.svg
new file mode 100644
index 0000000..de62543
--- /dev/null
+++ b/management/web/src/common/assets/icons/keyboard-down.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/icons/keyboard-enter.svg b/management/web/src/common/assets/icons/keyboard-enter.svg
new file mode 100644
index 0000000..819b87e
--- /dev/null
+++ b/management/web/src/common/assets/icons/keyboard-enter.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/icons/keyboard-esc.svg b/management/web/src/common/assets/icons/keyboard-esc.svg
new file mode 100644
index 0000000..33256bf
--- /dev/null
+++ b/management/web/src/common/assets/icons/keyboard-esc.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/icons/keyboard-up.svg b/management/web/src/common/assets/icons/keyboard-up.svg
new file mode 100644
index 0000000..e84519a
--- /dev/null
+++ b/management/web/src/common/assets/icons/keyboard-up.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/icons/preserve-color/README.md b/management/web/src/common/assets/icons/preserve-color/README.md
new file mode 100644
index 0000000..f76c600
--- /dev/null
+++ b/management/web/src/common/assets/icons/preserve-color/README.md
@@ -0,0 +1,11 @@
+## 目录说明
+
+- `common/assets/icons/preserve-color` 目录下存放带颜色的 svg icon
+
+- `common/assets/icons` 目录存放的 svg icon 会被插件重写 `fill` 和 `stroke` 属性,使得图片自带的颜色丢失,从而继承父元素的颜色
+
+## 使用说明
+
+`common/assets/icons/preserve-color` 目录下需要添加 `preserve-color/` 前缀,像这样: ``
+
+`common/assets/icons` 目录下则不需要,像这样: ``
diff --git a/management/web/src/common/assets/icons/search.svg b/management/web/src/common/assets/icons/search.svg
new file mode 100644
index 0000000..691a5f1
--- /dev/null
+++ b/management/web/src/common/assets/icons/search.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/common/assets/images/docs/preview.png b/management/web/src/common/assets/images/docs/preview.png
new file mode 100644
index 0000000..860ea00
Binary files /dev/null and b/management/web/src/common/assets/images/docs/preview.png differ
diff --git a/management/web/src/common/assets/images/layouts/logo-text-1.png b/management/web/src/common/assets/images/layouts/logo-text-1.png
new file mode 100644
index 0000000..3543917
Binary files /dev/null and b/management/web/src/common/assets/images/layouts/logo-text-1.png differ
diff --git a/management/web/src/common/assets/images/layouts/logo-text-2.png b/management/web/src/common/assets/images/layouts/logo-text-2.png
new file mode 100644
index 0000000..3543917
Binary files /dev/null and b/management/web/src/common/assets/images/layouts/logo-text-2.png differ
diff --git a/management/web/src/common/assets/images/layouts/logo.png b/management/web/src/common/assets/images/layouts/logo.png
new file mode 100644
index 0000000..d64acf0
Binary files /dev/null and b/management/web/src/common/assets/images/layouts/logo.png differ
diff --git a/management/web/src/common/assets/styles/element-plus.css b/management/web/src/common/assets/styles/element-plus.css
new file mode 100644
index 0000000..c550ac9
--- /dev/null
+++ b/management/web/src/common/assets/styles/element-plus.css
@@ -0,0 +1,90 @@
+/**
+ * @description dark-blue 主题模式下的 Element Plus CSS 变量
+ * @description 在此查阅所有可自定义的变量:https://github.com/element-plus/element-plus/blob/dev/packages/theme-chalk/src/common/var.scss
+ * @description 也可以打开浏览器控制台选择元素,查看要覆盖的变量名
+ */
+
+/* 基础颜色 */
+html.dark-blue {
+ /* color-primary */
+ --el-color-primary: #00bb99;
+ --el-color-primary-light-3: #00bb99b3;
+ --el-color-primary-light-5: #00bb9980;
+ --el-color-primary-light-7: #00bb994d;
+ --el-color-primary-light-8: #00bb9933;
+ --el-color-primary-light-9: #00bb991a;
+ --el-color-primary-dark-2: #00bb99;
+ /* color-success */
+ --el-color-success: #67c23a;
+ --el-color-success-light-3: #67c23ab3;
+ --el-color-success-light-5: #67c23a80;
+ --el-color-success-light-7: #67c23a4d;
+ --el-color-success-light-8: #67c23a33;
+ --el-color-success-light-9: #67c23a1a;
+ --el-color-success-dark-2: #67c23a;
+ /* color-warning */
+ --el-color-warning: #e6a23c;
+ --el-color-warning-light-3: #e6a23cb3;
+ --el-color-warning-light-5: #e6a23c80;
+ --el-color-warning-light-7: #e6a23c4d;
+ --el-color-warning-light-8: #e6a23c33;
+ --el-color-warning-light-9: #e6a23c1a;
+ --el-color-warning-dark-2: #e6a23c;
+ /* color-danger */
+ --el-color-danger: #f56c6c;
+ --el-color-danger-light-3: #f56c6cb3;
+ --el-color-danger-light-5: #f56c6c80;
+ --el-color-danger-light-7: #f56c6c4d;
+ --el-color-danger-light-8: #f56c6c33;
+ --el-color-danger-light-9: #f56c6c1a;
+ --el-color-danger-dark-2: #f56c6c;
+ /* color-error */
+ --el-color-error: #f56c6c;
+ --el-color-error-light-3: #f56c6cb3;
+ --el-color-error-light-5: #f56c6c80;
+ --el-color-error-light-7: #f56c6c4d;
+ --el-color-error-light-8: #f56c6c33;
+ --el-color-error-light-9: #f56c6c1a;
+ --el-color-error-dark-2: #f56c6c;
+ /* color-info */
+ --el-color-info: #909399;
+ --el-color-info-light-3: #909399b3;
+ --el-color-info-light-5: #90939980;
+ --el-color-info-light-7: #9093994d;
+ --el-color-info-light-8: #90939933;
+ --el-color-info-light-9: #9093991a;
+ --el-color-info-dark-2: #909399;
+ /* text-color */
+ --el-text-color-primary: #e5eaf3;
+ --el-text-color-regular: #cfd3dc;
+ --el-text-color-secondary: #a3a6ad;
+ --el-text-color-placeholder: #8d9095;
+ --el-text-color-disabled: #6c6e72;
+ /* border-color */
+ --el-border-color-darker: #003380;
+ --el-border-color-dark: #003380;
+ --el-border-color: #003380;
+ --el-border-color-light: #003380;
+ --el-border-color-lighter: #003380;
+ --el-border-color-extra-light: #003380;
+ /* fill-color */
+ --el-fill-color-darker: #002b6b;
+ --el-fill-color-dark: #002b6b;
+ --el-fill-color: #002b6b;
+ --el-fill-color-light: #002359;
+ --el-fill-color-lighter: #002359;
+ --el-fill-color-blank: #001b44;
+ --el-fill-color-extra-light: #001b44;
+ /* bg-color */
+ --el-bg-color-page: #001535;
+ --el-bg-color: #001b44;
+ --el-bg-color-overlay: #002359;
+ /* mask-color */
+ --el-mask-color: rgba(0, 0, 0, 0.5);
+ --el-mask-color-extra-light: rgba(0, 0, 0, 0.3);
+}
+
+/* button */
+html.dark-blue .el-button {
+ --el-button-disabled-text-color: rgba(255, 255, 255, 0.5);
+}
diff --git a/management/web/src/common/assets/styles/element-plus.scss b/management/web/src/common/assets/styles/element-plus.scss
new file mode 100644
index 0000000..564e9d3
--- /dev/null
+++ b/management/web/src/common/assets/styles/element-plus.scss
@@ -0,0 +1,20 @@
+// 自定义 Element Plus 样式
+
+// 卡片
+.el-card {
+ background-color: var(--el-bg-color) !important;
+}
+
+// 分页
+.el-pagination {
+ // 参考 Bootstrap 的响应式设计 WIDTH = 768
+ @media screen and (max-width: 768px) {
+ .el-pagination__total,
+ .el-pagination__sizes,
+ .el-pagination__jump,
+ .btn-prev,
+ .btn-next {
+ display: none;
+ }
+ }
+}
diff --git a/management/web/src/common/assets/styles/index.scss b/management/web/src/common/assets/styles/index.scss
new file mode 100644
index 0000000..db2f8b0
--- /dev/null
+++ b/management/web/src/common/assets/styles/index.scss
@@ -0,0 +1,67 @@
+// 全局 CSS 变量
+@import "./variables.css";
+// Transition
+@import "./transition.scss";
+// Element Plus
+@import "./element-plus.css";
+@import "./element-plus.scss";
+// Vxe Table
+@import "./vxe-table.css";
+@import "./vxe-table.scss";
+// 注册多主题
+@import "./theme/register.scss";
+// Mixins
+@import "./mixins.scss";
+// View Transition
+@import "./view-transition.scss";
+
+// 业务页面几乎都应该在根元素上挂载 class="app-container",以保持页面美观
+.app-container {
+ padding: 20px;
+}
+
+html {
+ height: 100%;
+ // 灰色模式
+ &.grey-mode {
+ filter: grayscale(1);
+ }
+ // 色弱模式
+ &.color-weakness {
+ filter: invert(0.8);
+ }
+}
+
+body {
+ height: 100%;
+ color: var(--v3-body-text-color);
+ background-color: var(--v3-body-bg-color);
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ font-family:
+ Inter, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial,
+ sans-serif;
+ @extend %scrollbar;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+a,
+a:focus,
+a:hover {
+ color: inherit;
+ outline: none;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
diff --git a/management/web/src/common/assets/styles/mixins.scss b/management/web/src/common/assets/styles/mixins.scss
new file mode 100644
index 0000000..758e6e5
--- /dev/null
+++ b/management/web/src/common/assets/styles/mixins.scss
@@ -0,0 +1,42 @@
+// 清除浮动
+%clearfix {
+ &::after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+// 美化原生滚动条
+%scrollbar {
+ // 整个滚动条
+ &::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+ }
+ // 滚动条上的滚动滑块
+ &::-webkit-scrollbar-thumb {
+ border-radius: 4px;
+ background-color: #90939955;
+ }
+ &::-webkit-scrollbar-thumb:hover {
+ background-color: #90939977;
+ }
+ &::-webkit-scrollbar-thumb:active {
+ background-color: #90939999;
+ }
+ // 当同时有垂直滚动条和水平滚动条时交汇的部分
+ &::-webkit-scrollbar-corner {
+ background-color: transparent;
+ }
+}
+
+// 文本溢出时显示省略号
+%ellipsis {
+ // 隐藏溢出的文本
+ overflow: hidden;
+ // 防止文本换行
+ white-space: nowrap;
+ // 文本内容溢出容器时,文本末尾显示省略号
+ text-overflow: ellipsis;
+}
diff --git a/management/web/src/common/assets/styles/theme/core/element-plus.scss b/management/web/src/common/assets/styles/theme/core/element-plus.scss
new file mode 100644
index 0000000..54061a7
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/core/element-plus.scss
@@ -0,0 +1,29 @@
+// Element Plus 相关
+
+// 侧边栏的 item 的 popper
+.el-popper {
+ .el-menu {
+ background-color: var(--el-bg-color);
+ .el-menu-item {
+ background-color: var(--el-bg-color);
+ &.is-active,
+ &:hover {
+ background-color: var(--el-bg-color-overlay);
+ color: #ffffff;
+ }
+ }
+ .el-sub-menu__title {
+ background-color: var(--el-bg-color);
+ }
+ .el-sub-menu {
+ &.is-active {
+ > .el-sub-menu__title {
+ color: #ffffff;
+ }
+ }
+ }
+ }
+ .el-menu--horizontal {
+ border: none;
+ }
+}
diff --git a/management/web/src/common/assets/styles/theme/core/index.scss b/management/web/src/common/assets/styles/theme/core/index.scss
new file mode 100644
index 0000000..5bfe156
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/core/index.scss
@@ -0,0 +1,4 @@
+.#{$theme-name} {
+ @import "./layouts.scss";
+ @import "./element-plus.scss";
+}
diff --git a/management/web/src/common/assets/styles/theme/core/layouts.scss b/management/web/src/common/assets/styles/theme/core/layouts.scss
new file mode 100644
index 0000000..faa23b6
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/core/layouts.scss
@@ -0,0 +1,34 @@
+// Layout 相关
+
+.app-wrapper {
+ // 侧边栏
+ .sidebar-container {
+ background-color: var(--el-bg-color);
+ .el-menu {
+ background-color: var(--el-bg-color);
+ .el-menu-item {
+ background-color: var(--el-bg-color);
+ &.is-active,
+ &:hover {
+ background-color: var(--el-bg-color-overlay);
+ color: #ffffff;
+ }
+ }
+ }
+ .el-sub-menu__title {
+ background-color: var(--el-bg-color);
+ }
+ .el-sub-menu {
+ &.is-active {
+ > .el-sub-menu__title {
+ color: #ffffff;
+ }
+ }
+ }
+ }
+}
+
+// 右侧设置面板
+.handle-button {
+ background-color: lighten($theme-bg-color, 20%) !important;
+}
diff --git a/management/web/src/common/assets/styles/theme/dark-blue/index.scss b/management/web/src/common/assets/styles/theme/dark-blue/index.scss
new file mode 100644
index 0000000..d39200d
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/dark-blue/index.scss
@@ -0,0 +1,2 @@
+@import "./variables.scss";
+@import "../core/index.scss";
diff --git a/management/web/src/common/assets/styles/theme/dark-blue/variables.scss b/management/web/src/common/assets/styles/theme/dark-blue/variables.scss
new file mode 100644
index 0000000..e65ab92
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/dark-blue/variables.scss
@@ -0,0 +1,6 @@
+// dark-blue 主题下的变量
+
+// 主题名称
+$theme-name: "dark-blue";
+// 主题背景颜色
+$theme-bg-color: #001b44;
diff --git a/management/web/src/common/assets/styles/theme/dark/index.scss b/management/web/src/common/assets/styles/theme/dark/index.scss
new file mode 100644
index 0000000..d39200d
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/dark/index.scss
@@ -0,0 +1,2 @@
+@import "./variables.scss";
+@import "../core/index.scss";
diff --git a/management/web/src/common/assets/styles/theme/dark/variables.scss b/management/web/src/common/assets/styles/theme/dark/variables.scss
new file mode 100644
index 0000000..df0a354
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/dark/variables.scss
@@ -0,0 +1,6 @@
+// dark 主题下的变量
+
+// 主题名称
+$theme-name: "dark";
+// 主题背景颜色
+$theme-bg-color: #141414;
diff --git a/management/web/src/common/assets/styles/theme/register.scss b/management/web/src/common/assets/styles/theme/register.scss
new file mode 100644
index 0000000..6b74211
--- /dev/null
+++ b/management/web/src/common/assets/styles/theme/register.scss
@@ -0,0 +1,3 @@
+// 注册多主题
+@import "./dark/index.scss";
+@import "./dark-blue/index.scss";
diff --git a/management/web/src/common/assets/styles/transition.scss b/management/web/src/common/assets/styles/transition.scss
new file mode 100644
index 0000000..5a4657a
--- /dev/null
+++ b/management/web/src/common/assets/styles/transition.scss
@@ -0,0 +1,25 @@
+// https://cn.vuejs.org/guide/built-ins/transition
+
+// fade-transform
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all 0.5s;
+}
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+// layout-logo-fade
+.layout-logo-fade-enter-active,
+.layout-logo-fade-leave-active {
+ transition: opacity 1.5s;
+}
+.layout-logo-fade-enter-from,
+.layout-logo-fade-leave-to {
+ opacity: 0;
+}
diff --git a/management/web/src/common/assets/styles/variables.css b/management/web/src/common/assets/styles/variables.css
new file mode 100644
index 0000000..32ec870
--- /dev/null
+++ b/management/web/src/common/assets/styles/variables.css
@@ -0,0 +1,72 @@
+/* 全局 CSS 变量,这种变量不仅可以在 CSS 和 SCSS 中使用,还可以导入到 JS 中使用 */
+
+:root {
+ /* Body */
+ --v3-body-text-color: var(--el-text-color-primary);
+ --v3-body-bg-color: var(--el-bg-color-page);
+ /* Header 区域 = NavigationBar 组件 + TagsView 组件 */
+ --v3-header-height: calc(
+ var(--v3-navigationbar-height) + var(--v3-tagsview-height) + var(--v3-header-border-bottom-width)
+ );
+ --v3-header-bg-color: var(--el-bg-color);
+ --v3-header-box-shadow: var(--el-box-shadow-lighter);
+ --v3-header-border-bottom-width: 1px;
+ --v3-header-border-bottom: var(--v3-header-border-bottom-width) solid var(--el-fill-color);
+ /* NavigationBar 组件 */
+ --v3-navigationbar-height: 50px;
+ --v3-navigationbar-text-color: var(--el-text-color-regular);
+ /* Sidebar 组件(左侧模式全部生效、顶部模式全部不生效、混合模式非颜色部分生效) */
+ --v3-sidebar-width: 220px;
+ --v3-sidebar-hide-width: 58px;
+ --v3-sidebar-border-right: 1px solid var(--el-fill-color);
+ --v3-sidebar-menu-item-height: 60px;
+ --v3-sidebar-menu-tip-line-bg-color: var(--el-color-primary);
+ --v3-sidebar-menu-bg-color: #001428;
+ --v3-sidebar-menu-hover-bg-color: #409eff10;
+ --v3-sidebar-menu-text-color: #cfd3dc;
+ --v3-sidebar-menu-active-text-color: #ffffff;
+ /* TagsView 组件 */
+ --v3-tagsview-height: 34px;
+ --v3-tagsview-text-color: var(--el-text-color-regular);
+ --v3-tagsview-tag-active-text-color: #ffffff;
+ --v3-tagsview-tag-bg-color: var(--el-bg-color);
+ --v3-tagsview-tag-active-bg-color: var(--el-color-primary);
+ --v3-tagsview-tag-border-radius: 2px;
+ --v3-tagsview-tag-border-color: var(--el-border-color-lighter);
+ --v3-tagsview-tag-active-border-color: var(--el-color-primary);
+ --v3-tagsview-tag-icon-hover-bg-color: #00000030;
+ --v3-tagsview-tag-icon-hover-color: #ffffff;
+ --v3-tagsview-contextmenu-text-color: var(--el-text-color-regular);
+ --v3-tagsview-contextmenu-hover-text-color: var(--el-text-color-primary);
+ --v3-tagsview-contextmenu-bg-color: var(--el-bg-color-overlay);
+ --v3-tagsview-contextmenu-hover-bg-color: var(--el-fill-color);
+ --v3-tagsview-contextmenu-box-shadow: var(--el-box-shadow);
+ /* Hamburger 组件 */
+ --v3-hamburger-text-color: var(--el-text-color-primary);
+ /* RightPanel 组件 */
+ --v3-rightpanel-button-bg-color: #001428;
+}
+
+/* 内容区放大时,将不需要的组件隐藏 */
+body.content-large {
+ /* Header 区域 = TagsView 组件 */
+ --v3-header-height: var(--v3-tagsview-height);
+ /* NavigationBar 组件 */
+ --v3-navigationbar-height: 0px;
+ /* Sidebar 组件 */
+ --v3-sidebar-width: 0px;
+ --v3-sidebar-hide-width: 0px;
+}
+
+/* 内容区全屏时,将不需要的组件隐藏 */
+body.content-full {
+ /* Header 区域 */
+ --v3-header-height: 0px;
+ /* NavigationBar 组件 */
+ --v3-navigationbar-height: 0px;
+ /* Sidebar 组件 */
+ --v3-sidebar-width: 0px;
+ --v3-sidebar-hide-width: 0px;
+ /* TagsView 组件 */
+ --v3-tagsview-height: 0px;
+}
diff --git a/management/web/src/common/assets/styles/view-transition.scss b/management/web/src/common/assets/styles/view-transition.scss
new file mode 100644
index 0000000..72d5975
--- /dev/null
+++ b/management/web/src/common/assets/styles/view-transition.scss
@@ -0,0 +1,20 @@
+// 控制切换主题时的动画效果(只在较新的浏览器上生效,例如 Chrome 111+)
+
+::view-transition-old(root) {
+ animation: none;
+ mix-blend-mode: normal;
+}
+
+::view-transition-new(root) {
+ animation: 0.5s ease-in clip-animation;
+ mix-blend-mode: normal;
+}
+
+@keyframes clip-animation {
+ from {
+ clip-path: circle(0px at var(--v3-theme-x) var(--v3-theme-y));
+ }
+ to {
+ clip-path: circle(var(--v3-theme-r) at var(--v3-theme-x) var(--v3-theme-y));
+ }
+}
diff --git a/management/web/src/common/assets/styles/vxe-table.css b/management/web/src/common/assets/styles/vxe-table.css
new file mode 100644
index 0000000..37743c6
--- /dev/null
+++ b/management/web/src/common/assets/styles/vxe-table.css
@@ -0,0 +1,97 @@
+/**
+ * @description 所有主题模式下的 Vxe Table CSS 变量
+ * @description 用 Element Plus 的 CSS 变量来覆写 Vxe Table 的 CSS 变量,目的是使 Vxe Table 支持多主题模式且样式统一
+ * @description 在此查阅所有可自定义的变量:https://github.com/x-extends/vxe-table/blob/master/styles/css-variable.scss
+ */
+
+:root {
+ /* color */
+ --vxe-font-color: var(--el-text-color-regular);
+ --vxe-primary-color: var(--el-color-primary);
+ --vxe-success-color: var(--el-color-success);
+ --vxe-info-color: var(--el-color-info);
+ --vxe-warning-color: var(--el-color-warning);
+ --vxe-danger-color: var(--el-color-danger);
+
+ --vxe-font-lighten-color: var(--el-text-color-primary);
+ --vxe-primary-lighten-color: var(--el-color-primary-light-3);
+ --vxe-success-lighten-color: var(--el-color-success-light-3);
+ --vxe-info-lighten-color: var(--el-color-info-light-3);
+ --vxe-warning-lighten-color: var(--el-color-warning-light-3);
+ --vxe-danger-lighten-color: var(--el-color-danger-light-3);
+
+ --vxe-font-darken-color: var(--el-text-color-secondary);
+ --vxe-primary-darken-color: var(--el-color-primary-dark-2);
+ --vxe-success-darken-color: var(--el-color-success-dark-2);
+ --vxe-info-darken-color: var(--el-color-info-dark-2);
+ --vxe-warning-darken-color: var(--el-color-warning-dark-2);
+ --vxe-danger-darken-color: var(--el-color-danger-dark-2);
+
+ --vxe-font-disabled-color: var(--el-text-color-disabled);
+ --vxe-primary-disabled-color: var(--el-color-primary-light-5);
+ --vxe-success-disabled-color: var(--el-color-success-light-5);
+ --vxe-info-disabled-color: var(--el-color-info-light-5);
+ --vxe-warning-disabled-color: var(--el-color-warning-light-5);
+ --vxe-danger-disabled-color: var(--el-color-danger-light-5);
+
+ /* input/radio/checkbox */
+ --vxe-input-border-color: var(--el-border-color);
+ --vxe-input-disabled-color: var(--el-text-color-disabled);
+ --vxe-input-disabled-background-color: var(--el-fill-color-light);
+ --vxe-input-placeholder-color: var(--el-text-color-placeholder);
+
+ /* popup */
+ --vxe-table-popup-border-color: var(--el-border-color);
+
+ /* table */
+ --vxe-table-header-font-color: var(--el-text-color-regular);
+ --vxe-table-footer-font-color: var(--el-text-color-regular);
+ --vxe-table-border-color: var(--el-border-color-lighter);
+ --vxe-table-header-background-color: var(--el-bg-color);
+ --vxe-table-body-background-color: var(--el-bg-color);
+ --vxe-table-footer-background-color: var(--el-bg-color);
+
+ --vxe-table-row-hover-background-color: var(--el-fill-color-light);
+ --vxe-table-row-current-background-color: var(--el-fill-color-light);
+ --vxe-table-row-hover-current-background-color: var(--el-fill-color-light);
+
+ --vxe-table-checkbox-range-background-color: var(--el-fill-color-light);
+
+ /* menu */
+ --vxe-table-menu-background-color: var(--el-bg-color-overlay);
+
+ /* loading */
+ --vxe-loading-color: var(--el-color-primary);
+ --vxe-loading-background-color: var(--el-mask-color);
+
+ /* validate */
+ --vxe-table-validate-error-color: var(--el-color-danger);
+
+ /* toolbar */
+ --vxe-toolbar-background-color: var(--el-bg-color);
+ --vxe-toolbar-custom-active-background-color: var(--el-bg-color-overlay);
+ --vxe-toolbar-panel-background-color: var(--el-bg-color-overlay);
+
+ /* pager */
+ --vxe-pager-background-color: var(--el-bg-color);
+
+ /* modal */
+ --vxe-modal-header-background-color: var(--el-bg-color);
+ --vxe-modal-body-background-color: var(--el-bg-color);
+ --vxe-modal-border-color: var(--el-border-color);
+
+ /* button */
+ --vxe-button-default-background-color: var(--el-bg-color-overlay);
+
+ /* input */
+ --vxe-input-background-color: var(--el-fill-color-blank);
+ --vxe-input-panel-background-color: var(--el-fill-color-blank);
+
+ /* form */
+ --vxe-form-background-color: var(--el-bg-color);
+ --vxe-form-validate-error-color: var(--el-color-danger);
+
+ /* select */
+ --vxe-select-option-hover-background-color: var(--el-bg-color-overlay);
+ --vxe-select-panel-background-color: var(--el-bg-color);
+}
diff --git a/management/web/src/common/assets/styles/vxe-table.scss b/management/web/src/common/assets/styles/vxe-table.scss
new file mode 100644
index 0000000..ee86a35
--- /dev/null
+++ b/management/web/src/common/assets/styles/vxe-table.scss
@@ -0,0 +1,38 @@
+// 自定义 Vxe Table 样式
+
+.vxe-grid {
+ // 表单
+ &--form-wrapper {
+ .vxe-form {
+ padding: 10px 20px;
+ margin-bottom: 20px;
+ }
+ }
+
+ // 工具栏
+ &--toolbar-wrapper {
+ .vxe-toolbar {
+ padding: 20px;
+ }
+ }
+
+ // 分页
+ &--pager-wrapper {
+ .vxe-pager {
+ height: 70px;
+ padding: 0 20px;
+ &--wrapper {
+ // 参考 Bootstrap 的响应式设计 WIDTH = 768
+ @media screen and (max-width: 768px) {
+ .vxe-pager--total,
+ .vxe-pager--sizes,
+ .vxe-pager--jump,
+ .vxe-pager--jump-prev,
+ .vxe-pager--jump-next {
+ display: none;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/management/web/src/common/components/Notify/List.vue b/management/web/src/common/components/Notify/List.vue
new file mode 100644
index 0000000..174a42a
--- /dev/null
+++ b/management/web/src/common/components/Notify/List.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ {{ item.description ?? "No Data" }}
+
+
+
+
+
diff --git a/management/web/src/common/components/Notify/data.ts b/management/web/src/common/components/Notify/data.ts
new file mode 100644
index 0000000..6d4b55b
--- /dev/null
+++ b/management/web/src/common/components/Notify/data.ts
@@ -0,0 +1,58 @@
+import type { NotifyItem } from "./type"
+
+export const notifyData: NotifyItem[] = [
+ {
+ avatar: "https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png",
+ title: "V3 Admin Vite 上线啦",
+ datetime: "两年前",
+ description: "一个免费开源的中后台管理系统基础解决方案,基于 Vue3、TypeScript、Element Plus、Pinia 和 Vite 等主流技术"
+ },
+ {
+ avatar: "https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png",
+ title: "V3 Admin 上线啦",
+ datetime: "三年前",
+ description: "一个中后台管理系统基础解决方案,基于 Vue3、TypeScript、Element Plus 和 Pinia"
+ }
+]
+
+export const messageData: NotifyItem[] = [
+ {
+ avatar: "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
+ title: "来自楚门的世界",
+ description: "如果再也不能见到你,祝你早安、午安和晚安",
+ datetime: "1998-06-05"
+ },
+ {
+ avatar: "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
+ title: "来自大话西游",
+ description: "如果非要在这份爱上加上一个期限,我希望是一万年",
+ datetime: "1995-02-04"
+ },
+ {
+ avatar: "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
+ title: "来自龙猫",
+ description: "心存善意,定能途遇天使",
+ datetime: "1988-04-16"
+ }
+]
+
+export const todoData: NotifyItem[] = [
+ {
+ title: "任务名称",
+ description: "这家伙很懒,什么都没留下",
+ extra: "未开始",
+ status: "info"
+ },
+ {
+ title: "任务名称",
+ description: "这家伙很懒,什么都没留下",
+ extra: "进行中",
+ status: "primary"
+ },
+ {
+ title: "任务名称",
+ description: "这家伙很懒,什么都没留下",
+ extra: "已超时",
+ status: "danger"
+ }
+]
diff --git a/management/web/src/common/components/Notify/index.vue b/management/web/src/common/components/Notify/index.vue
new file mode 100644
index 0000000..6d7e3a5
--- /dev/null
+++ b/management/web/src/common/components/Notify/index.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ 查看{{ activeName }}历史
+
+
+
+
+
+
+
+
diff --git a/management/web/src/common/components/Notify/type.ts b/management/web/src/common/components/Notify/type.ts
new file mode 100644
index 0000000..d41fa7a
--- /dev/null
+++ b/management/web/src/common/components/Notify/type.ts
@@ -0,0 +1,8 @@
+export interface NotifyItem {
+ avatar?: string
+ title: string
+ datetime?: string
+ description?: string
+ status?: "primary" | "success" | "info" | "warning" | "danger"
+ extra?: string
+}
diff --git a/management/web/src/common/components/Screenfull/index.vue b/management/web/src/common/components/Screenfull/index.vue
new file mode 100644
index 0000000..7c21c18
--- /dev/null
+++ b/management/web/src/common/components/Screenfull/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ contentLargeTips }}
+
+
+
+ 内容区全屏
+
+
+
+
+
+
+
+
diff --git a/management/web/src/common/components/SearchMenu/Footer.vue b/management/web/src/common/components/SearchMenu/Footer.vue
new file mode 100644
index 0000000..f8eeeb9
--- /dev/null
+++ b/management/web/src/common/components/SearchMenu/Footer.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/common/components/SearchMenu/Modal.vue b/management/web/src/common/components/SearchMenu/Modal.vue
new file mode 100644
index 0000000..f2aab0e
--- /dev/null
+++ b/management/web/src/common/components/SearchMenu/Modal.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索结果
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/common/components/SearchMenu/Result.vue b/management/web/src/common/components/SearchMenu/Result.vue
new file mode 100644
index 0000000..ba769c4
--- /dev/null
+++ b/management/web/src/common/components/SearchMenu/Result.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+ {{ item.meta?.title }}
+
+
+
+
+
+
+
diff --git a/management/web/src/common/components/SearchMenu/index.vue b/management/web/src/common/components/SearchMenu/index.vue
new file mode 100644
index 0000000..2f42e80
--- /dev/null
+++ b/management/web/src/common/components/SearchMenu/index.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/common/components/ThemeSwitch/index.vue b/management/web/src/common/components/ThemeSwitch/index.vue
new file mode 100644
index 0000000..c910b4f
--- /dev/null
+++ b/management/web/src/common/components/ThemeSwitch/index.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setTheme(e, theme.name)"
+ >
+ {{ theme.title }}
+
+
+
+
+
diff --git a/management/web/src/common/composables/useDevice.ts b/management/web/src/common/composables/useDevice.ts
new file mode 100644
index 0000000..c44c629
--- /dev/null
+++ b/management/web/src/common/composables/useDevice.ts
@@ -0,0 +1,12 @@
+import { useAppStore } from "@/pinia/stores/app"
+import { DeviceEnum } from "@@/constants/app-key"
+
+const appStore = useAppStore()
+
+const isMobile = computed(() => appStore.device === DeviceEnum.Mobile)
+const isDesktop = computed(() => appStore.device === DeviceEnum.Desktop)
+
+/** 设备类型 Composable */
+export function useDevice() {
+ return { isMobile, isDesktop }
+}
diff --git a/management/web/src/common/composables/useFetchSelect.ts b/management/web/src/common/composables/useFetchSelect.ts
new file mode 100644
index 0000000..8442743
--- /dev/null
+++ b/management/web/src/common/composables/useFetchSelect.ts
@@ -0,0 +1,42 @@
+type OptionValue = string | number
+
+/** Select 需要的数据格式 */
+interface SelectOption {
+ value: OptionValue
+ label: string
+ disabled?: boolean
+}
+
+/** 接口响应格式 */
+type ApiData = ApiResponseData
+
+/** 入参格式,暂时只需要传递 api 函数即可 */
+interface FetchSelectProps {
+ api: () => Promise
+}
+
+/** 下拉选择器 Composable */
+export function useFetchSelect(props: FetchSelectProps) {
+ const { api } = props
+
+ const loading = ref(false)
+ const options = ref([])
+ const value = ref("")
+
+ // 调用接口获取数据
+ const loadData = () => {
+ loading.value = true
+ options.value = []
+ api().then((res) => {
+ options.value = res.data
+ }).finally(() => {
+ loading.value = false
+ })
+ }
+
+ onMounted(() => {
+ loadData()
+ })
+
+ return { loading, options, value }
+}
diff --git a/management/web/src/common/composables/useFullscreenLoading.ts b/management/web/src/common/composables/useFullscreenLoading.ts
new file mode 100644
index 0000000..f5671a6
--- /dev/null
+++ b/management/web/src/common/composables/useFullscreenLoading.ts
@@ -0,0 +1,36 @@
+import type { LoadingOptions } from "element-plus"
+
+interface UseFullscreenLoading {
+ ) => ReturnType>(
+ fn: T,
+ options?: LoadingOptions
+ ): (...args: Parameters) => Promise>
+}
+
+interface LoadingInstance {
+ close: () => void
+}
+
+const DEFAULT_OPTIONS = {
+ lock: true,
+ text: "加载中..."
+}
+
+/**
+ * @name 全屏加载 Composable
+ * @description 传入一个函数 fn,在它执行周期内,加上「全屏」Loading
+ * @param fn 要执行的函数
+ * @param options LoadingOptions
+ * @returns 返回一个新的函数,该函数返回一个 Promise
+ */
+export const useFullscreenLoading: UseFullscreenLoading = (fn, options = {}) => {
+ let loadingInstance: LoadingInstance
+ return async (...args) => {
+ try {
+ loadingInstance = ElLoading.service({ ...DEFAULT_OPTIONS, ...options })
+ return await fn(...args)
+ } finally {
+ loadingInstance.close()
+ }
+ }
+}
diff --git a/management/web/src/common/composables/useGreyAndColorWeakness.ts b/management/web/src/common/composables/useGreyAndColorWeakness.ts
new file mode 100644
index 0000000..2738528
--- /dev/null
+++ b/management/web/src/common/composables/useGreyAndColorWeakness.ts
@@ -0,0 +1,20 @@
+import { useSettingsStore } from "@/pinia/stores/settings"
+
+const GREY_MODE = "grey-mode"
+const COLOR_WEAKNESS = "color-weakness"
+
+const classList = document.documentElement.classList
+
+/** 初始化 */
+function initGreyAndColorWeakness() {
+ const settingsStore = useSettingsStore()
+ watchEffect(() => {
+ classList.toggle(GREY_MODE, settingsStore.showGreyMode)
+ classList.toggle(COLOR_WEAKNESS, settingsStore.showColorWeakness)
+ })
+}
+
+/** 灰色模式和色弱模式 Composable */
+export function useGreyAndColorWeakness() {
+ return { initGreyAndColorWeakness }
+}
diff --git a/management/web/src/common/composables/useLayoutMode.ts b/management/web/src/common/composables/useLayoutMode.ts
new file mode 100644
index 0000000..7835f36
--- /dev/null
+++ b/management/web/src/common/composables/useLayoutMode.ts
@@ -0,0 +1,17 @@
+import { useSettingsStore } from "@/pinia/stores/settings"
+import { LayoutModeEnum } from "@@/constants/app-key"
+
+const settingsStore = useSettingsStore()
+
+const isLeft = computed(() => settingsStore.layoutMode === LayoutModeEnum.Left)
+const isTop = computed(() => settingsStore.layoutMode === LayoutModeEnum.Top)
+const isLeftTop = computed(() => settingsStore.layoutMode === LayoutModeEnum.LeftTop)
+
+function setLayoutMode(mode: LayoutModeEnum) {
+ settingsStore.layoutMode = mode
+}
+
+/** 布局模式 Composable */
+export function useLayoutMode() {
+ return { isLeft, isTop, isLeftTop, setLayoutMode }
+}
diff --git a/management/web/src/common/composables/usePagination.ts b/management/web/src/common/composables/usePagination.ts
new file mode 100644
index 0000000..976e748
--- /dev/null
+++ b/management/web/src/common/composables/usePagination.ts
@@ -0,0 +1,32 @@
+interface PaginationData {
+ total?: number
+ currentPage?: number
+ pageSizes?: number[]
+ pageSize?: number
+ layout?: string
+}
+
+/** 默认的分页参数 */
+const DEFAULT_PAGINATION_DATA = {
+ total: 0,
+ currentPage: 1,
+ pageSizes: [10, 20, 50],
+ pageSize: 10,
+ layout: "total, sizes, prev, pager, next, jumper"
+}
+
+/** 分页 Composable */
+export function usePagination(initPaginationData: PaginationData = {}) {
+ // 合并分页参数
+ const paginationData = reactive({ ...DEFAULT_PAGINATION_DATA, ...initPaginationData })
+ // 改变当前页码
+ const handleCurrentChange = (value: number) => {
+ paginationData.currentPage = value
+ }
+ // 改变每页显示条数
+ const handleSizeChange = (value: number) => {
+ paginationData.pageSize = value
+ }
+
+ return { paginationData, handleCurrentChange, handleSizeChange }
+}
diff --git a/management/web/src/common/composables/usePany.ts b/management/web/src/common/composables/usePany.ts
new file mode 100644
index 0000000..21abf02
--- /dev/null
+++ b/management/web/src/common/composables/usePany.ts
@@ -0,0 +1,42 @@
+function initStarNotification() {
+ // setTimeout(() => {
+ // ElNotification({
+ // title: "为爱发电!",
+ // type: "success",
+ // message: h(
+ // "div",
+ // null,
+ // [
+ // h("div", null, "所有源码均免费开源,如果对你有帮助,欢迎点个 Star 支持一下!"),
+ // h("a", { style: "color: teal", target: "_blank", href: "https://github.com/un-pany/v3-admin-vite" }, "点击传送")
+ // ]
+ // ),
+ // duration: 0,
+ // position: "bottom-right"
+ // })
+ // }, 0)
+}
+
+function initStoreNotification() {
+ // setTimeout(() => {
+ // ElNotification({
+ // title: "懒人服务?",
+ // type: "warning",
+ // message: h(
+ // "div",
+ // null,
+ // [
+ // h("div", null, "不想自己动手,但想移除 TS 或其他模块?也有懒人套餐!"),
+ // h("a", { style: "color: teal", target: "_blank", href: "https://github.com/un-pany/v3-admin-vite/issues/225" }, "点击查看")
+ // ]
+ // ),
+ // duration: 0,
+ // position: "bottom-right"
+ // })
+ // }, 500)
+}
+
+export function usePany() {
+ // return null
+ return { initStarNotification, initStoreNotification }
+}
diff --git a/management/web/src/common/composables/useRouteListener.ts b/management/web/src/common/composables/useRouteListener.ts
new file mode 100644
index 0000000..82b5ac3
--- /dev/null
+++ b/management/web/src/common/composables/useRouteListener.ts
@@ -0,0 +1,52 @@
+import type { Handler } from "mitt"
+import type { RouteLocationNormalizedGeneric } from "vue-router"
+import mitt from "mitt"
+
+/** 回调函数的类型 */
+type Callback = (route: RouteLocationNormalizedGeneric) => void
+
+const emitter = mitt()
+
+const key = Symbol("ROUTE_CHANGE")
+
+let latestRoute: RouteLocationNormalizedGeneric
+
+/** 设置最新的路由信息,触发路由变化事件 */
+export function setRouteChange(to: RouteLocationNormalizedGeneric) {
+ // 触发事件
+ emitter.emit(key, to)
+ // 缓存最新的路由信息
+ latestRoute = to
+}
+
+/**
+ * @name 订阅路由变化 Composable
+ * @description 1. 单独用 watch 监听路由会浪费渲染性能
+ * @description 2. 可优先选择使用该发布订阅模式去进行分发管理
+ */
+export function useRouteListener() {
+ // 回调函数集合
+ const callbackList: Callback[] = []
+
+ // 监听路由变化(可以选择立即执行)
+ const listenerRouteChange = (callback: Callback, immediate = false) => {
+ // 缓存回调函数
+ callbackList.push(callback)
+ // 监听事件
+ emitter.on(key, callback as Handler)
+ // 可以选择立即执行一次回调函数
+ immediate && latestRoute && callback(latestRoute)
+ }
+
+ // 移除路由变化事件监听器
+ const removeRouteListener = (callback: Callback) => {
+ emitter.off(key, callback as Handler)
+ }
+
+ // 组件销毁前移除监听器
+ onBeforeUnmount(() => {
+ callbackList.forEach(removeRouteListener)
+ })
+
+ return { listenerRouteChange, removeRouteListener }
+}
diff --git a/management/web/src/common/composables/useTheme.ts b/management/web/src/common/composables/useTheme.ts
new file mode 100644
index 0000000..ec0c12f
--- /dev/null
+++ b/management/web/src/common/composables/useTheme.ts
@@ -0,0 +1,75 @@
+import { getActiveThemeName, setActiveThemeName } from "@@/utils/cache/local-storage"
+import { setCssVar } from "@@/utils/css"
+
+const DEFAULT_THEME_NAME = "normal"
+
+type DefaultThemeName = typeof DEFAULT_THEME_NAME
+
+/** 注册的主题名称, 其中 DefaultThemeName 是必填的 */
+export type ThemeName = DefaultThemeName | "dark" | "dark-blue"
+
+interface ThemeList {
+ title: string
+ name: ThemeName
+}
+
+/** 主题列表 */
+const themeList: ThemeList[] = [
+ {
+ title: "默认",
+ name: DEFAULT_THEME_NAME
+ },
+ {
+ title: "黑暗",
+ name: "dark"
+ },
+ {
+ title: "深蓝",
+ name: "dark-blue"
+ }
+]
+
+/** 正在应用的主题名称 */
+const activeThemeName = ref(getActiveThemeName() || DEFAULT_THEME_NAME)
+
+/** 设置主题 */
+function setTheme({ clientX, clientY }: MouseEvent, value: ThemeName) {
+ const maxRadius = Math.hypot(
+ Math.max(clientX, window.innerWidth - clientX),
+ Math.max(clientY, window.innerHeight - clientY)
+ )
+ setCssVar("--v3-theme-x", `${clientX}px`)
+ setCssVar("--v3-theme-y", `${clientY}px`)
+ setCssVar("--v3-theme-r", `${maxRadius}px`)
+ const handler = () => {
+ activeThemeName.value = value
+ }
+ document.startViewTransition ? document.startViewTransition(handler) : handler()
+}
+
+/** 在 html 根元素上挂载 class */
+function addHtmlClass(value: ThemeName) {
+ document.documentElement.classList.add(value)
+}
+
+/** 在 html 根元素上移除其他主题 class */
+function removeHtmlClass(value: ThemeName) {
+ const otherThemeNameList = themeList.map(item => item.name).filter(name => name !== value)
+ document.documentElement.classList.remove(...otherThemeNameList)
+}
+
+/** 初始化 */
+function initTheme() {
+ // watchEffect 来收集副作用
+ watchEffect(() => {
+ const value = activeThemeName.value
+ removeHtmlClass(value)
+ addHtmlClass(value)
+ setActiveThemeName(value)
+ })
+}
+
+/** 主题 Composable */
+export function useTheme() {
+ return { themeList, activeThemeName, initTheme, setTheme }
+}
diff --git a/management/web/src/common/composables/useTitle.ts b/management/web/src/common/composables/useTitle.ts
new file mode 100644
index 0000000..1305363
--- /dev/null
+++ b/management/web/src/common/composables/useTitle.ts
@@ -0,0 +1,22 @@
+/** 项目标题 */
+const VITE_APP_TITLE = import.meta.env.VITE_APP_TITLE ?? "V3 Admin Vite"
+
+/** 动态标题 */
+const dynamicTitle = ref("")
+
+/** 设置标题 */
+function setTitle(title?: string) {
+ dynamicTitle.value = title ? `${VITE_APP_TITLE} | ${title}` : VITE_APP_TITLE
+}
+
+// 监听标题变化
+watch(dynamicTitle, (value, oldValue) => {
+ if (document && value !== oldValue) {
+ document.title = value
+ }
+})
+
+/** 标题 Composable */
+export function useTitle() {
+ return { setTitle }
+}
diff --git a/management/web/src/common/composables/useWatermark.ts b/management/web/src/common/composables/useWatermark.ts
new file mode 100644
index 0000000..d975a4a
--- /dev/null
+++ b/management/web/src/common/composables/useWatermark.ts
@@ -0,0 +1,233 @@
+import type { Ref } from "vue"
+import { debounce } from "lodash-es"
+
+/** 默认配置 */
+const DEFAULT_CONFIG = {
+ /** 防御(默认开启,能防御水印被删除或隐藏,但可能会有性能损耗) */
+ defense: true,
+ /** 文本颜色 */
+ color: "#c0c4cc",
+ /** 文本透明度 */
+ opacity: 0.5,
+ /** 文本字体大小 */
+ size: 16,
+ /** 文本字体 */
+ family: "serif",
+ /** 文本倾斜角度 */
+ angle: -20,
+ /** 一处水印所占宽度(数值越大水印密度越低) */
+ width: 300,
+ /** 一处水印所占高度(数值越大水印密度越低) */
+ height: 200
+}
+
+type DefaultConfig = typeof DEFAULT_CONFIG
+
+interface Observer {
+ watermarkElMutationObserver?: MutationObserver
+ parentElMutationObserver?: MutationObserver
+ parentElResizeObserver?: ResizeObserver
+}
+
+/** body 元素 */
+const bodyEl = ref(document.body)
+
+/**
+ * @name 水印 Composable
+ * @description 1. 可以选择传入挂载水印的容器元素,默认是 body
+ * @description 2. 做了水印防御,能有效防御别人打开控制台删除或隐藏水印
+ */
+export function useWatermark(parentEl: Ref = bodyEl) {
+ // 备份文本
+ let backupText: string
+ // 最终配置
+ let mergeConfig: DefaultConfig
+ // 水印元素
+ let watermarkEl: HTMLElement | null = null
+ // 观察器
+ const observer: Observer = {
+ watermarkElMutationObserver: undefined,
+ parentElMutationObserver: undefined,
+ parentElResizeObserver: undefined
+ }
+
+ // 设置水印
+ const setWatermark = (text: string, config: Partial = {}) => {
+ if (!parentEl.value) return console.warn("请在 DOM 挂载完成后再调用 setWatermark 方法设置水印")
+ // 备份文本
+ backupText = text
+ // 合并配置
+ mergeConfig = { ...DEFAULT_CONFIG, ...config }
+ // 创建或更新水印元素
+ watermarkEl ? updateWatermarkEl() : createWatermarkEl()
+ // 监听水印元素和容器元素的变化
+ addElListener(parentEl.value)
+ }
+
+ // 创建水印元素
+ const createWatermarkEl = () => {
+ const isBody = parentEl.value!.tagName.toLowerCase() === bodyEl.value.tagName.toLowerCase()
+ const watermarkElPosition = isBody ? "fixed" : "absolute"
+ const parentElPosition = isBody ? "" : "relative"
+ watermarkEl = document.createElement("div")
+ watermarkEl.style.pointerEvents = "none"
+ watermarkEl.style.top = "0"
+ watermarkEl.style.left = "0"
+ watermarkEl.style.position = watermarkElPosition
+ watermarkEl.style.zIndex = "99999"
+ const { clientWidth, clientHeight } = parentEl.value!
+ updateWatermarkEl({ width: clientWidth, height: clientHeight })
+ // 设置水印容器为相对定位
+ parentEl.value!.style.position = parentElPosition
+ // 将水印元素添加到水印容器中
+ parentEl.value!.appendChild(watermarkEl)
+ }
+
+ // 更新水印元素
+ const updateWatermarkEl = (
+ options: Partial<{
+ width: number
+ height: number
+ }> = {}
+ ) => {
+ if (!watermarkEl) return
+ backupText && (watermarkEl.style.background = `url(${createBase64()}) left top repeat`)
+ options.width && (watermarkEl.style.width = `${options.width}px`)
+ options.height && (watermarkEl.style.height = `${options.height}px`)
+ }
+
+ // 创建 base64 图片
+ const createBase64 = () => {
+ const { color, opacity, size, family, angle, width, height } = mergeConfig
+ const canvasEl = document.createElement("canvas")
+ canvasEl.width = width
+ canvasEl.height = height
+ const ctx = canvasEl.getContext("2d")
+ if (ctx) {
+ ctx.fillStyle = color
+ ctx.globalAlpha = opacity
+ ctx.font = `${size}px ${family}`
+ ctx.rotate((Math.PI / 180) * angle)
+ ctx.fillText(backupText, 0, height / 2)
+ }
+ return canvasEl.toDataURL()
+ }
+
+ // 清除水印
+ const clearWatermark = () => {
+ if (!parentEl.value || !watermarkEl) return
+ // 移除对水印元素和容器元素的监听
+ removeListener()
+ // 移除水印元素
+ try {
+ parentEl.value.removeChild(watermarkEl)
+ } catch {
+ // 比如在无防御情况下,用户打开控制台删除了这个元素
+ console.warn("水印元素已不存在,请重新创建")
+ } finally {
+ watermarkEl = null
+ }
+ }
+
+ // 刷新水印(防御时调用)
+ const updateWatermark = debounce(() => {
+ clearWatermark()
+ createWatermarkEl()
+ addElListener(parentEl.value!)
+ }, 100)
+
+ // 监听水印元素和容器元素的变化(DOM 变化 & DOM 大小变化)
+ const addElListener = (targetNode: HTMLElement) => {
+ // 判断是否开启防御
+ if (mergeConfig.defense) {
+ // 防止重复添加监听
+ if (!observer.watermarkElMutationObserver && !observer.parentElMutationObserver) {
+ // 监听 DOM 变化
+ addMutationListener(targetNode)
+ }
+ } else {
+ // 无防御时不需要 mutation 监听
+ removeListener("mutation")
+ }
+ // 防止重复添加监听
+ if (!observer.parentElResizeObserver) {
+ // 监听 DOM 大小变化
+ addResizeListener(targetNode)
+ }
+ }
+
+ // 移除对水印元素和容器元素的监听,传参可指定要移除哪个监听,不传默认移除全部监听
+ const removeListener = (kind: "mutation" | "resize" | "all" = "all") => {
+ // 移除 mutation 监听
+ if (kind === "mutation" || kind === "all") {
+ observer.watermarkElMutationObserver?.disconnect()
+ observer.watermarkElMutationObserver = undefined
+ observer.parentElMutationObserver?.disconnect()
+ observer.parentElMutationObserver = undefined
+ }
+ // 移除 resize 监听
+ if (kind === "resize" || kind === "all") {
+ observer.parentElResizeObserver?.disconnect()
+ observer.parentElResizeObserver = undefined
+ }
+ }
+
+ // 监听 DOM 变化
+ const addMutationListener = (targetNode: HTMLElement) => {
+ // 当观察到变动时执行的回调
+ const mutationCallback = debounce((mutationList: MutationRecord[]) => {
+ // 水印的防御(防止用户手动删除水印元素或通过 CSS 隐藏水印)
+ mutationList.forEach(
+ debounce((mutation: MutationRecord) => {
+ switch (mutation.type) {
+ case "attributes":
+ mutation.target === watermarkEl && updateWatermark()
+ break
+ case "childList":
+ mutation.removedNodes.forEach((item) => {
+ item === watermarkEl && targetNode.appendChild(watermarkEl)
+ })
+ break
+ }
+ }, 100)
+ )
+ }, 100)
+ // 创建观察器实例并传入回调
+ observer.watermarkElMutationObserver = new MutationObserver(mutationCallback)
+ observer.parentElMutationObserver = new MutationObserver(mutationCallback)
+ // 以上述配置开始观察目标节点
+ observer.watermarkElMutationObserver.observe(watermarkEl!, {
+ // 观察目标节点属性是否变动,默认为 true
+ attributes: true,
+ // 观察目标子节点是否有添加或者删除,默认为 false
+ childList: false,
+ // 是否拓展到观察所有后代节点,默认为 false
+ subtree: false
+ })
+ observer.parentElMutationObserver.observe(targetNode, {
+ attributes: false,
+ childList: true,
+ subtree: false
+ })
+ }
+
+ // 监听 DOM 大小变化
+ const addResizeListener = (targetNode: HTMLElement) => {
+ // 当 targetNode 元素大小变化时去更新整个水印的大小
+ const resizeCallback = debounce(() => {
+ const { clientWidth, clientHeight } = targetNode
+ updateWatermarkEl({ width: clientWidth, height: clientHeight })
+ }, 500)
+ // 创建一个观察器实例并传入回调
+ observer.parentElResizeObserver = new ResizeObserver(resizeCallback)
+ // 开始观察目标节点
+ observer.parentElResizeObserver.observe(targetNode)
+ }
+
+ // 在组件卸载前移除水印以及各种监听
+ onBeforeUnmount(() => {
+ clearWatermark()
+ })
+
+ return { setWatermark, clearWatermark }
+}
diff --git a/management/web/src/common/constants/app-key.ts b/management/web/src/common/constants/app-key.ts
new file mode 100644
index 0000000..cd5d7b9
--- /dev/null
+++ b/management/web/src/common/constants/app-key.ts
@@ -0,0 +1,22 @@
+/** 设备类型 */
+export enum DeviceEnum {
+ Mobile,
+ Desktop
+}
+
+/** 布局模式 */
+export enum LayoutModeEnum {
+ Left = "left",
+ Top = "top",
+ LeftTop = "left-top"
+}
+
+/** 侧边栏打开状态常量 */
+export const SIDEBAR_OPENED = "opened"
+
+/** 侧边栏关闭状态常量 */
+export const SIDEBAR_CLOSED = "closed"
+
+export type SidebarOpened = typeof SIDEBAR_OPENED
+
+export type SidebarClosed = typeof SIDEBAR_CLOSED
diff --git a/management/web/src/common/constants/cache-key.ts b/management/web/src/common/constants/cache-key.ts
new file mode 100644
index 0000000..8b6fc64
--- /dev/null
+++ b/management/web/src/common/constants/cache-key.ts
@@ -0,0 +1,11 @@
+const SYSTEM_NAME = "v3-admin-vite"
+
+/** 缓存数据时用到的 Key */
+export class CacheKey {
+ static readonly TOKEN = `${SYSTEM_NAME}-token-key`
+ static readonly CONFIG_LAYOUT = `${SYSTEM_NAME}-config-layout-key`
+ static readonly SIDEBAR_STATUS = `${SYSTEM_NAME}-sidebar-status-key`
+ static readonly ACTIVE_THEME_NAME = `${SYSTEM_NAME}-active-theme-name-key`
+ static readonly VISITED_VIEWS = `${SYSTEM_NAME}-visited-views-key`
+ static readonly CACHED_VIEWS = `${SYSTEM_NAME}-cached-views-key`
+}
diff --git a/management/web/src/common/utils/cache/cookies.ts b/management/web/src/common/utils/cache/cookies.ts
new file mode 100644
index 0000000..d542159
--- /dev/null
+++ b/management/web/src/common/utils/cache/cookies.ts
@@ -0,0 +1,16 @@
+// 统一处理 Cookie
+
+import { CacheKey } from "@@/constants/cache-key"
+import Cookies from "js-cookie"
+
+export function getToken() {
+ return Cookies.get(CacheKey.TOKEN)
+}
+
+export function setToken(token: string) {
+ Cookies.set(CacheKey.TOKEN, token)
+}
+
+export function removeToken() {
+ Cookies.remove(CacheKey.TOKEN)
+}
diff --git a/management/web/src/common/utils/cache/local-storage.ts b/management/web/src/common/utils/cache/local-storage.ts
new file mode 100644
index 0000000..98519e2
--- /dev/null
+++ b/management/web/src/common/utils/cache/local-storage.ts
@@ -0,0 +1,60 @@
+// 统一处理 localStorage
+
+import type { LayoutsConfig } from "@/layouts/config"
+import type { TagView } from "@/pinia/stores/tags-view"
+import type { ThemeName } from "@@/composables/useTheme"
+import type { SidebarClosed, SidebarOpened } from "@@/constants/app-key"
+import { CacheKey } from "@@/constants/cache-key"
+
+// #region 系统布局配置
+export function getLayoutsConfig() {
+ const json = localStorage.getItem(CacheKey.CONFIG_LAYOUT)
+ return json ? (JSON.parse(json) as LayoutsConfig) : null
+}
+export function setLayoutsConfig(settings: LayoutsConfig) {
+ localStorage.setItem(CacheKey.CONFIG_LAYOUT, JSON.stringify(settings))
+}
+export function removeLayoutsConfig() {
+ localStorage.removeItem(CacheKey.CONFIG_LAYOUT)
+}
+// #endregion
+
+// #region 侧边栏状态
+export function getSidebarStatus() {
+ return localStorage.getItem(CacheKey.SIDEBAR_STATUS)
+}
+export function setSidebarStatus(sidebarStatus: SidebarOpened | SidebarClosed) {
+ localStorage.setItem(CacheKey.SIDEBAR_STATUS, sidebarStatus)
+}
+// #endregion
+
+// #region 正在应用的主题名称
+export function getActiveThemeName() {
+ return localStorage.getItem(CacheKey.ACTIVE_THEME_NAME) as ThemeName | null
+}
+export function setActiveThemeName(themeName: ThemeName) {
+ localStorage.setItem(CacheKey.ACTIVE_THEME_NAME, themeName)
+}
+// #endregion
+
+// #region 标签栏
+export function getVisitedViews() {
+ const json = localStorage.getItem(CacheKey.VISITED_VIEWS)
+ return JSON.parse(json ?? "[]") as TagView[]
+}
+export function setVisitedViews(views: TagView[]) {
+ views.forEach((view) => {
+ // 删除不必要的属性,防止 JSON.stringify 处理到循环引用
+ delete view.matched
+ delete view.redirectedFrom
+ })
+ localStorage.setItem(CacheKey.VISITED_VIEWS, JSON.stringify(views))
+}
+export function getCachedViews() {
+ const json = localStorage.getItem(CacheKey.CACHED_VIEWS)
+ return JSON.parse(json ?? "[]") as string[]
+}
+export function setCachedViews(views: string[]) {
+ localStorage.setItem(CacheKey.CACHED_VIEWS, JSON.stringify(views))
+}
+// #endregion
diff --git a/management/web/src/common/utils/css.ts b/management/web/src/common/utils/css.ts
new file mode 100644
index 0000000..b5b3c64
--- /dev/null
+++ b/management/web/src/common/utils/css.ts
@@ -0,0 +1,18 @@
+/** 获取指定元素(默认全局)上的 CSS 变量的值 */
+export function getCssVar(varName: string, element: HTMLElement = document.documentElement) {
+ if (!varName?.startsWith("--")) {
+ console.error("CSS 变量名应以 '--' 开头")
+ return ""
+ }
+ // 没有拿到值时,会返回空串
+ return getComputedStyle(element).getPropertyValue(varName)
+}
+
+/** 设置指定元素(默认全局)上的 CSS 变量的值 */
+export function setCssVar(varName: string, value: string, element: HTMLElement = document.documentElement) {
+ if (!varName?.startsWith("--")) {
+ console.error("CSS 变量名应以 '--' 开头")
+ return
+ }
+ element.style.setProperty(varName, value)
+}
diff --git a/management/web/src/common/utils/datetime.ts b/management/web/src/common/utils/datetime.ts
new file mode 100644
index 0000000..5c71f9b
--- /dev/null
+++ b/management/web/src/common/utils/datetime.ts
@@ -0,0 +1,9 @@
+import dayjs from "dayjs"
+
+const INVALID_DATE = "N/A"
+
+/** 格式化日期时间 */
+export function formatDateTime(datetime: string | number | Date = "", template: string = "YYYY-MM-DD HH:mm:ss") {
+ const day = dayjs(datetime)
+ return day.isValid() ? day.format(template) : INVALID_DATE
+}
diff --git a/management/web/src/common/utils/permission.ts b/management/web/src/common/utils/permission.ts
new file mode 100644
index 0000000..be2c4dc
--- /dev/null
+++ b/management/web/src/common/utils/permission.ts
@@ -0,0 +1,13 @@
+import { useUserStore } from "@/pinia/stores/user"
+import { isArray } from "@@/utils/validate"
+
+/** 全局权限判断函数,和权限指令 v-permission 功能类似 */
+export function checkPermission(permissionRoles: string[]): boolean {
+ if (isArray(permissionRoles) && permissionRoles.length > 0) {
+ const { roles } = useUserStore()
+ return roles.some(role => permissionRoles.includes(role))
+ } else {
+ console.error("参数必须是一个数组且长度大于 0,参考:checkPermission(['admin', 'editor'])")
+ return false
+ }
+}
diff --git a/management/web/src/common/utils/validate.ts b/management/web/src/common/utils/validate.ts
new file mode 100644
index 0000000..47c7f5f
--- /dev/null
+++ b/management/web/src/common/utils/validate.ts
@@ -0,0 +1,15 @@
+/** 判断是否为数组 */
+export function isArray(arg: T) {
+ return Array.isArray ? Array.isArray(arg) : Object.prototype.toString.call(arg) === "[object Array]"
+}
+
+/** 判断是否为字符串 */
+export function isString(str: unknown) {
+ return typeof str === "string" || str instanceof String
+}
+
+/** 判断是否为外链 */
+export function isExternal(path: string) {
+ const reg = /^(https?:|mailto:|tel:)/
+ return reg.test(path)
+}
diff --git a/management/web/src/http/axios.ts b/management/web/src/http/axios.ts
new file mode 100644
index 0000000..a186324
--- /dev/null
+++ b/management/web/src/http/axios.ts
@@ -0,0 +1,131 @@
+import type { AxiosInstance, AxiosRequestConfig } from "axios"
+import { useUserStore } from "@/pinia/stores/user"
+import { getToken } from "@@/utils/cache/cookies"
+import axios from "axios"
+import { get, merge } from "lodash-es"
+
+/** 退出登录并强制刷新页面(会重定向到登录页) */
+function logout() {
+ useUserStore().logout()
+ location.reload()
+}
+
+/** 创建请求实例 */
+function createInstance() {
+ // 创建一个 axios 实例命名为 instance
+ const instance = axios.create()
+ // 请求拦截器
+ instance.interceptors.request.use(
+ // 发送之前
+ config => config,
+ // 发送失败
+ error => Promise.reject(error)
+ )
+ // 响应拦截器(可根据具体业务作出相应的调整)
+ instance.interceptors.response.use(
+ (response) => {
+ // apiData 是 api 返回的数据
+ const apiData = response.data
+ // 二进制数据则直接返回
+ const responseType = response.request?.responseType
+ if (responseType === "blob" || responseType === "arraybuffer") return apiData
+ // 这个 code 是和后端约定的业务 code
+ const code = apiData.code
+ // 如果没有 code, 代表这不是项目后端开发的 api
+ if (code === undefined) {
+ ElMessage.error("非本系统的接口")
+ return Promise.reject(new Error("非本系统的接口"))
+ }
+ switch (code) {
+ case 0:
+ // 本系统采用 code === 0 来表示没有业务错误
+ return apiData
+ case 401:
+ // Token 过期时
+ return logout()
+ default:
+ // 不是正确的 code
+ ElMessage.error(apiData.message || "Error")
+ return Promise.reject(new Error("Error"))
+ }
+ },
+ (error) => {
+ // status 是 HTTP 状态码
+ const status = get(error, "response.status")
+ const message = get(error, "response.data.message")
+ switch (status) {
+ case 400:
+ error.message = "请求错误"
+ break
+ case 401:
+ // Token 过期时
+ error.message = message || "未授权"
+ logout()
+ break
+ case 403:
+ error.message = message || "拒绝访问"
+ break
+ case 404:
+ error.message = "请求地址出错"
+ break
+ case 408:
+ error.message = "请求超时"
+ break
+ case 500:
+ error.message = "服务器内部错误"
+ break
+ case 501:
+ error.message = "服务未实现"
+ break
+ case 502:
+ error.message = "网关错误"
+ break
+ case 503:
+ error.message = "服务不可用"
+ break
+ case 504:
+ error.message = "网关超时"
+ break
+ case 505:
+ error.message = "HTTP 版本不受支持"
+ break
+ }
+ ElMessage.error(error.message)
+ return Promise.reject(error)
+ }
+ )
+ return instance
+}
+
+/** 创建请求方法 */
+function createRequest(instance: AxiosInstance) {
+ return (config: AxiosRequestConfig): Promise => {
+ const token = getToken()
+ // 默认配置
+ const defaultConfig: AxiosRequestConfig = {
+ // 接口地址
+ baseURL: import.meta.env.VITE_BASE_URL,
+ // 请求头
+ headers: {
+ // 携带 Token
+ "Authorization": token ? `Bearer ${token}` : undefined,
+ "Content-Type": "application/json"
+ },
+ // 请求体
+ data: {},
+ // 请求超时
+ timeout: 5000,
+ // 跨域请求时是否携带 Cookies
+ withCredentials: false
+ }
+ // 将默认配置 defaultConfig 和传入的自定义配置 config 进行合并成为 mergeConfig
+ const mergeConfig = merge(defaultConfig, config)
+ return instance(mergeConfig)
+ }
+}
+
+/** 用于请求的实例 */
+const instance = createInstance()
+
+/** 用于请求的方法 */
+export const request = createRequest(instance)
diff --git a/management/web/src/layouts/components/AppMain/index.vue b/management/web/src/layouts/components/AppMain/index.vue
new file mode 100644
index 0000000..133aedf
--- /dev/null
+++ b/management/web/src/layouts/components/AppMain/index.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Breadcrumb/index.vue b/management/web/src/layouts/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..56863f1
--- /dev/null
+++ b/management/web/src/layouts/components/Breadcrumb/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+ {{ item.meta.title }}
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Footer/index.vue b/management/web/src/layouts/components/Footer/index.vue
new file mode 100644
index 0000000..fe54173
--- /dev/null
+++ b/management/web/src/layouts/components/Footer/index.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Hamburger/index.vue b/management/web/src/layouts/components/Hamburger/index.vue
new file mode 100644
index 0000000..d7d5ba7
--- /dev/null
+++ b/management/web/src/layouts/components/Hamburger/index.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Logo/index.vue b/management/web/src/layouts/components/Logo/index.vue
new file mode 100644
index 0000000..86f3af4
--- /dev/null
+++ b/management/web/src/layouts/components/Logo/index.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/NavigationBar/index.vue b/management/web/src/layouts/components/NavigationBar/index.vue
new file mode 100644
index 0000000..608865d
--- /dev/null
+++ b/management/web/src/layouts/components/NavigationBar/index.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/RightPanel/index.vue b/management/web/src/layouts/components/RightPanel/index.vue
new file mode 100644
index 0000000..90accec
--- /dev/null
+++ b/management/web/src/layouts/components/RightPanel/index.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Settings/SelectLayoutMode.vue b/management/web/src/layouts/components/Settings/SelectLayoutMode.vue
new file mode 100644
index 0000000..37322fb
--- /dev/null
+++ b/management/web/src/layouts/components/Settings/SelectLayoutMode.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Settings/index.vue b/management/web/src/layouts/components/Settings/index.vue
new file mode 100644
index 0000000..4ba4bc6
--- /dev/null
+++ b/management/web/src/layouts/components/Settings/index.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
布局配置
+
+
+
功能配置
+
+ {{ settingName }}
+
+
+
+ 重 置
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Sidebar/Item.vue b/management/web/src/layouts/components/Sidebar/Item.vue
new file mode 100644
index 0000000..a5b22be
--- /dev/null
+++ b/management/web/src/layouts/components/Sidebar/Item.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+ {{ theOnlyOneChild.meta.title }}
+
+
+
+
+
+
+
+
+ {{ props.item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Sidebar/Link.vue b/management/web/src/layouts/components/Sidebar/Link.vue
new file mode 100644
index 0000000..f9907dc
--- /dev/null
+++ b/management/web/src/layouts/components/Sidebar/Link.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/Sidebar/index.vue b/management/web/src/layouts/components/Sidebar/index.vue
new file mode 100644
index 0000000..3f864f0
--- /dev/null
+++ b/management/web/src/layouts/components/Sidebar/index.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/TagsView/ScrollPane.vue b/management/web/src/layouts/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..c9e8d55
--- /dev/null
+++ b/management/web/src/layouts/components/TagsView/ScrollPane.vue
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/TagsView/index.vue b/management/web/src/layouts/components/TagsView/index.vue
new file mode 100644
index 0000000..899bda7
--- /dev/null
+++ b/management/web/src/layouts/components/TagsView/index.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+ {{ tag.meta?.title }}
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/components/index.ts b/management/web/src/layouts/components/index.ts
new file mode 100644
index 0000000..7669934
--- /dev/null
+++ b/management/web/src/layouts/components/index.ts
@@ -0,0 +1,10 @@
+export { default as AppMain } from "./AppMain/index.vue"
+export { default as Breadcrumb } from "./Breadcrumb/index.vue"
+export { default as Footer } from "./Footer/index.vue"
+export { default as Hamburger } from "./Hamburger/index.vue"
+export { default as Logo } from "./Logo/index.vue"
+export { default as NavigationBar } from "./NavigationBar/index.vue"
+export { default as RightPanel } from "./RightPanel/index.vue"
+export { default as Settings } from "./Settings/index.vue"
+export { default as Sidebar } from "./Sidebar/index.vue"
+export { default as TagsView } from "./TagsView/index.vue"
diff --git a/management/web/src/layouts/composables/useResize.ts b/management/web/src/layouts/composables/useResize.ts
new file mode 100644
index 0000000..d012ee3
--- /dev/null
+++ b/management/web/src/layouts/composables/useResize.ts
@@ -0,0 +1,55 @@
+import { useAppStore } from "@/pinia/stores/app"
+import { useRouteListener } from "@@/composables/useRouteListener"
+import { DeviceEnum } from "@@/constants/app-key"
+
+/** 参考 Bootstrap 的响应式设计将最大移动端宽度设置为 992 */
+const MAX_MOBILE_WIDTH = 992
+
+/**
+ * @name 浏览器宽度变化 Composable
+ * @description 根据浏览器宽度变化,变换 Layout 布局
+ */
+export function useResize() {
+ const appStore = useAppStore()
+ const { listenerRouteChange } = useRouteListener()
+
+ // 用于判断当前设备是否为移动端
+ const isMobile = () => {
+ const rect = document.body.getBoundingClientRect()
+ return rect.width - 1 < MAX_MOBILE_WIDTH
+ }
+
+ // 用于处理窗口大小变化事件
+ const resizeHandler = () => {
+ if (!document.hidden) {
+ const _isMobile = isMobile()
+ appStore.toggleDevice(_isMobile ? DeviceEnum.Mobile : DeviceEnum.Desktop)
+ _isMobile && appStore.closeSidebar(true)
+ }
+ }
+
+ // 监听路由变化,根据设备类型调整布局
+ listenerRouteChange(() => {
+ if (appStore.device === DeviceEnum.Mobile && appStore.sidebar.opened) {
+ appStore.closeSidebar(false)
+ }
+ })
+
+ // 在组件挂载前添加窗口大小变化事件监听器
+ onBeforeMount(() => {
+ window.addEventListener("resize", resizeHandler)
+ })
+
+ // 在组件挂载后根据窗口大小判断设备类型并调整布局
+ onMounted(() => {
+ if (isMobile()) {
+ appStore.toggleDevice(DeviceEnum.Mobile)
+ appStore.closeSidebar(true)
+ }
+ })
+
+ // 在组件卸载前移除窗口大小变化事件监听器
+ onBeforeUnmount(() => {
+ window.removeEventListener("resize", resizeHandler)
+ })
+}
diff --git a/management/web/src/layouts/config.ts b/management/web/src/layouts/config.ts
new file mode 100644
index 0000000..3ab74bc
--- /dev/null
+++ b/management/web/src/layouts/config.ts
@@ -0,0 +1,55 @@
+import { LayoutModeEnum } from "@@/constants/app-key"
+import { getLayoutsConfig } from "@@/utils/cache/local-storage"
+
+/** 项目配置类型 */
+export interface LayoutsConfig {
+ /** 是否显示设置按钮和面板 */
+ showSettings: boolean
+ /** 布局模式 */
+ layoutMode: LayoutModeEnum
+ /** 是否显示标签栏 */
+ showTagsView: boolean
+ /** 是否显示 Logo */
+ showLogo: boolean
+ /** 是否固定 Header */
+ fixedHeader: boolean
+ /** 是否显示页脚 */
+ showFooter: boolean
+ /** 是否显示消息通知 */
+ showNotify: boolean
+ /** 是否显示切换主题按钮 */
+ showThemeSwitch: boolean
+ /** 是否显示全屏按钮 */
+ showScreenfull: boolean
+ /** 是否显示搜索按钮 */
+ showSearchMenu: boolean
+ /** 是否缓存标签栏 */
+ cacheTagsView: boolean
+ /** 开启系统水印 */
+ showWatermark: boolean
+ /** 是否显示灰色模式 */
+ showGreyMode: boolean
+ /** 是否显示色弱模式 */
+ showColorWeakness: boolean
+}
+
+/** 默认配置 */
+const DEFAULT_CONFIG: LayoutsConfig = {
+ layoutMode: LayoutModeEnum.LeftTop,
+ showSettings: true,
+ showTagsView: true,
+ fixedHeader: true,
+ showFooter: true,
+ showLogo: true,
+ showNotify: false,
+ showThemeSwitch: true,
+ showScreenfull: true,
+ showSearchMenu: true,
+ cacheTagsView: false,
+ showWatermark: false,
+ showGreyMode: false,
+ showColorWeakness: false
+}
+
+/** 项目配置 */
+export const layoutsConfig: LayoutsConfig = { ...DEFAULT_CONFIG, ...getLayoutsConfig() }
diff --git a/management/web/src/layouts/index.vue b/management/web/src/layouts/index.vue
new file mode 100644
index 0000000..78eae93
--- /dev/null
+++ b/management/web/src/layouts/index.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/modes/LeftMode.vue b/management/web/src/layouts/modes/LeftMode.vue
new file mode 100644
index 0000000..607000d
--- /dev/null
+++ b/management/web/src/layouts/modes/LeftMode.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/modes/LeftTopMode.vue b/management/web/src/layouts/modes/LeftTopMode.vue
new file mode 100644
index 0000000..2e8cf69
--- /dev/null
+++ b/management/web/src/layouts/modes/LeftTopMode.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/layouts/modes/TopMode.vue b/management/web/src/layouts/modes/TopMode.vue
new file mode 100644
index 0000000..4d5bfe5
--- /dev/null
+++ b/management/web/src/layouts/modes/TopMode.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/main.ts b/management/web/src/main.ts
new file mode 100644
index 0000000..98a1276
--- /dev/null
+++ b/management/web/src/main.ts
@@ -0,0 +1,28 @@
+/* eslint-disable perfectionist/sort-imports */
+
+// core
+import { pinia } from "@/pinia"
+import { router } from "@/router"
+import { installPlugins } from "@/plugins"
+import App from "@/App.vue"
+// css
+import "normalize.css"
+import "nprogress/nprogress.css"
+import "element-plus/theme-chalk/dark/css-vars.css"
+import "vxe-table/lib/style.css"
+import "@@/assets/styles/index.scss"
+import "virtual:uno.css"
+
+// 创建应用实例
+const app = createApp(App)
+
+// 安装插件(全局组件、自定义指令等)
+installPlugins(app)
+
+// 安装 pinia 和 router
+app.use(pinia).use(router)
+
+// router 准备就绪后挂载应用
+router.isReady().then(() => {
+ app.mount("#app")
+})
diff --git a/management/web/src/pages/dashboard/components/Admin.vue b/management/web/src/pages/dashboard/components/Admin.vue
new file mode 100644
index 0000000..f204fed
--- /dev/null
+++ b/management/web/src/pages/dashboard/components/Admin.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/dashboard/components/Editor.vue b/management/web/src/pages/dashboard/components/Editor.vue
new file mode 100644
index 0000000..1aaf09b
--- /dev/null
+++ b/management/web/src/pages/dashboard/components/Editor.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/dashboard/images/dashboard.svg b/management/web/src/pages/dashboard/images/dashboard.svg
new file mode 100644
index 0000000..434d465
--- /dev/null
+++ b/management/web/src/pages/dashboard/images/dashboard.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/pages/dashboard/index.vue b/management/web/src/pages/dashboard/index.vue
new file mode 100644
index 0000000..904f5d8
--- /dev/null
+++ b/management/web/src/pages/dashboard/index.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/management/web/src/pages/demo/composable-demo/apis/use-fetch-select.ts b/management/web/src/pages/demo/composable-demo/apis/use-fetch-select.ts
new file mode 100644
index 0000000..3dc6f2d
--- /dev/null
+++ b/management/web/src/pages/demo/composable-demo/apis/use-fetch-select.ts
@@ -0,0 +1,39 @@
+/** 模拟接口响应数据 */
+const SELECT_RESPONSE_DATA = {
+ code: 0,
+ data: [
+ {
+ label: "苹果",
+ value: 1
+ },
+ {
+ label: "香蕉",
+ value: 2
+ },
+ {
+ label: "橘子",
+ value: 3,
+ disabled: true
+ }
+ ],
+ message: "获取 Select 数据成功"
+}
+
+const ERROR_MESSAGE = "接口发生错误"
+
+/** 模拟接口 */
+export function getSelectDataApi() {
+ return new Promise((resolve, reject) => {
+ // 模拟接口响应时间 2s
+ setTimeout(() => {
+ if (Math.random() < 0.8) {
+ // 模拟接口调用成功
+ resolve(SELECT_RESPONSE_DATA)
+ } else {
+ // 模拟接口调用出错
+ reject(new Error(ERROR_MESSAGE))
+ ElMessage.error(ERROR_MESSAGE)
+ }
+ }, 2000)
+ })
+}
diff --git a/management/web/src/pages/demo/composable-demo/apis/use-fullscreen-loading.ts b/management/web/src/pages/demo/composable-demo/apis/use-fullscreen-loading.ts
new file mode 100644
index 0000000..756cd7e
--- /dev/null
+++ b/management/web/src/pages/demo/composable-demo/apis/use-fullscreen-loading.ts
@@ -0,0 +1,26 @@
+/** 模拟接口响应数据 */
+const SUCCESS_RESPONSE_DATA = {
+ code: 0,
+ data: {
+ list: [] as number[]
+ },
+ message: "获取成功"
+}
+
+/** 模拟请求接口成功 */
+export function getSuccessApi(list: number[]) {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve({ ...SUCCESS_RESPONSE_DATA, data: { list } })
+ }, 1000)
+ })
+}
+
+/** 模拟请求接口失败 */
+export function getErrorApi() {
+ return new Promise((_resolve, reject) => {
+ setTimeout(() => {
+ reject(new Error("发生错误"))
+ }, 1000)
+ })
+}
diff --git a/management/web/src/pages/demo/composable-demo/use-fetch-select.vue b/management/web/src/pages/demo/composable-demo/use-fetch-select.vue
new file mode 100644
index 0000000..6fa5f95
--- /dev/null
+++ b/management/web/src/pages/demo/composable-demo/use-fetch-select.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+ 该示例是演示:通过 composable 自动调用 api 后拿到 Select 组件需要的数据并传递给 Select 组件
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/composable-demo/use-fullscreen-loading.vue b/management/web/src/pages/demo/composable-demo/use-fullscreen-loading.vue
new file mode 100644
index 0000000..c04225b
--- /dev/null
+++ b/management/web/src/pages/demo/composable-demo/use-fullscreen-loading.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+ 该示例是演示:通过将要执行的函数传递给 composable,让 composable 自动开启全屏 loading,函数执行结束后自动关闭 loading
+
+
+
+ 查询成功
+
+
+ 查询失败
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/composable-demo/use-watermark.vue b/management/web/src/pages/demo/composable-demo/use-watermark.vue
new file mode 100644
index 0000000..5438772
--- /dev/null
+++ b/management/web/src/pages/demo/composable-demo/use-watermark.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+ 该示例是演示:通过调用 composable 开启或关闭水印,
+ 支持局部、全局、自定义样式(颜色、透明度、字体大小、字体、倾斜角度等),并自带防御(防删、防隐藏)和自适应功能
+
+
+
+
+
+
+ 创建局部水印
+
+
+ 创建无防御局部水印
+
+
+ 清除局部水印
+
+
+
+
+ 创建全局水印
+
+
+ 创建无防御全局水印
+
+
+ 清除全局水印
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/element-plus/index.vue b/management/web/src/pages/demo/element-plus/index.vue
new file mode 100644
index 0000000..233c994
--- /dev/null
+++ b/management/web/src/pages/demo/element-plus/index.vue
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+
+ 确认
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/level2/index.vue b/management/web/src/pages/demo/level2/index.vue
new file mode 100644
index 0000000..3018f18
--- /dev/null
+++ b/management/web/src/pages/demo/level2/index.vue
@@ -0,0 +1,30 @@
+
+
+
+
+ 三级及其以上路由缓存功能默认关闭,需要请前往此配置文件中打开:
+
+
+ src/router/config.ts
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/level2/level3/index.vue b/management/web/src/pages/demo/level2/level3/index.vue
new file mode 100644
index 0000000..a1ad378
--- /dev/null
+++ b/management/web/src/pages/demo/level2/level3/index.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/permission/button-level.vue b/management/web/src/pages/demo/permission/button-level.vue
new file mode 100644
index 0000000..34c2b31
--- /dev/null
+++ b/management/web/src/pages/demo/permission/button-level.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+ admin
+
+
+ admin 和 editor
+
+
+
+
+ Element Plus 的 el-tab-pane 和 el-table-column 以及其它动态渲染 DOM 的场景不适合使用 v-permission
+ 这种情况下你可以通过 v-if + checkPermission 来实现
+
+
+
+
+ v-if="checkPermission(['admin'])"
+
+
+
+
+ v-if="checkPermission(['admin', 'editor'])"
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/permission/components/SwitchRoles.vue b/management/web/src/pages/demo/permission/components/SwitchRoles.vue
new file mode 100644
index 0000000..a1ce0a2
--- /dev/null
+++ b/management/web/src/pages/demo/permission/components/SwitchRoles.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+ 你的角色:
+
+ {{ role }}
+
+
+
+ 切换用户:
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/permission/page-level.vue b/management/web/src/pages/demo/permission/page-level.vue
new file mode 100644
index 0000000..4474602
--- /dev/null
+++ b/management/web/src/pages/demo/permission/page-level.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+ 当前页面只有「Admin」角色可见,切换角色后将不能进入该页面
+
+
+
+
+
diff --git a/management/web/src/pages/demo/unocss/index.vue b/management/web/src/pages/demo/unocss/index.vue
new file mode 100644
index 0000000..64b69bf
--- /dev/null
+++ b/management/web/src/pages/demo/unocss/index.vue
@@ -0,0 +1,17 @@
+
+
+
+
+ UnoCSS
+
+
+ 该页面是一个 UnoCSS 的使用案例,其他页面依旧采用 Scss
+
+
+
+
+
diff --git a/management/web/src/pages/demo/vxe-table/index.vue b/management/web/src/pages/demo/vxe-table/index.vue
new file mode 100644
index 0000000..b05b5de
--- /dev/null
+++ b/management/web/src/pages/demo/vxe-table/index.vue
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+ 新增用户
+
+
+ 批量删除
+
+
+
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/demo/vxe-table/tsx/RoleColumnSlots.tsx b/management/web/src/pages/demo/vxe-table/tsx/RoleColumnSlots.tsx
new file mode 100644
index 0000000..d8f075d
--- /dev/null
+++ b/management/web/src/pages/demo/vxe-table/tsx/RoleColumnSlots.tsx
@@ -0,0 +1,9 @@
+import type { VxeColumnPropTypes } from "vxe-table/types/column"
+
+export const RoleColumnSlots: VxeColumnPropTypes.Slots = {
+ default: ({ row, column }) => {
+ const cellValue = row[column.field]
+ const type = cellValue === "admin" ? "primary" : "warning"
+ return [{cellValue}]
+ }
+}
diff --git a/management/web/src/pages/demo/vxe-table/tsx/StatusColumnSlots.tsx b/management/web/src/pages/demo/vxe-table/tsx/StatusColumnSlots.tsx
new file mode 100644
index 0000000..94e532a
--- /dev/null
+++ b/management/web/src/pages/demo/vxe-table/tsx/StatusColumnSlots.tsx
@@ -0,0 +1,9 @@
+import type { VxeColumnPropTypes } from "vxe-table/types/column"
+
+export const StatusColumnSlots: VxeColumnPropTypes.Slots = {
+ default: ({ row, column }) => {
+ const cellValue = row[column.field]
+ const [type, value] = cellValue ? ["success", "启用"] : ["danger", "禁用"]
+ return [{value}]
+ }
+}
diff --git a/management/web/src/pages/error/403.vue b/management/web/src/pages/error/403.vue
new file mode 100644
index 0000000..db16d5b
--- /dev/null
+++ b/management/web/src/pages/error/403.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/error/404.vue b/management/web/src/pages/error/404.vue
new file mode 100644
index 0000000..982b6f1
--- /dev/null
+++ b/management/web/src/pages/error/404.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/error/components/Layout.vue b/management/web/src/pages/error/components/Layout.vue
new file mode 100644
index 0000000..7039d31
--- /dev/null
+++ b/management/web/src/pages/error/components/Layout.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/management/web/src/pages/error/images/403.svg b/management/web/src/pages/error/images/403.svg
new file mode 100644
index 0000000..254dd53
--- /dev/null
+++ b/management/web/src/pages/error/images/403.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/pages/error/images/404.svg b/management/web/src/pages/error/images/404.svg
new file mode 100644
index 0000000..7813181
--- /dev/null
+++ b/management/web/src/pages/error/images/404.svg
@@ -0,0 +1 @@
+
diff --git a/management/web/src/pages/login/apis/index.ts b/management/web/src/pages/login/apis/index.ts
new file mode 100644
index 0000000..0ab2de9
--- /dev/null
+++ b/management/web/src/pages/login/apis/index.ts
@@ -0,0 +1,19 @@
+import type * as Auth from "./type"
+import { request } from "@/http/axios"
+
+/** 获取登录验证码 */
+// export function getCaptchaApi() {
+// return request({
+// url: "v1/auth/captcha",
+// method: "get"
+// })
+// }
+
+/** 登录并返回 Token */
+export function loginApi(data: Auth.LoginRequestData) {
+ return request({
+ url: "/api/v1/auth/login",
+ method: "post",
+ data
+ })
+}
diff --git a/management/web/src/pages/login/apis/type.ts b/management/web/src/pages/login/apis/type.ts
new file mode 100644
index 0000000..1685d69
--- /dev/null
+++ b/management/web/src/pages/login/apis/type.ts
@@ -0,0 +1,10 @@
+export interface LoginRequestData {
+ /** admin 或 editor */
+ username: "admin" | "editor"
+ /** 密码 */
+ password: string
+}
+
+export type CaptchaResponseData = ApiResponseData
+
+export type LoginResponseData = ApiResponseData<{ token: string }>
diff --git a/management/web/src/pages/login/components/Owl.vue b/management/web/src/pages/login/components/Owl.vue
new file mode 100644
index 0000000..ca3cf65
--- /dev/null
+++ b/management/web/src/pages/login/components/Owl.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/login/composables/useFocus.ts b/management/web/src/pages/login/composables/useFocus.ts
new file mode 100644
index 0000000..9167564
--- /dev/null
+++ b/management/web/src/pages/login/composables/useFocus.ts
@@ -0,0 +1,17 @@
+/** 焦点 Composable */
+export function useFocus() {
+ // 是否有焦点
+ const isFocus = ref(false)
+
+ // 失去焦点
+ const handleBlur = () => {
+ isFocus.value = false
+ }
+
+ // 获取焦点
+ const handleFocus = () => {
+ isFocus.value = true
+ }
+
+ return { isFocus, handleBlur, handleFocus }
+}
diff --git a/management/web/src/pages/login/images/close-eyes.png b/management/web/src/pages/login/images/close-eyes.png
new file mode 100644
index 0000000..14e483a
Binary files /dev/null and b/management/web/src/pages/login/images/close-eyes.png differ
diff --git a/management/web/src/pages/login/images/face.png b/management/web/src/pages/login/images/face.png
new file mode 100644
index 0000000..a00cb68
Binary files /dev/null and b/management/web/src/pages/login/images/face.png differ
diff --git a/management/web/src/pages/login/images/hand-down-left.png b/management/web/src/pages/login/images/hand-down-left.png
new file mode 100644
index 0000000..aefef6c
Binary files /dev/null and b/management/web/src/pages/login/images/hand-down-left.png differ
diff --git a/management/web/src/pages/login/images/hand-down-right.png b/management/web/src/pages/login/images/hand-down-right.png
new file mode 100644
index 0000000..a2602a6
Binary files /dev/null and b/management/web/src/pages/login/images/hand-down-right.png differ
diff --git a/management/web/src/pages/login/images/hand-up-left.png b/management/web/src/pages/login/images/hand-up-left.png
new file mode 100644
index 0000000..0d971f8
Binary files /dev/null and b/management/web/src/pages/login/images/hand-up-left.png differ
diff --git a/management/web/src/pages/login/images/hand-up-right.png b/management/web/src/pages/login/images/hand-up-right.png
new file mode 100644
index 0000000..088fa16
Binary files /dev/null and b/management/web/src/pages/login/images/hand-up-right.png differ
diff --git a/management/web/src/pages/login/index.vue b/management/web/src/pages/login/index.vue
new file mode 100644
index 0000000..c73bbbf
--- /dev/null
+++ b/management/web/src/pages/login/index.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+ 登 录
+
+
+
+
+
+
+
+
diff --git a/management/web/src/pages/redirect/index.vue b/management/web/src/pages/redirect/index.vue
new file mode 100644
index 0000000..fa562a9
--- /dev/null
+++ b/management/web/src/pages/redirect/index.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/management/web/src/pinia/index.ts b/management/web/src/pinia/index.ts
new file mode 100644
index 0000000..8359d2b
--- /dev/null
+++ b/management/web/src/pinia/index.ts
@@ -0,0 +1 @@
+export const pinia = createPinia()
diff --git a/management/web/src/pinia/stores/app.ts b/management/web/src/pinia/stores/app.ts
new file mode 100644
index 0000000..ee4b445
--- /dev/null
+++ b/management/web/src/pinia/stores/app.ts
@@ -0,0 +1,59 @@
+import { pinia } from "@/pinia"
+import { DeviceEnum, SIDEBAR_CLOSED, SIDEBAR_OPENED } from "@@/constants/app-key"
+import { getSidebarStatus, setSidebarStatus } from "@@/utils/cache/local-storage"
+
+interface Sidebar {
+ opened: boolean
+ withoutAnimation: boolean
+}
+
+/** 设置侧边栏状态本地缓存 */
+function handleSidebarStatus(opened: boolean) {
+ opened ? setSidebarStatus(SIDEBAR_OPENED) : setSidebarStatus(SIDEBAR_CLOSED)
+}
+
+export const useAppStore = defineStore("app", () => {
+ // 侧边栏状态
+ const sidebar: Sidebar = reactive({
+ opened: getSidebarStatus() !== SIDEBAR_CLOSED,
+ withoutAnimation: false
+ })
+
+ // 设备类型
+ const device = ref(DeviceEnum.Desktop)
+
+ // 监听侧边栏 opened 状态
+ watch(
+ () => sidebar.opened,
+ (opened) => {
+ handleSidebarStatus(opened)
+ }
+ )
+
+ // 切换侧边栏
+ const toggleSidebar = (withoutAnimation: boolean) => {
+ sidebar.opened = !sidebar.opened
+ sidebar.withoutAnimation = withoutAnimation
+ }
+
+ // 关闭侧边栏
+ const closeSidebar = (withoutAnimation: boolean) => {
+ sidebar.opened = false
+ sidebar.withoutAnimation = withoutAnimation
+ }
+
+ // 切换设备类型
+ const toggleDevice = (value: DeviceEnum) => {
+ device.value = value
+ }
+
+ return { device, sidebar, toggleSidebar, closeSidebar, toggleDevice }
+})
+
+/**
+ * @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
+ * @description 在 SSR 应用中可用于在 setup 外使用 store
+ */
+export function useAppStoreOutside() {
+ return useAppStore(pinia)
+}
diff --git a/management/web/src/pinia/stores/permission.ts b/management/web/src/pinia/stores/permission.ts
new file mode 100644
index 0000000..c78eaac
--- /dev/null
+++ b/management/web/src/pinia/stores/permission.ts
@@ -0,0 +1,59 @@
+import type { RouteRecordRaw } from "vue-router"
+import { pinia } from "@/pinia"
+import { constantRoutes, dynamicRoutes } from "@/router"
+import { routerConfig } from "@/router/config"
+import { flatMultiLevelRoutes } from "@/router/helper"
+
+function hasPermission(roles: string[], route: RouteRecordRaw) {
+ const routeRoles = route.meta?.roles
+ return routeRoles ? roles.some(role => routeRoles.includes(role)) : true
+}
+
+function filterDynamicRoutes(routes: RouteRecordRaw[], roles: string[]) {
+ const res: RouteRecordRaw[] = []
+ routes.forEach((route) => {
+ const tempRoute = { ...route }
+ if (hasPermission(roles, tempRoute)) {
+ if (tempRoute.children) {
+ tempRoute.children = filterDynamicRoutes(tempRoute.children, roles)
+ }
+ res.push(tempRoute)
+ }
+ })
+ return res
+}
+
+export const usePermissionStore = defineStore("permission", () => {
+ // 可访问的路由
+ const routes = ref([])
+
+ // 有访问权限的动态路由
+ const addRoutes = ref([])
+
+ // 根据角色生成可访问的 Routes(可访问的路由 = 常驻路由 + 有访问权限的动态路由)
+ const setRoutes = (roles: string[]) => {
+ const accessedRoutes = filterDynamicRoutes(dynamicRoutes, roles)
+ set(accessedRoutes)
+ }
+
+ // 所有路由 = 所有常驻路由 + 所有动态路由
+ const setAllRoutes = () => {
+ set(dynamicRoutes)
+ }
+
+ // 统一设置
+ const set = (accessedRoutes: RouteRecordRaw[]) => {
+ routes.value = constantRoutes.concat(accessedRoutes)
+ addRoutes.value = routerConfig.thirdLevelRouteCache ? flatMultiLevelRoutes(accessedRoutes) : accessedRoutes
+ }
+
+ return { routes, addRoutes, setRoutes, setAllRoutes }
+})
+
+/**
+ * @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
+ * @description 在 SSR 应用中可用于在 setup 外使用 store
+ */
+export function usePermissionStoreOutside() {
+ return usePermissionStore(pinia)
+}
diff --git a/management/web/src/pinia/stores/settings.ts b/management/web/src/pinia/stores/settings.ts
new file mode 100644
index 0000000..a6a3425
--- /dev/null
+++ b/management/web/src/pinia/stores/settings.ts
@@ -0,0 +1,49 @@
+import type { LayoutsConfig } from "@/layouts/config"
+import type { Ref } from "vue"
+import { layoutsConfig } from "@/layouts/config"
+import { pinia } from "@/pinia"
+import { setLayoutsConfig } from "@@/utils/cache/local-storage"
+
+type SettingsStore = {
+ // 使用映射类型来遍历 LayoutsConfig 对象的键
+ [Key in keyof LayoutsConfig]: Ref
+}
+
+type SettingsStoreKey = keyof SettingsStore
+
+export const useSettingsStore = defineStore("settings", () => {
+ // 状态对象
+ const state = {} as SettingsStore
+ // 遍历 LayoutsConfig 对象的键值对
+ for (const [key, value] of Object.entries(layoutsConfig)) {
+ // 使用类型断言来指定 key 的类型,将 value 包装在 ref 函数中,创建一个响应式变量
+ const refValue = ref(value)
+ // @ts-expect-error ignore
+ state[key as SettingsStoreKey] = refValue
+ // 监听每个响应式变量
+ watch(refValue, () => {
+ // 缓存
+ const settings = getCacheData()
+ setLayoutsConfig(settings)
+ })
+ }
+ // 获取要缓存的数据:将 state 对象转化为 settings 对象
+ const getCacheData = () => {
+ const settings = {} as LayoutsConfig
+ for (const [key, value] of Object.entries(state)) {
+ // @ts-expect-error ignore
+ settings[key as SettingsStoreKey] = value.value
+ }
+ return settings
+ }
+
+ return state
+})
+
+/**
+ * @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
+ * @description 在 SSR 应用中可用于在 setup 外使用 store
+ */
+export function useSettingsStoreOutside() {
+ return useSettingsStore(pinia)
+}
diff --git a/management/web/src/pinia/stores/tags-view.ts b/management/web/src/pinia/stores/tags-view.ts
new file mode 100644
index 0000000..468e3ff
--- /dev/null
+++ b/management/web/src/pinia/stores/tags-view.ts
@@ -0,0 +1,108 @@
+import type { RouteLocationNormalizedGeneric } from "vue-router"
+import { pinia } from "@/pinia"
+import { getCachedViews, getVisitedViews, setCachedViews, setVisitedViews } from "@@/utils/cache/local-storage"
+import { useSettingsStore } from "./settings"
+
+export type TagView = Partial
+
+export const useTagsViewStore = defineStore("tags-view", () => {
+ const { cacheTagsView } = useSettingsStore()
+ const visitedViews = ref(cacheTagsView ? getVisitedViews() : [])
+ const cachedViews = ref(cacheTagsView ? getCachedViews() : [])
+
+ // 缓存标签栏数据
+ watchEffect(() => {
+ setVisitedViews(visitedViews.value)
+ setCachedViews(cachedViews.value)
+ })
+
+ // #region add
+ const addVisitedView = (view: TagView) => {
+ // 检查是否已经存在相同的 visitedView
+ const index = visitedViews.value.findIndex(v => v.path === view.path)
+ if (index !== -1) {
+ // 防止 query 参数丢失
+ visitedViews.value[index].fullPath !== view.fullPath && (visitedViews.value[index] = { ...view })
+ } else {
+ // 添加新的 visitedView
+ visitedViews.value.push({ ...view })
+ }
+ }
+
+ const addCachedView = (view: TagView) => {
+ if (typeof view.name !== "string") return
+ if (cachedViews.value.includes(view.name)) return
+ if (view.meta?.keepAlive) {
+ cachedViews.value.push(view.name)
+ }
+ }
+ // #endregion
+
+ // #region del
+ const delVisitedView = (view: TagView) => {
+ const index = visitedViews.value.findIndex(v => v.path === view.path)
+ if (index !== -1) {
+ visitedViews.value.splice(index, 1)
+ }
+ }
+
+ const delCachedView = (view: TagView) => {
+ if (typeof view.name !== "string") return
+ const index = cachedViews.value.indexOf(view.name)
+ if (index !== -1) {
+ cachedViews.value.splice(index, 1)
+ }
+ }
+ // #endregion
+
+ // #region delOthers
+ const delOthersVisitedViews = (view: TagView) => {
+ visitedViews.value = visitedViews.value.filter((v) => {
+ return v.meta?.affix || v.path === view.path
+ })
+ }
+
+ const delOthersCachedViews = (view: TagView) => {
+ if (typeof view.name !== "string") return
+ const index = cachedViews.value.indexOf(view.name)
+ if (index !== -1) {
+ cachedViews.value = cachedViews.value.slice(index, index + 1)
+ } else {
+ // 如果 index = -1, 没有缓存的 tags
+ cachedViews.value = []
+ }
+ }
+ // #endregion
+
+ // #region delAll
+ const delAllVisitedViews = () => {
+ // 保留固定的 tags
+ visitedViews.value = visitedViews.value.filter(tag => tag.meta?.affix)
+ }
+
+ const delAllCachedViews = () => {
+ cachedViews.value = []
+ }
+ // #endregion
+
+ return {
+ visitedViews,
+ cachedViews,
+ addVisitedView,
+ addCachedView,
+ delVisitedView,
+ delCachedView,
+ delOthersVisitedViews,
+ delOthersCachedViews,
+ delAllVisitedViews,
+ delAllCachedViews
+ }
+})
+
+/**
+ * @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
+ * @description 在 SSR 应用中可用于在 setup 外使用 store
+ */
+export function useTagsViewStoreOutside() {
+ return useTagsViewStore(pinia)
+}
diff --git a/management/web/src/pinia/stores/user.ts b/management/web/src/pinia/stores/user.ts
new file mode 100644
index 0000000..5169470
--- /dev/null
+++ b/management/web/src/pinia/stores/user.ts
@@ -0,0 +1,73 @@
+import { pinia } from "@/pinia"
+import { resetRouter } from "@/router"
+import { routerConfig } from "@/router/config"
+import { getCurrentUserApi } from "@@/apis/users"
+import { setToken as _setToken, getToken, removeToken } from "@@/utils/cache/cookies"
+import { useSettingsStore } from "./settings"
+import { useTagsViewStore } from "./tags-view"
+
+export const useUserStore = defineStore("user", () => {
+ const token = ref(getToken() || "")
+ const roles = ref([])
+ const username = ref("")
+ const avatar = ref("https://pic1.zhimg.com/v2-aaf12b68b54b8812e6b449e7368d30cf_l.jpg?source=32738c0c&needBackground=1")
+ const tagsViewStore = useTagsViewStore()
+ const settingsStore = useSettingsStore()
+
+ // 设置 Token
+ const setToken = (value: string) => {
+ _setToken(value)
+ token.value = value
+ }
+
+ // 获取用户详情
+ const getInfo = async () => {
+ const { data } = await getCurrentUserApi()
+ username.value = data.username
+ // 验证返回的 roles 是否为一个非空数组,否则塞入一个没有任何作用的默认角色,防止路由守卫逻辑进入无限循环
+ roles.value = data.roles?.length > 0 ? data.roles : routerConfig.defaultRoles
+ }
+
+ // 模拟角色变化
+ const changeRoles = (role: string) => {
+ const newToken = `token-${role}`
+ token.value = newToken
+ _setToken(newToken)
+ // 用刷新页面代替重新登录
+ location.reload()
+ }
+
+ // 登出
+ const logout = () => {
+ removeToken()
+ token.value = ""
+ roles.value = []
+ resetRouter()
+ resetTagsView()
+ }
+
+ // 重置 Token
+ const resetToken = () => {
+ removeToken()
+ token.value = ""
+ roles.value = []
+ }
+
+ // 重置 Visited Views 和 Cached Views
+ const resetTagsView = () => {
+ if (!settingsStore.cacheTagsView) {
+ tagsViewStore.delAllVisitedViews()
+ tagsViewStore.delAllCachedViews()
+ }
+ }
+
+ return { token, roles, username, avatar, setToken, getInfo, changeRoles, logout, resetToken }
+})
+
+/**
+ * @description 在 SPA 应用中可用于在 pinia 实例被激活前使用 store
+ * @description 在 SSR 应用中可用于在 setup 外使用 store
+ */
+export function useUserStoreOutside() {
+ return useUserStore(pinia)
+}
diff --git a/management/web/src/plugins/element-plus-icons.ts b/management/web/src/plugins/element-plus-icons.ts
new file mode 100644
index 0000000..5fb6456
--- /dev/null
+++ b/management/web/src/plugins/element-plus-icons.ts
@@ -0,0 +1,9 @@
+import type { App } from "vue"
+import * as ElementPlusIconsVue from "@element-plus/icons-vue"
+
+export function installElementPlusIcons(app: App) {
+ // 注册所有 Element Plus Icons
+ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+ app.component(key, component)
+ }
+}
diff --git a/management/web/src/plugins/index.ts b/management/web/src/plugins/index.ts
new file mode 100644
index 0000000..ac348f6
--- /dev/null
+++ b/management/web/src/plugins/index.ts
@@ -0,0 +1,12 @@
+import type { App } from "vue"
+import { installElementPlusIcons } from "./element-plus-icons"
+import { installPermissionDirective } from "./permission-directive"
+import { installSvgIcon } from "./svg-icon"
+import { installVxeTable } from "./vxe-table"
+
+export function installPlugins(app: App) {
+ installElementPlusIcons(app)
+ installPermissionDirective(app)
+ installSvgIcon(app)
+ installVxeTable(app)
+}
diff --git a/management/web/src/plugins/permission-directive.ts b/management/web/src/plugins/permission-directive.ts
new file mode 100644
index 0000000..6c5d696
--- /dev/null
+++ b/management/web/src/plugins/permission-directive.ts
@@ -0,0 +1,24 @@
+import type { App, Directive } from "vue"
+import { useUserStore } from "@/pinia/stores/user"
+import { isArray } from "@@/utils/validate"
+
+/**
+ * @name 权限指令
+ * @description 和权限判断函数 checkPermission 功能类似
+ */
+const permission: Directive = {
+ mounted(el, binding) {
+ const { value: permissionRoles } = binding
+ const { roles } = useUserStore()
+ if (isArray(permissionRoles) && permissionRoles.length > 0) {
+ const hasPermission = roles.some(role => permissionRoles.includes(role))
+ hasPermission || el.parentNode?.removeChild(el)
+ } else {
+ throw new Error(`参数必须是一个数组且长度大于 0,参考:v-permission="['admin', 'editor']"`)
+ }
+ }
+}
+
+export function installPermissionDirective(app: App) {
+ app.directive("permission", permission)
+}
diff --git a/management/web/src/plugins/svg-icon.ts b/management/web/src/plugins/svg-icon.ts
new file mode 100644
index 0000000..5ecd869
--- /dev/null
+++ b/management/web/src/plugins/svg-icon.ts
@@ -0,0 +1,7 @@
+import type { App } from "vue"
+import SvgIcon from "~virtual/svg-component"
+
+export function installSvgIcon(app: App) {
+ // 注册 SvgIcon 组件
+ app.component("SvgIcon", SvgIcon)
+}
diff --git a/management/web/src/plugins/vxe-table.ts b/management/web/src/plugins/vxe-table.ts
new file mode 100644
index 0000000..6a0685d
--- /dev/null
+++ b/management/web/src/plugins/vxe-table.ts
@@ -0,0 +1,61 @@
+import type { App } from "vue"
+import VXETable from "vxe-table" // https://vxetable.cn/#/start/install
+
+// 全局默认参数
+VXETable.setConfig({
+ // 全局尺寸
+ size: "medium",
+ // 全局 zIndex 起始值,如果项目的的 z-index 样式值过大时就需要跟随设置更大,避免被遮挡
+ zIndex: 9999,
+ // 版本号,对于某些带数据缓存的功能有用到,上升版本号可以用于重置数据
+ version: 0,
+ // 全局 loading 提示内容,如果为 null 则不显示文本
+ loadingText: null,
+ table: {
+ showHeader: true,
+ showOverflow: "tooltip",
+ showHeaderOverflow: "tooltip",
+ autoResize: true,
+ // stripe: false,
+ border: "inner",
+ // round: false,
+ emptyText: "暂无数据",
+ rowConfig: {
+ isHover: true,
+ isCurrent: true,
+ // 行数据的唯一主键字段名
+ keyField: "_VXE_ID"
+ },
+ columnConfig: {
+ resizable: false
+ },
+ align: "center",
+ headerAlign: "center"
+ },
+ pager: {
+ // size: "medium",
+ // 配套的样式
+ perfect: false,
+ pageSize: 10,
+ pagerCount: 7,
+ pageSizes: [10, 20, 50],
+ layouts: ["Total", "PrevJump", "PrevPage", "Number", "NextPage", "NextJump", "Sizes", "FullJump"]
+ },
+ modal: {
+ minWidth: 500,
+ minHeight: 400,
+ lockView: true,
+ mask: true,
+ // duration: 3000,
+ // marginSize: 20,
+ dblclickZoom: false,
+ showTitleOverflow: true,
+ transfer: true,
+ draggable: false
+ }
+})
+
+export function installVxeTable(app: App) {
+ // Vxe Table 组件完整引入
+ app.use(VXETable)
+}
diff --git a/management/web/src/router/config.ts b/management/web/src/router/config.ts
new file mode 100644
index 0000000..c87ee2f
--- /dev/null
+++ b/management/web/src/router/config.ts
@@ -0,0 +1,41 @@
+import type { RouterHistory } from "vue-router"
+import { createWebHashHistory, createWebHistory } from "vue-router"
+
+/** 路由配置 */
+interface RouterConfig {
+ /**
+ * @name 路由模式
+ * @description hash 模式和 html5 模式
+ */
+ history: RouterHistory
+ /**
+ * @name 是否开启动态路由功能
+ * @description 1. 开启后需要后端配合,在查询用户详情接口返回当前用户可以用来判断并加载动态路由的字段(该项目用的是角色 roles 字段)
+ * @description 2. 假如项目不需要根据不同的用户来显示不同的页面,则应该将 dynamic: false
+ */
+ dynamic: boolean
+ /**
+ * @name 默认角色
+ * @description 当动态路由功能关闭时:
+ * @description 1. 应该将所有路由都写到常驻路由里面(表明所有登录的用户能访问的页面都是一样的)
+ * @description 2. 系统自动给当前登录用户赋值一个没有任何作用的默认角色
+ */
+ defaultRoles: Array
+ /**
+ * @name 是否开启三级及其以上路由缓存功能
+ * @description 1. 开启后会进行路由降级(把三级及其以上的路由转化为二级路由)
+ * @description 2. 由于都会转成二级路由,所以二级及其以上路由有内嵌子路由将会失效
+ */
+ thirdLevelRouteCache: boolean
+}
+
+const VITE_ROUTER_HISTORY = import.meta.env.VITE_ROUTER_HISTORY
+
+const VITE_PUBLIC_PATH = import.meta.env.VITE_PUBLIC_PATH
+
+export const routerConfig: RouterConfig = {
+ history: VITE_ROUTER_HISTORY === "hash" ? createWebHashHistory(VITE_PUBLIC_PATH) : createWebHistory(VITE_PUBLIC_PATH),
+ dynamic: true,
+ defaultRoles: ["DEFAULT_ROLE"],
+ thirdLevelRouteCache: false
+}
diff --git a/management/web/src/router/guard.ts b/management/web/src/router/guard.ts
new file mode 100644
index 0000000..7d0bc56
--- /dev/null
+++ b/management/web/src/router/guard.ts
@@ -0,0 +1,59 @@
+import type { Router } from "vue-router"
+import { usePermissionStore } from "@/pinia/stores/permission"
+import { useUserStore } from "@/pinia/stores/user"
+import { routerConfig } from "@/router/config"
+import { isWhiteList } from "@/router/whitelist"
+import { setRouteChange } from "@@/composables/useRouteListener"
+import { useTitle } from "@@/composables/useTitle"
+import { getToken } from "@@/utils/cache/cookies"
+import NProgress from "nprogress"
+
+NProgress.configure({ showSpinner: false })
+
+const { setTitle } = useTitle()
+
+const LOGIN_PATH = "/login"
+
+export function registerNavigationGuard(router: Router) {
+ // 全局前置守卫
+ router.beforeEach(async (to, _from) => {
+ NProgress.start()
+ const userStore = useUserStore()
+ const permissionStore = usePermissionStore()
+ // 如果没有登录
+ if (!getToken()) {
+ // 如果在免登录的白名单中,则直接进入
+ if (isWhiteList(to)) return true
+ // 其他没有访问权限的页面将被重定向到登录页面
+ return LOGIN_PATH
+ }
+ // 如果已经登录,并准备进入 Login 页面,则重定向到主页
+ if (to.path === LOGIN_PATH) return "/"
+ // 如果用户已经获得其权限角色
+ if (userStore.roles.length !== 0) return true
+ // 否则要重新获取权限角色
+ try {
+ await userStore.getInfo()
+ // 注意:角色必须是一个数组! 例如: ["admin"] 或 ["developer", "editor"]
+ const roles = userStore.roles
+ // 生成可访问的 Routes
+ routerConfig.dynamic ? permissionStore.setRoutes(roles) : permissionStore.setAllRoutes()
+ // 将 "有访问权限的动态路由" 添加到 Router 中
+ permissionStore.addRoutes.forEach(route => router.addRoute(route))
+ // 设置 replace: true, 因此导航将不会留下历史记录
+ return { ...to, replace: true }
+ } catch (error) {
+ // 过程中发生任何错误,都直接重置 Token,并重定向到登录页面
+ userStore.resetToken()
+ ElMessage.error((error as Error).message || "路由守卫发生错误")
+ return LOGIN_PATH
+ }
+ })
+
+ // 全局后置钩子
+ router.afterEach((to) => {
+ setRouteChange(to)
+ setTitle(to.meta.title)
+ NProgress.done()
+ })
+}
diff --git a/management/web/src/router/helper.ts b/management/web/src/router/helper.ts
new file mode 100644
index 0000000..383fd36
--- /dev/null
+++ b/management/web/src/router/helper.ts
@@ -0,0 +1,56 @@
+import type { Router, RouteRecordNormalized, RouteRecordRaw } from "vue-router"
+import { cloneDeep, omit } from "lodash-es"
+import { createRouter } from "vue-router"
+import { routerConfig } from "./config"
+
+/** 路由降级(把三级及其以上的路由转化为二级路由) */
+export function flatMultiLevelRoutes(routes: RouteRecordRaw[]) {
+ const routesMirror = cloneDeep(routes)
+ routesMirror.forEach((route) => {
+ // 如果路由是三级及其以上路由,对其进行降级处理
+ isMultipleRoute(route) && promoteRouteLevel(route)
+ })
+ return routesMirror
+}
+
+/** 判断路由层级是否大于 2 */
+function isMultipleRoute(route: RouteRecordRaw) {
+ const children = route.children
+ // 只要有一个子路由的 children 长度大于 0,就说明是三级及其以上路由
+ if (children?.length) return children.some(child => child.children?.length)
+ return false
+}
+
+/** 生成二级路由 */
+function promoteRouteLevel(route: RouteRecordRaw) {
+ // 创建 router 实例是为了获取到当前传入的 route 的所有路由信息
+ let router: Router | null = createRouter({
+ history: routerConfig.history,
+ routes: [route]
+ })
+ const routes = router.getRoutes()
+ // 在 addToChildren 函数中使用上面获取到的路由信息来更新 route 的 children
+ addToChildren(routes, route.children || [], route)
+ router = null
+ // 转为二级路由后,去除所有子路由中的 children
+ route.children = route.children?.map(item => omit(item, "children") as RouteRecordRaw)
+}
+
+/** 将给定的子路由添加到指定的路由模块中 */
+function addToChildren(routes: RouteRecordNormalized[], children: RouteRecordRaw[], routeModule: RouteRecordRaw) {
+ children.forEach((child) => {
+ const route = routes.find(item => item.name === child.name)
+ if (route) {
+ // 初始化 routeModule 的 children
+ routeModule.children = routeModule.children || []
+ // 如果 routeModule 的 children 属性中不包含该路由,则将其添加进去
+ if (!routeModule.children.includes(route)) {
+ routeModule.children.push(route)
+ }
+ // 如果该子路由还有自己的子路由,则递归调用此函数将它们也添加进去
+ if (child.children?.length) {
+ addToChildren(routes, child.children, routeModule)
+ }
+ }
+ })
+}
diff --git a/management/web/src/router/index.ts b/management/web/src/router/index.ts
new file mode 100644
index 0000000..2fa71b3
--- /dev/null
+++ b/management/web/src/router/index.ts
@@ -0,0 +1,290 @@
+import type { RouteRecordRaw } from "vue-router"
+import { routerConfig } from "@/router/config"
+import { registerNavigationGuard } from "@/router/guard"
+import { createRouter } from "vue-router"
+import { flatMultiLevelRoutes } from "./helper"
+
+const Layouts = () => import("@/layouts/index.vue")
+
+/**
+ * @name 常驻路由
+ * @description 除了 redirect/403/404/login 等隐藏页面,其他页面建议设置唯一的 Name 属性
+ */
+export const constantRoutes: RouteRecordRaw[] = [
+ {
+ path: "/redirect",
+ component: Layouts,
+ meta: {
+ hidden: true
+ },
+ children: [
+ {
+ path: ":path(.*)",
+ component: () => import("@/pages/redirect/index.vue")
+ }
+ ]
+ },
+ {
+ path: "/403",
+ component: () => import("@/pages/error/403.vue"),
+ meta: {
+ hidden: true
+ }
+ },
+ {
+ path: "/404",
+ component: () => import("@/pages/error/404.vue"),
+ meta: {
+ hidden: true
+ },
+ alias: "/:pathMatch(.*)*"
+ },
+ {
+ path: "/login",
+ component: () => import("@/pages/login/index.vue"),
+ meta: {
+ hidden: true
+ }
+ },
+ // {
+ // path: "/",
+ // component: Layouts,
+ // redirect: "/dashboard",
+ // children: [
+ // {
+ // path: "dashboard",
+ // component: () => import("@/pages/dashboard/index.vue"),
+ // name: "Dashboard",
+ // meta: {
+ // title: "首页",
+ // svgIcon: "dashboard",
+ // affix: true
+ // }
+ // }
+ // ]
+ // },
+
+ // {
+ // path: "/",
+ // component: Layouts,
+ // redirect: "/dashboard",
+ // children: [
+ // {
+ // path: "dashboard",
+ // component: () => import("@/pages/dashboard/index.vue"),
+ // name: "Dashboard",
+ // meta: {
+ // title: "首页",
+ // svgIcon: "dashboard",
+ // affix: true
+ // }
+ // }
+ // ]
+ // },
+
+ {
+ path: "/",
+ component: Layouts,
+ redirect: "/dashboard",
+ children: [
+ {
+ path: "dashboard",
+ component: () => import("@/pages/demo/element-plus/index.vue"),
+ name: "ElementPlus",
+ meta: {
+ title: "用户管理",
+ svgIcon: "dashboard",
+ affix: true
+ }
+ }
+ ]
+ }
+ // {
+ // path: "/",
+ // component: () => import("@/pages/demo/element-plus/index.vue"),
+ // name: "ElementPlus",
+ // meta: {
+ // title: "Element Plus",
+ // keepAlive: true
+ // }
+ // }
+
+ // {
+ // path: "/demo",
+ // component: Layouts,
+ // redirect: "/demo/unocss",
+ // name: "Demo",
+ // meta: {
+ // title: "示例集合",
+ // elIcon: "DataBoard"
+ // },
+ // children: [
+ // {
+ // path: "unocss",
+ // component: () => import("@/pages/demo/unocss/index.vue"),
+ // name: "UnoCSS",
+ // meta: {
+ // title: "UnoCSS"
+ // }
+ // },
+
+ // {
+ // path: "vxe-table",
+ // component: () => import("@/pages/demo/vxe-table/index.vue"),
+ // name: "VxeTable",
+ // meta: {
+ // title: "Vxe Table",
+ // keepAlive: true
+ // }
+ // },
+ // {
+ // path: "level2",
+ // component: () => import("@/pages/demo/level2/index.vue"),
+ // redirect: "/demo/level2/level3",
+ // name: "Level2",
+ // meta: {
+ // title: "二级路由",
+ // alwaysShow: true
+ // },
+ // children: [
+ // {
+ // path: "level3",
+ // component: () => import("@/pages/demo/level2/level3/index.vue"),
+ // name: "Level3",
+ // meta: {
+ // title: "三级路由",
+ // keepAlive: true
+ // }
+ // }
+ // ]
+ // },
+ // {
+ // path: "composable-demo",
+ // redirect: "/demo/composable-demo/use-fetch-select",
+ // name: "ComposableDemo",
+ // meta: {
+ // title: "组合式函数"
+ // },
+ // children: [
+ // {
+ // path: "use-fetch-select",
+ // component: () => import("@/pages/demo/composable-demo/use-fetch-select.vue"),
+ // name: "UseFetchSelect",
+ // meta: {
+ // title: "useFetchSelect"
+ // }
+ // },
+ // {
+ // path: "use-fullscreen-loading",
+ // component: () => import("@/pages/demo/composable-demo/use-fullscreen-loading.vue"),
+ // name: "UseFullscreenLoading",
+ // meta: {
+ // title: "useFullscreenLoading"
+ // }
+ // },
+ // {
+ // path: "use-watermark",
+ // component: () => import("@/pages/demo/composable-demo/use-watermark.vue"),
+ // name: "UseWatermark",
+ // meta: {
+ // title: "useWatermark"
+ // }
+ // }
+ // ]
+ // }
+ // ]
+ // },
+ // {
+ // path: "/link",
+ // meta: {
+ // title: "文档链接",
+ // elIcon: "Link"
+ // },
+ // children: [
+ // {
+ // path: "https://juejin.cn/post/7445151895121543209",
+ // component: () => {},
+ // name: "Link1",
+ // meta: {
+ // title: "中文文档"
+ // }
+ // },
+ // {
+ // path: "https://juejin.cn/column/7207659644487139387",
+ // component: () => {},
+ // name: "Link2",
+ // meta: {
+ // title: "新手教程"
+ // }
+ // }
+ // ]
+ // }
+]
+
+/**
+ * @name 动态路由
+ * @description 用来放置有权限 (Roles 属性) 的路由
+ * @description 必须带有唯一的 Name 属性
+ */
+export const dynamicRoutes: RouteRecordRaw[] = [
+ // {
+ // path: "/permission",
+ // component: Layouts,
+ // redirect: "/permission/page-level",
+ // name: "Permission",
+ // meta: {
+ // title: "权限演示",
+ // elIcon: "Lock",
+ // // 可以在根路由中设置角色
+ // roles: ["admin", "editor"],
+ // alwaysShow: true
+ // },
+ // children: [
+ // {
+ // path: "page-level",
+ // component: () => import("@/pages/demo/permission/page-level.vue"),
+ // name: "PermissionPageLevel",
+ // meta: {
+ // title: "页面级",
+ // // 或者在子路由中设置角色
+ // roles: ["admin"]
+ // }
+ // },
+ // {
+ // path: "button-level",
+ // component: () => import("@/pages/demo/permission/button-level.vue"),
+ // name: "PermissionButtonLevel",
+ // meta: {
+ // title: "按钮级",
+ // // 如果未设置角色,则表示:该页面不需要权限,但会继承根路由的角色
+ // roles: undefined
+ // }
+ // }
+ // ]
+ // }
+]
+
+/** 路由实例 */
+export const router = createRouter({
+ history: routerConfig.history,
+ routes: routerConfig.thirdLevelRouteCache ? flatMultiLevelRoutes(constantRoutes) : constantRoutes
+})
+
+/** 重置路由 */
+export function resetRouter() {
+ try {
+ // 注意:所有动态路由路由必须带有 Name 属性,否则可能会不能完全重置干净
+ router.getRoutes().forEach((route) => {
+ const { name, meta } = route
+ if (name && meta.roles?.length) {
+ router.hasRoute(name) && router.removeRoute(name)
+ }
+ })
+ } catch {
+ // 强制刷新浏览器也行,只是交互体验不是很好
+ location.reload()
+ }
+}
+
+// 注册路由导航守卫
+registerNavigationGuard(router)
diff --git a/management/web/src/router/whitelist.ts b/management/web/src/router/whitelist.ts
new file mode 100644
index 0000000..7811e19
--- /dev/null
+++ b/management/web/src/router/whitelist.ts
@@ -0,0 +1,13 @@
+import type { RouteLocationNormalizedGeneric, RouteRecordNameGeneric } from "vue-router"
+
+/** 免登录白名单(匹配路由 path) */
+const whiteListByPath: string[] = ["/login"]
+
+/** 免登录白名单(匹配路由 name) */
+const whiteListByName: RouteRecordNameGeneric[] = []
+
+/** 判断是否在白名单 */
+export function isWhiteList(to: RouteLocationNormalizedGeneric) {
+ // path 和 name 任意一个匹配上即可
+ return whiteListByPath.includes(to.path) || whiteListByName.includes(to.name)
+}
diff --git a/management/web/tests/components/Notify.test.ts b/management/web/tests/components/Notify.test.ts
new file mode 100644
index 0000000..d842283
--- /dev/null
+++ b/management/web/tests/components/Notify.test.ts
@@ -0,0 +1,34 @@
+import Notify from "@@/components/Notify/index.vue"
+import List from "@@/components/Notify/List.vue"
+import { shallowMount } from "@vue/test-utils"
+import { describe, expect, it } from "vitest"
+
+describe("notify", () => {
+ it("正常渲染", () => {
+ const wrapper = shallowMount(Notify)
+ expect(wrapper.classes("notify")).toBe(true)
+ })
+})
+
+describe("list", () => {
+ it("list 长度为 0", () => {
+ const wrapper = shallowMount(List, {
+ props: {
+ data: []
+ }
+ })
+ expect(wrapper.find("el-empty-stub").exists()).toBe(true)
+ })
+ it("list 长度不为 0", () => {
+ const wrapper = shallowMount(List, {
+ props: {
+ data: [
+ {
+ title: ""
+ }
+ ]
+ }
+ })
+ expect(wrapper.find("el-empty-stub").exists()).toBe(false)
+ })
+})
diff --git a/management/web/tests/demo.test.ts b/management/web/tests/demo.test.ts
new file mode 100644
index 0000000..9656da2
--- /dev/null
+++ b/management/web/tests/demo.test.ts
@@ -0,0 +1,32 @@
+/**
+ * @description 该文件所有示例均是为了向你演示 Vitest 最基本的用法
+ * @link https://cn.vitest.dev/api
+ * @api describe: 形成一个作用域
+ * @api test/it: 定义了一组关于测试期望的方法,它接收测试名称和一个含有测试期望的函数
+ * @api expect: 用来创建断言
+ * @api toBe: 可以用于断言原始类型是否相等,或者对象是否共享相同的引用
+ * @api toEqual: 断言实际值是否等于接收到的值或具有相同的结构(如果是对象,则递归比较它们)
+ */
+
+import { describe, expect, it } from "vitest"
+
+const author1 = {
+ name: "pany",
+ email: "939630029@qq.com",
+ url: "https://github.com/pany-ang"
+}
+
+const author2 = {
+ name: "pany",
+ email: "939630029@qq.com",
+ url: "https://github.com/pany-ang"
+}
+
+describe("这里填写作用域名称", () => {
+ it("测试基础数据类型", () => {
+ expect(1 + 1).toBe(2)
+ })
+ it("测试引用类型", () => {
+ expect(author1).toEqual(author2)
+ })
+})
diff --git a/management/web/tests/utils/validate.test.ts b/management/web/tests/utils/validate.test.ts
new file mode 100644
index 0000000..4c94ad0
--- /dev/null
+++ b/management/web/tests/utils/validate.test.ts
@@ -0,0 +1,32 @@
+import { isArray } from "@@/utils/validate"
+import { describe, expect, it } from "vitest"
+
+describe("isArray", () => {
+ it("string", () => {
+ expect(isArray("")).toBe(false)
+ })
+ it("number", () => {
+ expect(isArray(1)).toBe(false)
+ })
+ it("boolean", () => {
+ expect(isArray(true)).toBe(false)
+ })
+ it("null", () => {
+ expect(isArray(null)).toBe(false)
+ })
+ it("undefined", () => {
+ expect(isArray(undefined)).toBe(false)
+ })
+ it("symbol", () => {
+ expect(isArray(Symbol())).toBe(false)
+ })
+ it("bigInt", () => {
+ expect(isArray(BigInt(1))).toBe(false)
+ })
+ it("object", () => {
+ expect(isArray({})).toBe(false)
+ })
+ it("array object", () => {
+ expect(isArray([])).toBe(true)
+ })
+})
diff --git a/management/web/tsconfig.json b/management/web/tsconfig.json
new file mode 100644
index 0000000..d552060
--- /dev/null
+++ b/management/web/tsconfig.json
@@ -0,0 +1,45 @@
+/**
+ * @link https://www.typescriptlang.org/tsconfig
+ * @link https://cn.vuejs.org/guide/typescript/overview#configuring-tsconfig-json
+ * @link https://cn.vite.dev/guide/features#typescript-compiler-options
+ */
+
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "jsx": "preserve",
+ "jsxImportSource": "vue",
+ "lib": ["esnext", "dom"],
+ "useDefineForClassFields": true,
+ "experimentalDecorators": true,
+ // baseUrl 用来告诉编译器到哪里去查找模块,使用非相对模块时必须配置此项
+ "baseUrl": ".",
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ // 非相对模块导入的路径映射配置,根据 baseUrl 配置进行路径计算,与 vite.config 中 alias 配置同步
+ "paths": {
+ "@/*": ["src/*"],
+ "@@/*": ["src/common/*"]
+ },
+ "resolveJsonModule": true,
+ "types": ["vite/client", "element-plus/global"],
+ // 允许导入 .ts .mts .tsx 拓展名的文件
+ "allowImportingTsExtensions": true,
+ // 允许 JS
+ "allowJs": true,
+ // TS 严格模式
+ "strict": true,
+ "importHelpers": true,
+ // 不输出任何编译后的文件,只进行类型检查
+ "noEmit": true,
+ "sourceMap": true,
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "isolatedModules": true,
+ "skipLibCheck": true
+ },
+ // 需要被编译的文件列表
+ "include": ["**/*.ts", "**/*.tsx", "**/*.vue", "**/*.d.ts"],
+ // 从编译中排除的文件列表
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/management/web/types/api.d.ts b/management/web/types/api.d.ts
new file mode 100644
index 0000000..8ab5c24
--- /dev/null
+++ b/management/web/types/api.d.ts
@@ -0,0 +1,6 @@
+/** 所有 api 接口的响应数据都应该准守该格式 */
+interface ApiResponseData {
+ code: number
+ data: T
+ message: string
+}
diff --git a/management/web/types/auto/auto-imports.d.ts b/management/web/types/auto/auto-imports.d.ts
new file mode 100644
index 0000000..f48310e
--- /dev/null
+++ b/management/web/types/auto/auto-imports.d.ts
@@ -0,0 +1,92 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+// biome-ignore lint: disable
+export {}
+declare global {
+ const EffectScope: typeof import('vue')['EffectScope']
+ const ElLoading: typeof import('element-plus/es')['ElLoading']
+ const ElMessage: typeof import('element-plus/es')['ElMessage']
+ const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
+ const ElNotification: typeof import('element-plus/es')['ElNotification']
+ const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
+ const computed: typeof import('vue')['computed']
+ const createApp: typeof import('vue')['createApp']
+ const createPinia: typeof import('pinia')['createPinia']
+ const customRef: typeof import('vue')['customRef']
+ const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
+ const defineComponent: typeof import('vue')['defineComponent']
+ const defineStore: typeof import('pinia')['defineStore']
+ const effectScope: typeof import('vue')['effectScope']
+ const getActivePinia: typeof import('pinia')['getActivePinia']
+ const getCurrentInstance: typeof import('vue')['getCurrentInstance']
+ const getCurrentScope: typeof import('vue')['getCurrentScope']
+ const h: typeof import('vue')['h']
+ const inject: typeof import('vue')['inject']
+ const isProxy: typeof import('vue')['isProxy']
+ const isReactive: typeof import('vue')['isReactive']
+ const isReadonly: typeof import('vue')['isReadonly']
+ const isRef: typeof import('vue')['isRef']
+ const mapActions: typeof import('pinia')['mapActions']
+ const mapGetters: typeof import('pinia')['mapGetters']
+ const mapState: typeof import('pinia')['mapState']
+ const mapStores: typeof import('pinia')['mapStores']
+ const mapWritableState: typeof import('pinia')['mapWritableState']
+ const markRaw: typeof import('vue')['markRaw']
+ const nextTick: typeof import('vue')['nextTick']
+ const onActivated: typeof import('vue')['onActivated']
+ const onBeforeMount: typeof import('vue')['onBeforeMount']
+ const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
+ const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
+ const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
+ const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
+ const onDeactivated: typeof import('vue')['onDeactivated']
+ const onErrorCaptured: typeof import('vue')['onErrorCaptured']
+ const onMounted: typeof import('vue')['onMounted']
+ const onRenderTracked: typeof import('vue')['onRenderTracked']
+ const onRenderTriggered: typeof import('vue')['onRenderTriggered']
+ const onScopeDispose: typeof import('vue')['onScopeDispose']
+ const onServerPrefetch: typeof import('vue')['onServerPrefetch']
+ const onUnmounted: typeof import('vue')['onUnmounted']
+ const onUpdated: typeof import('vue')['onUpdated']
+ const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
+ const provide: typeof import('vue')['provide']
+ const reactive: typeof import('vue')['reactive']
+ const readonly: typeof import('vue')['readonly']
+ const ref: typeof import('vue')['ref']
+ const resolveComponent: typeof import('vue')['resolveComponent']
+ const setActivePinia: typeof import('pinia')['setActivePinia']
+ const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
+ const shallowReactive: typeof import('vue')['shallowReactive']
+ const shallowReadonly: typeof import('vue')['shallowReadonly']
+ const shallowRef: typeof import('vue')['shallowRef']
+ const storeToRefs: typeof import('pinia')['storeToRefs']
+ const toRaw: typeof import('vue')['toRaw']
+ const toRef: typeof import('vue')['toRef']
+ const toRefs: typeof import('vue')['toRefs']
+ const toValue: typeof import('vue')['toValue']
+ const triggerRef: typeof import('vue')['triggerRef']
+ const unref: typeof import('vue')['unref']
+ const useAttrs: typeof import('vue')['useAttrs']
+ const useCssModule: typeof import('vue')['useCssModule']
+ const useCssVars: typeof import('vue')['useCssVars']
+ const useId: typeof import('vue')['useId']
+ const useLink: typeof import('vue-router')['useLink']
+ const useModel: typeof import('vue')['useModel']
+ const useRoute: typeof import('vue-router')['useRoute']
+ const useRouter: typeof import('vue-router')['useRouter']
+ const useSlots: typeof import('vue')['useSlots']
+ const useTemplateRef: typeof import('vue')['useTemplateRef']
+ const watch: typeof import('vue')['watch']
+ const watchEffect: typeof import('vue')['watchEffect']
+ const watchPostEffect: typeof import('vue')['watchPostEffect']
+ const watchSyncEffect: typeof import('vue')['watchSyncEffect']
+}
+// for type re-export
+declare global {
+ // @ts-ignore
+ export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+ import('vue')
+}
diff --git a/management/web/types/auto/components.d.ts b/management/web/types/auto/components.d.ts
new file mode 100644
index 0000000..dad3078
--- /dev/null
+++ b/management/web/types/auto/components.d.ts
@@ -0,0 +1,59 @@
+/* eslint-disable */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+// biome-ignore lint: disable
+export {}
+
+/* prettier-ignore */
+declare module 'vue' {
+ export interface GlobalComponents {
+ ElAlert: typeof import('element-plus/es')['ElAlert']
+ ElAside: typeof import('element-plus/es')['ElAside']
+ ElAvatar: typeof import('element-plus/es')['ElAvatar']
+ ElBacktop: typeof import('element-plus/es')['ElBacktop']
+ ElBadge: typeof import('element-plus/es')['ElBadge']
+ ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
+ ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
+ ElButton: typeof import('element-plus/es')['ElButton']
+ ElCard: typeof import('element-plus/es')['ElCard']
+ ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+ ElContainer: typeof import('element-plus/es')['ElContainer']
+ ElDialog: typeof import('element-plus/es')['ElDialog']
+ ElDivider: typeof import('element-plus/es')['ElDivider']
+ ElDrawer: typeof import('element-plus/es')['ElDrawer']
+ ElDropdown: typeof import('element-plus/es')['ElDropdown']
+ ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
+ ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
+ ElEmpty: typeof import('element-plus/es')['ElEmpty']
+ ElForm: typeof import('element-plus/es')['ElForm']
+ ElFormItem: typeof import('element-plus/es')['ElFormItem']
+ ElHeader: typeof import('element-plus/es')['ElHeader']
+ ElIcon: typeof import('element-plus/es')['ElIcon']
+ ElImage: typeof import('element-plus/es')['ElImage']
+ ElInput: typeof import('element-plus/es')['ElInput']
+ ElLink: typeof import('element-plus/es')['ElLink']
+ ElMain: typeof import('element-plus/es')['ElMain']
+ ElMenu: typeof import('element-plus/es')['ElMenu']
+ ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
+ ElPagination: typeof import('element-plus/es')['ElPagination']
+ ElPopover: typeof import('element-plus/es')['ElPopover']
+ ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
+ ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
+ ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+ ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
+ ElSwitch: typeof import('element-plus/es')['ElSwitch']
+ ElTable: typeof import('element-plus/es')['ElTable']
+ ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+ ElTabPane: typeof import('element-plus/es')['ElTabPane']
+ ElTabs: typeof import('element-plus/es')['ElTabs']
+ ElTag: typeof import('element-plus/es')['ElTag']
+ ElText: typeof import('element-plus/es')['ElText']
+ ElTooltip: typeof import('element-plus/es')['ElTooltip']
+ RouterLink: typeof import('vue-router')['RouterLink']
+ RouterView: typeof import('vue-router')['RouterView']
+ }
+ export interface ComponentCustomProperties {
+ vLoading: typeof import('element-plus/es')['ElLoadingDirective']
+ }
+}
diff --git a/management/web/types/auto/svg-component-global.d.ts b/management/web/types/auto/svg-component-global.d.ts
new file mode 100644
index 0000000..8c7ee10
--- /dev/null
+++ b/management/web/types/auto/svg-component-global.d.ts
@@ -0,0 +1,26 @@
+/* eslint-disable */
+/* prettier-ignore */
+// biome-ignore format: off
+// biome-ignore lint: off
+// @ts-nocheck
+// Generated by unplugin-svg-component
+import 'vue'
+declare module 'vue' {
+ export interface GlobalComponents {
+ SvgIcon: import("vue").DefineComponent<{
+ name: {
+ type: import("vue").PropType<"dashboard" | "fullscreen-exit" | "fullscreen" | "keyboard-down" | "keyboard-enter" | "keyboard-esc" | "keyboard-up" | "search">;
+ default: string;
+ required: true;
+ };
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly;
+ default: string;
+ required: true;
+ };
+ }>>, {
+ name: "dashboard" | "fullscreen-exit" | "fullscreen" | "keyboard-down" | "keyboard-enter" | "keyboard-esc" | "keyboard-up" | "search";
+ }>;
+ }
+}
diff --git a/management/web/types/auto/svg-component.d.ts b/management/web/types/auto/svg-component.d.ts
new file mode 100644
index 0000000..ca3f244
--- /dev/null
+++ b/management/web/types/auto/svg-component.d.ts
@@ -0,0 +1,26 @@
+/* eslint-disable */
+/* prettier-ignore */
+// biome-ignore format: off
+// biome-ignore lint: off
+// @ts-nocheck
+// Generated by unplugin-svg-component
+declare module '~virtual/svg-component' {
+ const SvgIcon: import("vue").DefineComponent<{
+ name: {
+ type: import("vue").PropType<"dashboard" | "fullscreen-exit" | "fullscreen" | "keyboard-down" | "keyboard-enter" | "keyboard-esc" | "keyboard-up" | "search">;
+ default: string;
+ required: true;
+ };
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly;
+ default: string;
+ required: true;
+ };
+ }>>, {
+ name: "dashboard" | "fullscreen-exit" | "fullscreen" | "keyboard-down" | "keyboard-enter" | "keyboard-esc" | "keyboard-up" | "search";
+ }>;
+ export const svgNames: ["dashboard", "fullscreen-exit", "fullscreen", "keyboard-down", "keyboard-enter", "keyboard-esc", "keyboard-up", "search"];
+ export type SvgName = "dashboard" | "fullscreen-exit" | "fullscreen" | "keyboard-down" | "keyboard-enter" | "keyboard-esc" | "keyboard-up" | "search";
+ export default SvgIcon;
+}
diff --git a/management/web/types/directives.d.ts b/management/web/types/directives.d.ts
new file mode 100644
index 0000000..6788f00
--- /dev/null
+++ b/management/web/types/directives.d.ts
@@ -0,0 +1,10 @@
+import type { Directive } from "vue"
+
+export {}
+
+// 由 app.directive 全局注册的自定义指令需要在这里声明 TS 类型才能获得类型提示
+declare module "vue" {
+ export interface ComponentCustomProperties {
+ vPermission: Directive
+ }
+}
diff --git a/management/web/types/env.d.ts b/management/web/types/env.d.ts
new file mode 100644
index 0000000..4b07d10
--- /dev/null
+++ b/management/web/types/env.d.ts
@@ -0,0 +1,11 @@
+/** 声明 vite 环境变量的类型(如果未声明则默认是 any) */
+interface ImportMetaEnv {
+ readonly VITE_APP_TITLE: string
+ readonly VITE_BASE_URL: string
+ readonly VITE_ROUTER_HISTORY: "hash" | "html5"
+ readonly VITE_PUBLIC_PATH: string
+}
+
+interface ImportMeta {
+ readonly env: ImportMetaEnv
+}
diff --git a/management/web/types/vue-router.d.ts b/management/web/types/vue-router.d.ts
new file mode 100644
index 0000000..9a27d55
--- /dev/null
+++ b/management/web/types/vue-router.d.ts
@@ -0,0 +1,57 @@
+import type * as ElementPlusIconsVue from "@element-plus/icons-vue"
+import type { SvgName } from "~virtual/svg-component"
+import "vue-router"
+
+export {}
+
+type ElementPlusIconsName = keyof typeof ElementPlusIconsVue
+
+declare module "vue-router" {
+ interface RouteMeta {
+ /**
+ * @description 设置该路由在侧边栏和面包屑中展示的名字
+ */
+ title?: string
+ /**
+ * @description 设置该路由的图标,记得将 svg 导入 src/common/assets/icons
+ */
+ svgIcon?: SvgName
+ /**
+ * @description 设置该路由的图标,直接使用 Element Plus 的 Icon(与 svgIcon 同时设置时,svgIcon 将优先生效)
+ */
+ elIcon?: ElementPlusIconsName
+ /**
+ * @description 默认 false,设置 true 的时候该路由不会在侧边栏出现
+ */
+ hidden?: boolean
+ /**
+ * @description 设置能进入该路由的角色,支持多个角色叠加
+ */
+ roles?: string[]
+ /**
+ * @description 默认 true,如果设置为 false,则不会在面包屑中显示
+ */
+ breadcrumb?: boolean
+ /**
+ * @description 默认 false,如果设置为 true,它则会固定在 tags-view 中
+ */
+ affix?: boolean
+ /**
+ * @description 当一个路由的 children 属性中声明的非隐藏子路由只有 1 个且该子路由为叶子节点时,会将这个子路由当做父路由显示在侧边栏
+ * @description 当大于 1 个时,会恢复成嵌套模式
+ * @description 如果想不管个数总是显示父路由,可以在父路由上设置 alwaysShow: true
+ */
+ alwaysShow?: boolean
+ /**
+ * @description 示例: activeMenu: "/xxx/xxx",
+ * @description 当设置了该属性进入路由时,则会高亮 activeMenu 属性对应的侧边栏
+ * @description 该属性适合使用在有 hidden: true 属性的路由上
+ */
+ activeMenu?: string
+ /**
+ * @description 是否缓存该路由页面
+ * @description 默认为 false,为 true 时代表需要缓存,此时该路由和该页面都需要设置一致的 Name
+ */
+ keepAlive?: boolean
+ }
+}
diff --git a/management/web/uno.config.ts b/management/web/uno.config.ts
new file mode 100644
index 0000000..35c8f2d
--- /dev/null
+++ b/management/web/uno.config.ts
@@ -0,0 +1,25 @@
+import { defineConfig, presetAttributify, presetWind3 } from "unocss"
+
+export default defineConfig({
+ // 预设
+ presets: [
+ // 属性化模式 & 无值的属性模式
+ presetAttributify({
+ prefix: "un-",
+ prefixedOnly: false
+ }),
+ // 默认预设
+ presetWind3({
+ important: "#app"
+ })
+ ],
+ // 自定义规则
+ rules: [],
+ // 自定义快捷方式
+ shortcuts: {
+ "wh-full": "w-full h-full",
+ "flex-center": "flex justify-center items-center",
+ "flex-x-center": "flex justify-center",
+ "flex-y-center": "flex items-center"
+ }
+})
diff --git a/management/web/vite.config.ts b/management/web/vite.config.ts
new file mode 100644
index 0000000..02c1b75
--- /dev/null
+++ b/management/web/vite.config.ts
@@ -0,0 +1,148 @@
+///
+
+import { resolve } from "node:path"
+import vue from "@vitejs/plugin-vue"
+import vueJsx from "@vitejs/plugin-vue-jsx"
+import UnoCSS from "unocss/vite"
+import AutoImport from "unplugin-auto-import/vite"
+import SvgComponent from "unplugin-svg-component/vite"
+import { ElementPlusResolver } from "unplugin-vue-components/resolvers"
+import Components from "unplugin-vue-components/vite"
+import { defineConfig, loadEnv } from "vite"
+import svgLoader from "vite-svg-loader"
+
+// Configuring Vite: https://cn.vite.dev/config
+export default defineConfig(({ mode }) => {
+ const { VITE_PUBLIC_PATH } = loadEnv(mode, process.cwd(), "") as ImportMetaEnv
+ return {
+ // 开发或打包构建时用到的公共基础路径
+ base: VITE_PUBLIC_PATH,
+ resolve: {
+ alias: {
+ // @ 符号指向 src 目录
+ "@": resolve(__dirname, "src"),
+ // @@ 符号指向 src/common 通用目录
+ "@@": resolve(__dirname, "src/common")
+ }
+ },
+ // 开发环境服务器配置
+ server: {
+ // 是否监听所有地址
+ host: true,
+ // 端口号
+ port: 3333,
+ // 端口被占用时,是否直接退出
+ strictPort: false,
+ // 是否自动打开浏览器
+ open: true,
+ // 反向代理
+ proxy: {
+ "/api": {
+ // target: "https://apifoxmock.com/m1/2930465-2145633-default",
+ target: "http://localhost:5000",
+ // 是否为 WebSocket
+ ws: false,
+ // 是否允许跨域
+ changeOrigin: true
+ }
+ },
+ // 是否允许跨域
+ cors: true,
+ // 预热常用文件,提高初始页面加载速度
+ warmup: {
+ clientFiles: [
+ "./src/layouts/**/*.*",
+ "./src/pinia/**/*.*",
+ "./src/router/**/*.*"
+ ]
+ }
+ },
+ // 构建配置
+ build: {
+ // 自定义底层的 Rollup 打包配置
+ rollupOptions: {
+ output: {
+ /**
+ * @name 分块策略
+ * @description 1. 注意这些包名必须存在,否则打包会报错
+ * @description 2. 如果你不想自定义 chunk 分割策略,可以直接移除这段配置
+ */
+ manualChunks: {
+ vue: ["vue", "vue-router", "pinia"],
+ element: ["element-plus", "@element-plus/icons-vue"],
+ vxe: ["vxe-table"]
+ }
+ }
+ },
+ // 是否开启 gzip 压缩大小报告,禁用时能略微提高构建性能
+ reportCompressedSize: false,
+ // 单个 chunk 文件的大小超过 2048kB 时发出警告
+ chunkSizeWarningLimit: 2048
+ },
+ // 混淆器
+ esbuild:
+ mode === "development"
+ ? undefined
+ : {
+ // 打包构建时移除 console.log
+ pure: ["console.log"],
+ // 打包构建时移除 debugger
+ drop: ["debugger"],
+ // 打包构建时移除所有注释
+ legalComments: "none"
+ },
+ // 插件配置
+ plugins: [
+ vue(),
+ // 支持 JSX、TSX 语法
+ vueJsx(),
+ // 支持将 SVG 文件导入为 Vue 组件
+ svgLoader({
+ defaultImport: "url",
+ svgoConfig: {
+ plugins: [
+ {
+ name: "preset-default",
+ params: {
+ overrides: {
+ // @see https://github.com/svg/svgo/issues/1128
+ removeViewBox: false
+ }
+ }
+ }
+ ]
+ }
+ }),
+ // 自动生成 SvgIcon 组件和 SVG 雪碧图
+ SvgComponent({
+ iconDir: [resolve(__dirname, "src/common/assets/icons")],
+ preserveColor: resolve(__dirname, "src/common/assets/icons/preserve-color"),
+ dts: true,
+ dtsDir: resolve(__dirname, "types/auto")
+ }),
+ // 原子化 CSS
+ UnoCSS(),
+ // 自动按需导入 API
+ AutoImport({
+ imports: ["vue", "vue-router", "pinia"],
+ dts: "types/auto/auto-imports.d.ts",
+ resolvers: [ElementPlusResolver()]
+ }),
+ // 自动按需导入组件
+ Components({
+ dts: "types/auto/components.d.ts",
+ resolvers: [ElementPlusResolver()]
+ })
+ ],
+ // Configuring Vitest: https://cn.vitest.dev/config
+ test: {
+ include: ["tests/**/*.test.{ts,js}"],
+ environment: "happy-dom",
+ server: {
+ deps: {
+ inline: ["element-plus"]
+ }
+ }
+ }
+ }
+})
diff --git a/python_sql/add.json b/python_sql/add.json
deleted file mode 100644
index 26d22aa..0000000
--- a/python_sql/add.json
+++ /dev/null
@@ -1,9 +0,0 @@
-[
- {
- "student_id": [
- "123456789",
- "1234567810"
- ],
- "tenant_id": "d3de1596fb6911efa0f40242ac120006"
- }
-]
diff --git a/python_sql/add_sql_final.py b/python_sql/add_sql_final.py
deleted file mode 100644
index 7abf8f4..0000000
--- a/python_sql/add_sql_final.py
+++ /dev/null
@@ -1,165 +0,0 @@
-import mysql.connector
-import uuid
-import base64
-import json
-from datetime import datetime
-from Cryptodome.PublicKey import RSA
-from Cryptodome.Cipher import PKCS1_v1_5
-from werkzeug.security import generate_password_hash
-
-# 数据库连接配置
-db_config = {
- "host": "localhost",
- "port": 5455,
- "user": "root",
- "password": "infini_rag_flow",
- "database": "rag_flow",
-}
-
-# 生成随机的 UUID 作为 id
-def generate_uuid():
- return str(uuid.uuid4()).replace("-", "")
-
-# RSA 加密密码
-def rsa_psw(password: str) -> str:
- pub_key = """-----BEGIN PUBLIC KEY-----
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArq9XTUSeYr2+N1h3Afl/z8Dse/2yD0ZGrKwx+EEEcdsBLca9Ynmx3nIB5obmLlSfmskLpBo0UACBmB5rEjBp2Q2f3AG3Hjd4B+gNCG6BDaawuDlgANIhGnaTLrIqWrrcm4EMzJOnAOI1fgzJRsOOUEfaS318Eq9OVO3apEyCCt0lOQK6PuksduOjVxtltDav+guVAA068NrPYmRNabVKRNLJpL8w4D44sfth5RvZ3q9t+6RTArpEtc5sh5ChzvqPOzKGMXW83C95TxmXqpbK6olN4RevSfVjEAgCydH6HN6OhtOQEcnrU97r9H0iZOWwbw3pVrZiUkuRD1R56Wzs2wIDAQAB
- -----END PUBLIC KEY-----"""
-
- rsa_key = RSA.import_key(pub_key)
- cipher = PKCS1_v1_5.new(rsa_key)
- encrypted_data = cipher.encrypt(base64.b64encode(password.encode()))
- return base64.b64encode(encrypted_data).decode()
-
-# 加密密码
-def encrypt_password(raw_password: str) -> str:
- base64_password = base64.b64encode(raw_password.encode()).decode()
- encrypted_password = rsa_psw(base64_password)
- return generate_password_hash(base64_password)
-
-# 处理批量注册
-def batch_register_students():
- # 从 JSON 文件加载学生数据
- with open("add.json", "r", encoding="utf-8") as json_file:
- student_groups = json.load(json_file)
-
- try:
- # 建立数据库连接
- conn = mysql.connector.connect(**db_config)
- cursor = conn.cursor()
-
- for group in student_groups:
- tenant_id = group["tenant_id"]
- student_ids = group["student_id"]
-
- for student_id in student_ids:
- # 生成 ID 和时间戳
- user_id = generate_uuid()
- create_time = 1741361741738
- create_date = datetime.strptime("2025-03-07 23:35:41", "%Y-%m-%d %H:%M:%S")
- update_time = 1741416354403
- update_date = datetime.strptime("2025-03-08 14:45:54", "%Y-%m-%d %H:%M:%S")
-
- # 用户信息
- student_email = student_id + "@xidian.cn"
- raw_password = student_id
- hash_encrypted = encrypt_password(raw_password)
-
- # 插入 user 表数据
- user_insert_query = """
- INSERT INTO user (
- id, create_time, create_date, update_time, update_date, access_token,
- nickname, password, email, avatar, language, color_schema, timezone,
- last_login_time, is_authenticated, is_active, is_anonymous, login_channel,
- status, is_superuser
- ) VALUES (
- %s, %s, %s, %s, %s, %s,
- %s, %s, %s, %s, %s, %s, %s,
- %s, %s, %s, %s, %s,
- %s, %s
- )
- """
- user_data = (
- user_id, create_time, create_date, update_time, update_date, None,
- student_id, hash_encrypted, student_email, None, "Chinese", "Bright", "UTC+8 Asia/Shanghai",
- create_date, 1, 1, 0, "password",
- 1, 0
- )
- cursor.execute(user_insert_query, user_data)
-
- # 插入 tenant 表数据
- tenant_insert_query = """
- INSERT INTO tenant (
- id, create_time, create_date, update_time, update_date, name,
- public_key, llm_id, embd_id, asr_id, img2txt_id, rerank_id, tts_id,
- parser_ids, credit, status
- ) VALUES (
- %s, %s, %s, %s, %s, %s,
- %s, %s, %s, %s, %s, %s, %s,
- %s, %s, %s
- )
- """
- tenant_data = (
- user_id, create_time, create_date, update_time, update_date, student_id + "'s Kingdom",
- None, "deepseek-r1:1.5b@Ollama", "BAAI/bge-large-zh-v1.5@BAAI", "", "", "", None,
- "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,email:Email,tag:Tag",
- 512, 1
- )
- cursor.execute(tenant_insert_query, tenant_data)
-
- # 插入 user_tenant 表的第一条记录
- user_tenant_insert_query = """
- INSERT INTO user_tenant (
- id, create_time, create_date, update_time, update_date, user_id,
- tenant_id, role, invited_by, status
- ) VALUES (
- %s, %s, %s, %s, %s, %s,
- %s, %s, %s, %s
- )
- """
- user_tenant_data_owner = (
- generate_uuid(), create_time, create_date, update_time, update_date, user_id,
- user_id, "owner", user_id, 1
- )
- cursor.execute(user_tenant_insert_query, user_tenant_data_owner)
-
- # 插入 user_tenant 表的第二条记录
- user_tenant_data_normal = (
- generate_uuid(), create_time, create_date, update_time, update_date, user_id,
- tenant_id, "normal", tenant_id, 1
- )
- cursor.execute(user_tenant_insert_query, user_tenant_data_normal)
-
- # 插入 tenant_llm 表数据
- tenant_llm_insert_query = """
- INSERT INTO tenant_llm (
- create_time, create_date, update_time, update_date, tenant_id,
- llm_factory, model_type, llm_name, api_key, api_base, max_tokens, used_tokens
- ) VALUES (
- %s, %s, %s, %s, %s,
- %s, %s, %s, %s, %s, %s, %s
- )
- """
- tenant_llm_data = (
- create_time, create_date, update_time, update_date, user_id,
- "Ollama", "chat", "deepseek-r1:1.5b", "xxxxxxxxxxxxxxx", "http://10.195.140.47:11434", 88888888, 0
- )
- cursor.execute(tenant_llm_insert_query, tenant_llm_data)
-
- # 提交事务
- conn.commit()
-
- print("批量用户数据添加成功!")
-
- except mysql.connector.Error as err:
- print(f"数据库错误: {err}")
-
- finally:
- if conn.is_connected():
- cursor.close()
- conn.close()
- print("数据库连接已关闭。")
-
-
-if __name__ == '__main__':
- batch_register_students()
\ No newline at end of file
diff --git a/python_sql/private.pem b/python_sql/private.pem
deleted file mode 100644
index ff33305..0000000
--- a/python_sql/private.pem
+++ /dev/null
@@ -1,30 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,EFF8327C41E531AD
-
-7jdPFDAA6fiTzOIU7XGzKuT324JKZEcK5vBRJqBkA5XO6ENN1wLdhh3zQbl1Ejfv
-KMSUIgbtQEJB4bvOzS//okbZa1vCNYuTS/NGcpKUnhqdOmAL3hl/kOtOLLjTZrwo
-3KX8iujLH7wQ64GxArtpUuaFq1k0whN1BB5RGJp3IO/L6pMpSWVRKO+JPUrD1Ujr
-XA/LUKQJaZtXVUVOYPtIwbyqPsh93QBetJnRwwV3gNOwGpcX2jDpyTxDUkLJCPPg
-6Hw0pwlQEd8A11sjxCBbASwLeJO1L0w69QiX9chyOkZ+sfDsVpPt/wf1NexA7Cdj
-9uifJ4JGbby39QD6mInZGtnRzQRdafjuXlBR2I0Qa7fBRu8QsfhmLbWZfWno7j08
-4bAAoqB1vRNfSu8LVJXdEEh/HKuwu11pgRr5eH8WQ3hJg+Y2k7zDHpp1VaHL7/Kn
-S+aN5bhQ4Xt0Ujdi1+rsmNchnF6LWsDezHWJeWUM6X7dJnqIBl8oCyghbghT8Tyw
-aEKWXc2+7FsP5yd0NfG3PFYOLdLgfI43pHTAv5PEQ47w9r1XOwfblKKBUDEzaput
-T3t5wQ6wxdyhRxeO4arCHfe/i+j3fzvhlwgbuwrmrkWGWSS86eMTaoGM8+uUrHv0
-6TbU0tj6DKKUslVk1dCHh9TnmNsXZuLJkceZF38PSKNxhzudU8OTtzhS0tFL91HX
-vo7N+XdiGMs8oOSpjE6RPlhFhVAKGJpXwBj/vXLLcmzesA7ZB2kYtFKMIdsUQpls
-PE/4K5PEX2d8pxA5zxo0HleA1YjW8i5WEcDQThZQzj2sWvg06zSjenVFrbCm9Bro
-hFpAB/3zJHxdRN2MpNpvK35WITy1aDUdX1WdyrlcRtIE5ssFTSoxSj9ibbDZ78+z
-gtbw/MUi6vU6Yz1EjvoYu/bmZAHt9Aagcxw6k58fjO2cEB9njK7xbbiZUSwpJhEe
-U/PxK+SdOU/MmGKeqdgqSfhJkq0vhacvsEjFGRAfivSCHkL0UjhObU+rSJ3g1RMO
-oukAev6TOAwbTKVWjg3/EX+pl/zorAgaPNYFX64TSH4lE3VjeWApITb9Z5C/sVxR
-xW6hU9qyjzWYWY+91y16nkw1l7VQvWHUZwV7QzTScC2BOzDVpeqY1KiYJxgoo6sX
-ZCqR5oh4vToG4W8ZrRyauwUaZJ3r+zhAgm+6n6TJQNwFEl0muji+1nPl32EiFsRs
-qR6CtuhUOVQM4VnILDwFJfuGYRFtKzQgvseLNU4ZqAVqQj8l4ARGAP2P1Au/uUKy
-oGzI7a+b5MvRHuvkxPAclOgXgX/8yyOLaBg+mgaqv9h2JIJD28PzouFl3BajRaVB
-7GWTnROJYhX5SuX/g585SLRKoQUtK0WhdJCjTRfyRJPwfdppgdTbWO99R4G+ir02
-JQdSkZf2vmZRXenPNTEPDOUY6nVN6sUuBjmtOwoUF194ODgpYB6IaHqK08sa1pUh
-1mZyxitHdPbygePTe20XWMZFoK2knAqN0JPPbbNjCqiVV+7oqQAnkDIutspu9t2m
-ny3jefFmNozbblQMghLUrq+x9wOEgvS76Sqvq3DG/2BkLzJF3MNkvw==
------END RSA PRIVATE KEY-----
diff --git a/web/public/logo.svg b/web/public/logo.svg
index 54167d2..5d0c31e 100644
--- a/web/public/logo.svg
+++ b/web/public/logo.svg
@@ -1,29 +1,5 @@
-
\ No newline at end of file
+
+
+