diff --git a/apps/web/.editorconfig b/apps/web/.editorconfig
new file mode 100644
index 0000000..3638cec
--- /dev/null
+++ b/apps/web/.editorconfig
@@ -0,0 +1,13 @@
+# indicate this is the root of the project
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/apps/web/.env b/apps/web/.env
new file mode 100644
index 0000000..8cf3d04
--- /dev/null
+++ b/apps/web/.env
@@ -0,0 +1,4 @@
+# 打包路径 根据项目不同按需配置
+VITE_BASE_URL = /
+
+NODE_ENV=production
diff --git a/apps/web/.env.development b/apps/web/.env.development
new file mode 100644
index 0000000..7ea0e4d
--- /dev/null
+++ b/apps/web/.env.development
@@ -0,0 +1,4 @@
+# 打包路径
+VITE_BASE_URL= /
+
+NODE_ENV=development
diff --git a/apps/web/.env.site b/apps/web/.env.site
new file mode 100644
index 0000000..7e88aa2
--- /dev/null
+++ b/apps/web/.env.site
@@ -0,0 +1,4 @@
+# 打包路径 根据项目不同按需配置
+VITE_BASE_URL=https://static.tdesign.tencent.com/starter/react/
+
+NODE_ENV=production
diff --git a/apps/web/.eslintignore b/apps/web/.eslintignore
new file mode 100644
index 0000000..98aae96
--- /dev/null
+++ b/apps/web/.eslintignore
@@ -0,0 +1,5 @@
+build
+mock
+config
+public
+scripts
diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js
new file mode 100644
index 0000000..53cc55c
--- /dev/null
+++ b/apps/web/.eslintrc.js
@@ -0,0 +1,60 @@
+module.exports = {
+ root: true,
+ extends: [
+ 'airbnb-base',
+ 'prettier',
+ 'plugin:react/recommended',
+ 'plugin:import/typescript',
+ 'plugin:@typescript-eslint/recommended',
+ ],
+ plugins: ['eslint-plugin-prettier'],
+ parser: '@typescript-eslint/parser',
+ env: {
+ jest: true,
+ },
+ settings: {
+ react: {
+ version: 'detect',
+ },
+ },
+ rules: {
+ 'no-shadow': 'off',
+ 'no-param-reassign': ['error', { props: false }],
+ 'no-console': 'off',
+ 'no-plusplus': [
+ 'error',
+ {
+ allowForLoopAfterthoughts: true,
+ },
+ ],
+ 'react/display-name': 'off',
+ // jsx 单引号
+ 'jsx-quotes': [2, 'prefer-single'],
+ 'import/no-cycle': 'off', // TODO: remove
+ 'import/extensions': 'off',
+ 'import/no-unresolved': 'off',
+ 'import/order': 'off',
+ 'import/prefer-default-export': 'off',
+ 'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
+ // 关闭variable必须全部大写规则
+ '@typescript-eslint/naming-convention': [
+ 'error',
+ {
+ selector: 'variable',
+ modifiers: ['const'],
+ format: null,
+ },
+ ],
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ // 统一eslint prettier配置
+ 'prettier/prettier': [
+ 'warn',
+ {},
+ {
+ usePrettierrc: true,
+ },
+ ],
+ },
+};
diff --git a/apps/web/.github/ISSUE_TEMPLATE/bug-report.zh-CN.yml b/apps/web/.github/ISSUE_TEMPLATE/bug-report.zh-CN.yml
new file mode 100644
index 0000000..c3bc775
--- /dev/null
+++ b/apps/web/.github/ISSUE_TEMPLATE/bug-report.zh-CN.yml
@@ -0,0 +1,79 @@
+name: 反馈 Bug
+description: 通过 github 模板进行 Bug 反馈。
+title: "[组件名称] 描述问题的标题"
+body:
+ - type: markdown
+ attributes:
+ value: |
+ # 欢迎你的参与
+ tdesign-react-starter 的 Issue 列表接受 bug 报告或是新功能请求。也可加入官方社区:
+
+ 在发布一个 Issue 前,请确保:
+ - 在 [常见问题](https://tdesign.tencent.com/about/faq)、[更新日志](https://tdesign.tencent.com/about/release) 和 [旧Issue列表](https://github.com/Tencent/tdesign-react-starter/issues?q=is%3Aissue) 中搜索过你的问题。(你的问题可能已有人提出,也可能已在最新版本中被修正)
+ - 如果你发现一个已经关闭的旧 Issue 在最新版本中仍然存在,不要在旧 Issue 下面留言,请建一个新的 issue。
+
+ - type: input
+ id: version
+ attributes:
+ label: tdesign-react-starter 版本
+ description: 请检查在最新项目版本中能否重现此 issue。
+ placeholder: 请填写
+ validations:
+ required: true
+
+ - type: input
+ id: reproduce
+ attributes:
+ label: 重现链接
+ description: 请提供尽可能精简的 CodePen、CodeSandbox 或 GitHub 仓库的链接。请不要填无关链接,否则你的 Issue 将被关闭。
+ placeholder: 请填写
+
+ - type: textarea
+ id: reproduceSteps
+ attributes:
+ label: 重现步骤
+ description: 请清晰的描述重现该 Issue 的步骤,这能帮助我们快速定位问题。没有清晰重现步骤将不会被修复,标有 'need reproduction' 的 Issue 在 7 天内不提供相关步骤,将被关闭。
+ placeholder: 请填写
+
+ - type: textarea
+ id: expect
+ attributes:
+ label: 期望结果
+ placeholder: 请填写
+
+ - type: textarea
+ id: actual
+ attributes:
+ label: 实际结果
+ placeholder: 请填写
+
+ - type: input
+ id: frameworkVersion
+ attributes:
+ label: 框架版本
+ placeholder: Vue(3.2.0)
+
+ - type: input
+ id: browsersVersion
+ attributes:
+ label: 浏览器版本
+ placeholder: Chrome(8.213.231.123)
+
+ - type: input
+ id: systemVersion
+ attributes:
+ label: 系统版本
+ placeholder: MacOS(11.2.3)
+
+ - type: input
+ id: nodeVersion
+ attributes:
+ label: Node版本
+ placeholder: 请填写
+
+ - type: textarea
+ id: remarks
+ attributes:
+ label: 补充说明
+ description: 可以是遇到这个 bug 的业务场景、上下文等信息。
+ placeholder: 请填写
diff --git a/apps/web/.github/ISSUE_TEMPLATE/config.yml b/apps/web/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..cec7613
--- /dev/null
+++ b/apps/web/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: true
+contact_links:
+ - name: 使用 issue-helper 新建
+ url: https://Tencent.github.io/tdesign/issue-helper/?lang=zh-CN&repo=Tencent/tdesign
+ about: 使用 https://Tencent.github.io/tdesign/issue-helper/ 创建 issue,其中包含 bug 和 feature,表单提交更加严格。
diff --git a/apps/web/.github/ISSUE_TEMPLATE/feature-report.zh-CN.yml b/apps/web/.github/ISSUE_TEMPLATE/feature-report.zh-CN.yml
new file mode 100644
index 0000000..0668509
--- /dev/null
+++ b/apps/web/.github/ISSUE_TEMPLATE/feature-report.zh-CN.yml
@@ -0,0 +1,30 @@
+name: 反馈新功能
+description: 通过 github 模板进行新功能反馈。
+title: "[组件名称] 描述问题的标题"
+body:
+ - type: markdown
+ attributes:
+ value: |
+ # 欢迎你的参与
+ tdesign-react-starter 的 Issue 列表接受 bug 报告或是新功能请求。也可加入官方社区:
+
+ 在发布一个 Issue 前,请确保:
+ - 在 [常见问题](https://tdesign.tencent.com/about/faq)、[更新日志](https://tdesign.tencent.com/about/release) 和 [旧Issue列表](https://github.com/Tencent/tdesign-react-starter/issues?q=is%3Aissue) 中搜索过你的问题。(你的问题可能已有人提出,也可能已在最新版本中被修正)
+ - 如果你发现一个已经关闭的旧 Issue 在最新版本中仍然存在,不要在旧 Issue 下面留言,请建一个新的 issue。
+
+ - type: textarea
+ id: functionContent
+ attributes:
+ label: 这个功能解决了什么问题
+ description: 请详尽说明这个需求的用例和场景。最重要的是:解释清楚是怎样的用户体验需求催生了这个功能上的需求。我们将考虑添加在现有 API 无法轻松实现的功能。新功能的用例也应当足够常见。
+ placeholder: 请填写
+ validations:
+ required: true
+
+ - type: textarea
+ id: functionalExpectations
+ attributes:
+ label: 你建议的方案是什么
+ placeholder: 请填写
+ validations:
+ required: true
diff --git a/apps/web/.github/PULL_REQUEST_TEMPLATE.md b/apps/web/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..a97d15e
--- /dev/null
+++ b/apps/web/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,52 @@
+
+
+### 🤔 这个 PR 的性质是?
+
+- [ ] 日常 bug 修复
+- [ ] 新特性提交
+- [ ] 文档改进
+- [ ] 演示代码改进
+- [ ] 组件样式/交互改进
+- [ ] CI/CD 改进
+- [ ] 重构
+- [ ] 代码风格优化
+- [ ] 测试用例
+- [ ] 分支合并
+- [ ] 其他
+
+### 🔗 相关 Issue
+
+
+
+### 💡 需求背景和解决方案
+
+
+
+### 📝 更新日志
+
+
+
+- fix(组件名称): 处理问题或特性描述 ...
+
+- [ ] 本条 PR 不需要纳入 Changelog
+
+### ☑️ 请求合并前的自查清单
+
+⚠️ 请自检并全部**勾选全部选项**。⚠️
+
+- [ ] 文档已补充或无须补充
+- [ ] 代码演示已提供或无须提供
+- [ ] TypeScript 定义已补充或无须补充
+- [ ] Changelog 已提供或无须提供
diff --git a/apps/web/.github/configs/typos_config.toml b/apps/web/.github/configs/typos_config.toml
new file mode 100644
index 0000000..a935ba0
--- /dev/null
+++ b/apps/web/.github/configs/typos_config.toml
@@ -0,0 +1,4 @@
+files.extend-exclude = [
+ "package-lock.json",
+ "src/configs/color.ts"
+]
\ No newline at end of file
diff --git a/apps/web/.github/dependabot.yml b/apps/web/.github/dependabot.yml
new file mode 100644
index 0000000..c37a937
--- /dev/null
+++ b/apps/web/.github/dependabot.yml
@@ -0,0 +1,20 @@
+# Basic dependabot.yml file with
+# minimum configuration for two package managers
+
+version: 2
+updates:
+ # Enable version updates for npm
+ - package-ecosystem: "npm"
+ # Look for `package.json` and `lock` files in the `root` directory
+ directory: "/"
+ # Check the npm registry for updates every day (weekdays)
+ schedule:
+ interval: "monthly"
+
+ # Enable version updates for Docker
+ - package-ecosystem: "docker"
+ # Look for a `Dockerfile` in the `root` directory
+ directory: "/"
+ # Check for updates once a week
+ schedule:
+ interval: "monthly"
diff --git a/apps/web/.github/workflows/issue-assignees.temp.yml b/apps/web/.github/workflows/issue-assignees.temp.yml
new file mode 100644
index 0000000..f060efb
--- /dev/null
+++ b/apps/web/.github/workflows/issue-assignees.temp.yml
@@ -0,0 +1,52 @@
+# force copy from tencent/tdesign
+name: Issue Add Assigness
+
+on:
+ issues:
+ types: [opened, edited]
+
+jobs:
+ mark-duplicate:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: wow-actions/auto-comment@v1
+ with:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ issuesOpened: |
+ 👋 @{{ author }},感谢给 TDesign 提出了 issue。
+ 请根据 issue 模版确保背景信息的完善,我们将调查并尽快回复你。
+
+ # https://docs.github.com/cn/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#issues
+ - uses: 94dreamer/issue-assignees@main
+ id: assignees
+ with:
+ project_name: ${{github.event.repository.name}}
+ issue_title: ${{github.event.issue.title}}
+
+ - run: echo ${{ steps.assignees.outputs.contributors }}
+ - name: Add assigness
+ if: steps.assignees.outputs.contributors != ''
+ uses: actions-cool/issues-helper@v3
+ with:
+ actions: 'add-assignees'
+ token: ${{ secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ assignees: ${{ steps.assignees.outputs.contributors }}
+
+ - run: |
+ contributors=${{ steps.assignees.outputs.contributors }}
+ contributorstring=${contributors//,/ @}
+ echo "::set-output name=string::@$contributorstring"
+ id: contributors
+
+ - name: 通知贡献者
+ if: steps.assignees.outputs.contributors != ''
+ uses: TDesignOteam/workflows/actions/maintain-one-comment@main
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ body: |
+ ♥️ 有劳 ${{ steps.contributors.outputs.string }} 尽快确认问题。
+ 确认有效后将下一步计划和可能需要的时间回复给 @${{ github.event.issue.user.login }} 。
+
+ number: ${{ github.event.issue.number }}
+ body-include: ""
diff --git a/apps/web/.github/workflows/issue-help-wanted.temp.yml b/apps/web/.github/workflows/issue-help-wanted.temp.yml
new file mode 100644
index 0000000..94e9bbd
--- /dev/null
+++ b/apps/web/.github/workflows/issue-help-wanted.temp.yml
@@ -0,0 +1,22 @@
+# force copy from tencent/tdesign
+name: Issue Help wanted
+on:
+ issues:
+ types:
+ - labeled
+jobs:
+ add-comment:
+ if: github.event.label.name == 'help wanted'
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ steps:
+ - name: Add comment
+ uses: peter-evans/create-or-update-comment@v1
+ with:
+ issue-number: ${{ github.event.issue.number }}
+ body: |
+ 任何人都可以处理此问题。
+ **请务必在您的 `pull request` 中引用此问题。** :sparkles:
+ 感谢你的贡献! :sparkles:
+ reactions: heart
\ No newline at end of file
diff --git a/apps/web/.github/workflows/issue-mark-duplicate.temp.yml b/apps/web/.github/workflows/issue-mark-duplicate.temp.yml
new file mode 100644
index 0000000..3017723
--- /dev/null
+++ b/apps/web/.github/workflows/issue-mark-duplicate.temp.yml
@@ -0,0 +1,19 @@
+# force copy from tencent/tdesign
+# 当在 issue 的 comment 回复类似 `Duplicate of #111` 这样的话,issue 将被自动打上 重复提交标签 并且 cloese
+name: Issue Mark Duplicate
+
+on:
+ issue_comment:
+ types: [created, edited]
+
+jobs:
+ mark-duplicate:
+ runs-on: ubuntu-latest
+ steps:
+ - name: mark-duplicate
+ uses: actions-cool/issues-helper@v2
+ with:
+ actions: "mark-duplicate"
+ token: ${{ secrets.GITHUB_TOKEN }}
+ duplicate-labels: "duplicate"
+ close-issue: true
diff --git a/apps/web/.github/workflows/issue-reply.temp.yml b/apps/web/.github/workflows/issue-reply.temp.yml
new file mode 100644
index 0000000..271a94f
--- /dev/null
+++ b/apps/web/.github/workflows/issue-reply.temp.yml
@@ -0,0 +1,21 @@
+# force copy from tencent/tdesign
+# 当被打上 Need Reproduce 标签时候,自动提示需要重现实例
+
+name: ISSUE_REPLY
+
+on:
+ issues:
+ types: [labeled]
+
+jobs:
+ issue-reply:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Need Reproduce
+ if: github.event.label.name == 'Need Reproduce'
+ uses: actions-cool/issues-helper@v2
+ with:
+ actions: 'create-comment'
+ issue-number: ${{ github.event.issue.number }}
+ body: |
+ 你好 @${{ github.event.issue.user.login }}, 我们需要你提供一个在线的重现实例以便于我们帮你排查问题。你可以通过点击 [此处](https://codesandbox.io/) 创建一个 codesandbox 或者提供一个最小化的 GitHub 仓库。请确保选择准确的版本。
diff --git a/apps/web/.github/workflows/pr-spelling.temp.yml b/apps/web/.github/workflows/pr-spelling.temp.yml
new file mode 100644
index 0000000..48cd8cf
--- /dev/null
+++ b/apps/web/.github/workflows/pr-spelling.temp.yml
@@ -0,0 +1,14 @@
+# force copy from tencent/tdesign
+name: pr-spell-check
+on: [pull_request]
+
+jobs:
+ run:
+ name: Spell Check with Typos
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Check spelling
+ uses: crate-ci/typos@master
+ with:
+ config: .github/configs/typos_config.toml
diff --git a/apps/web/.github/workflows/preview-publish.yml b/apps/web/.github/workflows/preview-publish.yml
new file mode 100644
index 0000000..278ec79
--- /dev/null
+++ b/apps/web/.github/workflows/preview-publish.yml
@@ -0,0 +1,15 @@
+# 文件名建议统一为 preview-publish
+# 应用 preview.yml 的 demo
+name: PREVIEW_PUBLISH
+
+on:
+ workflow_run:
+ workflows: ["MAIN_PULL_REQUEST"]
+ types:
+ - completed
+
+jobs:
+ call-preview:
+ uses: TDesignOteam/workflows/.github/workflows/reusable-pr-preview.yml@main
+ secrets:
+ TDESIGN_SURGE_TOKEN: ${{ secrets.TDESIGN_SURGE_TOKEN }}
diff --git a/apps/web/.github/workflows/pull-request.yml b/apps/web/.github/workflows/pull-request.yml
new file mode 100644
index 0000000..93798f0
--- /dev/null
+++ b/apps/web/.github/workflows/pull-request.yml
@@ -0,0 +1,14 @@
+# 文件名建议统一为 pull-request.yml
+# 应用 test-build.yml 的 demo
+# 要求 package.json 提供 lint test site:preview
+
+name: MAIN_PULL_REQUEST
+
+on:
+ pull_request:
+ branches: [develop, main, site]
+ types: [opened, synchronize, reopened]
+
+jobs:
+ call-test-build:
+ uses: TDesignOteam/workflows/.github/workflows/reusable-unit-test.yml@main
diff --git a/apps/web/.gitignore b/apps/web/.gitignore
new file mode 100644
index 0000000..f4293fa
--- /dev/null
+++ b/apps/web/.gitignore
@@ -0,0 +1,25 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/coverage
+
+# production
+/dist
+
+# misc
+.DS_Store
+.idea
+.VSCodeCounter
+
+# log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# lock 文件 请根据自身项目或团队需求选择具体的包管理工具 并移除具体的ignore的lock文件
+yarn.lock
+pnpm-lock.yaml
+
+# code editor setting
+/.vscode
diff --git a/apps/web/.husky/pre-commit b/apps/web/.husky/pre-commit
new file mode 100755
index 0000000..52b5d1a
--- /dev/null
+++ b/apps/web/.husky/pre-commit
@@ -0,0 +1,8 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+if [[ `uname` == 'Darwin' ]]; then
+ PATH="/usr/local/bin:$PATH"
+fi
+
+npm run lint:fix
diff --git a/apps/web/.prettierrc.js b/apps/web/.prettierrc.js
new file mode 100644
index 0000000..8ae8226
--- /dev/null
+++ b/apps/web/.prettierrc.js
@@ -0,0 +1,22 @@
+module.exports = {
+ printWidth: 120,
+ tabWidth: 2,
+ useTabs: false,
+ semi: true,
+ singleQuote: true,
+ quoteProps: 'as-needed',
+ jsxSingleQuote: true,
+ trailingComma: 'all',
+ bracketSpacing: true,
+ jsxBracketSameLine: false,
+ arrowParens: 'always',
+ rangeStart: 0,
+ rangeEnd: null,
+ requirePragma: false,
+ insertPragma: false,
+ proseWrap: 'preserve',
+ htmlWhitespaceSensitivity: 'css',
+ vueIndentScriptAndStyle: false,
+ endOfLine: 'lf',
+ embeddedLanguageFormatting: 'auto',
+};
diff --git a/apps/web/CHANGELOG.md b/apps/web/CHANGELOG.md
new file mode 100644
index 0000000..b629a7f
--- /dev/null
+++ b/apps/web/CHANGELOG.md
@@ -0,0 +1,106 @@
+
+# Changelog
+
+## 0.3.1
+### 🚀 Features
+
+- 移除所有内置主题色相关代码,全部通过 tvision-color 计算获取 by @uyarn #144
+
+- 卡片统一默认样式为无边框 by @uyarn #144
+
+**Full Changelog**: https://github.com/Tencent/tdesign-react-starter/compare/0.3.0...0.3.1
+
+## 0.3.0
+❗ Breaking Changes
+
+- 统一使用`.env`文件区分环境 生产环境改为`release` by @uyarn in https://github.com/Tencent/tdesign-react-starter/pull/136
+
+🚀 Features
+
+- 默认路由模式改为`history`路由 by @uyarn in https://github.com/Tencent/tdesign-react-starter/pull/136
+
+**Full Changelog**: https://github.com/Tencent/tdesign-react-starter/compare/0.2.0...0.3.0
+
+## 0.2.0
+### ❗ Breaking Changes
+
+- 升级组件库依赖至 0.43+ 更新主题色配色方案 by @uyarn in https://github.com/Tencent/tdesign-react-starter/pull/129
+
+### 🚀 Features
+
+- 新增自定义颜色面板选择 by @uyarn in https://github.com/Tencent/tdesign-react-starter/pull/129
+
+### 🐞 Bug Fixes
+
+- 修复卡片面板的标题丢失的问题 by @uyarn https://github.com/Tencent/tdesign-react-starter/pull/129
+
+**Full Changelog**: https://github.com/Tencent/tdesign-react-starter/compare/0.1.6...0.2.0
+
+## 0.1.6
+### Features
+
+- 升级组件库依赖至0.42+ 版本
+
+### Bug Fixes
+
+- 修复部分页面样式展示的缺陷
+
+- 优化顶部菜单布局
+
+## 0.1.5
+## Features
+
+- 新增卡片列表页 by @xucz in https://github.com/Tencent/tdesign-react-starter/pull/91
+
+- 菜单路由配置`hidden`和`single`功能 by @xucz in https://github.com/Tencent/tdesign-react-starter/pull/95
+
+## Bug Fixes
+
+- 同步DatePicker组件升级的改动 by @uyarn in https://github.com/Tencent/tdesign-react-starter/pull/87
+
+**Full Changelog**: https://github.com/Tencent/tdesign-react-starter/compare/0.1.4...0.1.5
+
+## 0.1.4
+## Features
+
+- 增加面包屑导航
+
+- 搜索框样式优化
+
+- Layout组件命名语义化
+
+- 图表主题功能优化
+
+## 0.1.3
+1. 升级tdesign-react
+
+2. 替换为tdesign-react Card 组件
+
+3. table样式优化
+
+## 0.1.2
+- 升级axios、tdesign @xucz
+
+- fix: loss css token @uyarn
+
+- 修复图表文字重叠 @xucz
+
+## 0.1.1
+## Features
+
+- 新增登录页 #42 by @uyarn
+
+- Logo点击跳转首页 #45 by @aouos
+
+## 0.1.0
+## Bug Fixes
+
+- 修复页面主题色 by @xucz
+
+- 修复页面布局
+
+- 修复版本图表渲染问题
+
+## Features
+
+- 增加数据Mock by @xucz
diff --git a/apps/web/LICENSE b/apps/web/LICENSE
new file mode 100644
index 0000000..be586af
--- /dev/null
+++ b/apps/web/LICENSE
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) 2021-present TDesign
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/apps/web/README-zh_CN.md b/apps/web/README-zh_CN.md
new file mode 100644
index 0000000..909c3e1
--- /dev/null
+++ b/apps/web/README-zh_CN.md
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+简体中文 | [English](./README.md)
+
+### 项目简介
+
+TDesign React Starter 是一个基于 tdesign-react,使用 `React`、`Vite2`开发,可进行个性化主题配置,旨在提供项目开箱即用的、配置式的中后台项目。
+
+
+
+### 特性
+
+- 内置多种常用的中后台页面
+- 完善的目录结构
+- 完善的代码规范配置
+- 支持暗黑模式
+- 自定义主题颜色
+- 多种空间布局
+- 内置 Mock 数据方案
+
+### 开发
+
+```bash
+## 安装依赖
+npm install
+
+## 启动项目
+npm run dev
+
+## mock方式启动项目
+npm run dev:mock
+```
+
+### 构建
+
+```bash
+## 构建正式环境
+npm run build
+
+## 构建测试环境
+npm run build:test
+```
+
+### 其他
+
+```bash
+## 预览构建产物
+npm run preview
+
+## 代码格式检查
+npm run lint
+
+## 代码格式检查与自动修复
+npm run lint:fix
+
+```
+
+### 如何贡献
+
+非常欢迎您的贡献!提交您的 [Issue](https://github.com/tencent/tdesign-react-starter/issues/new/choose) 或者提交 [Pull Request](https://github.com/Tencent/tdesign-react-starter/pulls)。
+
+#### Pull Request
+
+1. Fork 代码!
+2. 创建自己的分支: `git checkout -b feat/xxxx`
+3. 提交你的修改: `git commit -a 'feat(project): describe'`
+4. 推送您的分支: `git push origin feat/xxxx`
+5. 提交 `pull request`
+
+#### 贡献提交规范
+
+- [Angular Convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)
+
+### 兼容性
+
+| [ ](http://godban.github.io/browsers-support-badges/) IE / Edge | [ ](http://godban.github.io/browsers-support-badges/)Firefox | [ ](http://godban.github.io/browsers-support-badges/)Chrome | [ ](http://godban.github.io/browsers-support-badges/)Safari |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Edge >=84 | Firefox >=83 | Chrome >=84 | Safari >=14.1 |
+
+### 开源协议
+
+TDesign 遵循 [MIT 协议](https://github.com/Tencent/tdesign-react-starter/LICENSE)。
+
diff --git a/apps/web/README.md b/apps/web/README.md
new file mode 100644
index 0000000..9cba5a3
--- /dev/null
+++ b/apps/web/README.md
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+English | [简体中文](./README-zh_CN.md)
+### Introduction
+
+TDesign React Starter is a TDesign-based project developed with `React`, `Vite`. It can be customized theme configuration, and aims to provide project out-of-the-box, configuration-style middle and background projects.
+
+
+ Live Preview
+ ·
+ Documentation
+
+
+
+
+### Features
+
+- Various provided pages for develop
+- Complete directory structure for develop
+- Code specification configuration
+- Support dark mode
+- Custom theme colors
+- Various space layouts
+- Mock data scheme
+
+### Usage
+
+> Initialize project with our CLI tool `tdesign-starter-cli`
+
+```bash
+## install tdesign-starter-cli
+npm i tdesign-starter-cli@latest -g
+
+## create project
+td-starter init
+```
+
+### Develop
+
+```bash
+## install dependencies
+npm install
+
+## set up
+npm run dev
+```
+
+### Build
+
+```bash
+## build
+npm run build
+
+## build for test
+npm run build:test
+```
+
+
+### Contributing Guide
+
+We welcome contributions to our project. Create your [Issue](https://github.com/tencent/tdesign-react-starter/issues/new/choose) or Submit your [Pull Request](https://github.com/Tencent/tdesign-react-starter/pulls).
+
+#### Pull Request
+
+1. Fork it!
+2. Create your branch: `git checkout -b feat/xxxx`
+3. Commit: `git commit -a 'feat(project): describe'`
+4. Push: `git push origin feat/xxxx`
+5. New Pull Request `pull request`
+
+#### Commit Specification
+
+- [Angular Convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)
+
+### Compatibility
+
+| [ ](http://godban.github.io/browsers-support-badges/) IE / Edge | [ ](http://godban.github.io/browsers-support-badges/)Firefox | [ ](http://godban.github.io/browsers-support-badges/)Chrome | [ ](http://godban.github.io/browsers-support-badges/)Safari |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Edge >=84 | Firefox >=83 | Chrome >=84 | Safari >=14.1 |
+
+### License
+
+The MIT License. Please see [the license file](LICENSE) for more information.
diff --git a/apps/web/docs/docs-starter.png b/apps/web/docs/docs-starter.png
new file mode 100644
index 0000000..6c8d7e7
Binary files /dev/null and b/apps/web/docs/docs-starter.png differ
diff --git a/apps/web/index.html b/apps/web/index.html
new file mode 100644
index 0000000..5b670bc
--- /dev/null
+++ b/apps/web/index.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+ EveryPublish 发布中台
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json
new file mode 100644
index 0000000..8a5bc52
--- /dev/null
+++ b/apps/web/package-lock.json
@@ -0,0 +1,8239 @@
+{
+ "name": "@tencent/tdesign-react-starter",
+ "version": "0.3.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@tencent/tdesign-react-starter",
+ "version": "0.3.1",
+ "dependencies": {
+ "@reduxjs/toolkit": "^1.8.5",
+ "axios": "^1.2.0",
+ "axios-jsonp": "^1.0.4",
+ "classnames": "^2.3.1",
+ "dayjs": "^1.10.7",
+ "echarts": "^5.3.0",
+ "echarts-for-react": "^3.0.2",
+ "lodash": "^4.17.21",
+ "mockjs": "^1.1.0",
+ "qrcode.react": "^3.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-redux": "^7.2.4",
+ "react-router-dom": "^6.3.0",
+ "tdesign-icons-react": "^0.4.3",
+ "tdesign-react": "^1.15.0",
+ "tvision-color": "^1.5.0"
+ },
+ "devDependencies": {
+ "@honkhonk/vite-plugin-svgr": "^1.1.0",
+ "@types/echarts": "^4.9.13",
+ "@types/lodash": "^4.14.178",
+ "@types/mockjs": "^1.0.6",
+ "@types/node": "^20.2.5",
+ "@types/qrcode.react": "^1.0.2",
+ "@types/react": "^18.2.0",
+ "@types/react-dom": "^18.2.0",
+ "@types/react-router-dom": "^5.3.3",
+ "@vitejs/plugin-react": "^1.3.2",
+ "eslint": "^8.3.0",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-config-prettier": "^8.4.0",
+ "eslint-config-react-app": "^7.0.0",
+ "eslint-plugin-import": "^2.25.4",
+ "eslint-plugin-prettier": "^4.0.0",
+ "eslint-plugin-react": "^7.28.0",
+ "husky": "^8.0.1",
+ "less": "^4.1.3",
+ "prettier": "^2.5.1",
+ "typescript": "^4.8.4",
+ "vite": "^2.9.15",
+ "vite-plugin-mock": "^2.9.6"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/compat-data/-/compat-data-7.26.5.tgz",
+ "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/core/-/core-7.26.0.tgz",
+ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.0",
+ "@babel/generator": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.0",
+ "@babel/parser": "^7.26.0",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.26.0",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/eslint-parser/-/eslint-parser-7.26.5.tgz",
+ "integrity": "sha512-Kkm8C8uxI842AwQADxl0GbcG1rupELYLShazYEZO/2DYjhyWXJIOUVOE3tBYm6JXzUCNJOZEzqc4rCW/jsEQYQ==",
+ "dev": true,
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/generator/-/generator-7.26.5.tgz",
+ "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.26.5",
+ "@babel/types": "^7.26.5",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.26.3",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
+ "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.3",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
+ "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+ "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/helpers/-/helpers-7.26.0.tgz",
+ "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/parser/-/parser-7.26.5.tgz",
+ "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.26.5"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
+ "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-decorators": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.18.6",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.18.6",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.21.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.18.6",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
+ "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz",
+ "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
+ "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz",
+ "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
+ "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.26.3",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+ "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz",
+ "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/plugin-syntax-flow": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
+ "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.26.3",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.26.6",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz",
+ "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+ "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+ "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+ "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+ "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
+ "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz",
+ "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
+ "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
+ "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz",
+ "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/preset-env/-/preset-env-7.26.0.tgz",
+ "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.9",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.25.9",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.25.9",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.25.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.25.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.25.9",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.38.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.26.3",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/preset-react/-/preset-react-7.26.3.tgz",
+ "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-react-display-name": "^7.25.9",
+ "@babel/plugin-transform-react-jsx": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+ "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.26.0",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz",
+ "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
+ "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3": {
+ "version": "7.18.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz",
+ "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==",
+ "dependencies": {
+ "core-js-pure": "^3.20.2",
+ "regenerator-runtime": "^0.13.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://mirrors.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/traverse/-/traverse-7.26.5.tgz",
+ "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.5",
+ "@babel/parser": "^7.26.5",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.5",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.5",
+ "resolved": "https://mirrors.tencent.com/npm/@babel/types/-/types-7.26.5.tgz",
+ "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
+ "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://mirrors.tencent.com/npm/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://mirrors.tencent.com/npm/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://mirrors.tencent.com/npm/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://mirrors.tencent.com/npm/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://mirrors.tencent.com/npm/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@honkhonk/vite-plugin-svgr": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/@honkhonk/vite-plugin-svgr/-/vite-plugin-svgr-1.1.0.tgz",
+ "integrity": "sha512-Z/KR54UolyaNRlbRWnrXb3C+2Xtl6ilHvD3ceoqTVV69OswtjSGZDefHHNK+SQUSBbYQo0lJO2jLgip0QBxL1A==",
+ "dev": true,
+ "dependencies": {
+ "@svgr/core": "^5.5.0"
+ },
+ "peerDependencies": {
+ "vite": "^2.5.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://mirrors.tencent.com/npm/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://mirrors.tencent.com/npm/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://mirrors.tencent.com/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@material/material-color-utilities": {
+ "version": "0.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/@material/material-color-utilities/-/material-color-utilities-0.1.2.tgz",
+ "integrity": "sha512-uKkkx7Xo1AZJR0eMjH902rAb0vEjDbb3tgXt0cC3SHbpDGkPNhkuDKtxnw147axOM6uKuI7vywHRQlDrjDGhCA=="
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://mirrors.tencent.com/npm/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://mirrors.tencent.com/npm/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://mirrors.tencent.com/npm/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://mirrors.tencent.com/npm/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@reduxjs/toolkit": {
+ "version": "1.9.7",
+ "resolved": "https://mirrors.tencent.com/npm/@reduxjs/toolkit/-/toolkit-1.9.7.tgz",
+ "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==",
+ "dependencies": {
+ "immer": "^9.0.21",
+ "redux": "^4.2.1",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.8"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18",
+ "react-redux": "^7.2.1 || ^8.0.2"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.21.0",
+ "resolved": "https://mirrors.tencent.com/npm/@remix-run/router/-/router-1.21.0.tgz",
+ "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "4.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+ "dev": true,
+ "dependencies": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.10.5",
+ "resolved": "https://mirrors.tencent.com/npm/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz",
+ "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==",
+ "dev": true
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "5.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "5.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "5.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "5.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "5.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "5.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "5.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "dev": true,
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "5.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/core/-/core-5.5.0.tgz",
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "dev": true,
+ "dependencies": {
+ "@svgr/plugin-jsx": "^5.5.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "5.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.6"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "5.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@svgr/babel-preset": "^5.5.0",
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
+ "svg-parser": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@types/echarts": {
+ "version": "4.9.22",
+ "resolved": "https://mirrors.tencent.com/npm/@types/echarts/-/echarts-4.9.22.tgz",
+ "integrity": "sha512-7Fo6XdWpoi8jxkwP7BARUOM7riq8bMhmsCtSG8gzUcJmFhLo387tihoBYS/y5j7jl3PENT5RxeWZdN9RiwO7HQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/zrender": "*"
+ }
+ },
+ "node_modules/@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://mirrors.tencent.com/npm/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
+ "dev": true
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.6",
+ "resolved": "https://mirrors.tencent.com/npm/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz",
+ "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://mirrors.tencent.com/npm/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://mirrors.tencent.com/npm/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.14",
+ "resolved": "https://mirrors.tencent.com/npm/@types/lodash/-/lodash-4.17.14.tgz",
+ "integrity": "sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==",
+ "dev": true
+ },
+ "node_modules/@types/mockjs": {
+ "version": "1.0.10",
+ "resolved": "https://mirrors.tencent.com/npm/@types/mockjs/-/mockjs-1.0.10.tgz",
+ "integrity": "sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.17.12",
+ "resolved": "https://mirrors.tencent.com/npm/@types/node/-/node-20.17.12.tgz",
+ "integrity": "sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "dev": true
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://mirrors.tencent.com/npm/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="
+ },
+ "node_modules/@types/qrcode.react": {
+ "version": "1.0.5",
+ "resolved": "https://mirrors.tencent.com/npm/@types/qrcode.react/-/qrcode.react-1.0.5.tgz",
+ "integrity": "sha512-BghPtnlwvrvq8QkGa1H25YnN+5OIgCKFuQruncGWLGJYOzeSKiix/4+B9BtfKF2wf5ja8yfyWYA3OXju995G8w==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.18",
+ "resolved": "https://mirrors.tencent.com/npm/@types/react/-/react-18.3.18.tgz",
+ "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.5",
+ "resolved": "https://mirrors.tencent.com/npm/@types/react-dom/-/react-dom-18.3.5.tgz",
+ "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/react-redux": {
+ "version": "7.1.34",
+ "resolved": "https://mirrors.tencent.com/npm/@types/react-redux/-/react-redux-7.1.34.tgz",
+ "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "node_modules/@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://mirrors.tencent.com/npm/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://mirrors.tencent.com/npm/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "dev": true,
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://mirrors.tencent.com/npm/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "dev": true
+ },
+ "node_modules/@types/sortablejs": {
+ "version": "1.15.8",
+ "resolved": "https://mirrors.tencent.com/npm/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+ "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg=="
+ },
+ "node_modules/@types/validator": {
+ "version": "13.12.2",
+ "resolved": "https://mirrors.tencent.com/npm/@types/validator/-/validator-13.12.2.tgz",
+ "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA=="
+ },
+ "node_modules/@types/zrender": {
+ "version": "4.0.6",
+ "resolved": "https://mirrors.tencent.com/npm/@types/zrender/-/zrender-4.0.6.tgz",
+ "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
+ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/type-utils": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://mirrors.tencent.com/npm/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/experimental-utils": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz",
+ "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz",
+ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://mirrors.tencent.com/npm/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://mirrors.tencent.com/npm/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://mirrors.tencent.com/npm/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
+ "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "1.3.2",
+ "resolved": "https://mirrors.tencent.com/npm/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz",
+ "integrity": "sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.17.10",
+ "@babel/plugin-transform-react-jsx": "^7.17.3",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-self": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-source": "^7.16.7",
+ "@rollup/pluginutils": "^4.2.1",
+ "react-refresh": "^0.13.0",
+ "resolve": "^1.22.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://mirrors.tencent.com/npm/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://mirrors.tencent.com/npm/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://mirrors.tencent.com/npm/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://mirrors.tencent.com/npm/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://mirrors.tencent.com/npm/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://mirrors.tencent.com/npm/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://mirrors.tencent.com/npm/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://mirrors.tencent.com/npm/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://mirrors.tencent.com/npm/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://mirrors.tencent.com/npm/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://mirrors.tencent.com/npm/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://mirrors.tencent.com/npm/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://mirrors.tencent.com/npm/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://mirrors.tencent.com/npm/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://mirrors.tencent.com/npm/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axios-jsonp": {
+ "version": "1.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/axios-jsonp/-/axios-jsonp-1.0.4.tgz",
+ "integrity": "sha512-KI5Fc4ery6DR+oneXG09hPZfGuNUW8Lblhe750h53Z0Eh5MRsrHn49YitDU4RsMk0HV+12zcvL2Q51QkOLGdIQ=="
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.12",
+ "resolved": "https://mirrors.tencent.com/npm/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+ "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://mirrors.tencent.com/npm/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.3",
+ "resolved": "https://mirrors.tencent.com/npm/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
+ "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://mirrors.tencent.com/npm/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==",
+ "dev": true
+ },
+ "node_modules/babel-preset-react-app": {
+ "version": "10.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz",
+ "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
+ "@babel/plugin-proposal-decorators": "^7.16.4",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
+ "@babel/plugin-proposal-private-methods": "^7.16.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.16.0",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-runtime": "^7.16.4",
+ "@babel/preset-env": "^7.16.4",
+ "@babel/preset-react": "^7.16.0",
+ "@babel/preset-typescript": "^7.16.0",
+ "@babel/runtime": "^7.16.3",
+ "babel-plugin-macros": "^3.1.0",
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/bezier-easing": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/bezier-easing/-/bezier-easing-2.1.0.tgz",
+ "integrity": "sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY="
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://mirrors.tencent.com/npm/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://mirrors.tencent.com/npm/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001692",
+ "resolved": "https://mirrors.tencent.com/npm/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
+ "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://mirrors.tencent.com/npm/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "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"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/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/chroma-js": {
+ "version": "2.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/chroma-js/-/chroma-js-2.1.2.tgz",
+ "integrity": "sha512-ri/ouYDWuxfus3UcaMxC1Tfp3IE9K5iQzxc2hSxbBRVNQFut1UuGAsZmiAf2mOUubzGJwgMSv9lHg+XqLaz1QQ==",
+ "dependencies": {
+ "cross-env": "^6.0.3"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://mirrors.tencent.com/npm/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://mirrors.tencent.com/npm/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "13.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/commander/-/commander-13.0.0.tgz",
+ "integrity": "sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://mirrors.tencent.com/npm/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://mirrors.tencent.com/npm/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/connect/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/connect/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://mirrors.tencent.com/npm/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "dependencies": {
+ "is-what": "^3.14.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.40.0",
+ "resolved": "https://mirrors.tencent.com/npm/core-js-compat/-/core-js-compat-3.40.0.tgz",
+ "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.24.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.40.0",
+ "resolved": "https://mirrors.tencent.com/npm/core-js-pure/-/core-js-pure-3.40.0.tgz",
+ "integrity": "sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dev": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cross-env": {
+ "version": "6.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/cross-env/-/cross-env-6.0.3.tgz",
+ "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==",
+ "dependencies": {
+ "cross-spawn": "^7.0.0"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://mirrors.tencent.com/npm/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://mirrors.tencent.com/npm/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://mirrors.tencent.com/npm/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://mirrors.tencent.com/npm/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://mirrors.tencent.com/npm/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/echarts": {
+ "version": "5.6.0",
+ "resolved": "https://mirrors.tencent.com/npm/echarts/-/echarts-5.6.0.tgz",
+ "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
+ "dependencies": {
+ "tslib": "2.3.0",
+ "zrender": "5.6.1"
+ }
+ },
+ "node_modules/echarts-for-react": {
+ "version": "3.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/echarts-for-react/-/echarts-for-react-3.0.2.tgz",
+ "integrity": "sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "size-sensor": "^1.0.1"
+ },
+ "peerDependencies": {
+ "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0",
+ "react": "^15.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.80",
+ "resolved": "https://mirrors.tencent.com/npm/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz",
+ "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://mirrors.tencent.com/npm/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://mirrors.tencent.com/npm/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://mirrors.tencent.com/npm/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.9",
+ "resolved": "https://mirrors.tencent.com/npm/es-abstract/-/es-abstract-1.23.9.tgz",
+ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.0",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-regex": "^1.2.1",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.0",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.3",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.18"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild/-/esbuild-0.14.54.tgz",
+ "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/linux-loong64": "0.14.54",
+ "esbuild-android-64": "0.14.54",
+ "esbuild-android-arm64": "0.14.54",
+ "esbuild-darwin-64": "0.14.54",
+ "esbuild-darwin-arm64": "0.14.54",
+ "esbuild-freebsd-64": "0.14.54",
+ "esbuild-freebsd-arm64": "0.14.54",
+ "esbuild-linux-32": "0.14.54",
+ "esbuild-linux-64": "0.14.54",
+ "esbuild-linux-arm": "0.14.54",
+ "esbuild-linux-arm64": "0.14.54",
+ "esbuild-linux-mips64le": "0.14.54",
+ "esbuild-linux-ppc64le": "0.14.54",
+ "esbuild-linux-riscv64": "0.14.54",
+ "esbuild-linux-s390x": "0.14.54",
+ "esbuild-netbsd-64": "0.14.54",
+ "esbuild-openbsd-64": "0.14.54",
+ "esbuild-sunos-64": "0.14.54",
+ "esbuild-windows-32": "0.14.54",
+ "esbuild-windows-64": "0.14.54",
+ "esbuild-windows-arm64": "0.14.54"
+ }
+ },
+ "node_modules/esbuild-android-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
+ "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-android-arm64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
+ "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
+ "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-arm64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
+ "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
+ "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-arm64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
+ "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-32": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
+ "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
+ "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
+ "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
+ "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-mips64le": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
+ "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-ppc64le": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
+ "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-riscv64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
+ "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-s390x": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
+ "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-netbsd-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
+ "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-openbsd-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
+ "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-sunos-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
+ "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-32": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
+ "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
+ "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-arm64": {
+ "version": "0.14.54",
+ "resolved": "https://mirrors.tencent.com/npm/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
+ "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://mirrors.tencent.com/npm/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "dependencies": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.2"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-config-react-app": {
+ "version": "7.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
+ "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/eslint-parser": "^7.16.3",
+ "@rushstack/eslint-patch": "^1.1.0",
+ "@typescript-eslint/eslint-plugin": "^5.5.0",
+ "@typescript-eslint/parser": "^5.5.0",
+ "babel-preset-react-app": "^10.0.1",
+ "confusing-browser-globals": "^1.0.11",
+ "eslint-plugin-flowtype": "^8.0.3",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jest": "^25.3.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.27.1",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "eslint-plugin-testing-library": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-flowtype": {
+ "version": "8.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz",
+ "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "string-natural-compare": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@babel/plugin-syntax-flow": "^7.14.5",
+ "@babel/plugin-transform-react-jsx": "^7.14.9",
+ "eslint": "^8.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "dev": true,
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "25.7.0",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz",
+ "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "4.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.4",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz",
+ "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://mirrors.tencent.com/npm/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library": {
+ "version": "5.11.1",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz",
+ "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.58.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://mirrors.tencent.com/npm/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://mirrors.tencent.com/npm/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://mirrors.tencent.com/npm/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://mirrors.tencent.com/npm/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://mirrors.tencent.com/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://mirrors.tencent.com/npm/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/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/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://mirrors.tencent.com/npm/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.18.0",
+ "resolved": "https://mirrors.tencent.com/npm/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.2",
+ "resolved": "https://mirrors.tencent.com/npm/flatted/-/flatted-3.3.2.tgz",
+ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://mirrors.tencent.com/npm/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://mirrors.tencent.com/npm/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://mirrors.tencent.com/npm/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://mirrors.tencent.com/npm/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://mirrors.tencent.com/npm/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://mirrors.tencent.com/npm/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://mirrors.tencent.com/npm/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.7",
+ "resolved": "https://mirrors.tencent.com/npm/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://mirrors.tencent.com/npm/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://mirrors.tencent.com/npm/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://mirrors.tencent.com/npm/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://mirrors.tencent.com/npm/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "8.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true,
+ "bin": {
+ "husky": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://mirrors.tencent.com/npm/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://mirrors.tencent.com/npm/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "0.5.5",
+ "resolved": "https://mirrors.tencent.com/npm/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://mirrors.tencent.com/npm/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://mirrors.tencent.com/npm/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://mirrors.tencent.com/npm/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://mirrors.tencent.com/npm/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/is-async-function/-/is-async-function-2.1.0.tgz",
+ "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/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-boolean-object": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-boolean-object/-/is-boolean-object-1.2.1.tgz",
+ "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://mirrors.tencent.com/npm/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/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-map": {
+ "version": "2.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://mirrors.tencent.com/npm/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/is-weakref/-/is-weakref-1.1.0.tgz",
+ "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "3.14.1",
+ "resolved": "https://mirrors.tencent.com/npm/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://mirrors.tencent.com/npm/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://mirrors.tencent.com/npm/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://mirrors.tencent.com/npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://mirrors.tencent.com/npm/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://mirrors.tencent.com/npm/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://mirrors.tencent.com/npm/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://mirrors.tencent.com/npm/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://mirrors.tencent.com/npm/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/less": {
+ "version": "4.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/less/-/less-4.2.1.tgz",
+ "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==",
+ "dev": true,
+ "dependencies": {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1",
+ "tslib": "^2.3.0"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://mirrors.tencent.com/npm/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://mirrors.tencent.com/npm/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://mirrors.tencent.com/npm/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://mirrors.tencent.com/npm/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://mirrors.tencent.com/npm/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://mirrors.tencent.com/npm/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://mirrors.tencent.com/npm/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://mirrors.tencent.com/npm/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://mirrors.tencent.com/npm/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": "3.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://mirrors.tencent.com/npm/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+ },
+ "node_modules/mockjs": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/mockjs/-/mockjs-1.1.0.tgz",
+ "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+ "dependencies": {
+ "commander": "*"
+ },
+ "bin": {
+ "random": "bin/random"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://mirrors.tencent.com/npm/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://mirrors.tencent.com/npm/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/needle": {
+ "version": "3.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/needle/-/needle-3.3.1.tgz",
+ "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://mirrors.tencent.com/npm/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.3",
+ "resolved": "https://mirrors.tencent.com/npm/object-inspect/-/object-inspect-1.13.3.tgz",
+ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://mirrors.tencent.com/npm/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://mirrors.tencent.com/npm/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://mirrors.tencent.com/npm/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://mirrors.tencent.com/npm/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://mirrors.tencent.com/npm/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/postcss/-/postcss-8.5.0.tgz",
+ "integrity": "sha512-27VKOqrYfPncKA2NrFOVhP5MGAfHKLYn/Q0mz9cNQyRAKYi3VNHwYU2qKKqPCqgBmeeJ0uAFB56NumXZ5ZReXg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://mirrors.tencent.com/npm/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://mirrors.tencent.com/npm/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode.react": {
+ "version": "3.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/qrcode.react/-/qrcode.react-3.2.0.tgz",
+ "integrity": "sha512-YietHHltOHA4+l5na1srdaMx4sVSOjV9tamHs+mwiLWAMr6QVACRUw1Neax5CptFILcNoITctJY0Ipyn5enQ8g==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://mirrors.tencent.com/npm/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://mirrors.tencent.com/npm/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://mirrors.tencent.com/npm/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-redux": {
+ "version": "7.2.9",
+ "resolved": "https://mirrors.tencent.com/npm/react-redux/-/react-redux-7.2.9.tgz",
+ "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.15.4",
+ "@types/react-redux": "^7.1.20",
+ "hoist-non-react-statics": "^3.3.2",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.7.2",
+ "react-is": "^17.0.2"
+ },
+ "peerDependencies": {
+ "react": "^16.8.3 || ^17 || ^18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-redux/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ },
+ "node_modules/react-refresh": {
+ "version": "0.13.0",
+ "resolved": "https://mirrors.tencent.com/npm/react-refresh/-/react-refresh-0.13.0.tgz",
+ "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.28.1",
+ "resolved": "https://mirrors.tencent.com/npm/react-router/-/react-router-6.28.1.tgz",
+ "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==",
+ "dependencies": {
+ "@remix-run/router": "1.21.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.28.1",
+ "resolved": "https://mirrors.tencent.com/npm/react-router-dom/-/react-router-dom-6.28.1.tgz",
+ "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==",
+ "dependencies": {
+ "@remix-run/router": "1.21.0",
+ "react-router": "6.28.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://mirrors.tencent.com/npm/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://mirrors.tencent.com/npm/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://mirrors.tencent.com/npm/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
+ "peerDependencies": {
+ "redux": "^4"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://mirrors.tencent.com/npm/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://mirrors.tencent.com/npm/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://mirrors.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://mirrors.tencent.com/npm/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://mirrors.tencent.com/npm/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://mirrors.tencent.com/npm/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://mirrors.tencent.com/npm/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://mirrors.tencent.com/npm/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://mirrors.tencent.com/npm/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.77.3",
+ "resolved": "https://mirrors.tencent.com/npm/rollup/-/rollup-2.77.3.tgz",
+ "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://mirrors.tencent.com/npm/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://mirrors.tencent.com/npm/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://mirrors.tencent.com/npm/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://mirrors.tencent.com/npm/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/size-sensor": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/size-sensor/-/size-sensor-1.0.2.tgz",
+ "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw=="
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sortablejs": {
+ "version": "1.15.6",
+ "resolved": "https://mirrors.tencent.com/npm/sortablejs/-/sortablejs-1.15.6.tgz",
+ "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A=="
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://mirrors.tencent.com/npm/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://mirrors.tencent.com/npm/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
+ "dev": true
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://mirrors.tencent.com/npm/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://mirrors.tencent.com/npm/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://mirrors.tencent.com/npm/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://mirrors.tencent.com/npm/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "dev": true
+ },
+ "node_modules/tdesign-icons-react": {
+ "version": "0.4.3",
+ "resolved": "https://mirrors.tencent.com/npm/tdesign-icons-react/-/tdesign-icons-react-0.4.3.tgz",
+ "integrity": "sha512-Lln/P3qkKpDct6qD4KxHgH+zr6yuEtbnoa8peYHpzB7Reqre8g4w06kyAe8mKCKrXtCkOwDVBf7XsxzAU5WqKg==",
+ "dependencies": {
+ "@babel/runtime": "^7.16.5",
+ "classnames": "^2.2.6"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1",
+ "react-dom": ">=16.13.1"
+ }
+ },
+ "node_modules/tdesign-react": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/tdesign-react/-/tdesign-react-1.15.1.tgz",
+ "integrity": "sha512-5htrIZtYvek54Fpz/8VZp+yC2zWmzY00S7BztIz3khZpyrYBrwQgLdMKkE5I/ueEBiQQFjwNh1oAo4oFZIPSrw==",
+ "dependencies": {
+ "@babel/runtime": "~7.26.7",
+ "@popperjs/core": "~2.11.2",
+ "@types/sortablejs": "^1.10.7",
+ "@types/validator": "^13.1.3",
+ "classnames": "~2.5.1",
+ "dayjs": "1.11.10",
+ "hoist-non-react-statics": "~3.3.2",
+ "lodash-es": "^4.17.21",
+ "mitt": "^3.0.0",
+ "raf": "~3.4.1",
+ "react-fast-compare": "^3.2.2",
+ "react-is": "^18.2.0",
+ "react-transition-group": "~4.4.1",
+ "sortablejs": "^1.15.0",
+ "tdesign-icons-react": "^0.6.1",
+ "tslib": "~2.3.1",
+ "validator": "~13.15.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1",
+ "react-dom": ">=16.13.1"
+ }
+ },
+ "node_modules/tdesign-react/node_modules/dayjs": {
+ "version": "1.11.10",
+ "resolved": "https://mirrors.tencent.com/npm/dayjs/-/dayjs-1.11.10.tgz",
+ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+ },
+ "node_modules/tdesign-react/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
+ },
+ "node_modules/tdesign-react/node_modules/tdesign-icons-react": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/tdesign-icons-react/-/tdesign-icons-react-0.6.1.tgz",
+ "integrity": "sha512-O+hfqf2HEDhZC3e7Rr+pkflnYVW1eMtRqcShhmegwWvj097rP910nGzWBGFNbuQEfoueRlCZ0iSacqYF71JeNQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.16.5",
+ "classnames": "^2.2.6"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1",
+ "react-dom": ">=16.13.1"
+ }
+ },
+ "node_modules/tdesign-react/node_modules/tslib": {
+ "version": "2.3.1",
+ "resolved": "https://mirrors.tencent.com/npm/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/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/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://mirrors.tencent.com/npm/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://mirrors.tencent.com/npm/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://mirrors.tencent.com/npm/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://mirrors.tencent.com/npm/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tvision-color": {
+ "version": "1.6.0",
+ "resolved": "https://mirrors.tencent.com/npm/tvision-color/-/tvision-color-1.6.0.tgz",
+ "integrity": "sha512-pu8LkA4ZLBjbnmC9keqce4TLnExcQphKSoExauncSybmbqAhslXQvGdsI/FeWpxItGa4mcjGsHz5YE8bjpLjRw==",
+ "dependencies": {
+ "@babel/runtime-corejs3": "7.18.9",
+ "@material/material-color-utilities": "0.1.2",
+ "bezier-easing": "^2.1.0",
+ "chroma-js": "2.1.2"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://mirrors.tencent.com/npm/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://mirrors.tencent.com/npm/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://mirrors.tencent.com/npm/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://mirrors.tencent.com/npm/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://mirrors.tencent.com/npm/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://mirrors.tencent.com/npm/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://mirrors.tencent.com/npm/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "dev": true
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://mirrors.tencent.com/npm/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://mirrors.tencent.com/npm/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.2",
+ "resolved": "https://mirrors.tencent.com/npm/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://mirrors.tencent.com/npm/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://mirrors.tencent.com/npm/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/validator": {
+ "version": "13.15.15",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz",
+ "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vite": {
+ "version": "2.9.18",
+ "resolved": "https://mirrors.tencent.com/npm/vite/-/vite-2.9.18.tgz",
+ "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.14.27",
+ "postcss": "^8.4.13",
+ "resolve": "^1.22.0",
+ "rollup": ">=2.59.0 <2.78.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": ">=12.2.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "less": "*",
+ "sass": "*",
+ "stylus": "*"
+ },
+ "peerDependenciesMeta": {
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-mock": {
+ "version": "2.9.8",
+ "resolved": "https://mirrors.tencent.com/npm/vite-plugin-mock/-/vite-plugin-mock-2.9.8.tgz",
+ "integrity": "sha512-YTQM5Sn7t+/DNOwTkr+W26QGTCk1PrDkhGHslTJ90lIPJhJtDTwuSkEYMAuLP9TcVQ/qExTFx/x/GE3kxJ05sw==",
+ "dev": true,
+ "dependencies": {
+ "@types/mockjs": "^1.0.4",
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.2",
+ "connect": "^3.7.0",
+ "debug": "^4.3.2",
+ "esbuild": "^0.14.36",
+ "fast-glob": "^3.2.7",
+ "path-to-regexp": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "mockjs": ">=1.1.0",
+ "vite": ">=2.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://mirrors.tencent.com/npm/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.18",
+ "resolved": "https://mirrors.tencent.com/npm/which-typed-array/-/which-typed-array-1.1.18.tgz",
+ "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://mirrors.tencent.com/npm/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://mirrors.tencent.com/npm/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://mirrors.tencent.com/npm/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://mirrors.tencent.com/npm/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://mirrors.tencent.com/npm/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zrender": {
+ "version": "5.6.1",
+ "resolved": "https://mirrors.tencent.com/npm/zrender/-/zrender-5.6.1.tgz",
+ "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
+ "dependencies": {
+ "tslib": "2.3.0"
+ }
+ }
+ }
+}
diff --git a/apps/web/package.json b/apps/web/package.json
new file mode 100644
index 0000000..8126761
--- /dev/null
+++ b/apps/web/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "@tencent/tdesign-react-starter",
+ "version": "0.3.1",
+ "private": true,
+ "scripts": {
+ "dev:mock": "vite --open --mode mock",
+ "dev": "vite --open --mode development",
+ "dev:linux": "vite --mode development",
+ "build:test": "vite build --mode test",
+ "build": "vite build --mode release",
+ "build:site": "vite build --mode site",
+ "site:preview": "npm run build && cp -r dist _site",
+ "preview": "vite preview --mode test",
+ "test": "echo \"no test specified,work in process\"",
+ "test:coverage": "echo \"no test specified,work in process\"",
+ "lint": "eslint ./src --ext ts,tsx",
+ "lint:fix": "eslint ./src --ext ts,tsx --fix",
+ "prepare": "husky install"
+ },
+ "devDependencies": {
+ "@honkhonk/vite-plugin-svgr": "^1.1.0",
+ "@types/echarts": "^4.9.13",
+ "@types/lodash": "^4.14.178",
+ "@types/mockjs": "^1.0.6",
+ "@types/node": "^20.2.5",
+ "@types/react": "^18.2.0",
+ "@types/react-dom": "^18.2.0",
+ "@types/react-redux": "7",
+ "@types/react-router-dom": "^5.3.3",
+ "@vitejs/plugin-react": "^1.3.2",
+ "eslint": "^8.3.0",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-config-prettier": "^8.4.0",
+ "eslint-config-react-app": "^7.0.0",
+ "eslint-plugin-import": "^2.25.4",
+ "eslint-plugin-prettier": "^4.0.0",
+ "eslint-plugin-react": "^7.28.0",
+ "husky": "^8.0.1",
+ "less": "^4.1.3",
+ "prettier": "^2.5.1",
+ "typescript": "^4.8.4",
+ "vite": "^2.9.15",
+ "vite-plugin-mock": "^2.9.6"
+ },
+ "dependencies": {
+ "@reduxjs/toolkit": "^1.8.5",
+ "axios": "^1.2.0",
+ "axios-jsonp": "^1.0.4",
+ "classnames": "^2.3.1",
+ "dayjs": "^1.10.7",
+ "echarts": "^5.3.0",
+ "echarts-for-react": "^3.0.2",
+ "lodash": "^4.17.21",
+ "mockjs": "^1.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-redux": "^7.2.4",
+ "react-router-dom": "^6.3.0",
+ "tdesign-icons-react": "^0.6.0",
+ "tdesign-react": "^1.15.0",
+ "tvision-color": "^1.5.0"
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
+}
diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico
new file mode 100644
index 0000000..086ac80
Binary files /dev/null and b/apps/web/public/favicon.ico differ
diff --git a/apps/web/public/robots.txt b/apps/web/public/robots.txt
new file mode 100644
index 0000000..e9e57dc
--- /dev/null
+++ b/apps/web/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/apps/web/src/assets/image/assets-login-bg-black.png b/apps/web/src/assets/image/assets-login-bg-black.png
new file mode 100644
index 0000000..b4dde4b
Binary files /dev/null and b/apps/web/src/assets/image/assets-login-bg-black.png differ
diff --git a/apps/web/src/assets/image/assets-login-bg-white.png b/apps/web/src/assets/image/assets-login-bg-white.png
new file mode 100644
index 0000000..4275549
Binary files /dev/null and b/apps/web/src/assets/image/assets-login-bg-white.png differ
diff --git a/apps/web/src/assets/svg/assets-logo-full.svg b/apps/web/src/assets/svg/assets-logo-full.svg
new file mode 100644
index 0000000..335359b
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-logo-full.svg
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/assets/svg/assets-product-1.svg b/apps/web/src/assets/svg/assets-product-1.svg
new file mode 100644
index 0000000..29e97f0
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-product-1.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-product-2.svg b/apps/web/src/assets/svg/assets-product-2.svg
new file mode 100644
index 0000000..827c8bf
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-product-2.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-product-3.svg b/apps/web/src/assets/svg/assets-product-3.svg
new file mode 100644
index 0000000..a3d461b
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-product-3.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-product-4.svg b/apps/web/src/assets/svg/assets-product-4.svg
new file mode 100644
index 0000000..7ac1abc
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-product-4.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-result-403.svg b/apps/web/src/assets/svg/assets-result-403.svg
new file mode 100644
index 0000000..343a25e
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-result-403.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-result-404.svg b/apps/web/src/assets/svg/assets-result-404.svg
new file mode 100644
index 0000000..db1cb36
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-result-404.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-result-500.svg b/apps/web/src/assets/svg/assets-result-500.svg
new file mode 100644
index 0000000..e820fe2
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-result-500.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-result-browser-incompatible.svg b/apps/web/src/assets/svg/assets-result-browser-incompatible.svg
new file mode 100644
index 0000000..ebaf5ba
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-result-browser-incompatible.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-result-maintenance.svg b/apps/web/src/assets/svg/assets-result-maintenance.svg
new file mode 100644
index 0000000..f0cc27e
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-result-maintenance.svg
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/assets/svg/assets-result-network-error.svg b/apps/web/src/assets/svg/assets-result-network-error.svg
new file mode 100644
index 0000000..eeee8b5
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-result-network-error.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-setting-auto.svg b/apps/web/src/assets/svg/assets-setting-auto.svg
new file mode 100644
index 0000000..66f57de
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-setting-auto.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-setting-dark.svg b/apps/web/src/assets/svg/assets-setting-dark.svg
new file mode 100644
index 0000000..0f15649
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-setting-dark.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-setting-light.svg b/apps/web/src/assets/svg/assets-setting-light.svg
new file mode 100644
index 0000000..ffa8f34
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-setting-light.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/web/src/assets/svg/assets-t-logo.svg b/apps/web/src/assets/svg/assets-t-logo.svg
new file mode 100644
index 0000000..ed0464d
--- /dev/null
+++ b/apps/web/src/assets/svg/assets-t-logo.svg
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/components/ErrorPage/index.module.less b/apps/web/src/components/ErrorPage/index.module.less
new file mode 100644
index 0000000..75937c8
--- /dev/null
+++ b/apps/web/src/components/ErrorPage/index.module.less
@@ -0,0 +1,33 @@
+.errorBox {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ height: 75vh;
+ padding: 24px;
+ min-height: 400px;
+ color: var(--td-brand-color);
+ img {
+ width: 200px;
+ height: 140px;
+ color: var(--td-brand-color);
+ }
+
+ .title {
+ font-weight: 500;
+ font-size: 20px;
+ line-height: 28px;
+ margin-top: 8px;
+ color: var(--td-text-color-primary);
+ }
+ .description {
+ margin: 8px 0 32px;
+ font-size: 14px;
+ line-height: 22px;
+ color: var(--td-text-color-secondary);
+ }
+
+ .rightButton {
+ margin-left: 8px;
+ }
+}
diff --git a/apps/web/src/components/ErrorPage/index.tsx b/apps/web/src/components/ErrorPage/index.tsx
new file mode 100644
index 0000000..7a71403
--- /dev/null
+++ b/apps/web/src/components/ErrorPage/index.tsx
@@ -0,0 +1,51 @@
+import React, { memo } from 'react';
+import { Button } from 'tdesign-react';
+
+import Light403Icon from 'assets/svg/assets-result-403.svg?component';
+import Light404Icon from 'assets/svg/assets-result-404.svg?component';
+import Light500Icon from 'assets/svg/assets-result-500.svg?component';
+import style from './index.module.less';
+
+enum ECode {
+ forbidden = 403,
+ notFount = 404,
+ error = 500,
+}
+
+interface IErrorPageProps {
+ code: ECode;
+ title?: string;
+ desc?: string;
+}
+
+const errorInfo = {
+ [ECode.forbidden]: {
+ title: '403 Forbidden',
+ desc: '抱歉,您无权限访问此页面',
+ icon: ,
+ },
+ [ECode.notFount]: {
+ title: '404 Not Found',
+ desc: '抱歉,您访问的页面不存在。',
+ icon: ,
+ },
+ [ECode.error]: {
+ title: '500 Internal Server Error',
+ desc: '抱歉,服务器出错啦!',
+ icon: ,
+ },
+};
+
+const ErrorPage: React.FC = (props) => {
+ const info = errorInfo[props.code];
+ return (
+
+ {info?.icon}
+
{info?.title}
+
{info?.desc}
+
返回首页
+
+ );
+};
+
+export default memo(ErrorPage);
diff --git a/apps/web/src/components/Placeholder/index.tsx b/apps/web/src/components/Placeholder/index.tsx
new file mode 100644
index 0000000..33171f3
--- /dev/null
+++ b/apps/web/src/components/Placeholder/index.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import { Card, Tag } from 'tdesign-react';
+
+interface IPlaceholderProps {
+ title: string;
+ desc?: string;
+ phase?: string;
+}
+
+const Placeholder: React.FC = ({ title, desc, phase }) => (
+
+
+
+ {phase || 'D5-D7 填充业务内容'}
+
+
+
+);
+
+export default Placeholder;
diff --git a/apps/web/src/configs/color.ts b/apps/web/src/configs/color.ts
new file mode 100644
index 0000000..46b4fff
--- /dev/null
+++ b/apps/web/src/configs/color.ts
@@ -0,0 +1,20 @@
+import { ETheme } from 'types/index.d';
+
+export const defaultColor = ['#0052d9', '#0594fa', '#00a870', '#ebb105', '#ed7b2f', '#e34d59', '#ed49b4', '#834ec2'];
+
+export const darkColor = ['#4582e6', '#29a4fb', '#03a56f', '#ca8d03', '#ed7b2f', '#ea7b84', '#f172c5', '#ab87d5'];
+
+export const CHART_COLORS = {
+ [ETheme.light]: {
+ textColor: 'rgba(0, 0, 0, 0.9)',
+ placeholderColor: 'rgba(0, 0, 0, 0.35)',
+ borderColor: '#dcdcdc',
+ containerColor: '#fff',
+ },
+ [ETheme.dark]: {
+ textColor: 'rgba(255, 255, 255, 0.9)',
+ placeholderColor: 'rgba(255, 255, 255, 0.35)',
+ borderColor: '#5e5e5e',
+ containerColor: '#242424',
+ },
+};
diff --git a/apps/web/src/configs/host.ts b/apps/web/src/configs/host.ts
new file mode 100644
index 0000000..c91bdb8
--- /dev/null
+++ b/apps/web/src/configs/host.ts
@@ -0,0 +1,17 @@
+export default {
+ mock: {
+ API: '/api/v1',
+ },
+ development: {
+ API: '/api/v1',
+ },
+ test: {
+ API: '/api/v1',
+ },
+ release: {
+ API: '/api/v1',
+ },
+ site: {
+ API: '/api/v1',
+ },
+};
diff --git a/apps/web/src/constants/platforms.ts b/apps/web/src/constants/platforms.ts
new file mode 100644
index 0000000..c155778
--- /dev/null
+++ b/apps/web/src/constants/platforms.ts
@@ -0,0 +1,16 @@
+export const PLATFORM_LABEL: Record = {
+ douyin: '抖音',
+ kuaishou: '快手',
+ xiaohongshu: '小红书',
+ bilibili: 'B站',
+ shipinhao: '视频号',
+ x: 'X (推特)',
+ instagram: 'Instagram',
+ whatsapp: 'WhatsApp',
+ youtube: 'YouTube',
+};
+
+export const PLATFORM_OPTIONS = Object.keys(PLATFORM_LABEL).map((k) => ({ label: PLATFORM_LABEL[k], value: k }));
+
+export const DOMESTIC = ['douyin', 'kuaishou', 'xiaohongshu', 'bilibili', 'shipinhao'];
+export const OVERSEAS = ['x', 'instagram', 'whatsapp', 'youtube'];
diff --git a/apps/web/src/global.d.ts b/apps/web/src/global.d.ts
new file mode 100644
index 0000000..e8757fb
--- /dev/null
+++ b/apps/web/src/global.d.ts
@@ -0,0 +1,55 @@
+declare module '*.avif' {
+ export default src as string;
+}
+
+declare module '*.bmp' {
+ export default src as string;
+}
+
+declare module '*.gif' {
+ export default src as string;
+}
+
+declare module '*.jpg' {
+ export default src as string;
+}
+
+declare module '*.jpeg' {
+ export default src as string;
+}
+
+declare module '*.png' {
+ export default src as string;
+}
+
+declare module '*.webp' {
+ export default src as string;
+}
+
+declare module '*.svg' {
+ export default src as string;
+}
+declare module '*.svg?component' {
+ import React from 'react';
+ const ReactComponent: React.FC>;
+ export default ReactComponent;
+}
+declare module '*.module.css' {
+ export default classes as { readonly [key: string]: string };
+}
+
+declare module '*.module.less' {
+ export default classes as { readonly [key: string]: string };
+}
+
+declare module '*.less' {
+ export default classes as { readonly [key: string]: string };
+}
+
+declare module 'tvision-color';
+
+declare interface ImportMeta {
+ env: {
+ MODE: 'development' | 'test' | 'release' | 'mock' | 'site';
+ };
+}
diff --git a/apps/web/src/layouts/components/AppLayout.module.less b/apps/web/src/layouts/components/AppLayout.module.less
new file mode 100644
index 0000000..052c362
--- /dev/null
+++ b/apps/web/src/layouts/components/AppLayout.module.less
@@ -0,0 +1,29 @@
+.sidePanel {
+ height: 100%;
+ display: flex;
+ flex-direction: row!important;
+}
+
+.sideContainer {
+ flex: 1;
+ min-width: 760px;
+ overflow: auto;
+}
+
+.topPanel {
+ min-width: 1150px;
+}
+
+.mixPanel {
+ height: 100%;
+}
+
+.mixMain {
+ flex-direction: row!important;
+ flex: 1;
+ overflow: auto;
+}
+
+.mixContent {
+ overflow: auto;
+}
diff --git a/apps/web/src/layouts/components/AppLayout.tsx b/apps/web/src/layouts/components/AppLayout.tsx
new file mode 100644
index 0000000..911b593
--- /dev/null
+++ b/apps/web/src/layouts/components/AppLayout.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import { Layout } from 'tdesign-react';
+import { ELayout } from 'modules/global';
+import Header from './Header';
+import Footer from './Footer';
+import Menu from './Menu';
+import classnames from 'classnames';
+import Content from './AppRouter';
+
+import Style from './AppLayout.module.less';
+
+const SideLayout = React.memo(() => (
+
+
+
+
+
+
+
+
+));
+
+const TopLayout = React.memo(() => (
+
+
+
+
+
+));
+
+const MixLayout = React.memo(() => (
+
+
+
+
+
+
+
+
+
+
+));
+
+const FullPageLayout = React.memo(() => );
+
+export default {
+ [ELayout.side]: SideLayout,
+ [ELayout.top]: TopLayout,
+ [ELayout.mix]: MixLayout,
+ [ELayout.fullPage]: FullPageLayout,
+};
diff --git a/apps/web/src/layouts/components/AppRouter.module.less b/apps/web/src/layouts/components/AppRouter.module.less
new file mode 100644
index 0000000..53fd177
--- /dev/null
+++ b/apps/web/src/layouts/components/AppRouter.module.less
@@ -0,0 +1,7 @@
+.loading {
+ height: 100%;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-content: center;
+}
diff --git a/apps/web/src/layouts/components/AppRouter.tsx b/apps/web/src/layouts/components/AppRouter.tsx
new file mode 100644
index 0000000..83453cc
--- /dev/null
+++ b/apps/web/src/layouts/components/AppRouter.tsx
@@ -0,0 +1,69 @@
+import React, { Suspense, memo } from 'react';
+import { Routes, Route, Navigate } from 'react-router-dom';
+import { Layout, Loading } from 'tdesign-react';
+import routers, { IRouter } from 'router';
+import { resolve } from 'utils/path';
+import Page from './Page';
+import Style from './AppRouter.module.less';
+
+const { Content } = Layout;
+
+type TRenderRoutes = (routes: IRouter[], parentPath?: string, breadcrumbs?: string[]) => React.ReactNode[];
+/**
+ * 渲染应用路由
+ * @param routes
+ * @param parentPath
+ * @param breadcrumb
+ */
+const renderRoutes: TRenderRoutes = (routes, parentPath = '', breadcrumb = []) =>
+ routes.map((route, index: number) => {
+ const { Component, children, redirect, meta } = route;
+ const currentPath = resolve(parentPath, route.path);
+ let currentBreadcrumb = breadcrumb;
+
+ if (meta?.title) {
+ currentBreadcrumb = currentBreadcrumb.concat([meta?.title]);
+ }
+
+ if (redirect) {
+ // 重定向
+ return } />;
+ }
+
+ if (Component) {
+ // 路由守卫:非全屏页未登录跳转登录页
+ if (!route.isFullPage && !localStorage.getItem('ep_token')) {
+ return } />;
+ }
+ // 有路由菜单
+ return (
+
+
+
+ }
+ />
+ );
+ }
+ // 无路由菜单
+ return children ? renderRoutes(children, currentPath, currentBreadcrumb) : null;
+ });
+
+const AppRouter = () => (
+
+
+
+
+ }
+ >
+ {renderRoutes(routers)}
+
+
+);
+
+export default memo(AppRouter);
diff --git a/apps/web/src/layouts/components/Footer.tsx b/apps/web/src/layouts/components/Footer.tsx
new file mode 100644
index 0000000..44b87d6
--- /dev/null
+++ b/apps/web/src/layouts/components/Footer.tsx
@@ -0,0 +1,21 @@
+import React from 'react';
+import { Layout, Row } from 'tdesign-react';
+import { useAppSelector } from 'modules/store';
+import { selectGlobal } from 'modules/global';
+
+const { Footer: TFooter } = Layout;
+
+const Footer = () => {
+ const globalState = useAppSelector(selectGlobal);
+ if (!globalState.showFooter) {
+ return null;
+ }
+
+ return (
+
+ Copyright © 2022-{new Date().getFullYear()} Tencent. All Rights Reserved
+
+ );
+};
+
+export default React.memo(Footer);
diff --git a/apps/web/src/layouts/components/Header/HeaderIcon.module.less b/apps/web/src/layouts/components/Header/HeaderIcon.module.less
new file mode 100644
index 0000000..21d593c
--- /dev/null
+++ b/apps/web/src/layouts/components/Header/HeaderIcon.module.less
@@ -0,0 +1,54 @@
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.badge {
+ :global {
+ .t-badge--circle {
+ top: 5px;
+ right: 6px;
+ }
+ }
+}
+.menuIcon {
+ width: 30px !important;
+ height: 30px !important;
+}
+.dropItem {
+ display: flex;
+ align-items: center;
+ span {
+ margin-left: 8px;
+ }
+}
+.dropdown {
+ padding-left: 0;
+ padding-right: 0;
+ .icon {
+ font-size: 20px;
+ display: inline-block;
+ margin: 0 5px;
+ }
+ :global {
+ .t-button--variant-text {
+ padding-left: 9px;
+ padding-right: 9px;
+ }
+ .t-button__text {
+ display: flex;
+ align-items: center;
+ }
+ .t-dropdown__item {
+ max-width: none !important;
+ width: 117px;
+ &-text {
+ display: flex;
+ align-items: center;
+ }
+ .t-icon {
+ margin-right: 8px;
+ }
+ }
+ }
+}
diff --git a/apps/web/src/layouts/components/Header/HeaderIcon.tsx b/apps/web/src/layouts/components/Header/HeaderIcon.tsx
new file mode 100644
index 0000000..84b49c3
--- /dev/null
+++ b/apps/web/src/layouts/components/Header/HeaderIcon.tsx
@@ -0,0 +1,56 @@
+import React, { memo } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { Button, Badge, Dropdown, Space } from 'tdesign-react';
+import { Icon, MailIcon, PoweroffIcon, UserCircleIcon } from 'tdesign-icons-react';
+import { useAppDispatch, useAppSelector } from 'modules/store';
+import { logout, selectUser } from 'modules/user';
+import Style from './HeaderIcon.module.less';
+
+const { DropdownMenu, DropdownItem } = Dropdown;
+
+export default memo(() => {
+ const dispatch = useAppDispatch();
+ const navigate = useNavigate();
+ const userState = useAppSelector(selectUser);
+ const nickname = userState.userInfo.nickname || userState.userInfo.email || '未登录';
+
+ const clickHandler = (data: any) => {
+ if (data.value === 1) {
+ navigate('/setting/profile');
+ }
+ };
+
+ const handleLogout = async () => {
+ await dispatch(logout());
+ navigate('/login/index');
+ };
+
+ return (
+
+
+ } />
+
+
+
+
+ {nickname}
+
+
+
+
+
+
+ 个人设置
+
+
+
+
+
+
+
+
+ );
+});
diff --git a/apps/web/src/layouts/components/Header/Search.module.less b/apps/web/src/layouts/components/Header/Search.module.less
new file mode 100644
index 0000000..45db8de
--- /dev/null
+++ b/apps/web/src/layouts/components/Header/Search.module.less
@@ -0,0 +1,14 @@
+.panel {
+ :global {
+ .t-input {
+ border: none;
+ }
+ .t-input:hover {
+ background: var(--td-bg-color-secondarycontainer);
+ transition: background var(--td-anim-duration-base) linear
+ }
+ .t-input--focused {
+ box-shadow: none;
+ }
+ }
+}
diff --git a/apps/web/src/layouts/components/Header/Search.tsx b/apps/web/src/layouts/components/Header/Search.tsx
new file mode 100644
index 0000000..a50d7cb
--- /dev/null
+++ b/apps/web/src/layouts/components/Header/Search.tsx
@@ -0,0 +1,8 @@
+import React from 'react';
+import { Input } from 'tdesign-react';
+import { SearchIcon } from 'tdesign-icons-react';
+import Style from './Search.module.less';
+
+const Search = () => } placeholder='请输入搜索内容' />;
+
+export default React.memo(Search);
diff --git a/apps/web/src/layouts/components/Header/index.module.less b/apps/web/src/layouts/components/Header/index.module.less
new file mode 100644
index 0000000..f45eeae
--- /dev/null
+++ b/apps/web/src/layouts/components/Header/index.module.less
@@ -0,0 +1,11 @@
+.panel {
+ flex-shrink: 0;
+ padding-left: 20px;
+ padding-right: 20px;
+ position: sticky;
+ top: 0;
+ z-index: 101;
+ display: flex;
+ justify-content: space-between;
+ border-bottom: 1px solid var(--td-component-stroke);
+}
diff --git a/apps/web/src/layouts/components/Header/index.tsx b/apps/web/src/layouts/components/Header/index.tsx
new file mode 100644
index 0000000..c81bec2
--- /dev/null
+++ b/apps/web/src/layouts/components/Header/index.tsx
@@ -0,0 +1,49 @@
+import React, { memo } from 'react';
+import { Layout, Button, Space } from 'tdesign-react';
+import { ViewListIcon } from 'tdesign-icons-react';
+import { useAppDispatch, useAppSelector } from 'modules/store';
+import { selectGlobal, toggleMenu } from 'modules/global';
+import HeaderIcon from './HeaderIcon';
+import { HeaderMenu } from '../Menu';
+import Search from './Search';
+import Style from './index.module.less';
+
+const { Header } = Layout;
+
+export default memo((props: { showMenu?: boolean }) => {
+ const globalState = useAppSelector(selectGlobal);
+ const dispatch = useAppDispatch();
+
+ if (!globalState.showHeader) {
+ return null;
+ }
+
+ let HeaderLeft;
+ if (props.showMenu) {
+ HeaderLeft = (
+
+
+
+ );
+ } else {
+ HeaderLeft = (
+
+ dispatch(toggleMenu(null))}
+ icon={ }
+ />
+
+
+ );
+ }
+
+ return (
+
+ );
+});
diff --git a/apps/web/src/layouts/components/Menu.module.less b/apps/web/src/layouts/components/Menu.module.less
new file mode 100644
index 0000000..54f83d0
--- /dev/null
+++ b/apps/web/src/layouts/components/Menu.module.less
@@ -0,0 +1,34 @@
+.menuPanel {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.menuTip {
+ color: var(--td-text-color-primary);
+ opacity: 0.4;
+ height: 38px;
+ line-height: 38px;
+ text-align: center;
+}
+
+.menuLogo {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ color: var(--td-text-color-primary);
+}
+
+.menuMiniLogo {
+ width: 28px;
+ height: 28px;
+}
+
+.logoFull {
+ color: var(--td-text-color-primary);
+ width: 184px;
+ height: 32px;
+}
diff --git a/apps/web/src/layouts/components/Menu.tsx b/apps/web/src/layouts/components/Menu.tsx
new file mode 100644
index 0000000..2d9332f
--- /dev/null
+++ b/apps/web/src/layouts/components/Menu.tsx
@@ -0,0 +1,126 @@
+import React, { memo, useState } from 'react';
+import { useNavigate, useLocation, NavigateFunction } from 'react-router-dom';
+import { Menu, MenuValue } from 'tdesign-react';
+import router, { IRouter } from 'router';
+import { resolve } from 'utils/path';
+import { useAppSelector } from 'modules/store';
+import { selectGlobal } from 'modules/global';
+import { selectUser } from 'modules/user';
+import MenuLogo from './MenuLogo';
+import Style from './Menu.module.less';
+
+const { SubMenu, MenuItem, HeadMenu } = Menu;
+
+interface IMenuProps {
+ showLogo?: boolean;
+ showOperation?: boolean;
+}
+
+// 纯函数:递归渲染菜单(不在递归/循环内调用 Hook)
+const renderMenuItems = (menu: IRouter[], navigate: NavigateFunction, isAdmin: boolean, parentPath = '') => {
+ return menu.map((item) => {
+ const { children, meta, path } = item;
+
+ if (!meta || meta?.hidden === true) {
+ return null;
+ }
+
+ if (meta.admin && !isAdmin) {
+ // 平台管理菜单仅 admin 角色可见
+ return null;
+ }
+
+ const { Icon, title, single } = meta;
+ const routerPath = resolve(parentPath, path);
+
+ if (!children || children.length === 0) {
+ return (
+ : undefined}
+ onClick={() => navigate(routerPath)}
+ >
+ {title}
+
+ );
+ }
+
+ if (single && children?.length > 0) {
+ const firstChild = children[0];
+ if (firstChild?.meta && !firstChild?.meta?.hidden) {
+ const { Icon, title } = meta;
+ const singlePath = resolve(resolve(parentPath, path), firstChild.path);
+ return (
+ : undefined}
+ onClick={() => navigate(singlePath)}
+ >
+ {title}
+
+ );
+ }
+ }
+
+ return (
+ : undefined}>
+ {renderMenuItems(children, navigate, isAdmin, routerPath)}
+
+ );
+ });
+};
+
+/**
+ * 顶部菜单
+ */
+export const HeaderMenu = memo(() => {
+ const globalState = useAppSelector(selectGlobal);
+ const location = useLocation();
+ const navigate = useNavigate();
+ const userState = useAppSelector(selectUser);
+ const isAdmin = userState.userInfo?.role === 'admin';
+ const [active, setActive] = useState(location.pathname); // todo
+
+ return (
+ setActive(v)}
+ >
+ {renderMenuItems(router, navigate, isAdmin)}
+
+ );
+});
+
+/**
+ * 左侧菜单
+ */
+export default memo((props: IMenuProps) => {
+ const location = useLocation();
+ const navigate = useNavigate();
+ const globalState = useAppSelector(selectGlobal);
+ const userState = useAppSelector(selectUser);
+ const isAdmin = userState.userInfo?.role === 'admin';
+
+ const { version } = globalState;
+ const bottomText = globalState.collapsed ? version : 'EveryPublish ' + version;
+
+ return (
+ {bottomText} : undefined}
+ logo={props.showLogo ? : undefined}
+ >
+ {renderMenuItems(router, navigate, isAdmin)}
+
+ );
+});
diff --git a/apps/web/src/layouts/components/MenuLogo.tsx b/apps/web/src/layouts/components/MenuLogo.tsx
new file mode 100644
index 0000000..73d1f9a
--- /dev/null
+++ b/apps/web/src/layouts/components/MenuLogo.tsx
@@ -0,0 +1,23 @@
+import React, { memo } from 'react';
+import Style from './Menu.module.less';
+import FullLogo from 'assets/svg/assets-logo-full.svg?component';
+import MiniLogo from 'assets/svg/assets-t-logo.svg?component';
+import { useNavigate } from 'react-router-dom';
+
+interface IProps {
+ collapsed?: boolean;
+}
+
+export default memo((props: IProps) => {
+ const navigate = useNavigate();
+
+ const handleClick = () => {
+ navigate('/');
+ };
+
+ return (
+
+ {props.collapsed ? : }
+
+ );
+});
diff --git a/apps/web/src/layouts/components/Page.module.less b/apps/web/src/layouts/components/Page.module.less
new file mode 100644
index 0000000..076937b
--- /dev/null
+++ b/apps/web/src/layouts/components/Page.module.less
@@ -0,0 +1,9 @@
+.panel {
+ margin: 24px;
+ padding: 0;
+ overflow: auto;
+}
+
+.breadcrumb {
+ margin-bottom: 8px;
+}
diff --git a/apps/web/src/layouts/components/Page.tsx b/apps/web/src/layouts/components/Page.tsx
new file mode 100644
index 0000000..b054d83
--- /dev/null
+++ b/apps/web/src/layouts/components/Page.tsx
@@ -0,0 +1,39 @@
+import React, { useEffect } from 'react';
+import { useAppDispatch, useAppSelector } from '../../modules/store';
+import { selectGlobal, switchFullPage } from '../../modules/global';
+import { Layout, Breadcrumb } from 'tdesign-react';
+import Style from './Page.module.less';
+
+const { Content } = Layout;
+const { BreadcrumbItem } = Breadcrumb;
+
+const Page = ({
+ children,
+ isFullPage,
+ breadcrumbs,
+}: React.PropsWithChildren<{ isFullPage?: boolean; breadcrumbs?: string[] }>) => {
+ const globalState = useAppSelector(selectGlobal);
+ const dispatch = useAppDispatch();
+ useEffect(() => {
+ dispatch(switchFullPage(isFullPage));
+ }, [isFullPage]);
+
+ if (isFullPage) {
+ return <>{children}>;
+ }
+
+ return (
+
+ {globalState.showBreadcrumbs && (
+
+ {breadcrumbs?.map((item, index) => (
+ {item}
+ ))}
+
+ )}
+ {children}
+
+ );
+};
+
+export default React.memo(Page);
diff --git a/apps/web/src/layouts/components/Setting/RadioColor.module.less b/apps/web/src/layouts/components/Setting/RadioColor.module.less
new file mode 100644
index 0000000..7e1faaf
--- /dev/null
+++ b/apps/web/src/layouts/components/Setting/RadioColor.module.less
@@ -0,0 +1,17 @@
+.panel {
+ display: flex;
+ justify-content: space-between;
+}
+
+.box {
+ cursor: pointer;
+ border: 2px solid;
+ padding: 4px;
+ border-radius: 50%;
+}
+
+.item {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+}
diff --git a/apps/web/src/layouts/components/Setting/RadioColor.tsx b/apps/web/src/layouts/components/Setting/RadioColor.tsx
new file mode 100644
index 0000000..47ec72d
--- /dev/null
+++ b/apps/web/src/layouts/components/Setting/RadioColor.tsx
@@ -0,0 +1,67 @@
+import React, { useState } from 'react';
+import { defaultColor } from 'configs/color';
+import { Popup, ColorPickerPanel } from 'tdesign-react';
+import Style from './RadioColor.module.less';
+
+interface IProps {
+ defaultValue?: number | string;
+ onChange: (color: string) => void;
+}
+
+const RadioColor = (props: IProps) => {
+ const [isColoPickerDisplay, onPopupVisibleChange] = useState(false);
+
+ return (
+
+ {defaultColor.map((color, index) => (
+
props?.onChange(color)}
+ className={Style.box}
+ style={{ borderColor: props.defaultValue === color && !isColoPickerDisplay ? color : 'transparent' }}
+ >
+
+
+ ))}
+
+
onPopupVisibleChange(v)}
+ overlayInnerStyle={{ padding: 0 }}
+ content={
+ props?.onChange(v)}
+ colorModes={['monochrome']}
+ format='HEX'
+ swatchColors={[]}
+ defaultValue={props.defaultValue as string}
+ />
+ }
+ >
+
+
+
+ );
+};
+
+export default React.memo(RadioColor);
diff --git a/apps/web/src/layouts/components/Setting/RadioRect.module.less b/apps/web/src/layouts/components/Setting/RadioRect.module.less
new file mode 100644
index 0000000..174daf8
--- /dev/null
+++ b/apps/web/src/layouts/components/Setting/RadioRect.module.less
@@ -0,0 +1,28 @@
+.radioRectPanel {
+ display: flex;
+ justify-content: space-between;
+}
+
+.rectItem {
+ border: 2px solid #e3e6eb;
+ padding: 8px;
+ border-radius: 3px;
+ cursor: pointer;
+}
+
+.rectItemSelected {
+ border-color: var(--td-brand-color);
+}
+
+.rectText {
+ text-align: center;
+ font-size: 14px;
+ margin-top: 8px;
+ line-height: 21px;
+}
+
+.rectImg {
+ width: 88px;
+ height: 48px;
+ background-size: 100% 100%;
+}
diff --git a/apps/web/src/layouts/components/Setting/RadioRect.tsx b/apps/web/src/layouts/components/Setting/RadioRect.tsx
new file mode 100644
index 0000000..620cff6
--- /dev/null
+++ b/apps/web/src/layouts/components/Setting/RadioRect.tsx
@@ -0,0 +1,47 @@
+import React, { memo, useState } from 'react';
+import classname from 'classnames';
+import Style from './RadioRect.module.less';
+
+interface IOption {
+ value?: any;
+ image: JSX.Element | string;
+ name?: string;
+}
+
+interface IProps {
+ defaultValue?: number | string;
+ onChange: (value?: any) => void;
+ options: IOption[];
+}
+
+export default memo((props: IProps) => {
+ const [selectValue, setSelectValue] = useState(props.defaultValue);
+
+ const handleClick = (option: IOption) => {
+ setSelectValue(option.value);
+ props?.onChange(option.value);
+ };
+
+ return (
+
+ {props.options.map((item, index) => {
+ let ImageItem = item.image;
+ if (typeof item.image === 'string') {
+ ImageItem =
;
+ }
+
+ return (
+
+
handleClick(item)}
+ >
+ {ImageItem}
+
+ {item.name &&
{item.name}
}
+
+ );
+ })}
+
+ );
+});
diff --git a/apps/web/src/layouts/components/Setting/index.module.less b/apps/web/src/layouts/components/Setting/index.module.less
new file mode 100644
index 0000000..626a66f
--- /dev/null
+++ b/apps/web/src/layouts/components/Setting/index.module.less
@@ -0,0 +1,13 @@
+.settingTitle {
+ margin: 32px 0 24px 0;
+ color: var(--td-text-color-primary);
+ font-size: 14px;
+ line-height: 22px;
+ font-weight: 500;
+}
+
+.settingSubTitle {
+ font-size: 14px;
+ line-height: 21px;
+ margin-bottom: 24px;
+}
diff --git a/apps/web/src/layouts/components/Setting/index.tsx b/apps/web/src/layouts/components/Setting/index.tsx
new file mode 100644
index 0000000..fa185bd
--- /dev/null
+++ b/apps/web/src/layouts/components/Setting/index.tsx
@@ -0,0 +1,123 @@
+import React, { memo } from 'react';
+import { Row, Col, Switch } from 'tdesign-react';
+import { useAppDispatch, useAppSelector } from 'modules/store';
+import {
+ selectGlobal,
+ toggleShowHeader,
+ toggleShowBreadcrumbs,
+ toggleShowFooter,
+ switchTheme,
+ switchColor,
+ switchLayout,
+ openSystemTheme,
+ ELayout,
+} from 'modules/global';
+import { ETheme } from 'types/index.d';
+import RadioColor from './RadioColor';
+import RadioRect from './RadioRect';
+
+import Light from 'assets/svg/assets-setting-light.svg?component';
+import Dark from 'assets/svg/assets-setting-dark.svg?component';
+import System from 'assets/svg/assets-setting-auto.svg?component';
+
+import Style from './index.module.less';
+
+enum ESettingTheme {
+ system,
+}
+
+const themeList = [
+ {
+ value: ETheme.light,
+ image: ,
+ name: '明亮',
+ },
+ {
+ value: ETheme.dark,
+ image: ,
+ name: '黑暗',
+ },
+ {
+ value: ESettingTheme.system,
+ image: ,
+ name: '跟随系统',
+ },
+];
+
+const layoutList = [
+ {
+ value: ELayout.side,
+ image: 'https://tdesign.gtimg.com/starter/setting/side.png',
+ },
+ {
+ value: ELayout.top,
+ image: 'https://tdesign.gtimg.com/starter/setting/top.png',
+ },
+ {
+ value: ELayout.mix,
+ image: 'https://tdesign.gtimg.com/starter/setting/mix.png',
+ },
+];
+
+export default memo(() => {
+ const dispatch = useAppDispatch();
+ const globalState = useAppSelector(selectGlobal);
+
+ const handleThemeSwitch = (value: any) => {
+ if (value === ESettingTheme.system) {
+ dispatch(openSystemTheme());
+ } else {
+ dispatch(switchTheme(value));
+ dispatch(switchColor(globalState.color));
+ }
+ };
+
+ return (
+
+
主题模式
+
+
+
主题色
+
dispatch(switchColor(value))} />
+
+ 导航布局
+ dispatch(switchLayout(value))}
+ options={layoutList}
+ />
+
+ 元素开关
+
+
+ 显示 Header
+
+
+ dispatch(toggleShowHeader())} />
+
+
+
+
+
+ 显示 Breadcrumbs
+
+
+ dispatch(toggleShowBreadcrumbs())} />
+
+
+
+
+
+ 显示 Footer
+
+
+ dispatch(toggleShowFooter())} />
+
+
+
+ );
+});
diff --git a/apps/web/src/layouts/index.module.less b/apps/web/src/layouts/index.module.less
new file mode 100644
index 0000000..0d4d602
--- /dev/null
+++ b/apps/web/src/layouts/index.module.less
@@ -0,0 +1,27 @@
+.panel {
+ height: 100%;
+
+ :global {
+ .t-menu--scroll::-webkit-scrollbar {
+ width: 8px;
+ background: transparent;
+ }
+ .t-menu--scroll::-webkit-scrollbar-thumb {
+ border-radius: 6px;
+ border: 2px solid transparent;
+ background-clip: content-box;
+ background-color: #eeeeee;
+ }
+
+ .t-default-menu.t-menu--dark {
+ background: var(--td-gray-color-13);
+ }
+ .t-default-menu:not(.t-menu--dark) .t-menu__item.t-is-active:not(.t-is-opened) {
+ background-color: var(--td-brand-color-1);
+ color: var(--td-brand-color);
+ .t-icon {
+ color: var(--td-brand-color);
+ }
+ }
+ }
+}
diff --git a/apps/web/src/layouts/index.tsx b/apps/web/src/layouts/index.tsx
new file mode 100644
index 0000000..eccb5ff
--- /dev/null
+++ b/apps/web/src/layouts/index.tsx
@@ -0,0 +1,54 @@
+import React, { memo, useEffect } from 'react';
+import { Drawer, Layout } from 'tdesign-react';
+import throttle from 'lodash/throttle';
+import { useAppSelector, useAppDispatch } from 'modules/store';
+import { selectGlobal, toggleSetting, toggleMenu, ELayout, switchTheme } from 'modules/global';
+import { getUserInfo } from 'modules/user';
+import Setting from './components/Setting';
+import AppLayout from './components/AppLayout';
+import Style from './index.module.less';
+
+export default memo(() => {
+ const globalState = useAppSelector(selectGlobal);
+ const dispatch = useAppDispatch();
+
+ const layoutKey = (globalState.isFullPage ? ELayout.fullPage : globalState.layout) as ELayout;
+ const AppContainer = AppLayout[layoutKey];
+
+ useEffect(() => {
+ if (localStorage.getItem('ep_token')) {
+ dispatch(getUserInfo());
+ }
+ }, []);
+
+ useEffect(() => {
+ dispatch(switchTheme(globalState.theme));
+ const handleResize = throttle(() => {
+ if (window.innerWidth < 900) {
+ dispatch(toggleMenu(true));
+ } else if (window.innerWidth > 1000) {
+ dispatch(toggleMenu(false));
+ }
+ }, 100);
+ window.addEventListener('resize', handleResize);
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ };
+ }, []);
+
+ return (
+
+
+ dispatch(toggleSetting())}
+ >
+
+
+
+ );
+});
diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx
new file mode 100644
index 0000000..abb363e
--- /dev/null
+++ b/apps/web/src/main.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import { Provider } from 'react-redux';
+import { BrowserRouter } from 'react-router-dom';
+import store from 'modules/store';
+import App from 'layouts/index';
+
+import { connectWS } from 'utils/ws';
+
+import 'tdesign-react/es/style/index.css';
+
+import './styles/index.less';
+
+const env = import.meta.env.MODE || 'development';
+const baseRouterName = env === 'site' ? '/starter/react/' : '';
+
+// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+const root = document.getElementById('app')!;
+
+const renderApp = () => {
+ ReactDOM.createRoot(root).render(
+
+
+
+
+ ,
+ );
+};
+
+renderApp();
+connectWS();
diff --git a/apps/web/src/modules/global/index.ts b/apps/web/src/modules/global/index.ts
new file mode 100644
index 0000000..9f68e32
--- /dev/null
+++ b/apps/web/src/modules/global/index.ts
@@ -0,0 +1,151 @@
+import { createSlice, PayloadAction } from '@reduxjs/toolkit';
+import { ETheme } from 'types/index.d';
+import { Color } from 'tvision-color';
+import { CHART_COLORS, defaultColor } from 'configs/color';
+import { generateColorMap, insertThemeStylesheet } from 'utils/color';
+import { RootState } from '../store';
+import { version } from '../../../package.json';
+
+const namespace = 'global';
+
+export enum ELayout {
+ side = 1,
+ top,
+ mix,
+ fullPage,
+}
+
+export interface IGlobalState {
+ loading: boolean;
+ collapsed: boolean;
+ /**
+ * 是否显示面包屑导航
+ */
+ setting: boolean;
+ version: string;
+ color: string;
+ /**
+ * 主题:深色 浅色
+ */
+ theme: ETheme;
+ /**
+ * 是否开启跟随系统主题
+ */
+ systemTheme: boolean;
+ layout: ELayout;
+ isFullPage: boolean;
+ showHeader: boolean;
+ showBreadcrumbs: boolean;
+ showFooter: boolean;
+ chartColors: Record;
+}
+
+const defaultTheme = ETheme.light;
+
+const initialState: IGlobalState = {
+ loading: true,
+ collapsed: window.innerWidth < 1000, // 宽度小于1000 菜单闭合
+ setting: false,
+ version,
+ theme: defaultTheme,
+ systemTheme: false,
+ layout: ELayout.side,
+ isFullPage: false,
+ color: defaultColor?.[0],
+ showHeader: true,
+ showBreadcrumbs: true,
+ showFooter: true,
+ chartColors: CHART_COLORS[defaultTheme],
+};
+
+// 创建带有命名空间的reducer
+const globalSlice = createSlice({
+ name: namespace,
+ initialState,
+ reducers: {
+ toggleMenu: (state, action) => {
+ if (action.payload === null) {
+ state.collapsed = !state.collapsed;
+ } else {
+ state.collapsed = !!action.payload;
+ }
+ },
+ toggleSetting: (state) => {
+ state.setting = !state.setting;
+ },
+ toggleShowHeader: (state) => {
+ state.showHeader = !state.showHeader;
+ },
+ toggleShowBreadcrumbs: (state) => {
+ state.showBreadcrumbs = !state.showBreadcrumbs;
+ },
+ toggleShowFooter: (state) => {
+ state.showFooter = !state.showFooter;
+ },
+ switchTheme: (state, action: PayloadAction) => {
+ const finalTheme = action?.payload;
+ // 切换 chart 颜色
+ state.chartColors = CHART_COLORS[finalTheme];
+ // 切换主题颜色
+ state.theme = finalTheme;
+ // 关闭跟随系统
+ state.systemTheme = false;
+ document.documentElement.setAttribute('theme-mode', finalTheme);
+ },
+ openSystemTheme: (state) => {
+ const media = window.matchMedia('(prefers-color-scheme:dark)');
+ if (media.matches) {
+ const finalTheme = media.matches ? ETheme.dark : ETheme.light;
+ state.chartColors = CHART_COLORS[finalTheme];
+ // 切换主题颜色
+ state.theme = finalTheme;
+ state.systemTheme = true;
+ document.documentElement.setAttribute('theme-mode', finalTheme);
+ }
+ },
+ switchColor: (state, action) => {
+ if (action?.payload) {
+ state.color = action?.payload;
+ const mode = state.theme;
+
+ const hex = action?.payload;
+
+ const { colors: newPalette, primary: brandColorIndex } = Color.getColorGradations({
+ colors: [hex],
+ step: 10,
+ remainInput: false, // 是否保留输入 不保留会矫正不合适的主题色
+ })[0];
+ const newColorMap = generateColorMap(hex, newPalette, mode, brandColorIndex);
+ insertThemeStylesheet(hex, newColorMap, mode);
+
+ document.documentElement.setAttribute('theme-color', hex || '');
+ }
+ },
+ switchLayout: (state, action) => {
+ if (action?.payload) {
+ state.layout = action?.payload;
+ }
+ },
+ switchFullPage: (state, action) => {
+ state.isFullPage = !!action?.payload;
+ },
+ },
+ extraReducers: () => {},
+});
+
+export const selectGlobal = (state: RootState) => state.global;
+
+export const {
+ toggleMenu,
+ toggleSetting,
+ toggleShowHeader,
+ toggleShowBreadcrumbs,
+ toggleShowFooter,
+ switchTheme,
+ switchColor,
+ switchLayout,
+ switchFullPage,
+ openSystemTheme,
+} = globalSlice.actions;
+
+export default globalSlice.reducer;
diff --git a/apps/web/src/modules/store.ts b/apps/web/src/modules/store.ts
new file mode 100644
index 0000000..774f5f4
--- /dev/null
+++ b/apps/web/src/modules/store.ts
@@ -0,0 +1,22 @@
+import { configureStore, combineReducers } from '@reduxjs/toolkit';
+import { TypedUseSelectorHook, useSelector, useDispatch } from 'react-redux';
+
+import global from './global';
+import user from './user';
+
+const reducer = combineReducers({
+ global,
+ user,
+});
+
+export const store = configureStore({
+ reducer,
+});
+
+export type RootState = ReturnType;
+export type AppDispatch = typeof store.dispatch;
+
+export const useAppDispatch = () => useDispatch();
+export const useAppSelector: TypedUseSelectorHook = useSelector;
+
+export default store;
diff --git a/apps/web/src/modules/user/index.ts b/apps/web/src/modules/user/index.ts
new file mode 100644
index 0000000..4ea82a8
--- /dev/null
+++ b/apps/web/src/modules/user/index.ts
@@ -0,0 +1,116 @@
+import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
+import request from 'utils/request';
+import { RootState } from '../store';
+
+const namespace = 'user';
+export const TOKEN_KEY = 'ep_token';
+export const REFRESH_KEY = 'ep_refresh';
+
+interface IUserInfo {
+ id?: number;
+ email?: string;
+ nickname?: string;
+ role?: string;
+ totpEnabled?: boolean;
+}
+
+const initialState = {
+ token: localStorage.getItem(TOKEN_KEY) || '',
+ refreshToken: localStorage.getItem(REFRESH_KEY) || '',
+ userInfo: {} as IUserInfo,
+ workspaceId: 0,
+ memberRole: '',
+};
+
+// login
+export const login = createAsyncThunk(`${namespace}/login`, async (payload: { email: string; password: string }) => {
+ const res = await request.post('/auth/login', payload);
+ return res.data;
+});
+
+// register
+export const register = createAsyncThunk(
+ `${namespace}/register`,
+ async (payload: { email: string; password: string; nickname: string }) => {
+ const res = await request.post('/auth/register', payload);
+ return res.data;
+ },
+);
+
+// getUserInfo
+export const getUserInfo = createAsyncThunk(`${namespace}/getUserInfo`, async () => {
+ const res = await request.get('/auth/me');
+ return res.data;
+});
+
+// logout
+export const logout = createAsyncThunk(`${namespace}/logout`, async (_, { getState }) => {
+ const state = getState() as RootState;
+ try {
+ await request.post('/auth/logout', { refreshToken: state.user.refreshToken });
+ } catch (e) {
+ // 令牌已失效也允许本地登出
+ }
+});
+
+interface ILoginResult {
+ accessToken: string;
+ refreshToken: string;
+ user: IUserInfo;
+ workspace?: { id: number; name?: string };
+}
+
+const userSlice = createSlice({
+ name: namespace,
+ initialState,
+ reducers: {
+ clear: (state) => {
+ localStorage.removeItem(TOKEN_KEY);
+ localStorage.removeItem(REFRESH_KEY);
+ state.token = '';
+ state.refreshToken = '';
+ state.userInfo = {};
+ state.workspaceId = 0;
+ state.memberRole = '';
+ },
+ },
+ extraReducers: (builder) => {
+ builder
+ .addCase(login.fulfilled, (state, action) => {
+ const data = action.payload as ILoginResult;
+ localStorage.setItem(TOKEN_KEY, data.accessToken);
+ localStorage.setItem(REFRESH_KEY, data.refreshToken);
+ state.token = data.accessToken;
+ state.refreshToken = data.refreshToken;
+ state.userInfo = data.user;
+ state.workspaceId = data.workspace?.id || 0;
+ })
+ .addCase(register.fulfilled, (state, action) => {
+ const data = action.payload as ILoginResult;
+ localStorage.setItem(TOKEN_KEY, data.accessToken);
+ localStorage.setItem(REFRESH_KEY, data.refreshToken);
+ state.token = data.accessToken;
+ state.refreshToken = data.refreshToken;
+ state.userInfo = data.user;
+ state.workspaceId = data.workspace?.id || 0;
+ })
+ .addCase(getUserInfo.fulfilled, (state, action) => {
+ const data = action.payload as { user: IUserInfo; workspaceId: number; memberRole: string };
+ state.userInfo = data.user;
+ state.workspaceId = data.workspaceId || state.workspaceId;
+ state.memberRole = data.memberRole || state.memberRole;
+ })
+ .addCase(logout.fulfilled, (state) => {
+ localStorage.removeItem(TOKEN_KEY);
+ localStorage.removeItem(REFRESH_KEY);
+ state.token = '';
+ state.refreshToken = '';
+ state.userInfo = {};
+ });
+ },
+});
+
+export const selectUser = (state: RootState) => state.user;
+export const { clear } = userSlice.actions;
+
+export default userSlice.reducer;
diff --git a/apps/web/src/pages/Account/List/index.tsx b/apps/web/src/pages/Account/List/index.tsx
new file mode 100644
index 0000000..e6512ef
--- /dev/null
+++ b/apps/web/src/pages/Account/List/index.tsx
@@ -0,0 +1,253 @@
+import React, { useCallback, useEffect, useRef, useState } from 'react';
+import { Button, Card, Dialog, Form, FormInstanceFunctions, Input, MessagePlugin, Popconfirm, Select, Space, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { onWS } from 'utils/ws';
+import { PLATFORM_LABEL, PLATFORM_OPTIONS } from 'constants/platforms';
+
+const { FormItem } = Form;
+
+interface IAccount {
+ id: number;
+ platform: string;
+ accountName: string;
+ remark: string;
+ avatarUrl: string;
+ status: string;
+ health: number;
+ agentDeviceId: number;
+ ipProfile: string;
+ lastActiveAt?: string | null;
+ lastError: string;
+}
+
+interface IDevice { id: number; name: string; status: string; revoked: boolean; }
+
+const STATUS_MAP: Record = {
+ unbound: { label: '未绑定', theme: 'default' },
+ binding: { label: '绑定中', theme: 'warning' },
+ active: { label: '已绑定', theme: 'success' },
+ suspended: { label: '已挂起', theme: 'warning' },
+ expired: { label: '已过期', theme: 'danger' },
+};
+
+export default function AccountList() {
+ const [list, setList] = useState([]);
+ const [devices, setDevices] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [createVisible, setCreateVisible] = useState(false);
+ const [bindAccount, setBindAccount] = useState(null);
+ const [bindTip, setBindTip] = useState('');
+ const formRef = useRef();
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/accounts?size=100');
+ setList((res.data.list || []) as IAccount[]);
+ } catch (e) {
+ MessagePlugin.error('账号加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, []);
+
+ const loadDevices = useCallback(async () => {
+ try {
+ const res = await request.get('/agent/devices');
+ setDevices(((res.data.list || []) as IDevice[]).filter((d) => d.status === 'online' && !d.revoked));
+ } catch (e) {
+ setDevices([]);
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ const off = onWS('challenge.status', (p) => {
+ if (p?.status === 'solved') {
+ MessagePlugin.success('账号绑定成功');
+ setBindAccount(null);
+ load();
+ }
+ });
+ return off;
+ }, [load]);
+
+ const openCreate = () => {
+ loadDevices();
+ setCreateVisible(true);
+ };
+
+ const create = async () => {
+ const value = (formRef.current?.getFieldsValue?.(true) || {}) as { platform: string; agentDeviceId: number; remark: string };
+ if (!value.platform) {
+ MessagePlugin.warning('请选择平台');
+ return;
+ }
+ try {
+ await request.post('/accounts', {
+ platform: value.platform,
+ agentDeviceId: value.agentDeviceId || 0,
+ remark: value.remark || '',
+ });
+ MessagePlugin.success('账号已添加');
+ setCreateVisible(false);
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '添加失败');
+ }
+ };
+
+ const bind = async (row: IAccount) => {
+ setBindAccount(row);
+ setBindTip('');
+ try {
+ const res = await request.post('/accounts/' + row.id + '/bind');
+ setBindTip('已发起绑定,等待客户端扫码(挑战 #' + res.data.challengeId + ')...');
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '发起绑定失败');
+ setBindAccount(null);
+ }
+ };
+
+ const remove = async (row: IAccount) => {
+ try {
+ await request.delete('/accounts/' + row.id);
+ MessagePlugin.success('已删除');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '删除失败');
+ }
+ };
+
+ const deviceName = (id: number) => devices.find((d) => d.id === id)?.name || ('设备 #' + id);
+
+ const columns = [
+ {
+ colKey: 'platform',
+ title: '平台',
+ width: 110,
+ cell: ({ row }: { row: IAccount }) => {PLATFORM_LABEL[row.platform] || row.platform} ,
+ },
+ {
+ colKey: 'remark',
+ title: '账号(备注)',
+ ellipsis: true,
+ cell: ({ row }: { row: IAccount }) => (
+
+
{row.remark || '未备注'}
+ {row.accountName &&
{row.accountName}
}
+
+ ),
+ },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 100,
+ cell: ({ row }: { row: IAccount }) => {
+ const st = STATUS_MAP[row.status] || { label: row.status, theme: 'default' };
+ return {st.label} ;
+ },
+ },
+ {
+ colKey: 'agentDeviceId',
+ title: '执行设备',
+ width: 140,
+ cell: ({ row }: { row: IAccount }) => {row.agentDeviceId ? deviceName(row.agentDeviceId) : '-'} ,
+ },
+ {
+ colKey: 'lastActiveAt',
+ title: '最后活跃',
+ width: 150,
+ cell: ({ row }: { row: IAccount }) => (
+ {row.lastActiveAt ? dayjs(row.lastActiveAt).format('MM-DD HH:mm') : '-'}
+ ),
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 140,
+ cell: ({ row }: { row: IAccount }) => (
+
+ {(row.status === 'unbound' || row.status === 'expired') && (
+ bind(row)}>
+ 绑定
+
+ )}
+ {row.status === 'unbound' && (
+ remove(row)}>
+
+ 删除
+
+
+ )}
+
+ ),
+ },
+ ];
+
+ const deviceOptions = [
+ { label: '暂不指定(稍后选择)', value: 0 },
+ ...devices.map((d) => ({ label: d.name + '(在线)', value: d.id })),
+ ];
+
+ return (
+
+
+ 添加账号
+
+
+ 刷新
+
+
+ }
+ >
+
+ 凭据只保存在客户端本机保险库,服务器零凭据;账号名称/头像由客户端绑定后自动获取。
+ setCreateVisible(false)}
+ footer={
+
+ setCreateVisible(false)}>
+ 取消
+
+
+ 确定
+
+
+ }
+ >
+
+
+ setBindAccount(null)}
+ footer={null}
+ >
+
+
📱 {bindTip || '正在发起绑定...'}
+
请在客户端设备上完成扫码/验证,完成后本窗口自动关闭。
+
setBindAccount(null)}>
+ 稍后处理(可在挑战中心继续)
+
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Admin/Agent/index.tsx b/apps/web/src/pages/Admin/Agent/index.tsx
new file mode 100644
index 0000000..30ffef0
--- /dev/null
+++ b/apps/web/src/pages/Admin/Agent/index.tsx
@@ -0,0 +1,100 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, MessagePlugin, Popconfirm, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+
+interface IAgent {
+ id: number;
+ name: string;
+ workspaceName: string;
+ os: string;
+ version: string;
+ status: string;
+ revoked: boolean;
+ lastSeenAt?: string | null;
+}
+
+export default function AdminAgent() {
+ const [list, setList] = useState([]);
+ const [total, setTotal] = useState(0);
+ const [page, setPage] = useState(1);
+ const [loading, setLoading] = useState(false);
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/admin/agents?page=' + page + '&size=20');
+ setList((res.data.list || []) as IAgent[]);
+ setTotal(res.data.total || 0);
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, [page]);
+
+ useEffect(() => {
+ load();
+ }, [load]);
+
+ const revoke = async (a: IAgent) => {
+ try {
+ await request.put('/admin/agents/' + a.id + '/revoke');
+ MessagePlugin.success('已强制吊销');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '操作失败');
+ }
+ };
+
+ const columns = [
+ { colKey: 'id', title: 'ID', width: 70 },
+ { colKey: 'name', title: '设备名', ellipsis: true },
+ { colKey: 'workspaceName', title: '所属租户', ellipsis: true },
+ { colKey: 'os', title: '系统', width: 90 },
+ { colKey: 'version', title: '版本', width: 110 },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 100,
+ cell: ({ row }: { row: IAgent }) => {
+ if (row.revoked) return 已吊销 ;
+ return row.status === 'online' ? 在线 : 离线 ;
+ },
+ },
+ {
+ colKey: 'lastSeenAt',
+ title: '最后活跃',
+ width: 160,
+ cell: ({ row }: { row: IAgent }) => (
+ {row.lastSeenAt ? dayjs(row.lastSeenAt).format('MM-DD HH:mm:ss') : '-'}
+ ),
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 110,
+ cell: ({ row }: { row: IAgent }) =>
+ row.revoked ? null : (
+ revoke(row)}>
+
+ 强制吊销
+
+
+ ),
+ },
+ ];
+
+ return (
+
+ setPage(p.current) }}
+ />
+
+ );
+}
diff --git a/apps/web/src/pages/Admin/Docs/apiData.ts b/apps/web/src/pages/Admin/Docs/apiData.ts
new file mode 100644
index 0000000..3705a4c
--- /dev/null
+++ b/apps/web/src/pages/Admin/Docs/apiData.ts
@@ -0,0 +1,425 @@
+export interface ApiParam {
+ name: string;
+ type: string;
+ required: boolean;
+ desc: string;
+}
+
+export interface ApiErrorCode {
+ code: number;
+ desc: string;
+}
+
+export interface ApiItem {
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
+ path: string;
+ summary: string;
+ auth: string;
+ status: string;
+ params?: ApiParam[];
+ curl: string;
+ errors?: ApiErrorCode[];
+ note?: string;
+}
+
+export interface ApiGroup {
+ key: string;
+ title: string;
+ desc: string;
+ apis: ApiItem[];
+}
+
+export const BASE = 'http://127.0.0.1:8090/api/v1';
+
+export const globalErrorCodes: ApiErrorCode[] = [
+ { code: 0, desc: '成功' },
+ { code: 1001, desc: '参数不合法' },
+ { code: 1002, desc: '未登录 / 令牌无效或已过期' },
+ { code: 1003, desc: '无权限(需更高角色)' },
+ { code: 1004, desc: '资源不存在' },
+ { code: 1006, desc: '需要两步验证(2FA,一期默认关闭)' },
+ { code: 2001, desc: '邮箱已注册' },
+ { code: 2002, desc: '邮箱或密码错误' },
+ { code: 2003, desc: '刷新令牌无效或已失效' },
+ { code: 2004, desc: '已是该工作空间成员' },
+ { code: 2005, desc: '邀请链接无效或已过期' },
+ { code: 2006, desc: '配对码无效或已过期' },
+ { code: 3001, desc: '绑定中/已绑定账号不可删除' },
+ { code: 3002, desc: '账号已绑定' },
+ { code: 3003, desc: '挑战已结束(不可重发/挂起)' },
+ { code: 3004, desc: '下载链接已过期' },
+ { code: 3005, desc: '任务当前状态不允许该操作' },
+ { code: 5000, desc: '服务内部错误' },
+];
+
+export const apiGroups: ApiGroup[] = [
+ {
+ key: 'auth',
+ title: '认证 /auth',
+ desc: '注册、登录、令牌刷新、登出、当前用户(JWT 体系,access 15min + refresh 7d 轮换)',
+ apis: [
+ {
+ method: 'POST',
+ path: '/auth/register',
+ summary: '注册新账号,自动创建默认工作空间(创建者为 owner)',
+ auth: '无',
+ status: '200 成功 / 400 参数错误 / 409 邮箱已注册(2001)',
+ params: [
+ { name: 'email', type: 'string', required: true, desc: '登录邮箱(唯一)' },
+ { name: 'password', type: 'string', required: true, desc: '密码,至少 8 位' },
+ { name: 'nickname', type: 'string', required: false, desc: '昵称,缺省取邮箱前缀' },
+ ],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/auth/register -H 'Content-Type: application/json' -d '{"email":"demo@everypublish.io","password":"demo-pass-2026","nickname":"演示用户"}'`,
+ },
+ {
+ method: 'POST',
+ path: '/auth/login',
+ summary: '登录,返回 accessToken + refreshToken + 用户信息',
+ auth: '无',
+ status: '200 成功 / 400 参数错误 / 401 邮箱或密码错误(2002) / 403 需2FA(1006)',
+ params: [
+ { name: 'email', type: 'string', required: true, desc: '邮箱' },
+ { name: 'password', type: 'string', required: true, desc: '密码' },
+ { name: 'totpCode', type: 'string', required: false, desc: '2FA 验证码(默认关,开启后必填)' },
+ ],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/auth/login -H 'Content-Type: application/json' -d '{"email":"demo@everypublish.io","password":"demo-pass-2026"}'`,
+ },
+ {
+ method: 'POST',
+ path: '/auth/refresh',
+ summary: '刷新令牌轮换:旧 refresh 立即吊销,签发新令牌对',
+ auth: '无(凭 refreshToken)',
+ status: '200 成功 / 400 参数错误 / 401 令牌无效或已失效(2003)',
+ params: [{ name: 'refreshToken', type: 'string', required: true, desc: '登录/刷新返回的 refreshToken' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/auth/refresh -H 'Content-Type: application/json' -d '{"refreshToken":""}'`,
+ },
+ {
+ method: 'POST',
+ path: '/auth/logout',
+ summary: '登出,吊销 refresh 令牌',
+ auth: 'Bearer',
+ status: '200 成功 / 401 未认证(1002)',
+ params: [{ name: 'refreshToken', type: 'string', required: false, desc: '要吊销的 refreshToken' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/auth/logout -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"refreshToken":""}'`,
+ },
+ {
+ method: 'GET',
+ path: '/auth/me',
+ summary: '当前用户信息 + 工作空间 + 角色',
+ auth: 'Bearer',
+ status: '200 成功 / 401 未认证(1002)',
+ curl: `curl http://127.0.0.1:8090/api/v1/auth/me -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'workspace',
+ title: '工作空间 /workspaces',
+ desc: '多租户工作空间(创建者 owner)',
+ apis: [
+ {
+ method: 'POST', path: '/workspaces', summary: '创建工作空间', auth: 'Bearer', status: '200 / 400 / 401',
+ params: [{ name: 'name', type: 'string', required: true, desc: '工作空间名称' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/workspaces -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"name":"品牌工作空间"}'`,
+ },
+ {
+ method: 'GET', path: '/workspaces', summary: '我所在的工作空间列表', auth: 'Bearer', status: '200 / 401',
+ curl: `curl http://127.0.0.1:8090/api/v1/workspaces -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'PUT', path: '/workspaces/:id', summary: '修改工作空间名称(owner/admin)', auth: 'Bearer', status: '200 / 400 / 401 / 403(1003)',
+ params: [{ name: 'name', type: 'string', required: true, desc: '新名称' }],
+ curl: `curl -X PUT http://127.0.0.1:8090/api/v1/workspaces/1 -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"name":"新名称"}'`,
+ },
+ ],
+ },
+ {
+ key: 'member',
+ title: '成员 /members',
+ desc: '邀请、加入、角色、移除(owner/admin 管理)',
+ apis: [
+ {
+ method: 'GET', path: '/members', summary: '成员列表(含邮箱/昵称)', auth: 'Bearer', status: '200 / 401',
+ curl: `curl http://127.0.0.1:8090/api/v1/members -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/members/invite', summary: '生成邀请链接(24h,一次性)', auth: 'Bearer(owner/admin)', status: '200 / 400 / 401 / 403 / 409(2004)',
+ params: [
+ { name: 'email', type: 'string', required: true, desc: '被邀请人登录邮箱' },
+ { name: 'role', type: 'string', required: true, desc: 'admin/operator/reviewer/viewer' },
+ ],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/members/invite -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"email":"member@ep.io","role":"operator"}'`,
+ },
+ {
+ method: 'POST', path: '/members/join', summary: '接受邀请(须登录,邮箱须与邀请一致)', auth: 'Bearer', status: '200 / 400 / 401 / 403 / 409(2004) / 400(2005)',
+ params: [{ name: 'token', type: 'string', required: true, desc: '邀请链接中的 token' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/members/join -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"token":""}'`,
+ },
+ {
+ method: 'PUT', path: '/members/:id/role', summary: '修改成员角色(不可改 owner)', auth: 'Bearer(owner/admin)', status: '200 / 400 / 401 / 403 / 404',
+ params: [{ name: 'role', type: 'string', required: true, desc: 'admin/operator/reviewer/viewer' }],
+ curl: `curl -X PUT http://127.0.0.1:8090/api/v1/members/2/role -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"role":"reviewer"}'`,
+ },
+ {
+ method: 'DELETE', path: '/members/:id', summary: '移除成员(不可移除 owner)', auth: 'Bearer(owner/admin)', status: '200 / 401 / 403 / 404',
+ curl: `curl -X DELETE http://127.0.0.1:8090/api/v1/members/2 -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'account',
+ title: '账号台账 /accounts',
+ desc: '平台账号登记与绑定(凭据仅在客户端本机,服务器零凭据)',
+ apis: [
+ {
+ method: 'GET', path: '/accounts', summary: '账号列表(platform/status 筛选 + 分页)', auth: 'Bearer', status: '200 / 401',
+ params: [{ name: 'platform', type: 'string', required: false, desc: 'douyin/kuaishou/xiaohongshu/bilibili' }, { name: 'status', type: 'string', required: false, desc: 'unbound/binding/active/suspended/expired' }],
+ curl: `curl 'http://127.0.0.1:8090/api/v1/accounts?platform=douyin&status=active' -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/accounts', summary: '新增账号(初始 unbound)', auth: 'Bearer', status: '200 / 400 / 401',
+ params: [
+ { name: 'platform', type: 'string', required: true, desc: 'douyin/kuaishou/xiaohongshu/bilibili' },
+ { name: 'accountName', type: 'string', required: true, desc: '账号名称' },
+ { name: 'avatarUrl', type: 'string', required: false, desc: '头像 URL' },
+ { name: 'ipProfile', type: 'string', required: false, desc: 'IP 画像标识(一账号固定 IP)' },
+ ],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/accounts -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"platform":"douyin","accountName":"品牌官方号"}'`,
+ },
+ {
+ method: 'PUT', path: '/accounts/:id', summary: '修改账号资料', auth: 'Bearer', status: '200 / 400 / 401',
+ params: [{ name: 'accountName', type: 'string', required: true, desc: '账号名称' }],
+ curl: `curl -X PUT http://127.0.0.1:8090/api/v1/accounts/1 -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"accountName":"新名称"}'`,
+ },
+ {
+ method: 'DELETE', path: '/accounts/:id', summary: '删除账号(仅未绑定)', auth: 'Bearer', status: '200 / 401 / 404 / 409(3001)',
+ curl: `curl -X DELETE http://127.0.0.1:8090/api/v1/accounts/1 -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/accounts/:id/bind', summary: '发起绑定 → 创建挑战 → 推送给在线设备扫码', auth: 'Bearer', status: '200 / 400 / 401 / 404 / 409(3002)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/accounts/1/bind -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'material',
+ title: '素材 /materials',
+ desc: '素材上传(sha256 去重)与签名直链(10 分钟一次性)',
+ apis: [
+ {
+ method: 'GET', path: '/materials', summary: '素材列表(kind/group 筛选 + 分页)', auth: 'Bearer', status: '200 / 401',
+ curl: `curl 'http://127.0.0.1:8090/api/v1/materials?kind=video' -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/materials', summary: '上传素材(multipart,流式 sha256,同工作区去重)', auth: 'Bearer', status: '200 / 400(1001) / 401 / 500',
+ params: [{ name: 'file', type: 'file', required: true, desc: '视频/图片文件(multipart 字段名 file)' }, { name: 'group', type: 'string', required: false, desc: '分组' }, { name: 'tags', type: 'string', required: false, desc: '标签 JSON 数组' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/materials -H 'Authorization: Bearer ' -F 'file=@/path/video.mp4' -F 'group=新品'`,
+ },
+ {
+ method: 'GET', path: '/materials/:id/url', summary: '生成签名直链(10 分钟、一次性)', auth: 'Bearer', status: '200 / 401 / 404',
+ curl: `curl http://127.0.0.1:8090/api/v1/materials/1/url -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'GET', path: '/files/:token', summary: '凭 token 下载文件(token 即凭证,一次性)', auth: '一次性 token', status: '200 / 404(1004) / 410(3004)',
+ curl: `curl -o out.mp4 'http://127.0.0.1:8090/api/v1/files/'`,
+ },
+ {
+ method: 'DELETE', path: '/materials/:id', summary: '删除素材及文件', auth: 'Bearer', status: '200 / 401 / 404',
+ curl: `curl -X DELETE http://127.0.0.1:8090/api/v1/materials/1 -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'task',
+ title: '任务 /tasks',
+ desc: '发布任务(状态机:draft→pending_review→queued→dispatched→running→success/failed)',
+ apis: [
+ {
+ method: 'GET', path: '/tasks', summary: '任务列表(status/schedule 筛选 + 分页)', auth: 'Bearer', status: '200 / 401',
+ curl: `curl 'http://127.0.0.1:8090/api/v1/tasks?status=success' -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/tasks', summary: '新建草稿', auth: 'Bearer', status: '200 / 400 / 401',
+ params: [
+ { name: 'title', type: 'string', required: true, desc: '标题' },
+ { name: 'content', type: 'string', required: false, desc: '正文' },
+ { name: 'tags', type: 'string[]', required: false, desc: '话题标签' },
+ { name: 'accountIds', type: 'number[]', required: true, desc: '账号 ID 数组(至少 1 个)' },
+ { name: 'materialIds', type: 'number[]', required: true, desc: '素材 ID 数组(至少 1 个)' },
+ { name: 'scheduleAt', type: 'number', required: false, desc: '定时发布时间 unix 毫秒' },
+ { name: 'priority', type: 'number', required: false, desc: '优先级 1-10(默认 5)' },
+ ],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/tasks -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"title":"新品发布","accountIds":[1],"materialIds":[1]}'`,
+ },
+ {
+ method: 'GET', path: '/tasks/:id', summary: '任务详情', auth: 'Bearer', status: '200 / 401 / 404',
+ curl: `curl http://127.0.0.1:8090/api/v1/tasks/1 -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'PUT', path: '/tasks/:id', summary: '编辑草稿(仅 draft/rejected)', auth: 'Bearer', status: '200 / 400 / 401 / 404 / 409(3005)',
+ curl: `curl -X PUT http://127.0.0.1:8090/api/v1/tasks/1 -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"title":"新标题","accountIds":[1],"materialIds":[1]}'`,
+ },
+ {
+ method: 'DELETE', path: '/tasks/:id', summary: '删除草稿(仅 draft)', auth: 'Bearer', status: '200 / 401 / 404 / 409(3005)',
+ curl: `curl -X DELETE http://127.0.0.1:8090/api/v1/tasks/1 -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/tasks/:id/submit', summary: '提交审核(draft→pending_review)', auth: 'Bearer', status: '200 / 401 / 404 / 409(3005)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/tasks/1/submit -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/tasks/:id/approve', summary: '审核通过(→queued,在线设备立即下发)', auth: 'Bearer', status: '200 / 401 / 404 / 409(3005)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/tasks/1/approve -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/tasks/:id/reject', summary: '驳回(→rejected,附批注并通知创建人)', auth: 'Bearer', status: '200 / 400 / 401 / 404 / 409(3005)',
+ params: [{ name: 'note', type: 'string', required: false, desc: '驳回批注' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/tasks/1/reject -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"note":"标题需修改"}'`,
+ },
+ {
+ method: 'POST', path: '/tasks/:id/resubmit', summary: '驳回后重新提交(→pending_review)', auth: 'Bearer', status: '200 / 401 / 404 / 409(3005)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/tasks/1/resubmit -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/tasks/:id/retry', summary: '失败重试(→queued,立即下发)', auth: 'Bearer', status: '200 / 401 / 404 / 409(3005)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/tasks/1/retry -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/tasks/:id/cancel', summary: '取消任务', auth: 'Bearer', status: '200 / 401 / 404 / 409(3005)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/tasks/1/cancel -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'challenge',
+ title: '挑战 /challenges',
+ desc: '二次验证兜底(扫码/短信/APP确认/图形验证码;超时挂起,一键重发)',
+ apis: [
+ {
+ method: 'GET', path: '/challenges', summary: '挑战列表(过期自动置 expired)', auth: 'Bearer', status: '200 / 401',
+ curl: `curl 'http://127.0.0.1:8090/api/v1/challenges?status=active' -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/challenges/:id/solve', summary: '人工完成挑战(验证码/APP确认)', auth: 'Bearer', status: '200 / 400 / 401 / 404 / 409(3003)',
+ params: [{ name: 'value', type: 'string', required: false, desc: '验证码或确认值' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/challenges/1/solve -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"value":"123456"}'`,
+ },
+ {
+ method: 'POST', path: '/challenges/:id/resend', summary: '一键重发(expired/suspended→active)', auth: 'Bearer', status: '200 / 401 / 404 / 409(3003)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/challenges/1/resend -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/challenges/:id/suspend', summary: '挂起', auth: 'Bearer', status: '200 / 401 / 404 / 409(3003)',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/challenges/1/suspend -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'notification',
+ title: '通知 /notifications',
+ desc: '站内通知(任务审核/挑战/系统事件)',
+ apis: [
+ {
+ method: 'GET', path: '/notifications', summary: '我的通知 + 未读计数', auth: 'Bearer', status: '200 / 401',
+ curl: `curl http://127.0.0.1:8090/api/v1/notifications -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/notifications/:id/read', summary: '标记已读', auth: 'Bearer', status: '200 / 401',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/notifications/1/read -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/notifications/read-all', summary: '全部已读', auth: 'Bearer', status: '200 / 401',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/notifications/read-all -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'audit',
+ title: '审计 /audit-logs',
+ desc: '操作审计(登录/登出/增删改/审核/挑战/设备,自动埋点)',
+ apis: [
+ {
+ method: 'GET', path: '/audit-logs', summary: '审计日志(userId/action 筛选 + 分页)', auth: 'Bearer', status: '200 / 401',
+ curl: `curl 'http://127.0.0.1:8090/api/v1/audit-logs?action=auth.login&size=20' -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'agent',
+ title: '设备 /agent',
+ desc: '客户端设备配对与吊销(Ed25519 公钥注册)',
+ apis: [
+ {
+ method: 'POST', path: '/agent/pair-code', summary: '生成配对码(6 位,5 分钟一次性)', auth: 'Bearer', status: '200 / 401',
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/agent/pair-code -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'POST', path: '/agent/pair', summary: '设备配对(凭码注册公钥)', auth: '无(凭配对码)', status: '200 / 400 / 410(2006)',
+ params: [{ name: 'code', type: 'string', required: true, desc: '配对码' }, { name: 'deviceName', type: 'string', required: true, desc: '设备名' }, { name: 'publicKey', type: 'string', required: true, desc: 'Ed25519 公钥 base64' }],
+ curl: `curl -X POST http://127.0.0.1:8090/api/v1/agent/pair -H 'Content-Type: application/json' -d '{"code":"AB12CD","deviceName":"PC-01","publicKey":""}'`,
+ },
+ {
+ method: 'GET', path: '/agent/devices', summary: '设备列表(在线状态)', auth: 'Bearer', status: '200 / 401',
+ curl: `curl http://127.0.0.1:8090/api/v1/agent/devices -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'PUT', path: '/agent/devices/:id/revoke', summary: '吊销设备并强制下线', auth: 'Bearer(owner/admin)', status: '200 / 401 / 403 / 404',
+ curl: `curl -X PUT http://127.0.0.1:8090/api/v1/agent/devices/1/revoke -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'admin',
+ title: '平台管理 /admin',
+ desc: '仅平台管理员(role=admin)可用',
+ apis: [
+ {
+ method: 'GET', path: '/admin/tenants', summary: '租户列表(owner 邮箱/成员数/设备数)', auth: 'Bearer(admin)', status: '200 / 401 / 403(1003)',
+ curl: `curl 'http://127.0.0.1:8090/api/v1/admin/tenants' -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'PUT', path: '/admin/tenants/:id/status', summary: '启用/停用租户', auth: 'Bearer(admin)', status: '200 / 400 / 401 / 403 / 404',
+ params: [{ name: 'status', type: 'string', required: true, desc: 'active/suspended' }],
+ curl: `curl -X PUT http://127.0.0.1:8090/api/v1/admin/tenants/1/status -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -d '{"status":"suspended"}'`,
+ },
+ {
+ method: 'GET', path: '/admin/agents', summary: '全局 Agent 总览(含所属租户)', auth: 'Bearer(admin)', status: '200 / 401 / 403',
+ curl: `curl http://127.0.0.1:8090/api/v1/admin/agents -H 'Authorization: Bearer '`,
+ },
+ {
+ method: 'PUT', path: '/admin/agents/:id/revoke', summary: '全局强制吊销设备', auth: 'Bearer(admin)', status: '200 / 401 / 403 / 404',
+ curl: `curl -X PUT http://127.0.0.1:8090/api/v1/admin/agents/1/revoke -H 'Authorization: Bearer '`,
+ },
+ ],
+ },
+ {
+ key: 'health',
+ title: '健康 /health',
+ desc: '服务健康检查(db/redis 状态)',
+ apis: [
+ {
+ method: 'GET', path: '/health', summary: '服务健康(db/redis)', auth: '无', status: '200',
+ curl: `curl http://127.0.0.1:8090/health`,
+ },
+ ],
+ },
+ {
+ key: 'ws',
+ title: 'WSS 双通道 /ws',
+ desc: '实时通道:Agent 设备签名 / 浏览器 JWT(WebSocket)',
+ apis: [
+ {
+ method: 'GET', path: '/ws/agent', summary: 'Agent 通道(Ed25519 hello 验签;消息 hello/heartbeat/task.push/task.ack/task.result/challenge)', auth: 'Ed25519 设备签名', status: '101 升级 / 4408 拒绝',
+ curl: `# 需客户端代码连接(fake-agent / client-core);首条消息 hello:{deviceId,nonce,ts,sig=ed25519(nonce|ts)}`,
+ note: '任务下发延迟实测约 28ms(硬指标 <300ms)',
+ },
+ {
+ method: 'GET', path: '/ws/browser', summary: '浏览器通道(?token=JWT,只读订阅 task.status/agent.status/challenge.status)', auth: 'JWT(query token)', status: '101 升级 / 401',
+ curl: `# 前端 utils/ws.ts 自动连接;地址 ws://127.0.0.1:3003/ws/browser?token=`,
+ },
+ ],
+ },
+];
+
+export default apiGroups;
+
diff --git a/apps/web/src/pages/Admin/Docs/index.tsx b/apps/web/src/pages/Admin/Docs/index.tsx
new file mode 100644
index 0000000..f3dc0ad
--- /dev/null
+++ b/apps/web/src/pages/Admin/Docs/index.tsx
@@ -0,0 +1,268 @@
+import React, { useState } from 'react';
+import { Button, Card, Input, Menu, MessagePlugin, Table, Tag, Textarea } from 'tdesign-react';
+import { apiGroups, globalErrorCodes, ApiItem } from './apiData';
+
+const { MenuItem, SubMenu } = Menu;
+
+const METHOD_THEME: Record = {
+ GET: 'success',
+ POST: 'primary',
+ PUT: 'warning',
+ DELETE: 'danger',
+};
+
+const paramColumns = [
+ { colKey: 'name', title: '参数', width: 140, ellipsis: true },
+ { colKey: 'type', title: '类型', width: 100 },
+ {
+ colKey: 'required',
+ title: '必填',
+ width: 70,
+ cell: ({ row }: { row: any }) => (
+ {row.required ? '是' : '否'}
+ ),
+ },
+ { colKey: 'desc', title: '说明', ellipsis: true },
+];
+
+const errorColumns = [
+ { colKey: 'code', title: '错误码', width: 100 },
+ { colKey: 'desc', title: '含义' },
+];
+
+function endpointKey(gkey: string, api: ApiItem): string {
+ return gkey + '::' + api.method + ' ' + api.path;
+}
+
+function pathParams(path: string): string[] {
+ return (path.match(/:[a-zA-Z]+/g) || []).map((p) => p.slice(1));
+}
+
+function extractBody(curl: string): string {
+ const m = curl.match(/-d\s+'([^']*)'/);
+ if (m) {
+ try {
+ return JSON.stringify(JSON.parse(m[1]), null, 2);
+ } catch (e) {
+ return m[1];
+ }
+ }
+ return '{\n}';
+}
+
+function EndpointTest({ api, resetKey }: { api: ApiItem; resetKey: string }) {
+ const [pathVals, setPathVals] = useState>({});
+ const [query, setQuery] = useState('');
+ const [body, setBody] = useState(extractBody(api.curl));
+ const [token, setToken] = useState(() => (api.auth === '无' || api.auth === '一次性 token' ? '' : localStorage.getItem('ep_token') || ''));
+ const [result, setResult] = useState<{ status: number; body: string; time: number } | null>(null);
+ const [loading, setLoading] = useState(false);
+ const isWS = api.path.startsWith('/ws');
+ const isMultipart = api.curl.includes('-F ');
+ const params = pathParams(api.path);
+
+ const run = async () => {
+ if (isWS) return;
+ setLoading(true);
+ let url = api.path;
+ params.forEach((p) => {
+ url = url.replace(':' + p, pathVals[p] || '');
+ });
+ if (query.trim()) {
+ url += (url.includes('?') ? '&' : '?') + query.trim();
+ }
+ const full = (api.path === '/health' ? '' : '/api/v1') + url;
+ const headers: Record = {};
+ if (token.trim()) headers.Authorization = 'Bearer ' + token.trim();
+ let options: RequestInit = { method: api.method, headers };
+ if ((api.method === 'POST' || api.method === 'PUT') && !isMultipart) {
+ headers['Content-Type'] = 'application/json';
+ options.body = body;
+ }
+ const t0 = performance.now();
+ try {
+ const res = await fetch(full, options);
+ const text = await res.text();
+ let pretty = text;
+ try {
+ pretty = JSON.stringify(JSON.parse(text), null, 2);
+ } catch (e) {
+ // 非 JSON 保持原文
+ }
+ setResult({ status: res.status, body: pretty, time: Math.round(performance.now() - t0) });
+ } catch (e: any) {
+ setResult({ status: 0, body: '请求失败:' + (e?.message || e), time: 0 });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+ 在线测试
+ {isWS && (WebSocket 通道,无法用 HTTP 测试) }
+ {isMultipart && (multipart 上传,建议到素材库页测试) }
+
+
+ {params.length > 0 && (
+
+
路径参数
+
+ {params.map((p) => (
+ setPathVals((s) => ({ ...s, [p]: v as string }))}
+ style={{ width: 160 }}
+ />
+ ))}
+
+
+ )}
+
+ setQuery(v as string)}
+ style={{ width: 260 }}
+ />
+ setToken(v as string)}
+ style={{ width: 260 }}
+ />
+
+ {(api.method === 'POST' || api.method === 'PUT') && !isMultipart && (
+
+ )}
+
+ 发送测试请求
+
+ {result && (
+
+
+ 响应状态:
+ = 200 && result.status < 300 ? 'success' : 'danger'}>{result.status || '网络错误'}
+ 耗时 {result.time}ms
+
+
+ {result.body}
+
+
+ )}
+
+
+ );
+}
+
+export default function AdminDocs() {
+ const [selected, setSelected] = useState(() => endpointKey(apiGroups[0].key, apiGroups[0].apis[0]));
+
+ let selGroup = apiGroups[0];
+ let selApi: ApiItem = apiGroups[0].apis[0];
+ for (const g of apiGroups) {
+ for (const a of g.apis) {
+ if (endpointKey(g.key, a) === selected) {
+ selGroup = g;
+ selApi = a;
+ }
+ }
+ }
+
+ const copy = async (text: string) => {
+ try {
+ await navigator.clipboard.writeText(text);
+ MessagePlugin.success('已复制');
+ } catch (e) {
+ MessagePlugin.error('复制失败');
+ }
+ };
+
+ return (
+
+
+
setSelected(v as string)} style={{ width: 240, flexShrink: 0 }} theme='light'>
+ {apiGroups.map((g) => (
+
+ {g.apis.map((a) => (
+
+ {a.method} {a.path}
+
+ ))}
+
+ ))}
+
+
+
{selGroup.desc}
+
+
+
+ {selApi.method}
+ {selApi.path}
+ {selApi.summary}
+
+
+
+
+
访问方式(鉴权) :{selApi.auth}
+
访问状态 :{selApi.status}
+
+ {selApi.params && selApi.params.length > 0 && (
+
+ )}
+
+
+ 请求示例(CURL)
+ copy(selApi.curl)}>
+ 复制
+
+
+
+ {selApi.curl}
+
+
+ {selApi.note && (
+
注:{selApi.note}
+ )}
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Admin/Tenant/index.tsx b/apps/web/src/pages/Admin/Tenant/index.tsx
new file mode 100644
index 0000000..5e8a391
--- /dev/null
+++ b/apps/web/src/pages/Admin/Tenant/index.tsx
@@ -0,0 +1,100 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, MessagePlugin, Popconfirm, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+
+interface ITenant {
+ id: number;
+ name: string;
+ ownerEmail: string;
+ plan: string;
+ status: string;
+ memberCount: number;
+ deviceCount: number;
+ createdAt: string;
+}
+
+export default function AdminTenant() {
+ const [list, setList] = useState([]);
+ const [total, setTotal] = useState(0);
+ const [page, setPage] = useState(1);
+ const [loading, setLoading] = useState(false);
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/admin/tenants?page=' + page + '&size=20');
+ setList((res.data.list || []) as ITenant[]);
+ setTotal(res.data.total || 0);
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, [page]);
+
+ useEffect(() => {
+ load();
+ }, [load]);
+
+ const setStatus = async (t: ITenant, status: string) => {
+ try {
+ await request.put('/admin/tenants/' + t.id + '/status', { status });
+ MessagePlugin.success('已更新');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '操作失败');
+ }
+ };
+
+ const columns = [
+ { colKey: 'id', title: 'ID', width: 70 },
+ { colKey: 'name', title: '租户', ellipsis: true },
+ { colKey: 'ownerEmail', title: 'Owner 邮箱', ellipsis: true },
+ { colKey: 'plan', title: '套餐', width: 90 },
+ { colKey: 'memberCount', title: '成员', width: 80 },
+ { colKey: 'deviceCount', title: '设备', width: 80 },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 100,
+ cell: ({ row }: { row: ITenant }) => (
+ {row.status === 'active' ? '正常' : '已停用'}
+ ),
+ },
+ {
+ colKey: 'createdAt',
+ title: '创建时间',
+ width: 160,
+ cell: ({ row }: { row: ITenant }) => {dayjs(row.createdAt).format('YYYY-MM-DD')} ,
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 110,
+ cell: ({ row }: { row: ITenant }) => (
+ setStatus(row, row.status === 'active' ? 'suspended' : 'active')}
+ >
+
+ {row.status === 'active' ? '停用' : '启用'}
+
+
+ ),
+ },
+ ];
+
+ return (
+
+ setPage(p.current) }}
+ />
+
+ );
+}
diff --git a/apps/web/src/pages/Audit/List/index.tsx b/apps/web/src/pages/Audit/List/index.tsx
new file mode 100644
index 0000000..96ca7bb
--- /dev/null
+++ b/apps/web/src/pages/Audit/List/index.tsx
@@ -0,0 +1,97 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, MessagePlugin, Select, Table } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+
+interface IAudit {
+ id: number;
+ userId: number;
+ action: string;
+ resource: string;
+ detail: string;
+ ip: string;
+ createdAt: string;
+}
+
+export default function AuditList() {
+ const [list, setList] = useState([]);
+ const [total, setTotal] = useState(0);
+ const [page, setPage] = useState(1);
+ const [action, setAction] = useState('');
+ const [loading, setLoading] = useState(false);
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/audit-logs?page=' + page + '&size=20' + (action ? '&action=' + action : ''));
+ setList((res.data.list || []) as IAudit[]);
+ setTotal(res.data.total || 0);
+ } catch (e) {
+ MessagePlugin.error('加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, [page, action]);
+
+ useEffect(() => {
+ load();
+ }, [load]);
+
+ const columns = [
+ { colKey: 'id', title: 'ID', width: 70 },
+ { colKey: 'userId', title: '用户', width: 80 },
+ { colKey: 'action', title: '动作', width: 160 },
+ { colKey: 'resource', title: '对象', width: 160 },
+ { colKey: 'detail', title: '详情', ellipsis: true },
+ { colKey: 'ip', title: 'IP', width: 130 },
+ {
+ colKey: 'createdAt',
+ title: '时间',
+ width: 160,
+ cell: ({ row }: { row: IAudit }) => {dayjs(row.createdAt).format('MM-DD HH:mm:ss')} ,
+ },
+ ];
+
+ return (
+
+
+ {
+ setAction(v as string);
+ setPage(1);
+ }}
+ options={[
+ { label: '全部动作', value: '' },
+ { label: '登录', value: 'auth.login' },
+ { label: '登出', value: 'auth.logout' },
+ { label: '任务', value: 'task.create' },
+ { label: '审核', value: 'task.approve' },
+ { label: '驳回', value: 'task.reject' },
+ { label: '账号绑定', value: 'account.bind' },
+ { label: '素材', value: 'material.upload' },
+ { label: '成员', value: 'member.invite' },
+ { label: '设备', value: 'agent.revoke' },
+ ]}
+ style={{ width: 160 }}
+ />
+
+ 刷新
+
+
+ setPage(p.current),
+ }}
+ />
+
+ );
+}
diff --git a/apps/web/src/pages/Challenge/List/index.tsx b/apps/web/src/pages/Challenge/List/index.tsx
new file mode 100644
index 0000000..7fbd176
--- /dev/null
+++ b/apps/web/src/pages/Challenge/List/index.tsx
@@ -0,0 +1,156 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, Dialog, Input, MessagePlugin, Popconfirm, QRCode, Space, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { onWS } from 'utils/ws';
+
+interface IChallenge {
+ id: number;
+ accountId: number;
+ platform: string;
+ kind: string;
+ status: string;
+ qrToken: string;
+ qrUrl: string;
+ prompt: string;
+ expiresAt: string;
+ createdAt: string;
+}
+
+const KIND_LABEL: Record = { qr: '扫码', sms: '短信验证码', confirm: 'APP 确认', captcha: '图形验证码', pending: '等待设备' };
+const STATUS_MAP: Record = {
+ active: { label: '待处理', theme: 'warning' },
+ solved: { label: '已完成', theme: 'success' },
+ expired: { label: '已过期', theme: 'default' },
+ suspended: { label: '已挂起', theme: 'danger' },
+};
+
+export default function ChallengeList() {
+ const [list, setList] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [qrTarget, setQrTarget] = useState(null);
+ const [solveTarget, setSolveTarget] = useState(null);
+ const [solveValue, setSolveValue] = useState('');
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/challenges');
+ setList((res.data.list || []) as IChallenge[]);
+ } catch (e) {
+ MessagePlugin.error('加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ const off = onWS('challenge.status', () => load());
+ return off;
+ }, [load]);
+
+ const act = async (ch: IChallenge, action: string, body?: any) => {
+ try {
+ await request.post('/challenges/' + ch.id + '/' + action, body || {});
+ MessagePlugin.success('操作成功');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '操作失败');
+ }
+ };
+
+ const columns = [
+ { colKey: 'id', title: 'ID', width: 70 },
+ { colKey: 'platform', title: '平台', width: 90 },
+ {
+ colKey: 'kind',
+ title: '类型',
+ width: 110,
+ cell: ({ row }: { row: IChallenge }) => {KIND_LABEL[row.kind] || row.kind} ,
+ },
+ { colKey: 'prompt', title: '提示', ellipsis: true },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 100,
+ cell: ({ row }: { row: IChallenge }) => {
+ const st = STATUS_MAP[row.status] || { label: row.status, theme: 'default' };
+ return {st.label} ;
+ },
+ },
+ {
+ colKey: 'expiresAt',
+ title: '过期时间',
+ width: 150,
+ cell: ({ row }: { row: IChallenge }) => {dayjs(row.expiresAt).format('MM-DD HH:mm')} ,
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 240,
+ cell: ({ row }: { row: IChallenge }) => (
+
+ {row.kind === 'qr' && row.status === 'active' && (
+ setQrTarget(row)}>
+ 显示二维码
+
+ )}
+ {(row.kind === 'sms' || row.kind === 'captcha') && row.status === 'active' && (
+ setSolveTarget(row)}>
+ 输入验证码
+
+ )}
+ {(row.status === 'expired' || row.status === 'suspended') && (
+ act(row, 'resend')}>
+ 一键重发
+
+ )}
+ {row.status === 'active' && (
+ act(row, 'suspend')}>
+
+ 挂起
+
+
+ )}
+
+ ),
+ },
+ ];
+
+ return (
+
+
+ setQrTarget(null)}
+ footer={null}
+ >
+
+
+ setSolveTarget(null)}
+ confirmBtn={
+ {
+ if (solveTarget) act(solveTarget, 'solve', { value: solveValue });
+ setSolveTarget(null);
+ setSolveValue('');
+ }}
+ >
+ 提交
+
+ }
+ >
+ setSolveValue(v as string)} placeholder='输入收到的验证码' />
+
+
+ );
+}
diff --git a/apps/web/src/pages/Dashboard/Base/index.tsx b/apps/web/src/pages/Dashboard/Base/index.tsx
new file mode 100644
index 0000000..6a9edcc
--- /dev/null
+++ b/apps/web/src/pages/Dashboard/Base/index.tsx
@@ -0,0 +1,150 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Card, Col, Row, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { onWS } from 'utils/ws';
+
+const STATUS_MAP: Record = {
+ draft: { label: '草稿', theme: 'default' },
+ pending_review: { label: '待审核', theme: 'warning' },
+ rejected: { label: '已驳回', theme: 'danger' },
+ queued: { label: '排队中', theme: 'warning' },
+ dispatched: { label: '已下发', theme: 'primary' },
+ running: { label: '执行中', theme: 'primary' },
+ success: { label: '发布成功', theme: 'success' },
+ failed: { label: '失败', theme: 'danger' },
+ suspended: { label: '已挂起', theme: 'warning' },
+ cancelled: { label: '已取消', theme: 'default' },
+};
+
+interface ITask { id: number; title: string; status: string; scheduleAt?: string | null; createdAt: string; publishedAt?: string | null; }
+interface IDevice { id: number; name: string; status: string; version: string; revoked: boolean; lastSeenAt?: string | null; }
+interface IChallenge { id: number; status: string; }
+
+function StatCard({ label, value, hint }: { label: string; value: string; hint?: string }) {
+ return (
+
+ {label}
+ {value}
+ {hint && {hint}
}
+
+ );
+}
+
+export default function DashboardBase() {
+ const [devices, setDevices] = useState([]);
+ const [tasks, setTasks] = useState([]);
+ const [challenges, setChallenges] = useState([]);
+
+ const load = useCallback(async () => {
+ try {
+ const d = await request.get('/agent/devices');
+ setDevices((d.data.list || []) as IDevice[]);
+ } catch (e) {
+ setDevices([]);
+ }
+ try {
+ const t = await request.get('/tasks?size=100');
+ setTasks((t.data.list || []) as ITask[]);
+ } catch (e) {
+ setTasks([]);
+ }
+ try {
+ const c = await request.get('/challenges');
+ setChallenges((c.data.list || []) as IChallenge[]);
+ } catch (e) {
+ setChallenges([]);
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ const offTask = onWS('task.status', () => load());
+ const offAgent = onWS('agent.status', () => load());
+ const offChallenge = onWS('challenge.status', () => load());
+ return () => {
+ offTask();
+ offAgent();
+ offChallenge();
+ };
+ }, [load]);
+
+ const onlineDevices = devices.filter((d) => d.status === 'online' && !d.revoked).length;
+ const activeChallenges = challenges.filter((c) => c.status === 'active').length;
+ const pendingReview = tasks.filter((t) => t.status === 'pending_review').length;
+ const todaySuccess = tasks.filter((t) => t.status === 'success' && t.publishedAt && dayjs(t.publishedAt).isSame(dayjs(), 'day')).length;
+ const recentTasks = tasks.slice(0, 8);
+
+ const taskColumns = [
+ { colKey: 'id', title: 'ID', width: 70 },
+ { colKey: 'title', title: '标题', ellipsis: true },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 110,
+ cell: ({ row }: { row: ITask }) => {
+ const st = STATUS_MAP[row.status] || { label: row.status, theme: 'default' };
+ return {st.label} ;
+ },
+ },
+ {
+ colKey: 'scheduleAt',
+ title: '计划发布',
+ width: 150,
+ cell: ({ row }: { row: ITask }) => {row.scheduleAt ? dayjs(row.scheduleAt).format('MM-DD HH:mm') : '立即'} ,
+ },
+ {
+ colKey: 'createdAt',
+ title: '创建时间',
+ width: 160,
+ cell: ({ row }: { row: ITask }) => {dayjs(row.createdAt).format('MM-DD HH:mm')} ,
+ },
+ ];
+
+ const deviceColumns = [
+ { colKey: 'name', title: '设备名', ellipsis: true },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 100,
+ cell: ({ row }: { row: IDevice }) => {
+ if (row.revoked) return 已吊销 ;
+ return row.status === 'online' ? 在线 : 离线 ;
+ },
+ },
+ { colKey: 'version', title: '版本', width: 120 },
+ {
+ colKey: 'lastSeenAt',
+ title: '最后活跃',
+ width: 160,
+ cell: ({ row }: { row: IDevice }) => (
+ {row.lastSeenAt ? dayjs(row.lastSeenAt).format('MM-DD HH:mm:ss') : '-'}
+ ),
+ },
+ ];
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Invite/index.tsx b/apps/web/src/pages/Invite/index.tsx
new file mode 100644
index 0000000..4eda8d5
--- /dev/null
+++ b/apps/web/src/pages/Invite/index.tsx
@@ -0,0 +1,84 @@
+import React, { useEffect, useState } from 'react';
+import { useNavigate, useSearchParams } from 'react-router-dom';
+import { Button, Card, Loading, MessagePlugin } from 'tdesign-react';
+import request from 'utils/request';
+
+export default function Invite() {
+ const [params] = useSearchParams();
+ const navigate = useNavigate();
+ const [state, setState] = useState<'loading' | 'ok' | 'needLogin' | 'fail'>('loading');
+ const [msg, setMsg] = useState('');
+
+ useEffect(() => {
+ const token = params.get('t');
+ const run = async () => {
+ if (!token) {
+ setState('fail');
+ setMsg('链接无效');
+ return;
+ }
+ if (!localStorage.getItem('ep_token')) {
+ setState('needLogin');
+ return;
+ }
+ try {
+ await request.post('/members/join', { token });
+ setState('ok');
+ } catch (e: any) {
+ const m = e?.response?.data?.message || '加入失败';
+ if (e?.response?.status === 401) {
+ setState('needLogin');
+ return;
+ }
+ setState('fail');
+ setMsg(m);
+ }
+ };
+ run();
+ }, [params]);
+
+ const loginFirst = () => {
+ navigate('/login/index');
+ };
+
+ const goHome = () => {
+ navigate('/dashboard/base');
+ };
+
+ return (
+
+
+ {state === 'loading' && (
+
+
+
+ )}
+ {state === 'ok' && (
+
+
🎉 已成功加入工作空间
+
+ 进入工作台
+
+
+ )}
+ {state === 'needLogin' && (
+
+
请先登录
+
登录邮箱需与邀请邮箱一致
+
+ 去登录
+
+
+ )}
+ {state === 'fail' && (
+
+ )}
+
+
+ );
+}
diff --git a/apps/web/src/pages/Login/components/Header/index.module.less b/apps/web/src/pages/Login/components/Header/index.module.less
new file mode 100644
index 0000000..be10d78
--- /dev/null
+++ b/apps/web/src/pages/Login/components/Header/index.module.less
@@ -0,0 +1,37 @@
+.loginHeader {
+ height: 64px;
+ padding: 0 24px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ backdrop-filter: blur(5px);
+ color: var(--td-text-color-primary);
+}
+
+.logo {
+ width: 188px;
+ height: 64px;
+}
+
+.operationsContainer {
+ display: flex;
+ align-items: center;
+ .t-button {
+ margin-left: 16px;
+ }
+}
+
+.operationsButton {
+ margin-left: 16px;
+}
+
+.icon {
+ height: 20px;
+ width: 20px;
+ padding: 6px;
+ box-sizing: content-box;
+
+ &:hover {
+ cursor: pointer;
+ }
+}
diff --git a/apps/web/src/pages/Login/components/Header/index.tsx b/apps/web/src/pages/Login/components/Header/index.tsx
new file mode 100644
index 0000000..1a17f9d
--- /dev/null
+++ b/apps/web/src/pages/Login/components/Header/index.tsx
@@ -0,0 +1,61 @@
+import React from 'react';
+import { Button } from 'tdesign-react';
+import { LogoGithubIcon, HelpCircleIcon, SettingIcon } from 'tdesign-icons-react';
+import { useAppDispatch } from 'modules/store';
+import { toggleSetting } from 'modules/global';
+
+import LogoFullIcon from 'assets/svg/assets-logo-full.svg?component';
+import Style from './index.module.less';
+
+export default function Header() {
+ const dispatch = useAppDispatch();
+
+ const navToGitHub = () => {
+ window.open('https://github.com/tencent/tdesign-react-starter');
+ };
+
+ const navToHelper = () => {
+ window.open('http://tdesign.tencent.com/starter/docs/react/get-started');
+ };
+
+ const toggleSettingPanel = () => {
+ dispatch(toggleSetting());
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Login/components/Login/index.module.less b/apps/web/src/pages/Login/components/Login/index.module.less
new file mode 100644
index 0000000..0d415bd
--- /dev/null
+++ b/apps/web/src/pages/Login/components/Login/index.module.less
@@ -0,0 +1,102 @@
+.itemContainer {
+ width: 400px;
+ margin-top: 32px;
+}
+
+.checkContainer {
+ display: flex;
+ align-items: center;
+ font-size: 14px;
+ color: var(--td-text-color-secondary);
+
+ &.rememberPwd {
+ margin-bottom: 16px;
+ justify-content: space-between;
+ }
+
+ :global {
+ .t-checkbox__label {
+ color: var(--td-text-color-secondary);
+ }
+
+ span {
+ color: var(--td-brand-color);
+
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ }
+}
+
+.tipContainer {
+ width: 192px;
+ margin-bottom: 16px;
+ font-size: 14px;
+ display: flex;
+ justify-content: space-between;
+
+ :global {
+ .tip {
+ color: var(--td-text-color-primary);
+ }
+
+ .refresh {
+ display: flex;
+ align-items: center;
+ color: var(--td-brand-color);
+
+ .t-icon {
+ font-size: 14px;
+ margin-left: 4px;
+ }
+
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ }
+}
+
+.checkContainerTip {
+ float: right;
+ font-size: 14px;
+ color: var(--td-brand-color);
+}
+
+.verificationBtn {
+ flex-shrink: 0;
+ width: 102px;
+ height: 40px;
+ margin-left: 11px;
+}
+
+.btnContainer {
+ margin-top: 24px;
+}
+
+.switchContainer {
+ margin-top: 24px;
+
+ :global {
+ .tip {
+ font-size: 14px;
+ color: var(--td-brand-color);
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ margin-right: 14px;
+
+ &:not(:last-child) {
+ &::after {
+ content: '';
+ display: block;
+ width: 1px;
+ height: 12px;
+ background: var(--td-gray-color-3);
+ margin-left: 14px;
+ }
+ }
+ }
+ }
+}
diff --git a/apps/web/src/pages/Login/components/Login/index.tsx b/apps/web/src/pages/Login/components/Login/index.tsx
new file mode 100644
index 0000000..88cf909
--- /dev/null
+++ b/apps/web/src/pages/Login/components/Login/index.tsx
@@ -0,0 +1,67 @@
+import React, { useRef, useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { Button, Form, FormInstanceFunctions, Input, MessagePlugin, SubmitContext } from 'tdesign-react';
+import { BrowseIcon, BrowseOffIcon, LockOnIcon, MailIcon } from 'tdesign-icons-react';
+import classnames from 'classnames';
+import { useAppDispatch } from 'modules/store';
+import { login } from 'modules/user';
+
+import Style from './index.module.less';
+
+const { FormItem } = Form;
+
+export default function Login() {
+ const [showPsw, toggleShowPsw] = useState(false);
+ const formRef = useRef();
+ const navigate = useNavigate();
+ const dispatch = useAppDispatch();
+
+ const onSubmit = async (e: SubmitContext) => {
+ if (e.validateResult === true) {
+ try {
+ const formValue = (formRef.current?.getFieldsValue?.(true) || {}) as { email: string; password: string };
+ await dispatch(login(formValue)).unwrap();
+ MessagePlugin.success('登录成功');
+ navigate('/dashboard/base');
+ } catch (err: any) {
+ MessagePlugin.error(err?.response?.data?.message || '登录失败,请检查邮箱与密码');
+ }
+ }
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Login/components/Register/index.module.less b/apps/web/src/pages/Login/components/Register/index.module.less
new file mode 100644
index 0000000..f3e5380
--- /dev/null
+++ b/apps/web/src/pages/Login/components/Register/index.module.less
@@ -0,0 +1,36 @@
+.itemContainer {
+ width: 400px;
+ margin-top: 48px;
+}
+
+.verificationBtn {
+ flex-shrink: 0;
+ width: 102px;
+ height: 40px;
+ margin-left: 11px;
+}
+
+.switchContainer {
+ margin-top: 24px;
+}
+
+.switchTip {
+ font-size: 14px;
+ color: var(--td-brand-color);
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ margin-right: 14px;
+}
+
+.checkContainer {
+ font-size: 14px;
+ color: var(--td-text-color-secondary);
+ :global {
+ .tip {
+ float: right;
+ font-size: 14px;
+ color: var(--td-brand-color);
+ }
+ }
+}
diff --git a/apps/web/src/pages/Login/components/Register/index.tsx b/apps/web/src/pages/Login/components/Register/index.tsx
new file mode 100644
index 0000000..7fffd2b
--- /dev/null
+++ b/apps/web/src/pages/Login/components/Register/index.tsx
@@ -0,0 +1,91 @@
+import React, { useRef, useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { Form, MessagePlugin, Input, Checkbox, Button, FormInstanceFunctions, SubmitContext } from 'tdesign-react';
+import { LockOnIcon, MailIcon, BrowseOffIcon, BrowseIcon, UserIcon } from 'tdesign-icons-react';
+import classnames from 'classnames';
+import { useAppDispatch } from 'modules/store';
+import { register } from 'modules/user';
+
+import Style from './index.module.less';
+
+const { FormItem } = Form;
+
+export default function Register() {
+ const [showPsw, toggleShowPsw] = useState(false);
+ const formRef = useRef();
+ const navigate = useNavigate();
+ const dispatch = useAppDispatch();
+
+ const onSubmit = async (e: SubmitContext) => {
+ if (e.validateResult === true) {
+ const formValue = (formRef.current?.getFieldsValue?.(true) || {}) as {
+ email: string;
+ password: string;
+ nickname: string;
+ checked: boolean;
+ };
+ if (!formValue.checked) {
+ MessagePlugin.error('请同意服务协议与隐私声明');
+ return;
+ }
+ try {
+ const nickname = formValue.nickname || formValue.email.split('@')[0];
+ await dispatch(register({ email: formValue.email, password: formValue.password, nickname })).unwrap();
+ MessagePlugin.success('注册成功,已自动登录');
+ navigate('/dashboard/base');
+ } catch (err: any) {
+ MessagePlugin.error(err?.response?.data?.message || '注册失败,请稍后重试');
+ }
+ }
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Login/hooks/useCountDown.ts b/apps/web/src/pages/Login/hooks/useCountDown.ts
new file mode 100644
index 0000000..3b806d5
--- /dev/null
+++ b/apps/web/src/pages/Login/hooks/useCountDown.ts
@@ -0,0 +1,32 @@
+import { useState, useEffect, useRef } from 'react';
+
+const useCountdown = (duration: number) => {
+ const [countdown, setCountdown] = useState(0);
+ const [isSetup, toggleSetup] = useState(false);
+ const timer = useRef();
+
+ useEffect(() => {
+ if (isSetup) {
+ setCountdown(duration);
+ timer.current = setInterval(() => {
+ setCountdown((current) => current - 1);
+ }, 1000);
+ } else clearInterval(timer.current as NodeJS.Timeout);
+ }, [isSetup]);
+
+ useEffect(() => {
+ if (countdown === 0) {
+ toggleSetup(false);
+ }
+ }, [countdown]);
+
+ useEffect(() => () => clearInterval(timer.current as NodeJS.Timeout), []);
+
+ function setupCountdown() {
+ toggleSetup(true);
+ }
+
+ return { countdown, setupCountdown };
+};
+
+export default useCountdown;
diff --git a/apps/web/src/pages/Login/index.module.less b/apps/web/src/pages/Login/index.module.less
new file mode 100644
index 0000000..9c65ea5
--- /dev/null
+++ b/apps/web/src/pages/Login/index.module.less
@@ -0,0 +1,67 @@
+.loginWrapper {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ background-size: cover;
+ background-position: 100%;
+ position: relative;
+ &.dark {
+ background-color: var(--td-bg-color-page);
+ background-image: url('assets/image/assets-login-bg-black.png');
+ }
+ &.light {
+ background-color: white;
+ background-image: url('assets/image/assets-login-bg-white.png');
+ }
+}
+
+.loginContainer {
+ position: absolute;
+ top: 22%;
+ left: 5%;
+ min-height: 500px;
+ line-height: 22px;
+}
+
+.title {
+ font-size: 36px;
+ line-height: 44px;
+ color: var(--td-text-color-primary);
+ margin-top: 4px;
+ margin-bottom: 0;
+}
+
+.subTitle {
+ margin-top: 16px;
+}
+
+.tip {
+ display: inline-block;
+ margin-right: 8px;
+ font-size: 14px;
+ margin-top: 0;
+ margin-bottom: 0;
+
+ &.registerTip {
+ color: var(--td-text-color-secondary);
+ }
+
+ &.loginTip {
+ color: var(--td-text-color-primary);
+ cursor: pointer;
+ }
+}
+
+.copyright {
+ font-size: 14px;
+ position: absolute;
+ left: 5%;
+ bottom: 64px;
+ color: var(--td-text-color-secondary);
+}
+
+@media screen and (max-height: 762px) {
+ .copyright {
+ display: none;
+ }
+}
diff --git a/apps/web/src/pages/Login/index.tsx b/apps/web/src/pages/Login/index.tsx
new file mode 100644
index 0000000..0473df7
--- /dev/null
+++ b/apps/web/src/pages/Login/index.tsx
@@ -0,0 +1,44 @@
+import React, { memo, useState } from 'react';
+import classNames from 'classnames';
+import Login from './components/Login';
+import Register from './components/Register';
+import LoginHeader from './components/Header';
+import { useAppSelector } from 'modules/store';
+import { selectGlobal } from 'modules/global';
+
+import Style from './index.module.less';
+
+export default memo(() => {
+ const [type, setType] = useState('login');
+ const globalState = useAppSelector(selectGlobal);
+ const { theme } = globalState;
+ const handleSwitchLoginType = () => {
+ setType(type === 'register' ? 'login' : 'register');
+ };
+
+ return (
+
+
+
+
+
登录到
+
EveryPublish 发布中台
+
+
+ {type === 'register' ? '已有账号?' : '没有账号吗?'}
+
+
+ {type === 'register' ? '登录' : '注册新账号'}
+
+
+
+ {type === 'login' ?
:
}
+
+
+ Copyright @ 2026-{new Date().getFullYear()} EveryPublish. All Rights Reserved
+
+
+ );
+});
diff --git a/apps/web/src/pages/Material/List/index.tsx b/apps/web/src/pages/Material/List/index.tsx
new file mode 100644
index 0000000..5a03fac
--- /dev/null
+++ b/apps/web/src/pages/Material/List/index.tsx
@@ -0,0 +1,186 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, Dialog, Input, MessagePlugin, Popconfirm, Select, Space, Table, Tag, Upload } from 'tdesign-react';
+import type { RequestMethodResponse, UploadFile } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+
+interface IMaterial {
+ id: number;
+ name: string;
+ kind: string;
+ size: number;
+ sha256: string;
+ group: string;
+ tags: string;
+ createdAt: string;
+}
+
+function fmtSize(bytes: number): string {
+ if (bytes >= 1024 * 1024) return (bytes / 1024 / 1024).toFixed(1) + ' MB';
+ if (bytes >= 1024) return (bytes / 1024).toFixed(1) + ' KB';
+ return bytes + ' B';
+}
+
+export default function MaterialList() {
+ const [list, setList] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [kind, setKind] = useState('');
+ const [group, setGroup] = useState('');
+ const [urlDialog, setUrlDialog] = useState<{ visible: boolean; url: string }>({ visible: false, url: '' });
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/materials?size=100' + (kind ? '&kind=' + kind : '') + (group ? '&group=' + encodeURIComponent(group) : ''));
+ setList((res.data.list || []) as IMaterial[]);
+ } catch (e) {
+ MessagePlugin.error('素材加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, [kind, group]);
+
+ useEffect(() => {
+ load();
+ }, [load]);
+
+ const uploadMethod = async (files: UploadFile | UploadFile[]): Promise => {
+ const f = (Array.isArray(files) ? files : [files])[0];
+ if (!f?.raw) return { status: 'fail', error: 'no file', response: {} };
+ const fd = new FormData();
+ fd.append('file', f.raw as File);
+ if (group.trim()) fd.append('group', group.trim());
+ try {
+ await request.post('/materials', fd);
+ return { status: 'success', response: {} };
+ } catch (e) {
+ return { status: 'fail', error: 'upload failed', response: {} };
+ }
+ };
+
+ const onUploadSuccess = () => {
+ MessagePlugin.success('上传成功');
+ load();
+ };
+
+ const onUploadFail = () => {
+ MessagePlugin.error('上传失败');
+ };
+
+ const getURL = async (m: IMaterial) => {
+ try {
+ const res = await request.get('/materials/' + m.id + '/url');
+ setUrlDialog({ visible: true, url: res.data.url || '' });
+ } catch (e) {
+ MessagePlugin.error('生成链接失败');
+ }
+ };
+
+ const copyURL = async () => {
+ try {
+ await navigator.clipboard.writeText(urlDialog.url);
+ MessagePlugin.success('已复制(10 分钟有效,一次性)');
+ } catch (e) {
+ MessagePlugin.error('复制失败');
+ }
+ };
+
+ const remove = async (m: IMaterial) => {
+ try {
+ await request.delete('/materials/' + m.id);
+ MessagePlugin.success('已删除');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '删除失败');
+ }
+ };
+
+ const columns = [
+ { colKey: 'name', title: '名称', ellipsis: true },
+ {
+ colKey: 'kind',
+ title: '类型',
+ width: 90,
+ cell: ({ row }: { row: IMaterial }) => (
+
+ {row.kind === 'video' ? '视频' : '图片'}
+
+ ),
+ },
+ { colKey: 'size', title: '大小', width: 110, cell: ({ row }: { row: IMaterial }) => {fmtSize(row.size)} },
+ {
+ colKey: 'sha256',
+ title: 'SHA256',
+ width: 150,
+ cell: ({ row }: { row: IMaterial }) => {row.sha256.slice(0, 12)}... ,
+ },
+ { colKey: 'group', title: '分组', width: 100, cell: ({ row }: { row: IMaterial }) => {row.group || '-'} },
+ {
+ colKey: 'createdAt',
+ title: '上传时间',
+ width: 160,
+ cell: ({ row }: { row: IMaterial }) => {dayjs(row.createdAt).format('MM-DD HH:mm')} ,
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 160,
+ cell: ({ row }: { row: IMaterial }) => (
+
+ getURL(row)}>
+ 获取直链
+
+ remove(row)}>
+
+ 删除
+
+
+
+ ),
+ },
+ ];
+
+ return (
+
+
+
+ setKind(v as string)}
+ options={[
+ { label: '全部类型', value: '' },
+ { label: '视频', value: 'video' },
+ { label: '图片', value: 'image' },
+ ]}
+ style={{ width: 140 }}
+ />
+ setGroup(v as string)} style={{ width: 160 }} />
+
+ 刷新
+
+
+
+ setUrlDialog({ visible: false, url: '' })}
+ footer={null}
+ >
+
+
+
+ 复制
+
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Member/List/index.tsx b/apps/web/src/pages/Member/List/index.tsx
new file mode 100644
index 0000000..990532d
--- /dev/null
+++ b/apps/web/src/pages/Member/List/index.tsx
@@ -0,0 +1,198 @@
+import React, { useCallback, useEffect, useRef, useState } from 'react';
+import { Button, Card, Dialog, Form, FormInstanceFunctions, Input, MessagePlugin, Popconfirm, Select, Space, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+
+const { FormItem } = Form;
+
+interface IMember {
+ id: number;
+ userId: number;
+ role: string;
+ email: string;
+ nickname: string;
+ createdAt: string;
+}
+
+const ROLE_LABEL: Record = {
+ owner: '所有者',
+ admin: '管理员',
+ operator: '运营',
+ reviewer: '审核',
+ viewer: '访客',
+};
+
+const ROLE_THEME: Record = {
+ owner: 'primary',
+ admin: 'warning',
+ operator: 'success',
+ reviewer: 'default',
+ viewer: 'default',
+};
+
+const ROLE_OPTIONS = ['admin', 'operator', 'reviewer', 'viewer'].map((r) => ({ label: ROLE_LABEL[r], value: r }));
+
+export default function MemberList() {
+ const [list, setList] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [inviteVisible, setInviteVisible] = useState(false);
+ const [inviteLink, setInviteLink] = useState('');
+ const [inviting, setInviting] = useState(false);
+ const formRef = useRef();
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/members');
+ setList((res.data.list || []) as IMember[]);
+ } catch (e) {
+ MessagePlugin.error('成员列表加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ }, [load]);
+
+ const onInvite = async () => {
+ const value = (formRef.current?.getFieldsValue?.(true) || {}) as { email: string; role: string };
+ if (!value.email || !value.role) return;
+ setInviting(true);
+ try {
+ const res = await request.post('/members/invite', { email: value.email, role: value.role });
+ setInviteLink(res.data.link || '');
+ MessagePlugin.success('邀请已生成');
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '邀请失败');
+ } finally {
+ setInviting(false);
+ }
+ };
+
+ const copyLink = async () => {
+ try {
+ await navigator.clipboard.writeText(inviteLink);
+ MessagePlugin.success('已复制邀请链接');
+ } catch (e) {
+ MessagePlugin.error('复制失败,请手动复制');
+ }
+ };
+
+ const changeRole = async (member: IMember, role: string) => {
+ try {
+ await request.put('/members/' + member.id + '/role', { role });
+ MessagePlugin.success('角色已更新');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '更新失败');
+ }
+ };
+
+ const remove = async (member: IMember) => {
+ try {
+ await request.delete('/members/' + member.id);
+ MessagePlugin.success('已移除');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '移除失败');
+ }
+ };
+
+ const columns = [
+ { colKey: 'nickname', title: '成员', cell: ({ row }: { row: IMember }) => {row.nickname || '-'} },
+ { colKey: 'email', title: '邮箱', ellipsis: true },
+ {
+ colKey: 'role',
+ title: '角色',
+ width: 140,
+ cell: ({ row }: { row: IMember }) =>
+ row.role === 'owner' ? (
+ {ROLE_LABEL[row.role]}
+ ) : (
+ changeRole(row, v as string)}
+ />
+ ),
+ },
+ {
+ colKey: 'createdAt',
+ title: '加入时间',
+ width: 160,
+ cell: ({ row }: { row: IMember }) => {dayjs(row.createdAt).format('YYYY-MM-DD HH:mm')} ,
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 100,
+ cell: ({ row }: { row: IMember }) =>
+ row.role === 'owner' ? null : (
+ remove(row)}>
+
+ 移除
+
+
+ ),
+ },
+ ];
+
+ return (
+ {
+ setInviteLink('');
+ setInviteVisible(true);
+ }}
+ >
+ 邀请成员
+
+ }
+ >
+
+ setInviteVisible(false)}
+ confirmBtn={null}
+ cancelBtn={null}
+ >
+
+ {inviteLink && (
+
+
将链接发给成员(24 小时内有效,登录同邮箱账号后访问即可加入)
+
+
+
+ 复制链接
+
+
+
+ )}
+
+
+ );
+}
diff --git a/apps/web/src/pages/Notification/List/index.tsx b/apps/web/src/pages/Notification/List/index.tsx
new file mode 100644
index 0000000..f3cc3ce
--- /dev/null
+++ b/apps/web/src/pages/Notification/List/index.tsx
@@ -0,0 +1,107 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Badge, Button, Card, MessagePlugin, Space, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { onWS } from 'utils/ws';
+
+interface INotification {
+ id: number;
+ kind: string;
+ title: string;
+ content: string;
+ read: boolean;
+ createdAt: string;
+}
+
+const KIND_LABEL: Record = { task: '任务', challenge: '挑战', system: '系统' };
+
+export default function NotificationList() {
+ const [list, setList] = useState([]);
+ const [unread, setUnread] = useState(0);
+ const [loading, setLoading] = useState(false);
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/notifications');
+ setList((res.data.list || []) as INotification[]);
+ setUnread(res.data.unread || 0);
+ } catch (e) {
+ MessagePlugin.error('加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ const off = onWS('task.status', () => load());
+ return off;
+ }, [load]);
+
+ const markRead = async (n: INotification) => {
+ try {
+ await request.post('/notifications/' + n.id + '/read');
+ load();
+ } catch (e) {
+ MessagePlugin.error('操作失败');
+ }
+ };
+
+ const readAll = async () => {
+ try {
+ await request.post('/notifications/read-all');
+ MessagePlugin.success('已全部标记已读');
+ load();
+ } catch (e) {
+ MessagePlugin.error('操作失败');
+ }
+ };
+
+ const columns = [
+ {
+ colKey: 'title',
+ title: '通知',
+ cell: ({ row }: { row: INotification }) => (
+
+
+ {!row.read && }
+ {row.title}
+ {KIND_LABEL[row.kind] || row.kind}
+
+
{row.content}
+
+ ),
+ },
+ {
+ colKey: 'createdAt',
+ title: '时间',
+ width: 160,
+ cell: ({ row }: { row: INotification }) => {dayjs(row.createdAt).format('MM-DD HH:mm')} ,
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 100,
+ cell: ({ row }: { row: INotification }) =>
+ row.read ? null : (
+ markRead(row)}>
+ 标记已读
+
+ ),
+ },
+ ];
+
+ return (
+
+ 全部已读
+
+ }
+ >
+
+
+ );
+}
diff --git a/apps/web/src/pages/Publish/Calendar/index.tsx b/apps/web/src/pages/Publish/Calendar/index.tsx
new file mode 100644
index 0000000..857befa
--- /dev/null
+++ b/apps/web/src/pages/Publish/Calendar/index.tsx
@@ -0,0 +1,66 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Card, Calendar, MessagePlugin, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+
+interface ITask {
+ id: number;
+ title: string;
+ status: string;
+ scheduleAt?: string | null;
+}
+
+const THEME: Record = { success: 'success', failed: 'danger', cancelled: 'default' };
+
+export default function CalendarPage() {
+ const [tasks, setTasks] = useState([]);
+ const [map, setMap] = useState>({});
+
+ const load = useCallback(async () => {
+ try {
+ const res = await request.get('/tasks?size=300');
+ const list = (res.data.list || []) as ITask[];
+ setTasks(list);
+ const m: Record = {};
+ list.forEach((t) => {
+ if (!t.scheduleAt) return;
+ const key = dayjs(t.scheduleAt).format('YYYY-MM-DD');
+ if (!m[key]) m[key] = [];
+ m[key].push(t);
+ });
+ setMap(m);
+ } catch (e) {
+ MessagePlugin.error('排期加载失败');
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ }, [load]);
+
+ return (
+
+ {
+ const list = map[cellData?.formattedDate] || [];
+ const dayNum = cellData?.date ? cellData.date.getDate() : cellData?.day;
+ return (
+
+
{dayNum}
+
+ {list.slice(0, 3).map((t) => (
+
+ {t.title.slice(0, 6)}
+
+ ))}
+ {list.length > 3 && +{list.length - 3} }
+
+
+ );
+ }}
+ />
+ 共 {tasks.filter((t) => t.scheduleAt).length} 个定时任务;立即发布的任务不在此展示。
+
+ );
+}
diff --git a/apps/web/src/pages/Publish/New/index.tsx b/apps/web/src/pages/Publish/New/index.tsx
new file mode 100644
index 0000000..012a96e
--- /dev/null
+++ b/apps/web/src/pages/Publish/New/index.tsx
@@ -0,0 +1,203 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { Button, Card, DatePicker, Form, Input, MessagePlugin, Radio, Space, Steps, Table, Tag, TagInput, Textarea } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { PLATFORM_LABEL } from 'constants/platforms';
+
+const { StepItem } = Steps;
+
+interface IMaterial { id: number; name: string; kind: string; size: number; createdAt: string; }
+interface IAccount { id: number; platform: string; accountName: string; remark: string; status: string; }
+
+export default function PublishNew() {
+ const navigate = useNavigate();
+ const [step, setStep] = useState(0);
+ const [materials, setMaterials] = useState([]);
+ const [accounts, setAccounts] = useState([]);
+ const [selMats, setSelMats] = useState<(string | number)[]>([]);
+ const [selAccs, setSelAccs] = useState<(string | number)[]>([]);
+ const [title, setTitle] = useState('');
+ const [content, setContent] = useState('');
+ const [tags, setTags] = useState([]);
+ const [scheduleMode, setScheduleMode] = useState('now');
+ const [scheduleAt, setScheduleAt] = useState('');
+ const [submitting, setSubmitting] = useState(false);
+
+ const loadData = useCallback(async () => {
+ try {
+ const m = await request.get('/materials?size=100');
+ setMaterials((m.data.list || []) as IMaterial[]);
+ const a = await request.get('/accounts?size=100');
+ setAccounts(((a.data.list || []) as IAccount[]).filter((x) => x.status === 'active'));
+ } catch (e) {
+ MessagePlugin.error('数据加载失败');
+ }
+ }, []);
+
+ useEffect(() => {
+ loadData();
+ }, [loadData]);
+
+ const submit = async () => {
+ if (!title.trim()) {
+ MessagePlugin.warning('请填写标题');
+ return;
+ }
+ setSubmitting(true);
+ try {
+ await request.post('/tasks', {
+ title: title.trim(),
+ content,
+ tags,
+ accountIds: selAccs.map(Number),
+ materialIds: selMats.map(Number),
+ scheduleAt: scheduleMode === 'scheduled' && scheduleAt ? dayjs(scheduleAt).valueOf() : null,
+ priority: 5,
+ });
+ MessagePlugin.success('草稿已创建,可在任务列表提交审核');
+ navigate('/publish/tasks');
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '创建失败');
+ } finally {
+ setSubmitting(false);
+ }
+ };
+
+ const matColumns = [
+ { colKey: 'name', title: '素材' },
+ {
+ colKey: 'kind',
+ title: '类型',
+ width: 90,
+ cell: ({ row }: { row: IMaterial }) => (
+ {row.kind === 'video' ? '视频' : '图片'}
+ ),
+ },
+ ];
+
+ const accColumns = [
+ {
+ colKey: 'platform',
+ title: '平台',
+ width: 100,
+ cell: ({ row }: { row: IAccount }) => {PLATFORM_LABEL[row.platform] || row.platform} ,
+ },
+ { colKey: 'accountName', title: '账号', cell: ({ row }: { row: IAccount }) => {row.remark || row.accountName || PLATFORM_LABEL[row.platform] || row.platform} },
+ ];
+
+ const steps = ['选择素材', '选择账号', '填写内容', '确认提交'];
+
+ return (
+
+ setStep(cur as number)} style={{ marginBottom: 24 }}>
+ {steps.map((s) => (
+
+ ))}
+
+ {step === 0 && (
+
+
勾选要发布的素材(可到「素材库」上传)
+
setSelMats(keys)}
+ hover
+ />
+
+ )}
+ {step === 1 && (
+
+
勾选发布账号(仅展示已绑定账号)
+
setSelAccs(keys)}
+ hover
+ />
+ {accounts.length === 0 && (
+ 暂无已绑定账号,请先到「账号管理」完成绑定
+ )}
+
+ )}
+ {step === 2 && (
+
+
+
标题 *
+
setTitle(v as string)} placeholder='发布标题' />
+
+
+
+
话题标签
+
setTags(v as string[])} placeholder='输入后回车添加,如 #新品' />
+
+
+
发布时间
+
setScheduleMode(v as string)}>
+ 立即发布(审核通过后)
+ 定时发布
+
+ {scheduleMode === 'scheduled' && (
+
+ setScheduleAt(v as string)} />
+
+ )}
+
+
+ )}
+ {step === 3 && (
+
+
素材 :{selMats.length} 个({materials.filter((m) => selMats.includes(m.id)).map((m) => m.name).join('、')})
+
账号 :{selAccs.length} 个({accounts.filter((a) => selAccs.includes(a.id)).map((a) => (PLATFORM_LABEL[a.platform] || a.platform) + '-' + (a.remark || a.accountName || '')).join('、')})
+
标题 :{title}
+
标签 :{tags.join('、') || '-'}
+
时间 :{scheduleMode === 'scheduled' && scheduleAt ? dayjs(scheduleAt).format('YYYY-MM-DD HH:mm') : '审核通过后立即'}
+
提交后为草稿状态,需在任务列表提交审核;审核通过后自动下发客户端执行。
+
+ )}
+
+
+ {step > 0 && (
+ setStep(step - 1)}>
+ 上一步
+
+ )}
+ {step < 3 && (
+ {
+ if (step === 0 && selMats.length === 0) {
+ MessagePlugin.warning('请至少选择一个素材');
+ return;
+ }
+ if (step === 1 && selAccs.length === 0) {
+ MessagePlugin.warning('请至少选择一个账号');
+ return;
+ }
+ if (step === 2 && !title.trim()) {
+ MessagePlugin.warning('请填写标题');
+ return;
+ }
+ setStep(step + 1);
+ }}
+ >
+ 下一步
+
+ )}
+ {step === 3 && (
+
+ 创建草稿
+
+ )}
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Publish/Tasks/index.tsx b/apps/web/src/pages/Publish/Tasks/index.tsx
new file mode 100644
index 0000000..7dec754
--- /dev/null
+++ b/apps/web/src/pages/Publish/Tasks/index.tsx
@@ -0,0 +1,233 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { Button, Card, Dialog, Drawer, Input, MessagePlugin, Select, Space, Table, Tag, Textarea } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { onWS } from 'utils/ws';
+
+interface ITask {
+ id: number;
+ title: string;
+ content: string;
+ status: string;
+ scheduleAt?: string | null;
+ createdAt: string;
+ publishedAt?: string | null;
+ publishedUrls: string;
+ receipts: string;
+ errorMessage: string;
+ reviewNote: string;
+ accountIds: string;
+ materialIds: string;
+ tags: string;
+}
+
+const STATUS_MAP: Record = {
+ draft: { label: '草稿', theme: 'default' },
+ pending_review: { label: '待审核', theme: 'warning' },
+ rejected: { label: '已驳回', theme: 'danger' },
+ queued: { label: '排队中', theme: 'warning' },
+ dispatched: { label: '已下发', theme: 'primary' },
+ running: { label: '执行中', theme: 'primary' },
+ success: { label: '发布成功', theme: 'success' },
+ failed: { label: '失败', theme: 'danger' },
+ suspended: { label: '已挂起', theme: 'warning' },
+ cancelled: { label: '已取消', theme: 'default' },
+};
+
+export default function Tasks() {
+ const navigate = useNavigate();
+ const [list, setList] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [status, setStatus] = useState('');
+ const [detail, setDetail] = useState(null);
+ const [rejectTarget, setRejectTarget] = useState(null);
+ const [rejectNote, setRejectNote] = useState('');
+ const [total, setTotal] = useState(0);
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/tasks?size=100' + (status ? '&status=' + status : ''));
+ setList((res.data.list || []) as ITask[]);
+ setTotal(res.data.total || 0);
+ } catch (e) {
+ MessagePlugin.error('任务加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, [status]);
+
+ useEffect(() => {
+ load();
+ const off = onWS('task.status', () => load());
+ return off;
+ }, [load]);
+
+ const act = async (task: ITask, action: string, body?: any) => {
+ try {
+ await request.post('/tasks/' + task.id + '/' + action, body || {});
+ MessagePlugin.success('操作成功');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '操作失败');
+ }
+ };
+
+ const removeTask = async (task: ITask) => {
+ try {
+ await request.delete('/tasks/' + task.id);
+ MessagePlugin.success('已删除');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '删除失败');
+ }
+ };
+
+ const renderActions = (row: ITask) => {
+ const btns: React.ReactNode[] = [];
+ if (row.status === 'draft') {
+ btns.push(
+ act(row, 'submit')}>
+ 提交审核
+ ,
+ );
+ btns.push(
+ removeTask(row)}>
+ 删除
+ ,
+ );
+ }
+ if (row.status === 'pending_review') {
+ btns.push(
+ act(row, 'approve')}>
+ 通过
+ ,
+ );
+ btns.push(
+ setRejectTarget(row)}>
+ 驳回
+ ,
+ );
+ }
+ if (row.status === 'rejected') {
+ btns.push(
+ act(row, 'resubmit')}>
+ 重新提交
+ ,
+ );
+ }
+ if (row.status === 'failed') {
+ btns.push(
+ act(row, 'retry')}>
+ 重试
+ ,
+ );
+ }
+ if (['queued', 'dispatched', 'running', 'suspended', 'pending_review', 'draft', 'rejected'].includes(row.status)) {
+ btns.push(
+ act(row, 'cancel')}>
+ 取消
+ ,
+ );
+ }
+ btns.push(
+ setDetail(row)}>
+ 详情
+ ,
+ );
+ return {btns} ;
+ };
+
+ const columns = [
+ { colKey: 'id', title: 'ID', width: 70 },
+ { colKey: 'title', title: '标题', ellipsis: true },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 110,
+ cell: ({ row }: { row: ITask }) => {
+ const st = STATUS_MAP[row.status] || { label: row.status, theme: 'default' };
+ return {st.label} ;
+ },
+ },
+ {
+ colKey: 'scheduleAt',
+ title: '计划发布',
+ width: 150,
+ cell: ({ row }: { row: ITask }) => (
+ {row.scheduleAt ? dayjs(row.scheduleAt).format('MM-DD HH:mm') : '立即'}
+ ),
+ },
+ {
+ colKey: 'createdAt',
+ title: '创建时间',
+ width: 150,
+ cell: ({ row }: { row: ITask }) => {dayjs(row.createdAt).format('MM-DD HH:mm')} ,
+ },
+ { colKey: 'op', title: '操作', width: 280, cell: ({ row }: { row: ITask }) => renderActions(row) },
+ ];
+
+ return (
+
+ setStatus(v as string)}
+ options={[
+ { label: '全部状态', value: '' },
+ ...Object.keys(STATUS_MAP).map((k) => ({ label: STATUS_MAP[k].label, value: k })),
+ ]}
+ style={{ width: 140 }}
+ />
+ navigate('/publish/new')}>
+ 新建发布
+
+
+ }
+ >
+
+ setDetail(null)}
+ size='420px'
+ >
+ {detail && (
+
+
标题 :{detail.title}
+
状态 :{(STATUS_MAP[detail.status] || {}).label || detail.status}
+
内容 :{detail.content || '-'}
+
标签 :{detail.tags || '-'}
+
计划发布 :{detail.scheduleAt ? dayjs(detail.scheduleAt).format('YYYY-MM-DD HH:mm') : '立即'}
+
失败原因 :{detail.errorMessage || '-'}
+
驳回批注 :{detail.reviewNote || '-'}
+
发布链接 :{detail.publishedUrls === 'null' || !detail.publishedUrls ? '-' : detail.publishedUrls}
+
创建时间 :{dayjs(detail.createdAt).format('YYYY-MM-DD HH:mm')}
+
+ )}
+
+ setRejectTarget(null)}
+ confirmBtn={
+ {
+ if (rejectTarget) act(rejectTarget, 'reject', { note: rejectNote });
+ setRejectTarget(null);
+ setRejectNote('');
+ }}
+ >
+ 确认驳回
+
+ }
+ >
+
+
+ );
+}
diff --git a/apps/web/src/pages/Result/403/index.tsx b/apps/web/src/pages/Result/403/index.tsx
new file mode 100644
index 0000000..158c96c
--- /dev/null
+++ b/apps/web/src/pages/Result/403/index.tsx
@@ -0,0 +1,6 @@
+import React from 'react';
+import ErrorPage from 'components/ErrorPage';
+
+const UnAuthorized = () => ;
+
+export default React.memo(UnAuthorized);
diff --git a/apps/web/src/pages/Result/404/index.tsx b/apps/web/src/pages/Result/404/index.tsx
new file mode 100644
index 0000000..a43631d
--- /dev/null
+++ b/apps/web/src/pages/Result/404/index.tsx
@@ -0,0 +1,6 @@
+import React from 'react';
+import ErrorPage from 'components/ErrorPage';
+
+const NotFound = () => ;
+
+export default React.memo(NotFound);
diff --git a/apps/web/src/pages/Result/500/index.tsx b/apps/web/src/pages/Result/500/index.tsx
new file mode 100644
index 0000000..881b089
--- /dev/null
+++ b/apps/web/src/pages/Result/500/index.tsx
@@ -0,0 +1,6 @@
+import React from 'react';
+import ErrorPage from 'components/ErrorPage';
+
+const ServerError = () => ;
+
+export default React.memo(ServerError);
diff --git a/apps/web/src/pages/Result/index.module.less b/apps/web/src/pages/Result/index.module.less
new file mode 100644
index 0000000..303dc10
--- /dev/null
+++ b/apps/web/src/pages/Result/index.module.less
@@ -0,0 +1,28 @@
+.Content {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ height: 75vh;
+ padding: 24px;
+ min-height: 400px;
+ color: var(--td-brand-color);
+
+ .title {
+ font-weight: 500;
+ font-size: 20px;
+ line-height: 28px;
+ margin-top: 8px;
+ color: var(--td-text-color-primary);
+ }
+ .description {
+ margin: 8px 0 32px;
+ font-size: 14px;
+ line-height: 22px;
+ color: var(--td-text-color-secondary);
+ }
+
+ .rightButton {
+ margin-left: 8px;
+ }
+}
diff --git a/apps/web/src/pages/Review/List/index.tsx b/apps/web/src/pages/Review/List/index.tsx
new file mode 100644
index 0000000..6a0081c
--- /dev/null
+++ b/apps/web/src/pages/Review/List/index.tsx
@@ -0,0 +1,117 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, Dialog, Drawer, MessagePlugin, Space, Table, Tag, Textarea } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { onWS } from 'utils/ws';
+
+interface ITask {
+ id: number;
+ title: string;
+ content: string;
+ status: string;
+ createdAt: string;
+ accountIds: string;
+ materialIds: string;
+ tags: string;
+}
+
+export default function ReviewList() {
+ const [list, setList] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [preview, setPreview] = useState(null);
+ const [rejectTarget, setRejectTarget] = useState(null);
+ const [note, setNote] = useState('');
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/tasks?status=pending_review&size=100');
+ setList((res.data.list || []) as ITask[]);
+ } catch (e) {
+ MessagePlugin.error('加载失败');
+ } finally {
+ setLoading(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ const off = onWS('task.status', () => load());
+ return off;
+ }, [load]);
+
+ const act = async (task: ITask, action: string, body?: any) => {
+ try {
+ await request.post('/tasks/' + task.id + '/' + action, body || {});
+ MessagePlugin.success(action === 'approve' ? '已通过,任务进入队列' : '已驳回');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '操作失败');
+ }
+ };
+
+ const columns = [
+ { colKey: 'id', title: 'ID', width: 70 },
+ { colKey: 'title', title: '标题', ellipsis: true },
+ {
+ colKey: 'createdAt',
+ title: '提交时间',
+ width: 160,
+ cell: ({ row }: { row: ITask }) => {dayjs(row.createdAt).format('MM-DD HH:mm')} ,
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 220,
+ cell: ({ row }: { row: ITask }) => (
+
+ setPreview(row)}>
+ 预览
+
+ act(row, 'approve')}>
+ 通过
+
+ setRejectTarget(row)}>
+ 驳回
+
+
+ ),
+ },
+ ];
+
+ return (
+
+
+ setPreview(null)} size='420px'>
+ {preview && (
+
+
标题 :{preview.title}
+
内容 :{preview.content || '-'}
+
标签 :{preview.tags || '-'}
+
账号数 :{(preview.accountIds || '[]').length > 2 ? JSON.parse(preview.accountIds).length : 0}
+
素材数 :{(preview.materialIds || '[]').length > 2 ? JSON.parse(preview.materialIds).length : 0}
+
+ )}
+
+ setRejectTarget(null)}
+ confirmBtn={
+ {
+ if (rejectTarget) act(rejectTarget, 'reject', { note });
+ setRejectTarget(null);
+ setNote('');
+ }}
+ >
+ 确认驳回
+
+ }
+ >
+
+
+ );
+}
diff --git a/apps/web/src/pages/Setting/Channel/index.tsx b/apps/web/src/pages/Setting/Channel/index.tsx
new file mode 100644
index 0000000..19c5e56
--- /dev/null
+++ b/apps/web/src/pages/Setting/Channel/index.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { Card, Switch, Tag } from 'tdesign-react';
+
+const CHANNELS = [
+ { name: '企业微信机器人', desc: '任务失败/挑战待处理时推送到企业微信群' },
+ { name: '钉钉机器人', desc: '任务失败/挑战待处理时推送到钉钉群' },
+ { name: '邮件通知', desc: '审核结果/任务结果发送到成员邮箱' },
+];
+
+export default function SettingChannel() {
+ return (
+ 二期接入}
+ >
+
+ {CHANNELS.map((ch) => (
+
+
+
+
{ch.name}
+
{ch.desc}
+
+
+ ))}
+
+ 一期站内通知已全量可用;企微/钉钉/邮件渠道在二期接入。
+
+ );
+}
diff --git a/apps/web/src/pages/Setting/Device/index.tsx b/apps/web/src/pages/Setting/Device/index.tsx
new file mode 100644
index 0000000..dd0c334
--- /dev/null
+++ b/apps/web/src/pages/Setting/Device/index.tsx
@@ -0,0 +1,107 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, MessagePlugin, Popconfirm, Table, Tag } from 'tdesign-react';
+import dayjs from 'dayjs';
+import request from 'utils/request';
+import { onWS } from 'utils/ws';
+
+interface IDevice {
+ id: number;
+ name: string;
+ os: string;
+ version: string;
+ status: string;
+ ip: string;
+ revoked: boolean;
+ lastSeenAt?: string | null;
+ pairedAt?: string;
+}
+
+export default function SettingDevice() {
+ const [list, setList] = useState([]);
+ const [loading, setLoading] = useState(false);
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const res = await request.get('/agent/devices');
+ setList((res.data.list || []) as IDevice[]);
+ } catch (e) {
+ setList([]);
+ } finally {
+ setLoading(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ load();
+ const off = onWS('agent.status', () => load());
+ return off;
+ }, [load]);
+
+ const revoke = async (d: IDevice) => {
+ try {
+ await request.put('/agent/devices/' + d.id + '/revoke');
+ MessagePlugin.success('已吊销,设备将被强制下线');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '吊销失败');
+ }
+ };
+
+ const columns = [
+ { colKey: 'name', title: '设备名', ellipsis: true },
+ {
+ colKey: 'status',
+ title: '状态',
+ width: 100,
+ cell: ({ row }: { row: IDevice }) => {
+ if (row.revoked) return 已吊销 ;
+ return row.status === 'online' ? 在线 : 离线 ;
+ },
+ },
+ { colKey: 'os', title: '系统', width: 100 },
+ { colKey: 'version', title: '版本', width: 100 },
+ { colKey: 'ip', title: 'IP', width: 140 },
+ {
+ colKey: 'pairedAt',
+ title: '配对时间',
+ width: 160,
+ cell: ({ row }: { row: IDevice }) => {row.pairedAt ? dayjs(row.pairedAt).format('YYYY-MM-DD HH:mm') : '-'} ,
+ },
+ {
+ colKey: 'lastSeenAt',
+ title: '最后活跃',
+ width: 160,
+ cell: ({ row }: { row: IDevice }) => (
+ {row.lastSeenAt ? dayjs(row.lastSeenAt).format('MM-DD HH:mm:ss') : '-'}
+ ),
+ },
+ {
+ colKey: 'op',
+ title: '操作',
+ width: 100,
+ cell: ({ row }: { row: IDevice }) =>
+ row.revoked ? null : (
+ revoke(row)}>
+
+ 吊销
+
+
+ ),
+ },
+ ];
+
+ return (
+
+ 刷新
+
+ }
+ >
+
+ 配对:客户端安装后生成配对码(设置页留位,D9 客户端 UI 提供),在此页可吊销设备。
+
+ );
+}
diff --git a/apps/web/src/pages/Setting/Profile/index.tsx b/apps/web/src/pages/Setting/Profile/index.tsx
new file mode 100644
index 0000000..a19628d
--- /dev/null
+++ b/apps/web/src/pages/Setting/Profile/index.tsx
@@ -0,0 +1,86 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Button, Card, Input, MessagePlugin, Space } from 'tdesign-react';
+import request from 'utils/request';
+import { useAppSelector } from 'modules/store';
+import { selectUser } from 'modules/user';
+
+interface IWorkspace {
+ id: number;
+ name: string;
+ plan: string;
+ createdAt: string;
+}
+
+export default function SettingProfile() {
+ const userState = useAppSelector(selectUser);
+ const [workspaces, setWorkspaces] = useState([]);
+ const [name, setName] = useState('');
+ const [saving, setSaving] = useState(false);
+
+ const load = useCallback(async () => {
+ try {
+ const res = await request.get('/workspaces');
+ const list = (res.data.list || []) as IWorkspace[];
+ setWorkspaces(list);
+ const cur = list.find((w) => w.id === userState.workspaceId) || list[0];
+ if (cur) setName(cur.name);
+ } catch (e) {
+ MessagePlugin.error('加载失败');
+ }
+ }, [userState.workspaceId]);
+
+ useEffect(() => {
+ load();
+ }, [load]);
+
+ const save = async () => {
+ if (!name.trim()) {
+ MessagePlugin.warning('名称不能为空');
+ return;
+ }
+ const cur = workspaces.find((w) => w.id === userState.workspaceId) || workspaces[0];
+ if (!cur) return;
+ setSaving(true);
+ try {
+ await request.put('/workspaces/' + cur.id, { name: name.trim() });
+ MessagePlugin.success('已保存');
+ load();
+ } catch (e: any) {
+ MessagePlugin.error(e?.response?.data?.message || '保存失败');
+ } finally {
+ setSaving(false);
+ }
+ };
+
+ return (
+
+
+
+
工作空间名称
+
+ setName(v as string)} style={{ width: 320 }} />
+
+ 保存
+
+
+
+
+
+
+
邮箱:{userState.userInfo.email || '-'}
+
昵称:{userState.userInfo.nickname || '-'}
+
工作空间角色:{userState.memberRole || '-'}
+
+
+
+
+ {workspaces.map((w) => (
+
+ {w.name}({w.plan}){w.id === userState.workspaceId ? ' ← 当前' : ''}
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/Setting/Security/index.tsx b/apps/web/src/pages/Setting/Security/index.tsx
new file mode 100644
index 0000000..fc9d39d
--- /dev/null
+++ b/apps/web/src/pages/Setting/Security/index.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { Card, Input, Switch, Tag } from 'tdesign-react';
+
+export default function SettingSecurity() {
+ return (
+
+
+
+
+ 默认关闭
+
+ 二期接入 TOTP 验证码
+
+
+ 开启后登录需额外输入动态验证码,进一步保护账号。
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/router/index.ts b/apps/web/src/router/index.ts
new file mode 100644
index 0000000..673ef93
--- /dev/null
+++ b/apps/web/src/router/index.ts
@@ -0,0 +1,55 @@
+import React from 'react';
+import { BrowserRouterProps } from 'react-router-dom';
+import workspace from './modules/workspace';
+import admin from './modules/admin';
+import login from './modules/login';
+import otherRoutes from './modules/others';
+
+export interface IRouter {
+ path: string;
+ redirect?: string;
+ Component?: React.FC | (() => any);
+ /**
+ * 当前路由是否全屏显示
+ */
+ isFullPage?: boolean;
+ /**
+ * meta未赋值 路由不显示到菜单中
+ */
+ meta?: {
+ title?: string;
+ Icon?: React.FC;
+ /**
+ * 侧边栏隐藏该路由
+ */
+ hidden?: boolean;
+ /**
+ * 单层路由
+ */
+ single?: boolean;
+ /**
+ * 仅平台管理员可见
+ */
+ admin?: boolean;
+ };
+ children?: IRouter[];
+}
+
+const routes: IRouter[] = [
+ {
+ path: '/invite',
+ Component: React.lazy(() => import('pages/Invite')),
+ isFullPage: true,
+ meta: {
+ hidden: true,
+ },
+ },
+ {
+ path: '/',
+ redirect: '/dashboard/base',
+ },
+];
+
+const allRoutes = [...routes, ...workspace, ...admin, ...login, ...otherRoutes];
+
+export default allRoutes;
diff --git a/apps/web/src/router/modules/admin.ts b/apps/web/src/router/modules/admin.ts
new file mode 100644
index 0000000..a0d2630
--- /dev/null
+++ b/apps/web/src/router/modules/admin.ts
@@ -0,0 +1,29 @@
+import { lazy } from 'react';
+import { ShopIcon, DesktopIcon, RootListIcon } from 'tdesign-icons-react';
+import { IRouter } from '../index';
+
+const admin: IRouter[] = [
+ {
+ path: '/admin',
+ meta: { title: '平台管理', Icon: ShopIcon, admin: true },
+ children: [
+ {
+ path: 'tenant',
+ Component: lazy(() => import('pages/Admin/Tenant')),
+ meta: { title: '租户管理' },
+ },
+ {
+ path: 'agent',
+ Component: lazy(() => import('pages/Admin/Agent')),
+ meta: { title: 'Agent 总览', Icon: DesktopIcon },
+ },
+ {
+ path: 'docs',
+ Component: lazy(() => import('pages/Admin/Docs')),
+ meta: { title: '开发文档' },
+ },
+ ],
+ },
+];
+
+export default admin;
diff --git a/apps/web/src/router/modules/login.ts b/apps/web/src/router/modules/login.ts
new file mode 100644
index 0000000..65b4a64
--- /dev/null
+++ b/apps/web/src/router/modules/login.ts
@@ -0,0 +1,25 @@
+import { lazy } from 'react';
+import { IRouter } from '../index';
+
+// 登录页:独立全屏页,不进侧边菜单
+const result: IRouter[] = [
+ {
+ path: '/login',
+ meta: {
+ title: '登录页',
+ hidden: true,
+ },
+ children: [
+ {
+ path: 'index',
+ Component: lazy(() => import('pages/Login')),
+ isFullPage: true,
+ meta: {
+ title: '登录中心',
+ },
+ },
+ ],
+ },
+];
+
+export default result;
diff --git a/apps/web/src/router/modules/others.ts b/apps/web/src/router/modules/others.ts
new file mode 100644
index 0000000..ecf8398
--- /dev/null
+++ b/apps/web/src/router/modules/others.ts
@@ -0,0 +1,19 @@
+import { lazy } from 'react';
+import { IRouter } from '../index';
+
+const otherRoutes: IRouter[] = [
+ {
+ path: '/403',
+ Component: lazy(() => import('pages/Result/403')),
+ },
+ {
+ path: '/500',
+ Component: lazy(() => import('pages/Result/500')),
+ },
+ {
+ path: '*',
+ Component: lazy(() => import('pages/Result/404')),
+ },
+];
+
+export default otherRoutes;
diff --git a/apps/web/src/router/modules/workspace.ts b/apps/web/src/router/modules/workspace.ts
new file mode 100644
index 0000000..7a062ea
--- /dev/null
+++ b/apps/web/src/router/modules/workspace.ts
@@ -0,0 +1,154 @@
+import { lazy } from 'react';
+import {
+ DashboardIcon,
+ TaskIcon,
+ FolderIcon,
+ UserCircleIcon,
+ CheckCircleIcon,
+ SecuredIcon,
+ NotificationIcon,
+ UsergroupIcon,
+ SettingIcon,
+ TimeIcon,
+} from 'tdesign-icons-react';
+import { IRouter } from '../index';
+
+const workspace: IRouter[] = [
+ {
+ path: '/dashboard',
+ meta: { title: '工作台', Icon: DashboardIcon, single: true },
+ children: [
+ {
+ path: 'base',
+ Component: lazy(() => import('pages/Dashboard/Base')),
+ meta: { title: '概览' },
+ },
+ ],
+ },
+ {
+ path: '/publish',
+ meta: { title: '发布管理', Icon: TaskIcon },
+ children: [
+ {
+ path: 'tasks',
+ Component: lazy(() => import('pages/Publish/Tasks')),
+ meta: { title: '任务列表' },
+ },
+ {
+ path: 'new',
+ Component: lazy(() => import('pages/Publish/New')),
+ meta: { title: '新建发布' },
+ },
+ {
+ path: 'calendar',
+ Component: lazy(() => import('pages/Publish/Calendar')),
+ meta: { title: '排期日历' },
+ },
+ ],
+ },
+ {
+ path: '/material',
+ meta: { title: '素材库', Icon: FolderIcon, single: true },
+ children: [
+ {
+ path: 'list',
+ Component: lazy(() => import('pages/Material/List')),
+ meta: { title: '素材列表' },
+ },
+ ],
+ },
+ {
+ path: '/account',
+ meta: { title: '账号管理', Icon: UserCircleIcon, single: true },
+ children: [
+ {
+ path: 'list',
+ Component: lazy(() => import('pages/Account/List')),
+ meta: { title: '账号台账' },
+ },
+ ],
+ },
+ {
+ path: '/review',
+ meta: { title: '审核中心', Icon: CheckCircleIcon, single: true },
+ children: [
+ {
+ path: 'list',
+ Component: lazy(() => import('pages/Review/List')),
+ meta: { title: '待审列表' },
+ },
+ ],
+ },
+ {
+ path: '/challenge',
+ meta: { title: '挑战中心', Icon: SecuredIcon, single: true },
+ children: [
+ {
+ path: 'list',
+ Component: lazy(() => import('pages/Challenge/List')),
+ meta: { title: '挑战列表' },
+ },
+ ],
+ },
+ {
+ path: '/notification',
+ meta: { title: '通知', Icon: NotificationIcon, single: true },
+ children: [
+ {
+ path: 'list',
+ Component: lazy(() => import('pages/Notification/List')),
+ meta: { title: '通知列表' },
+ },
+ ],
+ },
+ {
+ path: '/member',
+ meta: { title: '成员管理', Icon: UsergroupIcon, single: true },
+ children: [
+ {
+ path: 'list',
+ Component: lazy(() => import('pages/Member/List')),
+ meta: { title: '成员列表' },
+ },
+ ],
+ },
+ {
+ path: '/setting',
+ meta: { title: '设置', Icon: SettingIcon },
+ children: [
+ {
+ path: 'profile',
+ Component: lazy(() => import('pages/Setting/Profile')),
+ meta: { title: '工作区资料' },
+ },
+ {
+ path: 'security',
+ Component: lazy(() => import('pages/Setting/Security')),
+ meta: { title: '安全' },
+ },
+ {
+ path: 'channel',
+ Component: lazy(() => import('pages/Setting/Channel')),
+ meta: { title: '通知渠道' },
+ },
+ {
+ path: 'device',
+ Component: lazy(() => import('pages/Setting/Device')),
+ meta: { title: 'Agent 设备' },
+ },
+ ],
+ },
+ {
+ path: '/audit',
+ meta: { title: '审计日志', Icon: TimeIcon, single: true },
+ children: [
+ {
+ path: 'list',
+ Component: lazy(() => import('pages/Audit/List')),
+ meta: { title: '日志列表' },
+ },
+ ],
+ },
+];
+
+export default workspace;
diff --git a/apps/web/src/styles/common.module.less b/apps/web/src/styles/common.module.less
new file mode 100644
index 0000000..140ff85
--- /dev/null
+++ b/apps/web/src/styles/common.module.less
@@ -0,0 +1,9 @@
+.pageWithPadding {
+ padding: 30px 32px;
+}
+
+.pageWithColor {
+ background: var(--td-bg-color-container);
+ box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);
+ border-radius: 3px;
+}
diff --git a/apps/web/src/styles/index.less b/apps/web/src/styles/index.less
new file mode 100644
index 0000000..08df376
--- /dev/null
+++ b/apps/web/src/styles/index.less
@@ -0,0 +1,17 @@
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans',
+ 'Droid Sans', 'Helvetica Neue', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+html,
+body,
+#app {
+ height: 100%;
+}
+
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
+}
diff --git a/apps/web/src/types/index.d.ts b/apps/web/src/types/index.d.ts
new file mode 100644
index 0000000..b6a872b
--- /dev/null
+++ b/apps/web/src/types/index.d.ts
@@ -0,0 +1,4 @@
+export enum ETheme {
+ light = 'light',
+ dark = 'dark',
+}
diff --git a/apps/web/src/utils/color.ts b/apps/web/src/utils/color.ts
new file mode 100644
index 0000000..95b98c3
--- /dev/null
+++ b/apps/web/src/utils/color.ts
@@ -0,0 +1,99 @@
+import { Color } from 'tvision-color';
+import { defaultColor, darkColor, CHART_COLORS } from 'configs/color';
+import { ETheme } from 'types/index.d';
+
+/**
+ * 依据主题颜色获取 ColorList
+ * @param theme
+ * @param themeColor
+ */
+function getColorFromThemeColor(theme: string, themeColor: string): Array {
+ let themeColorList = [];
+ const isDarkMode = theme === ETheme.dark;
+ const colorLowerCase = themeColor.toLocaleLowerCase();
+
+ if (defaultColor.includes(colorLowerCase)) {
+ const colorIdx = defaultColor.indexOf(colorLowerCase);
+ const defaultGradients = !isDarkMode ? defaultColor : darkColor;
+ const spliceThemeList = defaultGradients.slice(0, colorIdx);
+ themeColorList = defaultGradients.slice(colorIdx, defaultGradients.length).concat(spliceThemeList);
+ } else {
+ themeColorList = Color.getRandomPalette({
+ color: themeColor,
+ colorGamut: 'bright',
+ number: 8,
+ });
+ }
+
+ return themeColorList;
+}
+
+/**
+ *
+ * @param theme 当前主题
+ * @param themeColor 当前主题色
+ */
+export function getChartColor(theme: ETheme, themeColor: string) {
+ const colorList = getColorFromThemeColor(theme, themeColor);
+ // 图表颜色
+ const chartColors = CHART_COLORS[theme];
+ return { ...chartColors, colorList };
+}
+
+export function generateColorMap(
+ theme: string,
+ colorPalette: Array,
+ mode: 'light' | 'dark',
+ brandColorIdx: number,
+) {
+ const isDarkMode = mode === 'dark';
+
+ if (isDarkMode) {
+ // eslint-disable-next-line no-use-before-define
+ colorPalette.reverse().map((color) => {
+ const [h, s, l] = Color.colorTransform(color, 'hex', 'hsl');
+ return Color.colorTransform([h, Number(s) - 4, l], 'hsl', 'hex');
+ });
+ // eslint-disable-next-line no-param-reassign
+ brandColorIdx = 10 - brandColorIdx;
+ colorPalette[0] = `${colorPalette[brandColorIdx]}20`;
+ }
+
+ const colorMap = {
+ '--td-brand-color': colorPalette[brandColorIdx], // 主题色
+ '--td-brand-color-1': colorPalette[0], // light
+ '--td-brand-color-2': colorPalette[1], // focus
+ '--td-brand-color-3': colorPalette[2], // disabled
+ '--td-brand-color-4': colorPalette[3],
+ '--td-brand-color-5': colorPalette[4],
+ '--td-brand-color-6': colorPalette[5],
+ '--td-brand-color-7': brandColorIdx > 0 ? colorPalette[brandColorIdx - 1] : theme, // hover
+ '--td-brand-color-8': colorPalette[brandColorIdx], // 主题色
+ '--td-brand-color-9': brandColorIdx > 8 ? theme : colorPalette[brandColorIdx + 1], // click
+ '--td-brand-color-10': colorPalette[9],
+ };
+ return colorMap;
+}
+
+export function insertThemeStylesheet(theme: string, colorMap: Record, mode: 'light' | 'dark') {
+ const isDarkMode = mode === 'dark';
+ const root = !isDarkMode ? `:root[theme-color='${theme}']` : `:root[theme-color='${theme}'][theme-mode='dark']`;
+
+ const styleSheet = document.createElement('style');
+ styleSheet.type = 'text/css';
+ styleSheet.innerText = `${root}{
+ --td-brand-color: ${colorMap['--td-brand-color']};
+ --td-brand-color-1: ${colorMap['--td-brand-color-1']};
+ --td-brand-color-2: ${colorMap['--td-brand-color-2']};
+ --td-brand-color-3: ${colorMap['--td-brand-color-3']};
+ --td-brand-color-4: ${colorMap['--td-brand-color-4']};
+ --td-brand-color-5: ${colorMap['--td-brand-color-5']};
+ --td-brand-color-6: ${colorMap['--td-brand-color-6']};
+ --td-brand-color-7: ${colorMap['--td-brand-color-7']};
+ --td-brand-color-8: ${colorMap['--td-brand-color-8']};
+ --td-brand-color-9: ${colorMap['--td-brand-color-9']};
+ --td-brand-color-10: ${colorMap['--td-brand-color-10']};
+ }`;
+
+ document.head.appendChild(styleSheet);
+}
diff --git a/apps/web/src/utils/path.ts b/apps/web/src/utils/path.ts
new file mode 100644
index 0000000..b0f56ed
--- /dev/null
+++ b/apps/web/src/utils/path.ts
@@ -0,0 +1,12 @@
+/**
+ * 解析当前菜单对应的路由
+ * @param path1
+ * @param path2
+ */
+export const resolve = (path1 = '', path2 = '') => {
+ let separator = '/';
+ if (path1.endsWith('/') || path2.startsWith('/')) {
+ separator = '';
+ }
+ return `${path1}${separator}${path2}`;
+};
diff --git a/apps/web/src/utils/request.ts b/apps/web/src/utils/request.ts
new file mode 100644
index 0000000..5f52522
--- /dev/null
+++ b/apps/web/src/utils/request.ts
@@ -0,0 +1,84 @@
+import axios from 'axios';
+import proxy from '../configs/host';
+
+const env = import.meta.env.MODE || 'development';
+const API_HOST = proxy[env].API;
+
+const SUCCESS_CODE = 0;
+const TIMEOUT = 15000;
+
+export const instance = axios.create({
+ baseURL: API_HOST,
+ timeout: TIMEOUT,
+ withCredentials: true,
+});
+
+// 附带 JWT
+instance.interceptors.request.use((config) => {
+ const token = localStorage.getItem('ep_token');
+ if (token) {
+ config.headers.Authorization = 'Bearer ' + token;
+ }
+ return config;
+});
+
+// 401 时用 refresh token 换新并重试原请求(单飞:并发请求共享一次刷新)
+let refreshPromise: Promise | null = null;
+
+const refreshTokens = (): Promise => {
+ if (!refreshPromise) {
+ const refreshToken = localStorage.getItem('ep_refresh');
+ if (!refreshToken) {
+ return Promise.reject(new Error('no refresh token'));
+ }
+ refreshPromise = axios
+ .post('/api/v1/auth/refresh', { refreshToken })
+ .then((res) => {
+ const data = res.data?.data;
+ localStorage.setItem('ep_token', data.accessToken);
+ localStorage.setItem('ep_refresh', data.refreshToken);
+ return data.accessToken as string;
+ })
+ .finally(() => {
+ refreshPromise = null;
+ });
+ }
+ return refreshPromise;
+};
+
+instance.interceptors.response.use(
+ // eslint-disable-next-line consistent-return
+ (response) => {
+ if (response.status === 200) {
+ const { data } = response;
+ if (data.code === SUCCESS_CODE) {
+ return data;
+ }
+ return Promise.reject(data);
+ }
+ return Promise.reject(response?.data);
+ },
+ async (error) => {
+ const config = error?.config;
+ const resp = error?.response;
+ const retried = config ? (config as any).__retried : false;
+ if (resp?.status === 401 && resp?.data?.code === 1002 && config && !retried && localStorage.getItem('ep_refresh')) {
+ (config as any).__retried = true;
+ try {
+ const token = await refreshTokens();
+ config.headers.Authorization = 'Bearer ' + token;
+ return instance(config);
+ } catch (e) {
+ localStorage.removeItem('ep_token');
+ localStorage.removeItem('ep_refresh');
+ if (window.location.pathname.indexOf('/login') === -1) {
+ window.location.href = '/login/index';
+ }
+ return Promise.reject(e);
+ }
+ }
+ return Promise.reject(error);
+ },
+);
+
+export default instance;
diff --git a/apps/web/src/utils/ws.ts b/apps/web/src/utils/ws.ts
new file mode 100644
index 0000000..1d20185
--- /dev/null
+++ b/apps/web/src/utils/ws.ts
@@ -0,0 +1,51 @@
+let sock: WebSocket | null = null;
+let retryTimer: number | null = null;
+let stopped = false;
+
+type Listener = (payload: any) => void;
+const listeners = new Map>();
+
+export function connectWS() {
+ if (stopped) return;
+ const token = localStorage.getItem('ep_token');
+ if (!token) return;
+ const proto = window.location.protocol === 'https:' ? 'wss' : 'ws';
+ const url = proto + '://' + window.location.host + '/ws/browser?token=' + encodeURIComponent(token);
+ try {
+ sock = new WebSocket(url);
+ } catch (e) {
+ scheduleRetry();
+ return;
+ }
+ sock.onmessage = (e) => {
+ try {
+ const msg = JSON.parse(e.data);
+ const set = listeners.get(msg.type);
+ set?.forEach((fn: Listener) => fn(msg.payload));
+ } catch (err) {
+ // 忽略非法消息
+ }
+ };
+ sock.onclose = () => {
+ sock = null;
+ if (localStorage.getItem('ep_token')) scheduleRetry();
+ };
+ sock.onerror = () => {
+ sock?.close();
+ };
+}
+
+function scheduleRetry() {
+ if (retryTimer || stopped) return;
+ retryTimer = window.setTimeout(() => {
+ retryTimer = null;
+ connectWS();
+ }, 3000);
+}
+
+export function onWS(type: string, fn: Listener): () => void {
+ if (!listeners.has(type)) listeners.set(type, new Set());
+ const set = listeners.get(type) as Set;
+ set.add(fn);
+ return () => set.delete(fn);
+}
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
new file mode 100644
index 0000000..527692f
--- /dev/null
+++ b/apps/web/tsconfig.json
@@ -0,0 +1,36 @@
+{
+ "compilerOptions": {
+ "baseUrl": "src",
+ "target": "esnext",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "paths": {
+ "assets/*": ["assets/*"],
+ "components/*": ["components/*"],
+ "constants/*": ["constants/*"],
+ "configs/*": ["configs/*"],
+ "layouts/*": ["layouts/*"],
+ "modules/*": ["modules/*"],
+ "pages/*": ["pages/*"],
+ "styles/*": ["styles/*"],
+ "utils/*": ["utils/*"],
+ "services/*": ["services/*"],
+ "router/*": ["router/*"],
+ "hooks/*": ["hooks/*"],
+ "types/*": ["types/*"]
+ },
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src"]
+}
diff --git a/apps/web/vite.config.js b/apps/web/vite.config.js
new file mode 100644
index 0000000..bf7652a
--- /dev/null
+++ b/apps/web/vite.config.js
@@ -0,0 +1,62 @@
+import path from 'path';
+import { loadEnv } from 'vite';
+import react from '@vitejs/plugin-react';
+import svgr from '@honkhonk/vite-plugin-svgr';
+
+const CWD = process.cwd();
+
+export default (params) => {
+ const { mode } = params;
+ const { VITE_BASE_URL } = loadEnv(mode, CWD);
+
+ return {
+ base: VITE_BASE_URL,
+ resolve: {
+ alias: {
+ assets: path.resolve(__dirname, './src/assets'),
+ components: path.resolve(__dirname, './src/components'),
+ constants: path.resolve(__dirname, './src/constants'),
+ configs: path.resolve(__dirname, './src/configs'),
+ layouts: path.resolve(__dirname, './src/layouts'),
+ modules: path.resolve(__dirname, './src/modules'),
+ pages: path.resolve(__dirname, './src/pages'),
+ styles: path.resolve(__dirname, './src/styles'),
+ utils: path.resolve(__dirname, './src/utils'),
+ services: path.resolve(__dirname, './src/services'),
+ router: path.resolve(__dirname, './src/router'),
+ hooks: path.resolve(__dirname, './src/hooks'),
+ types: path.resolve(__dirname, './src/types'),
+ },
+ },
+ css: {
+ preprocessorOptions: {
+ less: {
+ modifyVars: {},
+ },
+ },
+ },
+ plugins: [svgr(), react()],
+ build: {
+ cssCodeSplit: false,
+ },
+ server: {
+ host: '0.0.0.0',
+ port: 3003,
+ proxy: {
+ '/api': {
+ target: 'http://127.0.0.1:8090',
+ changeOrigin: true,
+ },
+ '/health': {
+ target: 'http://127.0.0.1:8090',
+ changeOrigin: true,
+ },
+ '/ws': {
+ target: 'ws://127.0.0.1:8090',
+ ws: true,
+ changeOrigin: true,
+ },
+ },
+ },
+ };
+};