From 24f7cd7f99eae0653e5cc9816f48dee6ee70bfe4 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 24 May 2026 19:49:45 +0800 Subject: [PATCH] =?utf8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4words?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .gitignore | 33 +- backend/db/schema.txt | 27 + backend/main.py | 156 ++++ backend/requirements.txt | 5 + database.py | 28 + frontend/.gitignore | 23 + README.md => frontend/README.md | 0 .../package-lock.json | 852 ++++++++++++++---- package.json => frontend/package.json | 10 +- frontend/package.json.save | 43 + {public => frontend/public}/favicon.ico | Bin {public => frontend/public}/index.html | 0 {public => frontend/public}/logo192.png | Bin {public => frontend/public}/logo512.png | Bin {public => frontend/public}/manifest.json | 0 {public => frontend/public}/robots.txt | 0 {src => frontend/src}/App.css | 0 frontend/src/App.js | 17 + {src => frontend/src}/App.test.js | 0 frontend/src/components/Home.css | 91 ++ frontend/src/components/Home.js | 96 ++ frontend/src/components/UploadPicture.js | 36 + frontend/src/home.js | 96 ++ {src => frontend/src}/index.css | 0 {src => frontend/src}/index.js | 0 {src => frontend/src}/logo.svg | 0 {src => frontend/src}/reportWebVitals.js | 0 {src => frontend/src}/setupTests.js | 0 generate_report.py | 141 +++ project_all_in_one.txt | 809 +++++++++++++++++ src/App.js | 25 - 31 files changed, 2279 insertions(+), 209 deletions(-) create mode 100644 backend/db/schema.txt create mode 100644 backend/main.py create mode 100644 backend/requirements.txt create mode 100644 database.py create mode 100644 frontend/.gitignore rename README.md => frontend/README.md (100%) rename package-lock.json => frontend/package-lock.json (96%) rename package.json => frontend/package.json (78%) create mode 100644 frontend/package.json.save rename {public => frontend/public}/favicon.ico (100%) rename {public => frontend/public}/index.html (100%) rename {public => frontend/public}/logo192.png (100%) rename {public => frontend/public}/logo512.png (100%) rename {public => frontend/public}/manifest.json (100%) rename {public => frontend/public}/robots.txt (100%) rename {src => frontend/src}/App.css (100%) create mode 100644 frontend/src/App.js rename {src => frontend/src}/App.test.js (100%) create mode 100644 frontend/src/components/Home.css create mode 100644 frontend/src/components/Home.js create mode 100644 frontend/src/components/UploadPicture.js create mode 100644 frontend/src/home.js rename {src => frontend/src}/index.css (100%) rename {src => frontend/src}/index.js (100%) rename {src => frontend/src}/logo.svg (100%) rename {src => frontend/src}/reportWebVitals.js (100%) rename {src => frontend/src}/setupTests.js (100%) create mode 100644 generate_report.py create mode 100644 project_all_in_one.txt delete mode 100644 src/App.js diff --git a/.gitignore b/.gitignore index 4d29575..4ebf247 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,16 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# Python +__pycache__/ +*.py[cod] +*$py.class +venv/ +.env -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc +# Node +node_modules/ +frontend/build/ .DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local -npm-debug.log* -yarn-debug.log* -yarn-error.log* +# Database & Logs +backend/a/log.txt +backend/a/error_log.csv +*.db diff --git a/backend/db/schema.txt b/backend/db/schema.txt new file mode 100644 index 0000000..2fc5451 --- /dev/null +++ b/backend/db/schema.txt @@ -0,0 +1,27 @@ +CREATE TABLE pictures ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 中自增 ID 的标准写法 + pictures BLOB, -- 存储图片二进制数据 + enabled INTEGER DEFAULT 1 -- 是否有效,默认为 1 +) + +CREATE TABLE words ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, -- 单词ID,自增 + picture_id INTEGER, -- 对应 pictures 表中的 ID + word TEXT NOT NULL, -- 单词本身 + chinese_meaning TEXT, -- 单词的中文词义 + part_of_speech TEXT, -- 单词的词性 (n., v., adj. 等) + word_root TEXT, -- 词根 + affix TEXT, -- 单词的词缀描述 + example_sentence TEXT, groupid INTEGER, -- 该单词的例句 + FOREIGN KEY (picture_id) REFERENCES pictures(ID) -- 建立外键关联 +) + +CREATE TABLE schema_comments ( + object_type TEXT, -- 'table' 或 'column' + table_name TEXT NOT NULL, + column_name TEXT, -- table 类型时可为 NULL + description TEXT, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY(object_type, table_name, column_name) +) +CREATE TABLE sqlite_sequence(name,seq) \ No newline at end of file diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..80eb8be --- /dev/null +++ b/backend/main.py @@ -0,0 +1,156 @@ +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +import sqlite3 +import os +import re +import datetime +from pydantic import BaseModel +from typing import List, Optional + +app = FastAPI() + +# 允许 CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- 文件路径配置 --- +# 确保路径与你的服务器目录结构一致 +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DATABASE_PATH = os.path.join(BASE_DIR, "db", "bcd.db") +LOG_FILE_PATH = os.path.join(BASE_DIR, "a", "log.txt") + +# --- 数据模型 --- +class HomeData(BaseModel): + pictures_count: int + words_count: int + +class ProgressData(BaseModel): + group: str + study: str + test: str + review1: str + review2: str + review3: str + +# --- 辅助逻辑函数(移植自原 MainApp) --- + +def calculate_hours_since(date_str: str) -> Optional[float]: + if not date_str: + return None + try: + # 兼容原格式 "2023-05-24 10:00:00" + last = datetime.datetime.strptime(date_str[:19], "%Y-%m-%d %H:%M:%S") + return (datetime.datetime.now() - last).total_seconds() / 3600 + except: + return None + +def get_progress_from_log(): + """解析 log.txt 获取每个组的完成时间""" + progress = {} + if os.path.exists(LOG_FILE_PATH): + with open(LOG_FILE_PATH, 'r', encoding='utf-8') as f: + for line in f: + # 匹配原有的日志格式 + match = re.search(r'PROGRESS_UPDATE: Group:(.+?), Type:(.+?), Status:completed, Date:(.+)', line) + if match: + g_n, a_t, c_d = match.groups() + g_n = g_n.strip() + if g_n not in progress: + progress[g_n] = {'study': None, 'test': None, 'review1': None, 'review2': None, 'review3': None} + progress[g_n][a_t.strip()] = c_d.strip() + return progress + +# --- 路由实现 --- + +@app.get("/api/home", response_model=HomeData) +async def get_home_data(): + try: + conn = sqlite3.connect(DATABASE_PATH) + cursor = conn.cursor() + cursor.execute("SELECT COUNT(*) FROM pictures WHERE enabled = 1") + p_count = cursor.fetchone()[0] + cursor.execute("SELECT COUNT(*) FROM words") + w_count = cursor.fetchone()[0] + conn.close() + return HomeData(pictures_count=p_count, words_count=w_count) + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + +@app.get("/api/home/process", response_model=List[ProgressData]) +async def get_home_process(): + try: + # 1. 从数据库获取所有分组 + conn = sqlite3.connect(DATABASE_PATH) + cursor = conn.cursor() + cursor.execute("SELECT DISTINCT groupid FROM words ORDER BY CAST(groupid AS INTEGER) ASC") + all_groups = [str(row[0]) for row in cursor.fetchall()] + conn.close() + + # 2. 从日志解析进度 + log_progress = get_progress_from_log() + + # 3. 模拟原有的 UI 显示逻辑 + results = [] + first_unstudied = None + for g in all_groups: + if g not in log_progress or not log_progress[g]['study']: + first_unstudied = g + break + + for g_name in all_groups: + p = log_progress.get(g_name, {'study': None, 'test': None, 'review1': None, 'review2': None, 'review3': None}) + + # 构建每一行数据 + row = {"group": f"Group {g_name}"} + + # 基础学习列 + if p['study']: + row['study'] = f"✔️ {p['study'][:10]}" + elif g_name == first_unstudied: + row['study'] = "✅请开始学习" + else: + row['study'] = "" + + # 单元测试列 + if p['test']: + row['test'] = f"✔️ {p['test'][:10]}" + elif p['study']: + row['test'] = "✅请开始测试" + else: + row['test'] = "" + + # 复习列 (Review1, 2, 3) + rk = ['review1', 'review2', 'review3'] + pk = ['test', 'review1', 'review2'] + + for i, key in enumerate(rk): + prev_key = pk[i] + if p[key]: + row[key] = f"✔️ {p[key][:10]}" + elif p[prev_key]: + hours = calculate_hours_since(p[prev_key]) + # 原逻辑:超过4小时显示“尽快复习”,否则显示“开始复习” + if hours and hours > 4: + row[key] = "⚠️请尽快复习" + else: + row[key] = "✅请开始复习" + else: + row[key] = "" + + results.append(ProgressData(**row)) + + return results + + except Exception as e: + import traceback + print(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + +@app.get("/") +async def root(): + return {"message": "English Lexicon API is running"} diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..0f22520 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,5 @@ +fastapi +uvicorn +pydantic +pillow +pandas \ No newline at end of file diff --git a/database.py b/database.py new file mode 100644 index 0000000..ec5e7c7 --- /dev/null +++ b/database.py @@ -0,0 +1,28 @@ +import sqlite3 +import os + +# 数据库文件的绝对路径 +DB_PATH = os.path.join(os.path.dirname(__file__), 's', 'studybase.db') + +def get_db_connection(): + """获取数据库连接,并将结果集设置为字典模式(方便前端调用)""" + conn = sqlite3.connect(DB_PATH) + # 这行代码能让你通过 row['column_name'] 访问数据,而不是 row[0] + conn.row_factory = sqlite3.Row + return conn + +def query_db(query, args=(), one=False): + """通用的查询函数""" + conn = get_db_connection() + cur = conn.execute(query, args) + rv = cur.fetchall() + conn.close() + return (rv[0] if rv else None) if one else rv + +def execute_db(query, args=()): + """通用的增删改函数""" + conn = get_db_connection() + cur = conn.execute(query, args) + conn.commit() + conn.close() + return cur diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/README.md b/frontend/README.md similarity index 100% rename from README.md rename to frontend/README.md diff --git a/package-lock.json b/frontend/package-lock.json similarity index 96% rename from package-lock.json rename to frontend/package-lock.json index e7b0b10..3fc3004 100644 --- a/package-lock.json +++ b/frontend/package-lock.json @@ -12,9 +12,13 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^13.5.0", - "react": "^19.2.6", - "react-dom": "^19.2.6", - "react-scripts": "5.0.1", + "axios": "^1.16.1", + "bootstrap": "^5.3.8", + "react": "^18.2.0", + "react-bootstrap": "^2.10.10", + "react-dom": "^18.2.0", + "react-router-dom": "^6.14.1", + "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" } }, @@ -40,6 +44,7 @@ "version": "7.29.0", "resolved": "http://mirrors.tencent.com/npm/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", @@ -137,7 +142,6 @@ "version": "7.29.1", "resolved": "http://mirrors.tencent.com/npm/@babel/generator/-/generator-7.29.1.tgz", "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", @@ -270,6 +274,7 @@ "version": "7.28.5", "resolved": "http://mirrors.tencent.com/npm/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" @@ -295,6 +300,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", @@ -323,7 +329,6 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -388,7 +393,6 @@ "version": "7.28.5", "resolved": "http://mirrors.tencent.com/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -397,6 +401,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -432,6 +437,7 @@ "version": "7.29.3", "resolved": "http://mirrors.tencent.com/npm/@babel/parser/-/parser-7.29.3.tgz", "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" }, @@ -462,6 +468,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -491,6 +498,7 @@ "version": "7.29.3", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz", "integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -506,6 +514,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -555,7 +564,6 @@ "version": "7.29.0", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", @@ -704,7 +712,6 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -749,7 +756,6 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -984,6 +990,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -998,6 +1005,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1044,6 +1052,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.28.6", @@ -1095,6 +1104,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" @@ -1186,6 +1196,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1216,6 +1227,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -1278,7 +1290,6 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1324,6 +1335,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" @@ -1372,6 +1384,7 @@ "version": "7.29.0", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" @@ -1402,6 +1415,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1416,6 +1430,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1465,6 +1480,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1526,7 +1542,6 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -1543,6 +1558,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1572,6 +1588,7 @@ "version": "7.28.0", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1586,6 +1603,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-module-imports": "^7.28.6", @@ -1635,6 +1653,7 @@ "version": "7.29.0", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, @@ -1649,6 +1668,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" @@ -1699,6 +1719,7 @@ "version": "0.13.0", "resolved": "http://mirrors.tencent.com/npm/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" @@ -1720,6 +1741,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1734,6 +1756,7 @@ "version": "7.28.6", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -1749,6 +1772,7 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1763,7 +1787,6 @@ "version": "7.27.1", "resolved": "http://mirrors.tencent.com/npm/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2021,6 +2044,7 @@ "version": "7.29.2", "resolved": "http://mirrors.tencent.com/npm/@babel/runtime/-/runtime-7.29.2.tgz", "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2043,6 +2067,7 @@ "version": "7.29.0", "resolved": "http://mirrors.tencent.com/npm/@babel/traverse/-/traverse-7.29.0.tgz", "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -2060,6 +2085,7 @@ "version": "7.29.0", "resolved": "http://mirrors.tencent.com/npm/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" @@ -2413,8 +2439,7 @@ "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "http://mirrors.tencent.com/npm/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.1", @@ -2472,6 +2497,33 @@ "deprecated": "Use @eslint/object-schema instead", "license": "BSD-3-Clause" }, + "node_modules/@internationalized/date": { + "version": "3.12.1", + "resolved": "http://mirrors.tencent.com/npm/@internationalized/date/-/date-3.12.1.tgz", + "integrity": "sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.6", + "resolved": "http://mirrors.tencent.com/npm/@internationalized/number/-/number-3.6.6.tgz", + "integrity": "sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/string": { + "version": "3.2.8", + "resolved": "http://mirrors.tencent.com/npm/@internationalized/string/-/string-3.2.8.tgz", + "integrity": "sha512-NdbMQUSfXLYIQol5VyMtinm9pZDciiMfN7RtmSuSB78io1hqwJ0naYfxyW6vgxWBkzWymQa/3uLDlbfmshtCaA==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "http://mirrors.tencent.com/npm/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2838,6 +2890,7 @@ "version": "0.3.31", "resolved": "http://mirrors.tencent.com/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2862,7 +2915,6 @@ "version": "5.1.1", "resolved": "http://mirrors.tencent.com/npm/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -2884,7 +2936,6 @@ "version": "2.1.5", "resolved": "http://mirrors.tencent.com/npm/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2897,6 +2948,7 @@ "version": "2.0.5", "resolved": "http://mirrors.tencent.com/npm/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -2905,6 +2957,7 @@ "version": "1.2.8", "resolved": "http://mirrors.tencent.com/npm/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2961,6 +3014,105 @@ } } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "http://mirrors.tencent.com/npm/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.10.0", + "resolved": "http://mirrors.tencent.com/npm/@react-aria/ssr/-/ssr-3.10.0.tgz", + "integrity": "sha512-mnelvACtfNWWKFCT1YHebxJRmfBmmANGwHQhCFPByMVTx1L8RumcaLxChYkE87g2KPuP5xX2il/oRn1DytW+qQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0", + "react-aria": "3.48.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.34.0", + "resolved": "http://mirrors.tencent.com/npm/@react-types/shared/-/shared-3.34.0.tgz", + "integrity": "sha512-gp6xo/s2lX54AlTjOiqwDnxA7UW79BNvI9dB9pr3LZTzRKCd1ZA+ZbgKw/ReIiWuvvVw/8QFJpnqeeFyLocMcQ==", + "license": "Apache-2.0", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "http://mirrors.tencent.com/npm/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "http://mirrors.tencent.com/npm/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.9.4", + "resolved": "http://mirrors.tencent.com/npm/@restart/ui/-/ui-1.9.4.tgz", + "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@popperjs/core": "^2.11.8", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.5.0", + "@types/warning": "^3.0.3", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.4", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/@restart/hooks": { + "version": "0.5.1", + "resolved": "http://mirrors.tencent.com/npm/@restart/hooks/-/hooks-0.5.1.tgz", + "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "http://mirrors.tencent.com/npm/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.14.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "http://mirrors.tencent.com/npm/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3309,6 +3461,15 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "http://mirrors.tencent.com/npm/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.1", "resolved": "http://mirrors.tencent.com/npm/@testing-library/dom/-/dom-10.4.1.tgz", @@ -3328,15 +3489,6 @@ "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "http://mirrors.tencent.com/npm/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", "resolved": "http://mirrors.tencent.com/npm/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", @@ -3627,7 +3779,6 @@ "version": "25.9.1", "resolved": "http://mirrors.tencent.com/npm/@types/node/-/node-25.9.1.tgz", "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", - "license": "MIT", "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } @@ -3653,6 +3804,12 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "license": "MIT" }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "http://mirrors.tencent.com/npm/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, "node_modules/@types/q": { "version": "1.5.8", "resolved": "http://mirrors.tencent.com/npm/@types/q/-/q-1.5.8.tgz", @@ -3671,6 +3828,24 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "http://mirrors.tencent.com/npm/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "http://mirrors.tencent.com/npm/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "http://mirrors.tencent.com/npm/@types/resolve/-/resolve-1.17.1.tgz", @@ -3752,6 +3927,12 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT" }, + "node_modules/@types/warning": { + "version": "3.0.4", + "resolved": "http://mirrors.tencent.com/npm/@types/warning/-/warning-3.0.4.tgz", + "integrity": "sha512-CqN8MnISMwQbLJXO3doBAV4Yw9hx9/Pyr2rZ78+NfaCnhyRA/nKrpyk6E7mKw17ZOaQdLpK9GiUjrqLzBlN3sg==", + "license": "MIT" + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "http://mirrors.tencent.com/npm/@types/ws/-/ws-8.18.1.tgz", @@ -3970,7 +4151,6 @@ "version": "5.1.1", "resolved": "http://mirrors.tencent.com/npm/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -4015,6 +4195,7 @@ "version": "1.14.1", "resolved": "http://mirrors.tencent.com/npm/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -4029,7 +4210,8 @@ "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "http://mirrors.tencent.com/npm/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", @@ -4069,7 +4251,6 @@ "version": "1.13.2", "resolved": "http://mirrors.tencent.com/npm/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4078,7 +4259,6 @@ "version": "1.13.2", "resolved": "http://mirrors.tencent.com/npm/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -4093,6 +4273,7 @@ "version": "1.14.1", "resolved": "http://mirrors.tencent.com/npm/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -4147,6 +4328,7 @@ "version": "1.14.1", "resolved": "http://mirrors.tencent.com/npm/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -4197,6 +4379,7 @@ "version": "8.16.0", "resolved": "http://mirrors.tencent.com/npm/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4218,6 +4401,7 @@ "version": "7.4.1", "resolved": "http://mirrors.tencent.com/npm/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4341,7 +4525,8 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -4412,14 +4597,12 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "version": "5.2.0", + "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -4454,18 +4637,29 @@ "version": "1.0.10", "resolved": "http://mirrors.tencent.com/npm/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "http://mirrors.tencent.com/npm/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "http://mirrors.tencent.com/npm/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "version": "5.3.0", + "resolved": "http://mirrors.tencent.com/npm/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -4640,6 +4834,7 @@ "version": "1.0.4", "resolved": "http://mirrors.tencent.com/npm/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -4678,6 +4873,7 @@ "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4737,7 +4933,6 @@ "version": "1.0.7", "resolved": "http://mirrors.tencent.com/npm/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4757,6 +4952,18 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "http://mirrors.tencent.com/npm/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "http://mirrors.tencent.com/npm/axobject-query/-/axobject-query-4.1.0.tgz", @@ -4884,6 +5091,7 @@ "version": "0.4.17", "resolved": "http://mirrors.tencent.com/npm/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-define-polyfill-provider": "^0.6.8", @@ -4906,6 +5114,7 @@ "version": "0.14.2", "resolved": "http://mirrors.tencent.com/npm/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.8", "core-js-compat": "^3.48.0" @@ -5062,6 +5271,7 @@ "version": "5.2.2", "resolved": "http://mirrors.tencent.com/npm/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { "node": "*" } @@ -5148,8 +5358,26 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "http://mirrors.tencent.com/npm/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } }, "node_modules/brace-expansion": { "version": "1.1.14", @@ -5165,6 +5393,7 @@ "version": "3.0.3", "resolved": "http://mirrors.tencent.com/npm/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -5282,6 +5511,7 @@ "version": "1.0.4", "resolved": "http://mirrors.tencent.com/npm/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -5306,6 +5536,7 @@ "version": "4.1.2", "resolved": "http://mirrors.tencent.com/npm/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -5389,6 +5620,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "http://mirrors.tencent.com/npm/char-regex/-/char-regex-1.0.2.tgz", @@ -5444,6 +5690,7 @@ "version": "1.0.4", "resolved": "http://mirrors.tencent.com/npm/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", "engines": { "node": ">=6.0" } @@ -5469,11 +5716,16 @@ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "license": "MIT" }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "http://mirrors.tencent.com/npm/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "http://mirrors.tencent.com/npm/clean-css/-/clean-css-5.3.3.tgz", "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -5500,6 +5752,15 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "http://mirrors.tencent.com/npm/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "http://mirrors.tencent.com/npm/co/-/co-4.6.0.tgz", @@ -5528,6 +5789,7 @@ "version": "3.2.1", "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -6001,6 +6263,7 @@ "version": "4.3.0", "resolved": "http://mirrors.tencent.com/npm/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -6044,6 +6307,7 @@ "version": "6.2.2", "resolved": "http://mirrors.tencent.com/npm/css-what/-/css-what-6.2.2.tgz", "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6077,7 +6341,6 @@ "version": "3.0.0", "resolved": "http://mirrors.tencent.com/npm/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -6225,6 +6488,11 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "license": "MIT" }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "http://mirrors.tencent.com/npm/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "http://mirrors.tencent.com/npm/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -6314,7 +6582,8 @@ "node_modules/decimal.js": { "version": "10.6.0", "resolved": "http://mirrors.tencent.com/npm/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" }, "node_modules/dedent": { "version": "0.7.0", @@ -6378,6 +6647,7 @@ "version": "1.2.1", "resolved": "http://mirrors.tencent.com/npm/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -6493,6 +6763,7 @@ "version": "3.0.1", "resolved": "http://mirrors.tencent.com/npm/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -6545,6 +6816,16 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "http://mirrors.tencent.com/npm/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "http://mirrors.tencent.com/npm/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -6597,6 +6878,7 @@ "version": "4.3.1", "resolved": "http://mirrors.tencent.com/npm/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -6650,6 +6932,7 @@ "version": "1.0.1", "resolved": "http://mirrors.tencent.com/npm/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -6714,6 +6997,7 @@ "version": "3.0.0", "resolved": "http://mirrors.tencent.com/npm/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -6731,7 +7015,6 @@ "version": "5.22.0", "resolved": "http://mirrors.tencent.com/npm/enhanced-resolve/-/enhanced-resolve-5.22.0.tgz", "integrity": "sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" @@ -6744,7 +7027,6 @@ "version": "2.2.0", "resolved": "http://mirrors.tencent.com/npm/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -6853,6 +7135,7 @@ "version": "1.3.0", "resolved": "http://mirrors.tencent.com/npm/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6932,6 +7215,7 @@ "version": "1.3.0", "resolved": "http://mirrors.tencent.com/npm/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -7287,6 +7571,15 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "http://mirrors.tencent.com/npm/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "http://mirrors.tencent.com/npm/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -7394,7 +7687,6 @@ "version": "7.2.2", "resolved": "http://mirrors.tencent.com/npm/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7474,8 +7766,7 @@ "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "http://mirrors.tencent.com/npm/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", @@ -7509,7 +7800,6 @@ "version": "6.0.0", "resolved": "http://mirrors.tencent.com/npm/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -7623,7 +7913,6 @@ "version": "2.0.3", "resolved": "http://mirrors.tencent.com/npm/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -7768,6 +8057,7 @@ "version": "3.3.3", "resolved": "http://mirrors.tencent.com/npm/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -8166,15 +8456,16 @@ } }, "node_modules/form-data": { - "version": "3.0.4", - "resolved": "http://mirrors.tencent.com/npm/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "version": "4.0.5", + "resolved": "http://mirrors.tencent.com/npm/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", - "mime-types": "^2.1.35" + "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" @@ -8301,6 +8592,7 @@ "version": "1.0.0-beta.2", "resolved": "http://mirrors.tencent.com/npm/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -8309,6 +8601,7 @@ "version": "2.0.5", "resolved": "http://mirrors.tencent.com/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -8381,6 +8674,7 @@ "version": "1.1.0", "resolved": "http://mirrors.tencent.com/npm/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -8397,7 +8691,7 @@ "version": "7.2.3", "resolved": "http://mirrors.tencent.com/npm/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -8429,7 +8723,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "http://mirrors.tencent.com/npm/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/global-modules": { "version": "2.0.0", @@ -8535,7 +8830,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "http://mirrors.tencent.com/npm/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", @@ -8594,6 +8890,7 @@ "version": "1.0.2", "resolved": "http://mirrors.tencent.com/npm/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -8620,6 +8917,7 @@ "version": "1.1.0", "resolved": "http://mirrors.tencent.com/npm/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8658,6 +8956,7 @@ "version": "1.2.0", "resolved": "http://mirrors.tencent.com/npm/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } @@ -8686,7 +8985,8 @@ "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -8706,8 +9006,7 @@ "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "http://mirrors.tencent.com/npm/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", @@ -8756,6 +9055,7 @@ "version": "6.1.0", "resolved": "http://mirrors.tencent.com/npm/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -9019,6 +9319,7 @@ "version": "3.2.0", "resolved": "http://mirrors.tencent.com/npm/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -9037,6 +9338,7 @@ "version": "0.1.4", "resolved": "http://mirrors.tencent.com/npm/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -9045,7 +9347,6 @@ "version": "4.0.0", "resolved": "http://mirrors.tencent.com/npm/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", "engines": { "node": ">=8" } @@ -9055,6 +9356,7 @@ "resolved": "http://mirrors.tencent.com/npm/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9069,12 +9371,14 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "http://mirrors.tencent.com/npm/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "http://mirrors.tencent.com/npm/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -9084,6 +9388,15 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "http://mirrors.tencent.com/npm/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ipaddr.js": { "version": "2.4.0", "resolved": "http://mirrors.tencent.com/npm/ipaddr.js/-/ipaddr.js-2.4.0.tgz", @@ -9120,7 +9433,6 @@ "version": "2.1.1", "resolved": "http://mirrors.tencent.com/npm/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", @@ -9154,6 +9466,7 @@ "version": "2.1.0", "resolved": "http://mirrors.tencent.com/npm/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -9193,7 +9506,6 @@ "version": "2.16.2", "resolved": "http://mirrors.tencent.com/npm/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "license": "MIT", "dependencies": { "hasown": "^2.0.3" }, @@ -9265,6 +9577,7 @@ "version": "1.1.1", "resolved": "http://mirrors.tencent.com/npm/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -9297,7 +9610,6 @@ "version": "1.1.2", "resolved": "http://mirrors.tencent.com/npm/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", @@ -9316,6 +9628,7 @@ "version": "4.0.3", "resolved": "http://mirrors.tencent.com/npm/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -9327,7 +9640,6 @@ "version": "2.0.3", "resolved": "http://mirrors.tencent.com/npm/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9345,6 +9657,7 @@ "version": "2.0.3", "resolved": "http://mirrors.tencent.com/npm/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9399,7 +9712,6 @@ "version": "3.0.0", "resolved": "http://mirrors.tencent.com/npm/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -9492,6 +9804,7 @@ "version": "1.1.1", "resolved": "http://mirrors.tencent.com/npm/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9557,7 +9870,6 @@ "version": "1.1.1", "resolved": "http://mirrors.tencent.com/npm/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -9588,7 +9900,6 @@ "version": "2.2.0", "resolved": "http://mirrors.tencent.com/npm/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -9599,12 +9910,14 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "http://mirrors.tencent.com/npm/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "http://mirrors.tencent.com/npm/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -9846,7 +10159,6 @@ "version": "27.5.1", "resolved": "http://mirrors.tencent.com/npm/jest-config/-/jest-config-27.5.1.tgz", "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "license": "MIT", "dependencies": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", @@ -10380,17 +10692,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-watch-typeahead/node_modules/emittery": { "version": "0.10.2", "resolved": "http://mirrors.tencent.com/npm/emittery/-/emittery-0.10.2.tgz", @@ -10705,10 +11006,27 @@ } } }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.4", + "resolved": "http://mirrors.tencent.com/npm/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "http://mirrors.tencent.com/npm/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -10731,7 +11049,8 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "http://mirrors.tencent.com/npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -10743,7 +11062,6 @@ "version": "2.2.3", "resolved": "http://mirrors.tencent.com/npm/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -10841,6 +11159,7 @@ "version": "2.0.6", "resolved": "http://mirrors.tencent.com/npm/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -10914,6 +11233,7 @@ "version": "4.3.2", "resolved": "http://mirrors.tencent.com/npm/loader-runner/-/loader-runner-4.3.2.tgz", "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "license": "MIT", "engines": { "node": ">=6.11.5" }, @@ -10926,7 +11246,6 @@ "version": "2.0.4", "resolved": "http://mirrors.tencent.com/npm/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -10940,7 +11259,6 @@ "version": "5.0.0", "resolved": "http://mirrors.tencent.com/npm/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -10999,7 +11317,6 @@ "version": "2.0.2", "resolved": "http://mirrors.tencent.com/npm/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -11008,6 +11325,7 @@ "version": "5.1.1", "resolved": "http://mirrors.tencent.com/npm/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -11118,6 +11436,7 @@ "version": "1.4.1", "resolved": "http://mirrors.tencent.com/npm/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -11236,6 +11555,7 @@ "version": "1.2.8", "resolved": "http://mirrors.tencent.com/npm/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11324,7 +11644,8 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "http://mirrors.tencent.com/npm/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", @@ -11390,6 +11711,7 @@ "version": "3.0.0", "resolved": "http://mirrors.tencent.com/npm/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11398,7 +11720,6 @@ "version": "6.1.0", "resolved": "http://mirrors.tencent.com/npm/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -11422,7 +11743,6 @@ "version": "2.1.1", "resolved": "http://mirrors.tencent.com/npm/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -11457,6 +11777,7 @@ "version": "1.13.4", "resolved": "http://mirrors.tencent.com/npm/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11477,6 +11798,7 @@ "version": "4.1.7", "resolved": "http://mirrors.tencent.com/npm/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -11529,7 +11851,6 @@ "version": "2.1.9", "resolved": "http://mirrors.tencent.com/npm/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz", "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==", - "license": "MIT", "dependencies": { "array.prototype.reduce": "^1.0.8", "call-bind": "^1.0.8", @@ -11816,6 +12137,7 @@ "version": "3.1.1", "resolved": "http://mirrors.tencent.com/npm/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -11823,7 +12145,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "http://mirrors.tencent.com/npm/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "0.1.13", @@ -11835,7 +12158,6 @@ "version": "4.0.0", "resolved": "http://mirrors.tencent.com/npm/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -11867,7 +12189,6 @@ "version": "2.3.0", "resolved": "http://mirrors.tencent.com/npm/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11885,7 +12206,6 @@ "version": "4.2.0", "resolved": "http://mirrors.tencent.com/npm/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -11921,7 +12241,6 @@ "version": "3.0.0", "resolved": "http://mirrors.tencent.com/npm/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -11955,6 +12274,7 @@ "version": "1.1.0", "resolved": "http://mirrors.tencent.com/npm/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -12420,7 +12740,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -12599,6 +12918,7 @@ "version": "3.1.0", "resolved": "http://mirrors.tencent.com/npm/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -12626,6 +12946,7 @@ "version": "7.1.1", "resolved": "http://mirrors.tencent.com/npm/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -12638,6 +12959,7 @@ "version": "3.2.1", "resolved": "http://mirrors.tencent.com/npm/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" }, @@ -12652,6 +12974,7 @@ "version": "7.1.1", "resolved": "http://mirrors.tencent.com/npm/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -12664,6 +12987,7 @@ "version": "4.0.0", "resolved": "http://mirrors.tencent.com/npm/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -13105,6 +13429,7 @@ "version": "6.1.2", "resolved": "http://mirrors.tencent.com/npm/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13241,6 +13566,7 @@ "version": "4.0.0", "resolved": "http://mirrors.tencent.com/npm/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -13260,17 +13586,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "http://mirrors.tencent.com/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -13310,6 +13625,25 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "http://mirrors.tencent.com/npm/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "http://mirrors.tencent.com/npm/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "http://mirrors.tencent.com/npm/react-is/-/react-is-16.13.1.tgz", @@ -13338,6 +13672,15 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "http://mirrors.tencent.com/npm/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/psl": { "version": "1.15.0", "resolved": "http://mirrors.tencent.com/npm/psl/-/psl-1.15.0.tgz", @@ -13354,6 +13697,7 @@ "version": "2.3.1", "resolved": "http://mirrors.tencent.com/npm/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -13407,7 +13751,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/raf": { "version": "3.4.1", @@ -13464,10 +13809,13 @@ } }, "node_modules/react": { - "version": "19.2.6", - "resolved": "http://mirrors.tencent.com/npm/react/-/react-19.2.6.tgz", - "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "version": "18.3.1", + "resolved": "http://mirrors.tencent.com/npm/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } @@ -13489,6 +13837,58 @@ "node": ">=14" } }, + "node_modules/react-aria": { + "version": "3.48.0", + "resolved": "http://mirrors.tencent.com/npm/react-aria/-/react-aria-3.48.0.tgz", + "integrity": "sha512-jQjd4rBEIMqecBaAKYJbVGK6EqIHLa5znVQ7jwFyK5vCyljoj6KhgtiahmcIPsG5vG5vEDLw+ba+bEWn6A2P4w==", + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.1", + "@internationalized/number": "^3.6.6", + "@internationalized/string": "^3.2.8", + "@react-types/shared": "^3.34.0", + "@swc/helpers": "^0.5.0", + "aria-hidden": "^1.2.3", + "clsx": "^2.0.0", + "react-stately": "3.46.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/react-bootstrap": { + "version": "2.10.10", + "resolved": "http://mirrors.tencent.com/npm/react-bootstrap/-/react-bootstrap-2.10.10.tgz", + "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.9.4", + "@types/prop-types": "^15.7.12", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "http://mirrors.tencent.com/npm/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -13544,7 +13944,6 @@ "version": "3.3.1", "resolved": "http://mirrors.tencent.com/npm/loader-utils/-/loader-utils-3.3.1.tgz", "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -13553,7 +13952,6 @@ "version": "6.0.0", "resolved": "http://mirrors.tencent.com/npm/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -13595,15 +13993,16 @@ } }, "node_modules/react-dom": { - "version": "19.2.6", - "resolved": "http://mirrors.tencent.com/npm/react-dom/-/react-dom-19.2.6.tgz", - "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "version": "18.3.1", + "resolved": "http://mirrors.tencent.com/npm/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^19.2.6" + "react": "^18.3.1" } }, "node_modules/react-error-overlay": { @@ -13618,6 +14017,12 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "license": "MIT" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "http://mirrors.tencent.com/npm/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "http://mirrors.tencent.com/npm/react-refresh/-/react-refresh-0.11.0.tgz", @@ -13627,6 +14032,38 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "http://mirrors.tencent.com/npm/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "http://mirrors.tencent.com/npm/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "http://mirrors.tencent.com/npm/react-scripts/-/react-scripts-5.0.1.tgz", @@ -13700,6 +14137,39 @@ } } }, + "node_modules/react-stately": { + "version": "3.46.0", + "resolved": "http://mirrors.tencent.com/npm/react-stately/-/react-stately-3.46.0.tgz", + "integrity": "sha512-OdxhWvHgs2L4OJGIs7hnuTr5WjjMM6enhNEAMRqiekhF8+ITvA2LRwNftOZwcogaoCslGYq5S2VQTQwnm0GbCA==", + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.1", + "@internationalized/number": "^3.6.6", + "@internationalized/string": "^3.2.8", + "@react-types/shared": "^3.34.0", + "@swc/helpers": "^0.5.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "http://mirrors.tencent.com/npm/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/read-cache/-/read-cache-1.0.0.tgz", @@ -13727,7 +14197,6 @@ "version": "3.6.0", "resolved": "http://mirrors.tencent.com/npm/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -13792,7 +14261,6 @@ "version": "10.2.2", "resolved": "http://mirrors.tencent.com/npm/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -13803,8 +14271,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "http://mirrors.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regex-parser": { "version": "2.3.1", @@ -13816,7 +14283,6 @@ "version": "1.5.4", "resolved": "http://mirrors.tencent.com/npm/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -13852,7 +14318,8 @@ "node_modules/regjsgen": { "version": "0.8.0", "resolved": "http://mirrors.tencent.com/npm/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" }, "node_modules/regjsparser": { "version": "0.13.1", @@ -13936,6 +14403,7 @@ "version": "3.0.0", "resolved": "http://mirrors.tencent.com/npm/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -14049,7 +14517,6 @@ "resolved": "http://mirrors.tencent.com/npm/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -14141,6 +14608,7 @@ "version": "1.1.4", "resolved": "http://mirrors.tencent.com/npm/safe-array-concat/-/safe-array-concat-1.1.4.tgz", "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", @@ -14172,13 +14640,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" @@ -14223,6 +14691,7 @@ "version": "12.6.0", "resolved": "http://mirrors.tencent.com/npm/sass-loader/-/sass-loader-12.6.0.tgz", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -14274,10 +14743,13 @@ } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "http://mirrors.tencent.com/npm/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "version": "0.23.2", + "resolved": "http://mirrors.tencent.com/npm/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -14329,7 +14801,8 @@ "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", @@ -14517,6 +14990,7 @@ "version": "2.0.2", "resolved": "http://mirrors.tencent.com/npm/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -14531,6 +15005,7 @@ "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", @@ -14685,8 +15160,7 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "http://mirrors.tencent.com/npm/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "license": "MIT" + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.7.6", @@ -14701,6 +15175,7 @@ "version": "1.2.1", "resolved": "http://mirrors.tencent.com/npm/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -14882,7 +15357,6 @@ "version": "4.2.3", "resolved": "http://mirrors.tencent.com/npm/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14953,6 +15427,7 @@ "version": "1.2.10", "resolved": "http://mirrors.tencent.com/npm/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -14973,6 +15448,7 @@ "version": "1.0.9", "resolved": "http://mirrors.tencent.com/npm/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -14990,6 +15466,7 @@ "version": "1.0.8", "resolved": "http://mirrors.tencent.com/npm/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -15217,6 +15694,7 @@ "version": "3.2.1", "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -15257,6 +15735,7 @@ "version": "2.1.0", "resolved": "http://mirrors.tencent.com/npm/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -15268,6 +15747,7 @@ "version": "3.4.2", "resolved": "http://mirrors.tencent.com/npm/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -15322,7 +15802,6 @@ "version": "1.0.2", "resolved": "http://mirrors.tencent.com/npm/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "~1.0.0" } @@ -15408,7 +15887,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "lilconfig": "^3.1.1" }, @@ -15542,6 +16020,7 @@ "version": "5.6.0", "resolved": "http://mirrors.tencent.com/npm/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz", "integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -15792,7 +16271,6 @@ "version": "1.0.2", "resolved": "http://mirrors.tencent.com/npm/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -15900,6 +16378,7 @@ "version": "1.0.3", "resolved": "http://mirrors.tencent.com/npm/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -15918,7 +16397,6 @@ "version": "1.0.4", "resolved": "http://mirrors.tencent.com/npm/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -15965,9 +16443,9 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "http://mirrors.tencent.com/npm/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "6.0.3", + "resolved": "http://mirrors.tencent.com/npm/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "license": "Apache-2.0", "peer": true, "bin": { @@ -15975,7 +16453,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -15996,6 +16474,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "http://mirrors.tencent.com/npm/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/underscore": { "version": "1.13.6", "resolved": "http://mirrors.tencent.com/npm/underscore/-/underscore-1.13.6.tgz", @@ -16005,8 +16498,7 @@ "node_modules/undici-types": { "version": "7.24.6", "resolved": "http://mirrors.tencent.com/npm/undici-types/-/undici-types-7.24.6.tgz", - "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", - "license": "MIT" + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", @@ -16042,7 +16534,6 @@ "version": "2.2.0", "resolved": "http://mirrors.tencent.com/npm/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -16087,6 +16578,7 @@ "version": "1.2.0", "resolved": "http://mirrors.tencent.com/npm/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", "engines": { "node": ">=4", "yarn": "*" @@ -16141,6 +16633,15 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "http://mirrors.tencent.com/npm/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "http://mirrors.tencent.com/npm/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16165,8 +16666,7 @@ "node_modules/utila": { "version": "0.4.0", "resolved": "http://mirrors.tencent.com/npm/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -16245,10 +16745,20 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "http://mirrors.tencent.com/npm/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.5.1", "resolved": "http://mirrors.tencent.com/npm/watchpack/-/watchpack-2.5.1.tgz", "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16413,6 +16923,7 @@ "version": "8.21.0", "resolved": "http://mirrors.tencent.com/npm/ws/-/ws-8.21.0.tgz", "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -16480,7 +16991,6 @@ "version": "5.1.1", "resolved": "http://mirrors.tencent.com/npm/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -16596,6 +17106,7 @@ "version": "1.1.1", "resolved": "http://mirrors.tencent.com/npm/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -16614,6 +17125,7 @@ "version": "1.2.1", "resolved": "http://mirrors.tencent.com/npm/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -16801,7 +17313,8 @@ "node_modules/workbox-build/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "http://mirrors.tencent.com/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", @@ -17023,6 +17536,21 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "http://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "http://mirrors.tencent.com/npm/wrappy/-/wrappy-1.0.2.tgz", @@ -17045,6 +17573,7 @@ "version": "7.5.11", "resolved": "http://mirrors.tencent.com/npm/ws/-/ws-7.5.11.tgz", "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -17085,7 +17614,8 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "http://mirrors.tencent.com/npm/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.3", @@ -17100,6 +17630,7 @@ "version": "16.2.0", "resolved": "http://mirrors.tencent.com/npm/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -17117,7 +17648,6 @@ "version": "20.2.9", "resolved": "http://mirrors.tencent.com/npm/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", "engines": { "node": ">=10" } diff --git a/package.json b/frontend/package.json similarity index 78% rename from package.json rename to frontend/package.json index 09f5ce9..5d481bf 100644 --- a/package.json +++ b/frontend/package.json @@ -7,9 +7,13 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^13.5.0", - "react": "^19.2.6", - "react-dom": "^19.2.6", - "react-scripts": "5.0.1", + "axios": "^1.16.1", + "bootstrap": "^5.3.8", + "react": "^18.2.0", + "react-bootstrap": "^2.10.10", + "react-dom": "^18.2.0", + "react-router-dom": "^6.14.1", + "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/frontend/package.json.save b/frontend/package.json.save new file mode 100644 index 0000000..5d481bf --- /dev/null +++ b/frontend/package.json.save @@ -0,0 +1,43 @@ +{ + "name": "words", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^13.5.0", + "axios": "^1.16.1", + "bootstrap": "^5.3.8", + "react": "^18.2.0", + "react-bootstrap": "^2.10.10", + "react-dom": "^18.2.0", + "react-router-dom": "^6.14.1", + "react-scripts": "^5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/public/favicon.ico b/frontend/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to frontend/public/favicon.ico diff --git a/public/index.html b/frontend/public/index.html similarity index 100% rename from public/index.html rename to frontend/public/index.html diff --git a/public/logo192.png b/frontend/public/logo192.png similarity index 100% rename from public/logo192.png rename to frontend/public/logo192.png diff --git a/public/logo512.png b/frontend/public/logo512.png similarity index 100% rename from public/logo512.png rename to frontend/public/logo512.png diff --git a/public/manifest.json b/frontend/public/manifest.json similarity index 100% rename from public/manifest.json rename to frontend/public/manifest.json diff --git a/public/robots.txt b/frontend/public/robots.txt similarity index 100% rename from public/robots.txt rename to frontend/public/robots.txt diff --git a/src/App.css b/frontend/src/App.css similarity index 100% rename from src/App.css rename to frontend/src/App.css diff --git a/frontend/src/App.js b/frontend/src/App.js new file mode 100644 index 0000000..443473f --- /dev/null +++ b/frontend/src/App.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import Home from './components/Home'; +import UploadPicture from './components/UploadPicture'; + +function App() { + return ( + + + } /> + } /> + + + ); +} + +export default App; diff --git a/src/App.test.js b/frontend/src/App.test.js similarity index 100% rename from src/App.test.js rename to frontend/src/App.test.js diff --git a/frontend/src/components/Home.css b/frontend/src/components/Home.css new file mode 100644 index 0000000..842caf4 --- /dev/null +++ b/frontend/src/components/Home.css @@ -0,0 +1,91 @@ +.main-app { + background-color: #fdfdfd; + min-height: 100vh; + padding: 40px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +.header { + text-align: center; + margin-bottom: 20px; +} + +.header h1 { + font-size: 28px; + color: #2c3e50; + margin-bottom: 5px; +} + +.stats-info { + color: #7f8c8d; + font-size: 14px; +} + +.action-bar { + display: flex; + justify-content: center; + margin-bottom: 20px; +} + +.toggle-btn { + background: white; + border: 1px solid #dee2e6; + padding: 8px 20px; + color: #6c757d; + cursor: pointer; + border-radius: 4px; +} + +.table-container { + background: white; + box-shadow: 0 1px 3px rgba(0,0,0,0.1); + border-radius: 4px; + overflow: hidden; +} + +.progress-table { + width: 100%; + border-collapse: collapse; +} + +.progress-table th { + background-color: #f1f3f5; + color: #495057; + padding: 15px; + font-weight: bold; + border-bottom: 1px solid #dee2e6; +} + +.progress-table td { + padding: 15px; + text-align: center; + border-bottom: 1px solid #f8f9fa; + height: 55px; +} + +.group-name { + font-weight: bold; + color: #2c3e50; +} + +/* 状态颜色映射 */ +.status-done { color: #28a745; } +.status-start { color: #007bff; font-weight: bold; } +.status-warning { color: #dc3545; font-weight: bold; } + +.footer { + display: flex; + justify-content: center; + margin-top: 40px; +} + +.error-correction-btn { + background-color: #f8d7da; + color: #721c24; + border: none; + padding: 15px 50px; + font-size: 18px; + font-weight: bold; + border-radius: 4px; + cursor: pointer; +} diff --git a/frontend/src/components/Home.js b/frontend/src/components/Home.js new file mode 100644 index 0000000..06cdfe5 --- /dev/null +++ b/frontend/src/components/Home.js @@ -0,0 +1,96 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; +import './Home.css'; // 我们稍后创建这个样式文件 + +function Home() { + const [progressData, setProgressData] = useState([]); + const [showAll, setShowAll] = useState(false); + const [stats, setStats] = useState({ pictures_count: 0, words_count: 0 }); + + // 获取统计数据和进度数据 + const fetchData = async () => { + try { + const resStats = await axios.get('http://124.222.157.124:1060/api/home'); + setStats(resStats.data); + + const resProcess = await axios.get('http://124.222.157.124:1060/api/home/process'); + setProgressData(resProcess.data); + } catch (error) { + console.error("获取数据失败:", error); + } + }; + + useEffect(() => { + fetchData(); + const timer = setInterval(fetchData, 30000); // 30秒自动刷新 + return () => clearInterval(timer); + }, []); + + // 过滤逻辑:模拟 Python 中的 toggle_show_all_groups + const filteredData = progressData.filter(item => { + if (showAll) return true; + // 检查是否所有环节都已完成(包含 ✔️) + const isDone = [item.study, item.test, item.review1, item.review2, item.review3] + .every(val => val && val.includes('✔️')); + return !isDone; + }); + + // 根据后端返回的文本内容决定样式类 + const getStatusClass = (text) => { + if (!text) return ''; + if (text.includes('✔️')) return 'status-done'; + if (text.includes('✅')) return 'status-start'; + if (text.includes('⚠️')) return 'status-warning'; + return ''; + }; + + return ( +
+
+

单词学习进度记录

+

+ 图片总数: {stats.pictures_count} | 单词总数: {stats.words_count} +

+
+ +
+ +
+ +
+ + + + + + + + + + + + + {filteredData.map((item, index) => ( + + + + + + + + + ))} + +
组别基础学习单元测试复习 I复习 II复习 III
{item.group}{item.study}{item.test}{item.review1}{item.review2}{item.review3}
+
+ +
+ +
+
+ ); +} + +export default Home; diff --git a/frontend/src/components/UploadPicture.js b/frontend/src/components/UploadPicture.js new file mode 100644 index 0000000..48cb6f3 --- /dev/null +++ b/frontend/src/components/UploadPicture.js @@ -0,0 +1,36 @@ +import React, { useState } from 'react'; +import axios from 'axios'; + +function UploadPicture() { + const [file, setFile] = useState(null); + + const handleFileChange = (e) => { + setFile(e.target.files[0]); + }; + + const handleUpload = async () => { + const formData = new FormData(); + formData.append('file', file); + + try { + await axios.post('http://127.0.0.1:1060/api/picture/', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + alert('Picture uploaded successfully!'); + } catch (error) { + alert('Error uploading picture: ' + error.message); + } + }; + + return ( +
+

Upload Picture

+ + +
+ ); +} + +export default UploadPicture; diff --git a/frontend/src/home.js b/frontend/src/home.js new file mode 100644 index 0000000..06cdfe5 --- /dev/null +++ b/frontend/src/home.js @@ -0,0 +1,96 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; +import './Home.css'; // 我们稍后创建这个样式文件 + +function Home() { + const [progressData, setProgressData] = useState([]); + const [showAll, setShowAll] = useState(false); + const [stats, setStats] = useState({ pictures_count: 0, words_count: 0 }); + + // 获取统计数据和进度数据 + const fetchData = async () => { + try { + const resStats = await axios.get('http://124.222.157.124:1060/api/home'); + setStats(resStats.data); + + const resProcess = await axios.get('http://124.222.157.124:1060/api/home/process'); + setProgressData(resProcess.data); + } catch (error) { + console.error("获取数据失败:", error); + } + }; + + useEffect(() => { + fetchData(); + const timer = setInterval(fetchData, 30000); // 30秒自动刷新 + return () => clearInterval(timer); + }, []); + + // 过滤逻辑:模拟 Python 中的 toggle_show_all_groups + const filteredData = progressData.filter(item => { + if (showAll) return true; + // 检查是否所有环节都已完成(包含 ✔️) + const isDone = [item.study, item.test, item.review1, item.review2, item.review3] + .every(val => val && val.includes('✔️')); + return !isDone; + }); + + // 根据后端返回的文本内容决定样式类 + const getStatusClass = (text) => { + if (!text) return ''; + if (text.includes('✔️')) return 'status-done'; + if (text.includes('✅')) return 'status-start'; + if (text.includes('⚠️')) return 'status-warning'; + return ''; + }; + + return ( +
+
+

单词学习进度记录

+

+ 图片总数: {stats.pictures_count} | 单词总数: {stats.words_count} +

+
+ +
+ +
+ +
+ + + + + + + + + + + + + {filteredData.map((item, index) => ( + + + + + + + + + ))} + +
组别基础学习单元测试复习 I复习 II复习 III
{item.group}{item.study}{item.test}{item.review1}{item.review2}{item.review3}
+
+ +
+ +
+
+ ); +} + +export default Home; diff --git a/src/index.css b/frontend/src/index.css similarity index 100% rename from src/index.css rename to frontend/src/index.css diff --git a/src/index.js b/frontend/src/index.js similarity index 100% rename from src/index.js rename to frontend/src/index.js diff --git a/src/logo.svg b/frontend/src/logo.svg similarity index 100% rename from src/logo.svg rename to frontend/src/logo.svg diff --git a/src/reportWebVitals.js b/frontend/src/reportWebVitals.js similarity index 100% rename from src/reportWebVitals.js rename to frontend/src/reportWebVitals.js diff --git a/src/setupTests.js b/frontend/src/setupTests.js similarity index 100% rename from src/setupTests.js rename to frontend/src/setupTests.js diff --git a/generate_report.py b/generate_report.py new file mode 100644 index 0000000..b7eb157 --- /dev/null +++ b/generate_report.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import sys +import io + +# ================= 配置区域 ================= +# 输出文件名 +OUTPUT_FILENAME = "project_all_in_one.txt" + +# 需要排除的目录名(完全匹配),例如:['.git','gitea', 'node_modules', 'ZZ Old Version'] +EXCLUDE_DIRS = {".git", "__pycache__", "ZZ Old Version", "Media","node_modules","venv","static"} + +# 需要排除的文件后缀(不区分大小写),例如:['.exe', '.pyc', '.png', '.jpg'] +EXCLUDE_EXTS = {".exe", ".pyc", ".png", ".jpg", ".jpeg", ".gif", ".pdf", ".zip", ".tar", ".gz"} + +# 需要排除的具体文件名 +EXCLUDE_FILES = {OUTPUT_FILENAME, ".DS_Store", "gitea","README.md"} +# =========================================== + +ROOT_DIR = os.path.abspath(os.path.dirname(__file__)) + +def write_line(f, line=""): + f.write(line + "\n") + +def should_exclude(path): + """检查路径中是否包含任何被排除的目录""" + parts = path.split(os.sep) + for d in EXCLUDE_DIRS: + if d in parts: + return True + return False + +def collect_tree(root): + """生成目录结构树""" + lines = [] + for dirpath, dirnames, filenames in os.walk(root): + # 过滤掉排除目录,修改 dirnames 会影响 os.walk 的后续遍历 + dirnames[:] = [d for d in dirnames if d not in EXCLUDE_DIRS] + + rel = os.path.relpath(dirpath, root) + if rel == ".": + indent_level = 0 + display_path = "." + else: + indent_level = rel.count(os.sep) + 1 + display_path = rel.replace(os.sep, "/") + + indent = " " * indent_level + lines.append(f"{indent}{display_path}/") + + for fn in sorted(filenames): + if fn in EXCLUDE_FILES: + continue + _, ext = os.path.splitext(fn) + if ext.lower() in EXCLUDE_EXTS: + continue + lines.append(f"{indent} {fn}") + return lines + +def gather_all_files(root): + """收集所有符合条件的文件路径""" + matches = [] + for dirpath, dirnames, filenames in os.walk(root): + # 过滤排除目录 + dirnames[:] = [d for d in dirnames if d not in EXCLUDE_DIRS] + + for fn in filenames: + # 过滤排除的文件名和后缀 + if fn in EXCLUDE_FILES: + continue + _, ext = os.path.splitext(fn) + if ext.lower() in EXCLUDE_EXTS: + continue + + full_path = os.path.join(dirpath, fn) + rel_path = os.path.relpath(full_path, root).replace(os.sep, "/") + matches.append((rel_path, full_path)) + + matches.sort() + return matches + +def is_text_file(filepath): + """检查文件是否为文本文件""" + text_extensions = ['.txt', '.py', '.html', '.css', '.js', '.md'] # 可根据需要扩展 + _, ext = os.path.splitext(filepath) + return ext.lower() in text_extensions + +def read_file_content(path): + """尝试多种编码读取文件内容,非文本或无法读取则跳过""" + encodings = ["utf-8-sig", "utf-8", "gbk", "latin-1"] # 优先使用 utf-8-sig + for enc in encodings: + try: + with io.open(path, "r", encoding=enc, errors="strict") as f: + return f.read() + except (UnicodeDecodeError, Exception): + continue + return "[警告:该文件编码不兼容或为二进制格式,已跳过内容提取]" + +def generate_report(root, out_path): + with io.open(out_path, "w", encoding="utf-8-sig") as out: # 使用 utf-8-sig 输出 + # 第一部分:目录结构 + write_line(out, "==================================================") + write_line(out, "第一部分:项目目录结构") + write_line(out, "==================================================") + tree_lines = collect_tree(root) + for ln in tree_lines: + write_line(out, ln) + write_line(out, "\n") + + # 第二部分:文件内容整合 + write_line(out, "==================================================") + write_line(out, "第二部分:文件内容整合") + write_line(out, "==================================================") + + all_files = gather_all_files(root) + if not all_files: + write_line(out, "[未找到符合条件的可处理文件]") + + for rel_path, full_path in all_files: + if is_text_file(full_path): # 仅处理文本文件 + write_line(out, f"\n>>> FILE START: {rel_path} <<<") + write_line(out, "=" * 40) + + content = read_file_content(full_path) + out.write(content) + + if not content.endswith("\n"): + out.write("\n") + write_line(out, "=" * 40) + write_line(out, f">>> FILE END: {rel_path} <<<\n") + +if __name__ == "__main__": + try: + output_full_path = os.path.join(ROOT_DIR, OUTPUT_FILENAME) + generate_report(ROOT_DIR, output_full_path) + print(f"成功!整合后的文件已保存至:{OUTPUT_FILENAME}") + except Exception as e: + print(f"程序运行出错:{e}") + sys.exit(1) diff --git a/project_all_in_one.txt b/project_all_in_one.txt new file mode 100644 index 0000000..07f3341 --- /dev/null +++ b/project_all_in_one.txt @@ -0,0 +1,809 @@ +================================================== +第一部分:项目目录结构 +================================================== +./ + database.py + generate_report.py + backend/ + main.py + requirements.txt + backend/db/ + bcd.db + schema.txt + frontend/ + .gitignore + package-lock.json + package.json + package.json.save + frontend/src/ + App.css + App.js + App.test.js + home.js + index.css + index.js + logo.svg + reportWebVitals.js + setupTests.js + frontend/src/components/ + Home.js + UploadPicture.js + frontend/public/ + favicon.ico + index.html + manifest.json + robots.txt + frontend/build/ + asset-manifest.json + favicon.ico + index.html + manifest.json + robots.txt + + +================================================== +第二部分:文件内容整合 +================================================== + +>>> FILE START: backend/db/schema.txt <<< +======================================== +CREATE TABLE pictures ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 中自增 ID 的标准写法 + pictures BLOB, -- 存储图片二进制数据 + enabled INTEGER DEFAULT 1 -- 是否有效,默认为 1 +) + +CREATE TABLE words ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, -- 单词ID,自增 + picture_id INTEGER, -- 对应 pictures 表中的 ID + word TEXT NOT NULL, -- 单词本身 + chinese_meaning TEXT, -- 单词的中文词义 + part_of_speech TEXT, -- 单词的词性 (n., v., adj. 等) + word_root TEXT, -- 词根 + affix TEXT, -- 单词的词缀描述 + example_sentence TEXT, groupid INTEGER, -- 该单词的例句 + FOREIGN KEY (picture_id) REFERENCES pictures(ID) -- 建立外键关联 +) + +CREATE TABLE schema_comments ( + object_type TEXT, -- 'table' 或 'column' + table_name TEXT NOT NULL, + column_name TEXT, -- table 类型时可为 NULL + description TEXT, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY(object_type, table_name, column_name) +) +CREATE TABLE sqlite_sequence(name,seq) +======================================== +>>> FILE END: backend/db/schema.txt <<< + + +>>> FILE START: backend/main.py <<< +======================================== +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +import sqlite3 +import os +import re +import datetime +from pydantic import BaseModel +from typing import List, Optional + +app = FastAPI() + +# 允许 CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- 文件路径配置 --- +# 确保路径与你的服务器目录结构一致 +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DATABASE_PATH = os.path.join(BASE_DIR, "db", "bcd.db") +LOG_FILE_PATH = os.path.join(BASE_DIR, "a", "log.txt") + +# --- 数据模型 --- +class HomeData(BaseModel): + pictures_count: int + words_count: int + +class ProgressData(BaseModel): + group: str + study: str + test: str + review1: str + review2: str + review3: str + +# --- 辅助逻辑函数(移植自原 MainApp) --- + +def calculate_hours_since(date_str: str) -> Optional[float]: + if not date_str: + return None + try: + # 兼容原格式 "2023-05-24 10:00:00" + last = datetime.datetime.strptime(date_str[:19], "%Y-%m-%d %H:%M:%S") + return (datetime.datetime.now() - last).total_seconds() / 3600 + except: + return None + +def get_progress_from_log(): + """解析 log.txt 获取每个组的完成时间""" + progress = {} + if os.path.exists(LOG_FILE_PATH): + with open(LOG_FILE_PATH, 'r', encoding='utf-8') as f: + for line in f: + # 匹配原有的日志格式 + match = re.search(r'PROGRESS_UPDATE: Group:(.+?), Type:(.+?), Status:completed, Date:(.+)', line) + if match: + g_n, a_t, c_d = match.groups() + g_n = g_n.strip() + if g_n not in progress: + progress[g_n] = {'study': None, 'test': None, 'review1': None, 'review2': None, 'review3': None} + progress[g_n][a_t.strip()] = c_d.strip() + return progress + +# --- 路由实现 --- + +@app.get("/api/home", response_model=HomeData) +async def get_home_data(): + try: + conn = sqlite3.connect(DATABASE_PATH) + cursor = conn.cursor() + cursor.execute("SELECT COUNT(*) FROM pictures WHERE enabled = 1") + p_count = cursor.fetchone()[0] + cursor.execute("SELECT COUNT(*) FROM words") + w_count = cursor.fetchone()[0] + conn.close() + return HomeData(pictures_count=p_count, words_count=w_count) + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + +@app.get("/api/home/process", response_model=List[ProgressData]) +async def get_home_process(): + try: + # 1. 从数据库获取所有分组 + conn = sqlite3.connect(DATABASE_PATH) + cursor = conn.cursor() + cursor.execute("SELECT DISTINCT groupid FROM words ORDER BY CAST(groupid AS INTEGER) ASC") + all_groups = [str(row[0]) for row in cursor.fetchall()] + conn.close() + + # 2. 从日志解析进度 + log_progress = get_progress_from_log() + + # 3. 模拟原有的 UI 显示逻辑 + results = [] + first_unstudied = None + for g in all_groups: + if g not in log_progress or not log_progress[g]['study']: + first_unstudied = g + break + + for g_name in all_groups: + p = log_progress.get(g_name, {'study': None, 'test': None, 'review1': None, 'review2': None, 'review3': None}) + + # 构建每一行数据 + row = {"group": f"Group {g_name}"} + + # 基础学习列 + if p['study']: + row['study'] = f"✔️ {p['study'][:10]}" + elif g_name == first_unstudied: + row['study'] = "✅请开始学习" + else: + row['study'] = "" + + # 单元测试列 + if p['test']: + row['test'] = f"✔️ {p['test'][:10]}" + elif p['study']: + row['test'] = "✅请开始测试" + else: + row['test'] = "" + + # 复习列 (Review1, 2, 3) + rk = ['review1', 'review2', 'review3'] + pk = ['test', 'review1', 'review2'] + + for i, key in enumerate(rk): + prev_key = pk[i] + if p[key]: + row[key] = f"✔️ {p[key][:10]}" + elif p[prev_key]: + hours = calculate_hours_since(p[prev_key]) + # 原逻辑:超过4小时显示“尽快复习”,否则显示“开始复习” + if hours and hours > 4: + row[key] = "⚠️请尽快复习" + else: + row[key] = "✅请开始复习" + else: + row[key] = "" + + results.append(ProgressData(**row)) + + return results + + except Exception as e: + import traceback + print(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + +@app.get("/") +async def root(): + return {"message": "English Lexicon API is running"} +======================================== +>>> FILE END: backend/main.py <<< + + +>>> FILE START: backend/requirements.txt <<< +======================================== +fastapi +uvicorn +pydantic +pillow +pandas +======================================== +>>> FILE END: backend/requirements.txt <<< + + +>>> FILE START: database.py <<< +======================================== +import sqlite3 +import os + +# 数据库文件的绝对路径 +DB_PATH = os.path.join(os.path.dirname(__file__), 's', 'studybase.db') + +def get_db_connection(): + """获取数据库连接,并将结果集设置为字典模式(方便前端调用)""" + conn = sqlite3.connect(DB_PATH) + # 这行代码能让你通过 row['column_name'] 访问数据,而不是 row[0] + conn.row_factory = sqlite3.Row + return conn + +def query_db(query, args=(), one=False): + """通用的查询函数""" + conn = get_db_connection() + cur = conn.execute(query, args) + rv = cur.fetchall() + conn.close() + return (rv[0] if rv else None) if one else rv + +def execute_db(query, args=()): + """通用的增删改函数""" + conn = get_db_connection() + cur = conn.execute(query, args) + conn.commit() + conn.close() + return cur +======================================== +>>> FILE END: database.py <<< + + +>>> FILE START: frontend/build/index.html <<< +======================================== +React App
+======================================== +>>> FILE END: frontend/build/index.html <<< + + +>>> FILE START: frontend/build/robots.txt <<< +======================================== +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: +======================================== +>>> FILE END: frontend/build/robots.txt <<< + + +>>> FILE START: frontend/public/index.html <<< +======================================== + + + + + + + + + + + + + React App + + + +
+ + + +======================================== +>>> FILE END: frontend/public/index.html <<< + + +>>> FILE START: frontend/public/robots.txt <<< +======================================== +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: +======================================== +>>> FILE END: frontend/public/robots.txt <<< + + +>>> FILE START: frontend/src/App.css <<< +======================================== +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} +======================================== +>>> FILE END: frontend/src/App.css <<< + + +>>> FILE START: frontend/src/App.js <<< +======================================== +import React from 'react'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import Home from './components/Home'; +import UploadPicture from './components/UploadPicture'; + +function App() { + return ( + + + } /> + } /> + + + ); +} + +export default App; +======================================== +>>> FILE END: frontend/src/App.js <<< + + +>>> FILE START: frontend/src/App.test.js <<< +======================================== +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); +======================================== +>>> FILE END: frontend/src/App.test.js <<< + + +>>> FILE START: frontend/src/components/Home.js <<< +======================================== +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; + +function Home() { + const [data, setData] = useState({ pictures_count: 0, words_count: 0 }); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await axios.get('http://127.0.0.1:1060/api/home'); + setData(response.data); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + fetchData(); + }, []); + + return ( +
+

欢迎来到英语词汇助手

+

当前数据库中有 {data.pictures_count} 张图片。

+

当前数据库中有 {data.words_count} 个单词。

+
+ ); +} + +export default Home; +======================================== +>>> FILE END: frontend/src/components/Home.js <<< + + +>>> FILE START: frontend/src/components/UploadPicture.js <<< +======================================== +import React, { useState } from 'react'; +import axios from 'axios'; + +function UploadPicture() { + const [file, setFile] = useState(null); + + const handleFileChange = (e) => { + setFile(e.target.files[0]); + }; + + const handleUpload = async () => { + const formData = new FormData(); + formData.append('file', file); + + try { + await axios.post('http://127.0.0.1:1060/api/picture/', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + alert('Picture uploaded successfully!'); + } catch (error) { + alert('Error uploading picture: ' + error.message); + } + }; + + return ( +
+

Upload Picture

+ + +
+ ); +} + +export default UploadPicture; +======================================== +>>> FILE END: frontend/src/components/UploadPicture.js <<< + + +>>> FILE START: frontend/src/home.js <<< +======================================== +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; +import { Table } from 'react-bootstrap'; // 使用 react-bootstrap 进行表格展示 + +function Home() { + const [data, setData] = useState({ pictures_count: 0, words_count: 0 }); + const [progressData, setProgressData] = useState([]); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await axios.get('http://127.0.0.1:1060/api/home'); + setData(response.data); + } catch (error) { + console.error("Error fetching data:", error); + } + }; + fetchData(); + }, []); + + useEffect(() => { + const fetchProgressData = async () => { + try { + const response = await axios.get('http://127.0.0.1:1060/api/progress'); // 假设你会添加这个 API + setProgressData(response.data); + } catch (error) { + console.error("Error fetching progress data:", error); + } + }; + fetchProgressData(); + }, []); + + return ( +
+

欢迎来到英语词汇助手

+

当前数据库中有 {data.pictures_count} 张图片。

+

当前数据库中有 {data.words_count} 个单词。

+

学习进度

+ + + + + + + + + + + + + {progressData.map((progress, index) => ( + + + + + + + + + ))} + +
组别基础学习单元测试复习 I复习 II复习 III
{progress.group}{progress.study ? `✔️ \${progress.study}` : "未开始"}{progress.test ? `✔️ \${progress.test}` : "未开始"}{progress.review1 ? `✔️ \${progress.review1}` : "未开始"}{progress.review2 ? `✔️ \${progress.review2}` : "未开始"}{progress.review3 ? `✔️ \${progress.review3}` : "未开始"}
+
+ ); +} + +export default Home; +======================================== +>>> FILE END: frontend/src/home.js <<< + + +>>> FILE START: frontend/src/index.css <<< +======================================== +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} +======================================== +>>> FILE END: frontend/src/index.css <<< + + +>>> FILE START: frontend/src/index.js <<< +======================================== +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); +======================================== +>>> FILE END: frontend/src/index.js <<< + + +>>> FILE START: frontend/src/reportWebVitals.js <<< +======================================== +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; +======================================== +>>> FILE END: frontend/src/reportWebVitals.js <<< + + +>>> FILE START: frontend/src/setupTests.js <<< +======================================== +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; +======================================== +>>> FILE END: frontend/src/setupTests.js <<< + + +>>> FILE START: generate_report.py <<< +======================================== +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import sys +import io + +# ================= 配置区域 ================= +# 输出文件名 +OUTPUT_FILENAME = "project_all_in_one.txt" + +# 需要排除的目录名(完全匹配),例如:['.git','gitea', 'node_modules', 'ZZ Old Version'] +EXCLUDE_DIRS = {".git", "__pycache__", "ZZ Old Version", "Media","node_modules","venv","static"} + +# 需要排除的文件后缀(不区分大小写),例如:['.exe', '.pyc', '.png', '.jpg'] +EXCLUDE_EXTS = {".exe", ".pyc", ".png", ".jpg", ".jpeg", ".gif", ".pdf", ".zip", ".tar", ".gz"} + +# 需要排除的具体文件名 +EXCLUDE_FILES = {OUTPUT_FILENAME, ".DS_Store", "gitea","README.md"} +# =========================================== + +ROOT_DIR = os.path.abspath(os.path.dirname(__file__)) + +def write_line(f, line=""): + f.write(line + "\n") + +def should_exclude(path): + """检查路径中是否包含任何被排除的目录""" + parts = path.split(os.sep) + for d in EXCLUDE_DIRS: + if d in parts: + return True + return False + +def collect_tree(root): + """生成目录结构树""" + lines = [] + for dirpath, dirnames, filenames in os.walk(root): + # 过滤掉排除目录,修改 dirnames 会影响 os.walk 的后续遍历 + dirnames[:] = [d for d in dirnames if d not in EXCLUDE_DIRS] + + rel = os.path.relpath(dirpath, root) + if rel == ".": + indent_level = 0 + display_path = "." + else: + indent_level = rel.count(os.sep) + 1 + display_path = rel.replace(os.sep, "/") + + indent = " " * indent_level + lines.append(f"{indent}{display_path}/") + + for fn in sorted(filenames): + if fn in EXCLUDE_FILES: + continue + _, ext = os.path.splitext(fn) + if ext.lower() in EXCLUDE_EXTS: + continue + lines.append(f"{indent} {fn}") + return lines + +def gather_all_files(root): + """收集所有符合条件的文件路径""" + matches = [] + for dirpath, dirnames, filenames in os.walk(root): + # 过滤排除目录 + dirnames[:] = [d for d in dirnames if d not in EXCLUDE_DIRS] + + for fn in filenames: + # 过滤排除的文件名和后缀 + if fn in EXCLUDE_FILES: + continue + _, ext = os.path.splitext(fn) + if ext.lower() in EXCLUDE_EXTS: + continue + + full_path = os.path.join(dirpath, fn) + rel_path = os.path.relpath(full_path, root).replace(os.sep, "/") + matches.append((rel_path, full_path)) + + matches.sort() + return matches + +def is_text_file(filepath): + """检查文件是否为文本文件""" + text_extensions = ['.txt', '.py', '.html', '.css', '.js', '.md'] # 可根据需要扩展 + _, ext = os.path.splitext(filepath) + return ext.lower() in text_extensions + +def read_file_content(path): + """尝试多种编码读取文件内容,非文本或无法读取则跳过""" + encodings = ["utf-8-sig", "utf-8", "gbk", "latin-1"] # 优先使用 utf-8-sig + for enc in encodings: + try: + with io.open(path, "r", encoding=enc, errors="strict") as f: + return f.read() + except (UnicodeDecodeError, Exception): + continue + return "[警告:该文件编码不兼容或为二进制格式,已跳过内容提取]" + +def generate_report(root, out_path): + with io.open(out_path, "w", encoding="utf-8-sig") as out: # 使用 utf-8-sig 输出 + # 第一部分:目录结构 + write_line(out, "==================================================") + write_line(out, "第一部分:项目目录结构") + write_line(out, "==================================================") + tree_lines = collect_tree(root) + for ln in tree_lines: + write_line(out, ln) + write_line(out, "\n") + + # 第二部分:文件内容整合 + write_line(out, "==================================================") + write_line(out, "第二部分:文件内容整合") + write_line(out, "==================================================") + + all_files = gather_all_files(root) + if not all_files: + write_line(out, "[未找到符合条件的可处理文件]") + + for rel_path, full_path in all_files: + if is_text_file(full_path): # 仅处理文本文件 + write_line(out, f"\n>>> FILE START: {rel_path} <<<") + write_line(out, "=" * 40) + + content = read_file_content(full_path) + out.write(content) + + if not content.endswith("\n"): + out.write("\n") + write_line(out, "=" * 40) + write_line(out, f">>> FILE END: {rel_path} <<<\n") + +if __name__ == "__main__": + try: + output_full_path = os.path.join(ROOT_DIR, OUTPUT_FILENAME) + generate_report(ROOT_DIR, output_full_path) + print(f"成功!整合后的文件已保存至:{OUTPUT_FILENAME}") + except Exception as e: + print(f"程序运行出错:{e}") + sys.exit(1) +======================================== +>>> FILE END: generate_report.py <<< + diff --git a/src/App.js b/src/App.js deleted file mode 100644 index 3784575..0000000 --- a/src/App.js +++ /dev/null @@ -1,25 +0,0 @@ -import logo from './logo.svg'; -import './App.css'; - -function App() { - return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
-
- ); -} - -export default App; -- 2.43.0