diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 5d6e015..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -name: Bug report -about: 帮助定位问题所在 -title: '' -labels: '' -assignees: '' - ---- - -**问题描述** -请在此处提供对问题的详细描述。 - -**复现步骤** -请提供重现问题所需的步骤。(执行的命令) - -1. 步骤 1 -2. 步骤 2 -3. 步骤 3 - -**预期行为** -请清楚地描述您预期的行为。 - -**实际行为** -请描述实际的行为和问题出现的地方。 - -**环境信息** -- pywxdump版本: -- 操作系统版本: -- python版本: -- 微信版本: - - - -**其他信息** -请提供任何与问题相关的其他信息(文字,截图等)。 diff --git a/.github/workflows/auto-sync-gitee.yml b/.github/workflows/auto-sync-gitee.yml deleted file mode 100644 index ad7583e..0000000 --- a/.github/workflows/auto-sync-gitee.yml +++ /dev/null @@ -1,42 +0,0 @@ -#on: -# push: -# branches: [master] -#name: Mirror GitHub Repos to Gitee -#jobs: -# run: -# name: Sync-GitHub-to-Gitee -# runs-on: ubuntu-latest -# steps: -# - name: Mirror the Github repos to Gitee. -# uses: Yikun/hub-mirror-action@master -# with: -# src: github/xaoyaoo -# dst: gitee/xaoyaoo -# dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} -# dst_token: ${{ secrets.GITEE_TOKEN }} -# force_update: true -# src_account_type: org -# dst_account_type: user -# mappings: "dashboard=>dashboards" -# static_list: "trader" -# cache_path: /github/workspace/hub-mirror-cache - -name: Hello World Action - -on: - push: - branches: [ main ] # 触发条件:当主分支有新的推送时 - -jobs: - hello-job: - runs-on: ubuntu-latest # 运行环境:最新的 Ubuntu 系统 - - steps: - - name: Checkout Repository - uses: actions/checkout@v3 # 检出代码 - - - name: Print Hello Message - run: echo "Hello, world!" # 执行命令,打印消息 - - - name: Print Date - run: date # 执行命令,打印当前日期 \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index ef44427..0000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,134 +0,0 @@ -name: Publish - -on: - # 当master分支有push时,触发action - push: - tags: - - 'v*' # 以 'v' 开头的标签触发工作流程 - -jobs: - publish: - name: Publish Pypi and Create Release - if: github.repository == 'xaoyaoo/PyWxDump' # 仅在指定仓库的 tag 触发工作流程 - # 此作业在 Linux 上运行 - runs-on: windows-latest - - steps: - - name: Checkout repository # 检出仓库 - uses: actions/checkout@v2 # 使用 GitHub 官方的 checkout action - - - name: Set git fetch depth # 设置 git fetch 深度 - run: | - git fetch --prune --unshallow # 获取完整的 git 历史记录 - - - name: Set up Python # 设置 Python 环境 - uses: actions/setup-python@v4 - with: - python-version: '3.8' - cache: 'pip' # caching pip dependencies - - run: | - python -m pip install --upgrade pip - pip install build - python -m pip install --upgrade twine - pip install pyinstaller - pip install -r requirements.txt - - - name: Set up Node.js # 设置 Node.js 环境 - uses: actions/setup-node@v2 - with: - node-version: 20 - - - name: Build Web UI # 构建 Web UI - run: | - cd .. - git clone https://github.com/xaoyaoo/wxdump_web.git - Compress-Archive -Path wxdump_web -DestinationPath wxdump_web.zip - Compress-Archive -Path PyWxDump -DestinationPath PyWxDump.zip - cd wxdump_web - npm list -g - npm install - npm run build - - - name: copy web ui to pywxdump/ui/web - run: | - cd .. - ls -l wxdump_web/dist - cp -r wxdump_web/dist PyWxDump/pywxdump/ui/web - ls -l PyWxDump/pywxdump/ui/web - cd PyWxDump - -# - name: Build Export UI # 构建导出的 Web UI -# run: | -# cd .. -# cd wxdump_web -# cp src/main.ts src/t.ts -# cp src/main.ts.export src/main.ts -# npm install -# npm run build -# -# - name: copy Export UI and Export UI to pywxdump/ui/web and pywxdump/ui/export -# run: | -# cd .. -# ls -l wxdump_web/dist -# cp -r wxdump_web/dist PyWxDump/pywxdump/ui/export -# ls -l PyWxDump/pywxdump/ui/export -# cd PyWxDump - - - name: Build package # 构建包 - run: | - python -m build - pip install -U . - - - name: Generate File pywxdump.spec # 生成 pywxdump.spec 文件 - run: | - python tests/build_exe.py - ls - ls dist - cat dist/pywxdump.spec - - - name: Build Executable - run: | - pyinstaller --clean --distpath=dist dist/pywxdump.spec - - - name: test - run: | - ls -l dist - ls -l "${{ github.workspace }}" - - - name: Zip Executable - run: | - cd .. - ls - Compress-Archive -Path PyWxDump/dist/*.exe,PyWxDump/dist/*.whl -DestinationPath exe_whl.zip - Compress-Archive -Path PyWxDump.zip,wxdump_web.zip -DestinationPath Source.zip - ls - cp exe_whl.zip PyWxDump/dist/exe_whl.zip - cp Source.zip PyWxDump/dist/Source.zip - ls PyWxDump/dist - cd PyWxDump - - - name: Publish package with Twine # 使用 Twine 发布到 PyPI - run: | - twine upload dist/*.whl dist/*.tar.gz - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} - - - name: Create Release - id: create_release - uses: softprops/action-gh-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref.tag }} - body: | - [Auto Release] Update PyWxDump to ${{ github.ref }} - 详细更新日志请查看 [CHANGELOG.md](https://github.com/xaoyaoo/PyWxDump/blob/master/doc/CHANGELOG.md) - draft: false - prerelease: false - files: | - dist/*.exe - dist/*.whl - dist/exe_whl.zip - dist/Source.zip \ No newline at end of file diff --git a/.gitignore b/.gitignore index bcafc10..5147b19 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ dist-ssr *.local /pywxdump/ui/web/* /pywxdump/ui/web/assets/* +/pywxdump/wxdump_work diff --git a/pywxdump/api/export/exportJSON.py b/pywxdump/api/export/exportJSON.py index f04c179..06cf47c 100644 --- a/pywxdump/api/export/exportJSON.py +++ b/pywxdump/api/export/exportJSON.py @@ -5,6 +5,7 @@ # Author: xaoyaoo # Date: 2024/04/20 # ------------------------------------------------------------------------------- +import datetime import json import os from pywxdump.db import DBHandler @@ -39,5 +40,135 @@ def export_json(wxid, outpath, db_config, my_wxid="我", indent=4): return True, f"导出成功: {outpath}" +def export_json_mini(wxid, outpath, db_config, my_wxid="我", indent=4): + # 确保输出目录存在 + if not os.path.exists(outpath): + outpath = os.path.join(os.getcwd(), "export_mini" + os.sep + wxid) + os.makedirs(outpath, exist_ok=True) + + db = DBHandler(db_config, my_wxid) + + # 获取消息总数 + count = db.get_msgs_count(wxid) + chatCount = count.get(wxid, 0) + if chatCount == 0: + return False, "没有聊天记录" + + users = {} + page_size = chatCount + 1 # 保持与原函数一致的分页逻辑 + + for i in range(0, chatCount, page_size): + start_index = i + data, users_t = db.get_msgs(wxid, start_index, page_size) + users.update(users_t) # 合并用户信息 + + if not data: + continue + + # 构建简化数据 + mini_data = [] + for msg in data: + # 获取昵称(优先用备注,没有则用昵称,最后用wxid) + user_info = users.get(msg.get("talker"), {}) + nickname = user_info.get("remark") or user_info.get("nickname") or msg.get("talker") + + mini_msg = { + "nickname": nickname, + "message": msg.get("msg", ""), + "time": msg.get("CreateTime", "") + } + mini_data.append(mini_msg) + + # 保存简化后的文件 + save_path = os.path.join(outpath, f"{wxid}_mini_{i}_{i + page_size}.json") + with open(save_path, "w", encoding="utf-8") as f: + json.dump(mini_data, f, ensure_ascii=False, indent=indent) + + return True, f"简化版导出成功: {outpath}" + + +def export_json_mini_time_limit(wxid, outpath, db_config, my_wxid="我", + start_createtime=None, end_createtime=None, indent=4): + """ + 带时间过滤的简化版聊天记录导出 + + :param start_createtime: 开始时间(格式:2025-4-30 16:55:01) + :param end_createtime: 结束时间(格式:2025-4-30 16:55:01) + """ + # 创建输出目录 + if not os.path.exists(outpath): + outpath = os.path.join(os.getcwd(), "export_mini" + os.sep + wxid) + os.makedirs(outpath, exist_ok=True) + + # 初始化数据库连接 + db = DBHandler(db_config, my_wxid) + + # 时间格式转换 + def str_to_timestamp(time_str): + if not time_str: + return None + try: + dt = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") + return int(dt.timestamp()) + except ValueError: + raise ValueError(f"无效时间格式: {time_str},示例: 2025-04-30 16:55:01") + + start_ts = str_to_timestamp(start_createtime) + end_ts = str_to_timestamp(end_createtime) + + # 获取消息数据(带时间过滤) + all_data = [] + users = {} + page_size = 5000 # 每次获取5000条 + start_index = 0 + + while True: + # 获取分页数据(自动包含时间过滤条件) + data, users_t = db.get_msgs( + wxid, + start_index=start_index, + page_size=page_size, + start_createtime=start_ts, + end_createtime=end_ts + ) + + if not data: + break + + all_data.extend(data) + users.update(users_t) + start_index += page_size + + if not all_data: + return False, "指定时间段内没有聊天记录" + + # 构建简化数据结构 + mini_data = [] + for msg in all_data: + talker = msg.get("talker") + user_info = users.get(talker, {}) + + mini_msg = { + "sender": user_info.get("remark") or user_info.get("nickname") or talker, + "content": msg.get("msg", ""), + "timestamp": msg.get("CreateTime") + } + mini_data.append(mini_msg) + + # 生成带时间范围的文件名 + time_suffix = "" + if start_createtime or end_createtime: + start_part = start_createtime.replace(" ", "_").replace(":", "-") if start_createtime else "all" + end_part = end_createtime.replace(" ", "_").replace(":", "-") if end_createtime else "now" + time_suffix = f"_{start_part}_to_{end_part}" + + save_path = os.path.join(outpath, f"{wxid}_mini{time_suffix}.json") + with open(save_path, "w", encoding="utf-8") as f: + json.dump(mini_data, f, ensure_ascii=False, indent=indent) + + return True, f"导出成功: {save_path}" + + + if __name__ == '__main__': pass diff --git a/pywxdump/api/remote_server.py b/pywxdump/api/remote_server.py index 630d996..9aa8d49 100644 --- a/pywxdump/api/remote_server.py +++ b/pywxdump/api/remote_server.py @@ -5,6 +5,7 @@ # Author: xaoyaoo # Date: 2024/01/02 # ------------------------------------------------------------------------------- +import datetime import os import time import shutil @@ -22,6 +23,7 @@ from pywxdump.db import DBHandler from pywxdump.db.utils import download_file, dat2img from .export import export_csv, export_json, export_html +from .export.exportJSON import export_json_mini, export_json_mini_time_limit from .rjson import ReJson, RqJson from .utils import error9999, gc, asyncError9999, rs_loger @@ -134,11 +136,18 @@ def get_msgs(wxid: str = Body(...), start: int = Body(...), limit: int = Body(.. """ my_wxid = gc.get_conf(gc.at, "last") + if not my_wxid: return ReJson(1001, body="my_wxid is required") db_config = gc.get_conf(my_wxid, "db_config") db = DBHandler(db_config, my_wxid=my_wxid) - msgs, users = db.get_msgs(wxids=wxid, start_index=start, page_size=limit) + + start_createtime = datetime.datetime.strptime("2025-04-28 00:54:33", + "%Y-%m-%d %H:%M:%S").timestamp() + end_createtime = datetime.datetime.now().timestamp() + msgs, users = db.get_msgs(wxids=wxid, start_index=start, page_size=limit,) # + + return ReJson(0, {"msg_list": msgs, "user_list": users}) @@ -457,13 +466,16 @@ def get_export_json(wxid: str = Body(..., embed=True)): if not os.path.exists(outpath): os.makedirs(outpath) - code, ret = export_json(wxid, outpath, db_config, my_wxid=my_wxid) + code, ret = export_json_mini_time_limit(wxid, outpath, db_config, my_wxid=my_wxid,start_createtime="2025-4-29 00:00:00", end_createtime="2025-4-30 00:00:00") if code: return ReJson(0, ret) else: return ReJson(2001, body=ret) + + + class ExportHtmlRequest(BaseModel): wxid: str diff --git a/pywxdump/cli.py b/pywxdump/cli.py index 9e436f0..6fb3801 100644 --- a/pywxdump/cli.py +++ b/pywxdump/cli.py @@ -367,7 +367,7 @@ class MainApi(BaseSubMainClass): def console_run(): # 检查是否需要显示帮助信息 if len(sys.argv) == 1: - sys.argv.append(MainUi.mode) + sys.argv.append(MainApi.mode) elif len(sys.argv) == 2 and sys.argv[1] not in models.keys(): sys.argv.append('-h') main_parser.print_help() diff --git a/pywxdump/db/__init__.py b/pywxdump/db/__init__.py index e20180a..737069b 100644 --- a/pywxdump/db/__init__.py +++ b/pywxdump/db/__init__.py @@ -59,6 +59,8 @@ class DBHandler(MicroHandler, MediaHandler, OpenIMContactHandler, PublicMsgHandl "talker": talker, "room_name": StrTalker, "msg": msg, "src": src, "extra": {}, "CreateTime": CreateTime, } """ + + msgs0, wxid_list0 = self.get_msg_list(wxids=wxids, start_index=start_index, page_size=page_size, msg_type=msg_type, msg_sub_type=msg_sub_type, start_createtime=start_createtime, diff --git a/pywxdump/db/dbMSG.py b/pywxdump/db/dbMSG.py index ed2f075..4d9e0d3 100644 --- a/pywxdump/db/dbMSG.py +++ b/pywxdump/db/dbMSG.py @@ -103,9 +103,16 @@ class MsgHandler(DatabaseBase): f"{sql_sub_type}" f"{sql_start_createtime}" f"{sql_end_createtime}" - f"ORDER BY CreateTime ASC LIMIT ?,?" + f"ORDER BY CreateTime ASC LIMIT ? OFFSET ?" ) - param = param + (start_index, page_size) + + param = param + ( page_size,start_index) + # # 测试 + # print(sql + "\n" + " ".join([str(i) for i in param])) + # print(sql + "\n" + " ".join([str(i) for i in param])) + # print(sql + "\n" + " ".join([str(i) for i in param])) + + result = self.execute(sql, param) if not result: return [], [] diff --git a/pywxdump/ui/.github/workflows/auto_build.yml b/pywxdump/ui/.github/workflows/auto_build.yml new file mode 100644 index 0000000..7285a40 --- /dev/null +++ b/pywxdump/ui/.github/workflows/auto_build.yml @@ -0,0 +1,28 @@ +name: Build and Deploy Vue App + +on: + push: + branches: + - web + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: 20 + + - name: Install dependencies + run: npm install + + - name: Build the app + run: npm run build + + - name: Cheak dist + run: ls dist diff --git a/pywxdump/ui/.gitignore b/pywxdump/ui/.gitignore new file mode 100644 index 0000000..9768ad7 --- /dev/null +++ b/pywxdump/ui/.gitignore @@ -0,0 +1,34 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo +tsconfig.app.tsbuildinfo +tsconfig.node.tsbuildinfo + +/public/data/ \ No newline at end of file diff --git a/pywxdump/ui/.vscode/extensions.json b/pywxdump/ui/.vscode/extensions.json new file mode 100644 index 0000000..c0a6e5a --- /dev/null +++ b/pywxdump/ui/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/pywxdump/ui/README.md b/pywxdump/ui/README.md new file mode 100644 index 0000000..c046b31 --- /dev/null +++ b/pywxdump/ui/README.md @@ -0,0 +1 @@ +## 这是[PyWxDump](https://github.com/xaoyaoo/PyWxDump)的Web版,用于在浏览器中查看微信聊天记录。 \ No newline at end of file diff --git a/pywxdump/ui/env.d.ts b/pywxdump/ui/env.d.ts new file mode 100644 index 0000000..7332cfa --- /dev/null +++ b/pywxdump/ui/env.d.ts @@ -0,0 +1,6 @@ +/// +declare module 'vue3-markdown-it'; +declare module '@/utils/axios.js' { + import http from '@/utils/axios.js'; + export default http; +} \ No newline at end of file diff --git a/pywxdump/ui/index.html b/pywxdump/ui/index.html new file mode 100644 index 0000000..4a958d7 --- /dev/null +++ b/pywxdump/ui/index.html @@ -0,0 +1,22 @@ + + + + + + + PyWxDump + + + + + +
+ + + diff --git a/pywxdump/ui/package-lock.json b/pywxdump/ui/package-lock.json new file mode 100644 index 0000000..6f7db26 --- /dev/null +++ b/pywxdump/ui/package-lock.json @@ -0,0 +1,3075 @@ +{ + "name": "wxdump_web", + "version": "2.4.10", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wxdump_web", + "version": "2.4.10", + "dependencies": { + "@types/axios": "^0.14.0", + "axios": "^1.6.3", + "cors": "^2.8.5", + "echarts": "^5.5.0", + "echarts-wordcloud": "^2.1.0", + "element-plus": "^2.4.4", + "markdown-it": "^14.0.0", + "v3-infinite-loading": "^1.3.1", + "vue": "^3.3.11", + "vue-echarts": "^6.6.9", + "vue-router": "^4.2.5", + "vue3-markdown-it": "^1.0.10" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.2", + "@types/markdown-it": "^13.0.7", + "@types/node": "^18.19.3", + "@vitejs/plugin-vue": "^4.5.2", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vue/tsconfig": "^0.5.0", + "npm-run-all2": "^6.1.1", + "sass": "^1.69.7", + "typescript": "~5.3.0", + "vite": "^5.0.10", + "vue-tsc": "^1.8.25" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.5.2.tgz", + "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz", + "integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz", + "integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz", + "integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz", + "integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz", + "integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz", + "integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz", + "integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz", + "integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz", + "integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz", + "integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz", + "integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz", + "integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz", + "integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.2", + "resolved": "https://registry.npmmirror.com/@tsconfig/node18/-/node18-18.2.2.tgz", + "integrity": "sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==", + "dev": true + }, + "node_modules/@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha512-KqQnQbdYE54D7oa/UmYVMZKq7CO4l8DEENzOKc4aBRwxCXSlJXGz83flFx5L7AWrOQnmuN3kVsRdt+GZPPjiVQ==", + "deprecated": "This is a stub types definition for axios (https://github.com/mzabriskie/axios). axios provides its own type definitions, so you don't need @types/axios installed!", + "dependencies": { + "axios": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==" + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==" + }, + "node_modules/@types/node": { + "version": "18.19.4", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz", + "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.11.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.3.tgz", + "integrity": "sha512-u8jzgFg0EDtSrb/hG53Wwh1bAOQFtc1ZCegBpA/glyvTlgHl+tq13o1zvRfLbegYUw/E4mSTGOiCnAJ9SJ+lsg==", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/shared": "3.4.3", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.3.tgz", + "integrity": "sha512-oGF1E9/htI6JWj/lTJgr6UgxNCtNHbM6xKVreBWeZL9QhRGABRVoWGAzxmtBfSOd+w0Zi5BY0Es/tlJrN6WgEg==", + "dependencies": { + "@vue/compiler-core": "3.4.3", + "@vue/shared": "3.4.3" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.3.tgz", + "integrity": "sha512-NuJqb5is9I4uzv316VRUDYgIlPZCG8D+ARt5P4t5UDShIHKL25J3TGZAUryY/Aiy0DsY7srJnZL5ryB6DD63Zw==", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/compiler-core": "3.4.3", + "@vue/compiler-dom": "3.4.3", + "@vue/compiler-ssr": "3.4.3", + "@vue/shared": "3.4.3", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.32", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.3.tgz", + "integrity": "sha512-wnYQtMBkeFSxgSSQbYGQeXPhQacQiog2c6AlvMldQH6DB+gSXK/0F6DVXAJfEiuBSgBhUc8dwrrG5JQcqwalsA==", + "dependencies": { + "@vue/compiler-dom": "3.4.3", + "@vue/shared": "3.4.3" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "dev": true, + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.3.tgz", + "integrity": "sha512-q5f9HLDU+5aBKizXHAx0w4whkIANs1Muiq9R5YXm0HtorSlflqv9u/ohaMxuuhHWCji4xqpQ1eL04WvmAmGnFg==", + "dependencies": { + "@vue/shared": "3.4.3" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.3.tgz", + "integrity": "sha512-C1r6QhB1qY7D591RCSFhMULyzL9CuyrGc+3PpB0h7dU4Qqw6GNyo4BNFjHZVvsWncrUlKX3DIKg0Y7rNNr06NQ==", + "dependencies": { + "@vue/reactivity": "3.4.3", + "@vue/shared": "3.4.3" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.3.tgz", + "integrity": "sha512-wrsprg7An5Ec+EhPngWdPuzkp0BEUxAKaQtN9dPU/iZctPyD9aaXmVtehPJerdQxQale6gEnhpnfywNw3zOv2A==", + "dependencies": { + "@vue/runtime-core": "3.4.3", + "@vue/shared": "3.4.3", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.3.tgz", + "integrity": "sha512-BUxt8oVGMKKsqSkM1uU3d3Houyfy4WAc2SpSQRebNd+XJGATVkW/rO129jkyL+kpB/2VRKzE63zwf5RtJ3XuZw==", + "dependencies": { + "@vue/compiler-ssr": "3.4.3", + "@vue/shared": "3.4.3" + }, + "peerDependencies": { + "vue": "3.4.3" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.3.tgz", + "integrity": "sha512-rIwlkkP1n4uKrRzivAKPZIEkHiuwY5mmhMJ2nZKCBLz8lTUlE73rQh4n1OnnMurXt1vcUNyH4ZPfdh8QweTjpQ==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001572", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", + "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/echarts": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz", + "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.5.0" + } + }, + "node_modules/echarts-wordcloud": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-2.1.0.tgz", + "integrity": "sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==", + "peerDependencies": { + "echarts": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.616", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", + "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==", + "dev": true + }, + "node_modules/element-plus": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.4.4.tgz", + "integrity": "sha512-TlKubXJgxwhER0dw+8ULn9hr9kZjraV4R6Q/eidwWUwCKxwXYPBGmMKsZ/85tlxlhMYbcLZd/YZh6G3QkHX4fg==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-it": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-14.0.0.tgz", + "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.0.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-abbr": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", + "integrity": "sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==" + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmmirror.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it-deflist": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", + "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" + }, + "node_modules/markdown-it-emoji": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz", + "integrity": "sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==" + }, + "node_modules/markdown-it-footnote": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", + "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" + }, + "node_modules/markdown-it-highlightjs": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/markdown-it-highlightjs/-/markdown-it-highlightjs-3.6.0.tgz", + "integrity": "sha512-ex+Lq3cVkprh0GpGwFyc53A/rqY6GGzopPCG1xMsf8Ya3XtGC8Uw9tChN1rWbpyDae7tBBhVHVcMM29h4Btamw==", + "dependencies": { + "highlight.js": "^11.3.1", + "lodash.flow": "^3.5.0" + } + }, + "node_modules/markdown-it-ins": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz", + "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==" + }, + "node_modules/markdown-it-mark": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz", + "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==" + }, + "node_modules/markdown-it-sub": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz", + "integrity": "sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==" + }, + "node_modules/markdown-it-sup": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz", + "integrity": "sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==" + }, + "node_modules/markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==" + }, + "node_modules/markdown-it-toc-done-right": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/markdown-it-toc-done-right/-/markdown-it-toc-done-right-4.2.0.tgz", + "integrity": "sha512-UB/IbzjWazwTlNAX0pvWNlJS8NKsOQ4syrXZQ/C72j+jirrsjVRT627lCaylrKJFBQWfRsPmIVQie8x38DEhAQ==" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "node_modules/npm-run-all2": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-6.1.1.tgz", + "integrity": "sha512-lWLbkPZ5BSdXtN8lR+0rc8caKoPdymycpZksyDEC9MOBvfdwTXZ0uVhb7bMcGeXv2/BKtfQuo6Zn3zfc8rxNXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.3", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-pkg": "^8.0.0", + "shell-quote": "^1.7.3" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0", + "npm": ">= 8" + } + }, + "node_modules/npm-run-all2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resize-detector": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz", + "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==" + }, + "node_modules/rollup": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.9.2.tgz", + "integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.2", + "@rollup/rollup-android-arm64": "4.9.2", + "@rollup/rollup-darwin-arm64": "4.9.2", + "@rollup/rollup-darwin-x64": "4.9.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.2", + "@rollup/rollup-linux-arm64-gnu": "4.9.2", + "@rollup/rollup-linux-arm64-musl": "4.9.2", + "@rollup/rollup-linux-riscv64-gnu": "4.9.2", + "@rollup/rollup-linux-x64-gnu": "4.9.2", + "@rollup/rollup-linux-x64-musl": "4.9.2", + "@rollup/rollup-win32-arm64-msvc": "4.9.2", + "@rollup/rollup-win32-ia32-msvc": "4.9.2", + "@rollup/rollup-win32-x64-msvc": "4.9.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/sass": { + "version": "1.69.7", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.69.7.tgz", + "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/type-fest": { + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.0.0.tgz", + "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v3-infinite-loading": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/v3-infinite-loading/-/v3-infinite-loading-1.3.1.tgz", + "integrity": "sha512-Yi/STWDo+jasQSd8sBCta2u5/C75eLWdTyqkUPOcCEWYFzzw0DddYrDfvjB2IEbcvFxNiA4ljBpNLcRLVe2adA==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.0.10", + "resolved": "https://registry.npmmirror.com/vite/-/vite-5.0.10.tgz", + "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.3.tgz", + "integrity": "sha512-GjN+culMAGv/mUbkIv8zMKItno8npcj5gWlXkSxf1SPTQf8eJ4A+YfHIvQFyL1IfuJcMl3soA7SmN1fRxbf/wA==", + "dependencies": { + "@vue/compiler-dom": "3.4.3", + "@vue/compiler-sfc": "3.4.3", + "@vue/runtime-dom": "3.4.3", + "@vue/server-renderer": "3.4.3", + "@vue/shared": "3.4.3" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-echarts": { + "version": "6.6.9", + "resolved": "https://registry.npmmirror.com/vue-echarts/-/vue-echarts-6.6.9.tgz", + "integrity": "sha512-mojIq3ZvsjabeVmDthhAUDV8Kgf2Rr/X4lV4da7gEFd1fP05gcSJ0j7wa7HQkW5LlFmF2gdCJ8p4Chas6NNIQQ==", + "hasInstallScript": true, + "dependencies": { + "resize-detector": "^0.3.0", + "vue-demi": "^0.13.11" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.5", + "@vue/runtime-core": "^3.0.0", + "echarts": "^5.4.1", + "vue": "^2.6.12 || ^3.1.1" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "@vue/runtime-core": { + "optional": true + } + } + }, + "node_modules/vue-echarts/node_modules/vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.27", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.27.tgz", + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.27", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue-tsc/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-tsc/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-tsc/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vue3-markdown-it": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/vue3-markdown-it/-/vue3-markdown-it-1.0.10.tgz", + "integrity": "sha512-mTvHu0zl7jrh7ojgaZ+tTpCLiS4CVg4bTgTu4KGhw/cRRY5YgIG8QgFAPu6kCzSW6Znc9a52Beb6hFvF4hSMkQ==", + "dependencies": { + "markdown-it": "^12.3.2", + "markdown-it-abbr": "^1.0.4", + "markdown-it-anchor": "^8.4.1", + "markdown-it-deflist": "^2.1.0", + "markdown-it-emoji": "^2.0.0", + "markdown-it-footnote": "^3.0.3", + "markdown-it-highlightjs": "^3.6.0", + "markdown-it-ins": "^3.0.1", + "markdown-it-mark": "^3.0.1", + "markdown-it-sub": "^1.0.0", + "markdown-it-sup": "^1.0.0", + "markdown-it-task-lists": "^2.1.1", + "markdown-it-toc-done-right": "^4.2.0" + } + }, + "node_modules/vue3-markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, + "node_modules/vue3-markdown-it/node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/vue3-markdown-it/node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/vue3-markdown-it/node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/vue3-markdown-it/node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/zrender": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz", + "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/pywxdump/ui/package.json b/pywxdump/ui/package.json new file mode 100644 index 0000000..7814352 --- /dev/null +++ b/pywxdump/ui/package.json @@ -0,0 +1,40 @@ +{ + "name": "wxdump_web", + "version": "2.4.10", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build --force" + }, + "dependencies": { + "@types/axios": "^0.14.0", + "axios": "^1.6.3", + "cors": "^2.8.5", + "echarts": "^5.5.0", + "echarts-wordcloud": "^2.1.0", + "element-plus": "^2.4.4", + "markdown-it": "^14.0.0", + "v3-infinite-loading": "^1.3.1", + "vue": "^3.3.11", + "vue-echarts": "^6.6.9", + "vue-router": "^4.2.5", + "vue3-markdown-it": "^1.0.10" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.2", + "@types/markdown-it": "^13.0.7", + "@types/node": "^18.19.3", + "@vitejs/plugin-vue": "^4.5.2", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vue/tsconfig": "^0.5.0", + "npm-run-all2": "^6.1.1", + "sass": "^1.69.7", + "typescript": "~5.3.0", + "vite": "^5.0.10", + "vue-tsc": "^1.8.25" + } +} diff --git a/pywxdump/ui/public/data.js b/pywxdump/ui/public/data.js new file mode 100644 index 0000000..d1f4fbc --- /dev/null +++ b/pywxdump/ui/public/data.js @@ -0,0 +1,5 @@ +localStorage.setItem('isUseLocalData', 'f') // 't' : 'f' +const local_msg_count = 772 +const local_mywxid = '' +const local_user_list = {} +const local_msg_list = [] \ No newline at end of file diff --git a/pywxdump/ui/public/favicon.ico b/pywxdump/ui/public/favicon.ico new file mode 100644 index 0000000..86515ab Binary files /dev/null and b/pywxdump/ui/public/favicon.ico differ diff --git a/pywxdump/ui/src/App.vue b/pywxdump/ui/src/App.vue new file mode 100644 index 0000000..87d38e7 --- /dev/null +++ b/pywxdump/ui/src/App.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/pywxdump/ui/src/api/base.ts b/pywxdump/ui/src/api/base.ts new file mode 100644 index 0000000..f4d415d --- /dev/null +++ b/pywxdump/ui/src/api/base.ts @@ -0,0 +1,62 @@ +import http from "@/utils/axios.js"; + + +// const is_local_data = false; +const is_local_data = localStorage.getItem('isUseLocalData') === 't'; + +export const apiVersion = () => { + return http.get('/api/rs/version').then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} + +export const api_db_init = async () => { + const t = await http.get('/api/rs/is_init') + console.log("is_db_init", !!t); + return !!t; +} + +export const api_img = (url: string) => { + if (is_local_data) { + return `./imgsrc?src=${url}`; + } + return `/api/rs/imgsrc?src=${url}`; +} +export const api_audio = (url: string) => { + if (is_local_data) { + return `./audio?src=${url}`; + } + return `/api/rs/audio?src=${url}`; +} + +export const api_video = (url: string) => { + if (is_local_data) { + return `./video?src=${url}`; + } + return `/api/rs/video?src=${url}`; +} + +export const api_file = (url: string) => { + if (is_local_data) { + return `./file?src=${url}`; + } + return `/api/rs/file?src=${url}`; +} + +// file_info +export const api_file_info = (url: string) => { + if (is_local_data) { + return `./file_info?src=${url}`; + } + return http.post('/api/rs/file_info', { + 'file_path': url, + }).then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} \ No newline at end of file diff --git a/pywxdump/ui/src/api/chat.ts b/pywxdump/ui/src/api/chat.ts new file mode 100644 index 0000000..2e80447 --- /dev/null +++ b/pywxdump/ui/src/api/chat.ts @@ -0,0 +1,114 @@ +import http from "@/utils/axios.js"; +import {ElNotification} from "element-plus"; + +const is_local_data = localStorage.getItem('isUseLocalData') === 't'; +// 编辑器禁用检查 + +const l_msg_count = local_msg_count +const l_user_list = local_user_list +const l_msg_list = local_msg_list +const l_mywxid = local_mywxid + +// user list 部分 +export const apiUserList = (word: string = '', wxids: string[] = [], labels: string[] = []) => { + if (is_local_data) { + return l_user_list; + } + return http.post('/api/rs/user_list', { + 'word': word, + 'wxids': wxids, + 'labels': labels + }).then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} + +export const apiUserSessionList = () => { + return http.post('/api/rs/user_session_list', {}) + .then((res: any) => { + return res; + }) + .catch((err: any) => { + console.log(err); + return []; + }) +} +export const apiMyWxid = () => { + if (is_local_data) { + return l_mywxid; + } + return http.get('/api/rs/mywxid').then((res: any) => { + return res.my_wxid; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} + +// 消息部分 + +export const apiRealTime = () => { + return http.post('/api/ls/realtimemsg', {}).then((res: any) => { + console.log(res); + // 滚动消息提醒 + ElNotification({ + title: 'Success', + message: '获取实时消息成功!', + type: 'success', + }) + return true; + }).catch((err: any) => { + console.log(err); + ElNotification({ + title: 'Error', + message: '获取实时消息失败!', + type: 'error', + }) + return false; + }) +} + +export const apiMsgCount = (wxids: string[]) => { + return http.post('/api/rs/msg_count', { + "wxids": wxids + }).then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} +export const apiMsgCountSolo = (wxid: string) => { + if (is_local_data) { + return l_msg_count; + } + return apiMsgCount([wxid]).then((res: any) => { + return res[wxid] || 0; + }).catch((err: any) => { + console.log(err); + return 0; + }) +} + + +export const apiMsgs = (wxid: string, start: number, limit: number) => { + if (is_local_data) { + return { + 'msg_list': l_msg_list || [], + 'user_list': l_user_list || [], + } + } + return http.post('/api/rs/msg_list', { + 'start': start, + 'limit': limit, + 'wxid': wxid, + }).then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} diff --git a/pywxdump/ui/src/api/stat.ts b/pywxdump/ui/src/api/stat.ts new file mode 100644 index 0000000..d145857 --- /dev/null +++ b/pywxdump/ui/src/api/stat.ts @@ -0,0 +1,40 @@ +import http from "@/utils/axios.js"; + +const is_local_data = localStorage.getItem('isUseLocalData') === 't'; +// user list 部分 +export const apiDateCount = (wxid: string = '', start_time: number = 0, end_time: number = 0) => { + return http.post('/api/rs/date_count', { + 'wxid': wxid, + 'start_time': start_time, + 'end_time': end_time, + }).then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} +export const apiTalkerCount = (top: number = 10, start_time: number = 0, end_time: number = 0) => { + return http.post('/api/rs/top_talker_count', { + 'top': top, + 'start_time': start_time, + 'end_time': end_time, + }).then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} + +export const apiWordcloud = (target: string = "") => { + return http.post('/api/rs/wordcloud', { + target: target, + }).then((res: any) => { + return res; + }).catch((err: any) => { + console.log(err); + return ''; + }) +} + diff --git a/pywxdump/ui/src/assets/base.css b/pywxdump/ui/src/assets/base.css new file mode 100644 index 0000000..8fc1c0c --- /dev/null +++ b/pywxdump/ui/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +/* @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} */ + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/pywxdump/ui/src/assets/icon/AboutIcon.vue b/pywxdump/ui/src/assets/icon/AboutIcon.vue new file mode 100644 index 0000000..76d2720 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/AboutIcon.vue @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/ChatIcon.vue b/pywxdump/ui/src/assets/icon/ChatIcon.vue new file mode 100644 index 0000000..ec41cdd --- /dev/null +++ b/pywxdump/ui/src/assets/icon/ChatIcon.vue @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/CleanupIcon.vue b/pywxdump/ui/src/assets/icon/CleanupIcon.vue new file mode 100644 index 0000000..2e2a633 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/CleanupIcon.vue @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/CollapseCloseIcon.vue b/pywxdump/ui/src/assets/icon/CollapseCloseIcon.vue new file mode 100644 index 0000000..24de67a --- /dev/null +++ b/pywxdump/ui/src/assets/icon/CollapseCloseIcon.vue @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/CollapseIcon.vue b/pywxdump/ui/src/assets/icon/CollapseIcon.vue new file mode 100644 index 0000000..a8762ee --- /dev/null +++ b/pywxdump/ui/src/assets/icon/CollapseIcon.vue @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/CollapseOpenIcon.vue b/pywxdump/ui/src/assets/icon/CollapseOpenIcon.vue new file mode 100644 index 0000000..45ad591 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/CollapseOpenIcon.vue @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/ContactsIcon.vue b/pywxdump/ui/src/assets/icon/ContactsIcon.vue new file mode 100644 index 0000000..1ca6543 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/ContactsIcon.vue @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/FavoriteIcon.vue b/pywxdump/ui/src/assets/icon/FavoriteIcon.vue new file mode 100644 index 0000000..9684aae --- /dev/null +++ b/pywxdump/ui/src/assets/icon/FavoriteIcon.vue @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/HelpIcon.vue b/pywxdump/ui/src/assets/icon/HelpIcon.vue new file mode 100644 index 0000000..3c53ce1 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/HelpIcon.vue @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/HomeIcon.vue b/pywxdump/ui/src/assets/icon/HomeIcon.vue new file mode 100644 index 0000000..770822c --- /dev/null +++ b/pywxdump/ui/src/assets/icon/HomeIcon.vue @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/MomentsIcon.vue b/pywxdump/ui/src/assets/icon/MomentsIcon.vue new file mode 100644 index 0000000..c85dc06 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/MomentsIcon.vue @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/SettingIcon.vue b/pywxdump/ui/src/assets/icon/SettingIcon.vue new file mode 100644 index 0000000..a01ca51 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/SettingIcon.vue @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/StatisticsIcon.vue b/pywxdump/ui/src/assets/icon/StatisticsIcon.vue new file mode 100644 index 0000000..abc4e82 --- /dev/null +++ b/pywxdump/ui/src/assets/icon/StatisticsIcon.vue @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/icon/ToolsIcon.vue b/pywxdump/ui/src/assets/icon/ToolsIcon.vue new file mode 100644 index 0000000..1cdd60d --- /dev/null +++ b/pywxdump/ui/src/assets/icon/ToolsIcon.vue @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/pywxdump/ui/src/assets/img/qq.png b/pywxdump/ui/src/assets/img/qq.png new file mode 100644 index 0000000..222f4d9 Binary files /dev/null and b/pywxdump/ui/src/assets/img/qq.png differ diff --git a/pywxdump/ui/src/assets/img/qrcode_gh.jpg b/pywxdump/ui/src/assets/img/qrcode_gh.jpg new file mode 100644 index 0000000..321f1f9 Binary files /dev/null and b/pywxdump/ui/src/assets/img/qrcode_gh.jpg differ diff --git a/pywxdump/ui/src/assets/logo.svg b/pywxdump/ui/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/pywxdump/ui/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/pywxdump/ui/src/assets/main.css b/pywxdump/ui/src/assets/main.css new file mode 100644 index 0000000..36fb845 --- /dev/null +++ b/pywxdump/ui/src/assets/main.css @@ -0,0 +1,35 @@ +@import './base.css'; + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + font-weight: normal; +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; + padding: 3px; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +@media (min-width: 1024px) { + body { + display: flex; + place-items: center; + } + + #app { + display: grid; + grid-template-columns: 1fr 1fr; + padding: 0 2rem; + } +} diff --git a/pywxdump/ui/src/components/chat/ChatRecords.vue b/pywxdump/ui/src/components/chat/ChatRecords.vue new file mode 100644 index 0000000..10e8429 --- /dev/null +++ b/pywxdump/ui/src/components/chat/ChatRecords.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/pywxdump/ui/src/components/chat/ChatRecordsMain.vue b/pywxdump/ui/src/components/chat/ChatRecordsMain.vue new file mode 100644 index 0000000..3bb6452 --- /dev/null +++ b/pywxdump/ui/src/components/chat/ChatRecordsMain.vue @@ -0,0 +1,346 @@ + + + + + diff --git a/pywxdump/ui/src/components/chat/ChatRecprdsHeader.vue b/pywxdump/ui/src/components/chat/ChatRecprdsHeader.vue new file mode 100644 index 0000000..7a28d9e --- /dev/null +++ b/pywxdump/ui/src/components/chat/ChatRecprdsHeader.vue @@ -0,0 +1,201 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chat/ContactsList.vue b/pywxdump/ui/src/components/chat/ContactsList.vue new file mode 100644 index 0000000..a34b0f1 --- /dev/null +++ b/pywxdump/ui/src/components/chat/ContactsList.vue @@ -0,0 +1,122 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chat/components/UserInfoShow.vue b/pywxdump/ui/src/components/chat/components/UserInfoShow.vue new file mode 100644 index 0000000..4f3de08 --- /dev/null +++ b/pywxdump/ui/src/components/chat/components/UserInfoShow.vue @@ -0,0 +1,111 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chat/message/MessageAudio.vue b/pywxdump/ui/src/components/chat/message/MessageAudio.vue new file mode 100644 index 0000000..6863e3a --- /dev/null +++ b/pywxdump/ui/src/components/chat/message/MessageAudio.vue @@ -0,0 +1,216 @@ + + + + + + diff --git a/pywxdump/ui/src/components/chat/message/MessageEmoji.vue b/pywxdump/ui/src/components/chat/message/MessageEmoji.vue new file mode 100644 index 0000000..78c07f7 --- /dev/null +++ b/pywxdump/ui/src/components/chat/message/MessageEmoji.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/pywxdump/ui/src/components/chat/message/MessageFile.vue b/pywxdump/ui/src/components/chat/message/MessageFile.vue new file mode 100644 index 0000000..aa9c07f --- /dev/null +++ b/pywxdump/ui/src/components/chat/message/MessageFile.vue @@ -0,0 +1,223 @@ + + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chat/message/MessageImg.vue b/pywxdump/ui/src/components/chat/message/MessageImg.vue new file mode 100644 index 0000000..7ce0f34 --- /dev/null +++ b/pywxdump/ui/src/components/chat/message/MessageImg.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/pywxdump/ui/src/components/chat/message/MessageOther.vue b/pywxdump/ui/src/components/chat/message/MessageOther.vue new file mode 100644 index 0000000..e06c88f --- /dev/null +++ b/pywxdump/ui/src/components/chat/message/MessageOther.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/pywxdump/ui/src/components/chat/message/MessageText.vue b/pywxdump/ui/src/components/chat/message/MessageText.vue new file mode 100644 index 0000000..4e2b858 --- /dev/null +++ b/pywxdump/ui/src/components/chat/message/MessageText.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/pywxdump/ui/src/components/chat/message/MessageVideo.vue b/pywxdump/ui/src/components/chat/message/MessageVideo.vue new file mode 100644 index 0000000..a7c34b0 --- /dev/null +++ b/pywxdump/ui/src/components/chat/message/MessageVideo.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/pywxdump/ui/src/components/chatBackup/ChatExportMain.vue b/pywxdump/ui/src/components/chatBackup/ChatExportMain.vue new file mode 100644 index 0000000..d6122d0 --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ChatExportMain.vue @@ -0,0 +1,105 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chatBackup/ExportCSV.vue b/pywxdump/ui/src/components/chatBackup/ExportCSV.vue new file mode 100644 index 0000000..34e6c94 --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ExportCSV.vue @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chatBackup/ExportDEDB.vue b/pywxdump/ui/src/components/chatBackup/ExportDEDB.vue new file mode 100644 index 0000000..265ca98 --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ExportDEDB.vue @@ -0,0 +1,63 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chatBackup/ExportDOCX.vue b/pywxdump/ui/src/components/chatBackup/ExportDOCX.vue new file mode 100644 index 0000000..25e50e0 --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ExportDOCX.vue @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chatBackup/ExportENDB.vue b/pywxdump/ui/src/components/chatBackup/ExportENDB.vue new file mode 100644 index 0000000..29b833a --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ExportENDB.vue @@ -0,0 +1,54 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chatBackup/ExportHTML.vue b/pywxdump/ui/src/components/chatBackup/ExportHTML.vue new file mode 100644 index 0000000..8b69739 --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ExportHTML.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chatBackup/ExportJSON.vue b/pywxdump/ui/src/components/chatBackup/ExportJSON.vue new file mode 100644 index 0000000..4028756 --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ExportJSON.vue @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/chatBackup/ExportPDF.vue b/pywxdump/ui/src/components/chatBackup/ExportPDF.vue new file mode 100644 index 0000000..25e50e0 --- /dev/null +++ b/pywxdump/ui/src/components/chatBackup/ExportPDF.vue @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/icons/IconCommunity.vue b/pywxdump/ui/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/pywxdump/ui/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/pywxdump/ui/src/components/icons/IconDocumentation.vue b/pywxdump/ui/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/pywxdump/ui/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/pywxdump/ui/src/components/icons/IconEcosystem.vue b/pywxdump/ui/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/pywxdump/ui/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/pywxdump/ui/src/components/icons/IconSupport.vue b/pywxdump/ui/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/pywxdump/ui/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/pywxdump/ui/src/components/icons/IconTooling.vue b/pywxdump/ui/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/pywxdump/ui/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/pywxdump/ui/src/components/stats/ContactStats.vue b/pywxdump/ui/src/components/stats/ContactStats.vue new file mode 100644 index 0000000..0309dbd --- /dev/null +++ b/pywxdump/ui/src/components/stats/ContactStats.vue @@ -0,0 +1,173 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/stats/DateChatHeatmapStats.vue b/pywxdump/ui/src/components/stats/DateChatHeatmapStats.vue new file mode 100644 index 0000000..f272946 --- /dev/null +++ b/pywxdump/ui/src/components/stats/DateChatHeatmapStats.vue @@ -0,0 +1,227 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/stats/DateChatStats.vue b/pywxdump/ui/src/components/stats/DateChatStats.vue new file mode 100644 index 0000000..8b13aa0 --- /dev/null +++ b/pywxdump/ui/src/components/stats/DateChatStats.vue @@ -0,0 +1,326 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/stats/components/ChartInit.vue b/pywxdump/ui/src/components/stats/components/ChartInit.vue new file mode 100644 index 0000000..d826885 --- /dev/null +++ b/pywxdump/ui/src/components/stats/components/ChartInit.vue @@ -0,0 +1,46 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/utils/ColorSelect.vue b/pywxdump/ui/src/components/utils/ColorSelect.vue new file mode 100644 index 0000000..12794f7 --- /dev/null +++ b/pywxdump/ui/src/components/utils/ColorSelect.vue @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/utils/DateTimeSelect.vue b/pywxdump/ui/src/components/utils/DateTimeSelect.vue new file mode 100644 index 0000000..50603c1 --- /dev/null +++ b/pywxdump/ui/src/components/utils/DateTimeSelect.vue @@ -0,0 +1,135 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/utils/DbInitComponent.vue b/pywxdump/ui/src/components/utils/DbInitComponent.vue new file mode 100644 index 0000000..63c9e4d --- /dev/null +++ b/pywxdump/ui/src/components/utils/DbInitComponent.vue @@ -0,0 +1,383 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/utils/NumberInput.vue b/pywxdump/ui/src/components/utils/NumberInput.vue new file mode 100644 index 0000000..49e968b --- /dev/null +++ b/pywxdump/ui/src/components/utils/NumberInput.vue @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/components/utils/ProgressBar.vue b/pywxdump/ui/src/components/utils/ProgressBar.vue new file mode 100644 index 0000000..60a9663 --- /dev/null +++ b/pywxdump/ui/src/components/utils/ProgressBar.vue @@ -0,0 +1,56 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/main.ts b/pywxdump/ui/src/main.ts new file mode 100644 index 0000000..513908f --- /dev/null +++ b/pywxdump/ui/src/main.ts @@ -0,0 +1,28 @@ +import './assets/main.css' + +import {createApp} from 'vue' + +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import Markdown from 'vue3-markdown-it'; + +import App from './App.vue' +import router from './router' + + +const app = createApp(App) +app.use(router) + +// import Appexport from "@/Appexport.vue"; +// const app = createApp(Appexport) + +app.use(ElementPlus) +app.use(Markdown) + +app.provide('msg_path', ''); +app.provide('micro_path', ''); +app.provide('media_path', ''); +app.provide('filestorage_path', ''); +app.provide('user_list', []); + +app.mount('#app') diff --git a/pywxdump/ui/src/router/index.ts b/pywxdump/ui/src/router/index.ts new file mode 100644 index 0000000..e6b2c2f --- /dev/null +++ b/pywxdump/ui/src/router/index.ts @@ -0,0 +1,97 @@ +import {createRouter, createWebHashHistory} from 'vue-router' + +const router = createRouter({ + history: createWebHashHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'index', + component: () => import((`@/views/IndexView.vue`)) + }, + { + path: '/db_init', + name: 'db_init', + component: () => import((`@/views/DbInitView.vue`)) + }, + { + path: '/home', + name: 'home', + component: () => import((`@/views/HomeView.vue`)) + }, + { + path: '/chat', + name: 'chat', + component: () => import((`@/views/ChatView.vue`)) + }, + { + path: '/contacts', + name: 'contacts', + component: () => import((`@/views/ContactsView.vue`)) + }, + { + path: '/moments', + name: 'moments', + component: () => import((`@/views/MomentsView.vue`)) + }, + { + path: '/favorite', + name: 'favorite', + component: () => import((`@/views/FavoriteView.vue`)) + }, + { + path: '/cleanup', + name: 'cleanup', + component: () => import((`@/views/CleanupView.vue`)) + }, + { + path: '/statistics', + name: 'statistics', + component: () => import((`@/views/StatisticsView.vue`)) + }, + + // 专业工具 + { + path: '/wxinfo', + name: 'wxinfo', + component: () => import((`@/views/tools/WxinfoView.vue`)) + }, + { + path: '/bias', + name: 'bias', + component: () => import((`@/views/tools/BiasView.vue`)) + }, + { + path: '/merge', + name: 'merge', + component: () => import((`@/views/tools/MergeView.vue`)) + }, + { + path: '/decrypt', + name: 'decrypt', + component: () => import((`@/views/tools/DecryptView.vue`)) + }, + + // 其他 关于、帮助、设置 + { + path: '/about', + name: 'about', + // route level code-splitting + // this generates a separate chunk (About.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import((`@/views/other/AboutView.vue`)) + }, + { + path: '/help', + name: 'help', + component: () => import((`@/views/other/HelpView.vue`)) + }, + { + path: '/setting', + name: 'setting', + component: () => import((`@/views/other/SettingView.vue`)) + }, + ] +}) + + +export default router diff --git a/pywxdump/ui/src/utils/axios.js b/pywxdump/ui/src/utils/axios.js new file mode 100644 index 0000000..feb00cb --- /dev/null +++ b/pywxdump/ui/src/utils/axios.js @@ -0,0 +1,76 @@ +// 创建一个 axios 实例 +import axios from 'axios' +import { to_initview } from '@/utils/common_utils' +// import {inject, onMounted} from 'vue'; + +const params = process.env.NODE_ENV === 'development' ? { + baseURL: 'http://127.0.0.1:5000', // 根据你的实际情况设置基础URL + withCredentials: true, // 表示跨域请求时是否需要使用凭证,开启后,后端服务器要设置允许开启 +} : { + withCredentials: true, // 表示跨域请求时是否需要使用凭证,开启后,后端服务器要设置允许开启 +} + +const http = axios.create(params) + +// 请求拦截器 +http.interceptors.request.use( + (config) => { + // 在发送请求之前做些什么,比如添加请求头 + config.headers['Content-Type'] = 'application/json' // 根据您的需求设置其他请求头 + // config.headers['msg_path'] = inject("msg_path"); + // config.headers['micro_path'] = inject("micro_path"); + // config.headers['media_path'] = inject("media_path"); + // config.headers['filestorage_path'] = inject("filestorage_path"); + // 补全路径 + // console.log('config.url', config.url); + return config + }, + (error) => { + // 对请求错误做些什么 + console.log('Error Message:', error.message) + return Promise.reject(error) + } +) + +// 响应拦截器 +http.interceptors.response.use( + (response) => { + // 对响应数据做点什么 + if (response.data.code === 0) { + // 如果后端返回的状态码是0 ,说明接口请求成功 + // 这里直接返回后端返回的数据 + return response.data.body + } else if (response.data.code === 1001 && 'my_wxid is required' in response.data.body) { + // 如果后端返回的状态码是1001,说明用户未登录 + // 这里直接返回后端返回的数据 + // 跳转到登录页面 + to_initview(); + return Promise.reject(response.data) + } else { + // 如果不是 200,说明接口请求失败,弹出后端给的错误提示 + console.error('Error Message:', response.data) + return Promise.reject(response.data) + } + }, + (error) => { + // 对响应错误做点什么 + if (error.response) { + // 请求已发出,但服务器响应的状态码不在 2xx 范围内 + console.error('HTTP Error Response:', error.response.status) + } else if (error.request) { + // 请求已发出,但没有收到响应 + console.error('No response received:', error.request) + } else { + // 发送请求时发生了一些事情,触发了错误 + console.error('Error sending request:', error.message) + } + + // 把url+参数+错误传递给调用者 + return Promise.reject({ + message: error.message, + url: error.config.url, + params: error.config.params + }) + } +) +export default http diff --git a/pywxdump/ui/src/utils/common_utils.ts b/pywxdump/ui/src/utils/common_utils.ts new file mode 100644 index 0000000..4e62e17 --- /dev/null +++ b/pywxdump/ui/src/utils/common_utils.ts @@ -0,0 +1,82 @@ +import {ElMessage} from "element-plus"; +import router from "@/router"; +import http from '@/utils/axios.js'; +import {api_db_init} from "@/api/base"; + +export interface ExtraBuf { + "个性签名": string + "企微属性": string + "公司名称": string + "国": string + "备注图片": string + "备注图片2": string + "市": string + "性别[1男2女]": number + "手机号": string + "朋友圈背景": string + "省": string +} + +export interface User { + wxid: string + nOrder: number + nUnReadCount: number + strNickName: string + nStatus: number + nIsSend: number + strContent: string + nMsgLocalID: number + nMsgStatus: number + nTime: string + nMsgType: number + nMsgSubType: number + nickname: string + remark: string + account: string + describe: string + headImgUrl: string + ExtraBuf: ExtraBuf + LabelIDList: string[], + extra: object | null +} + +export interface UserList { + [key: string]: User +} + +export interface msg { + id: number + MsgSvrID: string + type_name: string + is_sender: number + talker: string + room_name: string + msg: string + src: string + CreateTime: string + extra: {} +} + +// {"id": _id, "MsgSvrID": str(MsgSvrID), "type_name": type_name, "is_sender": IsSender, +// "talker": talker, "room_name": StrTalker, "msg": msg, "src": src, "extra": {}, +// "CreateTime": CreateTime, } + +export const to_initview = () => { + router.push({name: 'db_init'}); + ElMessage.error('请先初始化数据'); +} + +export const is_db_init = async () => { + const t = await api_db_init(); + localStorage.setItem('isDbInit', t ? 't' : 'f'); + !t ? to_initview() : null; + return t; +} + +export const is_use_local_data = () => { + return localStorage.getItem('isUseLocalData') === 't'; +} + +export const gen_show_name = (userinfo: User) => { + return userinfo?.remark || userinfo?.nickname || userinfo?.strNickName || userinfo?.account || userinfo?.wxid || '未知'; +} diff --git a/pywxdump/ui/src/views/ChatView.vue b/pywxdump/ui/src/views/ChatView.vue new file mode 100644 index 0000000..bfc91d4 --- /dev/null +++ b/pywxdump/ui/src/views/ChatView.vue @@ -0,0 +1,47 @@ + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/CleanupView.vue b/pywxdump/ui/src/views/CleanupView.vue new file mode 100644 index 0000000..c483c25 --- /dev/null +++ b/pywxdump/ui/src/views/CleanupView.vue @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/ContactsView.vue b/pywxdump/ui/src/views/ContactsView.vue new file mode 100644 index 0000000..e964747 --- /dev/null +++ b/pywxdump/ui/src/views/ContactsView.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/DbInitView.vue b/pywxdump/ui/src/views/DbInitView.vue new file mode 100644 index 0000000..841d2d9 --- /dev/null +++ b/pywxdump/ui/src/views/DbInitView.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/FavoriteView.vue b/pywxdump/ui/src/views/FavoriteView.vue new file mode 100644 index 0000000..c82d591 --- /dev/null +++ b/pywxdump/ui/src/views/FavoriteView.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/HomeView.vue b/pywxdump/ui/src/views/HomeView.vue new file mode 100644 index 0000000..c82d591 --- /dev/null +++ b/pywxdump/ui/src/views/HomeView.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/IndexView.vue b/pywxdump/ui/src/views/IndexView.vue new file mode 100644 index 0000000..c82d591 --- /dev/null +++ b/pywxdump/ui/src/views/IndexView.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/MomentsView.vue b/pywxdump/ui/src/views/MomentsView.vue new file mode 100644 index 0000000..c82d591 --- /dev/null +++ b/pywxdump/ui/src/views/MomentsView.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/StatisticsView.vue b/pywxdump/ui/src/views/StatisticsView.vue new file mode 100644 index 0000000..58ccd3f --- /dev/null +++ b/pywxdump/ui/src/views/StatisticsView.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/other/AboutView.vue b/pywxdump/ui/src/views/other/AboutView.vue new file mode 100644 index 0000000..fd0283f --- /dev/null +++ b/pywxdump/ui/src/views/other/AboutView.vue @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/other/HelpView.vue b/pywxdump/ui/src/views/other/HelpView.vue new file mode 100644 index 0000000..6c3c648 --- /dev/null +++ b/pywxdump/ui/src/views/other/HelpView.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/other/SettingView.vue b/pywxdump/ui/src/views/other/SettingView.vue new file mode 100644 index 0000000..70f66e9 --- /dev/null +++ b/pywxdump/ui/src/views/other/SettingView.vue @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/tools/BiasView.vue b/pywxdump/ui/src/views/tools/BiasView.vue new file mode 100644 index 0000000..2cbbe4c --- /dev/null +++ b/pywxdump/ui/src/views/tools/BiasView.vue @@ -0,0 +1,75 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/tools/DecryptView.vue b/pywxdump/ui/src/views/tools/DecryptView.vue new file mode 100644 index 0000000..607357f --- /dev/null +++ b/pywxdump/ui/src/views/tools/DecryptView.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/tools/MergeView.vue b/pywxdump/ui/src/views/tools/MergeView.vue new file mode 100644 index 0000000..44e87c7 --- /dev/null +++ b/pywxdump/ui/src/views/tools/MergeView.vue @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/src/views/tools/WxinfoView.vue b/pywxdump/ui/src/views/tools/WxinfoView.vue new file mode 100644 index 0000000..2e93589 --- /dev/null +++ b/pywxdump/ui/src/views/tools/WxinfoView.vue @@ -0,0 +1,95 @@ + + + + + \ No newline at end of file diff --git a/pywxdump/ui/tsconfig.app.json b/pywxdump/ui/tsconfig.app.json new file mode 100644 index 0000000..491e093 --- /dev/null +++ b/pywxdump/ui/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "noEmit": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/pywxdump/ui/tsconfig.json b/pywxdump/ui/tsconfig.json new file mode 100644 index 0000000..51f6b28 --- /dev/null +++ b/pywxdump/ui/tsconfig.json @@ -0,0 +1,18 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ], + "compilerOptions": { + "types": [ + "node", + "axios" + ], + "allowJs": true + } +} diff --git a/pywxdump/ui/tsconfig.node.json b/pywxdump/ui/tsconfig.node.json new file mode 100644 index 0000000..46cf2e1 --- /dev/null +++ b/pywxdump/ui/tsconfig.node.json @@ -0,0 +1,17 @@ +{ + "extends": "@tsconfig/node18/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/pywxdump/ui/vite.config.ts b/pywxdump/ui/vite.config.ts new file mode 100644 index 0000000..8be7c1a --- /dev/null +++ b/pywxdump/ui/vite.config.ts @@ -0,0 +1,53 @@ +import {fileURLToPath, URL} from 'node:url' + +import {defineConfig} from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + }, + base: './', + server: { + // 访问项目的IP地址,可以设置为“0.0.0.0”来使项目外部可访问 + host: "0.0.0.0", + // 访问项目的端口号 + port: 8080, + // 自动启动浏览器 + open: false, + // 配置反向代理处理跨域请求 + proxy: { + "/api/ls": { + target: "http://127.0.0.1:5000", + changeOrigin: true, //是否跨域 + // rewrite: (path) => path.replace(/^\/mis/, ""), //因为后端接口有mis前缀,所以不需要替换 + // ws: true, //是否代理 websockets + // secure: true, //是否https接口 + }, + "/api/rs": { + target: "http://127.0.0.1:5000", + changeOrigin: true, //是否跨域 + // rewrite: (path) => path.replace(/^\/mis/, ""), //因为后端接口有mis前缀,所以不需要替换 + // ws: true, //是否代理 websockets + // secure: true, //是否https接口 + }, + }, + }, + // build: { + // rollupOptions: { + // output: { + // chunkFileNames: 'js-[name]-[hash].js', + // entryFileNames: 'js-[name]-[hash].js', + // assetFileNames: '[ext]-[name]-[hash][extname]', + // } + // } + // } +}) diff --git a/test.html b/test.html new file mode 100644 index 0000000..5a69d38 --- /dev/null +++ b/test.html @@ -0,0 +1,718 @@ + + + + + aaaaaaaaaa紧急事件报告日报 - 2025-04-27至2025-04-29 + + + +
+

aaaaaaaaaa紧急事件报告日报

+

2025-04-27至2025-04-29

+
+ 总消息数:302 + 活跃用户:4 + 时间范围:2025-04-27 11:33:20至2025-04-29 19:25:36 +
+
+ + +
+

今日讨论热点

+
+
+

计算机设计大赛项目准备

+
学术竞赛
+

群成员围绕中国大学生计算机设计大赛参赛作品《文书宝典——智能公文库与写作平台》展开密集讨论,涉及文档编写、PPT制作、答辩视频准备等工作。

+
+ PPT制作 + 技术展示 + 文档格式 +
+
提及次数:287
+
+
+
+ + +
+

实用教程与资源分享

+
+
+
RESOURCE
+

CSDN技术博客:计算机大赛经验

+
+ 分享者:昏沉沉的 + +
+

关于计算机设计大赛的技术实现参考文章

+
+

要点:

+
    +
  • 获奖项目技术分析
  • +
  • 功能实现方案
  • +
+
+ +
分类:技术参考
+
+
+
TUTORIAL
+

在线文档:技术要点整理

+
+ 分享者:昏沉沉的 + +
+

项目核心技术要点汇总文档

+
+

要点:

+
    +
  • 前端技术
  • +
  • 后端架构
  • +
  • AI应用
  • +
+
+ +
分类:技术文档
+
+
+
+ + +
+

重要消息汇总

+
+
+
+ 2025-04-28 21:18:13 + 杨莅沅老师 + NOTICE + 优先级:高 +
+

秦大拿,现在进度怎么样了,今晚能交上吗

+
+
+
+ 2025-04-29 17:06:55 + 杨莅沅老师 + ANNOUNCEMENT + 优先级:高 +
+

秦大拿看一遍ppt内容还有要修正的吗

+
+
+
+ + +
+

有趣对话或金句

+
+
+
DIALOGUE
+
+
+
+ 杨莅沅老师 + 2025-04-29 06:15:34 +
+

那你硬拖着,看我挨骂啊

+
+
+
+ 数媒技术春季班冯圣磊 + 2025-04-29 06:16:08 +
+

[呲牙]

+
+
+
关于PPT制作进度的幽默对峙
+
相关话题:项目时间管理
+
+
+
+ + +
+

问题与解答

+
+
+
+
+ 昏沉沉的 + 2025-04-29 08:26:44 +
+

你用ai直接生成的吗

+
+ PPT制作 + AI应用 +
+
+
+
+
+ 数媒技术春季班冯圣磊 + 2025-04-29 08:27:21 + 最佳回答 +
+

不完全是,有些是昨晚提取的,今早列上

+
+
+
+
+
+ + +
+

群内数据可视化

+ +

话题热度

+
+
+
文档修改
+
35%
+
+
+
+
42条消息
+
+
+
PPT制作
+
30%
+
+
+
+
36条消息
+
+
+ +

话唠榜

+
+
+
1
+
+
昏沉沉的
+
128 条消息
+
+ 技术主导 + 进度督促 +
+
+
+
+
2
+
+
杨莅沅老师
+
87 条消息
+
+ 质量把控 + 格式要求 +
+
+
+
+ +

熬夜冠军

+
+
+
👑
+
+
刘蕴萱
+
深夜文档侠
+
最晚活跃时间:2025-04-28 04:01:13
+
深夜消息数:5
+
注:熬夜时段定义为23:00-06:00,已考虑不同时区
+
+
+
+
+ + +
+

热门词云

+
+
+ PPT + 文档 +
+
+
+ + 项目材料 相关词汇 +
+
+ + 技术术语 相关词汇 +
+
+
+
+ +
+

数据来源:aaaaaaaaaa紧急事件聊天记录

+

生成时间:2025-04-30 10:00:00

+

统计周期:2025-04-27 11:33:20 至 2025-04-29 19:25:36

+

免责声明:本报告内容基于群聊公开讨论,如有不当内容或侵权问题请联系管理员处理。

+
+ + \ No newline at end of file diff --git a/test.py b/test.py new file mode 100644 index 0000000..dfb8074 --- /dev/null +++ b/test.py @@ -0,0 +1,921 @@ +import json +import re + + + +def main(json_data): + # 加载模板 + html = """ + + + + + [群/用户名称]日报 - [日期] + + + +
+

[群/用户名称]日报

+

[日期]

+
+ 总消息数:[数量] + 活跃用户:[数量] + 时间范围:[时间范围] +
+
+ + + + +
+

今日讨论热点

+
+ + + + +
+
+ + +
+

实用教程与资源分享

+
+ + + + +
+
+ + +
+

重要消息汇总

+
+ + + + +
+
+ + +
+

有趣对话或金句

+
+ + + + +
+
+ + +
+

问题与解答

+
+ + + + +
+
+ + +
+

群内数据可视化

+ + +

话题热度

+
+ + + + + + +
+ + + +
+

话唠榜

+
+ + +
+
+ + + +

熬夜冠军

+
+ + + +
+
+ + +
+

热门词云

+
+ +
+ + + + + +
+ +
+ + + +
+
+
+ + +
+

数据来源:[群名称]聊天记录

+

生成时间:[当前时间]

+

统计周期:[日期] [时间范围]

+

免责声明:本报告内容基于群聊公开讨论,如有不当内容或侵权问题请联系管理员处理。

+
+ + + + + """ + + + json_data = json_data[7:-3] + # 清洗json_data + # 判断是否是转义的换行符 + if '\n' in json_data: + json_data = json_data.replace('\n', '\n') + + + else: + json_data = json_data.replace(r'\"','"').replace(r"\n",'\n') + + # print(json_data) + + + + + # 使用正则表达式查找json字符串 + pattern = re.compile('{.*}', flags=re.IGNORECASE | re.MULTILINE | re.S) + print(pattern.search(json_data).group()) + + json_data = json.loads(pattern.search(json_data).group()) + # json_data = json.loads(json_data) + + + # print(json_data) + + # print(json.dumps(json_data,indent=4, ensure_ascii=False)) + + # 替换头部信息 + header = json_data['header'] + html = html.replace('[群/用户名称]日报', f"{header['title']}报告") + html = html.replace('[日期]', header['date']) + html = html.replace('总消息数:[数量]', f"总消息数:{header['metaInfo']['totalMessages']}") + html = html.replace('活跃用户:[数量]', f"活跃用户:{header['metaInfo']['activeUsers']}") + html = html.replace('时间范围:[时间范围]', f"时间范围:{header['metaInfo']['timeRange']}") + + # 处理热点话题 + hot_topics = [] + for topic in json_data['sections']['hotTopics']['items']: + keywords = ''.join([f'{kw}' for kw in topic['keywords']]) + hot_topics.append(f""" +
+

{topic['name']}

+
{topic['category']}
+

{topic['summary']}

+
+ {keywords} +
+
提及次数:{topic['mentions']}
+
""") + html = html.replace('', '\n'.join(hot_topics)) + + # 处理教程资源 + tutorials = [] + for tut in json_data['sections']['tutorials']['items']: + points = ''.join([f'
  • {p}
  • ' for p in tut['keyPoints']]) + tutorials.append(f""" +
    +
    {tut['type']}
    +

    {tut['title']}

    +
    + 分享者:{tut['sharedBy']} + +
    +

    {tut['summary']}

    +
    +

    要点:

    +
      {points}
    +
    + +
    分类:{tut['category']}
    +
    """) + html = html.replace('', '\n'.join(tutorials)) + + # 处理重要消息 + messages = [] + for msg in json_data['sections']['importantMessages']['items']: + messages.append(f""" +
    +
    + {msg['time']} + {msg['sender']} + {msg['type']} + 优先级:{msg['priority']} +
    +

    {msg['content']}

    +
    +

    {msg['fullContent']}

    +
    +
    """) + html = html.replace('', '\n'.join(messages)) + + # 处理对话 + dialogues = [] + for dia in json_data['sections']['dialogues']['items']: + messages = ''.join([f""" +
    +
    + {m['speaker']} + {m['time']} +
    +

    {m['content']}

    +
    """ for m in dia['messages']]) + dialogues.append(f""" +
    +
    {dia['type']}
    +
    + {messages} +
    +
    {dia['highlight']}
    +
    相关话题:{dia['relatedTopic']}
    +
    """) + html = html.replace('', '\n'.join(dialogues)) + + # 处理问答 + qas = [] + for qa in json_data['sections']['qa']['items']: + tags = ''.join([f'{tag}' for tag in qa['question']['tags']]) + answers = ''.join([f""" +
    +
    + {ans['responder']} + {ans['time']} + {"最佳回答" if ans['isAccepted'] else ""} +
    +

    {ans['content']}

    +
    """ for ans in qa['answers']]) + qas.append(f""" +
    +
    +
    + {qa['question']['asker']} + {qa['question']['time']} +
    +

    {qa['question']['content']}

    +
    + {tags} +
    +
    +
    + {answers} +
    +
    """) + html = html.replace('', '\n'.join(qas)) + + # 处理数据可视化 + heatmap = [] + colors = ['#3da9fc', '#f25f4c', '#7209b7', '#e53170', '#00b4d8', '#4cc9f0'] + for i, topic in enumerate(json_data['sections']['analytics']['heatmap']): + color = colors[i % len(colors)] + heatmap.append(f""" +
    +
    {topic['topic']}
    +
    {topic['percentage']}%
    +
    +
    +
    +
    {topic['count']}条消息
    +
    """) + html = html.replace('', '\n'.join(heatmap)) + + # 处理话唠榜 + chatty = [] + for rank in json_data['sections']['analytics']['chattyRanking']: + words = ''.join([f'{w}' for w in rank['commonWords']]) + characteristics = ''.join([f'{c}' for c in rank['characteristics']]) + chatty.append(f""" +
    +
    {rank['rank']}
    +
    +
    {rank['name']}
    +
    发言数:{rank['count']}
    +
    + {characteristics} +
    +
    + {words} +
    +
    +
    """) + html = html.replace('', '\n'.join(chatty)) + + + + # 处理熬夜冠军 + nightOwl = json_data['sections']['analytics']['nightOwl'] + + f = f""" +
    +
    👑
    +
    +
    {nightOwl['name']}
    +
    {nightOwl['title']}
    +
    最晚活跃时间:{nightOwl['latestTime']}
    +
    深夜消息数:{nightOwl['messageCount']}
    +
    {nightOwl['lastMessage']}
    +
    注:熬夜时段定义为23:00-06:00,已考虑不同时区
    +
    """ + + html = html.replace('','\n' + f + '\n') + + + # 处理词云 + words = [] + for word in json_data['sections']['wordCloud']['words']: + + words.append(f""" + {word['text']}""") + html = html.replace('', '\n'.join(words)) + + # 处理词云的分类 + types = [] + for typ in json_data['sections']['wordCloud']['legend']: + types.append(f"""
    + + {typ['label']} +
    + """ + ) + + html = html.replace('', '\n'.join(types)) + + + + + # 处理页脚 + footer = json_data['footer'] + html = html.replace('[群名称]', footer['dataSource']) + html = html.replace('[当前时间]', footer['generationTime']) + html = html.replace('[日期] [时间范围]', footer['statisticalPeriod']) + + return html + + + + + + +if __name__ == '__main__': + + json_data = r"```json\n{\n\"header\": {\n\"title\": \"群聊报告\",\n\"date\": \"2025-04-29\",\n\"metaInfo\": {\n\"totalMessages\": \"30\",\n\"activeUsers\": \"12\",\n\"timeRange\": \"07:03:10 - 15:36:25\"\n}\n},\n\"sections\": {\n\"hotTopics\": {\n\"items\": [\n{\n\"name\": \"AI技术讨论\",\n\"category\": \"科技\",\n\"summary\": \"群内围绕AI技术进行了深入讨论,包括Qwen3模型的开源、Vidu Q1的体验、夸克AI相机等话题。\",\n\"keywords\": [\"Qwen3\", \"Vidu Q1\", \"夸克AI相机\"],\n\"mentions\": \"10\"\n},\n{\n\"name\": \"熬夜与加班\",\n\"category\": \"生活\",\n\"summary\": \"群成员讨论了熬夜和加班的现象,尤其是科技行业的加班文化及其对身体的影响。\",\n\"keywords\": [\"熬夜\", \"加班\", \"卷王\"],\n\"mentions\": \"8\"\n}\n]\n},\n\"tutorials\": {\n\"items\": [\n{\n\"type\": \"TUTORIAL\",\n\"title\": \"Qwen3深夜正式开源\",\n\"sharedBy\": \"苍何\",\n\"time\": \"2025-04-29 09:20:23\",\n\"summary\": \"Qwen3小尺寸也能大力出奇迹,欢迎来到这个荒诞又灿烂的时代。\",\n\"keyPoints\": [\"开源\", \"小尺寸\", \"高性能\"],\n\"url\": \"http://mp.weixin.qq.com/s?__biz=MzIyMzA5NjEyMA==&mid=2647670717&idx=1&sn=edec1f6cda0c1227e72cd07abf4228ff&chksm=f19a699bb993eb9ed2850ba329f382668bc7edc8a2d7d4a94de2d29c15cf87aa05bf6b48dc6d&mpshare=1&scene=1&srcid=0429TzXAJtS5jA2QI9hLEroV&sharer_shareinfo=7fd7493f3ccf9923f55b48a05619ce1b&sharer_shareinfo_first=fc872ba73c219b858d700a9db530b5b1#rd\",\n\"domain\": \"mp.weixin.qq.com\",\n\"category\": \"AI\"\n},\n{\n\"type\": \"TUTORIAL\",\n\"title\": \"体验完刚上线的Vidu Q1\",\n\"sharedBy\": \"苍何\",\n\"time\": \"2025-04-29 09:39:42\",\n\"summary\": \"AI视频清晰度,一致性都上了一个台阶。\",\n\"keyPoints\": [\"Vidu Q1\", \"AI视频\", \"清晰度\"],\n\"url\": \"http://mp.weixin.qq.com/s?__biz=MzU4NTE1Mjg4MA==&mid=2247493267&idx=1&sn=0189fb501578ce8e27142fbe2f590d03&chksm=fc9a946728c367005c19cb5a335300d05d51a441f9f20424a0a72c904a47bdf003252576318a&mpshare=1&scene=1&srcid=04297l70B2zsuypDfjUh0rh5&sharer_shareinfo=181efb947f938ab90786c776bf7bbda7&sharer_shareinfo_first=181efb947f938ab90786c776bf7bbda7#rd\",\n\"domain\": \"mp.weixin.qq.com\",\n\"category\": \"AI\"\n},\n{\n\"type\": \"TUTORIAL\",\n\"title\": \"阿里新出的夸克AI相机\",\n\"sharedBy\": \"苍何\",\n\"time\": \"2025-04-29 09:42:38\",\n\"summary\": \"夸克AI相机超多新奇的玩法,太抽象了。\",\n\"keyPoints\": [\"夸克AI相机\", \"新奇玩法\", \"抽象\"],\n\"url\": \"http://mp.weixin.qq.com/s?__biz=MzU4NTE1Mjg4MA==&mid=2247493275&idx=1&sn=93556ddd1da7fb8733a23a7c4adbb76b&chksm=fc2a2d25774cce23c75acd8850b85c585c0bcf78d14b810e157efaec5106abf563cf58e26aef&mpshare=1&scene=1&srcid=0429vDf8NbEzNLBQQyFlABmU&sharer_shareinfo=28b94477ec8201b88aa30338e82e8999&sharer_shareinfo_first=28b94477ec8201b88aa30338e82e8999#rd\",\n\"domain\": \"mp.weixin.qq.com\",\n\"category\": \"AI\"\n},\n{\n\"type\": \"TUTORIAL\",\n\"title\": \"仅2MB,Windows瞬间超级丝滑!\",\n\"sharedBy\": \"AHapi²⁰²⁵\",\n\"time\": \"2025-04-29 11:13:38\",\n\"summary\": \"这才是,真神器!\",\n\"keyPoints\": [\"Windows优化\", \"2MB\", \"神器\"],\n\"url\": \"https://mp.weixin.qq.com/s/es77Jc6Du03ppJD5XJeQUg\",\n\"domain\": \"mp.weixin.qq.com\",\n\"category\": \"工具\"\n}\n]\n},\n\"importantMessages\": {\n\"items\": [\n{\n\"time\": \"2025-04-29 10:00:18\",\n\"sender\": \"苍何\",\n\"type\": \"NEWS\",\n\"priority\": \"高\",\n\"content\": \"2025年04月29日 AI科技早报\",\n\"fullContent\": \"1、阿里开源8款Qwen3模型,集成MCP,性能超DeepSeek-R1、OpenAI o1。\\\\n\\\\n2、Qafind Labs发布ChatDLM扩散语言模型,推理速度高达2800 tokens/s。\\\\n\\\\n3、腾讯开源Kuikly跨端框架,基于Kotlin支持多平台开发,已应用于QQ。\\\\n\\\\n4、OpenAI 推出 ChatGPT 购物功能,用户可通过 ChatGPT 便捷购物。\\\\n\\\\n5、字节Seed团队提出PHD-Transformer,突破预训练长度扩展瓶颈。\\\\n\\\\n6、百度发布文心快码3.5版本与多模态AI智能体Zulu,助力工程师提效。\\\\n\\\\n7、Kimi与财新传媒合作,提供专业财经内容,推动AI+传统媒体融合。\\\\n\\\\n8、苹果加速「N50」智能眼镜项目,融合AI技术预计2027年亮相。\\\\n\\\\n9、研究显示OpenAI o3在病毒学领域超越94%人类专家,生物安全引关注。\\\\n\\\\n10、华为测试自研AI芯片Ascend 910D,旨在替代英伟达H100芯片。\\\\n\\\\n11、🔥【记得收藏】早报同步更新到开源 AI 知识库:https://u55dyuejxc.feishu.cn/wiki/FkmNwxYHDigJ3akIUGHc8MSTn4d\"\n}\n]\n},\n\"dialogues\": {\n\"items\": [\n{\n\"type\": \"DIALOGUE\",\n\"messages\": [\n{\n\"speaker\": \"好名字\",\n\"time\": \"2025-04-29 08:16:23\",\n\"content\": \"这个我弄完,ai做的小程序有bug,流程走不通,还改不了[捂脸]\"\n},\n{\n\"speaker\": \"贾👦🏻\",\n\"time\": \"2025-04-29 08:54:33\",\n\"content\": \"可以微调 不过源码需要买的\"\n},\n{\n\"speaker\": \"好名字\",\n\"time\": \"2025-04-29 09:13:32\",\n\"content\": \"微调一次,然后再想调就需要开会员了\"\n},\n{\n\"speaker\": \"贾👦🏻\",\n\"time\": \"2025-04-29 09:14:09\",\n\"content\": \"需求变更一个字 就需要重新购买[破涕为笑]\"\n}\n],\n\"highlight\": \"需求变更一个字 就需要重新购买[破涕为笑]\",\n\"relatedTopic\": \"AI小程序开发\"\n},\n{\n\"type\": \"DIALOGUE\",\n\"messages\": [\n{\n\"speaker\": \"苍何\",\n\"time\": \"2025-04-29 09:26:49\",\n\"content\": \"我熬不动\"\n},\n{\n\"speaker\": \"AHapi²⁰²⁵\",\n\"time\": \"2025-04-29 09:27:25\",\n\"content\": \"不要卷别人[旺柴]别人写了 就不卷他们了\"\n},\n{\n\"speaker\": \"苍何\",\n\"time\": \"2025-04-29 09:27:55\",\n\"content\": \"新闻得第一时间,做不到写了也没啥用\"\n},\n{\n\"speaker\": \"苍何\",\n\"time\": \"2025-04-29 09:28:03\",\n\"content\": \"还不如写些应用\"\n},\n{\n\"speaker\": \"大风(Wind)\",\n\"time\": \"2025-04-29 09:28:23\",\n\"content\": \"看看哪些是5-7点发推文的,基本都是卷王了\"\n},\n{\n\"speaker\": \"沉默王二\",\n\"time\": \"2025-04-29 09:28:44\",\n\"content\": \"身体能扛住确实离谱\"\n},\n{\n\"speaker\": \"苍何\",\n\"time\": \"2025-04-29 09:29:03\",\n\"content\": \"是啊,太肝了\"\n},\n{\n\"speaker\": \"苍何\",\n\"time\": \"2025-04-29 09:29:39\",\n\"content\": \"我前天熬夜测vidu,人已经废了好几天\"\n},\n{\n\"speaker\": \"AHapi²⁰²⁵\",\n\"time\": \"2025-04-29 09:30:02\",\n\"content\": \"5-7点还好 早点睡也还行\"\n},\n{\n\"speaker\": \"大风(Wind)\",\n\"time\": \"2025-04-29 09:30:14\",\n\"content\": \"效果咋样\"\n},\n{\n\"speaker\": \"大风(Wind)\",\n\"time\": \"2025-04-29 09:30:21\",\n\"content\": \"5点发布的\"\n},\n{\n\"speaker\": \"大风(Wind)\",\n\"time\": \"2025-04-29 09:30:52\",\n\"content\": \"2小时内出文\"\n},\n{\n\"speaker\": \"沉默王二\",\n\"time\": \"2025-04-29 09:31:00\",\n\"content\": \"意味着阿里的 coder 们也在加班和熬夜\"\n},\n{\n\"speaker\": \"AHapi²⁰²⁵\",\n\"time\": \"2025-04-29 09:40:18\",\n\"content\": \"他们加班熬夜 赚的还是多啊[Facepalm]我们加班熬夜 就一点屁钱\"\n}\n],\n\"highlight\": \"他们加班熬夜 赚的还是多啊[Facepalm]我们加班熬夜 就一点屁钱\",\n\"relatedTopic\": \"加班文化\"\n}\n]\n},\n\"qa\": {\n\"items\": [\n{\n\"question\": {\n\"asker\": \"银色子弹-捷\",\n\"time\": \"2025-04-29 11:10:26\",\n\"content\": \"问一下win11电脑,你长时间没清理,运行慢,一般用什么来清理电脑? 不要360啊,那个太流氓了,想知道各位大佬有没有优秀的软件推荐一下\",\n\"tags\": [\"Windows优化\", \"清理工具\"]\n},\n\"answers\": [\n{\n\"responder\": \"昏沉沉的\",\n\"time\": \"2025-04-29 11:11:59\",\n\"content\": \"ccclean\",\n\"isAccepted\": false\n},\n{\n\"responder\": \"🤑程序儒\",\n\"time\": \"2025-04-29 11:13:07\",\n\"content\": \"360极速版、Wise Care 365\",\n\"isAccepted\": false\n},\n{\n\"responder\": \"AHapi²⁰²⁵\",\n\"time\": \"2025-04-29 11:13:38\",\n\"content\": \"仅2MB,Windows瞬间超级丝滑!\\\\n这才是,真神器!\\\\n\\\\n点击查看详情\",\n\"isAccepted\": false\n}\n]\n},\n{\n\"question\": {\n\"asker\": \"ಠ_ಠ 闲鱼一条ಠ_ಠ\",\n\"time\": \"2025-04-29 11:37:49\",\n\"content\": \"请问哪位哥还有扣子的邀请码吗?\",\n\"tags\": [\"邀请码\", \"扣子\"]\n},\n\"answers\": [\n{\n\"responder\": \"贾👦🏻\",\n\"time\": \"2025-04-29 11:40:37\",\n\"content\": \"RootUser_2105656329 邀请你体验扣子空间,快来和 Agent 一起开始你的工作吧!\\\\nhttps://www.coze.cn/space-preview?invite_code=SCL7DAL0\",\n\"isAccepted\": true\n},\n{\n\"responder\": \"9527\",\n\"time\": \"2025-04-29 11:47:43\",\n\"content\": \"RootUser_2106519373 邀请你体验扣子空间,快来和 Agent 一起开始你的工作吧!\\\\nhttps://www.coze.cn/space-preview?invite_code=A8IT4MUE\",\n\"isAccepted\": false\n},\n{\n\"responder\": \"9527\",\n\"time\": \"2025-04-29 11:47:53\",\n\"content\": \"RootUser_2106519373 邀请你体验扣子空间,快来和 Agent 一起开始你的工作吧!\\\\nhttps://www.coze.cn/space-preview?invite_code=7QUCYZKC\",\n\"isAccepted\": false\n}\n]\n}\n]\n},\n\"analytics\": {\n\"heatmap\": [\n{\n\"topic\": \"AI技术\",\n\"percentage\": \"40%\",\n\"color\": \"#3da9fc\",\n\"count\": \"12\"\n},\n{\n\"topic\": \"熬夜与加班\",\n\"percentage\": \"30%\",\n\"color\": \"#4361ee\",\n\"count\": \"9\"\n},\n{\n\"topic\": \"工具推荐\",\n\"percentage\": \"20%\",\n\"color\": \"#00b4d8\",\n\"count\": \"6\"\n},\n{\n\"topic\": \"邀请码\",\n\"percentage\": \"10%\",\n\"color\": \"#4895ef\",\n\"count\": \"3\"\n}\n],\n\"chattyRanking\": [\n{\n\"rank\": 1,\n\"name\": \"苍何\",\n\"count\": \"7\",\n\"characteristics\": [\"技术分享\", \"熬夜达人\"],\n\"commonWords\": [\"AI\", \"熬夜\", \"开源\"]\n},\n{\n\"rank\": 2,\n\"name\": \"AHapi²⁰²⁵\",\n\"count\": \"6\",\n\"characteristics\": [\"幽默\", \"工具推荐\"],\n\"commonWords\": [\"旺柴\", \"神器\", \"加班\"]\n},\n{\n\"rank\": 3,\n\"name\": \"大风(Wind)\",\n\"count\": \"4\",\n\"characteristics\": [\"提问\", \"互动\"],\n\"commonWords\": [\"效果\", \"发布\", \"卷王\"]\n}\n],\n\"nightOwl\": {\n\"name\": \"苍何\",\n\"title\": \"熬夜冠军\",\n\"latestTime\": \"2025-04-29 09:42:54\",\n\"messageCount\": \"7\",\n\"lastMessage\": \"我熬夜写了这一篇[旺柴]\"\n}\n},\n\"wordCloud\": {\n\"words\": [\n{\n\"text\": \"AI\",\n\"size\": 38,\n\"color\": \"#00b4d8\",\n\"rotation\": -15\n},\n{\n\"text\": \"熬夜\",\n\"size\": 32,\n\"color\": \"#4361ee\",\n\"rotation\": 0\n},\n{\n\"text\": \"开源\",\n\"size\": 28,\n\"color\": \"#00b4d8\",\n\"rotation\": 15\n},\n{\n\"text\": \"加班\",\n\"size\": 24,\n\"color\": \"#4361ee\",\n\"rotation\": -10\n},\n{\n\"text\": \"Qwen3\",\n\"size\": 22,\n\"color\": \"#00b4d8\",\n\"rotation\": 10\n},\n{\n\"text\": \"Vidu Q1\",\n\"size\": 20,\n\"color\": \"#4361ee\",\n\"rotation\": -5\n},\n{\n\"text\": \"夸克AI相机\",\n\"size\": 18,\n\"color\": \"#00b4d8\",\n\"rotation\": 5\n},\n{\n\"text\": \"卷王\",\n\"size\": 16,\n\"color\": \"#4361ee\",\n\"rotation\": 0\n}\n],\n\"legend\": [\n{\"color\": \"#00b4d8\", \"label\": \"AI 相关词汇\"},\n{\"color\": \"#4361ee\", \"label\": \"生活 相关词汇\"}\n]\n}\n},\n\"footer\": {\n\"dataSource\": \"群聊聊天记录\",\n\"generationTime\": \"2025-04-29 16:00:00\",\n\"statisticalPeriod\": \"2025-04-29 07:03:10 - 15:36:25\",\n\"disclaimer\": \"本报告内容基于群聊公开讨论,如有不当内容或侵权问题请联系管理员处理。\"\n}\n}\n```" + with open('text.html', 'w', encoding='utf-8') as f: + f.write(main(json_data)) \ No newline at end of file diff --git a/test2.py b/test2.py new file mode 100644 index 0000000..4256af1 --- /dev/null +++ b/test2.py @@ -0,0 +1,27 @@ + + +import re + + +def raw_to_escaped(raw_str): + def replace_match(match): + escape_seq = match.group(1) + # 常见转义字符映射 + escape_map = { + r'\n': '\n', + r'\t': '\t', + r'\r': '\r', + r'\\': '\\', + r'\"': '"', + r'\'': "'", + } + return escape_map.get(escape_seq, escape_seq) # 如果不是特殊字符,原样返回 + + # 正则匹配 \ + 特定字符(如 \n, \t 等) + return re.sub(r'\\([nrt\\"\'])', replace_match, raw_str) + + +# 示例 +json_data = r"\n{\n \"header\": {\n \"title\": \"AI技术交流群报告\",\n \"date\": \"2025-04-29\",\n \"metaInfo\": {\n \"totalMessages\": \"35\",\n \"activeUsers\": \"12\",\n \"timeRange\": \"07:03 - 15:36\"\n }\n },\n \"sections\": {\n \"hotTopics\": {\n \"items\": [\n {\n \"name\": \"AI开发工具讨论\",\n \"category\": \"技术交流\",\n \"summary\": \"群成员讨论了AI开发工具的使用体验,包括AI生成的小程序bug问题、源码购买和微调限制等话题。\",\n \"keywords\": [\"AI小程序\", \"源码购买\", \"微调限制\"],\n \"mentions\": \"6\"\n },\n {\n \"name\": \"熬夜与工作效率\",\n \"category\": \"工作生活\",\n \"summary\": \"群成员围绕熬夜工作、工作效率和健康问题展开了讨论,分享了各自的熬夜经历和看法。\",\n \"keywords\": [\"熬夜\", \"工作效率\", \"健康\"],\n \"mentions\": \"8\"\n }\n ]\n },\n \"tutorials\": {\n \"items\": [\n {\n \"type\": \"NEWS\",\n \"title\": \"Qwen3深夜正式开源\",\n \"sharedBy\": \"苍何\",\n \"time\": \"2025-04-29 09:20:23\",\n \"summary\": \"Qwen3小尺寸模型开源,性能优异。\",\n \"keyPoints\": [\"开源\", \"小尺寸\", \"高性能\"],\n \"url\": \"http://mp.weixin.qq.com/s?__biz=MzIyMzA5NjEyMA==&mid=2647670717&idx=1&sn=edec1f6cda0c1227e72cd07abf4228ff&chksm=f19a699bb993eb9ed2850ba329f382668bc7edc8a2d7d4a94de2d29c15cf87aa05bf6b48dc6d&mpshare=1&scene=1&srcid=0429TzXAJtS5jA2QI9hLEroV&sharer_shareinfo=7fd7493f3ccf9923f55b48a05619ce1b&sharer_shareinfo_first=fc872ba73c219b858d700a9db530b5b1#rd\",\n \"domain\": \"mp.weixin.qq.com\",\n \"category\": \"AI技术\"\n },\n {\n \"type\": \"TUTORIAL\",\n \"title\": \"体验完刚上线的Vidu Q1\",\n \"sharedBy\": \"苍何\",\n \"time\": \"2025-04-29 09:39:42\",\n \"summary\": \"Vidu Q1 AI视频创作体验分享,包含教程。\",\n \"keyPoints\": [\"AI视频\", \"创作教程\", \"清晰度提升\"],\n \"url\": \"http://mp.weixin.qq.com/s?__biz=MzU4NTE1Mjg4MA==&mid=2247493267&idx=1&sn=0189fb501578ce8e27142fbe2f590d03&chksm=fc9a946728c367005c19cb5a335300d05d51a441f9f20424a0a72c904a47bdf003252576318a&mpshare=1&scene=1&srcid=04297l70B2zsuypDfjUh0rh5&sharer_shareinfo=181efb947f938ab90786c776bf7bbda7&sharer_shareinfo_first=181efb947f938ab90786c776bf7bbda7#rd\",\n \"domain\": \"mp.weixin.qq.com\",\n \"category\": \"AI视频\"\n }\n ]\n },\n \"importantMessages\": {\n \"items\": [\n {\n \"time\": \"2025-04-29 10:00:18\",\n \"sender\": \"苍何\",\n \"type\": \"NEWS\",\n \"priority\": \"高\",\n \"content\": \"2025年04月29日 AI科技早报\",\n \"fullContent\": \"2025年04月29日 AI科技早报\\n\\n1、阿里开源8款Qwen3模型,集成MCP,性能超DeepSeek-R1、OpenAI o1。\\n\\n2、Qafind Labs发布ChatDLM扩散语言模型,推理速度高达2800 tokens/s。\\n\\n3、腾讯开源Kuikly跨端框架,基于Kotlin支持多平台开发,已应用于QQ。\\n\\n4、OpenAI 推出 ChatGPT 购物功能,用户可通过 ChatGPT 便捷购物。\\n\\n5、字节Seed团队提出PHD-Transformer,突破预训练长度扩展瓶颈。\\n\\n6、百度发布文心快码3.5版本与多模态AI智能体Zulu,助力工程师提效。\\n\\n7、Kimi与财新传媒合作,提供专业财经内容,推动AI+传统媒体融合。\\n\\n8、苹果加速「N50」智能眼镜项目,融合AI技术预计2027年亮相。\\n\\n9、研究显示OpenAI o3在病毒学领域超越94%人类专家,生物安全引关注。\\n\\n10、华为测试自研AI芯片Ascend 910D,旨在替代英伟达H100芯片。\\n\\n11、🔥【记得收藏】早报同步更新到开源 AI 知识库:https://u55dyuejxc.feishu.cn/wiki/FkmNwxYHDigJ3akIUGHc8MSTn4d\"\n }\n ]\n },\n \"dialogues\": {\n \"items\": [\n {\n \"type\": \"DIALOGUE\",\n \"messages\": [\n {\n \"speaker\": \"好名字\",\n \"time\": \"2025-04-29 08:16:23\",\n \"content\": \"这个我弄完,ai做的小程序有bug,流程走不通,还改不了[捂脸]\"\n },\n {\n \"speaker\": \"贾👦🏻\",\n \"time\": \"2025-04-29 08:54:33\",\n \"content\": \"可以微调 不过源码需要买的\"\n },\n {\n \"speaker\": \"好名字\",\n \"time\": \"2025-04-29 09:13:32\",\n \"content\": \"微调一次,然后再想调就需要开会员了\"\n },\n {\n \"speaker\": \"贾👦🏻\",\n \"time\": \"2025-04-29 09:14:09\",\n \"content\": \"需求变更一个字 就需要重新购买[破涕为笑]\"\n }\n ],\n \"highlight\": \"需求变更一个字 就需要重新购买\",\n \"relatedTopic\": \"AI开发工具限制\"\n }\n ]\n },\n \"qa\": {\n \"items\": [\n {\n \"question\": {\n \"asker\": \"银色子弹-捷\",\n \"time\": \"2025-04-29 11:10:26\",\n \"content\": \"问一下win11电脑,你长时间没清理,运行慢,一般用什么来清理电脑? 不要360啊,那个太流氓了,想知道各位大佬有没有优秀的软件推荐一下\",\n \"tags\": [\"电脑清理\", \"软件推荐\"]\n },\n \"answers\": [\n {\n \"responder\": \"昏沉沉的\",\n \"time\": \"2025-04-29 11:11:59\",\n \"content\": \"ccclean\",\n \"isAccepted\": false\n },\n {\n \"responder\": \"🤑程序儒\",\n \"time\": \"2025-04-29 11:13:07\",\n \"content\": \"360极速版、Wise Care 365\",\n \"isAccepted\": false\n },\n {\n \"responder\": \"AHapi²⁰²⁵\",\n \"time\": \"2025-04-29 11:13:38\",\n \"content\": \"仅2MB,Windows瞬间超级丝滑!\\n这才是,真神器!\\n\\n点击查看详情\",\n \"isAccepted\": true\n }\n ]\n }\n ]\n },\n \"analytics\": {\n \"heatmap\": [\n {\n \"topic\": \"AI技术\",\n \"percentage\": \"45%\",\n \"color\": \"#3da9fc\",\n \"count\": \"16\"\n },\n {\n \"topic\": \"工作生活\",\n \"percentage\": \"30%\",\n \"color\": \"#4361ee\",\n \"count\": \"10\"\n },\n {\n \"topic\": \"工具推荐\",\n \"percentage\": \"15%\",\n \"color\": \"#00b4d8\",\n \"count\": \"5\"\n },\n {\n \"topic\": \"其他\",\n \"percentage\": \"10%\",\n \"color\": \"#7209b7\",\n \"count\": \"4\"\n }\n ],\n \"chattyRanking\": [\n {\n \"rank\": 1,\n \"name\": \"苍何\",\n \"count\": \"7\",\n \"characteristics\": [\"技术分享\", \"新闻发布\"],\n \"commonWords\": [\"AI\", \"开源\", \"熬夜\"]\n },\n {\n \"rank\": 2,\n \"name\": \"AHapi²⁰²⁵\",\n \"count\": \"6\",\n \"characteristics\": [\"幽默评论\", \"工具推荐\"],\n \"commonWords\": [\"[旺柴]\", \"加班\", \"肝\"]\n },\n {\n \"rank\": 3,\n \"name\": \"贾👦🏻\",\n \"count\": \"3\",\n \"characteristics\": [\"技术解答\", \"邀请码分享\"],\n \"commonWords\": [\"源码\", \"购买\", \"邀请\"]\n }\n ],\n \"nightOwl\": {\n \"name\": \"苍何\",\n \"title\": \"熬夜冠军\",\n \"latestTime\": \"2025-04-29 09:42:54\",\n \"messageCount\": \"7\",\n \"lastMessage\": \"我熬夜写了这一篇[旺柴]\"\n }\n },\n \"wordCloud\": {\n \"words\": [\n {\n \"text\": \"AI\",\n \"size\": 42,\n \"color\": \"#3da9fc\",\n \"rotation\": 0\n },\n {\n \"text\": \"熬夜\",\n \"size\": 38,\n \"color\": \"#4361ee\",\n \"rotation\": -15\n },\n {\n \"text\": \"开源\",\n \"size\": 36,\n \"color\": \"#00b4d8\",\n \"rotation\": 15\n },\n {\n \"text\": \"小程序\",\n \"size\": 32,\n \"color\": \"#7209b7\",\n \"rotation\": -10\n },\n {\n \"text\": \"清理\",\n \"size\": 28,\n \"color\": \"#f72585\",\n \"rotation\": 10\n }\n ],\n \"legend\": [\n {\"color\": \"#3da9fc\", \"label\": \"技术 相关词汇\"},\n {\"color\": \"#4361ee\", \"label\": \"生活 相关词汇\"},\n {\"color\": \"#00b4d8\", \"label\": \"工具 相关词汇\"}\n ]\n }\n },\n \"footer\": {\n \"dataSource\": \"AI技术交流群聊天记录\",\n \"generationTime\": \"2025-04-29 16:00:00\",\n \"statisticalPeriod\": \"2025-04-29 07:03 - 15:36\",\n \"disclaimer\": \"本报告内容基于群聊公开讨论,如有不当内容或侵权问题请联系管理员处理。\"\n }\n}\n" + +print(json_data) diff --git a/微信聊天记录可视化prompt.md b/微信聊天记录可视化prompt.md new file mode 100644 index 0000000..c5109a0 --- /dev/null +++ b/微信聊天记录可视化prompt.md @@ -0,0 +1,762 @@ +任务:根据 提供的微信群聊天记录(json格式)生成今日群/好友日报,输出为风格固定、一致的HTML页面,适合截图分享 +## 日报模式选择 +- 日报模式:[完整版/简化版] (默认为完整版) +- 如果需要简化版,请在提交时注明"生成简化版" + +## 简化版说明 +如选择"简化版",将只生成以下核心部分: +- 今日讨论热点(最多3个) +- 重要消息汇总 +- 话唠榜(仅前3名) +- 简化版词云 +日报内容更精简,适合快速浏览和分享。 + +## 聊天记录格式 +``` json +[ +{ + "nickname": "昏沉沉的", # 发消息人昵称 + "message": "XXX", # 消息内容 + "time": "2025-04-27 11:33:20" #发消息时间 + }, +] +``` + +如未能识别消息格式或未找到有效记录,将显示提示信息并尝试按最佳猜测处理。 + +## 输出要求 +必须使用以下固定的HTML模板和CSS样式,仅更新内容部分,确保每次生成的页面风格完全一致。使用严格定义的深色科技风格。 + + + +## HTML结构模板 + +```html + + + + + [群名称]报告 - [日期] + + + +
    +

    [群名称]报告

    +

    [日期]

    +
    + 总消息数:[数量] + 活跃用户:[数量] + 时间范围:[时间范围] +
    +
    + + +
    +

    今日讨论热点

    +
    + +
    +

    [热点话题名称]

    +
    [话题分类]
    +

    [简要总结(50-100字)]

    +
    + [关键词1] + [关键词2] + +
    +
    提及次数:[次数]
    +
    + +
    +
    + + +
    +

    实用教程与资源分享

    +
    + +
    +
    [TUTORIAL | NEWS | RESOURCE]
    +

    [分享的教程或资源标题]

    +
    + 分享者:[昵称] + +
    +

    [内容简介]

    +
    +

    要点:

    +
      +
    • [要点1]
    • +
    • [要点2]
    • + +
    +
    + +
    分类:[分类]
    +
    + +
    +
    + + +
    +

    重要消息汇总

    +
    + +
    +
    + [消息时间] + [发送者昵称] + [NOTICE | EVENT | ANNOUNCEMENT | OTHER] + 优先级:[高|中|低] +
    +

    [消息内容]

    +
    +

    [完整通知内容]

    +
    +
    + +
    +
    + + +
    +

    有趣对话或金句

    +
    + +
    +
    [DIALOGUE | QUOTE]
    +
    +
    +
    + [说话者昵称] + [发言时间] +
    +

    [消息内容]

    +
    +
    +
    + [说话者昵称] + [发言时间] +
    +

    [消息内容]

    +
    + +
    +
    [对话中的金句或亮点]
    +
    相关话题:[某某话题]
    +
    + +
    +
    + + +
    +

    问题与解答

    +
    + +
    +
    +
    + [提问者昵称] + [提问时间] +
    +

    [问题内容]

    +
    + [相关标签1] + [相关标签2] + +
    +
    +
    +
    +
    + [回答者昵称] + [回答时间] + 最佳回答 +
    +

    [回答内容]

    +
    + +
    +
    + +
    +
    + + +
    +

    群内数据可视化

    + + +

    话题热度

    +
    + +
    +
    [话题名称]
    +
    [百分比]%
    +
    +
    +
    +
    [数量]条消息
    +
    + +
    +
    [话题名称]
    +
    [百分比]%
    +
    +
    +
    +
    [数量]条消息
    +
    + +
    + + +

    话唠榜

    +
    + +
    +
    1
    +
    +
    [群友昵称]
    +
    [数量]条消息
    +
    + [特点1] + [特点2] + +
    +
    + [常用词1] + [常用词2] + +
    +
    +
    + +
    + + +

    熬夜冠军

    +
    + +
    +
    👑
    +
    +
    [熬夜冠军昵称]
    +
    [熬夜冠军称号]
    +
    最晚活跃时间:[时间]
    +
    深夜消息数:[数量]
    +
    [最后一条深夜消息内容]
    +
    注:熬夜时段定义为23:00-06:00,已考虑不同时区
    +
    +
    +
    +
    + + +
    +

    热门词云

    +
    + +
    + + + [关键词1] + + [关键词2] + + [关键词3] + + [关键词4] + + [关键词5] + + +
    + +
    +
    + + [分类1] 相关词汇 +
    +
    + + [分类2] 相关词汇 +
    +
    + + [分类3] 相关词汇 +
    +
    +
    +
    + + + + + \ No newline at end of file