diff --git a/yudao-ui-admin-vue3/.editorconfig b/yudao-ui-admin-vue3/.editorconfig
new file mode 100644
index 0000000000..79a12ffa66
--- /dev/null
+++ b/yudao-ui-admin-vue3/.editorconfig
@@ -0,0 +1,12 @@
+root = true
+[*.{js,ts,vue}]
+charset = utf-8 # 设置文件字符集为 utf-8
+end_of_line = lf # 控制换行类型(lf | cr | crlf)
+insert_final_newline = true # 始终在文件末尾插入一个新行
+indent_style = space # 缩进风格(tab | space)
+indent_size = 2 # 缩进大小
+max_line_length = 100 # 最大行长度
+
+[*.md] # 仅 md 文件适用以下规则
+max_line_length = off # 关闭最大行长度限制
+trim_trailing_whitespace = false # 关闭末尾空格修剪
diff --git a/yudao-ui-admin-vue3/.env b/yudao-ui-admin-vue3/.env
new file mode 100644
index 0000000000..1bcb92da6a
--- /dev/null
+++ b/yudao-ui-admin-vue3/.env
@@ -0,0 +1,11 @@
+# 标题
+VITE_APP_TITLE=芋道管理系统
+
+# 项目本地运行端口号
+VITE_PORT=80
+
+# open 运行 npm run dev 时自动打开浏览器
+VITE_OPEN=true
+
+# 租户开关
+VITE_APP_TENANT_ENABLE=true
diff --git a/yudao-ui-admin-vue3/.env.base b/yudao-ui-admin-vue3/.env.base
new file mode 100644
index 0000000000..7a2f2a0ff6
--- /dev/null
+++ b/yudao-ui-admin-vue3/.env.base
@@ -0,0 +1,17 @@
+# 本地开发环境
+NODE_ENV=development
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=/dev-api
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 打包路径
+VITE_BASE_PATH=/
diff --git a/yudao-ui-admin-vue3/.env.dev b/yudao-ui-admin-vue3/.env.dev
new file mode 100644
index 0000000000..a67cdc6864
--- /dev/null
+++ b/yudao-ui-admin-vue3/.env.dev
@@ -0,0 +1,29 @@
+# 开发环境
+NODE_ENV=production
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=/dev-api
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 打包路径
+VITE_BASE_PATH=/dist-dev/
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=true
+
+# 输出路径
+VITE_OUT_DIR=dist-dev
diff --git a/yudao-ui-admin-vue3/.env.pro b/yudao-ui-admin-vue3/.env.pro
new file mode 100644
index 0000000000..4b47737e10
--- /dev/null
+++ b/yudao-ui-admin-vue3/.env.pro
@@ -0,0 +1,29 @@
+# 生产环境
+NODE_ENV=production
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=true
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=true
+
+# 是否sourcemap
+VITE_SOURCEMAP=false
+
+# 打包路径
+VITE_BASE_PATH=/
+
+# 输出路径
+VITE_OUT_DIR=dist-pro
diff --git a/yudao-ui-admin-vue3/.env.test b/yudao-ui-admin-vue3/.env.test
new file mode 100644
index 0000000000..6166840fa0
--- /dev/null
+++ b/yudao-ui-admin-vue3/.env.test
@@ -0,0 +1,29 @@
+# 测试环境
+NODE_ENV=production
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=true
+
+# 打包路径
+VITE_BASE_PATH=/dist-test/
+
+# 输出路径
+VITE_OUT_DIR=dist-test
diff --git a/yudao-ui-admin-vue3/.eslintignore b/yudao-ui-admin-vue3/.eslintignore
new file mode 100644
index 0000000000..1e85c0fbaa
--- /dev/null
+++ b/yudao-ui-admin-vue3/.eslintignore
@@ -0,0 +1,8 @@
+/build/
+/config/
+/dist/
+/*.js
+/test/unit/coverage/
+/node_modules/*
+/dist*
+/src/main.ts
diff --git a/yudao-ui-admin-vue3/.eslintrc.js b/yudao-ui-admin-vue3/.eslintrc.js
new file mode 100644
index 0000000000..d68a39ea6f
--- /dev/null
+++ b/yudao-ui-admin-vue3/.eslintrc.js
@@ -0,0 +1,68 @@
+// @ts-check
+const { defineConfig } = require('eslint-define-config')
+module.exports = defineConfig({
+ root: true,
+ env: {
+ browser: true,
+ node: true,
+ es6: true
+ },
+ parser: 'vue-eslint-parser',
+ parserOptions: {
+ parser: '@typescript-eslint/parser',
+ ecmaVersion: 2020,
+ sourceType: 'module',
+ jsxPragma: 'React',
+ ecmaFeatures: {
+ jsx: true
+ }
+ },
+ extends: [
+ 'plugin:vue/vue3-recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'prettier',
+ 'plugin:prettier/recommended'
+ ],
+ rules: {
+ 'vue/script-setup-uses-vars': 'error',
+ 'vue/no-reserved-component-names': 'off',
+ '@typescript-eslint/ban-ts-ignore': 'off',
+ '@typescript-eslint/explicit-function-return-type': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ 'vue/custom-event-name-casing': 'off',
+ 'no-use-before-define': 'off',
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/ban-ts-comment': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ '@typescript-eslint/no-unused-vars': 'error',
+ 'no-unused-vars': 'error',
+ 'space-before-function-paren': 'off',
+
+ 'vue/attributes-order': 'off',
+ 'vue/one-component-per-file': 'off',
+ 'vue/html-closing-bracket-newline': 'off',
+ 'vue/max-attributes-per-line': 'off',
+ 'vue/multiline-html-element-content-newline': 'off',
+ 'vue/singleline-html-element-content-newline': 'off',
+ 'vue/attribute-hyphenation': 'off',
+ 'vue/require-default-prop': 'off',
+ 'vue/require-explicit-emits': 'off',
+ 'vue/html-self-closing': [
+ 'error',
+ {
+ html: {
+ void: 'always',
+ normal: 'never',
+ component: 'always'
+ },
+ svg: 'always',
+ math: 'always'
+ }
+ ],
+ 'vue/multi-word-component-names': 'off'
+ }
+})
diff --git a/yudao-ui-admin-vue3/.gitignore b/yudao-ui-admin-vue3/.gitignore
new file mode 100644
index 0000000000..bceec055a8
--- /dev/null
+++ b/yudao-ui-admin-vue3/.gitignore
@@ -0,0 +1,8 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+/dist*
+pnpm-debug
+/frank*
diff --git a/yudao-ui-admin-vue3/.prettierignore b/yudao-ui-admin-vue3/.prettierignore
new file mode 100644
index 0000000000..15cf071834
--- /dev/null
+++ b/yudao-ui-admin-vue3/.prettierignore
@@ -0,0 +1,10 @@
+/node_modules/**
+/dist/
+/dist*
+/public/*
+/docs/*
+/vite.config.ts
+/src/types/env.d.ts
+/docs/**/*
+/plop/**/*
+CHANGELOG
diff --git a/yudao-ui-admin-vue3/.stylelintignore b/yudao-ui-admin-vue3/.stylelintignore
new file mode 100644
index 0000000000..aa605b4983
--- /dev/null
+++ b/yudao-ui-admin-vue3/.stylelintignore
@@ -0,0 +1,6 @@
+/dist/*
+/public/*
+public/*
+/dist*
+/src/types/env.d.ts
+/docs/**/*
diff --git a/yudao-ui-admin-vue3/.versionrc b/yudao-ui-admin-vue3/.versionrc
new file mode 100644
index 0000000000..22bca96520
--- /dev/null
+++ b/yudao-ui-admin-vue3/.versionrc
@@ -0,0 +1,16 @@
+{
+ "types": [
+ {"type": "chore", "section":"Others", "hidden": false},
+ {"type": "revert", "section":"Reverts", "hidden": false},
+ {"type": "feat", "section": "Features", "hidden": false},
+ {"type": "fix", "section": "Bug Fixes", "hidden": false},
+ {"type": "improvement", "section": "Feature Improvements", "hidden": false},
+ {"type": "docs", "section":"Docs", "hidden": false},
+ {"type": "style", "section":"Styling", "hidden": false},
+ {"type": "refactor", "section":"Code Refactoring", "hidden": false},
+ {"type": "perf", "section":"Performance Improvements", "hidden": false},
+ {"type": "test", "section":"Tests", "hidden": false},
+ {"type": "build", "section":"Build System", "hidden": false},
+ {"type": "ci", "section":"CI", "hidden":false}
+ ]
+}
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/.vscode/extensions.json b/yudao-ui-admin-vue3/.vscode/extensions.json
new file mode 100644
index 0000000000..d1530933a1
--- /dev/null
+++ b/yudao-ui-admin-vue3/.vscode/extensions.json
@@ -0,0 +1,15 @@
+{
+ "recommendations": [
+ "voorjaar.windicss-intellisense",
+ "vscode-icons-team.vscode-icons",
+ "davidanson.vscode-markdownlint",
+ "stylelint.vscode-stylelint",
+ "dbaeumer.vscode-eslint",
+ "esbenp.prettier-vscode",
+ "vue.volar",
+ "lokalise.i18n-ally",
+ "mikestead.dotenv",
+ "eamodio.gitlens",
+ "antfu.iconify"
+ ]
+}
diff --git a/yudao-ui-admin-vue3/.vscode/settings.json b/yudao-ui-admin-vue3/.vscode/settings.json
new file mode 100644
index 0000000000..7b2554efc4
--- /dev/null
+++ b/yudao-ui-admin-vue3/.vscode/settings.json
@@ -0,0 +1,43 @@
+{
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "prettier.enable": true,
+ "editor.formatOnType": true,
+ "editor.formatOnSave": true,
+ "editor.formatOnPaste": true,
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true
+ },
+ "[vue]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[javascript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[json]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[jsonc]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[html]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[css]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[scss]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "i18n-ally.localesPaths": ["src/locales"],
+ "i18n-ally.keystyle": "nested",
+ "i18n-ally.sortKeys": true,
+ "i18n-ally.namespace": true,
+ "i18n-ally.enabledParsers": ["ts"],
+ "i18n-ally.sourceLanguage": "en",
+ "i18n-ally.displayLanguage": "zh-CN",
+ "i18n-ally.enabledFrameworks": ["vue", "react"],
+ "god.tsconfig": "./tsconfig.json"
+}
diff --git a/yudao-ui-admin-vue3/README.md b/yudao-ui-admin-vue3/README.md
new file mode 100644
index 0000000000..d95981305a
--- /dev/null
+++ b/yudao-ui-admin-vue3/README.md
@@ -0,0 +1,85 @@
+
🌈 yudao-ui-admin-vue3
+
+## 介绍
+
+- 基于 vue3.2+ ,TypeScript ,Element Plus 2.2.0+ ,Vite3 ,Pinia ,Windicss 等开发的后台管理系统
+
+## 注意事项
+
+- 项目路径请不要使用中文命名!!!会造成解析乱码!!!请使用全英文路径!!!
+- node >=14.18.0 ,pnpm >=7
+- 开发建议使用 [谷歌浏览器-开发者版](https://www.google.cn/intl/zh-CN/chrome/dev/) 不支持 IE\QQ 等浏览器
+
+### 前端依赖
+
+| 框架 | 说明 | 版本 |
+| --- | --- | --- |
+| [Vue](https://staging-cn.vuejs.org/) | vue 框架 | 3.2.37 |
+| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 3.0.1 |
+| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.9 |
+| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.7.4 |
+| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.16 |
+| [vueuse](https://vueuse.org//) | 常用工具集 | 8.9.4 |
+| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.1.10 |
+| [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.2 |
+| [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 |
+| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.1 |
+| [wangeditor](https://www.wangeditor.com/) | 富文本编辑器 | 5.1.11 |
+
+## 用法
+
+### 推荐 VScode 开发,插件如下
+
+- WindiCSS IntelliSense WindiCSS --- 自动完成、语法突出显示、代码折叠和构建等高级功能
+- TypeScript Vue Plugin (Volar) --- 用于 TypeScript 的 Vue 插件
+- Vue Language Features (Volar) --- Vue3.0 语法支持
+- Iconify IntelliSense --- Iconify 预览和搜索
+- i18n Ally --- 国际化智能提示
+- Stylelint --- css 格式化
+- DotENV --- .env 文件高亮
+- Prettier --- 代码格式化
+- ESLint --- 脚本代码检查
+
+### 安装 pnpm 并启动项目
+
+```
+# 查看当前 npm 源
+
+npm config ls
+
+# 如果执行上面命令您并未看到 registry = "https://registry.npmjs.org/",说明使用的非npm官方源,请执行下面命令
+
+npm config set registry https://registry.npmjs.org
+
+# 如果您还没安装 pnpm,请执行下面命令
+
+npm install -g pnpm
+
+# mac 用户遇到安装报错请在命令前加上 sudo
+
+# 安装依赖
+
+pnpm install
+
+# 运行项目
+
+pnpm run dev
+
+# 安装一个包
+
+pnpm add 包名
+
+# 卸载一个包
+
+pnpm remove 包名
+```
+
+## 浏览器支持
+
+本地开发推荐使用 `Chrome 80+` 浏览器
+
+支持现代浏览器, 不支持 IE ,QQ 等
+
+| [](http://godban.github.io/browsers-support-badges/)IE | [](http://godban.github.io/browsers-support-badges/)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 |
+| :-: | :-: | :-: | :-: | :-: |
+| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
diff --git a/yudao-ui-admin-vue3/index.html b/yudao-ui-admin-vue3/index.html
new file mode 100644
index 0000000000..e25e20bd3c
--- /dev/null
+++ b/yudao-ui-admin-vue3/index.html
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+ <%= title %>
+
+
+
+
+
+
+
+
+
<%= title %>
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/package.json b/yudao-ui-admin-vue3/package.json
new file mode 100644
index 0000000000..2e56ebb858
--- /dev/null
+++ b/yudao-ui-admin-vue3/package.json
@@ -0,0 +1,117 @@
+{
+ "name": "ruoyi-vue-pro-vue3",
+ "version": "0.0.154",
+ "description": "基于vue3、element-plus、typesScript、vite3。",
+ "author": "xingyu",
+ "private": false,
+ "scripts": {
+ "i": "pnpm install",
+ "dev": "vite --mode base",
+ "ts:check": "vue-tsc --noEmit",
+ "build:pro": "vite build --mode pro",
+ "build:dev": "vite build --mode dev",
+ "build:test": "npm run ts:check && vite build --mode test",
+ "serve:pro": "vite preview --mode pro",
+ "serve:dev": "vite preview --mode dev",
+ "serve:test": "vite preview --mode test",
+ "npm:check": "npx npm-check-updates",
+ "clean": "npx rimraf node_modules",
+ "clean:cache": "npx rimraf node_modules/.cache",
+ "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
+ "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
+ "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
+ "lint:lint-staged": "lint-staged -c ",
+ "lint:pretty": "pretty-quick --staged",
+ "p": "plop"
+ },
+ "dependencies": {
+ "@iconify/iconify": "^2.2.1",
+ "@vueuse/core": "^8.9.4",
+ "@wangeditor/editor": "^5.1.11",
+ "@wangeditor/editor-for-vue": "^5.1.10",
+ "@zxcvbn-ts/core": "^2.0.3",
+ "animate.css": "^4.1.1",
+ "axios": "^0.27.2",
+ "dayjs": "^1.11.3",
+ "echarts": "^5.3.3",
+ "echarts-wordcloud": "^2.0.0",
+ "element-plus": "2.2.9",
+ "intro.js": "^6.0.0",
+ "lodash-es": "^4.17.21",
+ "mitt": "^3.0.0",
+ "nprogress": "^0.2.0",
+ "pinia": "^2.0.16",
+ "pinia-plugin-persist": "^1.0.0",
+ "qrcode": "^1.5.1",
+ "qs": "^6.11.0",
+ "vue": "3.2.37",
+ "vue-cropper": "^1.0.3",
+ "vue-i18n": "9.1.10",
+ "vue-router": "^4.1.2",
+ "vue-types": "^4.1.1",
+ "web-storage-cache": "^1.1.1"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^17.0.3",
+ "@commitlint/config-conventional": "^17.0.3",
+ "@iconify/json": "^2.1.79",
+ "@intlify/vite-plugin-vue-i18n": "^5.0.0",
+ "@purge-icons/generated": "^0.8.1",
+ "@types/intro.js": "^5.1.0",
+ "@types/lodash-es": "^4.17.6",
+ "@types/node": "^18.0.6",
+ "@types/nprogress": "^0.2.0",
+ "@types/qrcode": "^1.4.2",
+ "@types/qs": "^6.9.7",
+ "@typescript-eslint/eslint-plugin": "^5.30.6",
+ "@typescript-eslint/parser": "^5.30.6",
+ "@vitejs/plugin-vue": "^3.0.1",
+ "@vitejs/plugin-vue-jsx": "^2.0.0",
+ "autoprefixer": "^10.4.7",
+ "eslint": "^8.20.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-define-config": "^1.5.1",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-vue": "^9.2.0",
+ "less": "^4.1.3",
+ "lint-staged": "^13.0.3",
+ "plop": "^3.1.1",
+ "postcss": "^8.4.14",
+ "postcss-html": "^1.5.0",
+ "postcss-less": "^6.0.0",
+ "prettier": "^2.7.1",
+ "pretty-quick": "^3.1.3",
+ "rimraf": "^3.0.2",
+ "rollup": "^2.77.0",
+ "stylelint": "^14.9.1",
+ "stylelint-config-html": "^1.1.0",
+ "stylelint-config-prettier": "^9.0.3",
+ "stylelint-config-recommended": "^8.0.0",
+ "stylelint-config-standard": "^26.0.0",
+ "stylelint-order": "^5.0.0",
+ "typescript": "4.7.4",
+ "unplugin-vue-define-options": "^0.6.2",
+ "vite": "3.0.1",
+ "vite-plugin-eslint": "^1.6.1",
+ "vite-plugin-html": "^3.2.0",
+ "vite-plugin-purge-icons": "^0.8.1",
+ "vite-plugin-style-import": "^1.4.1",
+ "vite-plugin-svg-icons": "^2.0.1",
+ "vite-plugin-windicss": "^1.8.7",
+ "vue-tsc": "^0.38.8",
+ "windicss": "^3.5.6",
+ "windicss-analysis": "^0.3.5"
+ },
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://gitee.com/zhijiantianya/ruoyi-vue-pro"
+ },
+ "bugs": {
+ "url": "https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I57XOQ"
+ },
+ "homepage": "https://gitee.com/zhijiantianya/ruoyi-vue-pro"
+}
diff --git a/yudao-ui-admin-vue3/plop/component/component.hbs b/yudao-ui-admin-vue3/plop/component/component.hbs
new file mode 100644
index 0000000000..21e56533d9
--- /dev/null
+++ b/yudao-ui-admin-vue3/plop/component/component.hbs
@@ -0,0 +1,11 @@
+
+
+
+ {{ upperFirstName }}
+
diff --git a/yudao-ui-admin-vue3/plop/component/index.hbs b/yudao-ui-admin-vue3/plop/component/index.hbs
new file mode 100644
index 0000000000..aca6f0a8c4
--- /dev/null
+++ b/yudao-ui-admin-vue3/plop/component/index.hbs
@@ -0,0 +1,3 @@
+import {{ upperFirstName }} from './src/{{ upperFirstName }}.vue'
+
+export { {{ upperFirstName }} }
diff --git a/yudao-ui-admin-vue3/plop/component/prompt.js b/yudao-ui-admin-vue3/plop/component/prompt.js
new file mode 100644
index 0000000000..98a852f07a
--- /dev/null
+++ b/yudao-ui-admin-vue3/plop/component/prompt.js
@@ -0,0 +1,38 @@
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
+
+module.exports = {
+ description: 'Create vue component',
+ prompts: [
+ {
+ type: 'input',
+ name: 'name',
+ message: '请输入组件名称(Please enter the component name)'
+ }
+ ],
+ actions: (data) => {
+ const { name } = data
+ const upperFirstName = toUpperCase(name)
+
+ const actions = []
+ if (name) {
+ actions.push({
+ type: 'add',
+ path: `./src/components/${upperFirstName}/src/${upperFirstName}.vue`,
+ templateFile: './plop/component/component.hbs',
+ data: {
+ name,
+ upperFirstName
+ }
+ }, {
+ type: 'add',
+ path: `./src/components/${upperFirstName}/index.ts`,
+ templateFile: './plop/component/index.hbs',
+ data: {
+ upperFirstName
+ }
+ })
+ }
+
+ return actions
+ }
+}
diff --git a/yudao-ui-admin-vue3/plop/view/prompt.js b/yudao-ui-admin-vue3/plop/view/prompt.js
new file mode 100644
index 0000000000..dbf324fb63
--- /dev/null
+++ b/yudao-ui-admin-vue3/plop/view/prompt.js
@@ -0,0 +1,37 @@
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
+
+module.exports = {
+ description: 'Create vue view',
+ prompts: [
+ {
+ type: 'input',
+ name: 'path',
+ message: '请输入路径(Please enter a path)',
+ default: 'views'
+ },
+ {
+ type: 'input',
+ name: 'name',
+ message: '请输入模块名称(Please enter module name)'
+ }
+ ],
+ actions: (data) => {
+ const { name, path } = data
+ const upperFirstName = toUpperCase(name)
+
+ const actions = []
+ if (name) {
+ actions.push({
+ type: 'add',
+ path: `./src/${path}/${upperFirstName}.vue`,
+ templateFile: './plop/view/view.hbs',
+ data: {
+ name,
+ upperFirstName
+ }
+ })
+ }
+
+ return actions
+ }
+}
diff --git a/yudao-ui-admin-vue3/plop/view/view.hbs b/yudao-ui-admin-vue3/plop/view/view.hbs
new file mode 100644
index 0000000000..9e359a85ab
--- /dev/null
+++ b/yudao-ui-admin-vue3/plop/view/view.hbs
@@ -0,0 +1,6 @@
+
+
+
+ {{ name }}
+
diff --git a/yudao-ui-admin-vue3/plopfile.js b/yudao-ui-admin-vue3/plopfile.js
new file mode 100644
index 0000000000..72e6af29c6
--- /dev/null
+++ b/yudao-ui-admin-vue3/plopfile.js
@@ -0,0 +1,7 @@
+const viewGenerator = require('./plop/view/prompt.js')
+const componentGenerator = require('./plop/component/prompt.js')
+
+module.exports = function (plop) {
+ plop.setGenerator('view', viewGenerator)
+ plop.setGenerator('component', componentGenerator)
+}
diff --git a/yudao-ui-admin-vue3/pnpm-lock.yaml b/yudao-ui-admin-vue3/pnpm-lock.yaml
new file mode 100644
index 0000000000..eb0c6158ec
--- /dev/null
+++ b/yudao-ui-admin-vue3/pnpm-lock.yaml
@@ -0,0 +1,7452 @@
+lockfileVersion: 5.4
+
+specifiers:
+ '@commitlint/cli': ^17.0.3
+ '@commitlint/config-conventional': ^17.0.3
+ '@iconify/iconify': ^2.2.1
+ '@iconify/json': ^2.1.79
+ '@intlify/vite-plugin-vue-i18n': ^5.0.0
+ '@purge-icons/generated': ^0.8.1
+ '@types/intro.js': ^5.1.0
+ '@types/lodash-es': ^4.17.6
+ '@types/node': ^18.0.6
+ '@types/nprogress': ^0.2.0
+ '@types/qrcode': ^1.4.2
+ '@types/qs': ^6.9.7
+ '@typescript-eslint/eslint-plugin': ^5.30.6
+ '@typescript-eslint/parser': ^5.30.6
+ '@vitejs/plugin-vue': ^3.0.1
+ '@vitejs/plugin-vue-jsx': ^2.0.0
+ '@vueuse/core': ^8.9.4
+ '@wangeditor/editor': ^5.1.11
+ '@wangeditor/editor-for-vue': ^5.1.10
+ '@zxcvbn-ts/core': ^2.0.3
+ animate.css: ^4.1.1
+ autoprefixer: ^10.4.7
+ axios: ^0.27.2
+ dayjs: ^1.11.3
+ echarts: ^5.3.3
+ echarts-wordcloud: ^2.0.0
+ element-plus: 2.2.9
+ eslint: ^8.20.0
+ eslint-config-prettier: ^8.5.0
+ eslint-define-config: ^1.5.1
+ eslint-plugin-prettier: ^4.2.1
+ eslint-plugin-vue: ^9.2.0
+ intro.js: ^6.0.0
+ less: ^4.1.3
+ lint-staged: ^13.0.3
+ lodash-es: ^4.17.21
+ mitt: ^3.0.0
+ nprogress: ^0.2.0
+ pinia: ^2.0.16
+ pinia-plugin-persist: ^1.0.0
+ plop: ^3.1.1
+ postcss: ^8.4.14
+ postcss-html: ^1.5.0
+ postcss-less: ^6.0.0
+ prettier: ^2.7.1
+ pretty-quick: ^3.1.3
+ qrcode: ^1.5.1
+ qs: ^6.11.0
+ rimraf: ^3.0.2
+ rollup: ^2.77.0
+ stylelint: ^14.9.1
+ stylelint-config-html: ^1.1.0
+ stylelint-config-prettier: ^9.0.3
+ stylelint-config-recommended: ^8.0.0
+ stylelint-config-standard: ^26.0.0
+ stylelint-order: ^5.0.0
+ typescript: 4.7.4
+ unplugin-vue-define-options: ^0.6.2
+ vite: 3.0.1
+ vite-plugin-eslint: ^1.6.1
+ vite-plugin-html: ^3.2.0
+ vite-plugin-purge-icons: ^0.8.1
+ vite-plugin-style-import: ^1.4.1
+ vite-plugin-svg-icons: ^2.0.1
+ vite-plugin-windicss: ^1.8.7
+ vue: 3.2.37
+ vue-cropper: ^1.0.3
+ vue-i18n: 9.1.10
+ vue-router: ^4.1.2
+ vue-tsc: ^0.38.8
+ vue-types: ^4.1.1
+ web-storage-cache: ^1.1.1
+ windicss: ^3.5.6
+ windicss-analysis: ^0.3.5
+
+dependencies:
+ '@iconify/iconify': 2.2.1
+ '@vueuse/core': 8.9.4_vue@3.2.37
+ '@wangeditor/editor': 5.1.11
+ '@wangeditor/editor-for-vue': 5.1.10_wyweaejqxhtklhndhf2ynbwhvm
+ '@zxcvbn-ts/core': 2.0.3
+ animate.css: 4.1.1
+ axios: 0.27.2
+ dayjs: 1.11.3
+ echarts: 5.3.3
+ echarts-wordcloud: 2.0.0_echarts@5.3.3
+ element-plus: 2.2.9_vue@3.2.37
+ intro.js: 6.0.0
+ lodash-es: registry.nlark.com/lodash-es/4.17.21
+ mitt: 3.0.0
+ nprogress: 0.2.0
+ pinia: 2.0.16_j6bzmzd4ujpabbp5objtwxyjp4
+ pinia-plugin-persist: 1.0.0_pinia@2.0.16+vue@3.2.37
+ qrcode: 1.5.1
+ qs: 6.11.0
+ vue: 3.2.37
+ vue-cropper: 1.0.3
+ vue-i18n: 9.1.10_vue@3.2.37
+ vue-router: 4.1.2_vue@3.2.37
+ vue-types: 4.1.1_vue@3.2.37
+ web-storage-cache: 1.1.1
+
+devDependencies:
+ '@commitlint/cli': 17.0.3
+ '@commitlint/config-conventional': 17.0.3
+ '@iconify/json': 2.1.79
+ '@intlify/vite-plugin-vue-i18n': 5.0.0_vite@3.0.1+vue-i18n@9.1.10
+ '@purge-icons/generated': 0.8.1
+ '@types/intro.js': 5.1.0
+ '@types/lodash-es': 4.17.6
+ '@types/node': 18.0.6
+ '@types/nprogress': 0.2.0
+ '@types/qrcode': 1.4.2
+ '@types/qs': 6.9.7
+ '@typescript-eslint/eslint-plugin': 5.30.6_b7n364ggt6o4xlkgyoaww3ph3q
+ '@typescript-eslint/parser': 5.30.6_he2ccbldppg44uulnyq4rwocfa
+ '@vitejs/plugin-vue': 3.0.1_vite@3.0.1+vue@3.2.37
+ '@vitejs/plugin-vue-jsx': 2.0.0_vite@3.0.1+vue@3.2.37
+ autoprefixer: 10.4.7_postcss@8.4.14
+ eslint: 8.20.0
+ eslint-config-prettier: 8.5.0_eslint@8.20.0
+ eslint-define-config: 1.5.1
+ eslint-plugin-prettier: 4.2.1_g4fztgbwjyq2fvmcscny2sj6fy
+ eslint-plugin-vue: 9.2.0_eslint@8.20.0
+ less: 4.1.3
+ lint-staged: 13.0.3
+ plop: 3.1.1
+ postcss: 8.4.14
+ postcss-html: 1.5.0
+ postcss-less: 6.0.0_postcss@8.4.14
+ prettier: 2.7.1
+ pretty-quick: 3.1.3_prettier@2.7.1
+ rimraf: 3.0.2
+ rollup: 2.77.0
+ stylelint: 14.9.1
+ stylelint-config-html: 1.1.0_5rxrxgs7sjazj2ve56ds3kmipi
+ stylelint-config-prettier: 9.0.3_stylelint@14.9.1
+ stylelint-config-recommended: 8.0.0_stylelint@14.9.1
+ stylelint-config-standard: 26.0.0_stylelint@14.9.1
+ stylelint-order: 5.0.0_stylelint@14.9.1
+ typescript: 4.7.4
+ unplugin-vue-define-options: 0.6.2_r5lvqzud3cqtmwu636rwgh22ui
+ vite: 3.0.1_less@4.1.3
+ vite-plugin-eslint: 1.6.1_eslint@8.20.0+vite@3.0.1
+ vite-plugin-html: 3.2.0_vite@3.0.1
+ vite-plugin-purge-icons: 0.8.1_vite@3.0.1
+ vite-plugin-style-import: 1.4.1_vite@3.0.1
+ vite-plugin-svg-icons: 2.0.1_vite@3.0.1
+ vite-plugin-windicss: 1.8.7_vite@3.0.1
+ vue-tsc: 0.38.8_typescript@4.7.4
+ windicss: 3.5.6
+ windicss-analysis: 0.3.5
+
+packages:
+
+ /@ampproject/remapping/2.1.1:
+ resolution: {integrity: sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.4
+ dev: true
+
+ /@antfu/utils/0.5.2:
+ resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==}
+ dev: true
+
+ /@babel/code-frame/7.16.7:
+ resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.16.10
+ dev: true
+
+ /@babel/code-frame/7.18.6:
+ resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.18.6
+ dev: true
+
+ /@babel/compat-data/7.18.8:
+ resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/core/7.18.9:
+ resolution: {integrity: sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.1.1
+ '@babel/code-frame': 7.18.6
+ '@babel/generator': 7.18.9
+ '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9
+ '@babel/helper-module-transforms': 7.18.9
+ '@babel/helpers': 7.18.9
+ '@babel/parser': 7.18.9
+ '@babel/template': 7.18.6
+ '@babel/traverse': 7.18.9
+ '@babel/types': 7.18.9
+ convert-source-map: 1.8.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.1
+ semver: 6.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/generator/7.18.9:
+ resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ '@jridgewell/gen-mapping': 0.3.2
+ jsesc: 2.5.2
+ dev: true
+
+ /@babel/helper-annotate-as-pure/7.18.6:
+ resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.9:
+ resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/compat-data': 7.18.8
+ '@babel/core': 7.18.9
+ '@babel/helper-validator-option': 7.18.6
+ browserslist: 4.20.3
+ semver: 6.3.0
+ dev: true
+
+ /@babel/helper-create-class-features-plugin/7.18.9_@babel+core@7.18.9:
+ resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.18.9
+ '@babel/helper-annotate-as-pure': 7.18.6
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-function-name': 7.18.9
+ '@babel/helper-member-expression-to-functions': 7.18.9
+ '@babel/helper-optimise-call-expression': 7.18.6
+ '@babel/helper-replace-supers': 7.18.9
+ '@babel/helper-split-export-declaration': 7.18.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-environment-visitor/7.16.7:
+ resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-environment-visitor/7.18.9:
+ resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-function-name/7.17.9:
+ resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.18.6
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-function-name/7.18.9:
+ resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.18.6
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-hoist-variables/7.16.7:
+ resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-hoist-variables/7.18.6:
+ resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-member-expression-to-functions/7.18.9:
+ resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-module-imports/7.16.7:
+ resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-module-imports/7.18.6:
+ resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-module-transforms/7.18.9:
+ resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/helper-simple-access': 7.18.6
+ '@babel/helper-split-export-declaration': 7.18.6
+ '@babel/helper-validator-identifier': 7.18.6
+ '@babel/template': 7.18.6
+ '@babel/traverse': 7.18.9
+ '@babel/types': 7.18.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-optimise-call-expression/7.18.6:
+ resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-plugin-utils/7.16.7:
+ resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-plugin-utils/7.18.9:
+ resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-replace-supers/7.18.9:
+ resolution: {integrity: sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-member-expression-to-functions': 7.18.9
+ '@babel/helper-optimise-call-expression': 7.18.6
+ '@babel/traverse': 7.18.9
+ '@babel/types': 7.18.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/helper-simple-access/7.18.6:
+ resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-split-export-declaration/7.16.7:
+ resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-split-export-declaration/7.18.6:
+ resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/helper-validator-identifier/7.16.7:
+ resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-identifier/7.18.6:
+ resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-option/7.18.6:
+ resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helpers/7.18.9:
+ resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.18.6
+ '@babel/traverse': 7.18.9
+ '@babel/types': 7.18.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/highlight/7.16.10:
+ resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.16.7
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ dev: true
+
+ /@babel/highlight/7.18.6:
+ resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.18.6
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ dev: true
+
+ /@babel/parser/7.17.9:
+ resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.18.9
+
+ /@babel/parser/7.18.9:
+ resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.9:
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.18.9
+ '@babel/helper-plugin-utils': 7.16.7
+ dev: true
+
+ /@babel/plugin-syntax-jsx/7.16.5_@babel+core@7.18.9:
+ resolution: {integrity: sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.18.9
+ '@babel/helper-plugin-utils': 7.18.9
+ dev: true
+
+ /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.9:
+ resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.18.9
+ '@babel/helper-plugin-utils': 7.18.9
+ dev: true
+
+ /@babel/plugin-transform-typescript/7.18.8_@babel+core@7.18.9:
+ resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.18.9
+ '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9
+ '@babel/helper-plugin-utils': 7.18.9
+ '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/runtime/7.17.2:
+ resolution: {integrity: sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.13.9
+ dev: false
+
+ /@babel/template/7.16.7:
+ resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/parser': 7.18.9
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/template/7.18.6:
+ resolution: {integrity: sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/parser': 7.18.9
+ '@babel/types': 7.18.9
+ dev: true
+
+ /@babel/traverse/7.17.9:
+ resolution: {integrity: sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/generator': 7.18.9
+ '@babel/helper-environment-visitor': 7.16.7
+ '@babel/helper-function-name': 7.17.9
+ '@babel/helper-hoist-variables': 7.16.7
+ '@babel/helper-split-export-declaration': 7.16.7
+ '@babel/parser': 7.18.9
+ '@babel/types': 7.18.9
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/traverse/7.18.9:
+ resolution: {integrity: sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/generator': 7.18.9
+ '@babel/helper-environment-visitor': 7.18.9
+ '@babel/helper-function-name': 7.18.9
+ '@babel/helper-hoist-variables': 7.18.6
+ '@babel/helper-split-export-declaration': 7.18.6
+ '@babel/parser': 7.18.9
+ '@babel/types': 7.18.9
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/types/7.17.0:
+ resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.16.7
+ to-fast-properties: 2.0.0
+ dev: true
+
+ /@babel/types/7.18.9:
+ resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.18.6
+ to-fast-properties: 2.0.0
+
+ /@commitlint/cli/17.0.3:
+ resolution: {integrity: sha512-oAo2vi5d8QZnAbtU5+0cR2j+A7PO8zuccux65R/EycwvsZrDVyW518FFrnJK2UQxbRtHFFIG+NjQ6vOiJV0Q8A==}
+ engines: {node: '>=v14'}
+ hasBin: true
+ dependencies:
+ '@commitlint/format': 17.0.0
+ '@commitlint/lint': 17.0.3
+ '@commitlint/load': 17.0.3
+ '@commitlint/read': 17.0.0
+ '@commitlint/types': 17.0.0
+ execa: 5.1.1
+ lodash: 4.17.21
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ yargs: 17.3.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ dev: true
+
+ /@commitlint/config-conventional/17.0.3:
+ resolution: {integrity: sha512-HCnzTm5ATwwwzNVq5Y57poS0a1oOOcd5pc1MmBpLbGmSysc4i7F/++JuwtdFPu16sgM3H9J/j2zznRLOSGVO2A==}
+ engines: {node: '>=v14'}
+ dependencies:
+ conventional-changelog-conventionalcommits: 5.0.0
+ dev: true
+
+ /@commitlint/config-validator/17.0.3:
+ resolution: {integrity: sha512-3tLRPQJKapksGE7Kee9axv+9z5I2GDHitDH4q63q7NmNA0wkB+DAorJ0RHz2/K00Zb1/MVdHzhCga34FJvDihQ==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.0.0
+ ajv: 8.11.0
+ dev: true
+
+ /@commitlint/ensure/17.0.0:
+ resolution: {integrity: sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.0.0
+ lodash: 4.17.21
+ dev: true
+
+ /@commitlint/execute-rule/17.0.0:
+ resolution: {integrity: sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/format/17.0.0:
+ resolution: {integrity: sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.0.0
+ chalk: 4.1.2
+ dev: true
+
+ /@commitlint/is-ignored/17.0.3:
+ resolution: {integrity: sha512-/wgCXAvPtFTQZxsVxj7owLeRf5wwzcXLaYmrZPR4a87iD4sCvUIRl1/ogYrtOyUmHwWfQsvjqIB4mWE/SqWSnA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.0.0
+ semver: 7.3.7
+ dev: true
+
+ /@commitlint/lint/17.0.3:
+ resolution: {integrity: sha512-2o1fk7JUdxBUgszyt41sHC/8Nd5PXNpkmuOo9jvGIjDHzOwXyV0PSdbEVTH3xGz9NEmjohFHr5l+N+T9fcxong==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/is-ignored': 17.0.3
+ '@commitlint/parse': 17.0.0
+ '@commitlint/rules': 17.0.0
+ '@commitlint/types': 17.0.0
+ dev: true
+
+ /@commitlint/load/17.0.3:
+ resolution: {integrity: sha512-3Dhvr7GcKbKa/ey4QJ5MZH3+J7QFlARohUow6hftQyNjzoXXROm+RwpBes4dDFrXG1xDw9QPXA7uzrOShCd4bw==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/config-validator': 17.0.3
+ '@commitlint/execute-rule': 17.0.0
+ '@commitlint/resolve-extends': 17.0.3
+ '@commitlint/types': 17.0.0
+ '@types/node': 18.0.6
+ chalk: 4.1.2
+ cosmiconfig: 7.0.1
+ cosmiconfig-typescript-loader: 2.0.0_tdn3ypgnfy6bmey2q4hu5jonwi
+ lodash: 4.17.21
+ resolve-from: 5.0.0
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ dev: true
+
+ /@commitlint/message/17.0.0:
+ resolution: {integrity: sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/parse/17.0.0:
+ resolution: {integrity: sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.0.0
+ conventional-changelog-angular: 5.0.13
+ conventional-commits-parser: 3.2.4
+ dev: true
+
+ /@commitlint/read/17.0.0:
+ resolution: {integrity: sha512-zkuOdZayKX3J6F6mPnVMzohK3OBrsEdOByIqp4zQjA9VLw1hMsDEFQ18rKgUc2adkZar+4S01QrFreDCfZgbxA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/top-level': 17.0.0
+ '@commitlint/types': 17.0.0
+ fs-extra: 10.0.1
+ git-raw-commits: 2.0.11
+ dev: true
+
+ /@commitlint/resolve-extends/17.0.3:
+ resolution: {integrity: sha512-H/RFMvrcBeJCMdnVC4i8I94108UDccIHrTke2tyQEg9nXQnR5/Hd6MhyNWkREvcrxh9Y+33JLb+PiPiaBxCtBA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/config-validator': 17.0.3
+ '@commitlint/types': 17.0.0
+ import-fresh: 3.3.0
+ lodash: 4.17.21
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ dev: true
+
+ /@commitlint/rules/17.0.0:
+ resolution: {integrity: sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/ensure': 17.0.0
+ '@commitlint/message': 17.0.0
+ '@commitlint/to-lines': 17.0.0
+ '@commitlint/types': 17.0.0
+ execa: 5.1.1
+ dev: true
+
+ /@commitlint/to-lines/17.0.0:
+ resolution: {integrity: sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/top-level/17.0.0:
+ resolution: {integrity: sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==}
+ engines: {node: '>=v14'}
+ dependencies:
+ find-up: 5.0.0
+ dev: true
+
+ /@commitlint/types/17.0.0:
+ resolution: {integrity: sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==}
+ engines: {node: '>=v14'}
+ dependencies:
+ chalk: 4.1.2
+ dev: true
+
+ /@cspotcode/source-map-consumer/0.8.0:
+ resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==}
+ engines: {node: '>= 12'}
+ dev: true
+
+ /@cspotcode/source-map-support/0.7.0:
+ resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@cspotcode/source-map-consumer': 0.8.0
+ dev: true
+
+ /@csstools/selector-specificity/2.0.1_444rcjjorr3kpoqtvoodsr46pu:
+ resolution: {integrity: sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA==}
+ engines: {node: ^12 || ^14 || >=16}
+ peerDependencies:
+ postcss: ^8.3
+ postcss-selector-parser: ^6.0.10
+ dependencies:
+ postcss: 8.4.14
+ postcss-selector-parser: 6.0.10
+ dev: true
+
+ /@ctrl/tinycolor/3.4.1:
+ resolution: {integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /@element-plus/icons-vue/2.0.6_vue@3.2.37:
+ resolution: {integrity: sha512-lPpG8hYkjL/Z97DH5Ei6w6o22Z4YdNglWCNYOPcB33JCF2A4wye6HFgSI7hEt9zdLyxlSpiqtgf9XcYU+m5mew==}
+ peerDependencies:
+ vue: ^3.2.0
+ dependencies:
+ vue: 3.2.37
+ dev: false
+
+ /@eslint/eslintrc/1.3.0:
+ resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.3.2
+ globals: 13.15.0
+ ignore: 5.2.0
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@floating-ui/core/0.7.3:
+ resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==}
+ dev: false
+
+ /@floating-ui/dom/0.5.4:
+ resolution: {integrity: sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==}
+ dependencies:
+ '@floating-ui/core': 0.7.3
+ dev: false
+
+ /@humanwhocodes/config-array/0.9.2:
+ resolution: {integrity: sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/object-schema/1.2.1:
+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ dev: true
+
+ /@iconify/iconify/2.1.2:
+ resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@iconify/iconify/-/iconify-2.1.2.tgz}
+ dependencies:
+ cross-fetch: 3.1.5
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /@iconify/iconify/2.2.1:
+ resolution: {integrity: sha512-WJzw+3iicrF/tbjbxxRinSgy5FHdJoz/egTqwi3xCDkNRJPq482RX1iyaWrjNuY2vMNSPkQMuqHvZDXgA+WnwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@iconify/iconify/-/iconify-2.2.1.tgz}
+
+ /@iconify/json/2.1.79:
+ resolution: {integrity: sha512-4jCX9hRhZmJqeUQ+gTVH867FYdUvBkIZ4UYwWstHXPMIuCVsfqXy5OZn8wDIkEYfvfNy+s1m28/g4PSrWzdUtg==}
+ dependencies:
+ '@iconify/types': 1.1.0
+ pathe: 0.3.1
+ dev: true
+
+ /@iconify/types/1.1.0:
+ resolution: {integrity: sha512-Jh0llaK2LRXQoYsorIH8maClebsnzTcve+7U3rQUSnC11X4jtPnFuyatqFLvMxZ8MLG8dB4zfHsbPfuvxluONw==}
+ dev: true
+
+ /@intlify/bundle-utils/3.1.0_vue-i18n@9.1.10:
+ resolution: {integrity: sha512-ghlJ0kR2cCQ8D+poKknC0Xx0ncOt3J3os7CcIAqqIWVF7k6AtGoCDnIru+YzlZcvFRNmP9wEZ7jKliojCdAWNg==}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ petite-vue-i18n: '*'
+ vue-i18n: '*'
+ peerDependenciesMeta:
+ petite-vue-i18n:
+ optional: true
+ vue-i18n:
+ optional: true
+ dependencies:
+ '@intlify/message-compiler': 9.2.0-beta.39
+ '@intlify/shared': 9.2.0-beta.39
+ jsonc-eslint-parser: 1.4.1
+ source-map: 0.6.1
+ vue-i18n: 9.1.10_vue@3.2.37
+ yaml-eslint-parser: 0.3.2
+ dev: true
+
+ /@intlify/core-base/9.1.10:
+ resolution: {integrity: sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@intlify/devtools-if': 9.1.10
+ '@intlify/message-compiler': 9.1.10
+ '@intlify/message-resolver': 9.1.10
+ '@intlify/runtime': 9.1.10
+ '@intlify/shared': 9.1.10
+ '@intlify/vue-devtools': 9.1.10
+
+ /@intlify/devtools-if/9.1.10:
+ resolution: {integrity: sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@intlify/shared': 9.1.10
+
+ /@intlify/message-compiler/9.1.10:
+ resolution: {integrity: sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@intlify/message-resolver': 9.1.10
+ '@intlify/shared': 9.1.10
+ source-map: 0.6.1
+
+ /@intlify/message-compiler/9.2.0-beta.39:
+ resolution: {integrity: sha512-wHb3zzk/H3Wfx9U/SaXVenQ/qq2suqJMl/ppu+IdyGGMZxqC57zFqkgwWxEpqP4DzGeisjHe2myjLZQyV1haEQ==}
+ engines: {node: '>= 14'}
+ dependencies:
+ '@intlify/shared': 9.2.0-beta.39
+ source-map: 0.6.1
+ dev: true
+
+ /@intlify/message-resolver/9.1.10:
+ resolution: {integrity: sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==}
+ engines: {node: '>= 10'}
+
+ /@intlify/runtime/9.1.10:
+ resolution: {integrity: sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@intlify/message-compiler': 9.1.10
+ '@intlify/message-resolver': 9.1.10
+ '@intlify/shared': 9.1.10
+
+ /@intlify/shared/9.1.10:
+ resolution: {integrity: sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==}
+ engines: {node: '>= 10'}
+
+ /@intlify/shared/9.2.0-beta.39:
+ resolution: {integrity: sha512-FqzpkZVk/cTsywWc4mVbI2/fDQwYm8oXVwi7yuassiLps3yJK7P0s6grZaaXIX8gMODNLjJtJPd2KEOSj1lUyw==}
+ engines: {node: '>= 14'}
+ dev: true
+
+ /@intlify/vite-plugin-vue-i18n/5.0.0_vite@3.0.1+vue-i18n@9.1.10:
+ resolution: {integrity: sha512-49W7y2b0m6Cg6qGoBkjdNgxyzFx3iOSbnxvDaWcN65raaceJVuwCwxXX1SqJbjHTg32rpTFi4jSlroqAV9Rr0w==}
+ engines: {node: '>= 14.6'}
+ peerDependencies:
+ petite-vue-i18n: '*'
+ vite: ^2.9.0 || ^3.0.0
+ vue-i18n: '*'
+ peerDependenciesMeta:
+ petite-vue-i18n:
+ optional: true
+ vite:
+ optional: true
+ vue-i18n:
+ optional: true
+ dependencies:
+ '@intlify/bundle-utils': 3.1.0_vue-i18n@9.1.10
+ '@intlify/shared': 9.2.0-beta.39
+ '@rollup/pluginutils': 4.2.1
+ debug: 4.3.4
+ fast-glob: 3.2.11
+ source-map: 0.6.1
+ vite: 3.0.1_less@4.1.3
+ vue-i18n: 9.1.10_vue@3.2.37
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@intlify/vue-devtools/9.1.10:
+ resolution: {integrity: sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@intlify/message-resolver': 9.1.10
+ '@intlify/runtime': 9.1.10
+ '@intlify/shared': 9.1.10
+
+ /@jridgewell/gen-mapping/0.3.2:
+ resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.11
+ '@jridgewell/trace-mapping': 0.3.14
+ dev: true
+
+ /@jridgewell/resolve-uri/3.0.5:
+ resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/set-array/1.1.2:
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec/1.4.11:
+ resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==}
+ dev: true
+
+ /@jridgewell/trace-mapping/0.3.14:
+ resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.0.5
+ '@jridgewell/sourcemap-codec': 1.4.11
+ dev: true
+
+ /@jridgewell/trace-mapping/0.3.4:
+ resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.0.5
+ '@jridgewell/sourcemap-codec': 1.4.11
+ dev: true
+
+ /@nodelib/fs.scandir/2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat/2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk/1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.13.0
+ dev: true
+
+ /@polka/url/1.0.0-next.21:
+ resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
+ dev: true
+
+ /@purge-icons/core/0.8.0:
+ resolution: {integrity: sha512-8L6hP1U9XQO5B7kvquVJ5N7jzFvO0LZLXhBCjUQzzJzi42i6MAUanVKROApqbBuh21o9tmPwvNUg0xPe/uftRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@purge-icons/core/-/core-0.8.0.tgz}
+ dependencies:
+ '@iconify/iconify': 2.1.2
+ axios: 0.26.1_debug@4.3.4
+ debug: 4.3.4
+ fast-glob: 3.2.11
+ fs-extra: 10.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@purge-icons/generated/0.8.1:
+ resolution: {integrity: sha512-rIExGA33EGKEToqtc8WfpboaR7or1XRp+KV1Y5v/P0Rq7G5Me95DmP3ow/MpG7ql+XZ9xPzyS2naGRx5358+6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@purge-icons/generated/-/generated-0.8.1.tgz}
+ dependencies:
+ '@iconify/iconify': 2.2.1
+ dev: true
+
+ /@rollup/pluginutils/4.2.0:
+ resolution: {integrity: sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA==}
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /@rollup/pluginutils/4.2.1:
+ resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /@sxzz/popperjs-es/2.11.7:
+ resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+ dev: false
+
+ /@transloadit/prettier-bytes/0.0.7:
+ resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==}
+ dev: false
+
+ /@trysound/sax/0.2.0:
+ resolution: {integrity: sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@trysound/sax/download/@trysound/sax-0.2.0.tgz}
+ engines: {node: '>=10.13.0'}
+ dev: true
+
+ /@tsconfig/node10/1.0.8:
+ resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==}
+ dev: true
+
+ /@tsconfig/node12/1.0.9:
+ resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==}
+ dev: true
+
+ /@tsconfig/node14/1.0.1:
+ resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==}
+ dev: true
+
+ /@tsconfig/node16/1.0.2:
+ resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==}
+ dev: true
+
+ /@types/eslint/8.4.2:
+ resolution: {integrity: sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==}
+ dependencies:
+ '@types/estree': 0.0.51
+ '@types/json-schema': 7.0.9
+ dev: true
+
+ /@types/estree/0.0.51:
+ resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==}
+ dev: true
+
+ /@types/event-emitter/0.3.3:
+ resolution: {integrity: sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==}
+ dev: false
+
+ /@types/fined/1.1.3:
+ resolution: {integrity: sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==}
+ dev: true
+
+ /@types/inquirer/8.2.1:
+ resolution: {integrity: sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==}
+ dependencies:
+ '@types/through': 0.0.30
+ rxjs: 7.5.5
+ dev: true
+
+ /@types/intro.js/5.1.0:
+ resolution: {integrity: sha512-XHkD6t7f3bn8B2//kOlznRzmk15KvsRkFpY6i8em/eDphblQ8QHbCiW+6OPjX7CxI0aVNVJK6Yamb2h2KMmFdA==}
+ dev: true
+
+ /@types/json-schema/7.0.9:
+ resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==}
+ dev: true
+
+ /@types/liftoff/4.0.0:
+ resolution: {integrity: sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==}
+ dependencies:
+ '@types/fined': 1.1.3
+ '@types/node': 18.0.6
+ dev: true
+
+ /@types/lodash-es/4.17.6:
+ resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/lodash-es/-/lodash-es-4.17.6.tgz}
+ dependencies:
+ '@types/lodash': 4.14.178
+
+ /@types/lodash/4.14.178:
+ resolution: {integrity: sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/lodash/-/lodash-4.14.178.tgz}
+
+ /@types/lodash/4.14.182:
+ resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==}
+ dev: false
+
+ /@types/minimatch/3.0.5:
+ resolution: {integrity: sha1-EAHMXmo3BLg8I2An538vWOoBD0A=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.5.tgz}
+ dev: true
+
+ /@types/minimist/1.2.2:
+ resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
+ dev: true
+
+ /@types/node/18.0.6:
+ resolution: {integrity: sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==}
+ dev: true
+
+ /@types/normalize-package-data/2.4.1:
+ resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
+ dev: true
+
+ /@types/nprogress/0.2.0:
+ resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/nprogress/download/@types/nprogress-0.2.0.tgz}
+ dev: true
+
+ /@types/parse-json/4.0.0:
+ resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
+ dev: true
+
+ /@types/qrcode/1.4.2:
+ resolution: {integrity: sha512-7uNT9L4WQTNJejHTSTdaJhfBSCN73xtXaHFyBJ8TSwiLhe4PRuTue7Iph0s2nG9R/ifUaSnGhLUOZavlBEqDWQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/qrcode/download/@types/qrcode-1.4.2.tgz}
+ dependencies:
+ '@types/node': 18.0.6
+ dev: true
+
+ /@types/qs/6.9.7:
+ resolution: {integrity: sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/qs/download/@types/qs-6.9.7.tgz}
+ dev: true
+
+ /@types/svgo/2.6.1:
+ resolution: {integrity: sha512-4BfUnd19L25BD2iRyZTNuG4pfL9HBs+rvF7zp5maKhbX42uOpc5prGdBXXmCdHlVZfTWq8pNP/vxQt9v8ACxqQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@types/svgo/-/svgo-2.6.1.tgz}
+ dependencies:
+ '@types/node': 18.0.6
+ dev: true
+
+ /@types/through/0.0.30:
+ resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==}
+ dependencies:
+ '@types/node': 18.0.6
+ dev: true
+
+ /@types/web-bluetooth/0.0.14:
+ resolution: {integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==}
+ dev: false
+
+ /@typescript-eslint/eslint-plugin/5.30.6_b7n364ggt6o4xlkgyoaww3ph3q:
+ resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.30.6_he2ccbldppg44uulnyq4rwocfa
+ '@typescript-eslint/scope-manager': 5.30.6
+ '@typescript-eslint/type-utils': 5.30.6_he2ccbldppg44uulnyq4rwocfa
+ '@typescript-eslint/utils': 5.30.6_he2ccbldppg44uulnyq4rwocfa
+ debug: 4.3.4
+ eslint: 8.20.0
+ functional-red-black-tree: 1.0.1
+ ignore: 5.2.0
+ regexpp: 3.2.0
+ semver: 7.3.7
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser/5.30.6_he2ccbldppg44uulnyq4rwocfa:
+ resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.30.6
+ '@typescript-eslint/types': 5.30.6
+ '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.7.4
+ debug: 4.3.4
+ eslint: 8.20.0
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager/5.30.6:
+ resolution: {integrity: sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.30.6
+ '@typescript-eslint/visitor-keys': 5.30.6
+ dev: true
+
+ /@typescript-eslint/type-utils/5.30.6_he2ccbldppg44uulnyq4rwocfa:
+ resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/utils': 5.30.6_he2ccbldppg44uulnyq4rwocfa
+ debug: 4.3.4
+ eslint: 8.20.0
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types/5.30.6:
+ resolution: {integrity: sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree/5.30.6_typescript@4.7.4:
+ resolution: {integrity: sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.30.6
+ '@typescript-eslint/visitor-keys': 5.30.6
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.7
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils/5.30.6_he2ccbldppg44uulnyq4rwocfa:
+ resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@types/json-schema': 7.0.9
+ '@typescript-eslint/scope-manager': 5.30.6
+ '@typescript-eslint/types': 5.30.6
+ '@typescript-eslint/typescript-estree': 5.30.6_typescript@4.7.4
+ eslint: 8.20.0
+ eslint-scope: 5.1.1
+ eslint-utils: 3.0.0_eslint@8.20.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys/5.30.6:
+ resolution: {integrity: sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.30.6
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /@uppy/companion-client/2.0.4:
+ resolution: {integrity: sha512-Uc3bJzgSdvB+wKYoAbmhY7jv5DlziZQdK0w+5Eku2M93xcOictgJPoti94rj/PtZRH3gyszDkwACERs/bfbI7g==}
+ dependencies:
+ '@uppy/utils': 4.0.5
+ namespace-emitter: 2.0.1
+ dev: false
+
+ /@uppy/core/2.1.4:
+ resolution: {integrity: sha512-tVC44D66BbISD3gJaqH3xUrVEP5Pah0cDQV98sI3N6W6yMSOW4m3xuhqhcWvEd4DolKCp0vyvc/pW6rsQbMVRA==}
+ dependencies:
+ '@transloadit/prettier-bytes': 0.0.7
+ '@uppy/store-default': 2.0.3
+ '@uppy/utils': 4.0.5
+ lodash.throttle: 4.1.1
+ mime-match: 1.0.2
+ namespace-emitter: 2.0.1
+ nanoid: 3.3.4
+ preact: 10.6.5
+ dev: false
+
+ /@uppy/store-default/2.0.3:
+ resolution: {integrity: sha512-2BGlN1sW0cFv4rOqTK8dfSg579S984N1HxCJxLFqeW9nWD6zd/O8Omyd85tbxGQ+FLZLTmLOm/feD0YeCBMahg==}
+ dev: false
+
+ /@uppy/utils/4.0.5:
+ resolution: {integrity: sha512-uRv921A69UMjuWCLSC5tKXuIVoMOROVpFstIAQv5CoiCOCXyofcWpvAqELT7qlQJ5VRWha3uF5d/Z94SNnwxew==}
+ dependencies:
+ lodash.throttle: 4.1.1
+ dev: false
+
+ /@uppy/xhr-upload/2.0.7_@uppy+core@2.1.4:
+ resolution: {integrity: sha512-bzCc654B0HfNmL4BIr7gGTvg2pQBucYgPmAb4ST7jGyWlEJWbSxMXR/19zvISQzpJ6v1uP6q2ppgxGMqNdj/rA==}
+ peerDependencies:
+ '@uppy/core': ^2.1.4
+ dependencies:
+ '@uppy/companion-client': 2.0.4
+ '@uppy/core': 2.1.4
+ '@uppy/utils': 4.0.5
+ nanoid: 3.3.4
+ dev: false
+
+ /@vitejs/plugin-vue-jsx/2.0.0_vite@3.0.1+vue@3.2.37:
+ resolution: {integrity: sha512-WF9ApZ/ivyyW3volQfu0Td0KNPhcccYEaRNzNY1NxRLVJQLSX0nFqquv3e2g7MF74p1XZK4bGtDL2y5i5O5+1A==}
+ engines: {node: '>=14.18.0'}
+ peerDependencies:
+ vite: ^3.0.0
+ vue: ^3.0.0
+ dependencies:
+ '@babel/core': 7.18.9
+ '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.18.9
+ '@babel/plugin-transform-typescript': 7.18.8_@babel+core@7.18.9
+ '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.18.9
+ vite: 3.0.1_less@4.1.3
+ vue: 3.2.37
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@vitejs/plugin-vue/3.0.1_vite@3.0.1+vue@3.2.37:
+ resolution: {integrity: sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^3.0.0
+ vue: ^3.2.25
+ dependencies:
+ vite: 3.0.1_less@4.1.3
+ vue: 3.2.37
+ dev: true
+
+ /@volar/code-gen/0.38.8:
+ resolution: {integrity: sha512-e37jd+JwNjBpWiBblsdmYMbJ9bELiuj2yZrsXv1IVKpYNSfvS92ZiYjJqVXHUwpzNeZjFG0RCd5nTpbiebwANw==}
+ dependencies:
+ '@volar/source-map': 0.38.8
+ dev: true
+
+ /@volar/source-map/0.38.8:
+ resolution: {integrity: sha512-JZvpjW/z2U3wq5wvwcTounPrRAZuSl4hlVKr3y7y72bKr++6W05OnX7fl/ddw39G/wLHdI2ag5+4JWsSd/EYhg==}
+ dev: true
+
+ /@volar/vue-code-gen/0.38.8:
+ resolution: {integrity: sha512-iQVNmIu1TqnqTko+l9yeylmZipZ8zNH20XZAK9+48hkv2fEQnnJn5AI2W9Zb2M5DkGMpbYiJk9Fq1vm51YY1+g==}
+ dependencies:
+ '@volar/code-gen': 0.38.8
+ '@volar/source-map': 0.38.8
+ '@vue/compiler-core': 3.2.37
+ '@vue/compiler-dom': 3.2.37
+ '@vue/shared': 3.2.37
+ dev: true
+
+ /@volar/vue-typescript/0.38.8:
+ resolution: {integrity: sha512-7WeFt5piz9I6FKw2cQQCWm+75MxS6xCOGm300iu+hJORlroN2dwWbwj97pQnDGbjQbftCRplUYf0GqmhcOsanQ==}
+ dependencies:
+ '@volar/code-gen': 0.38.8
+ '@volar/source-map': 0.38.8
+ '@volar/vue-code-gen': 0.38.8
+ '@vue/compiler-sfc': 3.2.37
+ '@vue/reactivity': 3.2.37
+ dev: true
+
+ /@vue/babel-helper-vue-transform-on/1.0.2:
+ resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==}
+ dev: true
+
+ /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.18.9:
+ resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==}
+ dependencies:
+ '@babel/helper-module-imports': 7.16.7
+ '@babel/plugin-syntax-jsx': 7.16.5_@babel+core@7.18.9
+ '@babel/template': 7.16.7
+ '@babel/traverse': 7.17.9
+ '@babel/types': 7.17.0
+ '@vue/babel-helper-vue-transform-on': 1.0.2
+ camelcase: 6.2.1
+ html-tags: 3.2.0
+ svg-tags: 1.0.0
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+ dev: true
+
+ /@vue/compiler-core/3.2.37:
+ resolution: {integrity: sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==}
+ dependencies:
+ '@babel/parser': 7.17.9
+ '@vue/shared': 3.2.37
+ estree-walker: 2.0.2
+ source-map: 0.6.1
+
+ /@vue/compiler-dom/3.2.37:
+ resolution: {integrity: sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==}
+ dependencies:
+ '@vue/compiler-core': 3.2.37
+ '@vue/shared': 3.2.37
+
+ /@vue/compiler-sfc/3.2.37:
+ resolution: {integrity: sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==}
+ dependencies:
+ '@babel/parser': 7.17.9
+ '@vue/compiler-core': 3.2.37
+ '@vue/compiler-dom': 3.2.37
+ '@vue/compiler-ssr': 3.2.37
+ '@vue/reactivity-transform': 3.2.37
+ '@vue/shared': 3.2.37
+ estree-walker: 2.0.2
+ magic-string: 0.25.7
+ postcss: 8.4.14
+ source-map: 0.6.1
+
+ /@vue/compiler-ssr/3.2.37:
+ resolution: {integrity: sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==}
+ dependencies:
+ '@vue/compiler-dom': 3.2.37
+ '@vue/shared': 3.2.37
+
+ /@vue/devtools-api/6.1.4:
+ resolution: {integrity: sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==}
+
+ /@vue/reactivity-transform/3.2.37:
+ resolution: {integrity: sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==}
+ dependencies:
+ '@babel/parser': 7.17.9
+ '@vue/compiler-core': 3.2.37
+ '@vue/shared': 3.2.37
+ estree-walker: 2.0.2
+ magic-string: 0.25.7
+
+ /@vue/reactivity/3.2.37:
+ resolution: {integrity: sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==}
+ dependencies:
+ '@vue/shared': 3.2.37
+
+ /@vue/runtime-core/3.2.37:
+ resolution: {integrity: sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==}
+ dependencies:
+ '@vue/reactivity': 3.2.37
+ '@vue/shared': 3.2.37
+
+ /@vue/runtime-dom/3.2.37:
+ resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==}
+ dependencies:
+ '@vue/runtime-core': 3.2.37
+ '@vue/shared': 3.2.37
+ csstype: 2.6.19
+
+ /@vue/server-renderer/3.2.37_vue@3.2.37:
+ resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==}
+ peerDependencies:
+ vue: 3.2.37
+ dependencies:
+ '@vue/compiler-ssr': 3.2.37
+ '@vue/shared': 3.2.37
+ vue: 3.2.37
+
+ /@vue/shared/3.2.37:
+ resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==}
+
+ /@vueuse/core/8.9.4_vue@3.2.37:
+ resolution: {integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==}
+ peerDependencies:
+ '@vue/composition-api': ^1.1.0
+ vue: ^2.6.0 || ^3.2.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ vue:
+ optional: true
+ dependencies:
+ '@types/web-bluetooth': 0.0.14
+ '@vueuse/metadata': 8.9.4
+ '@vueuse/shared': 8.9.4_vue@3.2.37
+ vue: 3.2.37
+ vue-demi: 0.12.1_vue@3.2.37
+ dev: false
+
+ /@vueuse/metadata/8.9.4:
+ resolution: {integrity: sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==}
+ dev: false
+
+ /@vueuse/shared/8.9.4_vue@3.2.37:
+ resolution: {integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==}
+ peerDependencies:
+ '@vue/composition-api': ^1.1.0
+ vue: ^2.6.0 || ^3.2.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ vue:
+ optional: true
+ dependencies:
+ vue: 3.2.37
+ vue-demi: 0.12.1_vue@3.2.37
+ dev: false
+
+ /@wangeditor/basic-modules/1.1.3_wc2s6ucqguq7ye7cv5gs4ie3pa:
+ resolution: {integrity: sha512-TGJix4UelO46yAgwI946ctx4lSIJbYBwNvjSJ9Tf8mKr0WMCeLVBV+MV85rXPsfcmWtR4wBNwSg648Z+RbqRUg==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ lodash.throttle: ^4.1.1
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+ dependencies:
+ '@wangeditor/core': 1.1.8_bevuzdaogp7zvgcbkum7pdqkgy
+ dom7: 3.0.0
+ is-url: 1.2.4
+ lodash.throttle: 4.1.1
+ nanoid: 3.3.4
+ slate: 0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@wangeditor/code-highlight/1.0.2_f4mxrtym3fqiukj5pvowt5wic4:
+ resolution: {integrity: sha512-SCtOcUxjKqIso/LSxGSOaYr3G6MC2En0gNTyHIMCG928T0fo0ufaqp/vIXKQzVL2Y+X/CSAOB2EbrFlgGvr0AQ==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+ dependencies:
+ '@wangeditor/core': 1.1.8_bevuzdaogp7zvgcbkum7pdqkgy
+ dom7: 3.0.0
+ prismjs: 1.26.0
+ slate: 0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@wangeditor/core/1.1.8_bevuzdaogp7zvgcbkum7pdqkgy:
+ resolution: {integrity: sha512-TfCtAXfL/bgmUKQbtLEaboK7wH49G7BQqYoQsylZ7MyD1LhYnVLXp/4RzJbuIr4cV9Bs1Ncz1JoZ9tqDe6WImw==}
+ peerDependencies:
+ '@uppy/core': ^2.1.1
+ '@uppy/xhr-upload': ^2.0.3
+ dom7: ^3.0.0
+ is-hotkey: ^0.2.0
+ lodash.camelcase: ^4.3.0
+ lodash.clonedeep: ^4.5.0
+ lodash.debounce: ^4.0.8
+ lodash.foreach: ^4.5.0
+ lodash.isequal: ^4.5.0
+ lodash.throttle: ^4.1.1
+ lodash.toarray: ^4.4.0
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+ dependencies:
+ '@types/event-emitter': 0.3.3
+ '@uppy/core': 2.1.4
+ '@uppy/xhr-upload': 2.0.7_@uppy+core@2.1.4
+ dom7: 3.0.0
+ event-emitter: 0.3.5
+ html-void-elements: 2.0.1
+ i18next: 20.6.1
+ is-hotkey: 0.2.0
+ lodash.camelcase: 4.3.0
+ lodash.clonedeep: 4.5.0
+ lodash.debounce: 4.0.8
+ lodash.foreach: 4.5.0
+ lodash.isequal: 4.5.0
+ lodash.throttle: 4.1.1
+ lodash.toarray: 4.4.0
+ nanoid: 3.3.4
+ scroll-into-view-if-needed: 2.2.29
+ slate: 0.72.8
+ slate-history: 0.66.0_slate@0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@wangeditor/editor-for-vue/5.1.10_wyweaejqxhtklhndhf2ynbwhvm:
+ resolution: {integrity: sha512-OdtMnMt0HpYriY1+Efo3KHviUB5zwlZIaHypNw5MPRn8uFq3MFLET5u8pbB/PiEF5Ff88YAp7T9Xw1dvJzT8sA==}
+ peerDependencies:
+ '@wangeditor/editor': '>=5.0.0'
+ vue: ^3.0.5
+ dependencies:
+ '@wangeditor/editor': 5.1.11
+ vue: 3.2.37
+ dev: false
+
+ /@wangeditor/editor/5.1.11:
+ resolution: {integrity: sha512-jJbY2OirSy16UY9OkOCBw0DhQpOzTIGRLYL724wYSWf9nO6DpO21bemmEoDDF5zULtabEm3w0dvSxTSVd7amLw==}
+ dependencies:
+ '@uppy/core': 2.1.4
+ '@uppy/xhr-upload': 2.0.7_@uppy+core@2.1.4
+ '@wangeditor/basic-modules': 1.1.3_wc2s6ucqguq7ye7cv5gs4ie3pa
+ '@wangeditor/code-highlight': 1.0.2_f4mxrtym3fqiukj5pvowt5wic4
+ '@wangeditor/core': 1.1.8_bevuzdaogp7zvgcbkum7pdqkgy
+ '@wangeditor/list-module': 1.0.2_f4mxrtym3fqiukj5pvowt5wic4
+ '@wangeditor/table-module': 1.1.1_bvrp5jl242d2qfje6ynmi2zcee
+ '@wangeditor/upload-image-module': 1.0.1_ufbnlxopmh6qp74j246va2ubh4
+ '@wangeditor/video-module': 1.1.1_gg5oy5micpmd7yyutevooksz6m
+ dom7: 3.0.0
+ is-hotkey: 0.2.0
+ lodash.camelcase: 4.3.0
+ lodash.clonedeep: 4.5.0
+ lodash.debounce: 4.0.8
+ lodash.foreach: 4.5.0
+ lodash.isequal: 4.5.0
+ lodash.throttle: 4.1.1
+ lodash.toarray: 4.4.0
+ nanoid: 3.3.4
+ slate: 0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@wangeditor/list-module/1.0.2_f4mxrtym3fqiukj5pvowt5wic4:
+ resolution: {integrity: sha512-VfENZEFvsLTiLxN/cj8cibFGy9NVV+/cfATTiLiH9ef+8lgKv8apttXYVlqIAfnlJLLuCk0cIm8c/zH+hbtrZg==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+ dependencies:
+ '@wangeditor/core': 1.1.8_bevuzdaogp7zvgcbkum7pdqkgy
+ dom7: 3.0.0
+ slate: 0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@wangeditor/table-module/1.1.1_bvrp5jl242d2qfje6ynmi2zcee:
+ resolution: {integrity: sha512-VPjEWQtncS2DsXYXiHUxPSxn2Xhc8GdhG3la7N5YhvxQde1+4N0SZLXeWsYvbGzOq4um5XToq5pktLLbE8G+EA==}
+ peerDependencies:
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ lodash.isequal: ^4.5.0
+ lodash.throttle: ^4.1.1
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+ dependencies:
+ '@wangeditor/core': 1.1.8_bevuzdaogp7zvgcbkum7pdqkgy
+ dom7: 3.0.0
+ lodash.isequal: 4.5.0
+ lodash.throttle: 4.1.1
+ nanoid: 3.3.4
+ slate: 0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@wangeditor/upload-image-module/1.0.1_ufbnlxopmh6qp74j246va2ubh4:
+ resolution: {integrity: sha512-vgUV4ENttTITblqtVuzleIq732OmzmzzgrIvX6b3GRGPSw5u8glJ/87tOEhvHjHECc4oFo18B7xzJ1GpBj79/w==}
+ peerDependencies:
+ '@uppy/core': ^2.0.3
+ '@uppy/xhr-upload': ^2.0.3
+ '@wangeditor/basic-modules': 1.x
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ lodash.foreach: ^4.5.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+ dependencies:
+ '@uppy/core': 2.1.4
+ '@uppy/xhr-upload': 2.0.7_@uppy+core@2.1.4
+ '@wangeditor/basic-modules': 1.1.3_wc2s6ucqguq7ye7cv5gs4ie3pa
+ '@wangeditor/core': 1.1.8_bevuzdaogp7zvgcbkum7pdqkgy
+ dom7: 3.0.0
+ lodash.foreach: 4.5.0
+ slate: 0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@wangeditor/video-module/1.1.1_gg5oy5micpmd7yyutevooksz6m:
+ resolution: {integrity: sha512-6gzpS5cnJihW2T0HFjqmbv6v8ouyaeMUjdM2X8BPohwD74p1ov00dCmRt5QekNTyYSmRHK0ASkUMOvRGqaDxMg==}
+ peerDependencies:
+ '@uppy/core': ^2.1.4
+ '@uppy/xhr-upload': ^2.0.7
+ '@wangeditor/core': 1.x
+ dom7: ^3.0.0
+ nanoid: ^3.2.0
+ slate: ^0.72.0
+ snabbdom: ^3.1.0
+ dependencies:
+ '@uppy/core': 2.1.4
+ '@uppy/xhr-upload': 2.0.7_@uppy+core@2.1.4
+ '@wangeditor/core': 1.1.8_bevuzdaogp7zvgcbkum7pdqkgy
+ dom7: 3.0.0
+ nanoid: 3.3.4
+ slate: 0.72.8
+ snabbdom: 3.3.1
+ dev: false
+
+ /@windicss/config/1.8.4:
+ resolution: {integrity: sha512-i4fFGFfZoRess6WMkauykHC3PFd9xKYVx7lSuLfMK7sgo6x3+l4dY42GbsWMHyLqH1sTMfyt1LgfXSIKYJozSA==}
+ dependencies:
+ debug: 4.3.4
+ jiti: 1.14.0
+ windicss: 3.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@windicss/config/1.8.7:
+ resolution: {integrity: sha512-8n+/Y36j5L3rw2tgMdLjeGRuNV7VYfKoHoraLK6Bk9OJ1MTPd5vv7pekof/uOPWVV7WWjVeZ6CTO8SDbDDW3iw==}
+ dependencies:
+ debug: 4.3.4
+ jiti: 1.14.0
+ windicss: 3.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@windicss/plugin-utils/1.8.4:
+ resolution: {integrity: sha512-DqJVwAfzlgd8nYSNlmhXOey32pI8UwH7QiOWdFS/AR2O/q9oLDGHDn97Its/kZdfoyhi8ylwZNP2Pk0H7cihhQ==}
+ dependencies:
+ '@antfu/utils': 0.5.2
+ '@windicss/config': 1.8.4
+ debug: 4.3.4
+ fast-glob: 3.2.11
+ magic-string: 0.26.2
+ micromatch: 4.0.5
+ windicss: 3.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@windicss/plugin-utils/1.8.7:
+ resolution: {integrity: sha512-dfj95olNZyGFDPFMBvE5oq8hA5f0ooUJZjVdWlthS4ek4W1/xNOHDxB6ygWR8LE9zCOXZykApjt1LOhy9Ky2QA==}
+ dependencies:
+ '@antfu/utils': 0.5.2
+ '@windicss/config': 1.8.7
+ debug: 4.3.4
+ fast-glob: 3.2.11
+ magic-string: 0.26.2
+ micromatch: 4.0.5
+ windicss: 3.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@zxcvbn-ts/core/2.0.3:
+ resolution: {integrity: sha512-lHzjnnTFGquVLpG1IraXlDzZ//h/11Ws7ZuwIeDTIExaLFntEdZh1EirwgRF34S4ceou3zxG15as2Ik5W473hA==}
+ dev: false
+
+ /JSONStream/1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+ dev: true
+
+ /acorn-jsx/5.3.2_acorn@7.4.1:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 7.4.1
+ dev: true
+
+ /acorn-jsx/5.3.2_acorn@8.7.1:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.7.1
+ dev: true
+
+ /acorn-walk/8.2.0:
+ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /acorn/7.4.1:
+ resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /acorn/8.7.1:
+ resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /aggregate-error/3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+ dev: true
+
+ /ajv/6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ajv/8.11.0:
+ resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ dev: true
+
+ /animate.css/4.1.1:
+ resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/animate.css/download/animate.css-4.1.1.tgz}
+ dev: false
+
+ /ansi-escapes/4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-regex/2.1.1:
+ resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ansi-regex/5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ /ansi-regex/6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /ansi-styles/2.2.1:
+ resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ansi-styles/3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ dev: true
+
+ /ansi-styles/4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+
+ /ansi-styles/6.1.0:
+ resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /anymatch/3.1.2:
+ resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /arg/4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ dev: true
+
+ /argparse/2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /arr-diff/4.0.0:
+ resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/arr-diff/-/arr-diff-4.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arr-flatten/1.1.0:
+ resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/arr-flatten/-/arr-flatten-1.1.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arr-union/3.1.0:
+ resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/arr-union/-/arr-union-3.1.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /array-each/1.0.1:
+ resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /array-ify/1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+ dev: true
+
+ /array-slice/1.1.0:
+ resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /array-union/2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array-unique/0.3.2:
+ resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/array-unique/-/array-unique-0.3.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arrify/1.0.1:
+ resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arrify/2.0.1:
+ resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/arrify/-/arrify-2.0.1.tgz}
+ engines: {node: '>=8'}
+ dev: true
+
+ /assign-symbols/1.0.0:
+ resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/assign-symbols/-/assign-symbols-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /astral-regex/2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /async-validator/4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+ dev: false
+
+ /async/0.9.2:
+ resolution: {integrity: sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/async/-/async-0.9.2.tgz}
+ dev: true
+
+ /asynckit/0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ dev: false
+
+ /atob/2.1.2:
+ resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/atob/-/atob-2.1.2.tgz}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+ dev: true
+
+ /autoprefixer/10.4.7_postcss@8.4.14:
+ resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ browserslist: 4.20.3
+ caniuse-lite: 1.0.30001335
+ fraction.js: 4.2.0
+ normalize-range: 0.1.2
+ picocolors: 1.0.0
+ postcss: 8.4.14
+ postcss-value-parser: 4.2.0
+ dev: true
+
+ /axios/0.26.1_debug@4.3.4:
+ resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
+ dependencies:
+ follow-redirects: 1.14.9
+ transitivePeerDependencies:
+ - debug
+ dev: true
+
+ /axios/0.27.2:
+ resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
+ dependencies:
+ follow-redirects: 1.14.9
+ form-data: 4.0.0
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
+ /balanced-match/1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /balanced-match/2.0.0:
+ resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+ dev: true
+
+ /base/0.11.2:
+ resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/base/-/base-0.11.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ cache-base: 1.0.1
+ class-utils: 0.3.6
+ component-emitter: 1.3.0
+ define-property: 1.0.0
+ isobject: 3.0.1
+ mixin-deep: 1.3.2
+ pascalcase: 0.1.1
+ dev: true
+
+ /base64-js/1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ dev: true
+
+ /big.js/5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz}
+ dev: true
+
+ /binary-extensions/2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /bl/4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.0
+ dev: true
+
+ /bl/5.0.0:
+ resolution: {integrity: sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==}
+ dependencies:
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 3.6.0
+ dev: true
+
+ /bluebird/3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/bluebird/-/bluebird-3.7.2.tgz}
+ dev: true
+
+ /boolbase/1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ dev: true
+
+ /brace-expansion/1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /braces/2.3.2:
+ resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-flatten: 1.1.0
+ array-unique: 0.3.2
+ extend-shallow: 2.0.1
+ fill-range: 4.0.0
+ isobject: 3.0.1
+ repeat-element: 1.1.4
+ snapdragon: 0.8.2
+ snapdragon-node: 2.1.1
+ split-string: 3.1.0
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /braces/3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /browserslist/4.20.3:
+ resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001335
+ electron-to-chromium: 1.4.134
+ escalade: 3.1.1
+ node-releases: 2.0.4
+ picocolors: 1.0.0
+ dev: true
+
+ /buffer-from/1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/buffer-from/-/buffer-from-1.1.2.tgz}
+ dev: true
+
+ /buffer/5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /buffer/6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /cac/6.7.12:
+ resolution: {integrity: sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /cache-base/1.0.1:
+ resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/cache-base/-/cache-base-1.0.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ collection-visit: 1.0.0
+ component-emitter: 1.3.0
+ get-value: 2.0.6
+ has-value: 1.0.0
+ isobject: 3.0.1
+ set-value: 2.0.1
+ to-object-path: 0.3.0
+ union-value: 1.0.1
+ unset-value: 1.0.0
+ dev: true
+
+ /call-bind/1.0.2:
+ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ dependencies:
+ function-bind: 1.1.1
+ get-intrinsic: 1.1.1
+ dev: false
+
+ /callsites/3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camel-case/4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.3.1
+ dev: true
+
+ /camelcase-keys/6.2.2:
+ resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ camelcase: 5.3.1
+ map-obj: 4.3.0
+ quick-lru: 4.0.1
+ dev: true
+
+ /camelcase/5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ /camelcase/6.2.1:
+ resolution: {integrity: sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /caniuse-lite/1.0.30001335:
+ resolution: {integrity: sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==}
+ dev: true
+
+ /capital-case/1.0.4:
+ resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.3.1
+ upper-case-first: 2.0.2
+ dev: true
+
+ /chalk/1.1.3:
+ resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-styles: 2.2.1
+ escape-string-regexp: 1.0.5
+ has-ansi: 2.0.0
+ strip-ansi: 3.0.1
+ supports-color: 2.0.0
+ dev: true
+
+ /chalk/2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+ dev: true
+
+ /chalk/3.0.0:
+ resolution: {integrity: sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chalk/4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chalk/5.0.1:
+ resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+
+ /change-case/4.1.2:
+ resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==}
+ dependencies:
+ camel-case: 4.1.2
+ capital-case: 1.0.4
+ constant-case: 3.0.4
+ dot-case: 3.0.4
+ header-case: 2.0.4
+ no-case: 3.0.4
+ param-case: 3.0.4
+ pascal-case: 3.1.2
+ path-case: 3.0.4
+ sentence-case: 3.0.4
+ snake-case: 3.0.4
+ tslib: 2.3.1
+ dev: true
+
+ /chardet/0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ dev: true
+
+ /cheerio-select/1.6.0:
+ resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==}
+ dependencies:
+ css-select: 4.3.0
+ css-what: 6.1.0
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ dev: true
+
+ /cheerio/1.0.0-rc.10:
+ resolution: {integrity: sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==}
+ engines: {node: '>= 6'}
+ dependencies:
+ cheerio-select: 1.6.0
+ dom-serializer: 1.3.2
+ domhandler: 4.3.1
+ htmlparser2: 6.1.0
+ parse5: 6.0.1
+ parse5-htmlparser2-tree-adapter: 6.0.1
+ tslib: 2.3.1
+ dev: true
+
+ /chokidar/3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.2
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /class-utils/0.3.6:
+ resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/class-utils/-/class-utils-0.3.6.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-union: 3.1.0
+ define-property: 0.2.5
+ isobject: 3.0.1
+ static-extend: 0.1.2
+ dev: true
+
+ /clean-css/5.2.4:
+ resolution: {integrity: sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/clean-css/-/clean-css-5.2.4.tgz}
+ engines: {node: '>= 10.0'}
+ dependencies:
+ source-map: 0.6.1
+ dev: true
+
+ /clean-stack/2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-cursor/3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+ dev: true
+
+ /cli-cursor/4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ restore-cursor: 4.0.0
+ dev: true
+
+ /cli-spinners/2.6.1:
+ resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-truncate/2.1.0:
+ resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+ engines: {node: '>=8'}
+ dependencies:
+ slice-ansi: 3.0.0
+ string-width: 4.2.3
+ dev: true
+
+ /cli-truncate/3.1.0:
+ resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 5.0.1
+ dev: true
+
+ /cli-width/3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+ dev: true
+
+ /cliui/6.0.0:
+ resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ dev: false
+
+ /cliui/7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /clone-regexp/2.2.0:
+ resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==}
+ engines: {node: '>=6'}
+ dependencies:
+ is-regexp: 2.1.0
+ dev: true
+
+ /clone/1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+ dev: true
+
+ /clone/2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+ dev: true
+
+ /collection-visit/1.0.0:
+ resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/collection-visit/-/collection-visit-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ map-visit: 1.0.0
+ object-visit: 1.0.1
+ dev: true
+
+ /color-convert/1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+ dev: true
+
+ /color-convert/2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+
+ /color-name/1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ dev: true
+
+ /color-name/1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ /colord/2.9.2:
+ resolution: {integrity: sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==}
+ dev: true
+
+ /colorette/2.0.16:
+ resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==}
+ dev: true
+
+ /colorette/2.0.17:
+ resolution: {integrity: sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g==}
+ dev: true
+
+ /combined-stream/1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+ dev: false
+
+ /commander/2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ dev: true
+
+ /commander/7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+ dev: true
+
+ /commander/8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+ dev: true
+
+ /commander/9.3.0:
+ resolution: {integrity: sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==}
+ engines: {node: ^12.20.0 || >=14}
+ dev: true
+
+ /compare-func/2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+ dev: true
+
+ /component-emitter/1.3.0:
+ resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/component-emitter/-/component-emitter-1.3.0.tgz}
+ dev: true
+
+ /compute-scroll-into-view/1.0.17:
+ resolution: {integrity: sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==}
+ dev: false
+
+ /concat-map/0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /connect-history-api-fallback/1.6.0:
+ resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz}
+ engines: {node: '>=0.8'}
+ dev: true
+
+ /connect/3.7.0:
+ resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
+ engines: {node: '>= 0.10.0'}
+ dependencies:
+ debug: 2.6.9
+ finalhandler: 1.1.2
+ parseurl: 1.3.3
+ utils-merge: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /consola/2.15.3:
+ resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/consola/-/consola-2.15.3.tgz}
+ dev: true
+
+ /constant-case/3.0.4:
+ resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.3.1
+ upper-case: 2.0.2
+ dev: true
+
+ /conventional-changelog-angular/5.0.13:
+ resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==}
+ engines: {node: '>=10'}
+ dependencies:
+ compare-func: 2.0.0
+ q: 1.5.1
+ dev: true
+
+ /conventional-changelog-conventionalcommits/5.0.0:
+ resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==}
+ engines: {node: '>=10'}
+ dependencies:
+ compare-func: 2.0.0
+ lodash: 4.17.21
+ q: 1.5.1
+ dev: true
+
+ /conventional-commits-parser/3.2.4:
+ resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ is-text-path: 1.0.1
+ JSONStream: 1.3.5
+ lodash: 4.17.21
+ meow: 8.1.2
+ split2: 3.2.2
+ through2: 4.0.2
+ dev: true
+
+ /convert-source-map/1.8.0:
+ resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==}
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: true
+
+ /copy-anything/2.0.3:
+ resolution: {integrity: sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==}
+ dependencies:
+ is-what: 3.14.1
+ dev: true
+
+ /copy-descriptor/0.1.1:
+ resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /cors/2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/cors/-/cors-2.8.5.tgz}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+ dev: true
+
+ /cosmiconfig-typescript-loader/2.0.0_tdn3ypgnfy6bmey2q4hu5jonwi:
+ resolution: {integrity: sha512-2NlGul/E3vTQEANqPziqkA01vfiuUU8vT0jZAuUIjEW8u3eCcnCQWLggapCjhbF76s7KQF0fM0kXSKmzaDaG1g==}
+ engines: {node: '>=12', npm: '>=6'}
+ peerDependencies:
+ '@types/node': '*'
+ typescript: '>=3'
+ dependencies:
+ '@types/node': 18.0.6
+ cosmiconfig: 7.0.1
+ ts-node: 10.7.0_tdn3ypgnfy6bmey2q4hu5jonwi
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ dev: true
+
+ /cosmiconfig/7.0.1:
+ resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/parse-json': 4.0.0
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: true
+
+ /create-require/1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ dev: true
+
+ /cross-fetch/3.1.5:
+ resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/cross-fetch/-/cross-fetch-3.1.5.tgz}
+ dependencies:
+ node-fetch: 2.6.7
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /cross-spawn/7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /css-functions-list/3.1.0:
+ resolution: {integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /css-select/4.2.1:
+ resolution: {integrity: sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/css-select/-/css-select-4.2.1.tgz}
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 5.1.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.0.1
+ dev: true
+
+ /css-select/4.3.0:
+ resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.0.1
+ dev: true
+
+ /css-tree/1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/css-tree/-/css-tree-1.1.3.tgz}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ mdn-data: 2.0.14
+ source-map: 0.6.1
+ dev: true
+
+ /css-what/5.1.0:
+ resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /css-what/6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /cssesc/3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /csso/4.2.0:
+ resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/csso/-/csso-4.2.0.tgz}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ css-tree: 1.1.3
+ dev: true
+
+ /csstype/2.6.19:
+ resolution: {integrity: sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==}
+
+ /d/1.0.1:
+ resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
+ dependencies:
+ es5-ext: 0.10.53
+ type: 1.2.0
+ dev: false
+
+ /dargs/7.0.0:
+ resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /dayjs/1.11.3:
+ resolution: {integrity: sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==}
+ dev: false
+
+ /debug/2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: true
+
+ /debug/3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+ dev: true
+ optional: true
+
+ /debug/4.3.3:
+ resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/debug/-/debug-4.3.3.tgz}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /debug/4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /decamelize-keys/1.1.0:
+ resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ decamelize: 1.2.0
+ map-obj: 1.0.1
+ dev: true
+
+ /decamelize/1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+
+ /declass/0.0.1:
+ resolution: {integrity: sha512-V1tO9kGH+GLfkeiYCF016HSBcTP5mI+eMusSFgxZv0BzKvUQgI/Xn6FdoFuMwQHEqxKXhaW02s8oZqXPclKPUg==}
+ dependencies:
+ cheerio: 1.0.0-rc.10
+ dev: true
+
+ /decode-uri-component/0.2.0:
+ resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /deep-is/0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /defaults/1.0.3:
+ resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==}
+ dependencies:
+ clone: 1.0.4
+ dev: true
+
+ /define-property/0.2.5:
+ resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/define-property/-/define-property-0.2.5.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 0.1.6
+ dev: true
+
+ /define-property/1.0.0:
+ resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/define-property/-/define-property-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.2
+ dev: true
+
+ /define-property/2.0.2:
+ resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/define-property/-/define-property-2.0.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.2
+ isobject: 3.0.1
+ dev: true
+
+ /del/6.0.0:
+ resolution: {integrity: sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ globby: 11.1.0
+ graceful-fs: 4.2.8
+ is-glob: 4.0.3
+ is-path-cwd: 2.2.0
+ is-path-inside: 3.0.3
+ p-map: 4.0.0
+ rimraf: 3.0.2
+ slash: 3.0.0
+ dev: true
+
+ /delayed-stream/1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+ dev: false
+
+ /detect-file/1.0.0:
+ resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /diff/4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /dijkstrajs/1.0.2:
+ resolution: {integrity: sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==}
+ dev: false
+
+ /dir-glob/3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /doctrine/3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dom-serializer/0.2.2:
+ resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
+ dependencies:
+ domelementtype: 2.3.0
+ entities: 2.2.0
+ dev: true
+
+ /dom-serializer/1.3.2:
+ resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ entities: 2.2.0
+ dev: true
+
+ /dom-serializer/2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.3.1
+ dev: true
+
+ /dom7/3.0.0:
+ resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==}
+ dependencies:
+ ssr-window: 3.0.0
+ dev: false
+
+ /domelementtype/1.3.1:
+ resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+ dev: true
+
+ /domelementtype/2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+ dev: true
+
+ /domhandler/2.4.2:
+ resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
+ dependencies:
+ domelementtype: 1.3.1
+ dev: true
+
+ /domhandler/4.3.1:
+ resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+ engines: {node: '>= 4'}
+ dependencies:
+ domelementtype: 2.3.0
+ dev: true
+
+ /domhandler/5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+ dependencies:
+ domelementtype: 2.3.0
+ dev: true
+
+ /domutils/1.7.0:
+ resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
+ dependencies:
+ dom-serializer: 0.2.2
+ domelementtype: 1.3.1
+ dev: true
+
+ /domutils/2.8.0:
+ resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+ dependencies:
+ dom-serializer: 1.3.2
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ dev: true
+
+ /domutils/3.0.1:
+ resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==}
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ dev: true
+
+ /dot-case/3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.3.1
+ dev: true
+
+ /dot-prop/5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: true
+
+ /dotenv-expand/8.0.2:
+ resolution: {integrity: sha512-vKKAk+VOzAWOV/dPIeSYqhgC/TQY+6L6Ibkzfsr8xd1stdBsTuGu9asCOXgbYbBeS+f2Y6lqqEuw7riOA+xEUQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/dotenv-expand/-/dotenv-expand-8.0.2.tgz}
+ engines: {node: '>=12'}
+ dev: true
+
+ /dotenv/16.0.0:
+ resolution: {integrity: sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/dotenv/-/dotenv-16.0.0.tgz}
+ engines: {node: '>=12'}
+ dev: true
+
+ /echarts-wordcloud/2.0.0_echarts@5.3.3:
+ resolution: {integrity: sha512-K7l6pTklqdW7ZWzT/1CS0KhBSINr/cd7c5N1fVMzZMwLQHEwT7x+nivK7g5hkVh7WNcAv4Dn6/ZS5zMKRozC1g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/echarts-wordcloud/download/echarts-wordcloud-2.0.0.tgz}
+ peerDependencies:
+ echarts: ^5.0.1
+ dependencies:
+ echarts: 5.3.3
+ dev: false
+
+ /echarts/5.3.3:
+ resolution: {integrity: sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==}
+ dependencies:
+ tslib: 2.3.0
+ zrender: 5.3.2
+ dev: false
+
+ /ee-first/1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ dev: true
+
+ /ejs/3.1.6:
+ resolution: {integrity: sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/ejs/-/ejs-3.1.6.tgz}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+ dependencies:
+ jake: 10.8.2
+ dev: true
+
+ /electron-to-chromium/1.4.134:
+ resolution: {integrity: sha512-OdD7M2no4Mi8PopfvoOuNcwYDJ2mNFxaBfurA6okG3fLBaMcFah9S+si84FhX+FIWLKkdaiHfl4A+5ep/gOVrg==}
+ dev: true
+
+ /element-plus/2.2.9_vue@3.2.37:
+ resolution: {integrity: sha512-jYbL0JkCdv95rkT6trZJjCAizLPySa0qcd2cgq+57SKQnCZAcNDDq4GbTuFRnNavdoeCJnuM3HIficTIUpsMOQ==}
+ peerDependencies:
+ vue: ^3.2.0
+ dependencies:
+ '@ctrl/tinycolor': 3.4.1
+ '@element-plus/icons-vue': 2.0.6_vue@3.2.37
+ '@floating-ui/dom': 0.5.4
+ '@popperjs/core': /@sxzz/popperjs-es/2.11.7
+ '@types/lodash': 4.14.182
+ '@types/lodash-es': 4.17.6
+ '@vueuse/core': 8.9.4_vue@3.2.37
+ async-validator: 4.2.5
+ dayjs: 1.11.3
+ escape-html: 1.0.3
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ lodash-unified: 1.0.2_3ib2ivapxullxkx3xftsimdk7u
+ memoize-one: 6.0.0
+ normalize-wheel-es: 1.1.2
+ vue: 3.2.37
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ dev: false
+
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ /emoji-regex/9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
+ /emojis-list/3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/emojis-list/-/emojis-list-3.0.0.tgz}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /encode-utf8/1.0.3:
+ resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==}
+ dev: false
+
+ /encodeurl/1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /end-of-stream/1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: true
+
+ /entities/1.1.2:
+ resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
+ dev: true
+
+ /entities/2.2.0:
+ resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+ dev: true
+
+ /entities/4.3.1:
+ resolution: {integrity: sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==}
+ engines: {node: '>=0.12'}
+ dev: true
+
+ /errno/0.1.8:
+ resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ prr: 1.0.1
+ dev: true
+ optional: true
+
+ /error-ex/1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+ dev: true
+
+ /es-module-lexer/0.9.3:
+ resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==}
+ dev: true
+
+ /es5-ext/0.10.53:
+ resolution: {integrity: sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==}
+ dependencies:
+ es6-iterator: 2.0.3
+ es6-symbol: 3.1.3
+ next-tick: 1.0.0
+ dev: false
+
+ /es6-iterator/2.0.3:
+ resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
+ dependencies:
+ d: 1.0.1
+ es5-ext: 0.10.53
+ es6-symbol: 3.1.3
+ dev: false
+
+ /es6-symbol/3.1.3:
+ resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==}
+ dependencies:
+ d: 1.0.1
+ ext: 1.6.0
+ dev: false
+
+ /esbuild-android-64/0.14.49:
+ resolution: {integrity: sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-android-arm64/0.14.49:
+ resolution: {integrity: sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-64/0.14.49:
+ resolution: {integrity: sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-arm64/0.14.49:
+ resolution: {integrity: sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-64/0.14.49:
+ resolution: {integrity: sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-arm64/0.14.49:
+ resolution: {integrity: sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-32/0.14.49:
+ resolution: {integrity: sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-64/0.14.49:
+ resolution: {integrity: sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm/0.14.49:
+ resolution: {integrity: sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm64/0.14.49:
+ resolution: {integrity: sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-mips64le/0.14.49:
+ resolution: {integrity: sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-ppc64le/0.14.49:
+ resolution: {integrity: sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-riscv64/0.14.49:
+ resolution: {integrity: sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-s390x/0.14.49:
+ resolution: {integrity: sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-netbsd-64/0.14.49:
+ resolution: {integrity: sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-openbsd-64/0.14.49:
+ resolution: {integrity: sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-sunos-64/0.14.49:
+ resolution: {integrity: sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-32/0.14.49:
+ resolution: {integrity: sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-64/0.14.49:
+ resolution: {integrity: sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-arm64/0.14.49:
+ resolution: {integrity: sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild/0.14.49:
+ resolution: {integrity: sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ esbuild-android-64: 0.14.49
+ esbuild-android-arm64: 0.14.49
+ esbuild-darwin-64: 0.14.49
+ esbuild-darwin-arm64: 0.14.49
+ esbuild-freebsd-64: 0.14.49
+ esbuild-freebsd-arm64: 0.14.49
+ esbuild-linux-32: 0.14.49
+ esbuild-linux-64: 0.14.49
+ esbuild-linux-arm: 0.14.49
+ esbuild-linux-arm64: 0.14.49
+ esbuild-linux-mips64le: 0.14.49
+ esbuild-linux-ppc64le: 0.14.49
+ esbuild-linux-riscv64: 0.14.49
+ esbuild-linux-s390x: 0.14.49
+ esbuild-netbsd-64: 0.14.49
+ esbuild-openbsd-64: 0.14.49
+ esbuild-sunos-64: 0.14.49
+ esbuild-windows-32: 0.14.49
+ esbuild-windows-64: 0.14.49
+ esbuild-windows-arm64: 0.14.49
+ dev: true
+
+ /escalade/3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /escape-html/1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ /escape-string-regexp/1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /escape-string-regexp/4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-config-prettier/8.5.0_eslint@8.20.0:
+ resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+ dependencies:
+ eslint: 8.20.0
+ dev: true
+
+ /eslint-define-config/1.5.1:
+ resolution: {integrity: sha512-6gxrmN7aKGffaO8dCtMMKyo3IxbWymMQ248p4lf8GbaFRcLsqOXHFdUhhM0Hcy1NudvnpwHcfbDf7Nh9pIm1TA==}
+ engines: {node: '>= 14.6.0', npm: '>= 6.0.0', pnpm: '>= 7.0.0'}
+ dev: true
+
+ /eslint-plugin-prettier/4.2.1_g4fztgbwjyq2fvmcscny2sj6fy:
+ resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ eslint: '>=7.28.0'
+ eslint-config-prettier: '*'
+ prettier: '>=2.0.0'
+ peerDependenciesMeta:
+ eslint-config-prettier:
+ optional: true
+ dependencies:
+ eslint: 8.20.0
+ eslint-config-prettier: 8.5.0_eslint@8.20.0
+ prettier: 2.7.1
+ prettier-linter-helpers: 1.0.0
+ dev: true
+
+ /eslint-plugin-vue/9.2.0_eslint@8.20.0:
+ resolution: {integrity: sha512-W2hc+NUXoce8sZtWgZ45miQTy6jNyuSdub5aZ1IBune4JDeAyzucYX0TzkrQ1jMO52sNUDYlCIHDoaNePe0p5g==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ eslint: 8.20.0
+ eslint-utils: 3.0.0_eslint@8.20.0
+ natural-compare: 1.4.0
+ nth-check: 2.0.1
+ postcss-selector-parser: 6.0.10
+ semver: 7.3.7
+ vue-eslint-parser: 9.0.2_eslint@8.20.0
+ xml-name-validator: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-scope/5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+ dev: true
+
+ /eslint-scope/7.1.1:
+ resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-utils/2.1.0:
+ resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
+ engines: {node: '>=6'}
+ dependencies:
+ eslint-visitor-keys: 1.3.0
+ dev: true
+
+ /eslint-utils/3.0.0_eslint@8.20.0:
+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+ peerDependencies:
+ eslint: '>=5'
+ dependencies:
+ eslint: 8.20.0
+ eslint-visitor-keys: 2.1.0
+ dev: true
+
+ /eslint-visitor-keys/1.3.0:
+ resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /eslint-visitor-keys/2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-visitor-keys/3.3.0:
+ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint/8.20.0:
+ resolution: {integrity: sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint/eslintrc': 1.3.0
+ '@humanwhocodes/config-array': 0.9.2
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.1.1
+ eslint-utils: 3.0.0_eslint@8.20.0
+ eslint-visitor-keys: 3.3.0
+ espree: 9.3.2
+ esquery: 1.4.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ functional-red-black-tree: 1.0.1
+ glob-parent: 6.0.2
+ globals: 13.15.0
+ ignore: 5.2.0
+ import-fresh: 3.3.0
+ imurmurhash: 0.1.4
+ is-glob: 4.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.1
+ regexpp: 3.2.0
+ strip-ansi: 6.0.1
+ strip-json-comments: 3.1.1
+ text-table: 0.2.0
+ v8-compile-cache: 2.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree/6.2.1:
+ resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ acorn: 7.4.1
+ acorn-jsx: 5.3.2_acorn@7.4.1
+ eslint-visitor-keys: 1.3.0
+ dev: true
+
+ /espree/9.3.2:
+ resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.7.1
+ acorn-jsx: 5.3.2_acorn@8.7.1
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /esquery/1.4.0:
+ resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse/4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse/4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estraverse/5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estree-walker/2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ /esutils/2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /etag/1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/etag/-/etag-1.8.1.tgz}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /event-emitter/0.3.5:
+ resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
+ dependencies:
+ d: 1.0.1
+ es5-ext: 0.10.53
+ dev: false
+
+ /execa/4.1.0:
+ resolution: {integrity: sha1-TlSRrRVy8vF6d9OIxshXE1sihHo=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/execa/download/execa-4.1.0.tgz?cache=0&sync_timestamp=1637148795580&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-4.1.0.tgz}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 5.2.0
+ human-signals: 1.1.1
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /execa/5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /execa/6.1.0:
+ resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 3.0.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.1.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+ dev: true
+
+ /execall/2.0.0:
+ resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==}
+ engines: {node: '>=8'}
+ dependencies:
+ clone-regexp: 2.2.0
+ dev: true
+
+ /expand-brackets/2.1.4:
+ resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/expand-brackets/-/expand-brackets-2.1.4.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ posix-character-classes: 0.1.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /expand-tilde/2.0.2:
+ resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ homedir-polyfill: 1.0.3
+ dev: true
+
+ /ext/1.6.0:
+ resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==}
+ dependencies:
+ type: 2.6.0
+ dev: false
+
+ /extend-shallow/2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 0.1.1
+ dev: true
+
+ /extend-shallow/3.0.2:
+ resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ assign-symbols: 1.0.0
+ is-extendable: 1.0.1
+ dev: true
+
+ /extend/3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ dev: true
+
+ /external-editor/3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+ dev: true
+
+ /extglob/2.0.4:
+ resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/extglob/-/extglob-2.0.4.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ array-unique: 0.3.2
+ define-property: 1.0.0
+ expand-brackets: 2.1.4
+ extend-shallow: 2.0.1
+ fragment-cache: 0.2.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-diff/1.2.0:
+ resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
+ dev: true
+
+ /fast-glob/3.2.11:
+ resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fast-json-stable-stringify/2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein/2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fastest-levenshtein/1.0.12:
+ resolution: {integrity: sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==}
+ dev: true
+
+ /fastq/1.13.0:
+ resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /figures/3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /file-entry-cache/6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.0.4
+ dev: true
+
+ /filelist/1.0.2:
+ resolution: {integrity: sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/filelist/-/filelist-1.0.2.tgz}
+ dependencies:
+ minimatch: 3.1.2
+ dev: true
+
+ /fill-range/4.0.0:
+ resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 2.0.1
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ to-regex-range: 2.1.1
+ dev: true
+
+ /fill-range/7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /finalhandler/1.1.2:
+ resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
+ engines: {node: '>= 0.8'}
+ 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
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /find-up/4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/find-up/-/find-up-4.1.0.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ /find-up/5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /findup-sync/5.0.0:
+ resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==}
+ engines: {node: '>= 10.13.0'}
+ dependencies:
+ detect-file: 1.0.0
+ is-glob: 4.0.3
+ micromatch: 4.0.5
+ resolve-dir: 1.0.1
+ dev: true
+
+ /fined/2.0.0:
+ resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==}
+ engines: {node: '>= 10.13.0'}
+ dependencies:
+ expand-tilde: 2.0.2
+ is-plain-object: 5.0.0
+ object.defaults: 1.1.0
+ object.pick: 1.3.0
+ parse-filepath: 1.0.2
+ dev: true
+
+ /flagged-respawn/2.0.0:
+ resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==}
+ engines: {node: '>= 10.13.0'}
+ dev: true
+
+ /flat-cache/3.0.4:
+ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.2.4
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted/3.2.4:
+ resolution: {integrity: sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==}
+ dev: true
+
+ /follow-redirects/1.14.9:
+ resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ /for-in/1.0.2:
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /for-own/1.0.0:
+ resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ for-in: 1.0.2
+ dev: true
+
+ /form-data/4.0.0:
+ resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ engines: {node: '>= 6'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+ dev: false
+
+ /fraction.js/4.2.0:
+ resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
+ dev: true
+
+ /fragment-cache/0.2.1:
+ resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/fragment-cache/-/fragment-cache-0.2.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ map-cache: 0.2.2
+ dev: true
+
+ /fs-extra/10.0.0:
+ resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/fs-extra/-/fs-extra-10.0.0.tgz}
+ engines: {node: '>=12'}
+ dependencies:
+ graceful-fs: 4.2.8
+ jsonfile: 6.1.0
+ universalify: 2.0.0
+ dev: true
+
+ /fs-extra/10.0.1:
+ resolution: {integrity: sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==}
+ engines: {node: '>=12'}
+ dependencies:
+ graceful-fs: 4.2.8
+ jsonfile: 6.1.0
+ universalify: 2.0.0
+ dev: true
+
+ /fs.realpath/1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind/1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+
+ /functional-red-black-tree/1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+ dev: true
+
+ /gensync/1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /get-caller-file/2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ /get-intrinsic/1.1.1:
+ resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
+ dependencies:
+ function-bind: 1.1.1
+ has: 1.0.3
+ has-symbols: 1.0.2
+ dev: false
+
+ /get-stdin/8.0.0:
+ resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-stream/5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+ dependencies:
+ pump: 3.0.0
+ dev: true
+
+ /get-stream/6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-value/2.0.6:
+ resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/get-value/-/get-value-2.0.6.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /git-raw-commits/2.0.11:
+ resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ dargs: 7.0.0
+ lodash: 4.17.21
+ meow: 8.1.2
+ split2: 3.2.2
+ through2: 4.0.2
+ dev: true
+
+ /glob-parent/5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent/6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob/7.2.0:
+ resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /global-dirs/0.1.1:
+ resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
+ engines: {node: '>=4'}
+ dependencies:
+ ini: 1.3.8
+ dev: true
+
+ /global-modules/1.0.0:
+ resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ global-prefix: 1.0.2
+ is-windows: 1.0.2
+ resolve-dir: 1.0.1
+ dev: true
+
+ /global-modules/2.0.0:
+ resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+ engines: {node: '>=6'}
+ dependencies:
+ global-prefix: 3.0.0
+ dev: true
+
+ /global-prefix/1.0.2:
+ resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ expand-tilde: 2.0.2
+ homedir-polyfill: 1.0.3
+ ini: 1.3.8
+ is-windows: 1.0.2
+ which: 1.3.1
+ dev: true
+
+ /global-prefix/3.0.0:
+ resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+ engines: {node: '>=6'}
+ dependencies:
+ ini: 1.3.8
+ kind-of: 6.0.3
+ which: 1.3.1
+ dev: true
+
+ /globals/11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /globals/13.15.0:
+ resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globby/11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.2.11
+ ignore: 5.2.0
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
+ /globby/13.1.1:
+ resolution: {integrity: sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.2.11
+ ignore: 5.2.0
+ merge2: 1.4.1
+ slash: 4.0.0
+ dev: true
+
+ /globjoin/0.1.4:
+ resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+ dev: true
+
+ /graceful-fs/4.2.8:
+ resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==}
+ requiresBuild: true
+ dev: true
+
+ /handlebars/4.7.7:
+ resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==}
+ engines: {node: '>=0.4.7'}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.6
+ neo-async: 2.6.2
+ source-map: 0.6.1
+ wordwrap: 1.0.0
+ optionalDependencies:
+ uglify-js: 3.15.3
+ dev: true
+
+ /hard-rejection/2.1.0:
+ resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /has-ansi/2.0.0:
+ resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/has-ansi/-/has-ansi-2.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: true
+
+ /has-flag/1.0.0:
+ resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /has-flag/3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /has-flag/4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-symbols/1.0.2:
+ resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /has-value/0.3.1:
+ resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/has-value/-/has-value-0.3.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ get-value: 2.0.6
+ has-values: 0.1.4
+ isobject: 2.1.0
+ dev: true
+
+ /has-value/1.0.0:
+ resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/has-value/-/has-value-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ get-value: 2.0.6
+ has-values: 1.0.0
+ isobject: 3.0.1
+ dev: true
+
+ /has-values/0.1.4:
+ resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/has-values/-/has-values-0.1.4.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /has-values/1.0.0:
+ resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/has-values/-/has-values-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-number: 3.0.0
+ kind-of: 4.0.0
+ dev: true
+
+ /has/1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: 1.1.1
+
+ /he/1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/he/-/he-1.2.0.tgz}
+ hasBin: true
+ dev: true
+
+ /header-case/2.0.4:
+ resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
+ dependencies:
+ capital-case: 1.0.4
+ tslib: 2.3.1
+ dev: true
+
+ /homedir-polyfill/1.0.3:
+ resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ parse-passwd: 1.0.0
+ dev: true
+
+ /hosted-git-info/2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
+ /hosted-git-info/4.0.2:
+ resolution: {integrity: sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==}
+ engines: {node: '>=10'}
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /html-minifier-terser/6.1.0:
+ resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz}
+ engines: {node: '>=12'}
+ hasBin: true
+ dependencies:
+ camel-case: 4.1.2
+ clean-css: 5.2.4
+ commander: 8.3.0
+ he: 1.2.0
+ param-case: 3.0.4
+ relateurl: 0.2.7
+ terser: 5.10.0
+ dev: true
+
+ /html-tags/3.2.0:
+ resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /html-void-elements/2.0.1:
+ resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
+ dev: false
+
+ /htmlparser2/3.10.1:
+ resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
+ dependencies:
+ domelementtype: 1.3.1
+ domhandler: 2.4.2
+ domutils: 1.7.0
+ entities: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.0
+ dev: true
+
+ /htmlparser2/6.1.0:
+ resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ entities: 2.2.0
+ dev: true
+
+ /htmlparser2/8.0.1:
+ resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.0.1
+ entities: 4.3.1
+ dev: true
+
+ /human-signals/1.1.1:
+ resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
+ engines: {node: '>=8.12.0'}
+ dev: true
+
+ /human-signals/2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
+ /human-signals/3.0.1:
+ resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
+ engines: {node: '>=12.20.0'}
+ dev: true
+
+ /i18next/20.6.1:
+ resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==}
+ dependencies:
+ '@babel/runtime': 7.17.2
+ dev: false
+
+ /iconv-lite/0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /iconv-lite/0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+ optional: true
+
+ /ieee754/1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
+
+ /ignore/5.2.0:
+ resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /image-size/0.5.5:
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+
+ /immer/9.0.12:
+ resolution: {integrity: sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==}
+ dev: false
+
+ /import-fresh/3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /import-lazy/4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /imurmurhash/0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /indent-string/4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /inflight/1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits/2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
+
+ /ini/1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+
+ /inquirer/8.2.2:
+ resolution: {integrity: sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow==}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.5.5
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ dev: true
+
+ /interpret/2.2.0:
+ resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /intro.js/6.0.0:
+ resolution: {integrity: sha512-ZUiR6BoLSvPSlLG0boewnWVgji1fE1gBvP/pyw5pgCKXEDQz1mMeUxarggClPNs71UTq364LwSk9zxz17A9gaQ==}
+ dev: false
+
+ /is-absolute/1.0.0:
+ resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-relative: 1.0.0
+ is-windows: 1.0.2
+ dev: true
+
+ /is-accessor-descriptor/0.1.6:
+ resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /is-accessor-descriptor/1.0.0:
+ resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 6.0.3
+ dev: true
+
+ /is-arrayish/0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ dev: true
+
+ /is-binary-path/2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
+ /is-buffer/1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-buffer/-/is-buffer-1.1.6.tgz}
+ dev: true
+
+ /is-core-module/2.8.1:
+ resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /is-core-module/2.9.0:
+ resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /is-data-descriptor/0.1.4:
+ resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /is-data-descriptor/1.0.0:
+ resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 6.0.3
+ dev: true
+
+ /is-descriptor/0.1.6:
+ resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-descriptor/-/is-descriptor-0.1.6.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-accessor-descriptor: 0.1.6
+ is-data-descriptor: 0.1.4
+ kind-of: 5.1.0
+ dev: true
+
+ /is-descriptor/1.0.2:
+ resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-descriptor/-/is-descriptor-1.0.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-accessor-descriptor: 1.0.0
+ is-data-descriptor: 1.0.0
+ kind-of: 6.0.3
+ dev: true
+
+ /is-extendable/0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-extendable/1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-plain-object: 2.0.4
+ dev: true
+
+ /is-extglob/2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ /is-fullwidth-code-point/4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /is-glob/4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-hotkey/0.2.0:
+ resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==}
+ dev: false
+
+ /is-interactive/1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-interactive/2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /is-number/3.0.0:
+ resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /is-number/7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-obj/2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-path-cwd/2.2.0:
+ resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-path-inside/3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-obj/1.1.0:
+ resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-plain-object/2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /is-plain-object/5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
+ /is-regexp/2.1.0:
+ resolution: {integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-relative/1.0.0:
+ resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-unc-path: 1.0.0
+ dev: true
+
+ /is-stream/2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-stream/3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /is-text-path/1.0.1:
+ resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ text-extensions: 1.9.0
+ dev: true
+
+ /is-unc-path/1.0.0:
+ resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ unc-path-regex: 0.1.2
+ dev: true
+
+ /is-unicode-supported/0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /is-unicode-supported/1.2.0:
+ resolution: {integrity: sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /is-url/1.2.4:
+ resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
+ dev: false
+
+ /is-what/3.14.1:
+ resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
+ dev: true
+
+ /is-windows/1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /isarray/1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ dev: true
+
+ /isbinaryfile/4.0.10:
+ resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==}
+ engines: {node: '>= 8.0.0'}
+ dev: true
+
+ /isexe/2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /isobject/2.1.0:
+ resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isarray: 1.0.0
+ dev: true
+
+ /isobject/3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /jake/10.8.2:
+ resolution: {integrity: sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/jake/-/jake-10.8.2.tgz}
+ hasBin: true
+ dependencies:
+ async: 0.9.2
+ chalk: 2.4.2
+ filelist: 1.0.2
+ minimatch: 3.1.2
+ dev: true
+
+ /jiti/1.14.0:
+ resolution: {integrity: sha512-4IwstlaKQc9vCTC+qUXLM1hajy2ImiL9KnLvVYiaHOtS/v3wRjhLlGl121AmgDgx/O43uKmxownJghS5XMya2A==}
+ hasBin: true
+ dev: true
+
+ /js-base64/2.6.4:
+ resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
+ dev: true
+
+ /js-tokens/4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ dev: true
+
+ /js-tokens/8.0.0:
+ resolution: {integrity: sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==}
+ dev: true
+
+ /js-yaml/4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsesc/2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /json-parse-even-better-errors/2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ dev: true
+
+ /json-schema-traverse/0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-schema-traverse/1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify/1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json5/1.0.1:
+ resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.6
+ dev: true
+
+ /json5/2.2.1:
+ resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
+ /jsonc-eslint-parser/1.4.1:
+ resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ acorn: 7.4.1
+ eslint-utils: 2.1.0
+ eslint-visitor-keys: 1.3.0
+ espree: 6.2.1
+ semver: 6.3.0
+ dev: true
+
+ /jsonfile/6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ dependencies:
+ universalify: 2.0.0
+ optionalDependencies:
+ graceful-fs: 4.2.8
+ dev: true
+
+ /jsonparse/1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+ dev: true
+
+ /kind-of/3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-buffer: 1.1.6
+ dev: true
+
+ /kind-of/4.0.0:
+ resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-buffer: 1.1.6
+ dev: true
+
+ /kind-of/5.1.0:
+ resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /kind-of/6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /known-css-properties/0.25.0:
+ resolution: {integrity: sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==}
+ dev: true
+
+ /kolorist/1.5.1:
+ resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==}
+ dev: true
+
+ /less/4.1.3:
+ resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dependencies:
+ copy-anything: 2.0.3
+ parse-node-version: 1.0.1
+ tslib: 2.3.1
+ optionalDependencies:
+ errno: 0.1.8
+ graceful-fs: 4.2.8
+ image-size: 0.5.5
+ make-dir: 2.1.0
+ mime: 1.6.0
+ needle: 3.1.0
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /levn/0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /liftoff/4.0.0:
+ resolution: {integrity: sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ extend: 3.0.2
+ findup-sync: 5.0.0
+ fined: 2.0.0
+ flagged-respawn: 2.0.0
+ is-plain-object: 5.0.0
+ object.map: 1.0.1
+ rechoir: 0.8.0
+ resolve: 1.22.1
+ dev: true
+
+ /lilconfig/2.0.5:
+ resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /lines-and-columns/1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ dev: true
+
+ /lint-staged/13.0.3:
+ resolution: {integrity: sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ cli-truncate: 3.1.0
+ colorette: 2.0.17
+ commander: 9.3.0
+ debug: 4.3.4
+ execa: 6.1.0
+ lilconfig: 2.0.5
+ listr2: 4.0.5
+ micromatch: 4.0.5
+ normalize-path: 3.0.0
+ object-inspect: 1.12.2
+ pidtree: 0.6.0
+ string-argv: 0.3.1
+ yaml: 2.1.1
+ transitivePeerDependencies:
+ - enquirer
+ - supports-color
+ dev: true
+
+ /listr2/4.0.5:
+ resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ enquirer: '>= 2.3.0 < 3'
+ peerDependenciesMeta:
+ enquirer:
+ optional: true
+ dependencies:
+ cli-truncate: 2.1.0
+ colorette: 2.0.17
+ log-update: 4.0.0
+ p-map: 4.0.0
+ rfdc: 1.3.0
+ rxjs: 7.5.5
+ through: 2.3.8
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /loader-utils/1.4.0:
+ resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/loader-utils/-/loader-utils-1.4.0.tgz}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 1.0.1
+ dev: true
+
+ /locate-path/5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/locate-path/-/locate-path-5.0.0.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+
+ /locate-path/6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /lodash-es/4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+ dev: false
+
+ /lodash-unified/1.0.2_3ib2ivapxullxkx3xftsimdk7u:
+ resolution: {integrity: sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==}
+ peerDependencies:
+ '@types/lodash-es': '*'
+ lodash: '*'
+ lodash-es: '*'
+ dependencies:
+ '@types/lodash-es': 4.17.6
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ dev: false
+
+ /lodash.camelcase/4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+ dev: false
+
+ /lodash.clonedeep/4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+ dev: false
+
+ /lodash.debounce/4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+ dev: false
+
+ /lodash.foreach/4.5.0:
+ resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==}
+ dev: false
+
+ /lodash.get/4.4.2:
+ resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
+ dev: true
+
+ /lodash.isequal/4.5.0:
+ resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ dev: false
+
+ /lodash.merge/4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.throttle/4.1.1:
+ resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+ dev: false
+
+ /lodash.toarray/4.4.0:
+ resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==}
+ dev: false
+
+ /lodash.truncate/4.4.2:
+ resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+ dev: true
+
+ /lodash/4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ /log-symbols/4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+ dev: true
+
+ /log-symbols/5.1.0:
+ resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==}
+ engines: {node: '>=12'}
+ dependencies:
+ chalk: 5.0.1
+ is-unicode-supported: 1.2.0
+ dev: true
+
+ /log-update/4.0.0:
+ resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ cli-cursor: 3.1.0
+ slice-ansi: 4.0.0
+ wrap-ansi: 6.2.0
+ dev: true
+
+ /lower-case/2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+ dependencies:
+ tslib: 2.3.1
+ dev: true
+
+ /lru-cache/6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /magic-string/0.25.7:
+ resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==}
+ dependencies:
+ sourcemap-codec: 1.4.8
+
+ /magic-string/0.26.2:
+ resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==}
+ engines: {node: '>=12'}
+ dependencies:
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /make-dir/2.1.0:
+ resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.1
+ dev: true
+ optional: true
+
+ /make-error/1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: true
+
+ /make-iterator/1.0.1:
+ resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 6.0.3
+ dev: true
+
+ /map-cache/0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /map-obj/1.0.1:
+ resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /map-obj/4.3.0:
+ resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /map-visit/1.0.0:
+ resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/map-visit/-/map-visit-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ object-visit: 1.0.1
+ dev: true
+
+ /mathml-tag-names/2.1.3:
+ resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
+ dev: true
+
+ /mdn-data/2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+ dev: true
+
+ /memoize-one/6.0.0:
+ resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+ dev: false
+
+ /meow/8.1.2:
+ resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/minimist': 1.2.2
+ camelcase-keys: 6.2.2
+ decamelize-keys: 1.1.0
+ hard-rejection: 2.1.0
+ minimist-options: 4.1.0
+ normalize-package-data: 3.0.3
+ read-pkg-up: 7.0.1
+ redent: 3.0.0
+ trim-newlines: 3.0.1
+ type-fest: 0.18.1
+ yargs-parser: 20.2.9
+ dev: true
+
+ /meow/9.0.0:
+ resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/minimist': 1.2.2
+ camelcase-keys: 6.2.2
+ decamelize: 1.2.0
+ decamelize-keys: 1.1.0
+ hard-rejection: 2.1.0
+ minimist-options: 4.1.0
+ normalize-package-data: 3.0.3
+ read-pkg-up: 7.0.1
+ redent: 3.0.0
+ trim-newlines: 3.0.1
+ type-fest: 0.18.1
+ yargs-parser: 20.2.9
+ dev: true
+
+ /merge-stream/2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2/1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromatch/3.1.0:
+ resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2
+ define-property: 1.0.0
+ extend-shallow: 2.0.1
+ extglob: 2.0.4
+ fragment-cache: 0.2.1
+ kind-of: 5.1.0
+ nanomatch: 1.2.13
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /micromatch/4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /mime-db/1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-match/1.0.2:
+ resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==}
+ dependencies:
+ wildcard: 1.1.2
+ dev: false
+
+ /mime-types/2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: false
+
+ /mime/1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /mimic-fn/2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /mimic-fn/4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /min-indent/1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch/3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimist-options/4.1.0:
+ resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
+ engines: {node: '>= 6'}
+ dependencies:
+ arrify: 1.0.1
+ is-plain-obj: 1.1.0
+ kind-of: 6.0.3
+ dev: true
+
+ /minimist/1.2.6:
+ resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
+ dev: true
+
+ /mitt/3.0.0:
+ resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/mitt/-/mitt-3.0.0.tgz}
+ dev: false
+
+ /mixin-deep/1.3.2:
+ resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/mixin-deep/-/mixin-deep-1.3.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ for-in: 1.0.2
+ is-extendable: 1.0.1
+ dev: true
+
+ /mkdirp/1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /mrmime/1.0.0:
+ resolution: {integrity: sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ms/2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: true
+
+ /ms/2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: true
+
+ /ms/2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: true
+ optional: true
+
+ /multimatch/4.0.0:
+ resolution: {integrity: sha1-jDwPbj6ESa2grz3SnvtJGjdRkbM=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/multimatch/download/multimatch-4.0.0.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/minimatch': 3.0.5
+ array-differ: registry.nlark.com/array-differ/3.0.0
+ array-union: 2.1.0
+ arrify: 2.0.1
+ minimatch: 3.1.2
+ dev: true
+
+ /mute-stream/0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+ dev: true
+
+ /namespace-emitter/2.0.1:
+ resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
+ dev: false
+
+ /nanoid/3.3.4:
+ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /nanomatch/1.2.13:
+ resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/nanomatch/-/nanomatch-1.2.13.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ fragment-cache: 0.2.1
+ is-windows: 1.0.2
+ kind-of: 6.0.3
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /natural-compare/1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /needle/3.1.0:
+ resolution: {integrity: sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==}
+ engines: {node: '>= 4.4.x'}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ debug: 3.2.7
+ iconv-lite: 0.6.3
+ sax: 1.2.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+ optional: true
+
+ /neo-async/2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+ dev: true
+
+ /next-tick/1.0.0:
+ resolution: {integrity: sha512-mc/caHeUcdjnC/boPWJefDr4KUIWQNv+tlnFnJd38QMou86QtxQzBJfxgGRzvx8jazYRqrVlaHarfO72uNxPOg==}
+ dev: false
+
+ /no-case/3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.3.1
+ dev: true
+
+ /node-fetch/2.6.7:
+ resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: true
+
+ /node-html-parser/5.3.3:
+ resolution: {integrity: sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/node-html-parser/-/node-html-parser-5.3.3.tgz}
+ dependencies:
+ css-select: 4.2.1
+ he: 1.2.0
+ dev: true
+
+ /node-plop/0.31.0:
+ resolution: {integrity: sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ '@types/inquirer': 8.2.1
+ change-case: 4.1.2
+ del: 6.0.0
+ globby: 13.1.1
+ handlebars: 4.7.7
+ inquirer: 8.2.2
+ isbinaryfile: 4.0.10
+ lodash.get: 4.4.2
+ lower-case: 2.0.2
+ mkdirp: 1.0.4
+ resolve: 1.22.1
+ title-case: 3.0.3
+ upper-case: 2.0.2
+ dev: true
+
+ /node-releases/2.0.4:
+ resolution: {integrity: sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==}
+ dev: true
+
+ /normalize-package-data/2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.1
+ semver: 5.7.1
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-package-data/3.0.3:
+ resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+ engines: {node: '>=10'}
+ dependencies:
+ hosted-git-info: 4.0.2
+ is-core-module: 2.8.1
+ semver: 7.3.7
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-range/0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-wheel-es/1.1.2:
+ resolution: {integrity: sha512-scX83plWJXYH1J4+BhAuIHadROzxX0UBF3+HuZNY2Ks8BciE7tSTQ+5JhTsvzjaO0/EJdm4JBGrfObKxFf3Png==}
+ dev: false
+
+ /npm-run-path/4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /npm-run-path/5.1.0:
+ resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ path-key: 4.0.0
+ dev: true
+
+ /nprogress/0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/nprogress/download/nprogress-0.2.0.tgz}
+ requiresBuild: true
+ dev: false
+
+ /nth-check/2.0.1:
+ resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==}
+ dependencies:
+ boolbase: 1.0.0
+ dev: true
+
+ /object-assign/4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-copy/0.1.0:
+ resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/object-copy/-/object-copy-0.1.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ copy-descriptor: 0.1.1
+ define-property: 0.2.5
+ kind-of: 3.2.2
+ dev: true
+
+ /object-inspect/1.12.2:
+ resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
+
+ /object-visit/1.0.1:
+ resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/object-visit/-/object-visit-1.0.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /object.defaults/1.1.0:
+ resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ array-each: 1.0.1
+ array-slice: 1.1.0
+ for-own: 1.0.0
+ isobject: 3.0.1
+ dev: true
+
+ /object.map/1.0.1:
+ resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ for-own: 1.0.0
+ make-iterator: 1.0.1
+ dev: true
+
+ /object.pick/1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /on-finished/2.3.0:
+ resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ ee-first: 1.1.1
+ dev: true
+
+ /once/1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /onetime/5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
+ /onetime/6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ mimic-fn: 4.0.0
+ dev: true
+
+ /optionator/0.9.1:
+ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.3
+ dev: true
+
+ /ora/5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.6.1
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+ dev: true
+
+ /ora/6.1.0:
+ resolution: {integrity: sha512-CxEP6845hLK+NHFWZ+LplGO4zfw4QSfxTlqMfvlJ988GoiUeZDMzCvqsZkFHv69sPICmJH1MDxZoQFOKXerAVw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ bl: 5.0.0
+ chalk: 5.0.1
+ cli-cursor: 4.0.0
+ cli-spinners: 2.6.1
+ is-interactive: 2.0.0
+ is-unicode-supported: 1.2.0
+ log-symbols: 5.1.0
+ strip-ansi: 7.0.1
+ wcwidth: 1.0.1
+ dev: true
+
+ /os-tmpdir/1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /p-limit/2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+
+ /p-limit/3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate/4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+
+ /p-locate/5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /p-map/4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ aggregate-error: 3.1.0
+ dev: true
+
+ /p-try/2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/p-try/-/p-try-2.2.0.tgz}
+ engines: {node: '>=6'}
+
+ /param-case/3.0.4:
+ resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.3.1
+ dev: true
+
+ /parent-module/1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-filepath/1.0.2:
+ resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ is-absolute: 1.0.0
+ map-cache: 0.2.2
+ path-root: 0.1.1
+ dev: true
+
+ /parse-json/5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.16.7
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+ dev: true
+
+ /parse-node-version/1.0.1:
+ resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /parse-passwd/1.0.0:
+ resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /parse5-htmlparser2-tree-adapter/6.0.1:
+ resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
+ dependencies:
+ parse5: 6.0.1
+ dev: true
+
+ /parse5/6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+ dev: true
+
+ /parseurl/1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /pascal-case/3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.3.1
+ dev: true
+
+ /pascalcase/0.1.1:
+ resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/pascalcase/-/pascalcase-0.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-case/3.0.4:
+ resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.3.1
+ dev: true
+
+ /path-exists/4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ /path-is-absolute/1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-key/3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-key/4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /path-parse/1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: true
+
+ /path-root-regex/0.1.2:
+ resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-root/0.1.1:
+ resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ path-root-regex: 0.1.2
+ dev: true
+
+ /path-type/4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /pathe/0.2.0:
+ resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+ dev: true
+
+ /pathe/0.3.1:
+ resolution: {integrity: sha512-cKMVe/pikPpreoODbjoliSk0cIT66JjEOWN30akc9WTo8kUjxFPYqmXvMBVPMSAJGJlx6v/nYzqSSHkp1cfezQ==}
+ dev: true
+
+ /picocolors/1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ /picomatch/2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /pidtree/0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+ dev: true
+
+ /pify/4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+ dev: true
+ optional: true
+
+ /pinia-plugin-persist/1.0.0_pinia@2.0.16+vue@3.2.37:
+ resolution: {integrity: sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/pinia-plugin-persist/-/pinia-plugin-persist-1.0.0.tgz}
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0
+ pinia: ^2.0.0
+ vue: ^2.0.0 || >=3.0.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ dependencies:
+ pinia: 2.0.16_j6bzmzd4ujpabbp5objtwxyjp4
+ vue: 3.2.37
+ vue-demi: 0.12.1_vue@3.2.37
+ dev: false
+
+ /pinia/2.0.16_j6bzmzd4ujpabbp5objtwxyjp4:
+ resolution: {integrity: sha512-9/LMVO+/epny1NBfC77vnps4g3JRezxhhoF1xLUk8mZkUIxVnwfEAIRiAX8mYBTD/KCwZqnDMqXc8w3eU0FQGg==}
+ peerDependencies:
+ '@vue/composition-api': ^1.4.0
+ typescript: '>=4.4.4'
+ vue: ^2.6.14 || ^3.2.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@vue/devtools-api': 6.1.4
+ typescript: 4.7.4
+ vue: 3.2.37
+ vue-demi: 0.12.1_vue@3.2.37
+ dev: false
+
+ /plop/3.1.1:
+ resolution: {integrity: sha512-NuctKmuNUACXBQn25bBr5oj/75nHxdKGwjA/+b7cVoj1sp+gTVqcc8eAr4QcNJgMPsZWRJBN2kMkgmsqbqV9gg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@types/liftoff': 4.0.0
+ chalk: 5.0.1
+ interpret: 2.2.0
+ liftoff: 4.0.0
+ minimist: 1.2.6
+ node-plop: 0.31.0
+ ora: 6.1.0
+ v8flags: 4.0.0
+ dev: true
+
+ /pngjs/5.0.0:
+ resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+ engines: {node: '>=10.13.0'}
+ dev: false
+
+ /posix-character-classes/0.1.1:
+ resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /postcss-html/1.5.0:
+ resolution: {integrity: sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==}
+ engines: {node: ^12 || >=14}
+ dependencies:
+ htmlparser2: 8.0.1
+ js-tokens: 8.0.0
+ postcss: 8.4.14
+ postcss-safe-parser: 6.0.0_postcss@8.4.14
+ dev: true
+
+ /postcss-less/6.0.0_postcss@8.4.14:
+ resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/postcss-less/download/postcss-less-6.0.0.tgz}
+ engines: {node: '>=12'}
+ peerDependencies:
+ postcss: ^8.3.5
+ dependencies:
+ postcss: 8.4.14
+ dev: true
+
+ /postcss-media-query-parser/0.2.3:
+ resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+ dev: true
+
+ /postcss-prefix-selector/1.14.0_postcss@5.2.18:
+ resolution: {integrity: sha512-8d5fiBQZWMtGWH/7ewEeo6RnBNyT2kLD5wTIfV2oHYqH4hjiofg/rP5X3SUwnqOINzE4mM/K/UOAiNrIaKzd4w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/postcss-prefix-selector/-/postcss-prefix-selector-1.14.0.tgz}
+ peerDependencies:
+ postcss: 7.x || 8.x
+ dependencies:
+ postcss: 5.2.18
+ dev: true
+
+ /postcss-resolve-nested-selector/0.1.1:
+ resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==}
+ dev: true
+
+ /postcss-safe-parser/6.0.0_postcss@8.4.14:
+ resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.3.3
+ dependencies:
+ postcss: 8.4.14
+ dev: true
+
+ /postcss-selector-parser/6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /postcss-sorting/7.0.1_postcss@8.4.14:
+ resolution: {integrity: sha1-kjtSaEUc8tk+v4g14XplN3VwSaU=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/postcss-sorting/download/postcss-sorting-7.0.1.tgz}
+ peerDependencies:
+ postcss: ^8.3.9
+ dependencies:
+ postcss: 8.4.14
+ dev: true
+
+ /postcss-value-parser/4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ dev: true
+
+ /postcss/5.2.18:
+ resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ chalk: 1.1.3
+ js-base64: 2.6.4
+ source-map: 0.5.7
+ supports-color: 3.2.3
+ dev: true
+
+ /postcss/8.4.14:
+ resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.4
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+
+ /posthtml-parser/0.2.1:
+ resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz}
+ dependencies:
+ htmlparser2: 3.10.1
+ isobject: 2.1.0
+ dev: true
+
+ /posthtml-rename-id/1.0.12:
+ resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /posthtml-render/1.4.0:
+ resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/posthtml-render/-/posthtml-render-1.4.0.tgz}
+ engines: {node: '>=10'}
+ dev: true
+
+ /posthtml-svg-mode/1.0.3:
+ resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz}
+ dependencies:
+ merge-options: registry.nlark.com/merge-options/1.0.1
+ posthtml: 0.9.2
+ posthtml-parser: 0.2.1
+ posthtml-render: 1.4.0
+ dev: true
+
+ /posthtml/0.9.2:
+ resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/posthtml/-/posthtml-0.9.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ posthtml-parser: 0.2.1
+ posthtml-render: 1.4.0
+ dev: true
+
+ /preact/10.6.5:
+ resolution: {integrity: sha512-i+LXM6JiVjQXSt2jG2vZZFapGpCuk1fl8o6ii3G84MA3xgj686FKjs4JFDkmUVhtxyq21+4ay74zqPykz9hU6w==}
+ dev: false
+
+ /prelude-ls/1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prettier-linter-helpers/1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ fast-diff: 1.2.0
+ dev: true
+
+ /prettier/2.7.1:
+ resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dev: true
+
+ /pretty-quick/3.1.3_prettier@2.7.1:
+ resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/pretty-quick/download/pretty-quick-3.1.3.tgz}
+ engines: {node: '>=10.13'}
+ hasBin: true
+ peerDependencies:
+ prettier: '>=2.0.0'
+ dependencies:
+ chalk: 3.0.0
+ execa: 4.1.0
+ find-up: 4.1.0
+ ignore: 5.2.0
+ mri: registry.nlark.com/mri/1.2.0
+ multimatch: 4.0.0
+ prettier: 2.7.1
+ dev: true
+
+ /prismjs/1.26.0:
+ resolution: {integrity: sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /prr/1.0.1:
+ resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+ dev: true
+ optional: true
+
+ /pump/3.0.0:
+ resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+ dev: true
+
+ /punycode/2.1.1:
+ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /q/1.5.1:
+ resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==}
+ engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
+ dev: true
+
+ /qrcode/1.5.1:
+ resolution: {integrity: sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dependencies:
+ dijkstrajs: 1.0.2
+ encode-utf8: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
+ dev: false
+
+ /qs/6.11.0:
+ resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.0.4
+ dev: false
+
+ /query-string/4.3.4:
+ resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/query-string/-/query-string-4.3.4.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ object-assign: 4.1.1
+ strict-uri-encode: 1.1.0
+ dev: true
+
+ /queue-microtask/1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /quick-lru/4.0.1:
+ resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /read-pkg-up/7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+ dev: true
+
+ /read-pkg/5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.1
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+ dev: true
+
+ /readable-stream/3.6.0:
+ resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readdirp/3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /rechoir/0.8.0:
+ resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
+ engines: {node: '>= 10.13.0'}
+ dependencies:
+ resolve: 1.22.1
+ dev: true
+
+ /redent/3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+ dev: true
+
+ /regenerator-runtime/0.13.9:
+ resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
+ dev: false
+
+ /regex-not/1.0.2:
+ resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/regex-not/-/regex-not-1.0.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 3.0.2
+ safe-regex: 1.1.0
+ dev: true
+
+ /regexpp/3.2.0:
+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /relateurl/0.2.7:
+ resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/relateurl/-/relateurl-0.2.7.tgz}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /repeat-element/1.1.4:
+ resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/repeat-element/-/repeat-element-1.1.4.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /repeat-string/1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/repeat-string/-/repeat-string-1.6.1.tgz}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /require-directory/2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ /require-from-string/2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-main-filename/2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+ dev: false
+
+ /resolve-dir/1.0.1:
+ resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ expand-tilde: 2.0.2
+ global-modules: 1.0.0
+ dev: true
+
+ /resolve-from/4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-from/5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve-global/1.0.0:
+ resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==}
+ engines: {node: '>=8'}
+ dependencies:
+ global-dirs: 0.1.1
+ dev: true
+
+ /resolve-url/0.2.1:
+ resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/resolve-url/-/resolve-url-0.2.1.tgz}
+ deprecated: https://github.com/lydell/resolve-url#deprecated
+ dev: true
+
+ /resolve/1.22.1:
+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.9.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /restore-cursor/3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /restore-cursor/4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /ret/0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/ret/-/ret-0.1.15.tgz}
+ engines: {node: '>=0.12'}
+ dev: true
+
+ /reusify/1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rfdc/1.3.0:
+ resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
+ dev: true
+
+ /rimraf/3.0.2:
+ resolution: {integrity: sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz}
+ hasBin: true
+ dependencies:
+ glob: 7.2.0
+ dev: true
+
+ /rollup-plugin-purge-icons/0.8.1:
+ resolution: {integrity: sha512-7ktMV+gWtXAdOIShE8EtTcnpGhozi5H2hKk1MQVGt+7FmlLkjR+XKu1Nyzjocwd6xJvKube2Lh+SfcJ8FYYySw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/rollup-plugin-purge-icons/-/rollup-plugin-purge-icons-0.8.1.tgz}
+ engines: {node: '>= 12'}
+ dependencies:
+ '@purge-icons/core': 0.8.0
+ '@purge-icons/generated': 0.8.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /rollup/2.77.0:
+ resolution: {integrity: sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /run-async/2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /run-parallel/1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /rxjs/7.5.5:
+ resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==}
+ dependencies:
+ tslib: 2.3.1
+ dev: true
+
+ /safe-buffer/5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+
+ /safe-buffer/5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-regex/1.1.0:
+ resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/safe-regex/-/safe-regex-1.1.0.tgz}
+ dependencies:
+ ret: 0.1.15
+ dev: true
+
+ /safer-buffer/2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: true
+
+ /sax/1.2.4:
+ resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+ dev: true
+ optional: true
+
+ /scroll-into-view-if-needed/2.2.29:
+ resolution: {integrity: sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==}
+ dependencies:
+ compute-scroll-into-view: 1.0.17
+ dev: false
+
+ /semver/5.7.1:
+ resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
+ hasBin: true
+ dev: true
+
+ /semver/6.3.0:
+ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
+ hasBin: true
+ dev: true
+
+ /semver/7.3.7:
+ resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /sentence-case/3.0.4:
+ resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.3.1
+ upper-case-first: 2.0.2
+ dev: true
+
+ /set-blocking/2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ dev: false
+
+ /set-value/2.0.1:
+ resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/set-value/-/set-value-2.0.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 2.0.1
+ is-extendable: 0.1.1
+ is-plain-object: 2.0.4
+ split-string: 3.1.0
+ dev: true
+
+ /shebang-command/2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex/3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /side-channel/1.0.4:
+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.1
+ object-inspect: 1.12.2
+ dev: false
+
+ /signal-exit/3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /sirv/1.0.19:
+ resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@polka/url': 1.0.0-next.21
+ mrmime: 1.0.0
+ totalist: 1.1.0
+ dev: true
+
+ /slash/3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /slash/4.0.0:
+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /slate-history/0.66.0_slate@0.72.8:
+ resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==}
+ peerDependencies:
+ slate: '>=0.65.3'
+ dependencies:
+ is-plain-object: 5.0.0
+ slate: 0.72.8
+ dev: false
+
+ /slate/0.72.8:
+ resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==}
+ dependencies:
+ immer: 9.0.12
+ is-plain-object: 5.0.0
+ tiny-warning: 1.0.3
+ dev: false
+
+ /slice-ansi/3.0.0:
+ resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /slice-ansi/4.0.0:
+ resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /slice-ansi/5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.1.0
+ is-fullwidth-code-point: 4.0.0
+ dev: true
+
+ /snabbdom/3.3.1:
+ resolution: {integrity: sha512-FR9u20dCkktPd+qbedqwYNjMXzYhizhqlKTQzYZimLNeCJY0/5qgs0DtLVSmzIEL1bN3Dyb9sQpiHGCxUjyLnQ==}
+ engines: {node: '>=8.3.0'}
+ dev: false
+
+ /snake-case/3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.3.1
+ dev: true
+
+ /snapdragon-node/2.1.1:
+ resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 1.0.0
+ isobject: 3.0.1
+ snapdragon-util: 3.0.1
+ dev: true
+
+ /snapdragon-util/3.0.1:
+ resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /snapdragon/0.8.2:
+ resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/snapdragon/-/snapdragon-0.8.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ base: 0.11.2
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ map-cache: 0.2.2
+ source-map: 0.5.7
+ source-map-resolve: 0.5.3
+ use: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /source-map-js/1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map-resolve/0.5.3:
+ resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz}
+ deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+ dependencies:
+ atob: 2.1.2
+ decode-uri-component: 0.2.0
+ resolve-url: 0.2.1
+ source-map-url: 0.4.1
+ urix: 0.1.0
+ dev: true
+
+ /source-map-support/0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/source-map-support/-/source-map-support-0.5.21.tgz}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map-url/0.4.1:
+ resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/source-map-url/-/source-map-url-0.4.1.tgz}
+ deprecated: See https://github.com/lydell/source-map-url#deprecated
+ dev: true
+
+ /source-map/0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map/0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map/0.7.3:
+ resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /sourcemap-codec/1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+
+ /spdx-correct/3.1.1:
+ resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.11
+ dev: true
+
+ /spdx-exceptions/2.3.0:
+ resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
+ dev: true
+
+ /spdx-expression-parse/3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.3.0
+ spdx-license-ids: 3.0.11
+ dev: true
+
+ /spdx-license-ids/3.0.11:
+ resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==}
+ dev: true
+
+ /split-string/3.1.0:
+ resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/split-string/-/split-string-3.1.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 3.0.2
+ dev: true
+
+ /split2/3.2.2:
+ resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
+ dependencies:
+ readable-stream: 3.6.0
+ dev: true
+
+ /ssr-window/3.0.0:
+ resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==}
+ dev: false
+
+ /stable/0.1.8:
+ resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/stable/-/stable-0.1.8.tgz}
+ dev: true
+
+ /static-extend/0.1.2:
+ resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/static-extend/-/static-extend-0.1.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 0.2.5
+ object-copy: 0.1.0
+ dev: true
+
+ /statuses/1.5.0:
+ resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /strict-uri-encode/1.1.0:
+ resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /string-argv/0.3.1:
+ resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==}
+ engines: {node: '>=0.6.19'}
+ dev: true
+
+ /string-width/4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ /string-width/5.0.1:
+ resolution: {integrity: sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==}
+ engines: {node: '>=12'}
+ dependencies:
+ emoji-regex: 9.2.2
+ is-fullwidth-code-point: 4.0.0
+ strip-ansi: 7.0.1
+ dev: true
+
+ /string_decoder/1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /strip-ansi/3.0.1:
+ resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: true
+
+ /strip-ansi/6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+
+ /strip-ansi/7.0.1:
+ resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.0.1
+ dev: true
+
+ /strip-final-newline/2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-final-newline/3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /strip-indent/3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments/3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /style-search/0.1.0:
+ resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
+ dev: true
+
+ /stylelint-config-html/1.1.0_5rxrxgs7sjazj2ve56ds3kmipi:
+ resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==}
+ engines: {node: ^12 || >=14}
+ peerDependencies:
+ postcss-html: ^1.0.0
+ stylelint: '>=14.0.0'
+ dependencies:
+ postcss-html: 1.5.0
+ stylelint: 14.9.1
+ dev: true
+
+ /stylelint-config-prettier/9.0.3_stylelint@14.9.1:
+ resolution: {integrity: sha1-Dczr7/NZ3MOTySKRhECLCJZNVhw=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/stylelint-config-prettier/download/stylelint-config-prettier-9.0.3.tgz}
+ engines: {node: '>= 12'}
+ hasBin: true
+ peerDependencies:
+ stylelint: '>=11.0.0'
+ dependencies:
+ stylelint: 14.9.1
+ dev: true
+
+ /stylelint-config-recommended/8.0.0_stylelint@14.9.1:
+ resolution: {integrity: sha512-IK6dWvE000+xBv9jbnHOnBq01gt6HGVB2ZTsot+QsMpe82doDQ9hvplxfv4YnpEuUwVGGd9y6nbaAnhrjcxhZQ==}
+ peerDependencies:
+ stylelint: ^14.8.0
+ dependencies:
+ stylelint: 14.9.1
+ dev: true
+
+ /stylelint-config-standard/26.0.0_stylelint@14.9.1:
+ resolution: {integrity: sha512-hUuB7LaaqM8abvkOO84wh5oYSkpXgTzHu2Zza6e7mY+aOmpNTjoFBRxSLlzY0uAOMWEFx0OMKzr+reG1BUtcqQ==}
+ peerDependencies:
+ stylelint: ^14.9.0
+ dependencies:
+ stylelint: 14.9.1
+ stylelint-config-recommended: 8.0.0_stylelint@14.9.1
+ dev: true
+
+ /stylelint-order/5.0.0_stylelint@14.9.1:
+ resolution: {integrity: sha1-q9IPa4WsZAd0y+QOcNP+nG/fRAA=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/stylelint-order/download/stylelint-order-5.0.0.tgz}
+ peerDependencies:
+ stylelint: ^14.0.0
+ dependencies:
+ postcss: 8.4.14
+ postcss-sorting: 7.0.1_postcss@8.4.14
+ stylelint: 14.9.1
+ dev: true
+
+ /stylelint/14.9.1:
+ resolution: {integrity: sha512-RdAkJdPiLqHawCSnu21nE27MjNXaVd4WcOHA4vK5GtIGjScfhNnaOuWR2wWdfKFAvcWQPOYe311iveiVKSmwsA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@csstools/selector-specificity': 2.0.1_444rcjjorr3kpoqtvoodsr46pu
+ balanced-match: 2.0.0
+ colord: 2.9.2
+ cosmiconfig: 7.0.1
+ css-functions-list: 3.1.0
+ debug: 4.3.4
+ execall: 2.0.0
+ fast-glob: 3.2.11
+ fastest-levenshtein: 1.0.12
+ file-entry-cache: 6.0.1
+ get-stdin: 8.0.0
+ global-modules: 2.0.0
+ globby: 11.1.0
+ globjoin: 0.1.4
+ html-tags: 3.2.0
+ ignore: 5.2.0
+ import-lazy: 4.0.0
+ imurmurhash: 0.1.4
+ is-plain-object: 5.0.0
+ known-css-properties: 0.25.0
+ mathml-tag-names: 2.1.3
+ meow: 9.0.0
+ micromatch: 4.0.5
+ normalize-path: 3.0.0
+ picocolors: 1.0.0
+ postcss: 8.4.14
+ postcss-media-query-parser: 0.2.3
+ postcss-resolve-nested-selector: 0.1.1
+ postcss-safe-parser: 6.0.0_postcss@8.4.14
+ postcss-selector-parser: 6.0.10
+ postcss-value-parser: 4.2.0
+ resolve-from: 5.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ style-search: 0.1.0
+ supports-hyperlinks: 2.2.0
+ svg-tags: 1.0.0
+ table: 6.8.0
+ v8-compile-cache: 2.3.0
+ write-file-atomic: 4.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /supports-color/2.0.0:
+ resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /supports-color/3.2.3:
+ resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
+ engines: {node: '>=0.8.0'}
+ dependencies:
+ has-flag: 1.0.0
+ dev: true
+
+ /supports-color/5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: true
+
+ /supports-color/7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-hyperlinks/2.2.0:
+ resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /supports-preserve-symlinks-flag/1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /svg-tags/1.0.0:
+ resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+ dev: true
+
+ /svgo/2.8.0:
+ resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/svgo/-/svgo-2.8.0.tgz}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 4.2.1
+ css-tree: 1.1.3
+ csso: 4.2.0
+ picocolors: 1.0.0
+ stable: 0.1.8
+ dev: true
+
+ /table/6.8.0:
+ resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ ajv: 8.11.0
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /terser/5.10.0:
+ resolution: {integrity: sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/terser/-/terser-5.10.0.tgz}
+ engines: {node: '>=10'}
+ hasBin: true
+ peerDependenciesMeta:
+ acorn:
+ optional: true
+ dependencies:
+ acorn: 8.7.1
+ commander: 2.20.3
+ source-map: 0.7.3
+ source-map-support: 0.5.21
+ dev: true
+
+ /text-extensions/1.9.0:
+ resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /text-table/0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /through/2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
+ /through2/4.0.2:
+ resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
+ dependencies:
+ readable-stream: 3.6.0
+ dev: true
+
+ /tiny-warning/1.0.3:
+ resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+ dev: false
+
+ /title-case/3.0.3:
+ resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==}
+ dependencies:
+ tslib: 2.3.1
+ dev: true
+
+ /tmp/0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ os-tmpdir: 1.0.2
+ dev: true
+
+ /to-fast-properties/2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ /to-object-path/0.3.0:
+ resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-object-path/-/to-object-path-0.3.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /to-regex-range/2.1.1:
+ resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ dev: true
+
+ /to-regex-range/5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /to-regex/3.0.2:
+ resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-regex/-/to-regex-3.0.2.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ regex-not: 1.0.2
+ safe-regex: 1.1.0
+ dev: true
+
+ /totalist/1.1.0:
+ resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /tr46/0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/tr46/-/tr46-0.0.3.tgz}
+ dev: true
+
+ /traverse/0.6.6:
+ resolution: {integrity: sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/traverse/-/traverse-0.6.6.tgz}
+ dev: true
+
+ /trim-newlines/3.0.1:
+ resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ts-node/10.7.0_tdn3ypgnfy6bmey2q4hu5jonwi:
+ resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+ dependencies:
+ '@cspotcode/source-map-support': 0.7.0
+ '@tsconfig/node10': 1.0.8
+ '@tsconfig/node12': 1.0.9
+ '@tsconfig/node14': 1.0.1
+ '@tsconfig/node16': 1.0.2
+ '@types/node': 18.0.6
+ acorn: 8.7.1
+ acorn-walk: 8.2.0
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 4.7.4
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ dev: true
+
+ /tslib/1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ dev: true
+
+ /tslib/2.3.0:
+ resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+ dev: false
+
+ /tslib/2.3.1:
+ resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==}
+ dev: true
+
+ /tsutils/3.21.0_typescript@4.7.4:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ 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'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 4.7.4
+ dev: true
+
+ /type-check/0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-fest/0.18.1:
+ resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest/0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest/0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type/1.2.0:
+ resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
+ dev: false
+
+ /type/2.6.0:
+ resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==}
+ dev: false
+
+ /typescript/4.7.4:
+ resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ /uglify-js/3.15.3:
+ resolution: {integrity: sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /unc-path-regex/0.1.2:
+ resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /union-value/1.0.1:
+ resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/union-value/-/union-value-1.0.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-union: 3.1.0
+ get-value: 2.0.6
+ is-extendable: 0.1.1
+ set-value: 2.0.1
+ dev: true
+
+ /universalify/2.0.0:
+ resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
+ engines: {node: '>= 10.0.0'}
+ dev: true
+
+ /unpipe/1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /unplugin-vue-define-options/0.6.2_r5lvqzud3cqtmwu636rwgh22ui:
+ resolution: {integrity: sha512-0YAbugPnN57ZkUM0fygfp43Vm321vOUYy2s81O09SfCM08mSul4vMxOZxLj9VSa3NVPF/IN0FmGyTMB5exOdyQ==}
+ engines: {node: '>=14.19.0'}
+ peerDependencies:
+ vue: ^3.2.25
+ dependencies:
+ '@rollup/pluginutils': 4.2.1
+ '@vue/compiler-sfc': 3.2.37
+ unplugin: 0.7.1_rollup@2.77.0+vite@3.0.1
+ vue: 3.2.37
+ transitivePeerDependencies:
+ - esbuild
+ - rollup
+ - vite
+ - webpack
+ dev: true
+
+ /unplugin/0.7.1_rollup@2.77.0+vite@3.0.1:
+ resolution: {integrity: sha512-Z6hNDXDNh9aimMkPU1mEjtk+2ova8gh0y7rJeJdGH1vWZOHwF2lLQiQ/R97rv9ymmzEQXsR2fyMet72T8jy6ew==}
+ peerDependencies:
+ esbuild: '>=0.13'
+ rollup: ^2.50.0
+ vite: ^2.3.0 || ^3.0.0-0
+ webpack: 4 || 5
+ peerDependenciesMeta:
+ esbuild:
+ optional: true
+ rollup:
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
+ dependencies:
+ acorn: 8.7.1
+ chokidar: 3.5.3
+ rollup: 2.77.0
+ vite: 3.0.1_less@4.1.3
+ webpack-sources: 3.2.3
+ webpack-virtual-modules: 0.4.4
+ dev: true
+
+ /unset-value/1.0.0:
+ resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/unset-value/-/unset-value-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+ dev: true
+
+ /upper-case-first/2.0.2:
+ resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
+ dependencies:
+ tslib: 2.3.1
+ dev: true
+
+ /upper-case/2.0.2:
+ resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==}
+ dependencies:
+ tslib: 2.3.1
+ dev: true
+
+ /uri-js/4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.1.1
+ dev: true
+
+ /urix/0.1.0:
+ resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/urix/-/urix-0.1.0.tgz}
+ deprecated: Please see https://github.com/lydell/urix#deprecated
+ dev: true
+
+ /use/3.1.1:
+ resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/use/-/use-3.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /util-deprecate/1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /utils-merge/1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+ dev: true
+
+ /v8-compile-cache-lib/3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ dev: true
+
+ /v8-compile-cache/2.3.0:
+ resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
+ dev: true
+
+ /v8flags/4.0.0:
+ resolution: {integrity: sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==}
+ engines: {node: '>= 10.13.0'}
+ dev: true
+
+ /validate-npm-package-license/3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.1.1
+ spdx-expression-parse: 3.0.1
+ dev: true
+
+ /vary/1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vary/-/vary-1.1.2.tgz}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /vite-plugin-eslint/1.6.1_eslint@8.20.0+vite@3.0.1:
+ resolution: {integrity: sha512-wXwGJ222zjlllHmmPXX6oSU8DbmYjnA6HHBYbOLT8WAc73j4/YAtBQHCVSoHOTPiT4TPzsuZSvputWwc86BweQ==}
+ peerDependencies:
+ eslint: '>=7'
+ vite: ^2.0.0
+ dependencies:
+ '@rollup/pluginutils': 4.2.1
+ '@types/eslint': 8.4.2
+ eslint: 8.20.0
+ rollup: 2.77.0
+ vite: 3.0.1_less@4.1.3
+ dev: true
+
+ /vite-plugin-html/3.2.0_vite@3.0.1:
+ resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz}
+ peerDependencies:
+ vite: '>=2.0.0'
+ dependencies:
+ '@rollup/pluginutils': 4.2.0
+ colorette: 2.0.16
+ connect-history-api-fallback: 1.6.0
+ consola: 2.15.3
+ dotenv: 16.0.0
+ dotenv-expand: 8.0.2
+ ejs: 3.1.6
+ fast-glob: 3.2.11
+ fs-extra: 10.0.1
+ html-minifier-terser: 6.1.0
+ node-html-parser: 5.3.3
+ pathe: 0.2.0
+ vite: 3.0.1_less@4.1.3
+ dev: true
+
+ /vite-plugin-purge-icons/0.8.1_vite@3.0.1:
+ resolution: {integrity: sha512-H77YDvECkdzwsgYTu6LR5Nx0wey5Hporw+3/hTYTZh7D7YcarS+RsOvpUEgd2XG5fChgCmMBtMfnr2JmrNanSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.8.1.tgz}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ vite: ^2.0.0-beta.3
+ dependencies:
+ '@purge-icons/core': 0.8.0
+ '@purge-icons/generated': 0.8.1
+ rollup-plugin-purge-icons: 0.8.1
+ vite: 3.0.1_less@4.1.3
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /vite-plugin-style-import/1.4.1_vite@3.0.1:
+ resolution: {integrity: sha512-lJCRvm7+So0hHdnSJiJPg9gD5mxtL6YY0jmhEph+k7ArpsyvqOh6han2kG5htbWWDZxHkUN9d1BuTFL//yCLLQ==}
+ peerDependencies:
+ vite: '>=2.0.0'
+ dependencies:
+ '@rollup/pluginutils': 4.2.0
+ change-case: 4.1.2
+ debug: 4.3.4
+ es-module-lexer: 0.9.3
+ fs-extra: 10.0.1
+ magic-string: 0.25.7
+ vite: 3.0.1_less@4.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /vite-plugin-svg-icons/2.0.1_vite@3.0.1:
+ resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz}
+ peerDependencies:
+ vite: '>=2.0.0'
+ dependencies:
+ '@types/svgo': 2.6.1
+ cors: 2.8.5
+ debug: 4.3.3
+ etag: 1.8.1
+ fs-extra: 10.0.0
+ pathe: 0.2.0
+ svg-baker: registry.nlark.com/svg-baker/1.7.0
+ svgo: 2.8.0
+ vite: 3.0.1_less@4.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /vite-plugin-windicss/1.8.7_vite@3.0.1:
+ resolution: {integrity: sha512-/zwQ8+RV+MSkbG0IGqsEma6r2R01NzN/aNpNjJD7VVAkxAptNznqDXOObFTskkWfZ+9m6KJZCOuCPgAFtQIzEA==}
+ peerDependencies:
+ vite: ^2.0.1 || ^3.0.0
+ dependencies:
+ '@windicss/plugin-utils': 1.8.7
+ debug: 4.3.4
+ kolorist: 1.5.1
+ vite: 3.0.1_less@4.1.3
+ windicss: 3.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /vite/3.0.1_less@4.1.3:
+ resolution: {integrity: sha512-nefKSglkoEsDpYUkBuT2++L04ktcP8fz8dxLtmZdDdMyhubFSOLFw6BTh/46Fc6tIX/cibs/NVYWNrsqn0k6pQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.14.49
+ less: 4.1.3
+ postcss: 8.4.14
+ resolve: 1.22.1
+ rollup: 2.77.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /vue-cropper/1.0.3:
+ resolution: {integrity: sha512-yDrZkE4H5vOiMA9WQHE+6rmXrZ1S9TMZasEPAZPKg/2I/nySHL4ECD1lNxt7+ofTPKT+9+2sQkCwagPqEqiqJg==}
+ dev: false
+
+ /vue-demi/0.12.1_vue@3.2.37:
+ resolution: {integrity: sha512-QL3ny+wX8c6Xm1/EZylbgzdoDolye+VpCXRhI2hug9dJTP3OUJ3lmiKN3CsVV3mOJKwFi0nsstbgob0vG7aoIw==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ dependencies:
+ vue: 3.2.37
+ dev: false
+
+ /vue-eslint-parser/9.0.2_eslint@8.20.0:
+ resolution: {integrity: sha512-uCPQwTGjOtAYrwnU+76pYxalhjsh7iFBsHwBqDHiOPTxtICDaraO4Szw54WFTNZTAEsgHHzqFOu1mmnBOBRzDA==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=6.0.0'
+ dependencies:
+ debug: 4.3.4
+ eslint: 8.20.0
+ eslint-scope: 7.1.1
+ eslint-visitor-keys: 3.3.0
+ espree: 9.3.2
+ esquery: 1.4.0
+ lodash: 4.17.21
+ semver: 7.3.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /vue-i18n/9.1.10_vue@3.2.37:
+ resolution: {integrity: sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==}
+ engines: {node: '>= 10'}
+ peerDependencies:
+ vue: ^3.0.0
+ dependencies:
+ '@intlify/core-base': 9.1.10
+ '@intlify/shared': 9.1.10
+ '@intlify/vue-devtools': 9.1.10
+ '@vue/devtools-api': 6.1.4
+ vue: 3.2.37
+
+ /vue-router/4.1.2_vue@3.2.37:
+ resolution: {integrity: sha512-5BP1qXFncVRwgV/XnqzsKApdMjQPqWIpoUBdL1ynz8HyLxIX/UDAx7Ql2BjmA5CXT/p61JfZvkpiFWFpaqcfag==}
+ peerDependencies:
+ vue: ^3.2.0
+ dependencies:
+ '@vue/devtools-api': 6.1.4
+ vue: 3.2.37
+ dev: false
+
+ /vue-tsc/0.38.8_typescript@4.7.4:
+ resolution: {integrity: sha512-hhyc5SODiekcYNXG08aNg17LogR19o3i14avVejo+Fm45Dqk9Ke6rb0M19HoTKdQGfZBgqg2VUboYxmtAukWeg==}
+ hasBin: true
+ peerDependencies:
+ typescript: '*'
+ dependencies:
+ '@volar/vue-typescript': 0.38.8
+ typescript: 4.7.4
+ dev: true
+
+ /vue-types/4.1.1_vue@3.2.37:
+ resolution: {integrity: sha1-fXpOSgEkmlG22j+qMBJIwupfW5c=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vue-types/download/vue-types-4.1.1.tgz}
+ engines: {node: '>=12.16.0'}
+ peerDependencies:
+ vue: ^2.0.0 || ^3.0.0
+ dependencies:
+ is-plain-object: registry.nlark.com/is-plain-object/5.0.0
+ vue: 3.2.37
+ dev: false
+
+ /vue/3.2.37:
+ resolution: {integrity: sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==}
+ dependencies:
+ '@vue/compiler-dom': 3.2.37
+ '@vue/compiler-sfc': 3.2.37
+ '@vue/runtime-dom': 3.2.37
+ '@vue/server-renderer': 3.2.37_vue@3.2.37
+ '@vue/shared': 3.2.37
+
+ /wcwidth/1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ dependencies:
+ defaults: 1.0.3
+ dev: true
+
+ /web-storage-cache/1.1.1:
+ resolution: {integrity: sha1-QqwH536oYOiEiVvpupmrHgTrFi4=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/web-storage-cache/download/web-storage-cache-1.1.1.tgz}
+ dev: false
+
+ /webidl-conversions/3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz}
+ dev: true
+
+ /webpack-sources/3.2.3:
+ resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+ engines: {node: '>=10.13.0'}
+ dev: true
+
+ /webpack-virtual-modules/0.4.4:
+ resolution: {integrity: sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==}
+ dev: true
+
+ /whatwg-url/5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/whatwg-url/-/whatwg-url-5.0.0.tgz}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+ dev: true
+
+ /which-module/2.0.0:
+ resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==}
+ dev: false
+
+ /which/1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /which/2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /wildcard/1.1.2:
+ resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==}
+ dev: false
+
+ /windicss-analysis/0.3.5:
+ resolution: {integrity: sha512-g7306c47Yc9c0nAhVLwVDVYt+MQmxGfpg1Q06mP4+j5nqCrJgh18Km4HyL8BABv7wo6BdUN7FeVtxb+u5TokxA==}
+ hasBin: true
+ dependencies:
+ '@windicss/plugin-utils': 1.8.4
+ cac: 6.7.12
+ connect: 3.7.0
+ declass: 0.0.1
+ fast-glob: 3.2.11
+ fs-extra: 10.0.1
+ sirv: 1.0.19
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /windicss/3.5.6:
+ resolution: {integrity: sha512-P1mzPEjgFMZLX0ZqfFht4fhV/FX8DTG7ERG1fBLiWvd34pTLVReS5CVsewKn9PApSgXnVfPWwvq+qUsRwpnwFA==}
+ engines: {node: '>= 12'}
+ hasBin: true
+ dev: true
+
+ /word-wrap/1.2.3:
+ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /wordwrap/1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
+ dev: true
+
+ /wrap-ansi/6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ /wrap-ansi/7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrappy/1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /write-file-atomic/4.0.1:
+ resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16}
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+ dev: true
+
+ /xml-name-validator/4.0.0:
+ resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /y18n/4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+ dev: false
+
+ /y18n/5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yallist/4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yaml-eslint-parser/0.3.2:
+ resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==}
+ dependencies:
+ eslint-visitor-keys: 1.3.0
+ lodash: 4.17.21
+ yaml: 1.10.2
+ dev: true
+
+ /yaml/1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /yaml/2.1.1:
+ resolution: {integrity: sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==}
+ engines: {node: '>= 14'}
+ dev: true
+
+ /yargs-parser/18.1.3:
+ resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
+ dev: false
+
+ /yargs-parser/20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yargs-parser/21.0.0:
+ resolution: {integrity: sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs/15.4.1:
+ resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+ engines: {node: '>=8'}
+ dependencies:
+ cliui: 6.0.0
+ decamelize: 1.2.0
+ find-up: 4.1.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 4.2.3
+ which-module: 2.0.0
+ y18n: 4.0.3
+ yargs-parser: 18.1.3
+ dev: false
+
+ /yargs/17.3.1:
+ resolution: {integrity: sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==}
+ engines: {node: '>=12'}
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.1.1
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.0.0
+ dev: true
+
+ /yn/3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /yocto-queue/0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /zrender/5.3.2:
+ resolution: {integrity: sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==}
+ dependencies:
+ tslib: 2.3.0
+ dev: false
+
+ registry.nlark.com/array-differ/3.0.0:
+ resolution: {integrity: sha1-PLs9DzFoEOr8xHYkc0I31q7krms=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/array-differ/download/array-differ-3.0.0.tgz}
+ name: array-differ
+ version: 3.0.0
+ engines: {node: '>=8'}
+ dev: true
+
+ registry.nlark.com/is-plain-object/5.0.0:
+ resolution: {integrity: sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/is-plain-object/download/is-plain-object-5.0.0.tgz}
+ name: is-plain-object
+ version: 5.0.0
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ registry.nlark.com/lodash-es/4.17.21:
+ resolution: {integrity: sha1-Q+YmxG5lkbd1C+srUBFzkMYJ4+4=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/lodash-es/download/lodash-es-4.17.21.tgz}
+ name: lodash-es
+ version: 4.17.21
+ dev: false
+
+ registry.nlark.com/merge-options/1.0.1:
+ resolution: {integrity: sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/merge-options/download/merge-options-1.0.1.tgz?cache=0&sync_timestamp=1631523200726&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmerge-options%2Fdownload%2Fmerge-options-1.0.1.tgz}
+ name: merge-options
+ version: 1.0.1
+ engines: {node: '>=4'}
+ dependencies:
+ is-plain-obj: 1.1.0
+ dev: true
+
+ registry.nlark.com/mri/1.2.0:
+ resolution: {integrity: sha1-ZyFID+wqEaSImGERWki2y+fMjws=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/mri/download/mri-1.2.0.tgz}
+ name: mri
+ version: 1.2.0
+ engines: {node: '>=4'}
+ dev: true
+
+ registry.nlark.com/svg-baker/1.7.0:
+ resolution: {integrity: sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/svg-baker/download/svg-baker-1.7.0.tgz}
+ name: svg-baker
+ version: 1.7.0
+ dependencies:
+ bluebird: 3.7.2
+ clone: 2.1.2
+ he: 1.2.0
+ image-size: 0.5.5
+ loader-utils: 1.4.0
+ merge-options: registry.nlark.com/merge-options/1.0.1
+ micromatch: 3.1.0
+ postcss: 5.2.18
+ postcss-prefix-selector: 1.14.0_postcss@5.2.18
+ posthtml-rename-id: 1.0.12
+ posthtml-svg-mode: 1.0.3
+ query-string: 4.3.4
+ traverse: 0.6.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
diff --git a/yudao-ui-admin-vue3/postcss.config.js b/yudao-ui-admin-vue3/postcss.config.js
new file mode 100644
index 0000000000..961986e2b1
--- /dev/null
+++ b/yudao-ui-admin-vue3/postcss.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ plugins: {
+ autoprefixer: {}
+ }
+}
diff --git a/yudao-ui-admin-vue3/prettier.config.js b/yudao-ui-admin-vue3/prettier.config.js
new file mode 100644
index 0000000000..b46239fe4d
--- /dev/null
+++ b/yudao-ui-admin-vue3/prettier.config.js
@@ -0,0 +1,19 @@
+module.exports = {
+ printWidth: 100,
+ tabWidth: 2,
+ useTabs: false,
+ semi: false,
+ vueIndentScriptAndStyle: false,
+ singleQuote: true,
+ quoteProps: 'as-needed',
+ bracketSpacing: true,
+ trailingComma: 'none',
+ jsxSingleQuote: false,
+ arrowParens: 'always',
+ insertPragma: false,
+ requirePragma: false,
+ proseWrap: 'never',
+ htmlWhitespaceSensitivity: 'strict',
+ endOfLine: 'auto',
+ rangeStart: 0
+}
diff --git a/yudao-ui-admin-vue3/public/favicon.ico b/yudao-ui-admin-vue3/public/favicon.ico
new file mode 100644
index 0000000000..5a7de08267
Binary files /dev/null and b/yudao-ui-admin-vue3/public/favicon.ico differ
diff --git a/yudao-ui-admin-vue3/public/logo.gif b/yudao-ui-admin-vue3/public/logo.gif
new file mode 100644
index 0000000000..fdbd32c675
Binary files /dev/null and b/yudao-ui-admin-vue3/public/logo.gif differ
diff --git a/yudao-ui-admin-vue3/src/App.vue b/yudao-ui-admin-vue3/src/App.vue
new file mode 100644
index 0000000000..08d6b99970
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/App.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/api/infra/apiAccessLog/index.ts b/yudao-ui-admin-vue3/src/api/infra/apiAccessLog/index.ts
new file mode 100644
index 0000000000..90a7daf5ea
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/apiAccessLog/index.ts
@@ -0,0 +1,12 @@
+import { defHttp } from '@/config/axios'
+import { ApiAccessLogVO } from './types'
+
+// 查询列表API 访问日志
+export const getApiAccessLogPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/api-access-log/page', params })
+}
+
+// 导出API 访问日志
+export const exportApiAccessLogApi = (params) => {
+ return defHttp.get({ url: '/infra/api-access-log/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/apiAccessLog/types.ts b/yudao-ui-admin-vue3/src/api/infra/apiAccessLog/types.ts
new file mode 100644
index 0000000000..5e2a42c986
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/apiAccessLog/types.ts
@@ -0,0 +1,14 @@
+export type ApiAccessLogVO = {
+ id: number
+ traceId: string
+ userId: string
+ userType: string
+ applicationName: string
+ requestMethod: string
+ requestParams: string
+ requestUrl: string
+ beginTime: string
+ endTIme: string
+ duration: string
+ resultCode: number
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/apiErrorLog/index.ts b/yudao-ui-admin-vue3/src/api/infra/apiErrorLog/index.ts
new file mode 100644
index 0000000000..2e0ba268b3
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/apiErrorLog/index.ts
@@ -0,0 +1,19 @@
+import { defHttp } from '@/config/axios'
+import { ApiErrorLogVO } from './types'
+
+// 查询列表API 访问日志
+export const getApiErrorLogPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/api-error-log/page', params })
+}
+
+// 更新 API 错误日志的处理状态
+export const updateApiErrorLogPageApi = (id: number, processStatus: number) => {
+ return defHttp.put({
+ url: '/infra/api-error-log/update-status?id=' + id + '&processStatus=' + processStatus
+ })
+}
+
+// 导出API 访问日志
+export const exportApiErrorLogApi = ({ params }) => {
+ return defHttp.get({ url: '/infra/api-error-log/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/apiErrorLog/types.ts b/yudao-ui-admin-vue3/src/api/infra/apiErrorLog/types.ts
new file mode 100644
index 0000000000..dfc8710325
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/apiErrorLog/types.ts
@@ -0,0 +1,17 @@
+export type ApiErrorLogVO = {
+ id: number
+ userId: string
+ userIp: string
+ userAgent: string
+ userType: string
+ applicationName: string
+ requestMethod: string
+ requestParams: string
+ requestUrl: string
+ exceptionTime: string
+ exceptionName: string
+ exceptionStackTrace: string
+ processUserId: string
+ processStatus: number
+ resultCode: number
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/codegen/index.ts b/yudao-ui-admin-vue3/src/api/infra/codegen/index.ts
new file mode 100644
index 0000000000..15bf8eca4d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/codegen/index.ts
@@ -0,0 +1,62 @@
+import { defHttp } from '@/config/axios'
+import type { CodegenDetailVO, CodegenPreviewVO, CodegenTableVO, DatabaseTableVO } from './types'
+
+// 查询列表代码生成表定义
+export const getCodegenTablePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/codegen/table/page', params })
+}
+
+// 查询详情代码生成表定义
+export const getCodegenTableApi = (id: number) => {
+ return defHttp.get({ url: '/infra/codegen/detail?tableId=' + id })
+}
+
+// 新增代码生成表定义
+export const createCodegenTableApi = (params: CodegenTableVO) => {
+ return defHttp.post({ url: '/infra/codegen/create', params })
+}
+
+// 修改代码生成表定义
+export const updateCodegenTableApi = (params: CodegenTableVO) => {
+ return defHttp.put({ url: '/infra/codegen/update', params })
+}
+
+// 基于数据库的表结构,同步数据库的表和字段定义
+export const syncCodegenFromDBApi = (id: number) => {
+ return defHttp.put({ url: '/infra/codegen/sync-from-db?tableId=' + id })
+}
+
+// 基于 SQL 建表语句,同步数据库的表和字段定义
+export const syncCodegenFromSQLApi = (id: number, sql: string) => {
+ return defHttp.put({
+ url: '/infra/codegen/sync-from-sql?tableId=' + id + '&sql=' + sql,
+ headers: {
+ 'Content-type': 'application/x-www-form-urlencoded'
+ }
+ })
+}
+
+// 预览生成代码
+export const previewCodegenApi = (id: number) => {
+ return defHttp.get({ url: '/infra/codegen/preview?tableId=' + id })
+}
+
+// 下载生成代码
+export const downloadCodegenApi = (id: number) => {
+ return defHttp.get({ url: '/infra/codegen/download?tableId=' + id, responseType: 'blob' })
+}
+
+// 获得表定义
+export const getSchemaTableListApi = (params) => {
+ return defHttp.get({ url: '/infra/codegen/db/table/list', params })
+}
+
+// 基于数据库的表结构,创建代码生成器的表定义
+export const createCodegenListApi = (params) => {
+ return defHttp.post({ url: '/infra/codegen/create-list', params })
+}
+
+// 删除代码生成表定义
+export const deleteCodegenTableApi = (id: number) => {
+ return defHttp.delete({ url: '/infra/codegen/delete?tableId=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/codegen/types.ts b/yudao-ui-admin-vue3/src/api/infra/codegen/types.ts
new file mode 100644
index 0000000000..237be14885
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/codegen/types.ts
@@ -0,0 +1,51 @@
+export type CodegenTableVO = {
+ id: number
+ dataSourceConfigId: number
+ scene: number
+ tableName: string
+ tableComment: string
+ remark: string
+ moduleName: string
+ businessName: string
+ className: string
+ classComment: string
+ author: string
+ createTime: string
+ updateTime: string
+ templateType: number
+ parentMenuId: number
+}
+
+export type CodegenColumnVO = {
+ id: number
+ tableId: number
+ columnName: string
+ dataType: string
+ columnComment: string
+ nullable: number
+ primaryKey: number
+ autoIncrement: string
+ ordinalPosition: number
+ javaType: string
+ javaField: string
+ dictType: string
+ example: string
+ createOperation: number
+ updateOperation: number
+ listOperation: number
+ listOperationCondition: string
+ listOperationResult: number
+ htmlType: string
+}
+export type DatabaseTableVO = {
+ name: string
+ comment: string
+}
+export type CodegenDetailVO = {
+ table: CodegenTableVO
+ columns: CodegenColumnVO[]
+}
+export type CodegenPreviewVO = {
+ filePath: string
+ code: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/config/index.ts b/yudao-ui-admin-vue3/src/api/infra/config/index.ts
new file mode 100644
index 0000000000..eeb86323da
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/config/index.ts
@@ -0,0 +1,37 @@
+import { defHttp } from '@/config/axios'
+import type { ConfigVO } from './types'
+
+// 查询参数列表
+export const getConfigPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/config/page', params })
+}
+
+// 查询参数详情
+export const getConfigApi = (id: number) => {
+ return defHttp.get({ url: '/infra/config/get?id=' + id })
+}
+
+// 根据参数键名查询参数值
+export const getConfigKeyApi = (configKey: string) => {
+ return defHttp.get({ url: '/infra/config/get-value-by-key?key=' + configKey })
+}
+
+// 新增参数
+export const createConfigApi = (params: ConfigVO) => {
+ return defHttp.post({ url: '/infra/config/create', params })
+}
+
+// 修改参数
+export const updateConfigApi = (params: ConfigVO) => {
+ return defHttp.put({ url: '/infra/config/update', params })
+}
+
+// 删除参数
+export const deleteConfigApi = (id: number) => {
+ return defHttp.delete({ url: '/infra/config/delete?id=' + id })
+}
+
+// 导出参数
+export const exportConfigApi = ({ params }) => {
+ return defHttp.get({ url: '/infra/config/export', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/config/types.ts b/yudao-ui-admin-vue3/src/api/infra/config/types.ts
new file mode 100644
index 0000000000..613a5e65c9
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/config/types.ts
@@ -0,0 +1,11 @@
+export type ConfigVO = {
+ id: number
+ group: string
+ name: string
+ key: string
+ value: string
+ type: string
+ visible: boolean
+ remark: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/dataSourceConfig/index.ts b/yudao-ui-admin-vue3/src/api/infra/dataSourceConfig/index.ts
new file mode 100644
index 0000000000..524ddb1fc5
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/dataSourceConfig/index.ts
@@ -0,0 +1,27 @@
+import { defHttp } from '@/config/axios'
+import type { DataSourceConfigVO } from './types'
+
+// 查询数据源配置列表
+export const getDataSourceConfigListApi = () => {
+ return defHttp.get({ url: '/infra/data-source-config/list' })
+}
+
+// 查询数据源配置详情
+export const getDataSourceConfigApi = (id: number) => {
+ return defHttp.get({ url: '/infra/data-source-config/get?id=' + id })
+}
+
+// 新增数据源配置
+export const createDataSourceConfigApi = (params: DataSourceConfigVO) => {
+ return defHttp.post({ url: '/infra/data-source-config/create', params })
+}
+
+// 修改数据源配置
+export const updateDataSourceConfigApi = (params: DataSourceConfigVO) => {
+ return defHttp.put({ url: '/infra/data-source-config/update', params })
+}
+
+// 删除数据源配置
+export const deleteDataSourceConfigApi = (id: number) => {
+ return defHttp.delete({ url: '/infra/data-source-config/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/dataSourceConfig/types.ts b/yudao-ui-admin-vue3/src/api/infra/dataSourceConfig/types.ts
new file mode 100644
index 0000000000..cba6eb7bea
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/dataSourceConfig/types.ts
@@ -0,0 +1,8 @@
+export type DataSourceConfigVO = {
+ id: number
+ name: string
+ url: string
+ username: string
+ password: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/dbDoc/index.ts b/yudao-ui-admin-vue3/src/api/infra/dbDoc/index.ts
new file mode 100644
index 0000000000..2af809988f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/dbDoc/index.ts
@@ -0,0 +1,16 @@
+import { defHttp } from '@/config/axios'
+
+// 导出Html
+export const exportHtmlApi = () => {
+ return defHttp.get({ url: '/infra/db-doc/export-html', responseType: 'blob' })
+}
+
+// 导出Word
+export const exportWordApi = () => {
+ return defHttp.get({ url: '/infra/db-doc/export-word', responseType: 'blob' })
+}
+
+// 导出Markdown
+export const exportMarkdownApi = () => {
+ return defHttp.get({ url: '/infra/db-doc/export-markdown', responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/file/index.ts b/yudao-ui-admin-vue3/src/api/infra/file/index.ts
new file mode 100644
index 0000000000..ee50ee8e61
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/file/index.ts
@@ -0,0 +1,12 @@
+import { defHttp } from '@/config/axios'
+import type { FileVO } from './types'
+
+// 查询文件列表
+export const getFilePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/file/page', params })
+}
+
+// 删除文件
+export const deleteFileApi = (id: number) => {
+ return defHttp.delete({ url: '/infra/file/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/file/types.ts b/yudao-ui-admin-vue3/src/api/infra/file/types.ts
new file mode 100644
index 0000000000..0d32314c4d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/file/types.ts
@@ -0,0 +1,8 @@
+export type FileVO = {
+ id: number
+ path: string
+ url: string
+ size: string
+ type: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/fileConfig/index.ts b/yudao-ui-admin-vue3/src/api/infra/fileConfig/index.ts
new file mode 100644
index 0000000000..d0cb531015
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/fileConfig/index.ts
@@ -0,0 +1,37 @@
+import { defHttp } from '@/config/axios'
+import type { FileConfigVO } from './types'
+
+// 查询文件配置列表
+export const getFileConfigPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/file-config/page', params })
+}
+
+// 查询文件配置详情
+export const getFileConfigApi = (id: number) => {
+ return defHttp.get({ url: '/infra/file-config/get?id=' + id })
+}
+
+// 更新文件配置为主配置
+export const updateFileConfigMasterApi = (id: number) => {
+ return defHttp.get({ url: '/infra/file-config/update-master?id=' + id })
+}
+
+// 新增文件配置
+export const createFileConfigApi = (params: FileConfigVO) => {
+ return defHttp.post({ url: '/infra/file-config/create', params })
+}
+
+// 修改文件配置
+export const updateFileConfigApi = (params: FileConfigVO) => {
+ return defHttp.put({ url: '/infra/file-config/update', params })
+}
+
+// 删除文件配置
+export const deleteFileConfigApi = (id: number) => {
+ return defHttp.delete({ url: '/infra/file-config/delete?id=' + id })
+}
+
+// 测试文件配置
+export const testFileConfigApi = (id: number) => {
+ return defHttp.get({ url: '/infra/file-config/test?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/fileConfig/types.ts b/yudao-ui-admin-vue3/src/api/infra/fileConfig/types.ts
new file mode 100644
index 0000000000..ce21b49e07
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/fileConfig/types.ts
@@ -0,0 +1,23 @@
+export type ConfigType = {
+ basePath: string
+ host: string
+ port: string
+ username: string
+ password: string
+ mode: string
+ endpoint: string
+ bucket: string
+ accessKey: string
+ accessSecret: string
+ domain: string
+}
+export type FileConfigVO = {
+ id: number
+ name: string
+ storage: string
+ primary: number
+ visible: boolean
+ config: ConfigType
+ remark: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/job/index.ts b/yudao-ui-admin-vue3/src/api/infra/job/index.ts
new file mode 100644
index 0000000000..64d1408789
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/job/index.ts
@@ -0,0 +1,55 @@
+import { defHttp } from '@/config/axios'
+import type { JobVO } from './types'
+
+// 任务列表
+export const getJobPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/job/page', params })
+}
+
+// 任务详情
+export const getJobApi = (id: number) => {
+ return defHttp.get({ url: '/infra/job/get?id=' + id })
+}
+
+// 新增任务
+export const createJobApi = (params: JobVO) => {
+ return defHttp.post({ url: '/infra/job/create', params })
+}
+
+// 修改定时任务调度
+export const updateJobApi = (params: JobVO) => {
+ return defHttp.put({ url: '/infra/job/update', params })
+}
+
+// 删除定时任务调度
+export const deleteJobApi = (id: number) => {
+ return defHttp.delete({ url: '/infra/job/delete?id=' + id })
+}
+
+// 导出定时任务调度
+export const exportJobApi = (params) => {
+ return defHttp.get({
+ url: '/infra/job/export-excel',
+ params,
+ responseType: 'blob'
+ })
+}
+
+// 任务状态修改
+export const updateJobStatusApi = (id: number, status: number) => {
+ const data = {
+ id,
+ status
+ }
+ return defHttp.put({ url: '/infra/job/update-status', data: data })
+}
+
+// 定时任务立即执行一次
+export const runJobApi = (id: number) => {
+ return defHttp.put({ url: '/infra/job/trigger?id=' + id })
+}
+
+// 获得定时任务的下 n 次执行时间
+export const getJobNextTimesApi = (id: number) => {
+ return defHttp.get({ url: '/infra/job/get_next_times?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/job/types.ts b/yudao-ui-admin-vue3/src/api/infra/job/types.ts
new file mode 100644
index 0000000000..a608b6f673
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/job/types.ts
@@ -0,0 +1,12 @@
+export type JobVO = {
+ id: number
+ name: string
+ status: number
+ handlerName: string
+ handlerParam: string
+ cronExpression: string
+ retryCount: number
+ retryInterval: number
+ monitorTimeout: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/jobLog/index.ts b/yudao-ui-admin-vue3/src/api/infra/jobLog/index.ts
new file mode 100644
index 0000000000..bb7f97a542
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/jobLog/index.ts
@@ -0,0 +1,21 @@
+import { defHttp } from '@/config/axios'
+import type { JobLogVO } from './types'
+
+// 任务日志列表
+export const getJobLogPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/infra/job-log/page', params })
+}
+
+// 任务日志详情
+export const getJobLogApi = (id: number) => {
+ return defHttp.get({ url: '/infra/job-log/get?id=' + id })
+}
+
+// 导出定时任务日志
+export const exportJobLogApi = (params) => {
+ return defHttp.get({
+ url: '/infra/job-log/export-excel',
+ params,
+ responseType: 'blob'
+ })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/jobLog/types.ts b/yudao-ui-admin-vue3/src/api/infra/jobLog/types.ts
new file mode 100644
index 0000000000..0e6e903133
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/jobLog/types.ts
@@ -0,0 +1,13 @@
+export type JobLogVO = {
+ id: number
+ jobId: number
+ handlerName: string
+ handlerParam: string
+ cronExpression: string
+ executeIndex: string
+ beginTime: Date
+ endTime: Date
+ duration: string
+ status: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/redis/index.ts b/yudao-ui-admin-vue3/src/api/infra/redis/index.ts
new file mode 100644
index 0000000000..c6252b299d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/redis/index.ts
@@ -0,0 +1,16 @@
+import { defHttp } from '@/config/axios'
+import { RedisKeyInfo, RedisMonitorInfoVO } from '@/api/infra/redis/types'
+
+/**
+ * 获取redis 监控信息
+ */
+export const redisMonitorInfo = () => {
+ return defHttp.get({ url: '/infra/redis/get-monitor-info' })
+}
+
+/**
+ * 获取redis key列表
+ */
+export const redisKeysInfo = () => {
+ return defHttp.get({ url: '/infra/redis/get-key-list' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/infra/redis/types.ts b/yudao-ui-admin-vue3/src/api/infra/redis/types.ts
new file mode 100644
index 0000000000..e7ef025421
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/infra/redis/types.ts
@@ -0,0 +1,185 @@
+export interface RedisMonitorInfoVO {
+ info: RedisInfoVO
+ dbSize: number
+ commandStats: RedisCommandStatsVO[]
+}
+
+export interface RedisInfoVO {
+ io_threaded_reads_processed: string
+ tracking_clients: string
+ uptime_in_seconds: string
+ cluster_connections: string
+ current_cow_size: string
+ maxmemory_human: string
+ aof_last_cow_size: string
+ master_replid2: string
+ mem_replication_backlog: string
+ aof_rewrite_scheduled: string
+ total_net_input_bytes: string
+ rss_overhead_ratio: string
+ hz: string
+ current_cow_size_age: string
+ redis_build_id: string
+ errorstat_BUSYGROUP: string
+ aof_last_bgrewrite_status: string
+ multiplexing_api: string
+ client_recent_max_output_buffer: string
+ allocator_resident: string
+ mem_fragmentation_bytes: string
+ aof_current_size: string
+ repl_backlog_first_byte_offset: string
+ tracking_total_prefixes: string
+ redis_mode: string
+ redis_git_dirty: string
+ aof_delayed_fsync: string
+ allocator_rss_bytes: string
+ repl_backlog_histlen: string
+ io_threads_active: string
+ rss_overhead_bytes: string
+ total_system_memory: string
+ loading: string
+ evicted_keys: string
+ maxclients: string
+ cluster_enabled: string
+ redis_version: string
+ repl_backlog_active: string
+ mem_aof_buffer: string
+ allocator_frag_bytes: string
+ io_threaded_writes_processed: string
+ instantaneous_ops_per_sec: string
+ used_memory_human: string
+ total_error_replies: string
+ role: string
+ maxmemory: string
+ used_memory_lua: string
+ rdb_current_bgsave_time_sec: string
+ used_memory_startup: string
+ used_cpu_sys_main_thread: string
+ lazyfree_pending_objects: string
+ aof_pending_bio_fsync: string
+ used_memory_dataset_perc: string
+ allocator_frag_ratio: string
+ arch_bits: string
+ used_cpu_user_main_thread: string
+ mem_clients_normal: string
+ expired_time_cap_reached_count: string
+ unexpected_error_replies: string
+ mem_fragmentation_ratio: string
+ aof_last_rewrite_time_sec: string
+ master_replid: string
+ aof_rewrite_in_progress: string
+ lru_clock: string
+ maxmemory_policy: string
+ run_id: string
+ latest_fork_usec: string
+ tracking_total_items: string
+ total_commands_processed: string
+ expired_keys: string
+ errorstat_ERR: string
+ used_memory: string
+ module_fork_in_progress: string
+ errorstat_WRONGPASS: string
+ aof_buffer_length: string
+ dump_payload_sanitizations: string
+ mem_clients_slaves: string
+ keyspace_misses: string
+ server_time_usec: string
+ executable: string
+ lazyfreed_objects: string
+ db0: string
+ used_memory_peak_human: string
+ keyspace_hits: string
+ rdb_last_cow_size: string
+ aof_pending_rewrite: string
+ used_memory_overhead: string
+ active_defrag_hits: string
+ tcp_port: string
+ uptime_in_days: string
+ used_memory_peak_perc: string
+ current_save_keys_processed: string
+ blocked_clients: string
+ total_reads_processed: string
+ expire_cycle_cpu_milliseconds: string
+ sync_partial_err: string
+ used_memory_scripts_human: string
+ aof_current_rewrite_time_sec: string
+ aof_enabled: string
+ process_supervised: string
+ master_repl_offset: string
+ used_memory_dataset: string
+ used_cpu_user: string
+ rdb_last_bgsave_status: string
+ tracking_total_keys: string
+ atomicvar_api: string
+ allocator_rss_ratio: string
+ client_recent_max_input_buffer: string
+ clients_in_timeout_table: string
+ aof_last_write_status: string
+ mem_allocator: string
+ used_memory_scripts: string
+ used_memory_peak: string
+ process_id: string
+ master_failover_state: string
+ errorstat_NOAUTH: string
+ used_cpu_sys: string
+ repl_backlog_size: string
+ connected_slaves: string
+ current_save_keys_total: string
+ gcc_version: string
+ total_system_memory_human: string
+ sync_full: string
+ connected_clients: string
+ module_fork_last_cow_size: string
+ total_writes_processed: string
+ allocator_active: string
+ total_net_output_bytes: string
+ pubsub_channels: string
+ current_fork_perc: string
+ active_defrag_key_hits: string
+ rdb_changes_since_last_save: string
+ instantaneous_input_kbps: string
+ used_memory_rss_human: string
+ configured_hz: string
+ expired_stale_perc: string
+ active_defrag_misses: string
+ used_cpu_sys_children: string
+ number_of_cached_scripts: string
+ sync_partial_ok: string
+ used_memory_lua_human: string
+ rdb_last_save_time: string
+ pubsub_patterns: string
+ slave_expires_tracked_keys: string
+ redis_git_sha1: string
+ used_memory_rss: string
+ rdb_last_bgsave_time_sec: string
+ os: string
+ mem_not_counted_for_evict: string
+ active_defrag_running: string
+ rejected_connections: string
+ aof_rewrite_buffer_length: string
+ total_forks: string
+ active_defrag_key_misses: string
+ allocator_allocated: string
+ aof_base_size: string
+ instantaneous_output_kbps: string
+ second_repl_offset: string
+ rdb_bgsave_in_progress: string
+ used_cpu_user_children: string
+ total_connections_received: string
+ migrate_cached_sockets: string
+}
+
+export interface RedisCommandStatsVO {
+ command: string
+ calls: number
+ usec: number
+}
+
+export interface RedisKeyInfo {
+ keyTemplate: string
+ keyType: string
+ valueType: string
+ timeoutType: number
+ timeout: number
+ memo: string
+}
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/api/login/index.ts b/yudao-ui-admin-vue3/src/api/login/index.ts
new file mode 100644
index 0000000000..b527533166
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/login/index.ts
@@ -0,0 +1,62 @@
+import { defHttp } from '@/config/axios'
+import { getRefreshToken } from '@/utils/auth'
+import type { UserLoginVO, TokenType, UserInfoVO } from './types'
+
+export interface CodeImgResult {
+ captchaOnOff: boolean
+ img: string
+ uuid: string
+}
+export interface SmsCodeVO {
+ mobile: string
+ scene: number
+}
+export interface SmsLoginVO {
+ mobile: string
+ code: string
+}
+
+// 获取验证码
+export const getCodeImgApi = () => {
+ return defHttp.get({ url: '/system/captcha/get-image' })
+}
+
+// 登录
+export const loginApi = (params: UserLoginVO) => {
+ return defHttp.post({ url: '/system/auth/login', params })
+}
+
+// 刷新访问令牌
+export const refreshToken = () => {
+ return defHttp.post({ url: '/system/auth/refresh-token?refreshToken=' + getRefreshToken() })
+}
+
+// 使用租户名,获得租户编号
+export const getTenantIdByNameApi = (name: string) => {
+ return defHttp.get({ url: '/system/tenant/get-id-by-name?name=' + name })
+}
+
+// 登出
+export const loginOutApi = () => {
+ return defHttp.delete({ url: '/system/auth/logout' })
+}
+
+// 获取用户权限信息
+export const getInfoApi = () => {
+ return defHttp.get({ url: '/system/auth/get-permission-info' })
+}
+
+// 路由
+export const getAsyncRoutesApi = () => {
+ return defHttp.get({ url: '/system/auth/list-menus' })
+}
+
+//获取登录验证码
+export const sendSmsCodeApi = (params: SmsCodeVO) => {
+ return defHttp.post({ url: '/system/auth/send-sms-code', params })
+}
+
+// 短信验证码登录
+export const smsLoginApi = (params: SmsLoginVO) => {
+ return defHttp.post({ url: '/system/auth/sms-login', params })
+}
diff --git a/yudao-ui-admin-vue3/src/api/login/types.ts b/yudao-ui-admin-vue3/src/api/login/types.ts
new file mode 100644
index 0000000000..75abe28ce4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/login/types.ts
@@ -0,0 +1,43 @@
+export type UserLoginVO = {
+ username: string
+ password: string
+ code: string
+ uuid: string
+}
+
+export type TokenType = {
+ id: number // 编号
+ accessToken: string // 访问令牌
+ refreshToken: string // 刷新令牌
+ userId: number // 用户编号
+ userType: number //用户类型
+ clientId: string //客户端编号
+ expiresTime: number //过期时间
+}
+
+export type UserVO = {
+ id: number
+ username: string
+ nickname: string
+ deptId: number
+ email: string
+ mobile: string
+ sex: number
+ avatar: string
+ loginIp: string
+ loginDate: string
+}
+
+export type UserInfoVO = {
+ permissions: []
+ roles: []
+ user: {
+ avatar: string
+ id: number
+ nickname: string
+ }
+}
+
+export type TentantNameVO = {
+ name: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/app/index.ts b/yudao-ui-admin-vue3/src/api/pay/app/index.ts
new file mode 100644
index 0000000000..4d2bd2c7c8
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/app/index.ts
@@ -0,0 +1,46 @@
+import { defHttp } from '@/config/axios'
+import type { AppVO } from './types'
+
+// 查询列表支付应用
+export const getAppPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/pay/app/page', params })
+}
+
+// 查询详情支付应用
+export const getAppApi = (id: number) => {
+ return defHttp.get({ url: '/pay/app/get?id=' + id })
+}
+
+// 新增支付应用
+export const createAppApi = (params: AppVO) => {
+ return defHttp.post({ url: '/pay/app/create', params })
+}
+
+// 修改支付应用
+export const updateAppApi = (params: AppVO) => {
+ return defHttp.put({ url: '/pay/app/update', params })
+}
+
+// 支付应用信息状态修改
+export const changeAppStatusApi = (id: number, status: number) => {
+ const data = {
+ id,
+ status
+ }
+ return defHttp.put({ url: '/pay/app/update-status', data: data })
+}
+
+// 删除支付应用
+export const deleteAppApi = (id: number) => {
+ return defHttp.delete({ url: '/pay/app/delete?id=' + id })
+}
+
+// 导出支付应用
+export const exportAppApi = (params) => {
+ return defHttp.get({ url: '/pay/app/export-excel', params, responseType: 'blob' })
+}
+
+// 根据商ID称搜索应用列表
+export const getAppListByMerchantIdApi = (merchantId: number) => {
+ return defHttp.get({ url: '/pay/app/list-merchant-id', params: { merchantId: merchantId } })
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/app/types.ts b/yudao-ui-admin-vue3/src/api/pay/app/types.ts
new file mode 100644
index 0000000000..ed5779db9b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/app/types.ts
@@ -0,0 +1,11 @@
+export type AppVO = {
+ id: number
+ name: string
+ status: number
+ remark: string
+ payNotifyUrl: string
+ refundNotifyUrl: string
+ merchantName: string
+ merchantId: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/channel/index.ts b/yudao-ui-admin-vue3/src/api/pay/channel/index.ts
new file mode 100644
index 0000000000..1176f00967
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/channel/index.ts
@@ -0,0 +1,37 @@
+import { defHttp } from '@/config/axios'
+import type { ChannelVO } from './types'
+
+// 查询列表支付渠道
+export const getChannelPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/pay/channel/page', params })
+}
+
+// 查询详情支付渠道
+export const getChannelApi = (merchantId: number, appId: string, code: string) => {
+ const params = {
+ merchantId: merchantId,
+ appId: appId,
+ code: code
+ }
+ return defHttp.get({ url: '/pay/channel/get-channel', params: params })
+}
+
+// 新增支付渠道
+export const createChannelApi = (params: ChannelVO) => {
+ return defHttp.post({ url: '/pay/channel/create', params })
+}
+
+// 修改支付渠道
+export const updateChannelApi = (params: ChannelVO) => {
+ return defHttp.put({ url: '/pay/channel/update', params })
+}
+
+// 删除支付渠道
+export const deleteChannelApi = (id: number) => {
+ return defHttp.delete({ url: '/pay/channel/delete?id=' + id })
+}
+
+// 导出支付渠道
+export const exportChannelApi = (params) => {
+ return defHttp.get({ url: '/pay/channel/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/channel/types.ts b/yudao-ui-admin-vue3/src/api/pay/channel/types.ts
new file mode 100644
index 0000000000..980a7c377a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/channel/types.ts
@@ -0,0 +1,11 @@
+export type ChannelVO = {
+ id: number
+ code: string
+ config: string
+ status: number
+ remark: string
+ feeRate: number
+ merchantId: number
+ appId: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/merchant/index.ts b/yudao-ui-admin-vue3/src/api/pay/merchant/index.ts
new file mode 100644
index 0000000000..f9089022ad
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/merchant/index.ts
@@ -0,0 +1,50 @@
+import { defHttp } from '@/config/axios'
+import type { MerchantVO } from './types'
+
+// 查询列表支付商户
+export const getMerchantPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/pay/merchant/page', params })
+}
+
+// 查询详情支付商户
+export const getMerchantApi = (id: number) => {
+ return defHttp.get({ url: '/pay/merchant/get?id=' + id })
+}
+
+// 根据商户名称搜索商户列表
+export const getMerchantListByNameApi = (name: string) => {
+ return defHttp.get({
+ url: '/pay/merchant/list-by-name?id=',
+ params: {
+ name: name
+ }
+ })
+}
+
+// 新增支付商户
+export const createMerchantApi = (params: MerchantVO) => {
+ return defHttp.post({ url: '/pay/merchant/create', params })
+}
+
+// 修改支付商户
+export const updateMerchantApi = (params: MerchantVO) => {
+ return defHttp.put({ url: '/pay/merchant/update', params })
+}
+
+// 删除支付商户
+export const deleteMerchantApi = (id: number) => {
+ return defHttp.delete({ url: '/pay/merchant/delete?id=' + id })
+}
+
+// 导出支付商户
+export const exportMerchantApi = (params) => {
+ return defHttp.get({ url: '/pay/merchant/export-excel', params, responseType: 'blob' })
+}
+// 支付商户状态修改
+export const changeMerchantStatusApi = (id: number, status: number) => {
+ const data = {
+ id,
+ status
+ }
+ return defHttp.put({ url: '/pay/merchant/update-status', data: data })
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/merchant/types.ts b/yudao-ui-admin-vue3/src/api/pay/merchant/types.ts
new file mode 100644
index 0000000000..0a78a2a589
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/merchant/types.ts
@@ -0,0 +1,9 @@
+export type MerchantVO = {
+ id: number
+ no: string
+ name: string
+ shortName: string
+ status: number
+ remark: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/order/index.ts b/yudao-ui-admin-vue3/src/api/pay/order/index.ts
new file mode 100644
index 0000000000..d7d77d5fe7
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/order/index.ts
@@ -0,0 +1,32 @@
+import { defHttp } from '@/config/axios'
+import type { OrderVO } from './types'
+
+// 查询列表支付订单
+export const getOrderPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/pay/order/page', params })
+}
+
+// 查询详情支付订单
+export const getOrderApi = (id: number) => {
+ return defHttp.get({ url: '/pay/order/get?id=' + id })
+}
+
+// 新增支付订单
+export const createOrderApi = (params: OrderVO) => {
+ return defHttp.post({ url: '/pay/order/create', params })
+}
+
+// 修改支付订单
+export const updateOrderApi = (params: OrderVO) => {
+ return defHttp.put({ url: '/pay/order/update', params })
+}
+
+// 删除支付订单
+export const deleteOrderApi = (id: number) => {
+ return defHttp.delete({ url: '/pay/order/delete?id=' + id })
+}
+
+// 导出支付订单
+export const exportOrderApi = (params) => {
+ return defHttp.get({ url: '/pay/order/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/order/types.ts b/yudao-ui-admin-vue3/src/api/pay/order/types.ts
new file mode 100644
index 0000000000..6a87290736
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/order/types.ts
@@ -0,0 +1,26 @@
+export type OrderVO = {
+ id: number
+ merchantId: number
+ appId: number
+ channelId: number
+ channelCode: string
+ merchantOrderId: string
+ subject: string
+ body: string
+ notifyUrl: string
+ notifyStatus: number
+ amount: number
+ channelFeeRate: number
+ channelFeeAmount: number
+ status: number
+ userIp: string
+ expireTime: string
+ successTime: string
+ notifyTime: string
+ successExtensionId: number
+ refundStatus: number
+ refundTimes: number
+ refundAmount: number
+ channelUserId: string
+ channelOrderNo: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/refund/index.ts b/yudao-ui-admin-vue3/src/api/pay/refund/index.ts
new file mode 100644
index 0000000000..74ffaaa1ea
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/refund/index.ts
@@ -0,0 +1,32 @@
+import { defHttp } from '@/config/axios'
+import type { RefundVO } from './types'
+
+// 查询列表退款订单
+export const getRefundPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/pay/refund/page', params })
+}
+
+// 查询详情退款订单
+export const getRefundApi = (id: number) => {
+ return defHttp.get({ url: '/pay/refund/get?id=' + id })
+}
+
+// 新增退款订单
+export const createRefundApi = (params: RefundVO) => {
+ return defHttp.post({ url: '/pay/refund/create', params })
+}
+
+// 修改退款订单
+export const updateRefundApi = (params: RefundVO) => {
+ return defHttp.put({ url: '/pay/refund/update', params })
+}
+
+// 删除退款订单
+export const deleteRefundApi = (id: number) => {
+ return defHttp.delete({ url: '/pay/refund/delete?id=' + id })
+}
+
+// 导出退款订单
+export const exportRefundApi = (params) => {
+ return defHttp.get({ url: '/pay/refund/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/pay/refund/types.ts b/yudao-ui-admin-vue3/src/api/pay/refund/types.ts
new file mode 100644
index 0000000000..878a232187
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/pay/refund/types.ts
@@ -0,0 +1,26 @@
+export type RefundVO = {
+ id: number
+ merchantId: number
+ appId: number
+ channelId: number
+ channelCode: string
+ merchantOrderId: string
+ subject: string
+ body: string
+ notifyUrl: string
+ notifyStatus: number
+ amount: number
+ channelFeeRate: number
+ channelFeeAmount: number
+ status: number
+ userIp: string
+ expireTime: string
+ successTime: string
+ notifyTime: string
+ successExtensionId: number
+ refundStatus: number
+ refundTimes: number
+ refundAmount: number
+ channelUserId: string
+ channelOrderNo: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/dept/index.ts b/yudao-ui-admin-vue3/src/api/system/dept/index.ts
new file mode 100644
index 0000000000..2189995d78
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/dept/index.ts
@@ -0,0 +1,32 @@
+import { defHttp } from '@/config/axios'
+import type { DeptVO } from './types'
+
+// 查询部门(精简)列表
+export const listSimpleDeptApi = () => {
+ return defHttp.get({ url: '/system/dept/list-all-simple' })
+}
+
+// 查询部门列表
+export const getDeptPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/dept/list', params })
+}
+
+// 查询部门详情
+export const getDeptApi = (id: number) => {
+ return defHttp.get({ url: '/system/dept/get?id=' + id })
+}
+
+// 新增部门
+export const createDeptApi = (params: DeptVO) => {
+ return defHttp.post({ url: '/system/dept/create', data: params })
+}
+
+// 修改部门
+export const updateDeptApi = (params: DeptVO) => {
+ return defHttp.put({ url: '/system/dept/update', data: params })
+}
+
+// 删除部门
+export const deleteDeptApi = (id: number) => {
+ return defHttp.delete({ url: '/system/dept/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/dept/types.ts b/yudao-ui-admin-vue3/src/api/system/dept/types.ts
new file mode 100644
index 0000000000..f3b2ddd43b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/dept/types.ts
@@ -0,0 +1,7 @@
+export type DeptVO = {
+ id: number
+ name: string
+ status: number
+ parentId: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/dict/dict.data.ts b/yudao-ui-admin-vue3/src/api/system/dict/dict.data.ts
new file mode 100644
index 0000000000..3645a482b0
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/dict/dict.data.ts
@@ -0,0 +1,36 @@
+import { defHttp } from '@/config/axios'
+import type { DictDataVO } from './types'
+
+// 查询字典数据(精简)列表
+export const listSimpleDictDataApi = () => {
+ return defHttp.get({ url: '/system/dict-data/list-all-simple' })
+}
+
+// 查询字典数据列表
+export const getDictDataPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/dict-data/page', params })
+}
+
+// 查询字典数据详情
+export const getDictDataApi = (id: number) => {
+ return defHttp.get({ url: '/system/dict-data/get?id=' + id })
+}
+
+// 新增字典数据
+export const createDictDataApi = (params: DictDataVO) => {
+ return defHttp.post({ url: '/system/dict-data/create', params })
+}
+
+// 修改字典数据
+export const updateDictDataApi = (params: DictDataVO) => {
+ return defHttp.put({ url: '/system/dict-data/update', params })
+}
+
+// 删除字典数据
+export const deleteDictDataApi = (id: number) => {
+ return defHttp.delete({ url: '/system/dict-data/delete?id=' + id })
+}
+// 导出字典类型数据
+export const exportDictDataApi = (params: DictDataVO) => {
+ return defHttp.get({ url: '/system/dict-data/export', params })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/dict/dict.type.ts b/yudao-ui-admin-vue3/src/api/system/dict/dict.type.ts
new file mode 100644
index 0000000000..38d79a0d72
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/dict/dict.type.ts
@@ -0,0 +1,36 @@
+import { defHttp } from '@/config/axios'
+import type { DictTypeVO } from './types'
+
+// 查询字典(精简)列表
+export const listSimpleDictTypeApi = () => {
+ return defHttp.get({ url: '/system/dict-type/list-all-simple' })
+}
+
+// 查询字典列表
+export const getDictTypePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/dict-type/page', params })
+}
+
+// 查询字典详情
+export const getDictTypeApi = (id: number) => {
+ return defHttp.get({ url: '/system/dict-type/get?id=' + id })
+}
+
+// 新增字典
+export const createDictTypeApi = (params: DictTypeVO) => {
+ return defHttp.post({ url: '/system/dict-type/create', params })
+}
+
+// 修改字典
+export const updateDictTypeApi = (params: DictTypeVO) => {
+ return defHttp.put({ url: '/system/dict-type/update', params })
+}
+
+// 删除字典
+export const deleteDictTypeApi = (id: number) => {
+ return defHttp.delete({ url: '/system/dict-type/delete?id=' + id })
+}
+// 导出字典类型
+export const exportDictTypeApi = (params: DictTypeVO) => {
+ return defHttp.get({ url: '/system/dict-type/export', params })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/dict/types.ts b/yudao-ui-admin-vue3/src/api/system/dict/types.ts
new file mode 100644
index 0000000000..8bb735b696
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/dict/types.ts
@@ -0,0 +1,21 @@
+export type DictTypeVO = {
+ id: number
+ name: string
+ type: string
+ status: number
+ remark: string
+ createTime: string
+}
+
+export type DictDataVO = {
+ id: number
+ sort: number
+ label: string
+ value: string
+ dictType: string
+ status: number
+ colorType: string
+ cssClass: string
+ remark: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/errorCode/index.ts b/yudao-ui-admin-vue3/src/api/system/errorCode/index.ts
new file mode 100644
index 0000000000..6d5f26f99b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/errorCode/index.ts
@@ -0,0 +1,31 @@
+import { defHttp } from '@/config/axios'
+import type { ErrorCodeVO } from './types'
+
+// 查询错误码列表
+export const getErrorCodePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/error-code/page', params })
+}
+
+// 查询错误码详情
+export const getErrorCodeApi = (id: number) => {
+ return defHttp.get({ url: '/system/error-code/get?id=' + id })
+}
+
+// 新增错误码
+export const createErrorCodeApi = (params: ErrorCodeVO) => {
+ return defHttp.post({ url: '/system/error-code/create', params })
+}
+
+// 修改错误码
+export const updateErrorCodeApi = (params: ErrorCodeVO) => {
+ return defHttp.put({ url: '/system/error-code/update', params })
+}
+
+// 删除错误码
+export const deleteErrorCodeApi = (id: number) => {
+ return defHttp.delete({ url: '/system/error-code/delete?id=' + id })
+}
+// 导出错误码
+export const excelErrorCodeApi = (params) => {
+ return defHttp.get({ url: '/system/error-code/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/errorCode/types.ts b/yudao-ui-admin-vue3/src/api/system/errorCode/types.ts
new file mode 100644
index 0000000000..de84239798
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/errorCode/types.ts
@@ -0,0 +1,9 @@
+export type ErrorCodeVO = {
+ id: number
+ type: number
+ applicationName: string
+ code: number
+ message: string
+ memo: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/loginLog/index.ts b/yudao-ui-admin-vue3/src/api/system/loginLog/index.ts
new file mode 100644
index 0000000000..8e88d9986a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/loginLog/index.ts
@@ -0,0 +1,11 @@
+import { defHttp } from '@/config/axios'
+import type { LoginLogVO } from './types'
+
+// 查询登录日志列表
+export const getLoginLogPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/login-log/page', params })
+}
+// 导出登录日志
+export const exportLoginLogApi = (params) => {
+ return defHttp.get({ url: '/system/login-log/export', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/loginLog/types.ts b/yudao-ui-admin-vue3/src/api/system/loginLog/types.ts
new file mode 100644
index 0000000000..7454ccf3a9
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/loginLog/types.ts
@@ -0,0 +1,11 @@
+export type LoginLogVO = {
+ id: number
+ logType: number
+ traceId: number
+ userType: number
+ username: string
+ status: number
+ userIp: string
+ userAgent: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/menu/index.ts b/yudao-ui-admin-vue3/src/api/system/menu/index.ts
new file mode 100644
index 0000000000..db625c86d4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/menu/index.ts
@@ -0,0 +1,31 @@
+import { defHttp } from '@/config/axios'
+import type { MenuVO } from './types'
+
+// 查询菜单(精简)列表
+export const listSimpleMenusApi = () => {
+ return defHttp.get({ url: '/system/menu/list-all-simple' })
+}
+// 查询菜单列表
+export const getMenuListApi = (params) => {
+ return defHttp.get({ url: '/system/menu/list', params })
+}
+
+// 获取菜单详情
+export const getMenuApi = (id: number) => {
+ return defHttp.get({ url: '/system/menu/get?id=' + id })
+}
+
+// 新增菜单
+export const createMenuApi = (params: MenuVO) => {
+ return defHttp.post({ url: '/system/menu/create', params })
+}
+
+// 修改菜单
+export const updateMenuApi = (params: MenuVO) => {
+ return defHttp.put({ url: '/system/menu/update', params })
+}
+
+// 删除菜单
+export const deleteMenuApi = (id: number) => {
+ return defHttp.delete({ url: '/system/menu/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/menu/types.ts b/yudao-ui-admin-vue3/src/api/system/menu/types.ts
new file mode 100644
index 0000000000..1506e87aac
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/menu/types.ts
@@ -0,0 +1,15 @@
+export type MenuVO = {
+ id: number
+ name: string
+ permission: string
+ type: number
+ sort: number
+ parentId: number
+ path: string
+ icon: string
+ component: string
+ status: number
+ visible: boolean
+ keepAlive: boolean
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/notice/index.ts b/yudao-ui-admin-vue3/src/api/system/notice/index.ts
new file mode 100644
index 0000000000..6146116c53
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/notice/index.ts
@@ -0,0 +1,27 @@
+import { defHttp } from '@/config/axios'
+import type { NoticeVO } from './types'
+
+// 查询公告列表
+export const getNoticePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/notice/page', params })
+}
+
+// 查询公告详情
+export const getNoticeApi = (id: number) => {
+ return defHttp.get({ url: '/system/notice/get?id=' + id })
+}
+
+// 新增公告
+export const createNoticeApi = (params: NoticeVO) => {
+ return defHttp.post({ url: '/system/notice/create', params })
+}
+
+// 修改公告
+export const updateNoticeApi = (params: NoticeVO) => {
+ return defHttp.put({ url: '/system/notice/update', params })
+}
+
+// 删除公告
+export const deleteNoticeApi = (id: number) => {
+ return defHttp.delete({ url: '/system/notice/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/notice/types.ts b/yudao-ui-admin-vue3/src/api/system/notice/types.ts
new file mode 100644
index 0000000000..0e0bb43ec0
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/notice/types.ts
@@ -0,0 +1,12 @@
+export type NoticeVO = {
+ id: number
+ title: string
+ type: number
+ content: string
+ status: number
+ remark: string
+ creator: string
+ createTime: string
+ updater: string
+ updateTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/oauth2/client.ts b/yudao-ui-admin-vue3/src/api/system/oauth2/client.ts
new file mode 100644
index 0000000000..32d2fb8a24
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/oauth2/client.ts
@@ -0,0 +1,27 @@
+import { defHttp } from '@/config/axios'
+import { OAuth2ClientVo } from './client.types'
+
+// 查询 OAuth2列表
+export const getOAuth2ClientPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/oauth2-client/page', params })
+}
+
+// 查询 OAuth2详情
+export const getOAuth2ClientApi = (id: number) => {
+ return defHttp.get({ url: '/system/oauth2-client/get?id=' + id })
+}
+
+// 新增 OAuth2
+export const createOAuth2ClientApi = (params: OAuth2ClientVo) => {
+ return defHttp.post({ url: '/system/oauth2-client/create', params })
+}
+
+// 修改 OAuth2
+export const updateOAuth2ClientApi = (params: OAuth2ClientVo) => {
+ return defHttp.put({ url: '/system/oauth2-client/update', params })
+}
+
+// 删除 OAuth2
+export const deleteOAuth2ClientApi = (id: number) => {
+ return defHttp.delete({ url: '/system/oauth2-client/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/oauth2/client.types.ts b/yudao-ui-admin-vue3/src/api/system/oauth2/client.types.ts
new file mode 100644
index 0000000000..895e047626
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/oauth2/client.types.ts
@@ -0,0 +1,20 @@
+export type OAuth2ClientVo = {
+ id: number
+ clientId: string
+ secret: string
+ name: string
+ logo: string
+ description: string
+ status: number
+ accessTokenValiditySeconds: number
+ refreshTokenValiditySeconds: number
+ redirectUris: string[]
+ autoApprove: boolean
+ authorizedGrantTypes: string[]
+ scopes: string[]
+ authorities: string[]
+ resourceIds: string[]
+ additionalInformation: string
+ isAdditionalInformationJson: boolean
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/oauth2/token.ts b/yudao-ui-admin-vue3/src/api/system/oauth2/token.ts
new file mode 100644
index 0000000000..798d0a13bd
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/oauth2/token.ts
@@ -0,0 +1,12 @@
+import { defHttp } from '@/config/axios'
+import { OAuth2TokenVo } from './token.types'
+
+// 查询 token列表
+export const getAccessTokenPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/oauth2-token/page', params })
+}
+
+// 删除 token
+export const deleteAccessTokenApi = (accessToken: number) => {
+ return defHttp.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/oauth2/token.types.ts b/yudao-ui-admin-vue3/src/api/system/oauth2/token.types.ts
new file mode 100644
index 0000000000..f12e9943d0
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/oauth2/token.types.ts
@@ -0,0 +1,10 @@
+export type OAuth2TokenVo = {
+ id: number
+ accessToken: string
+ refreshToken: string
+ userId: number
+ userType: number
+ clientId: string
+ createTime: string
+ expiresTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/operatelog/index.ts b/yudao-ui-admin-vue3/src/api/system/operatelog/index.ts
new file mode 100644
index 0000000000..4340fcc7d9
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/operatelog/index.ts
@@ -0,0 +1,11 @@
+import { defHttp } from '@/config/axios'
+import type { OperateLogVO } from './types'
+
+// 查询操作日志列表
+export const getOperateLogPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/operate-log/page', params })
+}
+// 导出操作日志
+export const exportOperateLogApi = (params) => {
+ return defHttp.get({ url: '/system/operate-log/export', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/operatelog/types.ts b/yudao-ui-admin-vue3/src/api/system/operatelog/types.ts
new file mode 100644
index 0000000000..896d15df4b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/operatelog/types.ts
@@ -0,0 +1,22 @@
+export type OperateLogVO = {
+ id: number
+ userNickname: string
+ traceId: string
+ userId: number
+ module: string
+ name: string
+ type: number
+ content: string
+ exts: object
+ requestMethod: string
+ requestUrl: string
+ userIp: string
+ userAgent: string
+ javaMethod: string
+ javaMethodArgs: string
+ startTime: string
+ duration: number
+ resultCode: number
+ resultMsg: string
+ resultData: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/post/index.ts b/yudao-ui-admin-vue3/src/api/system/post/index.ts
new file mode 100644
index 0000000000..35d1f4a988
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/post/index.ts
@@ -0,0 +1,36 @@
+import { defHttp } from '@/config/axios'
+import type { PostVO } from './types'
+
+// 查询岗位列表
+export const getPostPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/post/page', params })
+}
+
+// 获取岗位精简信息列表
+export const listSimplePostsApi = () => {
+ return defHttp.get({ url: '/system/post/list-all-simple' })
+}
+// 查询岗位详情
+export const getPostApi = (id: number) => {
+ return defHttp.get({ url: '/system/post/get?id=' + id })
+}
+
+// 新增岗位
+export const createPostApi = (params: PostVO) => {
+ return defHttp.post({ url: '/system/post/create', params })
+}
+
+// 修改岗位
+export const updatePostApi = (params: PostVO) => {
+ return defHttp.put({ url: '/system/post/update', params })
+}
+
+// 删除岗位
+export const deletePostApi = (id: number) => {
+ return defHttp.delete({ url: '/system/post/delete?id=' + id })
+}
+
+// 导出岗位
+export const exportPostApi = (params) => {
+ return defHttp.get({ url: '/system/post/export', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/post/types.ts b/yudao-ui-admin-vue3/src/api/system/post/types.ts
new file mode 100644
index 0000000000..893b820b71
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/post/types.ts
@@ -0,0 +1,9 @@
+export type PostVO = {
+ id: number
+ name: string
+ code: string
+ sort: number
+ status: number
+ remark: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/role/index.ts b/yudao-ui-admin-vue3/src/api/system/role/index.ts
new file mode 100644
index 0000000000..5b2d53640f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/role/index.ts
@@ -0,0 +1,32 @@
+import { defHttp } from '@/config/axios'
+import type { RoleVO } from './types'
+
+// 查询角色列表
+export const getRolePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/role/page', params })
+}
+
+// 查询角色详情
+export const getRoleApi = (id: number) => {
+ return defHttp.get({ url: '/system/role/get?id=' + id })
+}
+
+// 新增角色
+export const createRoleApi = (params: RoleVO) => {
+ return defHttp.post({ url: '/system/role/create', params })
+}
+
+// 修改角色
+export const updateRoleApi = (params: RoleVO) => {
+ return defHttp.put({ url: '/system/role/update', params })
+}
+
+// 修改角色状态
+export const updateRoleStatusApi = (params: RoleVO) => {
+ return defHttp.put({ url: '/system/role/update-status', params })
+}
+
+// 删除角色
+export const deleteRoleApi = (id: number) => {
+ return defHttp.delete({ url: '/system/role/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/role/types.ts b/yudao-ui-admin-vue3/src/api/system/role/types.ts
new file mode 100644
index 0000000000..f5e17ea999
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/role/types.ts
@@ -0,0 +1,9 @@
+export type RoleVO = {
+ id: number
+ name: string
+ code: string
+ sort: number
+ status: number
+ type: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sensitiveWord/index.ts b/yudao-ui-admin-vue3/src/api/system/sensitiveWord/index.ts
new file mode 100644
index 0000000000..9e4c86f42c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sensitiveWord/index.ts
@@ -0,0 +1,42 @@
+import { defHttp } from '@/config/axios'
+import type { SensitiveWordVO } from './types'
+
+// 查询敏感词列表
+export const getSensitiveWordPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/sensitive-word/page', params })
+}
+
+// 查询敏感词详情
+export const getSensitiveWordApi = (id: number) => {
+ return defHttp.get({ url: '/system/sensitive-word/get?id=' + id })
+}
+
+// 新增敏感词
+export const createSensitiveWordApi = (params: SensitiveWordVO) => {
+ return defHttp.post({ url: '/system/sensitive-word/create', params })
+}
+
+// 修改敏感词
+export const updateSensitiveWordApi = (params: SensitiveWordVO) => {
+ return defHttp.put({ url: '/system/sensitive-word/update', params })
+}
+
+// 删除敏感词
+export const deleteSensitiveWordApi = (id: number) => {
+ return defHttp.delete({ url: '/system/sensitive-word/delete?id=' + id })
+}
+
+// 导出敏感词
+export const exportSensitiveWordApi = (params) => {
+ return defHttp.get({ url: '/system/sensitive-word/export', params, responseType: 'blob' })
+}
+
+// 获取所有敏感词的标签数组
+export const getSensitiveWordTagsApi = () => {
+ return defHttp.get({ url: '/system/sensitive-word/get-tags' })
+}
+
+// 获得文本所包含的不合法的敏感词数组
+export const validateTextApi = (id: number) => {
+ return defHttp.get({ url: '/system/sensitive-word/validate-text?' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sensitiveWord/types.ts b/yudao-ui-admin-vue3/src/api/system/sensitiveWord/types.ts
new file mode 100644
index 0000000000..68219fe434
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sensitiveWord/types.ts
@@ -0,0 +1,9 @@
+export type SensitiveWordVO = {
+ id: number
+ name: string
+ status: number
+ description: string
+ tags: string
+ type: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sms/smsChannel/index.ts b/yudao-ui-admin-vue3/src/api/system/sms/smsChannel/index.ts
new file mode 100644
index 0000000000..31a38227eb
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sms/smsChannel/index.ts
@@ -0,0 +1,32 @@
+import { defHttp } from '@/config/axios'
+import type { SmsChannelVO } from './types'
+
+// 查询短信渠道列表
+export const getSmsChannelPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/sms-channel/page', params })
+}
+
+// 获得短信渠道精简列表
+export function getSimpleSmsChannels() {
+ return defHttp.get({ url: '/system/sms-channel/list-all-simple' })
+}
+
+// 查询短信渠道详情
+export const getSmsChannelApi = (id: number) => {
+ return defHttp.get({ url: '/system/sms-channel/get?id=' + id })
+}
+
+// 新增短信渠道
+export const createSmsChannelApi = (params: SmsChannelVO) => {
+ return defHttp.post({ url: '/system/sms-channel/create', params })
+}
+
+// 修改短信渠道
+export const updateSmsChannelApi = (params: SmsChannelVO) => {
+ return defHttp.put({ url: '/system/sms-channel/update', params })
+}
+
+// 删除短信渠道
+export const deleteSmsChannelApi = (id: number) => {
+ return defHttp.delete({ url: '/system/sms-channel/delete?id=' + id })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sms/smsChannel/types.ts b/yudao-ui-admin-vue3/src/api/system/sms/smsChannel/types.ts
new file mode 100644
index 0000000000..c4e9da24a1
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sms/smsChannel/types.ts
@@ -0,0 +1,10 @@
+export type SmsChannelVO = {
+ id: number
+ status: number
+ signature: string
+ remark: string
+ apiKey: string
+ apiSecret: string
+ callbackUrl: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sms/smsLog/index.ts b/yudao-ui-admin-vue3/src/api/system/sms/smsLog/index.ts
new file mode 100644
index 0000000000..6d58fbac71
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sms/smsLog/index.ts
@@ -0,0 +1,12 @@
+import { defHttp } from '@/config/axios'
+import type { SmsLogVO } from './types'
+
+// 查询短信日志列表
+export const getSmsLogPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/sms-log/page', params })
+}
+
+// 导出短信日志
+export const exportSmsLogApi = (params) => {
+ return defHttp.get({ url: '/system/sms-log/export', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sms/smsLog/types.ts b/yudao-ui-admin-vue3/src/api/system/sms/smsLog/types.ts
new file mode 100644
index 0000000000..2a1781f5b0
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sms/smsLog/types.ts
@@ -0,0 +1,9 @@
+export type SmsLogVO = {
+ id: number
+ idchannelId: number
+ templateId: number
+ mobile: string
+ sendStatus: number
+ receiveStatus: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sms/smsTemplate/index.ts b/yudao-ui-admin-vue3/src/api/system/sms/smsTemplate/index.ts
new file mode 100644
index 0000000000..b3c1b42196
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sms/smsTemplate/index.ts
@@ -0,0 +1,37 @@
+import { defHttp } from '@/config/axios'
+import type { SmsTemplateVO, SmsSendVO } from './types'
+
+// 查询短信模板列表
+export const getSmsTemplatePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/sms-template/page', params })
+}
+
+// 查询短信模板详情
+export const getSmsTemplateApi = (id: number) => {
+ return defHttp.get({ url: '/system/sms-template/get?id=' + id })
+}
+
+// 新增短信模板
+export const createSmsTemplateApi = (params: SmsTemplateVO) => {
+ return defHttp.post({ url: '/system/sms-template/create', params })
+}
+
+// 修改短信模板
+export const updateSmsTemplateApi = (params: SmsTemplateVO) => {
+ return defHttp.put({ url: '/system/sms-template/update', params })
+}
+
+// 删除短信模板
+export const deleteSmsTemplateApi = (id: number) => {
+ return defHttp.delete({ url: '/system/sms-template/delete?id=' + id })
+}
+
+// 发送短信
+export function sendSms(params: SmsSendVO) {
+ return defHttp.post({ url: '/system/sms-template/send-sms', params })
+}
+
+// 导出短信模板
+export const exportPostApi = (params) => {
+ return defHttp.get({ url: '/system/sms-template/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/sms/smsTemplate/types.ts b/yudao-ui-admin-vue3/src/api/system/sms/smsTemplate/types.ts
new file mode 100644
index 0000000000..70c8421b50
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/sms/smsTemplate/types.ts
@@ -0,0 +1,19 @@
+export type SmsTemplateVO = {
+ id: number
+ type: number
+ status: number
+ code: string
+ name: string
+ content: string
+ remark: string
+ apiTemplateId: string
+ channelId: number
+ channelCode: string
+ createTime: string
+}
+
+export type SmsSendVO = {
+ mobile: string
+ templateCode: string
+ templateParams: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/tenant/index.ts b/yudao-ui-admin-vue3/src/api/system/tenant/index.ts
new file mode 100644
index 0000000000..ae4c64b92b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/tenant/index.ts
@@ -0,0 +1,32 @@
+import { defHttp } from '@/config/axios'
+import type { TenantVO } from './types'
+
+// 查询租户列表
+export const getTenantPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/tenant/page', params })
+}
+
+// 查询租户详情
+export const getTenantApi = (id: number) => {
+ return defHttp.get({ url: '/system/tenant/get?id=' + id })
+}
+
+// 新增租户
+export const createTenantApi = (params: TenantVO) => {
+ return defHttp.post({ url: '/system/tenant/create', params })
+}
+
+// 修改租户
+export const updateTenantApi = (params: TenantVO) => {
+ return defHttp.put({ url: '/system/tenant/update', params })
+}
+
+// 删除租户
+export const deleteTenantApi = (id: number) => {
+ return defHttp.delete({ url: '/system/tenant/delete?id=' + id })
+}
+
+// 导出租户
+export const exportTenantApi = (params) => {
+ return defHttp.get({ url: '/system/tenant/export-excel', params, responseType: 'blob' })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/tenant/types.ts b/yudao-ui-admin-vue3/src/api/system/tenant/types.ts
new file mode 100644
index 0000000000..1fc58bd71a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/tenant/types.ts
@@ -0,0 +1,12 @@
+export type TenantVO = {
+ id: number
+ name: string
+ packageId: number
+ contactName: string
+ contactMobile: string
+ accountCount: number
+ expireTime: string
+ domain: string
+ status: number
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/tenantPackage/index.ts b/yudao-ui-admin-vue3/src/api/system/tenantPackage/index.ts
new file mode 100644
index 0000000000..ab52dccb2c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/tenantPackage/index.ts
@@ -0,0 +1,33 @@
+import { defHttp } from '@/config/axios'
+import type { TenantPackageVO } from './types'
+
+// 查询租户套餐列表
+export const getTenantPackageTypePageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/tenant-package/page', params })
+}
+
+// 获得租户
+export const getTenantPackageApi = (id: number) => {
+ return defHttp.get({ url: '/system/tenant-package/get?id=' + id })
+}
+
+// 新增租户套餐
+export const createTenantPackageTypeApi = (params: TenantPackageVO) => {
+ return defHttp.post({ url: '/system/tenant-package/create', params })
+}
+
+// 修改租户套餐
+export const updateTenantPackageTypeApi = (params: TenantPackageVO) => {
+ return defHttp.put({ url: '/system/tenant-package/update', params })
+}
+
+// 删除租户套餐
+export const deleteTenantPackageTypeApi = (id: number) => {
+ return defHttp.delete({ url: '/system/tenant-package/delete?id=' + id })
+}
+// // 获取租户套餐精简信息列表
+export const getTenantPackageList = () => {
+ return defHttp.get({
+ url: '/system/tenant-package/get-simple-list'
+ })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/tenantPackage/types.ts b/yudao-ui-admin-vue3/src/api/system/tenantPackage/types.ts
new file mode 100644
index 0000000000..b67dad77ef
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/tenantPackage/types.ts
@@ -0,0 +1,11 @@
+export type TenantPackageVO = {
+ id: number
+ name: string
+ status: number
+ remark: string
+ creator: string
+ createTime: string
+ updater: string
+ updateTime: string
+ menuIds: string[]
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/user/index.ts b/yudao-ui-admin-vue3/src/api/system/user/index.ts
new file mode 100644
index 0000000000..187ae43320
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/user/index.ts
@@ -0,0 +1,68 @@
+import { defHttp } from '@/config/axios'
+import type { UserVO } from './types'
+
+// 查询用户管理列表
+export const getUserPageApi = ({ params }) => {
+ return defHttp.get>({ url: '/system/user/page', params })
+}
+
+// 查询用户详情
+export const getUserApi = (id: number) => {
+ return defHttp.get({ url: '/system/user/get?id=' + id })
+}
+
+// 新增用户
+export const createUserApi = (params: UserVO) => {
+ return defHttp.post({ url: '/system/user/create', params })
+}
+
+// 修改用户
+export const updateUserApi = (params: UserVO) => {
+ return defHttp.put({ url: '/system/user/update', params })
+}
+
+// 删除用户
+export const deleteUserApi = (id: number) => {
+ return defHttp.delete({ url: '/system/user/delete?id=' + id })
+}
+
+// 导出用户
+export const exportUserApi = (params) => {
+ return defHttp.get({ url: '/system/user/export', params, responseType: 'blob' })
+}
+
+// 下载用户导入模板
+export const importUserTemplateApi = () => {
+ return defHttp.get({ url: '/system/user/get-import-template', responseType: 'blob' })
+}
+
+// 用户密码重置
+export const resetUserPwdApi = (userId: number, password: number) => {
+ const data = {
+ userId,
+ password
+ }
+ return defHttp.put({
+ url: '/system/user/resetPwd',
+ data: data
+ })
+}
+
+// 用户状态修改
+export const updateUserStatusApi = (id: number, status: number) => {
+ const data = {
+ id,
+ status
+ }
+ return defHttp.put({ url: '/system/user/update-status', data: data })
+}
+
+// 查询授权角色
+export const getAuthRoleApi = (userId: string) => {
+ return defHttp.get({ url: '/system/user/authRole/' + userId })
+}
+
+// 保存授权角色
+export const updateAuthRoleApi = (data: any) => {
+ return defHttp.put({ url: '/system/user/authRole', params: data })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/user/profile/index.ts b/yudao-ui-admin-vue3/src/api/system/user/profile/index.ts
new file mode 100644
index 0000000000..6e2a3197a4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/user/profile/index.ts
@@ -0,0 +1,28 @@
+import { defHttp } from '@/config/axios'
+import { ProfileVO } from './types'
+
+// 查询用户个人信息
+export const getUserProfileApi = () => {
+ return defHttp.get({ url: '/system/user/profile/get' })
+}
+
+// 修改用户个人信息
+export const updateUserProfileApi = ({ params }) => {
+ return defHttp.put({ url: '/system/user/profile/update', params })
+}
+
+// 用户密码重置
+export const updateUserPwdApi = (oldPassword: string, newPassword: string) => {
+ return defHttp.put({
+ url: '/system/user/profile/update-password',
+ params: {
+ oldPassword: oldPassword,
+ newPassword: newPassword
+ }
+ })
+}
+
+// 用户头像上传
+export const uploadAvatarApi = (data) => {
+ return defHttp.put({ url: '/system/user/profile/update-avatar', data: data })
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/user/profile/types.ts b/yudao-ui-admin-vue3/src/api/system/user/profile/types.ts
new file mode 100644
index 0000000000..f4d7483018
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/user/profile/types.ts
@@ -0,0 +1,42 @@
+export type ProfileDept = {
+ id: number
+ name: string
+}
+export type ProfileRole = {
+ id: number
+ name: string
+}
+export type ProfilePost = {
+ id: number
+ name: string
+}
+export type SocialUser = {
+ id: number
+ type: number
+ openid: string
+ token: string
+ rawTokenInfo: string
+ nickname: string
+ avatar: string
+ rawUserInfo: string
+ code: string
+ state: string
+}
+export type ProfileVO = {
+ id: number
+ username: string
+ nickname: string
+ dept: ProfileDept
+ roles: ProfileRole[]
+ posts: ProfilePost[]
+ socialUsers: SocialUser[]
+ email: string
+ mobile: string
+ sex: number
+ avatar: string
+ status: number
+ remark: string
+ loginIp: string
+ loginDate: Date
+ createTime: Date
+}
diff --git a/yudao-ui-admin-vue3/src/api/system/user/types.ts b/yudao-ui-admin-vue3/src/api/system/user/types.ts
new file mode 100644
index 0000000000..2102bbe999
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/api/system/user/types.ts
@@ -0,0 +1,16 @@
+export type UserVO = {
+ id: number
+ username: string
+ nickname: string
+ deptId: number
+ postIds: string[]
+ email: string
+ mobile: string
+ sex: number
+ avatar: string
+ loginIp: string
+ status: number
+ remark: string
+ loginDate: string
+ createTime: string
+}
diff --git a/yudao-ui-admin-vue3/src/assets/imgs/avatar.gif b/yudao-ui-admin-vue3/src/assets/imgs/avatar.gif
new file mode 100644
index 0000000000..fdbd32c675
Binary files /dev/null and b/yudao-ui-admin-vue3/src/assets/imgs/avatar.gif differ
diff --git a/yudao-ui-admin-vue3/src/assets/imgs/logo.png b/yudao-ui-admin-vue3/src/assets/imgs/logo.png
new file mode 100644
index 0000000000..7e1043f21e
Binary files /dev/null and b/yudao-ui-admin-vue3/src/assets/imgs/logo.png differ
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/403.svg b/yudao-ui-admin-vue3/src/assets/svgs/403.svg
new file mode 100644
index 0000000000..4500596172
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/403.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/404.svg b/yudao-ui-admin-vue3/src/assets/svgs/404.svg
new file mode 100644
index 0000000000..5244d8d4d4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/500.svg b/yudao-ui-admin-vue3/src/assets/svgs/500.svg
new file mode 100644
index 0000000000..9c020927fa
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/500.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/icon.svg b/yudao-ui-admin-vue3/src/assets/svgs/icon.svg
new file mode 100644
index 0000000000..82be8eeedb
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/login-bg.svg b/yudao-ui-admin-vue3/src/assets/svgs/login-bg.svg
new file mode 100644
index 0000000000..bbe06c160a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/login-bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/login-box-bg.svg b/yudao-ui-admin-vue3/src/assets/svgs/login-box-bg.svg
new file mode 100644
index 0000000000..f4585e7f1b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/login-box-bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/message.svg b/yudao-ui-admin-vue3/src/assets/svgs/message.svg
new file mode 100644
index 0000000000..14ca81728a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/money.svg b/yudao-ui-admin-vue3/src/assets/svgs/money.svg
new file mode 100644
index 0000000000..c1580de10e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/peoples.svg b/yudao-ui-admin-vue3/src/assets/svgs/peoples.svg
new file mode 100644
index 0000000000..aab852e52a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/assets/svgs/shopping.svg b/yudao-ui-admin-vue3/src/assets/svgs/shopping.svg
new file mode 100644
index 0000000000..87513e7c5f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/assets/svgs/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/components/Backtop/index.ts b/yudao-ui-admin-vue3/src/components/Backtop/index.ts
new file mode 100644
index 0000000000..96de88d699
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Backtop/index.ts
@@ -0,0 +1,3 @@
+import Backtop from './src/Backtop.vue'
+
+export { Backtop }
diff --git a/yudao-ui-admin-vue3/src/components/Backtop/src/Backtop.vue b/yudao-ui-admin-vue3/src/components/Backtop/src/Backtop.vue
new file mode 100644
index 0000000000..f5c2fc4447
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Backtop/src/Backtop.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Breadcrumb/index.ts b/yudao-ui-admin-vue3/src/components/Breadcrumb/index.ts
new file mode 100644
index 0000000000..93ffe7054e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Breadcrumb/index.ts
@@ -0,0 +1,3 @@
+import Breadcrumb from './src/Breadcrumb.vue'
+
+export { Breadcrumb }
diff --git a/yudao-ui-admin-vue3/src/components/Breadcrumb/src/Breadcrumb.vue b/yudao-ui-admin-vue3/src/components/Breadcrumb/src/Breadcrumb.vue
new file mode 100644
index 0000000000..bbbbc19704
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Breadcrumb/src/Breadcrumb.vue
@@ -0,0 +1,127 @@
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Breadcrumb/src/helper.ts b/yudao-ui-admin-vue3/src/components/Breadcrumb/src/helper.ts
new file mode 100644
index 0000000000..fb3ec1977b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Breadcrumb/src/helper.ts
@@ -0,0 +1,31 @@
+import { pathResolve } from '@/utils/routerHelper'
+import type { RouteMeta } from 'vue-router'
+
+export const filterBreadcrumb = (
+ routes: AppRouteRecordRaw[],
+ parentPath = ''
+): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+
+ for (const route of routes) {
+ const meta = route?.meta as RouteMeta
+ if (meta.hidden && !meta.canTo) {
+ continue
+ }
+
+ const data: AppRouteRecordRaw =
+ !meta.alwaysShow && route.children?.length === 1
+ ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) }
+ : { ...route }
+
+ data.path = pathResolve(parentPath, data.path)
+
+ if (data.children) {
+ data.children = filterBreadcrumb(data.children, data.path)
+ }
+ if (data) {
+ res.push(data)
+ }
+ }
+ return res
+}
diff --git a/yudao-ui-admin-vue3/src/components/Collapse/index.ts b/yudao-ui-admin-vue3/src/components/Collapse/index.ts
new file mode 100644
index 0000000000..73f65a3a65
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Collapse/index.ts
@@ -0,0 +1,3 @@
+import Collapse from './src/Collapse.vue'
+
+export { Collapse }
diff --git a/yudao-ui-admin-vue3/src/components/Collapse/src/Collapse.vue b/yudao-ui-admin-vue3/src/components/Collapse/src/Collapse.vue
new file mode 100644
index 0000000000..197b86d412
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Collapse/src/Collapse.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/ConfigGlobal/index.ts b/yudao-ui-admin-vue3/src/components/ConfigGlobal/index.ts
new file mode 100644
index 0000000000..dda2462cb7
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ConfigGlobal/index.ts
@@ -0,0 +1,3 @@
+import ConfigGlobal from './src/ConfigGlobal.vue'
+
+export { ConfigGlobal }
diff --git a/yudao-ui-admin-vue3/src/components/ConfigGlobal/src/ConfigGlobal.vue b/yudao-ui-admin-vue3/src/components/ConfigGlobal/src/ConfigGlobal.vue
new file mode 100644
index 0000000000..985d5dfbb9
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ConfigGlobal/src/ConfigGlobal.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/ContentDetailWrap/index.ts b/yudao-ui-admin-vue3/src/components/ContentDetailWrap/index.ts
new file mode 100644
index 0000000000..1871cac722
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ContentDetailWrap/index.ts
@@ -0,0 +1,3 @@
+import ContentDetailWrap from './src/ContentDetailWrap.vue'
+
+export { ContentDetailWrap }
diff --git a/yudao-ui-admin-vue3/src/components/ContentDetailWrap/src/ContentDetailWrap.vue b/yudao-ui-admin-vue3/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
new file mode 100644
index 0000000000..9bab3970a7
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ContentDetailWrap/src/ContentDetailWrap.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+ {{ t('common.back') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/ContentWrap/index.ts b/yudao-ui-admin-vue3/src/components/ContentWrap/index.ts
new file mode 100644
index 0000000000..8c22cc8332
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ContentWrap/index.ts
@@ -0,0 +1,3 @@
+import ContentWrap from './src/ContentWrap.vue'
+
+export { ContentWrap }
diff --git a/yudao-ui-admin-vue3/src/components/ContentWrap/src/ContentWrap.vue b/yudao-ui-admin-vue3/src/components/ContentWrap/src/ContentWrap.vue
new file mode 100644
index 0000000000..d85124af8f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ContentWrap/src/ContentWrap.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
{{ title }}
+
+
+ {{ message }}
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/ContextMenu/index.ts b/yudao-ui-admin-vue3/src/components/ContextMenu/index.ts
new file mode 100644
index 0000000000..2a7c1f0dba
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ContextMenu/index.ts
@@ -0,0 +1,10 @@
+import ContextMenu from './src/ContextMenu.vue'
+import { ElDropdown } from 'element-plus'
+import type { RouteLocationNormalizedLoaded } from 'vue-router'
+
+export interface ContextMenuExpose {
+ elDropdownMenuRef: ComponentRef
+ tagItem: RouteLocationNormalizedLoaded
+}
+
+export { ContextMenu }
diff --git a/yudao-ui-admin-vue3/src/components/ContextMenu/src/ContextMenu.vue b/yudao-ui-admin-vue3/src/components/ContextMenu/src/ContextMenu.vue
new file mode 100644
index 0000000000..5007121540
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ContextMenu/src/ContextMenu.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+ {{ t(item.label) }}
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/CountTo/index.ts b/yudao-ui-admin-vue3/src/components/CountTo/index.ts
new file mode 100644
index 0000000000..2119f0235e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/CountTo/index.ts
@@ -0,0 +1,3 @@
+import CountTo from './src/CountTo.vue'
+
+export { CountTo }
diff --git a/yudao-ui-admin-vue3/src/components/CountTo/src/CountTo.vue b/yudao-ui-admin-vue3/src/components/CountTo/src/CountTo.vue
new file mode 100644
index 0000000000..7d8d37b1ed
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/CountTo/src/CountTo.vue
@@ -0,0 +1,180 @@
+
+
+
+
+ {{ displayValue }}
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/day.vue b/yudao-ui-admin-vue3/src/components/Crontab/day.vue
new file mode 100644
index 0000000000..6e368f3a32
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/day.vue
@@ -0,0 +1,174 @@
+
+
+
+ 日,允许的通配符[, - * ? / L W]
+
+
+
+ 不指定
+
+
+
+
+ 周期从
+ -
+ 日
+
+
+
+
+
+ 从
+ 号开始,每
+ 日执行一次
+
+
+
+
+
+ 每月
+ 号最近的那个工作日
+
+
+
+
+ 本月最后一天
+
+
+
+
+ 指定
+
+ {{ item }}
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/hour.vue b/yudao-ui-admin-vue3/src/components/Crontab/hour.vue
new file mode 100644
index 0000000000..d26a2b7e6f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/hour.vue
@@ -0,0 +1,121 @@
+
+
+
+ 小时,允许的通配符[, - * /]
+
+
+
+
+ 周期从
+ -
+ 小时
+
+
+
+
+
+ 从
+ 小时开始,每
+ 小时执行一次
+
+
+
+
+
+ 指定
+
+ {{ item - 1 }}
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/index.vue b/yudao-ui-admin-vue3/src/components/Crontab/index.vue
new file mode 100644
index 0000000000..0819dd5950
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/index.vue
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定
+ 重置
+ 取消
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/min.vue b/yudao-ui-admin-vue3/src/components/Crontab/min.vue
new file mode 100644
index 0000000000..ed961acf8e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/min.vue
@@ -0,0 +1,121 @@
+
+
+
+ 分钟,允许的通配符[, - * /]
+
+
+
+
+ 周期从
+ -
+ 分钟
+
+
+
+
+
+ 从
+ 分钟开始,每
+ 分钟执行一次
+
+
+
+
+
+ 指定
+
+ {{ item - 1 }}
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/month.vue b/yudao-ui-admin-vue3/src/components/Crontab/month.vue
new file mode 100644
index 0000000000..2cc074c4df
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/month.vue
@@ -0,0 +1,121 @@
+
+
+
+ 月,允许的通配符[, - * /]
+
+
+
+
+ 周期从
+ -
+ 月
+
+
+
+
+
+ 从
+ 月开始,每
+ 月月执行一次
+
+
+
+
+
+ 指定
+
+ {{ item }}
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/result.vue b/yudao-ui-admin-vue3/src/components/Crontab/result.vue
new file mode 100644
index 0000000000..6a0f2b8383
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/result.vue
@@ -0,0 +1,574 @@
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/second.vue b/yudao-ui-admin-vue3/src/components/Crontab/second.vue
new file mode 100644
index 0000000000..42b5496aff
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/second.vue
@@ -0,0 +1,121 @@
+
+
+
+ 秒,允许的通配符[, - * /]
+
+
+
+
+ 周期从
+ -
+ 秒
+
+
+
+
+
+ 从
+ 秒开始,每
+ 秒执行一次
+
+
+
+
+
+ 指定
+
+ {{ item - 1 }}
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/week.vue b/yudao-ui-admin-vue3/src/components/Crontab/week.vue
new file mode 100644
index 0000000000..ea3e7760ac
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/week.vue
@@ -0,0 +1,224 @@
+
+
+
+ 周,允许的通配符[, - * ? / L #]
+
+
+
+ 不指定
+
+
+
+
+ 周期从星期
+
+ {{ item.value }}
+
+ -
+
+ {{ item.value }}
+
+
+
+
+
+
+ 第
+ 周的星期
+
+ {{ item.value }}
+
+
+
+
+
+
+ 本月最后一个星期
+
+ {{ item.value }}
+
+
+
+
+
+
+ 指定
+
+ {{ item.value }}
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Crontab/year.vue b/yudao-ui-admin-vue3/src/components/Crontab/year.vue
new file mode 100644
index 0000000000..f798f70c22
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Crontab/year.vue
@@ -0,0 +1,140 @@
+
+
+
+ 不填,允许的通配符[, - * /]
+
+
+
+ 每年
+
+
+
+
+ 周期从
+ -
+
+
+
+
+
+
+ 从
+ 年开始,每
+
+ 年执行一次
+
+
+
+
+
+ 指定
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Descriptions/index.ts b/yudao-ui-admin-vue3/src/components/Descriptions/index.ts
new file mode 100644
index 0000000000..91b0eb4197
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Descriptions/index.ts
@@ -0,0 +1,3 @@
+import Descriptions from './src/Descriptions.vue'
+
+export { Descriptions }
diff --git a/yudao-ui-admin-vue3/src/components/Descriptions/src/Descriptions.vue b/yudao-ui-admin-vue3/src/components/Descriptions/src/Descriptions.vue
new file mode 100644
index 0000000000..c59d74a2d3
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Descriptions/src/Descriptions.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+ {{ data[item.field] }}
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Dialog/index.ts b/yudao-ui-admin-vue3/src/components/Dialog/index.ts
new file mode 100644
index 0000000000..1655dadce3
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Dialog/index.ts
@@ -0,0 +1,3 @@
+import Dialog from './src/Dialog.vue'
+
+export { Dialog }
diff --git a/yudao-ui-admin-vue3/src/components/Dialog/src/Dialog.vue b/yudao-ui-admin-vue3/src/components/Dialog/src/Dialog.vue
new file mode 100644
index 0000000000..8d3797eba1
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Dialog/src/Dialog.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/DictTag/index.ts b/yudao-ui-admin-vue3/src/components/DictTag/index.ts
new file mode 100644
index 0000000000..4db274209f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/DictTag/index.ts
@@ -0,0 +1,3 @@
+import DictTag from './src/DictTag.vue'
+
+export { DictTag }
diff --git a/yudao-ui-admin-vue3/src/components/DictTag/src/DictTag.vue b/yudao-ui-admin-vue3/src/components/DictTag/src/DictTag.vue
new file mode 100644
index 0000000000..05f123040e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/DictTag/src/DictTag.vue
@@ -0,0 +1,69 @@
+
+
+
+
+ {{ dictData?.label }}
+
+
+
+ {{ dictData?.label }}
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Echart/index.ts b/yudao-ui-admin-vue3/src/components/Echart/index.ts
new file mode 100644
index 0000000000..482209210f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Echart/index.ts
@@ -0,0 +1,3 @@
+import Echart from './src/Echart.vue'
+
+export { Echart }
diff --git a/yudao-ui-admin-vue3/src/components/Echart/src/Echart.vue b/yudao-ui-admin-vue3/src/components/Echart/src/Echart.vue
new file mode 100644
index 0000000000..84f23da0a2
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Echart/src/Echart.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Editor/index.ts b/yudao-ui-admin-vue3/src/components/Editor/index.ts
new file mode 100644
index 0000000000..3fbf0a9c9e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Editor/index.ts
@@ -0,0 +1,8 @@
+import Editor from './src/Editor.vue'
+import { IDomEditor } from '@wangeditor/editor'
+
+export interface EditorExpose {
+ getEditorRef: () => Promise
+}
+
+export { Editor }
diff --git a/yudao-ui-admin-vue3/src/components/Editor/src/Editor.vue b/yudao-ui-admin-vue3/src/components/Editor/src/Editor.vue
new file mode 100644
index 0000000000..6a02791e60
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Editor/src/Editor.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Error/index.ts b/yudao-ui-admin-vue3/src/components/Error/index.ts
new file mode 100644
index 0000000000..a52c6f97d5
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Error/index.ts
@@ -0,0 +1,3 @@
+import Error from './src/Error.vue'
+
+export { Error }
diff --git a/yudao-ui-admin-vue3/src/components/Error/src/Error.vue b/yudao-ui-admin-vue3/src/components/Error/src/Error.vue
new file mode 100644
index 0000000000..c588af10bc
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Error/src/Error.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
{{ errorMap[type].message }}
+
+ {{ errorMap[type].buttonText }}
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Footer/index.ts b/yudao-ui-admin-vue3/src/components/Footer/index.ts
new file mode 100644
index 0000000000..bd052e0c42
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Footer/index.ts
@@ -0,0 +1,3 @@
+import Footer from './src/Footer.vue'
+
+export { Footer }
diff --git a/yudao-ui-admin-vue3/src/components/Footer/src/Footer.vue b/yudao-ui-admin-vue3/src/components/Footer/src/Footer.vue
new file mode 100644
index 0000000000..72248ec272
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Footer/src/Footer.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Form/index.ts b/yudao-ui-admin-vue3/src/components/Form/index.ts
new file mode 100644
index 0000000000..a9c5efc550
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/index.ts
@@ -0,0 +1,14 @@
+import Form from './src/Form.vue'
+import { ElForm } from 'element-plus'
+
+export interface FormExpose {
+ setValues: (data: Recordable) => void
+ setProps: (props: Recordable) => void
+ delSchema: (field: string) => void
+ addSchema: (formSchema: FormSchema, index?: number) => void
+ setSchema: (schemaProps: FormSetPropsType[]) => void
+ formModel: Recordable
+ getElFormRef: () => ComponentRef
+}
+
+export { Form }
diff --git a/yudao-ui-admin-vue3/src/components/Form/src/Form.vue b/yudao-ui-admin-vue3/src/components/Form/src/Form.vue
new file mode 100644
index 0000000000..d1a818bf88
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/src/Form.vue
@@ -0,0 +1,299 @@
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Form/src/componentMap.ts b/yudao-ui-admin-vue3/src/components/Form/src/componentMap.ts
new file mode 100644
index 0000000000..822f64da15
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/src/componentMap.ts
@@ -0,0 +1,48 @@
+import type { Component } from 'vue'
+import {
+ ElCascader,
+ ElCheckboxGroup,
+ ElColorPicker,
+ ElDatePicker,
+ ElInput,
+ ElInputNumber,
+ ElRadioGroup,
+ ElRate,
+ ElSelect,
+ ElSelectV2,
+ ElSlider,
+ ElSwitch,
+ ElTimePicker,
+ ElTimeSelect,
+ ElTransfer,
+ ElAutocomplete,
+ ElDivider
+} from 'element-plus'
+import { InputPassword } from '@/components/InputPassword'
+import { Editor } from '@/components/Editor'
+
+const componentMap: Recordable = {
+ Radio: ElRadioGroup,
+ Checkbox: ElCheckboxGroup,
+ CheckboxButton: ElCheckboxGroup,
+ Input: ElInput,
+ Autocomplete: ElAutocomplete,
+ InputNumber: ElInputNumber,
+ Select: ElSelect,
+ Cascader: ElCascader,
+ Switch: ElSwitch,
+ Slider: ElSlider,
+ TimePicker: ElTimePicker,
+ DatePicker: ElDatePicker,
+ Rate: ElRate,
+ ColorPicker: ElColorPicker,
+ Transfer: ElTransfer,
+ Divider: ElDivider,
+ TimeSelect: ElTimeSelect,
+ SelectV2: ElSelectV2,
+ RadioButton: ElRadioGroup,
+ InputPassword: InputPassword,
+ Editor: Editor
+}
+
+export { componentMap }
diff --git a/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderCheckbox.tsx b/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderCheckbox.tsx
new file mode 100644
index 0000000000..26ac32e12b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderCheckbox.tsx
@@ -0,0 +1,20 @@
+import { ElCheckbox, ElCheckboxButton } from 'element-plus'
+import { defineComponent } from 'vue'
+
+export const useRenderCheckbox = () => {
+ const renderChcekboxOptions = (item: FormSchema) => {
+ // 如果有别名,就取别名
+ const labelAlias = item?.componentProps?.optionsAlias?.labelField
+ const valueAlias = item?.componentProps?.optionsAlias?.valueField
+ const Com = (item.component === 'Checkbox' ? ElCheckbox : ElCheckboxButton) as ReturnType<
+ typeof defineComponent
+ >
+ return item?.componentProps?.options?.map((option) => {
+ return {option[valueAlias || 'label']}
+ })
+ }
+
+ return {
+ renderChcekboxOptions
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderRadio.tsx b/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderRadio.tsx
new file mode 100644
index 0000000000..98a4778731
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderRadio.tsx
@@ -0,0 +1,20 @@
+import { ElRadio, ElRadioButton } from 'element-plus'
+import { defineComponent } from 'vue'
+
+export const useRenderRadio = () => {
+ const renderRadioOptions = (item: FormSchema) => {
+ // 如果有别名,就取别名
+ const labelAlias = item?.componentProps?.optionsAlias?.labelField
+ const valueAlias = item?.componentProps?.optionsAlias?.valueField
+ const Com = (item.component === 'Radio' ? ElRadio : ElRadioButton) as ReturnType<
+ typeof defineComponent
+ >
+ return item?.componentProps?.options?.map((option) => {
+ return {option[valueAlias || 'label']}
+ })
+ }
+
+ return {
+ renderRadioOptions
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderSelect.tsx b/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderSelect.tsx
new file mode 100644
index 0000000000..13793f59b8
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/src/components/useRenderSelect.tsx
@@ -0,0 +1,48 @@
+import { ElOption, ElOptionGroup } from 'element-plus'
+import { getSlot } from '@/utils/tsxHelper'
+import { Slots } from 'vue'
+
+export const useRenderSelect = (slots: Slots) => {
+ // 渲染 select options
+ const renderSelectOptions = (item: FormSchema) => {
+ // 如果有别名,就取别名
+ const labelAlias = item?.componentProps?.optionsAlias?.labelField
+ return item?.componentProps?.options?.map((option) => {
+ if (option?.options?.length) {
+ return (
+
+ {() => {
+ return option?.options?.map((v) => {
+ return renderSelectOptionItem(item, v)
+ })
+ }}
+
+ )
+ } else {
+ return renderSelectOptionItem(item, option)
+ }
+ })
+ }
+
+ // 渲染 select option item
+ const renderSelectOptionItem = (item: FormSchema, option: ComponentOptions) => {
+ // 如果有别名,就取别名
+ const labelAlias = item?.componentProps?.optionsAlias?.labelField
+ const valueAlias = item?.componentProps?.optionsAlias?.valueField
+ return (
+
+ {{
+ default: () =>
+ // option 插槽名规则,{field}-option
+ item?.componentProps?.optionsSlot
+ ? getSlot(slots, `${item.field}-option`, { item: option })
+ : undefined
+ }}
+
+ )
+ }
+
+ return {
+ renderSelectOptions
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/components/Form/src/helper.ts b/yudao-ui-admin-vue3/src/components/Form/src/helper.ts
new file mode 100644
index 0000000000..2f75322b07
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/src/helper.ts
@@ -0,0 +1,152 @@
+// import { useI18n } from '@/hooks/web/useI18n'
+import type { Slots } from 'vue'
+import { getSlot } from '@/utils/tsxHelper'
+import { PlaceholderMoel } from './types'
+
+// const { t } = useI18n()
+
+/**
+ *
+ * @param schema 对应组件数据
+ * @returns 返回提示信息对象
+ * @description 用于自动设置placeholder
+ */
+export const setTextPlaceholder = (schema: FormSchema): PlaceholderMoel => {
+ const textMap = ['Input', 'Autocomplete', 'InputNumber', 'InputPassword']
+ const selectMap = ['Select', 'TimePicker', 'DatePicker', 'TimeSelect', 'TimeSelect']
+ if (textMap.includes(schema?.component as string)) {
+ return {
+ // placeholder: t('common.inputText')
+ placeholder: '请输入'
+ }
+ }
+ if (selectMap.includes(schema?.component as string)) {
+ // 一些范围选择器
+ const twoTextMap = ['datetimerange', 'daterange', 'monthrange', 'datetimerange', 'daterange']
+ if (
+ twoTextMap.includes(
+ (schema?.componentProps?.type || schema?.componentProps?.isRange) as string
+ )
+ ) {
+ return {
+ // startPlaceholder: t('common.startTimeText'),
+ // endPlaceholder: t('common.endTimeText'),
+ startPlaceholder: '开始时间',
+ endPlaceholder: '结束时间',
+ rangeSeparator: '-'
+ }
+ } else {
+ return {
+ // placeholder: t('common.selectText')
+ placeholder: '请选择'
+ }
+ }
+ }
+ return {}
+}
+
+/**
+ *
+ * @param col 内置栅格
+ * @returns 返回栅格属性
+ * @description 合并传入进来的栅格属性
+ */
+export const setGridProp = (col: ColProps = {}): ColProps => {
+ const colProps: ColProps = {
+ // 如果有span,代表用户优先级更高,所以不需要默认栅格
+ ...(col.span
+ ? {}
+ : {
+ xs: 24,
+ sm: 12,
+ md: 12,
+ lg: 12,
+ xl: 12
+ }),
+ ...col
+ }
+ return colProps
+}
+
+/**
+ *
+ * @param item 传入的组件属性
+ * @returns 默认添加 clearable 属性
+ */
+export const setComponentProps = (item: FormSchema): Recordable => {
+ const notNeedClearable = ['ColorPicker']
+ const componentProps: Recordable = notNeedClearable.includes(item.component as string)
+ ? { ...item.componentProps }
+ : {
+ clearable: true,
+ ...item.componentProps
+ }
+ // 需要删除额外的属性
+ delete componentProps?.slots
+ return componentProps
+}
+
+/**
+ *
+ * @param slots 插槽
+ * @param slotsProps 插槽属性
+ * @param field 字段名
+ */
+export const setItemComponentSlots = (
+ slots: Slots,
+ slotsProps: Recordable = {},
+ field: string
+): Recordable => {
+ const slotObj: Recordable = {}
+ for (const key in slotsProps) {
+ if (slotsProps[key]) {
+ // 由于组件有可能重复,需要有一个唯一的前缀
+ slotObj[key] = (data: Recordable) => {
+ return getSlot(slots, `${field}-${key}`, data)
+ }
+ }
+ }
+ return slotObj
+}
+
+/**
+ *
+ * @param schema Form表单结构化数组
+ * @param formModel FormMoel
+ * @returns FormMoel
+ * @description 生成对应的formModel
+ */
+export const initModel = (schema: FormSchema[], formModel: Recordable) => {
+ const model: Recordable = { ...formModel }
+ schema.map((v) => {
+ // 如果是hidden,就删除对应的值
+ if (v.hidden) {
+ delete model[v.field]
+ } else if (v.component && v.component !== 'Divider') {
+ const hasField = Reflect.has(model, v.field)
+ // 如果先前已经有值存在,则不进行重新赋值,而是采用现有的值
+ model[v.field] = hasField ? model[v.field] : v.value !== void 0 ? v.value : ''
+ }
+ })
+ return model
+}
+
+/**
+ * @param slots 插槽
+ * @param field 字段名
+ * @returns 返回FormIiem插槽
+ */
+export const setFormItemSlots = (slots: Slots, field: string): Recordable => {
+ const slotObj: Recordable = {}
+ if (slots[`${field}-error`]) {
+ slotObj['error'] = (data: Recordable) => {
+ return getSlot(slots, `${field}-error`, data)
+ }
+ }
+ if (slots[`${field}-label`]) {
+ slotObj['label'] = (data: Recordable) => {
+ return getSlot(slots, `${field}-label`, data)
+ }
+ }
+ return slotObj
+}
diff --git a/yudao-ui-admin-vue3/src/components/Form/src/types.ts b/yudao-ui-admin-vue3/src/components/Form/src/types.ts
new file mode 100644
index 0000000000..fb650ba33c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Form/src/types.ts
@@ -0,0 +1,15 @@
+export interface PlaceholderMoel {
+ placeholder?: string
+ startPlaceholder?: string
+ endPlaceholder?: string
+ rangeSeparator?: string
+}
+
+export type FormProps = {
+ schema?: FormSchema[]
+ isCol?: boolean
+ model?: Recordable
+ autoSetPlaceholder?: boolean
+ isCustom?: boolean
+ labelWidth?: string | number
+} & Recordable
diff --git a/yudao-ui-admin-vue3/src/components/Highlight/index.ts b/yudao-ui-admin-vue3/src/components/Highlight/index.ts
new file mode 100644
index 0000000000..3e2d9ed609
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Highlight/index.ts
@@ -0,0 +1,3 @@
+import Highlight from './src/Highlight.vue'
+
+export { Highlight }
diff --git a/yudao-ui-admin-vue3/src/components/Highlight/src/Highlight.vue b/yudao-ui-admin-vue3/src/components/Highlight/src/Highlight.vue
new file mode 100644
index 0000000000..ef923a9a48
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Highlight/src/Highlight.vue
@@ -0,0 +1,65 @@
+
diff --git a/yudao-ui-admin-vue3/src/components/IFrame/index.ts b/yudao-ui-admin-vue3/src/components/IFrame/index.ts
new file mode 100644
index 0000000000..9f8cf24a5a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/IFrame/index.ts
@@ -0,0 +1,3 @@
+import IFrame from './src/IFrame.vue'
+
+export { IFrame }
diff --git a/yudao-ui-admin-vue3/src/components/IFrame/src/IFrame.vue b/yudao-ui-admin-vue3/src/components/IFrame/src/IFrame.vue
new file mode 100644
index 0000000000..61ec2b8cfc
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/IFrame/src/IFrame.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Icon/index.ts b/yudao-ui-admin-vue3/src/components/Icon/index.ts
new file mode 100644
index 0000000000..33d1de38a3
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Icon/index.ts
@@ -0,0 +1,4 @@
+import Icon from './src/Icon.vue'
+import IconSelect from './src/IconSelect.vue'
+
+export { Icon, IconSelect }
diff --git a/yudao-ui-admin-vue3/src/components/Icon/src/Icon.vue b/yudao-ui-admin-vue3/src/components/Icon/src/Icon.vue
new file mode 100644
index 0000000000..8c5ddede4f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Icon/src/Icon.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Icon/src/IconSelect.vue b/yudao-ui-admin-vue3/src/components/Icon/src/IconSelect.vue
new file mode 100644
index 0000000000..73282b8f23
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Icon/src/IconSelect.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Icon/src/data.ts b/yudao-ui-admin-vue3/src/components/Icon/src/data.ts
new file mode 100644
index 0000000000..2a4ed5a3c9
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Icon/src/data.ts
@@ -0,0 +1,1961 @@
+export const IconJson = {
+ 'ep:': [
+ 'add-location',
+ 'aim',
+ 'alarm-clock',
+ 'apple',
+ 'arrow-down',
+ 'arrow-down-bold',
+ 'arrow-left',
+ 'arrow-left-bold',
+ 'arrow-right',
+ 'arrow-right-bold',
+ 'arrow-up',
+ 'arrow-up-bold',
+ 'avatar',
+ 'back',
+ 'baseball',
+ 'basketball',
+ 'bell',
+ 'bell-filled',
+ 'bicycle',
+ 'bottom',
+ 'bottom-left',
+ 'bottom-right',
+ 'bowl',
+ 'box',
+ 'briefcase',
+ 'brush',
+ 'brush-filled',
+ 'burger',
+ 'calendar',
+ 'camera',
+ 'camera-filled',
+ 'caret-bottom',
+ 'caret-left',
+ 'caret-right',
+ 'caret-top',
+ 'cellphone',
+ 'chat-dot-round',
+ 'chat-dot-square',
+ 'chat-line-round',
+ 'chat-line-square',
+ 'chat-round',
+ 'chat-square',
+ 'check',
+ 'checked',
+ 'cherry',
+ 'chicken',
+ 'circle-check',
+ 'circle-check-filled',
+ 'circle-close',
+ 'circle-close-filled',
+ 'circle-plus',
+ 'circle-plus-filled',
+ 'clock',
+ 'close',
+ 'close-bold',
+ 'cloudy',
+ 'coffee',
+ 'coffee-cup',
+ 'coin',
+ 'cold-drink',
+ 'collection',
+ 'collection-tag',
+ 'comment',
+ 'compass',
+ 'connection',
+ 'coordinate',
+ 'copy-document',
+ 'cpu',
+ 'credit-card',
+ 'crop',
+ 'd-arrow-left',
+ 'd-arrow-right',
+ 'd-caret',
+ 'data-analysis',
+ 'data-board',
+ 'data-line',
+ 'delete',
+ 'delete-filled',
+ 'delete-location',
+ 'dessert',
+ 'discount',
+ 'dish',
+ 'dish-dot',
+ 'document',
+ 'document-add',
+ 'document-checked',
+ 'document-copy',
+ 'document-delete',
+ 'document-remove',
+ 'download',
+ 'drizzling',
+ 'edit',
+ 'edit-pen',
+ 'eleme',
+ 'eleme-filled',
+ 'expand',
+ 'failed',
+ 'female',
+ 'files',
+ 'film',
+ 'filter',
+ 'finished',
+ 'first-aid-kit',
+ 'flag',
+ 'fold',
+ 'folder',
+ 'folder-add',
+ 'folder-checked',
+ 'folder-delete',
+ 'folder-opened',
+ 'folder-remove',
+ 'food',
+ 'football',
+ 'fork-spoon',
+ 'fries',
+ 'full-screen',
+ 'goblet',
+ 'goblet-full',
+ 'goblet-square',
+ 'goblet-square-full',
+ 'goods',
+ 'goods-filled',
+ 'grape',
+ 'grid',
+ 'guide',
+ 'headset',
+ 'help',
+ 'help-filled',
+ 'histogram',
+ 'home-filled',
+ 'hot-water',
+ 'house',
+ 'ice-cream',
+ 'ice-cream-round',
+ 'ice-cream-square',
+ 'ice-drink',
+ 'ice-tea',
+ 'info-filled',
+ 'iphone',
+ 'key',
+ 'knife-fork',
+ 'lightning',
+ 'link',
+ 'list',
+ 'loading',
+ 'location',
+ 'location-filled',
+ 'location-information',
+ 'lock',
+ 'lollipop',
+ 'magic-stick',
+ 'magnet',
+ 'male',
+ 'management',
+ 'map-location',
+ 'medal',
+ 'menu',
+ 'message',
+ 'message-box',
+ 'mic',
+ 'microphone',
+ 'milk-tea',
+ 'minus',
+ 'money',
+ 'monitor',
+ 'moon',
+ 'moon-night',
+ 'more',
+ 'more-filled',
+ 'mostly-cloudy',
+ 'mouse',
+ 'mug',
+ 'mute',
+ 'mute-notification',
+ 'no-smoking',
+ 'notebook',
+ 'notification',
+ 'odometer',
+ 'office-building',
+ 'open',
+ 'operation',
+ 'opportunity',
+ 'orange',
+ 'paperclip',
+ 'partly-cloudy',
+ 'pear',
+ 'phone',
+ 'phone-filled',
+ 'picture',
+ 'picture-filled',
+ 'picture-rounded',
+ 'pie-chart',
+ 'place',
+ 'platform',
+ 'plus',
+ 'pointer',
+ 'position',
+ 'postcard',
+ 'pouring',
+ 'present',
+ 'price-tag',
+ 'printer',
+ 'promotion',
+ 'question-filled',
+ 'rank',
+ 'reading',
+ 'reading-lamp',
+ 'refresh',
+ 'refresh-left',
+ 'refresh-right',
+ 'refrigerator',
+ 'remove',
+ 'remove-filled',
+ 'right',
+ 'scale-to-original',
+ 'school',
+ 'scissor',
+ 'search',
+ 'select',
+ 'sell',
+ 'semi-select',
+ 'service',
+ 'set-up',
+ 'setting',
+ 'share',
+ 'ship',
+ 'shop',
+ 'shopping-bag',
+ 'shopping-cart',
+ 'shopping-cart-full',
+ 'smoking',
+ 'soccer',
+ 'sold-out',
+ 'sort',
+ 'sort-down',
+ 'sort-up',
+ 'stamp',
+ 'star',
+ 'star-filled',
+ 'stopwatch',
+ 'success-filled',
+ 'sugar',
+ 'suitcase',
+ 'sunny',
+ 'sunrise',
+ 'sunset',
+ 'switch',
+ 'switch-button',
+ 'takeaway-box',
+ 'ticket',
+ 'tickets',
+ 'timer',
+ 'toilet-paper',
+ 'tools',
+ 'top',
+ 'top-left',
+ 'top-right',
+ 'trend-charts',
+ 'trophy',
+ 'turn-off',
+ 'umbrella',
+ 'unlock',
+ 'upload',
+ 'upload-filled',
+ 'user',
+ 'user-filled',
+ 'van',
+ 'video-camera',
+ 'video-camera-filled',
+ 'video-pause',
+ 'video-play',
+ 'view',
+ 'wallet',
+ 'wallet-filled',
+ 'warning',
+ 'warning-filled',
+ 'watch',
+ 'watermelon',
+ 'wind-power',
+ 'zoom-in',
+ 'zoom-out'
+ ],
+ 'fa:': [
+ '500px',
+ 'address-book',
+ 'address-book-o',
+ 'address-card',
+ 'address-card-o',
+ 'adjust',
+ 'adn',
+ 'align-center',
+ 'align-justify',
+ 'align-left',
+ 'amazon',
+ 'ambulance',
+ 'american-sign-language-interpreting',
+ 'anchor',
+ 'android',
+ 'angellist',
+ 'angle-double-left',
+ 'angle-double-up',
+ 'angle-down',
+ 'angle-left',
+ 'angle-up',
+ 'apple',
+ 'archive',
+ 'area-chart',
+ 'arrow-circle-left',
+ 'arrow-circle-o-left',
+ 'arrow-circle-o-up',
+ 'arrow-circle-up',
+ 'arrow-left',
+ 'arrow-up',
+ 'arrows',
+ 'arrows-alt',
+ 'arrows-h',
+ 'arrows-v',
+ 'assistive-listening-systems',
+ 'asterisk',
+ 'at',
+ 'audio-description',
+ 'automobile',
+ 'backward',
+ 'balance-scale',
+ 'ban',
+ 'bandcamp',
+ 'bank',
+ 'bar-chart',
+ 'barcode',
+ 'bars',
+ 'bath',
+ 'battery',
+ 'battery-0',
+ 'battery-1',
+ 'battery-2',
+ 'battery-3',
+ 'bed',
+ 'beer',
+ 'behance',
+ 'behance-square',
+ 'bell',
+ 'bell-o',
+ 'bell-slash',
+ 'bell-slash-o',
+ 'bicycle',
+ 'binoculars',
+ 'birthday-cake',
+ 'bitbucket',
+ 'bitbucket-square',
+ 'bitcoin',
+ 'black-tie',
+ 'blind',
+ 'bluetooth',
+ 'bluetooth-b',
+ 'bold',
+ 'bolt',
+ 'bomb',
+ 'book',
+ 'bookmark',
+ 'bookmark-o',
+ 'braille',
+ 'briefcase',
+ 'bug',
+ 'building',
+ 'building-o',
+ 'bullhorn',
+ 'bullseye',
+ 'bus',
+ 'buysellads',
+ 'cab',
+ 'calculator',
+ 'calendar',
+ 'calendar-check-o',
+ 'calendar-minus-o',
+ 'calendar-o',
+ 'calendar-plus-o',
+ 'calendar-times-o',
+ 'camera',
+ 'camera-retro',
+ 'caret-down',
+ 'caret-left',
+ 'caret-square-o-left',
+ 'caret-square-o-up',
+ 'caret-up',
+ 'cart-arrow-down',
+ 'cart-plus',
+ 'cc',
+ 'cc-amex',
+ 'cc-diners-club',
+ 'cc-discover',
+ 'cc-jcb',
+ 'cc-mastercard',
+ 'cc-paypal',
+ 'cc-stripe',
+ 'cc-visa',
+ 'certificate',
+ 'chain',
+ 'chain-broken',
+ 'check',
+ 'check-circle',
+ 'check-circle-o',
+ 'check-square',
+ 'check-square-o',
+ 'chevron-circle-left',
+ 'chevron-circle-up',
+ 'chevron-down',
+ 'chevron-left',
+ 'chevron-up',
+ 'child',
+ 'chrome',
+ 'circle',
+ 'circle-o',
+ 'circle-o-notch',
+ 'circle-thin',
+ 'clipboard',
+ 'clock-o',
+ 'clone',
+ 'close',
+ 'cloud',
+ 'cloud-download',
+ 'cloud-upload',
+ 'cny',
+ 'code',
+ 'code-fork',
+ 'codepen',
+ 'codiepie',
+ 'coffee',
+ 'cog',
+ 'cogs',
+ 'columns',
+ 'comment',
+ 'comment-o',
+ 'commenting',
+ 'commenting-o',
+ 'comments',
+ 'comments-o',
+ 'compass',
+ 'compress',
+ 'connectdevelop',
+ 'contao',
+ 'copy',
+ 'copyright',
+ 'creative-commons',
+ 'credit-card',
+ 'credit-card-alt',
+ 'crop',
+ 'crosshairs',
+ 'css3',
+ 'cube',
+ 'cubes',
+ 'cut',
+ 'cutlery',
+ 'dashboard',
+ 'dashcube',
+ 'database',
+ 'deaf',
+ 'dedent',
+ 'delicious',
+ 'desktop',
+ 'deviantart',
+ 'diamond',
+ 'digg',
+ 'dollar',
+ 'dot-circle-o',
+ 'download',
+ 'dribbble',
+ 'drivers-license',
+ 'drivers-license-o',
+ 'dropbox',
+ 'drupal',
+ 'edge',
+ 'edit',
+ 'eercast',
+ 'eject',
+ 'ellipsis-h',
+ 'ellipsis-v',
+ 'empire',
+ 'envelope',
+ 'envelope-o',
+ 'envelope-open',
+ 'envelope-open-o',
+ 'envelope-square',
+ 'envira',
+ 'eraser',
+ 'etsy',
+ 'eur',
+ 'exchange',
+ 'exclamation',
+ 'exclamation-circle',
+ 'exclamation-triangle',
+ 'expand',
+ 'expeditedssl',
+ 'external-link',
+ 'external-link-square',
+ 'eye',
+ 'eye-slash',
+ 'eyedropper',
+ 'fa',
+ 'facebook',
+ 'facebook-official',
+ 'facebook-square',
+ 'fast-backward',
+ 'fax',
+ 'feed',
+ 'female',
+ 'fighter-jet',
+ 'file',
+ 'file-archive-o',
+ 'file-audio-o',
+ 'file-code-o',
+ 'file-excel-o',
+ 'file-image-o',
+ 'file-movie-o',
+ 'file-o',
+ 'file-pdf-o',
+ 'file-powerpoint-o',
+ 'file-text',
+ 'file-text-o',
+ 'file-word-o',
+ 'film',
+ 'filter',
+ 'fire',
+ 'fire-extinguisher',
+ 'firefox',
+ 'first-order',
+ 'flag',
+ 'flag-checkered',
+ 'flag-o',
+ 'flask',
+ 'flickr',
+ 'floppy-o',
+ 'folder',
+ 'folder-o',
+ 'folder-open',
+ 'folder-open-o',
+ 'font',
+ 'fonticons',
+ 'fort-awesome',
+ 'forumbee',
+ 'foursquare',
+ 'free-code-camp',
+ 'frown-o',
+ 'futbol-o',
+ 'gamepad',
+ 'gavel',
+ 'gbp',
+ 'genderless',
+ 'get-pocket',
+ 'gg',
+ 'gg-circle',
+ 'gift',
+ 'git',
+ 'git-square',
+ 'github',
+ 'github-alt',
+ 'github-square',
+ 'gitlab',
+ 'gittip',
+ 'glass',
+ 'glide',
+ 'glide-g',
+ 'globe',
+ 'google',
+ 'google-plus',
+ 'google-plus-circle',
+ 'google-plus-square',
+ 'google-wallet',
+ 'graduation-cap',
+ 'grav',
+ 'group',
+ 'h-square',
+ 'hacker-news',
+ 'hand-grab-o',
+ 'hand-lizard-o',
+ 'hand-o-left',
+ 'hand-o-up',
+ 'hand-paper-o',
+ 'hand-peace-o',
+ 'hand-pointer-o',
+ 'hand-scissors-o',
+ 'hand-spock-o',
+ 'handshake-o',
+ 'hashtag',
+ 'hdd-o',
+ 'header',
+ 'headphones',
+ 'heart',
+ 'heart-o',
+ 'heartbeat',
+ 'history',
+ 'home',
+ 'hospital-o',
+ 'hourglass',
+ 'hourglass-1',
+ 'hourglass-2',
+ 'hourglass-3',
+ 'hourglass-o',
+ 'houzz',
+ 'html5',
+ 'i-cursor',
+ 'id-badge',
+ 'ils',
+ 'image',
+ 'imdb',
+ 'inbox',
+ 'indent',
+ 'industry',
+ 'info',
+ 'info-circle',
+ 'inr',
+ 'instagram',
+ 'internet-explorer',
+ 'intersex',
+ 'ioxhost',
+ 'italic',
+ 'joomla',
+ 'jsfiddle',
+ 'key',
+ 'keyboard-o',
+ 'krw',
+ 'language',
+ 'laptop',
+ 'lastfm',
+ 'lastfm-square',
+ 'leaf',
+ 'leanpub',
+ 'lemon-o',
+ 'level-up',
+ 'life-bouy',
+ 'lightbulb-o',
+ 'line-chart',
+ 'linkedin',
+ 'linkedin-square',
+ 'linode',
+ 'linux',
+ 'list',
+ 'list-alt',
+ 'list-ol',
+ 'list-ul',
+ 'location-arrow',
+ 'lock',
+ 'long-arrow-left',
+ 'long-arrow-up',
+ 'low-vision',
+ 'magic',
+ 'magnet',
+ 'mail-forward',
+ 'mail-reply',
+ 'mail-reply-all',
+ 'male',
+ 'map',
+ 'map-marker',
+ 'map-o',
+ 'map-pin',
+ 'map-signs',
+ 'mars',
+ 'mars-double',
+ 'mars-stroke',
+ 'mars-stroke-h',
+ 'mars-stroke-v',
+ 'maxcdn',
+ 'meanpath',
+ 'medium',
+ 'medkit',
+ 'meetup',
+ 'meh-o',
+ 'mercury',
+ 'microchip',
+ 'microphone',
+ 'microphone-slash',
+ 'minus',
+ 'minus-circle',
+ 'minus-square',
+ 'minus-square-o',
+ 'mixcloud',
+ 'mobile',
+ 'modx',
+ 'money',
+ 'moon-o',
+ 'motorcycle',
+ 'mouse-pointer',
+ 'music',
+ 'neuter',
+ 'newspaper-o',
+ 'object-group',
+ 'object-ungroup',
+ 'odnoklassniki',
+ 'odnoklassniki-square',
+ 'opencart',
+ 'openid',
+ 'opera',
+ 'optin-monster',
+ 'pagelines',
+ 'paint-brush',
+ 'paper-plane',
+ 'paper-plane-o',
+ 'paperclip',
+ 'paragraph',
+ 'pause',
+ 'pause-circle',
+ 'pause-circle-o',
+ 'paw',
+ 'paypal',
+ 'pencil',
+ 'pencil-square',
+ 'percent',
+ 'phone',
+ 'phone-square',
+ 'pie-chart',
+ 'pied-piper',
+ 'pied-piper-alt',
+ 'pied-piper-pp',
+ 'pinterest',
+ 'pinterest-p',
+ 'pinterest-square',
+ 'plane',
+ 'play',
+ 'play-circle',
+ 'play-circle-o',
+ 'plug',
+ 'plus',
+ 'plus-circle',
+ 'plus-square',
+ 'plus-square-o',
+ 'podcast',
+ 'power-off',
+ 'print',
+ 'product-hunt',
+ 'puzzle-piece',
+ 'qq',
+ 'qrcode',
+ 'question',
+ 'question-circle',
+ 'question-circle-o',
+ 'quora',
+ 'quote-left',
+ 'quote-right',
+ 'ra',
+ 'random',
+ 'ravelry',
+ 'recycle',
+ 'reddit',
+ 'reddit-alien',
+ 'reddit-square',
+ 'refresh',
+ 'registered',
+ 'renren',
+ 'repeat',
+ 'retweet',
+ 'road',
+ 'rocket',
+ 'rotate-left',
+ 'rouble',
+ 'rss-square',
+ 'safari',
+ 'scribd',
+ 'search',
+ 'search-minus',
+ 'search-plus',
+ 'sellsy',
+ 'server',
+ 'share-alt',
+ 'share-alt-square',
+ 'share-square',
+ 'share-square-o',
+ 'shield',
+ 'ship',
+ 'shirtsinbulk',
+ 'shopping-bag',
+ 'shopping-basket',
+ 'shopping-cart',
+ 'shower',
+ 'sign-in',
+ 'sign-language',
+ 'sign-out',
+ 'signal',
+ 'simplybuilt',
+ 'sitemap',
+ 'skyatlas',
+ 'skype',
+ 'slack',
+ 'sliders',
+ 'slideshare',
+ 'smile-o',
+ 'snapchat',
+ 'snapchat-ghost',
+ 'snapchat-square',
+ 'snowflake-o',
+ 'sort',
+ 'sort-alpha-asc',
+ 'sort-alpha-desc',
+ 'sort-amount-asc',
+ 'sort-amount-desc',
+ 'sort-asc',
+ 'sort-numeric-asc',
+ 'sort-numeric-desc',
+ 'soundcloud',
+ 'space-shuttle',
+ 'spinner',
+ 'spoon',
+ 'spotify',
+ 'square',
+ 'square-o',
+ 'stack-exchange',
+ 'stack-overflow',
+ 'star',
+ 'star-half',
+ 'star-half-empty',
+ 'star-o',
+ 'steam',
+ 'steam-square',
+ 'step-backward',
+ 'stethoscope',
+ 'sticky-note',
+ 'sticky-note-o',
+ 'stop',
+ 'stop-circle',
+ 'stop-circle-o',
+ 'street-view',
+ 'strikethrough',
+ 'stumbleupon',
+ 'stumbleupon-circle',
+ 'subscript',
+ 'subway',
+ 'suitcase',
+ 'sun-o',
+ 'superpowers',
+ 'superscript',
+ 'table',
+ 'tablet',
+ 'tag',
+ 'tags',
+ 'tasks',
+ 'telegram',
+ 'television',
+ 'tencent-weibo',
+ 'terminal',
+ 'text-height',
+ 'text-width',
+ 'th',
+ 'th-large',
+ 'th-list',
+ 'themeisle',
+ 'thermometer',
+ 'thermometer-0',
+ 'thermometer-1',
+ 'thermometer-2',
+ 'thermometer-3',
+ 'thumb-tack',
+ 'thumbs-down',
+ 'thumbs-o-up',
+ 'thumbs-up',
+ 'ticket',
+ 'times-circle',
+ 'times-circle-o',
+ 'times-rectangle',
+ 'times-rectangle-o',
+ 'tint',
+ 'toggle-off',
+ 'toggle-on',
+ 'trademark',
+ 'train',
+ 'transgender-alt',
+ 'trash',
+ 'trash-o',
+ 'tree',
+ 'trello',
+ 'tripadvisor',
+ 'trophy',
+ 'truck',
+ 'try',
+ 'tty',
+ 'tumblr',
+ 'tumblr-square',
+ 'twitch',
+ 'twitter',
+ 'twitter-square',
+ 'umbrella',
+ 'underline',
+ 'universal-access',
+ 'unlock',
+ 'unlock-alt',
+ 'upload',
+ 'usb',
+ 'user',
+ 'user-circle',
+ 'user-circle-o',
+ 'user-md',
+ 'user-o',
+ 'user-plus',
+ 'user-secret',
+ 'user-times',
+ 'venus',
+ 'venus-double',
+ 'venus-mars',
+ 'viacoin',
+ 'viadeo',
+ 'viadeo-square',
+ 'video-camera',
+ 'vimeo',
+ 'vimeo-square',
+ 'vine',
+ 'vk',
+ 'volume-control-phone',
+ 'volume-down',
+ 'volume-off',
+ 'volume-up',
+ 'wechat',
+ 'weibo',
+ 'whatsapp',
+ 'wheelchair',
+ 'wheelchair-alt',
+ 'wifi',
+ 'wikipedia-w',
+ 'window-maximize',
+ 'window-minimize',
+ 'window-restore',
+ 'windows',
+ 'wordpress',
+ 'wpbeginner',
+ 'wpexplorer',
+ 'wpforms',
+ 'wrench',
+ 'xing',
+ 'xing-square',
+ 'y-combinator',
+ 'yahoo',
+ 'yelp',
+ 'yoast',
+ 'youtube',
+ 'youtube-play',
+ 'youtube-square'
+ ],
+ 'fa-solid:': [
+ 'abacus',
+ 'ad',
+ 'address-book',
+ 'address-card',
+ 'adjust',
+ 'air-freshener',
+ 'align-center',
+ 'align-justify',
+ 'align-left',
+ 'align-right',
+ 'allergies',
+ 'ambulance',
+ 'american-sign-language-interpreting',
+ 'anchor',
+ 'angle-double-down',
+ 'angle-double-left',
+ 'angle-double-right',
+ 'angle-double-up',
+ 'angle-down',
+ 'angle-left',
+ 'angle-right',
+ 'angle-up',
+ 'angry',
+ 'ankh',
+ 'apple-alt',
+ 'archive',
+ 'archway',
+ 'arrow-alt-circle-down',
+ 'arrow-alt-circle-left',
+ 'arrow-alt-circle-right',
+ 'arrow-alt-circle-up',
+ 'arrow-circle-down',
+ 'arrow-circle-left',
+ 'arrow-circle-right',
+ 'arrow-circle-up',
+ 'arrow-down',
+ 'arrow-left',
+ 'arrow-right',
+ 'arrow-up',
+ 'arrows-alt',
+ 'arrows-alt-h',
+ 'arrows-alt-v',
+ 'assistive-listening-systems',
+ 'asterisk',
+ 'at',
+ 'atlas',
+ 'atom',
+ 'audio-description',
+ 'award',
+ 'baby',
+ 'baby-carriage',
+ 'backspace',
+ 'backward',
+ 'bacon',
+ 'bacteria',
+ 'bacterium',
+ 'bahai',
+ 'balance-scale',
+ 'balance-scale-left',
+ 'balance-scale-right',
+ 'ban',
+ 'band-aid',
+ 'barcode',
+ 'bars',
+ 'baseball-ball',
+ 'basketball-ball',
+ 'bath',
+ 'battery-empty',
+ 'battery-full',
+ 'battery-half',
+ 'battery-quarter',
+ 'battery-three-quarters',
+ 'bed',
+ 'beer',
+ 'bell',
+ 'bell-slash',
+ 'bezier-curve',
+ 'bible',
+ 'bicycle',
+ 'biking',
+ 'binoculars',
+ 'biohazard',
+ 'birthday-cake',
+ 'blender',
+ 'blender-phone',
+ 'blind',
+ 'blog',
+ 'bold',
+ 'bolt',
+ 'bomb',
+ 'bone',
+ 'bong',
+ 'book',
+ 'book-dead',
+ 'book-medical',
+ 'book-open',
+ 'book-reader',
+ 'bookmark',
+ 'border-all',
+ 'border-none',
+ 'border-style',
+ 'bowling-ball',
+ 'box',
+ 'box-open',
+ 'box-tissue',
+ 'boxes',
+ 'braille',
+ 'brain',
+ 'bread-slice',
+ 'briefcase',
+ 'briefcase-medical',
+ 'broadcast-tower',
+ 'broom',
+ 'brush',
+ 'bug',
+ 'building',
+ 'bullhorn',
+ 'bullseye',
+ 'burn',
+ 'bus',
+ 'bus-alt',
+ 'business-time',
+ 'calculator',
+ 'calculator-alt',
+ 'calendar',
+ 'calendar-alt',
+ 'calendar-check',
+ 'calendar-day',
+ 'calendar-minus',
+ 'calendar-plus',
+ 'calendar-times',
+ 'calendar-week',
+ 'camera',
+ 'camera-retro',
+ 'campground',
+ 'candy-cane',
+ 'cannabis',
+ 'capsules',
+ 'car',
+ 'car-alt',
+ 'car-battery',
+ 'car-crash',
+ 'car-side',
+ 'caravan',
+ 'caret-down',
+ 'caret-left',
+ 'caret-right',
+ 'caret-square-down',
+ 'caret-square-left',
+ 'caret-square-right',
+ 'caret-square-up',
+ 'caret-up',
+ 'carrot',
+ 'cart-arrow-down',
+ 'cart-plus',
+ 'cash-register',
+ 'cat',
+ 'certificate',
+ 'chair',
+ 'chalkboard',
+ 'chalkboard-teacher',
+ 'charging-station',
+ 'chart-area',
+ 'chart-bar',
+ 'chart-line',
+ 'chart-pie',
+ 'check',
+ 'check-circle',
+ 'check-double',
+ 'check-square',
+ 'cheese',
+ 'chess',
+ 'chess-bishop',
+ 'chess-board',
+ 'chess-king',
+ 'chess-knight',
+ 'chess-pawn',
+ 'chess-queen',
+ 'chess-rook',
+ 'chevron-circle-down',
+ 'chevron-circle-left',
+ 'chevron-circle-right',
+ 'chevron-circle-up',
+ 'chevron-down',
+ 'chevron-left',
+ 'chevron-right',
+ 'chevron-up',
+ 'child',
+ 'church',
+ 'circle',
+ 'circle-notch',
+ 'city',
+ 'clinic-medical',
+ 'clipboard',
+ 'clipboard-check',
+ 'clipboard-list',
+ 'clock',
+ 'clone',
+ 'closed-captioning',
+ 'cloud',
+ 'cloud-download-alt',
+ 'cloud-meatball',
+ 'cloud-moon',
+ 'cloud-moon-rain',
+ 'cloud-rain',
+ 'cloud-showers-heavy',
+ 'cloud-sun',
+ 'cloud-sun-rain',
+ 'cloud-upload-alt',
+ 'cocktail',
+ 'code',
+ 'code-branch',
+ 'coffee',
+ 'cog',
+ 'cogs',
+ 'coins',
+ 'columns',
+ 'comment',
+ 'comment-alt',
+ 'comment-dollar',
+ 'comment-dots',
+ 'comment-medical',
+ 'comment-slash',
+ 'comments',
+ 'comments-dollar',
+ 'compact-disc',
+ 'compass',
+ 'compress',
+ 'compress-alt',
+ 'compress-arrows-alt',
+ 'concierge-bell',
+ 'cookie',
+ 'cookie-bite',
+ 'copy',
+ 'copyright',
+ 'couch',
+ 'credit-card',
+ 'crop',
+ 'crop-alt',
+ 'cross',
+ 'crosshairs',
+ 'crow',
+ 'crown',
+ 'crutch',
+ 'cube',
+ 'cubes',
+ 'cut',
+ 'database',
+ 'deaf',
+ 'democrat',
+ 'desktop',
+ 'dharmachakra',
+ 'diagnoses',
+ 'dice',
+ 'dice-d20',
+ 'dice-d6',
+ 'dice-five',
+ 'dice-four',
+ 'dice-one',
+ 'dice-six',
+ 'dice-three',
+ 'dice-two',
+ 'digital-tachograph',
+ 'directions',
+ 'disease',
+ 'divide',
+ 'dizzy',
+ 'dna',
+ 'dog',
+ 'dollar-sign',
+ 'dolly',
+ 'dolly-flatbed',
+ 'donate',
+ 'door-closed',
+ 'door-open',
+ 'dot-circle',
+ 'dove',
+ 'download',
+ 'drafting-compass',
+ 'dragon',
+ 'draw-polygon',
+ 'drum',
+ 'drum-steelpan',
+ 'drumstick-bite',
+ 'dumbbell',
+ 'dumpster',
+ 'dumpster-fire',
+ 'dungeon',
+ 'edit',
+ 'egg',
+ 'eject',
+ 'ellipsis-h',
+ 'ellipsis-v',
+ 'empty-set',
+ 'envelope',
+ 'envelope-open',
+ 'envelope-open-text',
+ 'envelope-square',
+ 'equals',
+ 'eraser',
+ 'ethernet',
+ 'euro-sign',
+ 'exchange-alt',
+ 'exclamation',
+ 'exclamation-circle',
+ 'exclamation-triangle',
+ 'expand',
+ 'expand-alt',
+ 'expand-arrows-alt',
+ 'external-link-alt',
+ 'external-link-square-alt',
+ 'eye',
+ 'eye-dropper',
+ 'eye-slash',
+ 'fan',
+ 'fast-backward',
+ 'fast-forward',
+ 'faucet',
+ 'fax',
+ 'feather',
+ 'feather-alt',
+ 'female',
+ 'fighter-jet',
+ 'file',
+ 'file-alt',
+ 'file-archive',
+ 'file-audio',
+ 'file-code',
+ 'file-contract',
+ 'file-csv',
+ 'file-download',
+ 'file-excel',
+ 'file-export',
+ 'file-image',
+ 'file-import',
+ 'file-invoice',
+ 'file-invoice-dollar',
+ 'file-medical',
+ 'file-medical-alt',
+ 'file-pdf',
+ 'file-powerpoint',
+ 'file-prescription',
+ 'file-signature',
+ 'file-upload',
+ 'file-video',
+ 'file-word',
+ 'fill',
+ 'fill-drip',
+ 'film',
+ 'filter',
+ 'fingerprint',
+ 'fire',
+ 'fire-alt',
+ 'fire-extinguisher',
+ 'first-aid',
+ 'fish',
+ 'fist-raised',
+ 'flag',
+ 'flag-checkered',
+ 'flag-usa',
+ 'flask',
+ 'flushed',
+ 'folder',
+ 'folder-minus',
+ 'folder-open',
+ 'folder-plus',
+ 'font',
+ 'football-ball',
+ 'forward',
+ 'frog',
+ 'frown',
+ 'frown-open',
+ 'function',
+ 'funnel-dollar',
+ 'futbol',
+ 'gamepad',
+ 'gas-pump',
+ 'gavel',
+ 'gem',
+ 'genderless',
+ 'ghost',
+ 'gift',
+ 'gifts',
+ 'glass-cheers',
+ 'glass-martini',
+ 'glass-martini-alt',
+ 'glass-whiskey',
+ 'glasses',
+ 'globe',
+ 'globe-africa',
+ 'globe-americas',
+ 'globe-asia',
+ 'globe-europe',
+ 'golf-ball',
+ 'gopuram',
+ 'graduation-cap',
+ 'greater-than',
+ 'greater-than-equal',
+ 'grimace',
+ 'grin',
+ 'grin-alt',
+ 'grin-beam',
+ 'grin-beam-sweat',
+ 'grin-hearts',
+ 'grin-squint',
+ 'grin-squint-tears',
+ 'grin-stars',
+ 'grin-tears',
+ 'grin-tongue',
+ 'grin-tongue-squint',
+ 'grin-tongue-wink',
+ 'grin-wink',
+ 'grip-horizontal',
+ 'grip-lines',
+ 'grip-lines-vertical',
+ 'grip-vertical',
+ 'guitar',
+ 'h-square',
+ 'hamburger',
+ 'hammer',
+ 'hamsa',
+ 'hand-holding',
+ 'hand-holding-heart',
+ 'hand-holding-medical',
+ 'hand-holding-usd',
+ 'hand-holding-water',
+ 'hand-lizard',
+ 'hand-middle-finger',
+ 'hand-paper',
+ 'hand-peace',
+ 'hand-point-down',
+ 'hand-point-left',
+ 'hand-point-right',
+ 'hand-point-up',
+ 'hand-pointer',
+ 'hand-rock',
+ 'hand-scissors',
+ 'hand-sparkles',
+ 'hand-spock',
+ 'hands',
+ 'hands-helping',
+ 'hands-wash',
+ 'handshake',
+ 'handshake-alt-slash',
+ 'handshake-slash',
+ 'hanukiah',
+ 'hard-hat',
+ 'hashtag',
+ 'hat-cowboy',
+ 'hat-cowboy-side',
+ 'hat-wizard',
+ 'hdd',
+ 'head-side-cough',
+ 'head-side-cough-slash',
+ 'head-side-mask',
+ 'head-side-virus',
+ 'heading',
+ 'headphones',
+ 'headphones-alt',
+ 'headset',
+ 'heart',
+ 'heart-broken',
+ 'heartbeat',
+ 'helicopter',
+ 'highlighter',
+ 'hiking',
+ 'hippo',
+ 'history',
+ 'hockey-puck',
+ 'holly-berry',
+ 'home',
+ 'horse',
+ 'horse-head',
+ 'hospital',
+ 'hospital-alt',
+ 'hospital-symbol',
+ 'hospital-user',
+ 'hot-tub',
+ 'hotdog',
+ 'hotel',
+ 'hourglass',
+ 'hourglass-end',
+ 'hourglass-half',
+ 'hourglass-start',
+ 'house-damage',
+ 'house-user',
+ 'hryvnia',
+ 'i-cursor',
+ 'ice-cream',
+ 'icicles',
+ 'icons',
+ 'id-badge',
+ 'id-card',
+ 'id-card-alt',
+ 'igloo',
+ 'image',
+ 'images',
+ 'inbox',
+ 'indent',
+ 'industry',
+ 'infinity',
+ 'info',
+ 'info-circle',
+ 'integral',
+ 'intersection',
+ 'italic',
+ 'jedi',
+ 'joint',
+ 'journal-whills',
+ 'kaaba',
+ 'key',
+ 'keyboard',
+ 'khanda',
+ 'kiss',
+ 'kiss-beam',
+ 'kiss-wink-heart',
+ 'kiwi-bird',
+ 'lambda',
+ 'landmark',
+ 'language',
+ 'laptop',
+ 'laptop-code',
+ 'laptop-house',
+ 'laptop-medical',
+ 'laugh',
+ 'laugh-beam',
+ 'laugh-squint',
+ 'laugh-wink',
+ 'layer-group',
+ 'leaf',
+ 'lemon',
+ 'less-than',
+ 'less-than-equal',
+ 'level-down-alt',
+ 'level-up-alt',
+ 'life-ring',
+ 'lightbulb',
+ 'link',
+ 'lira-sign',
+ 'list',
+ 'list-alt',
+ 'list-ol',
+ 'list-ul',
+ 'location-arrow',
+ 'lock',
+ 'lock-open',
+ 'long-arrow-alt-down',
+ 'long-arrow-alt-left',
+ 'long-arrow-alt-right',
+ 'long-arrow-alt-up',
+ 'low-vision',
+ 'luggage-cart',
+ 'lungs',
+ 'lungs-virus',
+ 'magic',
+ 'magnet',
+ 'mail-bulk',
+ 'male',
+ 'map',
+ 'map-marked',
+ 'map-marked-alt',
+ 'map-marker',
+ 'map-marker-alt',
+ 'map-pin',
+ 'map-signs',
+ 'marker',
+ 'mars',
+ 'mars-double',
+ 'mars-stroke',
+ 'mars-stroke-h',
+ 'mars-stroke-v',
+ 'mask',
+ 'medal',
+ 'medkit',
+ 'meh',
+ 'meh-blank',
+ 'meh-rolling-eyes',
+ 'memory',
+ 'menorah',
+ 'mercury',
+ 'meteor',
+ 'microchip',
+ 'microphone',
+ 'microphone-alt',
+ 'microphone-alt-slash',
+ 'microphone-slash',
+ 'microscope',
+ 'minus',
+ 'minus-circle',
+ 'minus-square',
+ 'mitten',
+ 'mobile',
+ 'mobile-alt',
+ 'money-bill',
+ 'money-bill-alt',
+ 'money-bill-wave',
+ 'money-bill-wave-alt',
+ 'money-check',
+ 'money-check-alt',
+ 'monument',
+ 'moon',
+ 'mortar-pestle',
+ 'mosque',
+ 'motorcycle',
+ 'mountain',
+ 'mouse',
+ 'mouse-pointer',
+ 'mug-hot',
+ 'music',
+ 'network-wired',
+ 'neuter',
+ 'newspaper',
+ 'not-equal',
+ 'notes-medical',
+ 'object-group',
+ 'object-ungroup',
+ 'oil-can',
+ 'om',
+ 'omega',
+ 'otter',
+ 'outdent',
+ 'pager',
+ 'paint-brush',
+ 'paint-roller',
+ 'palette',
+ 'pallet',
+ 'paper-plane',
+ 'paperclip',
+ 'parachute-box',
+ 'paragraph',
+ 'parking',
+ 'passport',
+ 'pastafarianism',
+ 'paste',
+ 'pause',
+ 'pause-circle',
+ 'paw',
+ 'peace',
+ 'pen',
+ 'pen-alt',
+ 'pen-fancy',
+ 'pen-nib',
+ 'pen-square',
+ 'pencil-alt',
+ 'pencil-ruler',
+ 'people-arrows',
+ 'people-carry',
+ 'pepper-hot',
+ 'percent',
+ 'percentage',
+ 'person-booth',
+ 'phone',
+ 'phone-alt',
+ 'phone-slash',
+ 'phone-square',
+ 'phone-square-alt',
+ 'phone-volume',
+ 'photo-video',
+ 'pi',
+ 'piggy-bank',
+ 'pills',
+ 'pizza-slice',
+ 'place-of-worship',
+ 'plane',
+ 'plane-arrival',
+ 'plane-departure',
+ 'plane-slash',
+ 'play',
+ 'play-circle',
+ 'plug',
+ 'plus',
+ 'plus-circle',
+ 'plus-square',
+ 'podcast',
+ 'poll',
+ 'poll-h',
+ 'poo',
+ 'poo-storm',
+ 'poop',
+ 'portrait',
+ 'pound-sign',
+ 'power-off',
+ 'pray',
+ 'praying-hands',
+ 'prescription',
+ 'prescription-bottle',
+ 'prescription-bottle-alt',
+ 'print',
+ 'procedures',
+ 'project-diagram',
+ 'pump-medical',
+ 'pump-soap',
+ 'puzzle-piece',
+ 'qrcode',
+ 'question',
+ 'question-circle',
+ 'quidditch',
+ 'quote-left',
+ 'quote-right',
+ 'quran',
+ 'radiation',
+ 'radiation-alt',
+ 'rainbow',
+ 'random',
+ 'receipt',
+ 'record-vinyl',
+ 'recycle',
+ 'redo',
+ 'redo-alt',
+ 'registered',
+ 'remove-format',
+ 'reply',
+ 'reply-all',
+ 'republican',
+ 'restroom',
+ 'retweet',
+ 'ribbon',
+ 'ring',
+ 'road',
+ 'robot',
+ 'rocket',
+ 'route',
+ 'rss',
+ 'rss-square',
+ 'ruble-sign',
+ 'ruler',
+ 'ruler-combined',
+ 'ruler-horizontal',
+ 'ruler-vertical',
+ 'running',
+ 'rupee-sign',
+ 'sad-cry',
+ 'sad-tear',
+ 'satellite',
+ 'satellite-dish',
+ 'save',
+ 'school',
+ 'screwdriver',
+ 'scroll',
+ 'sd-card',
+ 'search',
+ 'search-dollar',
+ 'search-location',
+ 'search-minus',
+ 'search-plus',
+ 'seedling',
+ 'server',
+ 'shapes',
+ 'share',
+ 'share-alt',
+ 'share-alt-square',
+ 'share-square',
+ 'shekel-sign',
+ 'shield-alt',
+ 'shield-virus',
+ 'ship',
+ 'shipping-fast',
+ 'shoe-prints',
+ 'shopping-bag',
+ 'shopping-basket',
+ 'shopping-cart',
+ 'shower',
+ 'shuttle-van',
+ 'sigma',
+ 'sign',
+ 'sign-in-alt',
+ 'sign-language',
+ 'sign-out-alt',
+ 'signal',
+ 'signal-alt',
+ 'signal-alt-slash',
+ 'signal-slash',
+ 'signature',
+ 'sim-card',
+ 'sink',
+ 'sitemap',
+ 'skating',
+ 'skiing',
+ 'skiing-nordic',
+ 'skull',
+ 'skull-crossbones',
+ 'slash',
+ 'sleigh',
+ 'sliders-h',
+ 'smile',
+ 'smile-beam',
+ 'smile-wink',
+ 'smog',
+ 'smoking',
+ 'smoking-ban',
+ 'sms',
+ 'snowboarding',
+ 'snowflake',
+ 'snowman',
+ 'snowplow',
+ 'soap',
+ 'socks',
+ 'solar-panel',
+ 'sort',
+ 'sort-alpha-down',
+ 'sort-alpha-down-alt',
+ 'sort-alpha-up',
+ 'sort-alpha-up-alt',
+ 'sort-amount-down',
+ 'sort-amount-down-alt',
+ 'sort-amount-up',
+ 'sort-amount-up-alt',
+ 'sort-down',
+ 'sort-numeric-down',
+ 'sort-numeric-down-alt',
+ 'sort-numeric-up',
+ 'sort-numeric-up-alt',
+ 'sort-up',
+ 'spa',
+ 'space-shuttle',
+ 'spell-check',
+ 'spider',
+ 'spinner',
+ 'splotch',
+ 'spray-can',
+ 'square',
+ 'square-full',
+ 'square-root',
+ 'square-root-alt',
+ 'stamp',
+ 'star',
+ 'star-and-crescent',
+ 'star-half',
+ 'star-half-alt',
+ 'star-of-david',
+ 'star-of-life',
+ 'step-backward',
+ 'step-forward',
+ 'stethoscope',
+ 'sticky-note',
+ 'stop',
+ 'stop-circle',
+ 'stopwatch',
+ 'stopwatch-20',
+ 'store',
+ 'store-alt',
+ 'store-alt-slash',
+ 'store-slash',
+ 'stream',
+ 'street-view',
+ 'strikethrough',
+ 'stroopwafel',
+ 'subscript',
+ 'subway',
+ 'suitcase',
+ 'suitcase-rolling',
+ 'sun',
+ 'superscript',
+ 'surprise',
+ 'swatchbook',
+ 'swimmer',
+ 'swimming-pool',
+ 'synagogue',
+ 'sync',
+ 'sync-alt',
+ 'syringe',
+ 'table',
+ 'table-tennis',
+ 'tablet',
+ 'tablet-alt',
+ 'tablets',
+ 'tachometer-alt',
+ 'tag',
+ 'tags',
+ 'tally',
+ 'tape',
+ 'tasks',
+ 'taxi',
+ 'teeth',
+ 'teeth-open',
+ 'temperature-high',
+ 'temperature-low',
+ 'tenge',
+ 'terminal',
+ 'text-height',
+ 'text-width',
+ 'th',
+ 'th-large',
+ 'th-list',
+ 'theater-masks',
+ 'thermometer',
+ 'thermometer-empty',
+ 'thermometer-full',
+ 'thermometer-half',
+ 'thermometer-quarter',
+ 'thermometer-three-quarters',
+ 'theta',
+ 'thumbs-down',
+ 'thumbs-up',
+ 'thumbtack',
+ 'ticket-alt',
+ 'tilde',
+ 'times',
+ 'times-circle',
+ 'tint',
+ 'tint-slash',
+ 'tired',
+ 'toggle-off',
+ 'toggle-on',
+ 'toilet',
+ 'toilet-paper',
+ 'toilet-paper-slash',
+ 'toolbox',
+ 'tools',
+ 'tooth',
+ 'torah',
+ 'torii-gate',
+ 'tractor',
+ 'trademark',
+ 'traffic-light',
+ 'trailer',
+ 'train',
+ 'tram',
+ 'transgender',
+ 'transgender-alt',
+ 'trash',
+ 'trash-alt',
+ 'trash-restore',
+ 'trash-restore-alt',
+ 'tree',
+ 'trophy',
+ 'truck',
+ 'truck-loading',
+ 'truck-monster',
+ 'truck-moving',
+ 'truck-pickup',
+ 'tshirt',
+ 'tty',
+ 'tv',
+ 'umbrella',
+ 'umbrella-beach',
+ 'underline',
+ 'undo',
+ 'undo-alt',
+ 'union',
+ 'universal-access',
+ 'university',
+ 'unlink',
+ 'unlock',
+ 'unlock-alt',
+ 'upload',
+ 'user',
+ 'user-alt',
+ 'user-alt-slash',
+ 'user-astronaut',
+ 'user-check',
+ 'user-circle',
+ 'user-clock',
+ 'user-cog',
+ 'user-edit',
+ 'user-friends',
+ 'user-graduate',
+ 'user-injured',
+ 'user-lock',
+ 'user-md',
+ 'user-minus',
+ 'user-ninja',
+ 'user-nurse',
+ 'user-plus',
+ 'user-secret',
+ 'user-shield',
+ 'user-slash',
+ 'user-tag',
+ 'user-tie',
+ 'user-times',
+ 'users',
+ 'users-cog',
+ 'users-slash',
+ 'utensil-spoon',
+ 'utensils',
+ 'value-absolute',
+ 'vector-square',
+ 'venus',
+ 'venus-double',
+ 'venus-mars',
+ 'vest',
+ 'vest-patches',
+ 'vial',
+ 'vials',
+ 'video',
+ 'video-slash',
+ 'vihara',
+ 'virus',
+ 'virus-slash',
+ 'viruses',
+ 'voicemail',
+ 'volleyball-ball',
+ 'volume',
+ 'volume-down',
+ 'volume-mute',
+ 'volume-off',
+ 'volume-slash',
+ 'volume-up',
+ 'vote-yea',
+ 'vr-cardboard',
+ 'walking',
+ 'wallet',
+ 'warehouse',
+ 'water',
+ 'wave-square',
+ 'weight',
+ 'weight-hanging',
+ 'wheelchair',
+ 'wifi',
+ 'wifi-slash',
+ 'wind',
+ 'window-close',
+ 'window-maximize',
+ 'window-minimize',
+ 'window-restore',
+ 'wine-bottle',
+ 'wine-glass',
+ 'wine-glass-alt',
+ 'won-sign',
+ 'wrench',
+ 'x-ray',
+ 'yen-sign',
+ 'yin-yang'
+ ]
+}
diff --git a/yudao-ui-admin-vue3/src/components/ImageViewer/index.ts b/yudao-ui-admin-vue3/src/components/ImageViewer/index.ts
new file mode 100644
index 0000000000..386813569d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ImageViewer/index.ts
@@ -0,0 +1,33 @@
+import ImageViewer from './src/ImageViewer.vue'
+import { isClient } from '@/utils/is'
+import { createVNode, render, VNode } from 'vue'
+import { ImageViewerProps } from './src/types'
+
+let instance: Nullable = null
+
+export function createImageViewer(options: ImageViewerProps) {
+ if (!isClient) return
+ const {
+ urlList,
+ initialIndex = 0,
+ infinite = true,
+ hideOnClickModal = false,
+ appendToBody = false,
+ zIndex = 2000,
+ show = true
+ } = options
+
+ const propsData: Partial = {}
+ const container = document.createElement('div')
+ propsData.urlList = urlList
+ propsData.initialIndex = initialIndex
+ propsData.infinite = infinite
+ propsData.hideOnClickModal = hideOnClickModal
+ propsData.appendToBody = appendToBody
+ propsData.zIndex = zIndex
+ propsData.show = show
+
+ document.body.appendChild(container)
+ instance = createVNode(ImageViewer, propsData)
+ render(instance, container)
+}
diff --git a/yudao-ui-admin-vue3/src/components/ImageViewer/src/ImageViewer.vue b/yudao-ui-admin-vue3/src/components/ImageViewer/src/ImageViewer.vue
new file mode 100644
index 0000000000..02fdb00842
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ImageViewer/src/ImageViewer.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/ImageViewer/src/types.ts b/yudao-ui-admin-vue3/src/components/ImageViewer/src/types.ts
new file mode 100644
index 0000000000..1932d74d07
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ImageViewer/src/types.ts
@@ -0,0 +1,9 @@
+export interface ImageViewerProps {
+ urlList?: string[]
+ zIndex?: number
+ initialIndex?: number
+ infinite?: boolean
+ hideOnClickModal?: boolean
+ appendToBody?: boolean
+ show?: boolean
+}
diff --git a/yudao-ui-admin-vue3/src/components/Infotip/index.ts b/yudao-ui-admin-vue3/src/components/Infotip/index.ts
new file mode 100644
index 0000000000..413fa5f4dc
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Infotip/index.ts
@@ -0,0 +1,3 @@
+import Infotip from './src/Infotip.vue'
+
+export { Infotip }
diff --git a/yudao-ui-admin-vue3/src/components/Infotip/src/Infotip.vue b/yudao-ui-admin-vue3/src/components/Infotip/src/Infotip.vue
new file mode 100644
index 0000000000..588cfb818c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Infotip/src/Infotip.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{ showIndex ? `${$index + 1}、` : '' }}{{ typeof item === 'string' ? item : item.label }}
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/InputPassword/index.ts b/yudao-ui-admin-vue3/src/components/InputPassword/index.ts
new file mode 100644
index 0000000000..1dcc38e9a3
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/InputPassword/index.ts
@@ -0,0 +1,3 @@
+import InputPassword from './src/InputPassword.vue'
+
+export { InputPassword }
diff --git a/yudao-ui-admin-vue3/src/components/InputPassword/src/InputPassword.vue b/yudao-ui-admin-vue3/src/components/InputPassword/src/InputPassword.vue
new file mode 100644
index 0000000000..c98cdd9a75
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/InputPassword/src/InputPassword.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/LocaleDropdown/index.ts b/yudao-ui-admin-vue3/src/components/LocaleDropdown/index.ts
new file mode 100644
index 0000000000..d02e640f7d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/LocaleDropdown/index.ts
@@ -0,0 +1,3 @@
+import LocaleDropdown from './src/LocaleDropdown.vue'
+
+export { LocaleDropdown }
diff --git a/yudao-ui-admin-vue3/src/components/LocaleDropdown/src/LocaleDropdown.vue b/yudao-ui-admin-vue3/src/components/LocaleDropdown/src/LocaleDropdown.vue
new file mode 100644
index 0000000000..9040908c5d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/LocaleDropdown/src/LocaleDropdown.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Logo/index.ts b/yudao-ui-admin-vue3/src/components/Logo/index.ts
new file mode 100644
index 0000000000..1c4224c99e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Logo/index.ts
@@ -0,0 +1,3 @@
+import Logo from './src/Logo.vue'
+
+export { Logo }
diff --git a/yudao-ui-admin-vue3/src/components/Logo/src/Logo.vue b/yudao-ui-admin-vue3/src/components/Logo/src/Logo.vue
new file mode 100644
index 0000000000..33039c573f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Logo/src/Logo.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Menu/index.ts b/yudao-ui-admin-vue3/src/components/Menu/index.ts
new file mode 100644
index 0000000000..a6ec6965b5
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Menu/index.ts
@@ -0,0 +1,3 @@
+import Menu from './src/Menu.vue'
+
+export { Menu }
diff --git a/yudao-ui-admin-vue3/src/components/Menu/src/Menu.vue b/yudao-ui-admin-vue3/src/components/Menu/src/Menu.vue
new file mode 100644
index 0000000000..78cede0c11
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Menu/src/Menu.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Menu/src/components/useRenderMenuItem.tsx b/yudao-ui-admin-vue3/src/components/Menu/src/components/useRenderMenuItem.tsx
new file mode 100644
index 0000000000..4e785d232c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Menu/src/components/useRenderMenuItem.tsx
@@ -0,0 +1,61 @@
+import { ElSubMenu, ElMenuItem } from 'element-plus'
+import type { RouteMeta } from 'vue-router'
+import { getAllParentPath, hasOneShowingChild } from '../helper'
+import { isUrl } from '@/utils/is'
+import { useRenderMenuTitle } from './useRenderMenuTitle'
+import { useDesign } from '@/hooks/web/useDesign'
+import { pathResolve } from '@/utils/routerHelper'
+
+export const useRenderMenuItem = (
+ allRouters: AppRouteRecordRaw[] = [],
+ menuMode: 'vertical' | 'horizontal'
+) => {
+ const renderMenuItem = (routers?: AppRouteRecordRaw[]) => {
+ return (routers || allRouters).map((v) => {
+ const meta = (v.meta ?? {}) as RouteMeta
+ if (!meta.hidden) {
+ const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v.children, v)
+ const fullPath = isUrl(v.path)
+ ? v.path
+ : getAllParentPath(allRouters, v.path).join('/')
+
+ const { renderMenuTitle } = useRenderMenuTitle()
+
+ if (
+ oneShowingChild &&
+ (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) &&
+ !meta?.alwaysShow
+ ) {
+ return (
+
+ {{
+ default: () => renderMenuTitle(onlyOneChild ? onlyOneChild?.meta : meta)
+ }}
+
+ )
+ } else {
+ const { getPrefixCls } = useDesign()
+
+ const preFixCls = getPrefixCls('menu-popper')
+ return (
+
+ {{
+ title: () => renderMenuTitle(meta),
+ default: () => renderMenuItem(v.children)
+ }}
+
+ )
+ }
+ }
+ })
+ }
+
+ return {
+ renderMenuItem
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/components/Menu/src/components/useRenderMenuTitle.tsx b/yudao-ui-admin-vue3/src/components/Menu/src/components/useRenderMenuTitle.tsx
new file mode 100644
index 0000000000..6f7caff7a2
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Menu/src/components/useRenderMenuTitle.tsx
@@ -0,0 +1,23 @@
+import type { RouteMeta } from 'vue-router'
+import { Icon } from '@/components/Icon'
+import { useI18n } from '@/hooks/web/useI18n'
+
+export const useRenderMenuTitle = () => {
+ const renderMenuTitle = (meta: RouteMeta) => {
+ const { t } = useI18n()
+ const { title = 'Please set title', icon } = meta
+
+ return icon ? (
+ <>
+
+
+ >
+ ) : (
+
+ )
+ }
+
+ return {
+ renderMenuTitle
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/components/Menu/src/helper.ts b/yudao-ui-admin-vue3/src/components/Menu/src/helper.ts
new file mode 100644
index 0000000000..b48388139d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Menu/src/helper.ts
@@ -0,0 +1,55 @@
+import type { RouteMeta } from 'vue-router'
+import { ref, unref } from 'vue'
+import { findPath } from '@/utils/tree'
+
+type OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean }
+
+interface HasOneShowingChild {
+ oneShowingChild?: boolean
+ onlyOneChild?: OnlyOneChildType
+}
+
+export const getAllParentPath = (treeData: T[], path: string) => {
+ const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[]
+ return (menuList || []).map((item) => item.path)
+}
+
+export const hasOneShowingChild = (
+ children: AppRouteRecordRaw[] = [],
+ parent: AppRouteRecordRaw
+): HasOneShowingChild => {
+ const onlyOneChild = ref()
+
+ const showingChildren = children.filter((v) => {
+ const meta = (v.meta ?? {}) as RouteMeta
+ if (meta.hidden) {
+ return false
+ } else {
+ // Temp set(will be used if only has one showing child)
+ onlyOneChild.value = v
+ return true
+ }
+ })
+
+ // When there is only one child router, the child router is displayed by default
+ if (showingChildren.length === 1) {
+ return {
+ oneShowingChild: true,
+ onlyOneChild: unref(onlyOneChild)
+ }
+ }
+
+ // Show parent if there are no child router to display
+ if (!showingChildren.length) {
+ onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }
+ return {
+ oneShowingChild: true,
+ onlyOneChild: unref(onlyOneChild)
+ }
+ }
+
+ return {
+ oneShowingChild: false,
+ onlyOneChild: unref(onlyOneChild)
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/components/Qrcode/index.ts b/yudao-ui-admin-vue3/src/components/Qrcode/index.ts
new file mode 100644
index 0000000000..ce461612fa
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Qrcode/index.ts
@@ -0,0 +1,3 @@
+import Qrcode from './src/Qrcode.vue'
+
+export { Qrcode }
diff --git a/yudao-ui-admin-vue3/src/components/Qrcode/src/Qrcode.vue b/yudao-ui-admin-vue3/src/components/Qrcode/src/Qrcode.vue
new file mode 100644
index 0000000000..718cd224f8
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Qrcode/src/Qrcode.vue
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Screenfull/index.ts b/yudao-ui-admin-vue3/src/components/Screenfull/index.ts
new file mode 100644
index 0000000000..faec2d8ed8
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Screenfull/index.ts
@@ -0,0 +1,3 @@
+import Screenfull from './src/Screenfull.vue'
+
+export { Screenfull }
diff --git a/yudao-ui-admin-vue3/src/components/Screenfull/src/Screenfull.vue b/yudao-ui-admin-vue3/src/components/Screenfull/src/Screenfull.vue
new file mode 100644
index 0000000000..32a12e733f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Screenfull/src/Screenfull.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Search/index.ts b/yudao-ui-admin-vue3/src/components/Search/index.ts
new file mode 100644
index 0000000000..fcc6f16306
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Search/index.ts
@@ -0,0 +1,3 @@
+import Search from './src/Search.vue'
+
+export { Search }
diff --git a/yudao-ui-admin-vue3/src/components/Search/src/Search.vue b/yudao-ui-admin-vue3/src/components/Search/src/Search.vue
new file mode 100644
index 0000000000..92128b2dfc
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Search/src/Search.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+ {{ t('common.query') }}
+
+
+
+ {{ t('common.reset') }}
+
+
+ {{ t(visible ? 'common.shrink' : 'common.expand') }}
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Setting/index.ts b/yudao-ui-admin-vue3/src/components/Setting/index.ts
new file mode 100644
index 0000000000..b64c9add8d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Setting/index.ts
@@ -0,0 +1,3 @@
+import Setting from './src/Setting.vue'
+
+export { Setting }
diff --git a/yudao-ui-admin-vue3/src/components/Setting/src/Setting.vue b/yudao-ui-admin-vue3/src/components/Setting/src/Setting.vue
new file mode 100644
index 0000000000..628a22ea02
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Setting/src/Setting.vue
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+ {{ t('setting.projectSetting') }}
+
+
+
+
+ {{ t('setting.theme') }}
+
+
+
+ {{ t('setting.layout') }}
+
+
+
+ {{ t('setting.systemTheme') }}
+
+
+
+ {{ t('setting.headerTheme') }}
+
+
+
+
+ {{ t('setting.menuTheme') }}
+
+
+
+
+
+ {{ t('setting.interfaceDisplay') }}
+
+
+
+
+ {{ t('setting.copy') }}
+
+
+
+ {{ t('setting.clearAndReset') }}
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Setting/src/components/ColorRadioPicker.vue b/yudao-ui-admin-vue3/src/components/Setting/src/components/ColorRadioPicker.vue
new file mode 100644
index 0000000000..bc40e1067b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Setting/src/components/ColorRadioPicker.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Setting/src/components/InterfaceDisplay.vue b/yudao-ui-admin-vue3/src/components/Setting/src/components/InterfaceDisplay.vue
new file mode 100644
index 0000000000..8112e9adc4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Setting/src/components/InterfaceDisplay.vue
@@ -0,0 +1,189 @@
+
+
+
+
+
+ {{ t('setting.breadcrumb') }}
+
+
+
+
+ {{ t('setting.breadcrumbIcon') }}
+
+
+
+
+ {{ t('setting.hamburgerIcon') }}
+
+
+
+
+ {{ t('setting.screenfullIcon') }}
+
+
+
+
+ {{ t('setting.sizeIcon') }}
+
+
+
+
+ {{ t('setting.localeIcon') }}
+
+
+
+
+ {{ t('setting.tagsView') }}
+
+
+
+
+ {{ t('setting.tagsViewIcon') }}
+
+
+
+
+ {{ t('setting.logo') }}
+
+
+
+
+ {{ t('setting.uniqueOpened') }}
+
+
+
+
+ {{ t('setting.fixedHeader') }}
+
+
+
+
+ {{ t('setting.footer') }}
+
+
+
+
+ {{ t('setting.greyMode') }}
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Setting/src/components/LayoutRadioPicker.vue b/yudao-ui-admin-vue3/src/components/Setting/src/components/LayoutRadioPicker.vue
new file mode 100644
index 0000000000..96b1dbeb96
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Setting/src/components/LayoutRadioPicker.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/SizeDropdown/index.ts b/yudao-ui-admin-vue3/src/components/SizeDropdown/index.ts
new file mode 100644
index 0000000000..516488d63c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/SizeDropdown/index.ts
@@ -0,0 +1,3 @@
+import SizeDropdown from './src/SizeDropdown.vue'
+
+export { SizeDropdown }
diff --git a/yudao-ui-admin-vue3/src/components/SizeDropdown/src/SizeDropdown.vue b/yudao-ui-admin-vue3/src/components/SizeDropdown/src/SizeDropdown.vue
new file mode 100644
index 0000000000..773ad620aa
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/SizeDropdown/src/SizeDropdown.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+ {{ t(`size.${item}`) }}
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Sticky/index.ts b/yudao-ui-admin-vue3/src/components/Sticky/index.ts
new file mode 100644
index 0000000000..5e1de45e8b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Sticky/index.ts
@@ -0,0 +1,3 @@
+import Sticky from './src/Sticky.vue'
+
+export { Sticky }
diff --git a/yudao-ui-admin-vue3/src/components/Sticky/src/Sticky.vue b/yudao-ui-admin-vue3/src/components/Sticky/src/Sticky.vue
new file mode 100644
index 0000000000..6906fbc345
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Sticky/src/Sticky.vue
@@ -0,0 +1,141 @@
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/TabMenu/index.ts b/yudao-ui-admin-vue3/src/components/TabMenu/index.ts
new file mode 100644
index 0000000000..b5fd71cdda
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/TabMenu/index.ts
@@ -0,0 +1,3 @@
+import TabMenu from './src/TabMenu.vue'
+
+export { TabMenu }
diff --git a/yudao-ui-admin-vue3/src/components/TabMenu/src/TabMenu.vue b/yudao-ui-admin-vue3/src/components/TabMenu/src/TabMenu.vue
new file mode 100644
index 0000000000..061421b964
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/TabMenu/src/TabMenu.vue
@@ -0,0 +1,226 @@
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/TabMenu/src/helper.ts b/yudao-ui-admin-vue3/src/components/TabMenu/src/helper.ts
new file mode 100644
index 0000000000..793f1325bf
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/TabMenu/src/helper.ts
@@ -0,0 +1,52 @@
+import { getAllParentPath } from '@/components/Menu/src/helper'
+import type { RouteMeta } from 'vue-router'
+import { isUrl } from '@/utils/is'
+import { cloneDeep } from 'lodash-es'
+import { reactive } from 'vue'
+
+export type TabMapTypes = {
+ [key: string]: string[]
+}
+
+export const tabPathMap = reactive({})
+
+export const initTabMap = (routes: AppRouteRecordRaw[]) => {
+ for (const v of routes) {
+ const meta = (v.meta ?? {}) as RouteMeta
+ if (!meta?.hidden) {
+ tabPathMap[v.path] = []
+ }
+ }
+}
+
+export const filterMenusPath = (
+ routes: AppRouteRecordRaw[],
+ allRoutes: AppRouteRecordRaw[]
+): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+ for (const v of routes) {
+ let data: Nullable = null
+ const meta = (v.meta ?? {}) as RouteMeta
+ if (!meta.hidden || meta.canTo) {
+ const allParentPaht = getAllParentPath(allRoutes, v.path)
+
+ const fullPath = isUrl(v.path) ? v.path : allParentPaht.join('/')
+
+ data = cloneDeep(v)
+ data.path = fullPath
+ if (v.children && data) {
+ data.children = filterMenusPath(v.children, allRoutes)
+ }
+
+ if (data) {
+ res.push(data)
+ }
+
+ if (allParentPaht.length && Reflect.has(tabPathMap, allParentPaht[0])) {
+ tabPathMap[allParentPaht[0]].push(fullPath)
+ }
+ }
+ }
+
+ return res
+}
diff --git a/yudao-ui-admin-vue3/src/components/Table/index.ts b/yudao-ui-admin-vue3/src/components/Table/index.ts
new file mode 100644
index 0000000000..59847e9341
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Table/index.ts
@@ -0,0 +1,9 @@
+import Table from './src/Table.vue'
+
+export interface TableExpose {
+ setProps: (props: Recordable) => void
+ setColumn: (columnProps: TableSetPropsType[]) => void
+ selections: Recordable[]
+}
+
+export { Table }
diff --git a/yudao-ui-admin-vue3/src/components/Table/src/Table.vue b/yudao-ui-admin-vue3/src/components/Table/src/Table.vue
new file mode 100644
index 0000000000..c8cbddea63
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Table/src/Table.vue
@@ -0,0 +1,302 @@
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Table/src/helper.ts b/yudao-ui-admin-vue3/src/components/Table/src/helper.ts
new file mode 100644
index 0000000000..d8b34a8a7b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Table/src/helper.ts
@@ -0,0 +1,8 @@
+export const setIndex = (reserveIndex: boolean, index: number, size: number, current: number) => {
+ const newIndex = index + 1
+ if (reserveIndex) {
+ return size * (current - 1) + newIndex
+ } else {
+ return newIndex
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/components/Table/src/types.ts b/yudao-ui-admin-vue3/src/components/Table/src/types.ts
new file mode 100644
index 0000000000..58ecd83c80
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Table/src/types.ts
@@ -0,0 +1,24 @@
+export type TableProps = {
+ pageSize?: number
+ currentPage?: number
+ // 是否多选
+ selection?: boolean
+ // 是否所有的超出隐藏,优先级低于schema中的showOverflowTooltip,
+ showOverflowTooltip?: boolean
+ // 表头
+ columns?: TableColumn[]
+ // 是否展示分页
+ pagination?: Pagination | undefined
+ // 仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key)
+ reserveSelection?: boolean
+ // 加载状态
+ loading?: boolean
+ // 是否叠加索引
+ reserveIndex?: boolean
+ // 对齐方式
+ align?: 'left' | 'center' | 'right'
+ // 表头对齐方式
+ headerAlign?: 'left' | 'center' | 'right'
+ data?: Recordable
+ expand?: boolean
+} & Recordable
diff --git a/yudao-ui-admin-vue3/src/components/TagsView/index.ts b/yudao-ui-admin-vue3/src/components/TagsView/index.ts
new file mode 100644
index 0000000000..30e604a8f3
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/TagsView/index.ts
@@ -0,0 +1,3 @@
+import TagsView from './src/TagsView.vue'
+
+export { TagsView }
diff --git a/yudao-ui-admin-vue3/src/components/TagsView/src/TagsView.vue b/yudao-ui-admin-vue3/src/components/TagsView/src/TagsView.vue
new file mode 100644
index 0000000000..c366f5a101
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/TagsView/src/TagsView.vue
@@ -0,0 +1,573 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t(item?.meta?.title as string) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/TagsView/src/helper.ts b/yudao-ui-admin-vue3/src/components/TagsView/src/helper.ts
new file mode 100644
index 0000000000..22f6a50749
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/TagsView/src/helper.ts
@@ -0,0 +1,21 @@
+import type { RouteMeta, RouteLocationNormalizedLoaded } from 'vue-router'
+import { pathResolve } from '@/utils/routerHelper'
+
+export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => {
+ let tags: RouteLocationNormalizedLoaded[] = []
+ routes.forEach((route) => {
+ const meta = route.meta as RouteMeta
+ const tagPath = pathResolve(parentPath, route.path)
+ if (meta?.affix) {
+ tags.push({ ...route, path: tagPath, fullPath: tagPath } as RouteLocationNormalizedLoaded)
+ }
+ if (route.children) {
+ const tempTags: RouteLocationNormalizedLoaded[] = filterAffixTags(route.children, tagPath)
+ if (tempTags.length >= 1) {
+ tags = [...tags, ...tempTags]
+ }
+ }
+ })
+
+ return tags
+}
diff --git a/yudao-ui-admin-vue3/src/components/ThemeSwitch/index.ts b/yudao-ui-admin-vue3/src/components/ThemeSwitch/index.ts
new file mode 100644
index 0000000000..823a276510
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ThemeSwitch/index.ts
@@ -0,0 +1,3 @@
+import ThemeSwitch from './src/ThemeSwitch.vue'
+
+export { ThemeSwitch }
diff --git a/yudao-ui-admin-vue3/src/components/ThemeSwitch/src/ThemeSwitch.vue b/yudao-ui-admin-vue3/src/components/ThemeSwitch/src/ThemeSwitch.vue
new file mode 100644
index 0000000000..25221d16ae
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/ThemeSwitch/src/ThemeSwitch.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/Tooltip/index.ts b/yudao-ui-admin-vue3/src/components/Tooltip/index.ts
new file mode 100644
index 0000000000..ab66ddff1b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Tooltip/index.ts
@@ -0,0 +1,3 @@
+import Tooltip from './src/Tooltip.vue'
+
+export { Tooltip }
diff --git a/yudao-ui-admin-vue3/src/components/Tooltip/src/Tooltip.vue b/yudao-ui-admin-vue3/src/components/Tooltip/src/Tooltip.vue
new file mode 100644
index 0000000000..db934dd7ec
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/Tooltip/src/Tooltip.vue
@@ -0,0 +1,15 @@
+
+
+ {{ titel }}
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/UserInfo/index.ts b/yudao-ui-admin-vue3/src/components/UserInfo/index.ts
new file mode 100644
index 0000000000..c3a34aba46
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/UserInfo/index.ts
@@ -0,0 +1,3 @@
+import UserInfo from './src/UserInfo.vue'
+
+export { UserInfo }
diff --git a/yudao-ui-admin-vue3/src/components/UserInfo/src/UserInfo.vue b/yudao-ui-admin-vue3/src/components/UserInfo/src/UserInfo.vue
new file mode 100644
index 0000000000..5ee94b0060
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/UserInfo/src/UserInfo.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('common.profile') }}
+
+
+
+ {{ t('common.document') }}
+
+
+
+ {{ t('common.loginOut') }}
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/components/index.ts b/yudao-ui-admin-vue3/src/components/index.ts
new file mode 100644
index 0000000000..d0f4485217
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/components/index.ts
@@ -0,0 +1,20 @@
+import type { App } from 'vue'
+import { Icon } from './Icon'
+import { Form } from '@/components/Form'
+import { Table } from '@/components/Table'
+import { Search } from '@/components/Search'
+import { Dialog } from '@/components/Dialog'
+import { DictTag } from '@/components/DictTag'
+import { ContentWrap } from '@/components/ContentWrap'
+import { Descriptions } from '@/components/Descriptions'
+
+export const setupGlobCom = (app: App): void => {
+ app.component('Icon', Icon)
+ app.component('Form', Form)
+ app.component('Table', Table)
+ app.component('Search', Search)
+ app.component('Dialog', Dialog)
+ app.component('DictTag', DictTag)
+ app.component('ContentWrap', ContentWrap)
+ app.component('Descriptions', Descriptions)
+}
diff --git a/yudao-ui-admin-vue3/src/config/app.ts b/yudao-ui-admin-vue3/src/config/app.ts
new file mode 100644
index 0000000000..1b6baf6c88
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/app.ts
@@ -0,0 +1,104 @@
+import { useCache } from '@/hooks/web/useCache'
+
+const { wsCache } = useCache()
+
+export type LayoutType = 'classic' | 'topLeft' | 'top' | 'cutMenu'
+
+export type ThemeTypes = {
+ elColorPrimary?: string
+ leftMenuBorderColor?: string
+ leftMenuBgColor?: string
+ leftMenuBgLightColor?: string
+ leftMenuBgActiveColor?: string
+ leftMenuCollapseBgActiveColor?: string
+ leftMenuTextColor?: string
+ leftMenuTextActiveColor?: string
+ logoTitleTextColor?: string
+ logoBorderColor?: string
+ topHeaderBgColor?: string
+ topHeaderTextColor?: string
+ topHeaderHoverColor?: string
+ topToolBorderColor?: string
+}
+export interface AppState {
+ breadcrumb: boolean
+ breadcrumbIcon: boolean
+ collapse: boolean
+ uniqueOpened: boolean
+ hamburger: boolean
+ screenfull: boolean
+ size: boolean
+ locale: boolean
+ tagsView: boolean
+ tagsViewIcon: boolean
+ logo: boolean
+ fixedHeader: boolean
+ greyMode: boolean
+ pageLoading: boolean
+ layout: LayoutType
+ title: string
+ userInfo: string
+ isDark: boolean
+ currentSize: ElememtPlusSize
+ sizeMap: ElememtPlusSize[]
+ mobile: boolean
+ footer: boolean
+ theme: ThemeTypes
+}
+
+export const appModules: AppState = {
+ userInfo: 'userInfo', // 登录信息存储字段-建议每个项目换一个字段,避免与其他项目冲突
+ sizeMap: ['default', 'large', 'small'],
+ mobile: false, // 是否是移动端
+ title: import.meta.env.VITE_APP_TITLE, // 标题
+ pageLoading: false, // 路由跳转loading
+
+ breadcrumb: true, // 面包屑
+ breadcrumbIcon: false, // 面包屑图标
+ collapse: false, // 折叠菜单
+ uniqueOpened: true, // 是否只保持一个子菜单的展开
+ hamburger: true, // 折叠图标
+ screenfull: true, // 全屏图标
+ size: true, // 尺寸图标
+ locale: true, // 多语言图标
+ tagsView: true, // 标签页
+ tagsViewIcon: false, // 是否显示标签图标
+ logo: true, // logo
+ fixedHeader: true, // 固定toolheader
+ footer: true, // 显示页脚
+ greyMode: false, // 是否开始灰色模式,用于特殊悼念日
+
+ layout: wsCache.get('layout') || 'topLeft', // layout布局
+ isDark: wsCache.get('isDark') || false, // 是否是暗黑模式
+ currentSize: wsCache.get('default') || 'default', // 组件尺寸
+ theme: wsCache.get('theme') || {
+ // 主题色
+ elColorPrimary: '#409eff',
+ // 左侧菜单边框颜色
+ leftMenuBorderColor: 'inherit',
+ // 左侧菜单背景颜色
+ leftMenuBgColor: '#001529',
+ // 左侧菜单浅色背景颜色
+ leftMenuBgLightColor: '#0f2438',
+ // 左侧菜单选中背景颜色
+ leftMenuBgActiveColor: 'var(--el-color-primary)',
+ // 左侧菜单收起选中背景颜色
+ leftMenuCollapseBgActiveColor: 'var(--el-color-primary)',
+ // 左侧菜单字体颜色
+ leftMenuTextColor: '#bfcbd9',
+ // 左侧菜单选中字体颜色
+ leftMenuTextActiveColor: '#fff',
+ // logo字体颜色
+ logoTitleTextColor: '#fff',
+ // logo边框颜色
+ logoBorderColor: 'inherit',
+ // 头部背景颜色
+ topHeaderBgColor: '#fff',
+ // 头部字体颜色
+ topHeaderTextColor: 'inherit',
+ // 头部悬停颜色
+ topHeaderHoverColor: '#f6f6f6',
+ // 头部边框颜色
+ topToolBorderColor: '#eee'
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/config/axios/Axios.ts b/yudao-ui-admin-vue3/src/config/axios/Axios.ts
new file mode 100644
index 0000000000..6637e99667
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/axios/Axios.ts
@@ -0,0 +1,287 @@
+import type { AxiosRequestConfig, AxiosInstance, AxiosResponse, AxiosError } from 'axios'
+import type { RequestOptions, RequestResult, UploadFileParams } from 'types/axios'
+import type { CreateAxiosOptions } from './axiosTransform'
+import axios from 'axios'
+import qs from 'qs'
+import { AxiosCanceler } from './axiosCancel'
+import { isFunction } from '@/utils/is'
+import { cloneDeep } from 'lodash-es'
+import { ContentTypeEnum } from '@/enums/http.enum'
+import { RequestEnum } from '@/enums/http.enum'
+import { downloadByData } from '@/utils/filt'
+
+export * from './axiosTransform'
+
+/**
+ * @description: axios module
+ */
+export class VAxios {
+ private axiosInstance: AxiosInstance
+ private readonly options: CreateAxiosOptions
+
+ constructor(options: CreateAxiosOptions) {
+ this.options = options
+ this.axiosInstance = axios.create(options)
+ this.setupInterceptors()
+ }
+
+ /**
+ * @description: Create axios instance
+ */
+ private createAxios(config: CreateAxiosOptions): void {
+ this.axiosInstance = axios.create(config)
+ }
+
+ private getTransform() {
+ const { transform } = this.options
+ return transform
+ }
+
+ getAxios(): AxiosInstance {
+ return this.axiosInstance
+ }
+
+ /**
+ * @description: Reconfigure axios
+ */
+ configAxios(config: CreateAxiosOptions) {
+ if (!this.axiosInstance) {
+ return
+ }
+ this.createAxios(config)
+ }
+
+ /**
+ * @description: Set general header
+ */
+ setHeader(headers: any): void {
+ if (!this.axiosInstance) {
+ return
+ }
+ Object.assign(this.axiosInstance.defaults.headers, headers)
+ }
+
+ /**
+ * @description: Interceptor configuration
+ */
+ private setupInterceptors() {
+ const transform = this.getTransform()
+ if (!transform) {
+ return
+ }
+ const {
+ requestInterceptors,
+ requestInterceptorsCatch,
+ responseInterceptors,
+ responseInterceptorsCatch
+ } = transform
+
+ const axiosCanceler = new AxiosCanceler()
+
+ // Request interceptor configuration processing
+ this.axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {
+ // If cancel repeat request is turned on, then cancel repeat request is prohibited
+ const {
+ // @ts-ignore
+ headers: { ignoreCancelToken }
+ } = config
+
+ const ignoreCancel =
+ ignoreCancelToken !== undefined
+ ? ignoreCancelToken
+ : this.options.requestOptions?.ignoreCancelToken
+
+ !ignoreCancel && axiosCanceler.addPending(config)
+ if (requestInterceptors && isFunction(requestInterceptors)) {
+ config = requestInterceptors(config, this.options)
+ }
+ return config
+ }, undefined)
+
+ // Request interceptor error capture
+ requestInterceptorsCatch &&
+ isFunction(requestInterceptorsCatch) &&
+ this.axiosInstance.interceptors.request.use(undefined, requestInterceptorsCatch)
+
+ // Response result interceptor processing
+ this.axiosInstance.interceptors.response.use((res: AxiosResponse) => {
+ res && axiosCanceler.removePending(res.config)
+ if (responseInterceptors && isFunction(responseInterceptors)) {
+ res = responseInterceptors(res)
+ }
+ return res
+ }, undefined)
+
+ // Response result interceptor error capture
+ responseInterceptorsCatch &&
+ isFunction(responseInterceptorsCatch) &&
+ this.axiosInstance.interceptors.response.use(undefined, responseInterceptorsCatch)
+ }
+
+ /**
+ * @description: File Upload
+ */
+ uploadFile(config: AxiosRequestConfig, params: UploadFileParams) {
+ const formData = new window.FormData()
+ const customFilename = params.name || 'file'
+
+ if (params.filename) {
+ formData.append(customFilename, params.file, params.filename)
+ } else {
+ formData.append(customFilename, params.file)
+ }
+
+ if (params.data) {
+ Object.keys(params.data).forEach((key) => {
+ const value = params.data![key]
+ if (Array.isArray(value)) {
+ value.forEach((item) => {
+ formData.append(`${key}[]`, item)
+ })
+ return
+ }
+
+ formData.append(key, params.data![key])
+ })
+ }
+ return this.axiosInstance.request({
+ ...config,
+ method: 'POST',
+ data: {
+ file: formData
+ },
+ headers: {
+ 'Content-type': ContentTypeEnum.FORM_DATA,
+ // @ts-ignore
+ ignoreCancelToken: true
+ }
+ })
+ }
+
+ // support form-data
+ supportFormData(config: AxiosRequestConfig) {
+ const headers = config.headers || this.options.headers
+ const contentType = headers?.['Content-Type'] || headers?.['content-type']
+
+ if (
+ contentType !== ContentTypeEnum.FORM_URLENCODED ||
+ !Reflect.has(config, 'data') ||
+ config.method?.toUpperCase() === RequestEnum.GET
+ ) {
+ return config
+ }
+
+ return {
+ ...config,
+ data: qs.stringify(config.data, { arrayFormat: 'brackets' })
+ }
+ }
+
+ get(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'GET' }, options)
+ }
+
+ post(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'POST' }, options)
+ }
+
+ put(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'PUT' }, options)
+ }
+
+ delete(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'DELETE' }, options)
+ }
+
+ download(
+ config: AxiosRequestConfig,
+ title: string,
+ options?: RequestOptions
+ ): Promise {
+ let conf: CreateAxiosOptions = cloneDeep({
+ ...config,
+ method: 'GET',
+ responseType: 'blob'
+ })
+ const transform = this.getTransform()
+
+ const { requestOptions } = this.options
+
+ const opt: RequestOptions = Object.assign({}, requestOptions, options)
+
+ const { beforeRequestHook, requestCatchHook } = transform || {}
+
+ if (beforeRequestHook && isFunction(beforeRequestHook)) {
+ conf = beforeRequestHook(conf, opt)
+ }
+ conf.requestOptions = opt
+
+ conf = this.supportFormData(conf)
+
+ return new Promise((resolve, reject) => {
+ this.axiosInstance
+ .request>(conf)
+ .then((res: AxiosResponse) => {
+ resolve(res as unknown as Promise)
+ // download file
+ if (typeof res != undefined) {
+ downloadByData(res?.data as unknown as BlobPart, title)
+ }
+ })
+ .catch((e: Error | AxiosError) => {
+ if (requestCatchHook && isFunction(requestCatchHook)) {
+ reject(requestCatchHook(e, opt))
+ return
+ }
+ if (axios.isAxiosError(e)) {
+ // rewrite error message from axios in here
+ }
+ reject(e)
+ })
+ })
+ }
+
+ request(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ let conf: CreateAxiosOptions = cloneDeep(config)
+ const transform = this.getTransform()
+
+ const { requestOptions } = this.options
+
+ const opt: RequestOptions = Object.assign({}, requestOptions, options)
+
+ const { beforeRequestHook, requestCatchHook, transformRequestHook } = transform || {}
+ if (beforeRequestHook && isFunction(beforeRequestHook)) {
+ conf = beforeRequestHook(conf, opt)
+ }
+ conf.requestOptions = opt
+
+ conf = this.supportFormData(conf)
+
+ return new Promise((resolve, reject) => {
+ this.axiosInstance
+ .request>(conf)
+ .then((res: AxiosResponse) => {
+ if (transformRequestHook && isFunction(transformRequestHook)) {
+ try {
+ const ret = transformRequestHook(res, opt)
+ resolve(ret)
+ } catch (err) {
+ reject(err || new Error('request error!'))
+ }
+ return
+ }
+ resolve(res as unknown as Promise)
+ })
+ .catch((e: Error | AxiosError) => {
+ if (requestCatchHook && isFunction(requestCatchHook)) {
+ reject(requestCatchHook(e, opt))
+ return
+ }
+ if (axios.isAxiosError(e)) {
+ // rewrite error message from axios in here
+ }
+ reject(e)
+ })
+ })
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/config/axios/axiosCancel.ts b/yudao-ui-admin-vue3/src/config/axios/axiosCancel.ts
new file mode 100644
index 0000000000..9f5d623a2b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/axios/axiosCancel.ts
@@ -0,0 +1,57 @@
+import type { AxiosRequestConfig, Canceler } from 'axios'
+import axios from 'axios'
+import { isFunction } from '@/utils/is'
+
+// 用于存储每个请求的标识和取消功能
+let pendingMap = new Map()
+
+export const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&')
+
+export class AxiosCanceler {
+ /**
+ * 添加请求
+ * @param {Object} config
+ */
+ addPending(config: AxiosRequestConfig) {
+ this.removePending(config)
+ const url = getPendingUrl(config)
+ config.cancelToken =
+ config.cancelToken ||
+ new axios.CancelToken((cancel) => {
+ if (!pendingMap.has(url)) {
+ // If there is no current request in pending, add it
+ pendingMap.set(url, cancel)
+ }
+ })
+ }
+
+ /**
+ * @description: 清除所有待处理的
+ */
+ removeAllPending() {
+ pendingMap.forEach((cancel) => {
+ cancel && isFunction(cancel) && cancel()
+ })
+ pendingMap.clear()
+ }
+
+ /**
+ * 删除请求
+ * @param {Object} config
+ */
+ removePending(config: AxiosRequestConfig) {
+ const url = getPendingUrl(config)
+
+ if (pendingMap.has(url)) {
+ // 如果挂起中有当前请求标识符,则需要取消并删除当前请求
+ const cancel = pendingMap.get(url)
+ cancel && cancel(url)
+ pendingMap.delete(url)
+ }
+ }
+
+ /** 重置 */
+ reset(): void {
+ pendingMap = new Map()
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/config/axios/axiosTransform.ts b/yudao-ui-admin-vue3/src/config/axios/axiosTransform.ts
new file mode 100644
index 0000000000..fa683e0650
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/axios/axiosTransform.ts
@@ -0,0 +1,35 @@
+/** 数据处理类,可根据项目配置 */
+import type { AxiosRequestConfig, AxiosResponse } from 'axios'
+import type { RequestOptions, RequestResult } from 'types/axios'
+
+export interface CreateAxiosOptions extends AxiosRequestConfig {
+ authenticationScheme?: string
+ transform?: AxiosTransform
+ requestOptions?: RequestOptions
+}
+
+export abstract class AxiosTransform {
+ /** 请求前的流程配置 */
+ beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig
+
+ /** 请求成功处理 */
+ transformRequestHook?: (res: AxiosResponse, options: RequestOptions) => any
+
+ /** 请求失败处理 */
+ requestCatchHook?: (e: Error, options: RequestOptions) => Promise
+
+ /** 请求之前的拦截器 */
+ requestInterceptors?: (
+ config: AxiosRequestConfig,
+ options: CreateAxiosOptions
+ ) => AxiosRequestConfig
+
+ /** 请求之后的拦截器 */
+ responseInterceptors?: (res: AxiosResponse) => AxiosResponse
+
+ /** 请求之前的拦截器错误处理 */
+ requestInterceptorsCatch?: (error: Error) => void
+
+ /** 请求之后的拦截器错误处理 */
+ responseInterceptorsCatch?: (error: Error) => void
+}
diff --git a/yudao-ui-admin-vue3/src/config/axios/checkStatus.ts b/yudao-ui-admin-vue3/src/config/axios/checkStatus.ts
new file mode 100644
index 0000000000..0876c8d246
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/axios/checkStatus.ts
@@ -0,0 +1,74 @@
+import type { ErrorMessageMode } from 'types/axios'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { useI18n } from '@/hooks/web/useI18n'
+import { useCache } from '@/hooks/web/useCache'
+
+const { wsCache } = useCache()
+
+export function checkStatus(
+ status: number,
+ msg: string,
+ errorMessageMode: ErrorMessageMode = 'message'
+): void {
+ const { t } = useI18n()
+ let errMessage = ''
+
+ switch (status) {
+ case 400:
+ errMessage = `${msg}`
+ break
+ // 401: Not logged in
+ // 如果未登录,跳转到登录页面,并携带当前页面的路径
+ // 成功登录后返回当前页面。此步骤需要在登录页面上操作。
+ case 401:
+ wsCache.clear()
+ errMessage = msg || t('sys.api.errMsg401')
+ break
+ case 403:
+ errMessage = t('sys.api.errMsg403')
+ break
+ // 404请求不存在
+ case 404:
+ errMessage = t('sys.api.errMsg404')
+ break
+ case 405:
+ errMessage = t('sys.api.errMsg405')
+ break
+ case 408:
+ errMessage = t('sys.api.errMsg408')
+ break
+ case 500:
+ errMessage = t('sys.api.errMsg500')
+ break
+ case 501:
+ errMessage = t('sys.api.errMsg501')
+ break
+ case 502:
+ errMessage = t('sys.api.errMsg502')
+ break
+ case 503:
+ errMessage = t('sys.api.errMsg503')
+ break
+ case 504:
+ errMessage = t('sys.api.errMsg504')
+ break
+ case 505:
+ errMessage = t('sys.api.errMsg505')
+ break
+ case 901:
+ errMessage = t('sys.api.errMsg505')
+ break
+ default:
+ }
+
+ if (errMessage) {
+ if (errorMessageMode === 'modal') {
+ ElMessageBox.confirm(errMessage, {
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ })
+ } else if (errorMessageMode === 'message') {
+ ElMessage.error(errMessage)
+ }
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/config/axios/helper.ts b/yudao-ui-admin-vue3/src/config/axios/helper.ts
new file mode 100644
index 0000000000..94cc8bc758
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/axios/helper.ts
@@ -0,0 +1,45 @@
+import { isObject, isString } from '@/utils/is'
+
+const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'
+
+export function joinTimestamp(
+ join: boolean,
+ restful: T
+): T extends true ? string : object
+
+export function joinTimestamp(join: boolean, restful = false): string | object {
+ if (!join) {
+ return restful ? '' : {}
+ }
+ const now = new Date().getTime()
+ if (restful) {
+ return `?_t=${now}`
+ }
+ return { _t: now }
+}
+
+/** 格式化请求参数中的时间 */
+export function formatRequestDate(params: Recordable) {
+ if (Object.prototype.toString.call(params) !== '[object Object]') {
+ return
+ }
+
+ for (const key in params) {
+ if (params[key] && params[key]._isAMomentObject) {
+ params[key] = params[key].format(DATE_TIME_FORMAT)
+ }
+ if (isString(key)) {
+ const value = params[key]
+ if (value) {
+ try {
+ params[key] = isString(value) ? value.trim() : value
+ } catch (error: any) {
+ throw new Error(error)
+ }
+ }
+ }
+ if (isObject(params[key])) {
+ formatRequestDate(params[key])
+ }
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/config/axios/index.ts b/yudao-ui-admin-vue3/src/config/axios/index.ts
new file mode 100644
index 0000000000..a8e710b38c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/axios/index.ts
@@ -0,0 +1,285 @@
+// axios配置 可自行根据项目进行更改,只需更改该文件即可,其他文件可以不动
+// The axios configuration can be changed according to the project, just change the file, other files can be left unchanged
+
+import type { AxiosResponse } from 'axios'
+import type { RequestOptions, RequestResult } from 'types/axios'
+import type { AxiosTransform, CreateAxiosOptions } from './axiosTransform'
+import { VAxios } from './Axios'
+import { checkStatus } from './checkStatus'
+import { RequestEnum, ResultEnum, ContentTypeEnum } from '@/enums/http.enum'
+import { useCache } from '@/hooks/web/useCache'
+import { isString } from '@/utils/is'
+import { getAccessToken, setToken } from '@/utils/auth'
+import { setObjToUrlParams, deepMerge } from './utils'
+import { useI18n } from '@/hooks/web/useI18n'
+import { joinTimestamp, formatRequestDate } from './helper'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { refreshToken } from '@/api/login'
+
+const { t } = useI18n()
+const { wsCache } = useCache()
+const tenantEnable = import.meta.env.VITE_APP_TENANT_ENABLE
+const BASE_URL = import.meta.env.VITE_BASE_URL
+const BASE_API = import.meta.env.VITE_API_URL
+const apiUrl = BASE_URL + BASE_API
+// 是否显示重新登录
+// export let isRelogin = { show: false }
+// TODO 请求队列
+// let requestList = []
+// 是否正在刷新中
+let isRefreshToken = false
+/**
+ * @description: 数据处理,方便区分多种处理方式
+ */
+const transform: AxiosTransform = {
+ /**
+ * @description: 处理请求数据。如果数据不是预期格式,可直接抛出错误
+ */
+ transformRequestHook: async (res: AxiosResponse, options: RequestOptions) => {
+ const { isTransformResponse, isReturnNativeResponse } = options
+ // 是否返回原生响应头 比如:需要获取响应头时使用该属性
+ if (isReturnNativeResponse) {
+ return res
+ }
+ // 不进行任何处理,直接返回
+ // 用于页面代码可能需要直接获取code,data,message这些信息时开启
+ if (!isTransformResponse) {
+ return res.data
+ }
+ // 错误的时候返回
+
+ const { data } = res
+ if (!data) {
+ // 返回“[HTTP]请求没有返回值”;
+ throw new Error(t('sys.api.apiRequestFailed'))
+ }
+ // 这里 code,result,message为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式
+ const { code, msg } = data
+ const result = data.data
+ // TODO 输出res 方便调试,完成后删除
+ // console.info('data')
+ // console.info(data)
+ // console.info('result')
+ // console.info(result)
+ // TODO 芋艿:文件下载,需要特殊处理
+ if (code === undefined) {
+ console.log(res)
+ return res.data
+ }
+
+ // 这里逻辑可以根据项目进行修改
+ const hasSuccess = data && Reflect.has(data, 'code') && code === ResultEnum.SUCCESS
+ if (hasSuccess) {
+ return result
+ }
+
+ // 在此处根据自己项目的实际情况对不同的code执行不同的操作
+ // 如果不希望中断当前请求,请return数据,否则直接抛出异常即可
+ let timeoutMsg = ''
+ switch (code) {
+ case ResultEnum.TIMEOUT:
+ // TODO 未完成
+ // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了
+ if (!isRefreshToken) {
+ isRefreshToken = true
+ const refreshTokenRes = await refreshToken()
+ // 1. 如果获取不到刷新令牌,则只能执行登出操作
+ if (!refreshTokenRes) {
+ timeoutMsg = t('sys.api.timeoutMessage')
+ wsCache.clear() // 清除浏览器全部临时缓存
+ ElMessageBox.confirm(timeoutMsg, {
+ confirmButtonText: t('login.relogin'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ })
+ .then(() => {})
+ .catch(() => {})
+ break
+ } else {
+ // 2. 进行刷新访问令牌
+ // 2.1 刷新成功,则回放队列的请求 + 当前请求
+ setToken(refreshTokenRes.data)
+ }
+ }
+ default:
+ if (msg) {
+ timeoutMsg = msg
+ }
+ }
+
+ // errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误
+ // errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示
+ if (options.errorMessageMode === 'modal') {
+ await ElMessageBox.confirm(timeoutMsg, {
+ type: 'error'
+ })
+ } else if (options.errorMessageMode === 'message') {
+ ElMessage.error(timeoutMsg)
+ }
+
+ throw new Error(timeoutMsg || t('sys.api.apiRequestFailed'))
+ },
+
+ // 请求之前处理config
+ beforeRequestHook: (config, options) => {
+ const { apiUrl, joinParamsToUrl, formatDate, joinTime = true } = options
+
+ if (apiUrl && isString(apiUrl)) {
+ config.url = `${apiUrl}${config.url}`
+ }
+ const params = config.params || {}
+ const data = config.data || false
+ formatDate && data && !isString(data) && formatRequestDate(data)
+ if (config.method?.toUpperCase() === RequestEnum.GET) {
+ if (!isString(params)) {
+ // 给 get 请求加上时间戳参数,避免从缓存中拿数据。
+ config.params = Object.assign(params || {}, joinTimestamp(joinTime, false))
+ } else {
+ // 兼容restful风格
+ config.url = config.url + params + `${joinTimestamp(joinTime, true)}`
+ config.params = undefined
+ }
+ } else {
+ if (!isString(params)) {
+ formatDate && formatRequestDate(params)
+ if (Reflect.has(config, 'data') && config.data && Object.keys(config.data).length > 0) {
+ config.data = data
+ config.params = params
+ } else {
+ // 非GET请求如果没有提供data,则将params视为data
+ config.data = params
+ config.params = undefined
+ }
+ if (joinParamsToUrl) {
+ config.url = setObjToUrlParams(
+ config.url as string,
+ Object.assign({}, config.params, config.data)
+ )
+ }
+ } else {
+ // 兼容restful风格
+ config.url = config.url + params
+ config.params = undefined
+ }
+ }
+ return config
+ },
+
+ /**
+ * @description: 请求拦截器处理
+ */
+ requestInterceptors: (config, options) => {
+ // 请求之前处理config
+ const token = getAccessToken()
+ if (token && (config as Recordable)?.requestOptions?.withToken !== false) {
+ // jwt token
+ ;(config as Recordable).headers.Authorization = options.authenticationScheme
+ ? `${options.authenticationScheme} ${token}`
+ : token
+ }
+ // 设置租户
+ if (tenantEnable) {
+ const tenantId = wsCache.get('tenantId')
+ if (tenantId) (config as Recordable).headers.common['tenant-id'] = tenantId
+ }
+ return config
+ },
+
+ /**
+ * @description: 响应拦截器处理
+ */
+ responseInterceptors: (res: AxiosResponse) => {
+ return res
+ },
+
+ /**
+ * @description: 响应错误处理
+ */
+ responseInterceptorsCatch: (error: any) => {
+ const { response, code, message, config } = error || {}
+ const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none'
+ const msg: string = response?.data?.msg ?? ''
+ const err: string = error?.toString?.() ?? ''
+ let errMessage = ''
+
+ try {
+ if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {
+ errMessage = t('sys.api.apiTimeoutMessage')
+ }
+ if (err?.includes('Network Error')) {
+ errMessage = t('sys.api.networkExceptionMsg')
+ }
+
+ if (errMessage) {
+ if (errorMessageMode === 'modal') {
+ ElMessageBox.confirm(errMessage, {
+ type: 'error'
+ })
+ } else if (errorMessageMode === 'message') {
+ ElMessage.error(errMessage)
+ }
+ return Promise.reject(error)
+ }
+ } catch (error) {
+ throw new Error(error as unknown as string)
+ }
+
+ checkStatus(error?.response?.status, msg, errorMessageMode)
+ return Promise.reject(error)
+ }
+}
+
+function createAxios(opt?: Partial) {
+ return new VAxios(
+ deepMerge(
+ {
+ // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes
+ // authentication schemes,e.g: Bearer
+ // authenticationScheme: 'Bearer',
+ authenticationScheme: 'Bearer',
+ timeout: 10 * 1000,
+ // 基础接口地址
+ // baseURL: globSetting.apiUrl,
+
+ headers: { 'Content-Type': ContentTypeEnum.JSON },
+ // 如果是form-data格式
+ // headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED },
+ // 数据处理方式
+ transform,
+ // 配置项,下面的选项都可以在独立的接口请求中覆盖
+ requestOptions: {
+ // 默认将prefix 添加到url
+ joinPrefix: true,
+ // 是否返回原生响应头 比如:需要获取响应头时使用该属性
+ isReturnNativeResponse: false,
+ // 需要对返回数据进行处理
+ isTransformResponse: true,
+ // post请求的时候添加参数到url
+ joinParamsToUrl: false,
+ // 格式化提交参数时间
+ formatDate: true,
+ // 消息提示类型
+ errorMessageMode: 'message',
+ // 接口地址
+ apiUrl: apiUrl,
+ // 是否加入时间戳
+ joinTime: true,
+ // 忽略重复请求
+ ignoreCancelToken: true,
+ // 是否携带token
+ withToken: true
+ }
+ },
+ opt || {}
+ )
+ )
+}
+export const defHttp = createAxios()
+
+// other api url
+// export const otherHttp = createAxios({
+// requestOptions: {
+// apiUrl: 'xxx',
+// urlPrefix: 'xxx',
+// },
+// });
diff --git a/yudao-ui-admin-vue3/src/config/axios/utils.ts b/yudao-ui-admin-vue3/src/config/axios/utils.ts
new file mode 100644
index 0000000000..4568643bee
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/axios/utils.ts
@@ -0,0 +1,63 @@
+import { unref } from 'vue'
+import { isObject } from '@/utils/is'
+// dynamic use hook props
+export const getDynamicProps = (props: T): Partial => {
+ const ret: Recordable = {}
+
+ Object.keys(props).map((key) => {
+ ret[key] = unref((props as Recordable)[key])
+ })
+
+ return ret as Partial
+}
+
+export const openWindow = (
+ url: string,
+ opt?: {
+ target?: '_self' | '_blank' | string
+ noopener?: boolean
+ noreferrer?: boolean
+ }
+) => {
+ const { target = '__blank', noopener = true, noreferrer = true } = opt || {}
+ const feature: string[] = []
+
+ noopener && feature.push('noopener=yes')
+ noreferrer && feature.push('noreferrer=yes')
+
+ window.open(url, target, feature.join(','))
+}
+
+/**
+ * Add the object as a parameter to the URL
+ * @param baseUrl url
+ * @param obj
+ * @returns {string}
+ * eg:
+ * let obj = {a: '3', b: '4'}
+ * setObjToUrlParams('www.baidu.com', obj)
+ * ==>www.baidu.com?a=3&b=4
+ */
+export const setObjToUrlParams = (baseUrl: string, obj: any): string => {
+ let parameters = ''
+ for (const key in obj) {
+ parameters += key + '=' + encodeURIComponent(obj[key]) + '&'
+ }
+ parameters = parameters.replace(/&$/, '')
+ return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters
+}
+
+/**
+ * @description: Set ui mount node
+ */
+export const getPopupContainer = (node?: HTMLElement): HTMLElement => {
+ return (node?.parentNode as HTMLElement) ?? document.body
+}
+
+export function deepMerge(src: any = {}, target: any = {}): T {
+ let key: string
+ for (key in target) {
+ src[key] = isObject(src[key]) ? deepMerge(src[key], target[key]) : (src[key] = target[key])
+ }
+ return src
+}
diff --git a/yudao-ui-admin-vue3/src/config/locale.ts b/yudao-ui-admin-vue3/src/config/locale.ts
new file mode 100644
index 0000000000..c20a3d9175
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/config/locale.ts
@@ -0,0 +1,32 @@
+import { useCache } from '@/hooks/web/useCache'
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
+import en from 'element-plus/es/locale/lang/en'
+
+const { wsCache } = useCache()
+
+export const elLocaleMap = {
+ 'zh-CN': zhCn,
+ en: en
+}
+export interface LocaleState {
+ currentLocale: LocaleDropdownType
+ localeMap: LocaleDropdownType[]
+}
+
+export const localeModules: LocaleState = {
+ currentLocale: {
+ lang: wsCache.get('lang') || 'zh-CN',
+ elLocale: elLocaleMap[wsCache.get('lang') || 'zh-CN']
+ },
+ // 多语言
+ localeMap: [
+ {
+ lang: 'zh-CN',
+ name: '简体中文'
+ },
+ {
+ lang: 'en',
+ name: 'English'
+ }
+ ]
+}
diff --git a/yudao-ui-admin-vue3/src/directive/index.ts b/yudao-ui-admin-vue3/src/directive/index.ts
new file mode 100644
index 0000000000..89cc8ba142
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/directive/index.ts
@@ -0,0 +1,13 @@
+import type { App } from 'vue'
+import { hasRole } from './permission/hasRole'
+import { hasPermi } from './permission/hasPermi'
+
+/**
+ * 导出指令:v-xxx
+ * @methods hasRole 用户权限,用法: v-hasRole
+ * @methods hasPermi 按钮权限,用法: v-hasPermi
+ */
+export const setupAuth = (app: App) => {
+ hasRole(app)
+ hasPermi(app)
+}
diff --git a/yudao-ui-admin-vue3/src/directive/permission/hasPermi.ts b/yudao-ui-admin-vue3/src/directive/permission/hasPermi.ts
new file mode 100644
index 0000000000..6a28c390d8
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/directive/permission/hasPermi.ts
@@ -0,0 +1,27 @@
+import type { App } from 'vue'
+import { useCache } from '@/hooks/web/useCache'
+import { useI18n } from '@/hooks/web/useI18n'
+const { t } = useI18n() // 国际化
+
+export function hasPermi(app: App) {
+ app.directive('hasPermi', (el, binding) => {
+ const { wsCache } = useCache()
+ const { value } = binding
+ const all_permission = '*:*:*'
+ const permissions = wsCache.get('user').permissions
+
+ if (value && value instanceof Array && value.length > 0) {
+ const permissionFlag = value
+
+ const hasPermissions = permissions.some((permission: string) => {
+ return all_permission === permission || permissionFlag.includes(permission)
+ })
+
+ if (!hasPermissions) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(t('permission.hasPermission'))
+ }
+ })
+}
diff --git a/yudao-ui-admin-vue3/src/directive/permission/hasRole.ts b/yudao-ui-admin-vue3/src/directive/permission/hasRole.ts
new file mode 100644
index 0000000000..f584ea6901
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/directive/permission/hasRole.ts
@@ -0,0 +1,27 @@
+import type { App } from 'vue'
+import { useCache } from '@/hooks/web/useCache'
+import { useI18n } from '@/hooks/web/useI18n'
+const { t } = useI18n() // 国际化
+
+export function hasRole(app: App) {
+ app.directive('hasRole', (el, binding) => {
+ const { wsCache } = useCache()
+ const { value } = binding
+ const super_admin = 'admin'
+ const roles = wsCache.get('user').roles
+
+ if (value && value instanceof Array && value.length > 0) {
+ const roleFlag = value
+
+ const hasRole = roles.some((role: string) => {
+ return super_admin === role || roleFlag.includes(role)
+ })
+
+ if (!hasRole) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(t('permission.hasRole'))
+ }
+ })
+}
diff --git a/yudao-ui-admin-vue3/src/enums/http.enum.ts b/yudao-ui-admin-vue3/src/enums/http.enum.ts
new file mode 100644
index 0000000000..7efdb12c48
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/enums/http.enum.ts
@@ -0,0 +1,51 @@
+/**
+ * @description: Request result set
+ */
+export enum ResultEnum {
+ SUCCESS = 0,
+ ERROR = 500,
+ TIMEOUT = 401,
+ TYPE = 'success'
+}
+
+/**
+ * @description: request method
+ */
+export enum RequestEnum {
+ GET = 'GET',
+ POST = 'POST',
+ PUT = 'PUT',
+ DELETE = 'DELETE'
+}
+
+/**
+ * @description: contentType
+ */
+export enum ContentTypeEnum {
+ // json
+ JSON = 'application/json;charset=UTF-8',
+ // form-data qs
+ FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
+ // form-data upload
+ FORM_DATA = 'multipart/form-data;charset=UTF-8'
+}
+
+/**
+ * Exception related enumeration
+ */
+export enum ExceptionEnum {
+ // page not access
+ PAGE_NOT_ACCESS = 403,
+
+ // page not found
+ PAGE_NOT_FOUND = 404,
+
+ // error
+ ERROR = 500,
+
+ // net work error
+ NET_WORK_ERROR = 10000,
+
+ // No data on the page. In fact, it is not an exception page
+ PAGE_NOT_DATA = 10100
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/event/useScrollTo.ts b/yudao-ui-admin-vue3/src/hooks/event/useScrollTo.ts
new file mode 100644
index 0000000000..74fd673c8b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/event/useScrollTo.ts
@@ -0,0 +1,62 @@
+import { ref, unref } from 'vue'
+
+export interface ScrollToParams {
+ el: HTMLElement
+ to: number
+ position: string
+ duration?: number
+ callback?: () => void
+}
+
+const easeInOutQuad = (t: number, b: number, c: number, d: number) => {
+ t /= d / 2
+ if (t < 1) {
+ return (c / 2) * t * t + b
+ }
+ t--
+ return (-c / 2) * (t * (t - 2) - 1) + b
+}
+const move = (el: HTMLElement, position: string, amount: number) => {
+ el[position] = amount
+}
+
+export function useScrollTo({
+ el,
+ position = 'scrollLeft',
+ to,
+ duration = 500,
+ callback
+}: ScrollToParams) {
+ const isActiveRef = ref(false)
+ const start = el[position]
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+
+ function animateScroll() {
+ if (!unref(isActiveRef)) {
+ return
+ }
+ currentTime += increment
+ const val = easeInOutQuad(currentTime, start, change, duration)
+ move(el, position, val)
+ if (currentTime < duration && unref(isActiveRef)) {
+ requestAnimationFrame(animateScroll)
+ } else {
+ if (callback) {
+ callback()
+ }
+ }
+ }
+
+ function run() {
+ isActiveRef.value = true
+ animateScroll()
+ }
+
+ function stop() {
+ isActiveRef.value = false
+ }
+
+ return { start: run, stop }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useAxios.ts b/yudao-ui-admin-vue3/src/hooks/web/useAxios.ts
new file mode 100644
index 0000000000..96aecbd980
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useAxios.ts
@@ -0,0 +1,46 @@
+// import { service } from '@/config/axios'
+
+// import { AxiosPromise } from 'axios'
+
+// import { config } from '@/config/axios/config'
+
+// const { default_headers } = config
+
+// const request = (option: AxiosConfig): AxiosPromise => {
+// const { url, method, params, data, headersType, responseType } = option
+// return service({
+// url: url,
+// method,
+// params,
+// data,
+// responseType: responseType,
+// headers: {
+// 'Content-Type': headersType || default_headers
+// }
+// })
+// }
+
+// function getFn(option: AxiosConfig): AxiosPromise {
+// return request({ method: 'get', ...option })
+// }
+
+// function postFn(option: AxiosConfig): AxiosPromise {
+// return request({ method: 'post', ...option })
+// }
+
+// function deleteFn(option: AxiosConfig): AxiosPromise {
+// return request({ method: 'delete', ...option })
+// }
+
+// function putFn(option: AxiosConfig): AxiosPromise {
+// return request({ method: 'put', ...option })
+// }
+
+// export const useAxios = () => {
+// return {
+// get: getFn,
+// post: postFn,
+// delete: deleteFn,
+// put: putFn
+// }
+// }
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useCache.ts b/yudao-ui-admin-vue3/src/hooks/web/useCache.ts
new file mode 100644
index 0000000000..b405ef3cdf
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useCache.ts
@@ -0,0 +1,17 @@
+/**
+ * 配置浏览器本地存储的方式,可直接存储对象数组。
+ */
+
+import WebStorageCache from 'web-storage-cache'
+
+type CacheType = 'sessionStorage' | 'localStorage'
+
+export const useCache = (type: CacheType = 'sessionStorage') => {
+ const wsCache: WebStorageCache = new WebStorageCache({
+ storage: type
+ })
+
+ return {
+ wsCache
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useConfigGlobal.ts b/yudao-ui-admin-vue3/src/hooks/web/useConfigGlobal.ts
new file mode 100644
index 0000000000..59007d3271
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useConfigGlobal.ts
@@ -0,0 +1,9 @@
+import { inject } from 'vue'
+
+export const useConfigGlobal = () => {
+ const configGlobal = inject('configGlobal', {}) as ConfigGlobalTypes
+
+ return {
+ configGlobal
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useCrudSchemas.ts b/yudao-ui-admin-vue3/src/hooks/web/useCrudSchemas.ts
new file mode 100644
index 0000000000..e26d2dbac7
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useCrudSchemas.ts
@@ -0,0 +1,189 @@
+import { reactive } from 'vue'
+import { eachTree, treeMap, filter } from '@/utils/tree'
+import { getIntDictOptions } from '@/utils/dict'
+
+export type CrudSchema = Omit & {
+ search?: CrudSearchParams
+ table?: CrudTableParams
+ form?: CrudFormParams
+ detail?: CrudDescriptionsParams
+ children?: CrudSchema[]
+ dictType?: string
+}
+
+type CrudSearchParams = {
+ // 是否显示在查询项
+ show?: boolean
+} & Omit
+
+type CrudTableParams = {
+ // 是否显示表头
+ show?: boolean
+} & Omit
+
+type CrudFormParams = {
+ // 是否显示表单项
+ show?: boolean
+} & Omit
+
+type CrudDescriptionsParams = {
+ // 是否显示表单项
+ show?: boolean
+} & Omit
+
+interface AllSchemas {
+ searchSchema: FormSchema[]
+ tableColumns: TableColumn[]
+ formSchema: FormSchema[]
+ detailSchema: DescriptionsSchema[]
+}
+
+// 过滤所有结构
+export const useCrudSchemas = (
+ crudSchema: CrudSchema[]
+): {
+ allSchemas: AllSchemas
+} => {
+ // 所有结构数据
+ const allSchemas = reactive({
+ searchSchema: [],
+ tableColumns: [],
+ formSchema: [],
+ detailSchema: []
+ })
+
+ const searchSchema = filterSearchSchema(crudSchema)
+ allSchemas.searchSchema = searchSchema || []
+
+ const tableColumns = filterTableSchema(crudSchema)
+ allSchemas.tableColumns = tableColumns || []
+
+ const formSchema = filterFormSchema(crudSchema)
+ allSchemas.formSchema = formSchema
+
+ const detailSchema = filterDescriptionsSchema(crudSchema)
+ allSchemas.detailSchema = detailSchema
+
+ return {
+ allSchemas
+ }
+}
+
+// 过滤 Search 结构
+const filterSearchSchema = (crudSchema: CrudSchema[]): FormSchema[] => {
+ const searchSchema: FormSchema[] = []
+
+ eachTree(crudSchema, (schemaItem: CrudSchema) => {
+ // 判断是否显示
+ if (schemaItem?.search?.show) {
+ let component = schemaItem?.search?.component || 'Input'
+ const options: ComponentOptions[] = []
+ let comonentProps = {}
+ if (schemaItem.dictType) {
+ getIntDictOptions(schemaItem.dictType).forEach((dict) => {
+ options.push(dict)
+ })
+ comonentProps = {
+ options: options
+ }
+ if (!schemaItem.search.component) component = 'Select'
+ }
+ const searchSchemaItem = {
+ // 默认为 input
+ component: component,
+ componentProps: comonentProps,
+ ...schemaItem.search,
+ field: schemaItem.field,
+ label: schemaItem.search?.label || schemaItem.label
+ }
+ // 删除不必要的字段
+ delete searchSchemaItem.show
+
+ searchSchema.push(searchSchemaItem)
+ }
+ })
+ return searchSchema
+}
+
+// 过滤 table 结构
+const filterTableSchema = (crudSchema: CrudSchema[]): TableColumn[] => {
+ const tableColumns = treeMap(crudSchema, {
+ conversion: (schema: CrudSchema) => {
+ if (schema?.table?.show !== false) {
+ return {
+ ...schema.table,
+ ...schema
+ }
+ }
+ }
+ })
+
+ // 第一次过滤会有 undefined 所以需要二次过滤
+ return filter(tableColumns as TableColumn[], (data) => {
+ if (data.children === void 0) {
+ delete data.children
+ }
+ return !!data.field
+ })
+}
+
+// 过滤 form 结构
+const filterFormSchema = (crudSchema: CrudSchema[]): FormSchema[] => {
+ const formSchema: FormSchema[] = []
+
+ eachTree(crudSchema, (schemaItem: CrudSchema) => {
+ // 判断是否显示
+ if (schemaItem?.form?.show !== false) {
+ let component = schemaItem?.form?.component || 'Input'
+ const options: ComponentOptions[] = []
+ let comonentProps = {}
+ if (schemaItem.dictType) {
+ getIntDictOptions(schemaItem.dictType).forEach((dict) => {
+ options.push(dict)
+ })
+ comonentProps = {
+ options: options
+ }
+ if (!(schemaItem.form && schemaItem.form.component)) component = 'Select'
+ }
+ const formSchemaItem = {
+ // 默认为 input
+ component: component,
+ componentProps: comonentProps,
+ ...schemaItem.form,
+ field: schemaItem.field,
+ label: schemaItem.form?.label || schemaItem.label
+ }
+
+ // 删除不必要的字段
+ delete formSchemaItem.show
+
+ formSchema.push(formSchemaItem)
+ }
+ })
+
+ return formSchema
+}
+
+// 过滤 descriptions 结构
+const filterDescriptionsSchema = (crudSchema: CrudSchema[]): DescriptionsSchema[] => {
+ const descriptionsSchema: FormSchema[] = []
+
+ eachTree(crudSchema, (schemaItem: CrudSchema) => {
+ // 判断是否显示
+ if (schemaItem?.detail?.show !== false) {
+ const descriptionsSchemaItem = {
+ ...schemaItem.detail,
+ field: schemaItem.field,
+ label: schemaItem.detail?.label || schemaItem.label
+ }
+
+ // 删除不必要的字段
+ delete descriptionsSchemaItem.show
+
+ descriptionsSchema.push(descriptionsSchemaItem)
+ }
+ })
+
+ return descriptionsSchema
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useDesign.ts b/yudao-ui-admin-vue3/src/hooks/web/useDesign.ts
new file mode 100644
index 0000000000..1ec349f84a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useDesign.ts
@@ -0,0 +1,18 @@
+import variables from '@/styles/variables.module.less'
+
+export const useDesign = () => {
+ const lessVariables = variables
+
+ /**
+ * @param scope 类名
+ * @returns 返回空间名-类名
+ */
+ const getPrefixCls = (scope: string) => {
+ return `${lessVariables.namespace}-${scope}`
+ }
+
+ return {
+ variables: lessVariables,
+ getPrefixCls
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useEmitt.ts b/yudao-ui-admin-vue3/src/hooks/web/useEmitt.ts
new file mode 100644
index 0000000000..26b5d626c9
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useEmitt.ts
@@ -0,0 +1,23 @@
+import mitt from 'mitt'
+import { onBeforeUnmount } from 'vue'
+
+interface Option {
+ name: string // 事件名称
+ callback: Fn // 回调
+}
+
+const emitter = mitt()
+
+export const useEmitt = (option?: Option) => {
+ if (option) {
+ emitter.on(option.name, option.callback)
+
+ onBeforeUnmount(() => {
+ emitter.off(option.name)
+ })
+ }
+
+ return {
+ emitter
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useForm.ts b/yudao-ui-admin-vue3/src/hooks/web/useForm.ts
new file mode 100644
index 0000000000..21d2186f5a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useForm.ts
@@ -0,0 +1,91 @@
+import type { Form, FormExpose } from '@/components/Form'
+import type { ElForm } from 'element-plus'
+import { ref, unref, nextTick } from 'vue'
+import type { FormProps } from '@/components/Form/src/types'
+
+export const useForm = (props?: FormProps) => {
+ // From实例
+ const formRef = ref()
+
+ // ElForm实例
+ const elFormRef = ref>()
+
+ /**
+ * @param ref Form实例
+ * @param elRef ElForm实例
+ */
+ const register = (ref: typeof Form & FormExpose, elRef: ComponentRef) => {
+ formRef.value = ref
+ elFormRef.value = elRef
+ }
+
+ const getForm = async () => {
+ await nextTick()
+ const form = unref(formRef)
+ if (!form) {
+ console.error('The form is not registered. Please use the register method to register')
+ }
+ return form
+ }
+
+ // 一些内置的方法
+ const methods: {
+ setProps: (props: Recordable) => void
+ setValues: (data: Recordable) => void
+ getFormData: () => Promise
+ setSchema: (schemaProps: FormSetPropsType[]) => void
+ addSchema: (formSchema: FormSchema, index?: number) => void
+ delSchema: (field: string) => void
+ } = {
+ setProps: async (props: FormProps = {}) => {
+ const form = await getForm()
+ form?.setProps(props)
+ },
+
+ setValues: async (data: Recordable) => {
+ const form = await getForm()
+ form?.setValues(data)
+ },
+
+ /**
+ * @param schemaProps 需要设置的schemaProps
+ */
+ setSchema: async (schemaProps: FormSetPropsType[]) => {
+ const form = await getForm()
+ form?.setSchema(schemaProps)
+ },
+
+ /**
+ * @param formSchema 需要新增数据
+ * @param index 在哪里新增
+ */
+ addSchema: async (formSchema: FormSchema, index?: number) => {
+ const form = await getForm()
+ form?.addSchema(formSchema, index)
+ },
+
+ /**
+ * @param field 删除哪个数据
+ */
+ delSchema: async (field: string) => {
+ const form = await getForm()
+ form?.delSchema(field)
+ },
+
+ /**
+ * @returns form data
+ */
+ getFormData: async (): Promise => {
+ const form = await getForm()
+ return form?.formModel as T
+ }
+ }
+
+ props && methods.setProps(props)
+
+ return {
+ register,
+ elFormRef,
+ methods
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useI18n.ts b/yudao-ui-admin-vue3/src/hooks/web/useI18n.ts
new file mode 100644
index 0000000000..8b6e7650d1
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useI18n.ts
@@ -0,0 +1,52 @@
+import { i18n } from '@/plugins/vueI18n'
+
+type I18nGlobalTranslation = {
+ (key: string): string
+ (key: string, locale: string): string
+ (key: string, locale: string, list: unknown[]): string
+ (key: string, locale: string, named: Record): string
+ (key: string, list: unknown[]): string
+ (key: string, named: Record): string
+}
+
+type I18nTranslationRestParameters = [string, any]
+
+const getKey = (namespace: string | undefined, key: string) => {
+ if (!namespace) {
+ return key
+ }
+ if (key.startsWith(namespace)) {
+ return key
+ }
+ return `${namespace}.${key}`
+}
+
+export const useI18n = (
+ namespace?: string
+): {
+ t: I18nGlobalTranslation
+} => {
+ const normalFn = {
+ t: (key: string) => {
+ return getKey(namespace, key)
+ }
+ }
+
+ if (!i18n) {
+ return normalFn
+ }
+
+ const { t, ...methods } = i18n.global
+
+ const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => {
+ if (!key) return ''
+ if (!key.includes('.') && !namespace) return key
+ return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters))
+ }
+ return {
+ ...methods,
+ t: tFn
+ }
+}
+
+export const t = (key: string) => key
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useIcon.ts b/yudao-ui-admin-vue3/src/hooks/web/useIcon.ts
new file mode 100644
index 0000000000..b9a5ccb6a6
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useIcon.ts
@@ -0,0 +1,7 @@
+import { h } from 'vue'
+import type { VNode } from 'vue'
+import { Icon } from '@/components/Icon'
+
+export const useIcon = (props: IconTypes): VNode => {
+ return h(Icon, props)
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useIntro.ts b/yudao-ui-admin-vue3/src/hooks/web/useIntro.ts
new file mode 100644
index 0000000000..85604df6a4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useIntro.ts
@@ -0,0 +1,47 @@
+import introJs from 'intro.js'
+import { IntroJs, Step, Options } from 'intro.js'
+import 'intro.js/introjs.css'
+import { useI18n } from '@/hooks/web/useI18n'
+import { useDesign } from '@/hooks/web/useDesign'
+
+export const useIntro = (setps?: Step[], options?: Options) => {
+ const { t } = useI18n()
+
+ const { variables } = useDesign()
+
+ const defaultSetps: Step[] = setps || [
+ {
+ element: `#${variables.namespace}-menu`,
+ title: t('common.menu'),
+ intro: t('common.menuDes'),
+ position: 'right'
+ },
+ {
+ element: `#${variables.namespace}-tool-header`,
+ title: t('common.tool'),
+ intro: t('common.toolDes'),
+ position: 'left'
+ },
+ {
+ element: `#${variables.namespace}-tags-view`,
+ title: t('common.tagsView'),
+ intro: t('common.tagsViewDes'),
+ position: 'bottom'
+ }
+ ]
+
+ const defaultOptions: Options = options || {
+ prevLabel: t('common.prevLabel'),
+ nextLabel: t('common.nextLabel'),
+ skipLabel: t('common.skipLabel'),
+ doneLabel: t('common.doneLabel')
+ }
+
+ const introRef: IntroJs = introJs()
+
+ introRef.addSteps(defaultSetps).setOptions(defaultOptions)
+
+ return {
+ introRef
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useLocale.ts b/yudao-ui-admin-vue3/src/hooks/web/useLocale.ts
new file mode 100644
index 0000000000..c65070ef3a
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useLocale.ts
@@ -0,0 +1,35 @@
+import { i18n } from '@/plugins/vueI18n'
+import { useLocaleStoreWithOut } from '@/store/modules/locale'
+import { setHtmlPageLang } from '@/plugins/vueI18n/helper'
+
+const setI18nLanguage = (locale: LocaleType) => {
+ const localeStore = useLocaleStoreWithOut()
+
+ if (i18n.mode === 'legacy') {
+ i18n.global.locale = locale
+ } else {
+ ;(i18n.global.locale as any).value = locale
+ }
+ localeStore.setCurrentLocale({
+ lang: locale
+ })
+ setHtmlPageLang(locale)
+}
+
+export const useLocale = () => {
+ // Switching the language will change the locale of useI18n
+ // And submit to configuration modification
+ const changeLocale = async (locale: LocaleType) => {
+ const globalI18n = i18n.global
+
+ const langModule = await import(`../../locales/${locale}.ts`)
+
+ globalI18n.setLocaleMessage(locale, langModule.default)
+
+ setI18nLanguage(locale)
+ }
+
+ return {
+ changeLocale
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useNProgress.ts b/yudao-ui-admin-vue3/src/hooks/web/useNProgress.ts
new file mode 100644
index 0000000000..28990e7dee
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useNProgress.ts
@@ -0,0 +1,34 @@
+import { nextTick, unref } from 'vue'
+import type { NProgressOptions } from 'nprogress'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { useCssVar } from '@vueuse/core'
+
+const primaryColor = useCssVar('--el-color-primary', document.documentElement)
+
+export const useNProgress = () => {
+ NProgress.configure({ showSpinner: false } as NProgressOptions)
+
+ const initColor = async () => {
+ await nextTick()
+ const bar = document.getElementById('nprogress')?.getElementsByClassName('bar')[0] as ElRef
+ if (bar) {
+ bar.style.background = unref(primaryColor.value)
+ }
+ }
+
+ initColor()
+
+ const start = () => {
+ NProgress.start()
+ }
+
+ const done = () => {
+ NProgress.done()
+ }
+
+ return {
+ start,
+ done
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/usePageLoading.ts b/yudao-ui-admin-vue3/src/hooks/web/usePageLoading.ts
new file mode 100644
index 0000000000..bb89457d99
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/usePageLoading.ts
@@ -0,0 +1,18 @@
+import { useAppStoreWithOut } from '@/store/modules/app'
+
+const appStore = useAppStoreWithOut()
+
+export const usePageLoading = () => {
+ const loadStart = () => {
+ appStore.setPageLoading(true)
+ }
+
+ const loadDone = () => {
+ appStore.setPageLoading(false)
+ }
+
+ return {
+ loadStart,
+ loadDone
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useTable.ts b/yudao-ui-admin-vue3/src/hooks/web/useTable.ts
new file mode 100644
index 0000000000..cf16c3e439
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useTable.ts
@@ -0,0 +1,221 @@
+import download from '@/utils/download'
+import { useI18n } from '@/hooks/web/useI18n'
+import { Table, TableExpose } from '@/components/Table'
+import { ElMessage, ElMessageBox, ElTable } from 'element-plus'
+import { computed, nextTick, reactive, ref, unref, watch } from 'vue'
+import type { TableProps } from '@/components/Table/src/types'
+const { t } = useI18n()
+
+interface UseTableConfig {
+ getListApi: (option: L) => Promise
+ delListApi?: (ids: string | number) => Promise
+ exportListApi?: (option: L) => Promise
+ props?: TableProps
+}
+
+interface TableObject {
+ pageSize: number
+ currentPage: number
+ total: number
+ tableList: K[]
+ paramsObj: L
+ loading: boolean
+ exportLoading: boolean
+ currentRow: Nullable
+}
+
+export const useTable = (
+ config?: UseTableConfig
+) => {
+ const tableObject = reactive>({
+ // 页数
+ pageSize: 10,
+ // 当前页
+ currentPage: 1,
+ // 总条数
+ total: 10,
+ // 表格数据
+ tableList: [],
+ // AxiosConfig 配置
+ paramsObj: {} as L,
+ // 加载中
+ loading: true,
+ // 导出加载中
+ exportLoading: false,
+ // 当前行的数据
+ currentRow: null
+ })
+
+ const paramsObj = computed(() => {
+ return {
+ params: {
+ ...tableObject.paramsObj.params,
+ pageSize: tableObject.pageSize,
+ pageNo: tableObject.currentPage
+ }
+ }
+ })
+
+ watch(
+ () => tableObject.currentPage,
+ () => {
+ methods.getList()
+ }
+ )
+
+ watch(
+ () => tableObject.pageSize,
+ () => {
+ // 当前页不为1时,修改页数后会导致多次调用getList方法
+ if (tableObject.currentPage === 1) {
+ methods.getList()
+ } else {
+ tableObject.currentPage = 1
+ methods.getList()
+ }
+ }
+ )
+
+ // Table实例
+ const tableRef = ref()
+
+ // ElTable实例
+ const elTableRef = ref>()
+
+ const register = (ref: typeof Table & TableExpose, elRef: ComponentRef) => {
+ tableRef.value = ref
+ elTableRef.value = elRef
+ }
+
+ const getTable = async () => {
+ await nextTick()
+ const table = unref(tableRef)
+ if (!table) {
+ console.error('The table is not registered. Please use the register method to register')
+ }
+ return table
+ }
+
+ const delData = async (ids: string | number | string[] | number[]) => {
+ let idsLength = 1
+ if (ids instanceof Array) {
+ idsLength = ids.length
+ await Promise.all(
+ ids.map(async (id: string | number) => {
+ await (config?.delListApi && config?.delListApi(id))
+ })
+ )
+ } else {
+ await (config?.delListApi && config?.delListApi(ids))
+ }
+ ElMessage.success(t('common.delSuccess'))
+ // 计算出临界点
+ tableObject.currentPage =
+ tableObject.total % tableObject.pageSize === idsLength || tableObject.pageSize === 1
+ ? tableObject.currentPage > 1
+ ? tableObject.currentPage - 1
+ : tableObject.currentPage
+ : tableObject.currentPage
+ methods.getList()
+ }
+
+ const methods: {
+ setProps: (props: Recordable) => void
+ getList: () => Promise
+ setColumn: (columnProps: TableSetPropsType[]) => void
+ setSearchParams: (data: Recordable) => void
+ getSelections: () => Promise
+ delList: (ids: string | number | string[] | number[], multiple: boolean) => Promise
+ exportList: (fileName: string) => Promise
+ } = {
+ getList: async () => {
+ tableObject.loading = true
+ const res = await config
+ ?.getListApi(unref(paramsObj) as unknown as L)
+ .catch(() => {})
+ .finally(() => {
+ tableObject.loading = false
+ })
+ if (res) {
+ tableObject.tableList = res?.list
+ tableObject.total = res?.total
+ }
+ },
+ setProps: async (props: TableProps = {}) => {
+ const table = await getTable()
+ table?.setProps(props)
+ },
+ setColumn: async (columnProps: TableSetPropsType[]) => {
+ const table = await getTable()
+ table?.setColumn(columnProps)
+ },
+ getSelections: async () => {
+ const table = await getTable()
+ return (table?.selections || []) as K[]
+ },
+ // 与Search组件结合
+ setSearchParams: (data: Recordable) => {
+ tableObject.currentPage = 1
+ tableObject.paramsObj = Object.assign(tableObject.paramsObj, {
+ params: {
+ pageSize: tableObject.pageSize,
+ pageNo: tableObject.currentPage,
+ ...data
+ }
+ })
+ methods.getList()
+ },
+ // 删除数据
+ delList: async (ids: string | number | string[] | number[], multiple: boolean) => {
+ const tableRef = await getTable()
+ let message = 'common.delDataMessage'
+ if (multiple) {
+ if (!tableRef?.selections.length) {
+ ElMessage.warning(t('common.delNoData'))
+ return
+ } else {
+ message = 'common.delMessage'
+ }
+ }
+ ElMessageBox.confirm(t(message), t('common.confirmTitle'), {
+ confirmButtonText: t('common.ok'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ })
+ .then(async () => {
+ await delData(ids)
+ })
+ .catch(() => {})
+ },
+ // 导出列表
+ exportList: async (fileName: string) => {
+ tableObject.exportLoading = true
+ ElMessageBox.confirm(t('common.exportMessage'), t('common.confirmTitle'), {
+ confirmButtonText: t('common.ok'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ })
+ .then(async () => {
+ const res = await config
+ ?.exportListApi?.(unref(paramsObj) as unknown as L)
+ .catch(() => {})
+ if (res) {
+ download.excel(res, fileName)
+ }
+ })
+ .catch(() => {})
+ .finally(() => {
+ tableObject.exportLoading = false
+ })
+ }
+ }
+
+ config?.props && methods.setProps(config.props)
+
+ return {
+ register,
+ elTableRef,
+ tableObject,
+ methods
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useTimeAgo.ts b/yudao-ui-admin-vue3/src/hooks/web/useTimeAgo.ts
new file mode 100644
index 0000000000..b6d1862272
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useTimeAgo.ts
@@ -0,0 +1,48 @@
+import { useTimeAgo as useTimeAgoCore, UseTimeAgoMessages } from '@vueuse/core'
+import { computed, unref } from 'vue'
+import { useLocaleStoreWithOut } from '@/store/modules/locale'
+
+const TIME_AGO_MESSAGE_MAP: {
+ 'zh-CN': UseTimeAgoMessages
+ en: UseTimeAgoMessages
+} = {
+ 'zh-CN': {
+ justNow: '刚刚',
+ past: (n) => (n.match(/\d/) ? `${n}前` : n),
+ future: (n) => (n.match(/\d/) ? `${n}后` : n),
+ month: (n, past) => (n === 1 ? (past ? '上个月' : '下个月') : `${n} 个月`),
+ year: (n, past) => (n === 1 ? (past ? '去年' : '明年') : `${n} 年`),
+ day: (n, past) => (n === 1 ? (past ? '昨天' : '明天') : `${n} 天`),
+ week: (n, past) => (n === 1 ? (past ? '上周' : '下周') : `${n} 周`),
+ hour: (n) => `${n} 小时`,
+ minute: (n) => `${n} 分钟`,
+ second: (n) => `${n} 秒`
+ },
+ en: {
+ justNow: 'just now',
+ past: (n) => (n.match(/\d/) ? `${n} ago` : n),
+ future: (n) => (n.match(/\d/) ? `in ${n}` : n),
+ month: (n, past) =>
+ n === 1 ? (past ? 'last month' : 'next month') : `${n} month${n > 1 ? 's' : ''}`,
+ year: (n, past) =>
+ n === 1 ? (past ? 'last year' : 'next year') : `${n} year${n > 1 ? 's' : ''}`,
+ day: (n, past) => (n === 1 ? (past ? 'yesterday' : 'tomorrow') : `${n} day${n > 1 ? 's' : ''}`),
+ week: (n, past) =>
+ n === 1 ? (past ? 'last week' : 'next week') : `${n} week${n > 1 ? 's' : ''}`,
+ hour: (n) => `${n} hour${n > 1 ? 's' : ''}`,
+ minute: (n) => `${n} minute${n > 1 ? 's' : ''}`,
+ second: (n) => `${n} second${n > 1 ? 's' : ''}`
+ }
+}
+
+export const useTimeAgo = (time: Date | number | string) => {
+ const localeStore = useLocaleStoreWithOut()
+
+ const currentLocale = computed(() => localeStore.getCurrentLocale)
+
+ const timeAgo = useTimeAgoCore(time, {
+ messages: TIME_AGO_MESSAGE_MAP[unref(currentLocale).lang]
+ })
+
+ return timeAgo
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useTitle.ts b/yudao-ui-admin-vue3/src/hooks/web/useTitle.ts
new file mode 100644
index 0000000000..d0eb18860d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useTitle.ts
@@ -0,0 +1,25 @@
+import { watch, ref } from 'vue'
+import { isString } from '@/utils/is'
+import { useAppStoreWithOut } from '@/store/modules/app'
+import { useI18n } from '@/hooks/web/useI18n'
+
+const appStore = useAppStoreWithOut()
+
+export const useTitle = (newTitle?: string) => {
+ const { t } = useI18n()
+ const title = ref(
+ newTitle ? `${appStore.getTitle} - ${t(newTitle as string)}` : appStore.getTitle
+ )
+
+ watch(
+ title,
+ (n, o) => {
+ if (isString(n) && n !== o && document) {
+ document.title = n
+ }
+ },
+ { immediate: true }
+ )
+
+ return title
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useValidator.ts b/yudao-ui-admin-vue3/src/hooks/web/useValidator.ts
new file mode 100644
index 0000000000..2ed0161f6c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useValidator.ts
@@ -0,0 +1,64 @@
+import { useI18n } from '@/hooks/web/useI18n'
+
+const { t } = useI18n()
+
+type Callback = (error?: string | Error | undefined) => void
+
+interface LengthRange {
+ min: number
+ max: number
+ message: string
+}
+
+export const useValidator = () => {
+ const required = (message?: string) => {
+ return {
+ required: true,
+ message: message || t('common.required')
+ }
+ }
+
+ const lengthRange = (val: any, callback: Callback, options: LengthRange) => {
+ const { min, max, message } = options
+ if (val.length < min || val.length > max) {
+ callback(new Error(message))
+ } else {
+ callback()
+ }
+ }
+
+ // 不能有空格
+ const notSpace = (val: any, callback: Callback, message: string) => {
+ if (val.indexOf(' ') !== -1) {
+ callback(new Error(message))
+ } else {
+ callback()
+ }
+ }
+
+ // 不能是特殊字符
+ const notSpecialCharacters = (val: any, callback: Callback, message: string) => {
+ if (/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/gi.test(val)) {
+ callback(new Error(message))
+ } else {
+ callback()
+ }
+ }
+
+ // 两个字符串是否想等
+ const isEqual = (val1: string, val2: string, callback: Callback, message: string) => {
+ if (val1 === val2) {
+ callback()
+ } else {
+ callback(new Error(message))
+ }
+ }
+
+ return {
+ required,
+ lengthRange,
+ notSpace,
+ notSpecialCharacters,
+ isEqual
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/hooks/web/useWatermark.ts b/yudao-ui-admin-vue3/src/hooks/web/useWatermark.ts
new file mode 100644
index 0000000000..4a313594cc
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/hooks/web/useWatermark.ts
@@ -0,0 +1,55 @@
+const domSymbol = Symbol('watermark-dom')
+
+export function useWatermark(appendEl: HTMLElement | null = document.body) {
+ let func: Fn = () => {}
+ const id = domSymbol.toString()
+ const clear = () => {
+ const domId = document.getElementById(id)
+ if (domId) {
+ const el = appendEl
+ el && el.removeChild(domId)
+ }
+ window.removeEventListener('resize', func)
+ }
+ const createWatermark = (str: string) => {
+ clear()
+
+ const can = document.createElement('canvas')
+ can.width = 300
+ can.height = 240
+
+ const cans = can.getContext('2d')
+ if (cans) {
+ cans.rotate((-20 * Math.PI) / 120)
+ cans.font = '15px Vedana'
+ cans.fillStyle = 'rgba(0, 0, 0, 0.15)'
+ cans.textAlign = 'left'
+ cans.textBaseline = 'middle'
+ cans.fillText(str, can.width / 20, can.height)
+ }
+
+ const div = document.createElement('div')
+ div.id = id
+ div.style.pointerEvents = 'none'
+ div.style.top = '0px'
+ div.style.left = '0px'
+ div.style.position = 'absolute'
+ div.style.zIndex = '100000000'
+ div.style.width = document.documentElement.clientWidth + 'px'
+ div.style.height = document.documentElement.clientHeight + 'px'
+ div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'
+ const el = appendEl
+ el && el.appendChild(div)
+ return id
+ }
+
+ function setWatermark(str: string) {
+ createWatermark(str)
+ func = () => {
+ createWatermark(str)
+ }
+ window.addEventListener('resize', func)
+ }
+
+ return { setWatermark, clear }
+}
diff --git a/yudao-ui-admin-vue3/src/layout/Layout.vue b/yudao-ui-admin-vue3/src/layout/Layout.vue
new file mode 100644
index 0000000000..261a6996a2
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/layout/Layout.vue
@@ -0,0 +1,78 @@
+
+
+
diff --git a/yudao-ui-admin-vue3/src/layout/components/AppView.vue b/yudao-ui-admin-vue3/src/layout/components/AppView.vue
new file mode 100644
index 0000000000..2000ca9771
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/layout/components/AppView.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
diff --git a/yudao-ui-admin-vue3/src/layout/components/ToolHeader.vue b/yudao-ui-admin-vue3/src/layout/components/ToolHeader.vue
new file mode 100644
index 0000000000..091a25a322
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/layout/components/ToolHeader.vue
@@ -0,0 +1,83 @@
+
+
+
diff --git a/yudao-ui-admin-vue3/src/layout/components/useRenderLayout.tsx b/yudao-ui-admin-vue3/src/layout/components/useRenderLayout.tsx
new file mode 100644
index 0000000000..9e5f744004
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/layout/components/useRenderLayout.tsx
@@ -0,0 +1,263 @@
+import { computed } from 'vue'
+import { useAppStore } from '@/store/modules/app'
+import { Menu } from '@/components/Menu'
+import { TabMenu } from '@/components/TabMenu'
+import { TagsView } from '@/components/TagsView'
+import { Logo } from '@/components/Logo'
+import AppView from './AppView.vue'
+import ToolHeader from './ToolHeader.vue'
+import { ElScrollbar } from 'element-plus'
+import { useDesign } from '@/hooks/web/useDesign'
+
+const { getPrefixCls } = useDesign()
+
+const prefixCls = getPrefixCls('layout')
+
+const appStore = useAppStore()
+
+const pageLoading = computed(() => appStore.getPageLoading)
+
+// 标签页
+const tagsView = computed(() => appStore.getTagsView)
+
+// 菜单折叠
+const collapse = computed(() => appStore.getCollapse)
+
+// logo
+const logo = computed(() => appStore.logo)
+
+// 固定头部
+const fixedHeader = computed(() => appStore.getFixedHeader)
+
+// 是否是移动端
+const mobile = computed(() => appStore.getMobile)
+
+export const useRenderLayout = () => {
+ const renderClassic = () => {
+ return (
+ <>
+
+ {logo.value ? (
+
+ ) : undefined}
+
+
+
+
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+
+ >
+ )
+ }
+
+ const renderTopLeft = () => {
+ return (
+ <>
+
+
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+
+ >
+ )
+ }
+
+ const renderTop = () => {
+ return (
+ <>
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+ >
+ )
+ }
+
+ const renderCutMenu = () => {
+ return (
+ <>
+
+
+
+
+
+ {tagsView.value ? (
+
+ ) : undefined}
+
+
+
+
+
+ >
+ )
+ }
+
+ return {
+ renderClassic,
+ renderTopLeft,
+ renderTop,
+ renderCutMenu
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/locales/en.ts b/yudao-ui-admin-vue3/src/locales/en.ts
new file mode 100644
index 0000000000..a8e24f8359
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/locales/en.ts
@@ -0,0 +1,416 @@
+export default {
+ common: {
+ inputText: 'Please input',
+ selectText: 'Please select',
+ startTimeText: 'Start time',
+ endTimeText: 'End time',
+ login: 'Login',
+ required: 'This is required',
+ loginOut: 'Login out',
+ document: 'Document',
+ profile: 'User Center',
+ reminder: 'Reminder',
+ loginOutMessage: 'Exit the system?',
+ back: 'Back',
+ ok: 'OK',
+ save: 'Save',
+ cancel: 'Cancel',
+ close: 'Close',
+ reload: 'Reload current',
+ closeTab: 'Close current',
+ closeTheLeftTab: 'Close left',
+ closeTheRightTab: 'Close right',
+ closeOther: 'Close other',
+ closeAll: 'Close all',
+ prevLabel: 'Prev',
+ nextLabel: 'Next',
+ skipLabel: 'Jump',
+ doneLabel: 'End',
+ menu: 'Menu',
+ menuDes: 'Menu bar rendered in routed structure',
+ collapse: 'Collapse',
+ collapseDes: 'Expand and zoom the menu bar',
+ tagsView: 'Tags view',
+ tagsViewDes: 'Used to record routing history',
+ tool: 'Tool',
+ toolDes: 'Used to set up custom systems',
+ query: 'Query',
+ reset: 'Reset',
+ shrink: 'Put away',
+ expand: 'Expand',
+ confirmTitle: 'System Hint',
+ exportMessage: 'Whether to confirm export data item?',
+ importMessage: 'Whether to confirm import data item?',
+ createSuccess: 'Create Success',
+ updateSuccess: 'Update Success',
+ delMessage: 'Delete the selected data?',
+ delDataMessage: 'Delete the data?',
+ delNoData: 'Please select the data to delete',
+ delSuccess: 'Deleted successfully',
+ index: 'Index',
+ status: 'Status',
+ createTime: 'Create Time',
+ updateTime: 'Update Time',
+ copy: 'Copy',
+ copySuccess: 'Copy Success',
+ copyError: 'Copy Error'
+ },
+ error: {
+ noPermission: `Sorry, you don't have permission to access this page.`,
+ pageError: 'Sorry, the page you visited does not exist.',
+ networkError: 'Sorry, the server reported an error.',
+ returnToHome: 'Return to home'
+ },
+ permission: {
+ hasPermission: `Please set the operation permission label value`,
+ hasRole: `Please set the role permission tag value`
+ },
+ setting: {
+ projectSetting: 'Project setting',
+ theme: 'Theme',
+ layout: 'Layout',
+ systemTheme: 'System theme',
+ menuTheme: 'Menu theme',
+ interfaceDisplay: 'Interface display',
+ breadcrumb: 'Breadcrumb',
+ breadcrumbIcon: 'Breadcrumb icon',
+ collapseMenu: 'Collapse menu',
+ hamburgerIcon: 'Hamburger icon',
+ screenfullIcon: 'Screenfull icon',
+ sizeIcon: 'Size icon',
+ localeIcon: 'Locale icon',
+ tagsView: 'Tags view',
+ logo: 'Logo',
+ greyMode: 'Grey mode',
+ fixedHeader: 'Fixed header',
+ headerTheme: 'Header theme',
+ cutMenu: 'Cut Menu',
+ copy: 'Copy',
+ clearAndReset: 'Clear cache and reset',
+ copySuccess: 'Copy success',
+ copyFailed: 'Copy failed',
+ footer: 'Footer',
+ uniqueOpened: 'Unique opened',
+ tagsViewIcon: 'Tags view icon'
+ },
+ size: {
+ default: 'Default',
+ large: 'Large',
+ small: 'Small'
+ },
+ login: {
+ welcome: 'Welcome to the system',
+ message: 'Backstage management system',
+ tenantname: 'TenantName',
+ username: 'Username',
+ password: 'Password',
+ code: 'verification code',
+ login: 'Sign in',
+ relogin: 'Sign in again',
+ otherLogin: 'Sign in with',
+ remember: 'Remember me',
+ forgetPassword: 'Forget password?',
+ tenantNamePlaceholder: 'Please Enter Tenant Name',
+ usernamePlaceholder: 'Please Enter Username',
+ passwordPlaceholder: 'Please Enter Password',
+ codePlaceholder: 'Please Enter Verification Code',
+ mobileTitle: 'Mobile sign in',
+ mobileNumber: 'Mobile Number',
+ mobileNumberPlaceholder: 'Plaease Enter Mobile Number',
+ backLogin: 'back',
+ getSmsCode: 'Get SMS Code',
+ btnMobile: 'Mobile sign in',
+ btnQRCode: 'QR code sign in',
+ btnRegister: 'Sign up',
+ SmsSendMsg: 'code has been sent'
+ },
+ router: {
+ login: 'Login',
+ home: 'Home',
+ analysis: 'Analysis',
+ workplace: 'Workplace'
+ },
+ analysis: {
+ newUser: 'New user',
+ unreadInformation: 'Unread information',
+ transactionAmount: 'Transaction amount',
+ totalShopping: 'Total Shopping',
+ monthlySales: 'Monthly sales',
+ userAccessSource: 'User access source',
+ january: 'January',
+ february: 'February',
+ march: 'March',
+ april: 'April',
+ may: 'May',
+ june: 'June',
+ july: 'July',
+ august: 'August',
+ september: 'September',
+ october: 'October',
+ november: 'November',
+ december: 'December',
+ estimate: 'Estimate',
+ actual: 'Actual',
+ directAccess: 'Airect access',
+ mailMarketing: 'Mail marketing',
+ allianceAdvertising: 'Alliance advertising',
+ videoAdvertising: 'Video advertising',
+ searchEngines: 'Search engines',
+ weeklyUserActivity: 'Weekly user activity',
+ activeQuantity: 'Active quantity',
+ monday: 'Monday',
+ tuesday: 'Tuesday',
+ wednesday: 'Wednesday',
+ thursday: 'Thursday',
+ friday: 'Friday',
+ saturday: 'Saturday',
+ sunday: 'Sunday'
+ },
+ workplace: {
+ goodMorning: 'Good morning',
+ happyDay: 'Wish you happy every day!',
+ toady: `It's sunny today`,
+ project: 'Project',
+ access: 'Project access',
+ toDo: 'To do',
+ introduction: 'A serious introduction',
+ more: 'More',
+ shortcutOperation: 'Shortcut operation',
+ operation: 'Operation',
+ index: 'Index',
+ personal: 'Personal',
+ team: 'Team',
+ quote: 'Quote',
+ contribution: 'Contribution',
+ hot: 'Hot',
+ yield: 'Yield',
+ dynamic: 'Dynamic',
+ push: 'push',
+ pushCode: 'push code to Github',
+ follow: 'Follow'
+ },
+ form: {
+ input: 'Input',
+ inputNumber: 'InputNumber',
+ default: 'Default',
+ icon: 'Icon',
+ mixed: 'Mixed',
+ textarea: 'Textarea',
+ slot: 'Slot',
+ position: 'Position',
+ autocomplete: 'Autocomplete',
+ select: 'Select',
+ selectGroup: 'Select Group',
+ selectV2: 'SelectV2',
+ cascader: 'Cascader',
+ switch: 'Switch',
+ rate: 'Rate',
+ colorPicker: 'Color Picker',
+ transfer: 'Transfer',
+ render: 'Render',
+ radio: 'Radio',
+ button: 'Button',
+ checkbox: 'Checkbox',
+ slider: 'Slider',
+ datePicker: 'Date Picker',
+ shortcuts: 'Shortcuts',
+ today: 'Today',
+ yesterday: 'Yesterday',
+ aWeekAgo: 'A week ago',
+ week: 'Week',
+ year: 'Year',
+ month: 'Month',
+ dates: 'Dates',
+ daterange: 'Date Range',
+ monthrange: 'Month Range',
+ dateTimePicker: 'DateTimePicker',
+ dateTimerange: 'Datetime Range',
+ timePicker: 'Time Picker',
+ timeSelect: 'Time Select',
+ inputPassword: 'input Password',
+ passwordStrength: 'Password Strength',
+ operate: 'operate',
+ change: 'Change',
+ restore: 'Restore',
+ disabled: 'Disabled',
+ disablement: 'Disablement',
+ delete: 'Delete',
+ add: 'Add',
+ setValue: 'Set value',
+ resetValue: 'Reset value',
+ set: 'Set',
+ subitem: 'Subitem',
+ formValidation: 'Form validation',
+ verifyReset: 'Verify reset',
+ remark: 'Remark'
+ },
+ watermark: {
+ watermark: 'Watermark'
+ },
+ table: {
+ table: 'Table',
+ index: 'Index',
+ title: 'Title',
+ author: 'Author',
+ createTime: 'Create time',
+ action: 'Action',
+ pagination: 'pagination',
+ reserveIndex: 'Reserve index',
+ restoreIndex: 'Restore index',
+ showSelections: 'Show selections',
+ hiddenSelections: 'Restore selections',
+ showExpandedRows: 'Show expanded rows',
+ hiddenExpandedRows: 'Hidden expanded rows',
+ header: 'Header'
+ },
+ action: {
+ create: 'Create',
+ add: 'Add',
+ del: 'Delete',
+ edit: 'Edit',
+ update: 'Update',
+ preview: 'Preview',
+ sync: 'Sync',
+ save: 'Save',
+ detail: 'Detail',
+ export: 'Export',
+ import: 'Import',
+ generate: 'Generate',
+ logout: 'Login Out',
+ test: 'Test',
+ typeCreate: 'Dict Type Create',
+ typeUpdate: 'Dict Type Eidt',
+ dataCreate: 'Dict Data Create',
+ dataUpdate: 'Dict Data Eidt'
+ },
+ dialog: {
+ dialog: 'Dialog',
+ open: 'Open',
+ close: 'Close'
+ },
+ sys: {
+ api: {
+ operationFailed: 'Operation failed',
+ errorTip: 'Error Tip',
+ errorMessage: 'The operation failed, the system is abnormal!',
+ timeoutMessage: 'Login timed out, please log in again!',
+ apiTimeoutMessage: 'The interface request timed out, please refresh the page and try again!',
+ apiRequestFailed: 'The interface request failed, please try again later!',
+ networkException: 'network anomaly',
+ networkExceptionMsg:
+ 'Please check if your network connection is normal! The network is abnormal',
+
+ errMsg401: 'The user does not have permission (token, user name, password error)!',
+ errMsg403: 'The user is authorized, but access is forbidden!',
+ errMsg404: 'Network request error, the resource was not found!',
+ errMsg405: 'Network request error, request method not allowed!',
+ errMsg408: 'Network request timed out!',
+ errMsg500: 'Server error, please contact the administrator!',
+ errMsg501: 'The network is not implemented!',
+ errMsg502: 'Network Error!',
+ errMsg503: 'The service is unavailable, the server is temporarily overloaded or maintained!',
+ errMsg504: 'Network timeout!',
+ errMsg505: 'The http version does not support the request!',
+ errMsg901: 'Demo mode, no write operations are possible!'
+ },
+ app: {
+ logoutTip: 'Reminder',
+ logoutMessage: 'Confirm to exit the system?',
+ menuLoading: 'Menu loading...'
+ },
+ exception: {
+ backLogin: 'Back Login',
+ backHome: 'Back Home',
+ subTitle403: "Sorry, you don't have access to this page.",
+ subTitle404: 'Sorry, the page you visited does not exist.',
+ subTitle500: 'Sorry, the server is reporting an error.',
+ noDataTitle: 'No data on the current page.',
+ networkErrorTitle: 'Network Error',
+ networkErrorSubTitle:
+ 'Sorry, Your network connection has been disconnected, please check your network!'
+ },
+ lock: {
+ unlock: 'Click to unlock',
+ alert: 'Lock screen password error',
+ backToLogin: 'Back to login',
+ entry: 'Enter the system',
+ placeholder: 'Please enter the lock screen password or user password'
+ },
+ login: {
+ backSignIn: 'Back sign in',
+ mobileSignInFormTitle: 'Mobile sign in',
+ qrSignInFormTitle: 'Qr code sign in',
+ signInFormTitle: 'Sign in',
+ signUpFormTitle: 'Sign up',
+ forgetFormTitle: 'Reset password',
+
+ signInTitle: 'Backstage management system',
+ signInDesc: 'Enter your personal details and get started!',
+ policy: 'I agree to the xxx Privacy Policy',
+ scanSign: `scanning the code to complete the login`,
+
+ loginButton: 'Sign in',
+ registerButton: 'Sign up',
+ rememberMe: 'Remember me',
+ forgetPassword: 'Forget Password?',
+ otherSignIn: 'Sign in with',
+
+ // notify
+ loginSuccessTitle: 'Login successful',
+ loginSuccessDesc: 'Welcome back',
+
+ // placeholder
+ accountPlaceholder: 'Please input username',
+ passwordPlaceholder: 'Please input password',
+ smsPlaceholder: 'Please input sms code',
+ mobilePlaceholder: 'Please input mobile',
+ policyPlaceholder: 'Register after checking',
+ diffPwd: 'The two passwords are inconsistent',
+
+ userName: 'Username',
+ password: 'Password',
+ confirmPassword: 'Confirm Password',
+ email: 'Email',
+ smsCode: 'SMS code',
+ mobile: 'Mobile'
+ }
+ },
+ profile: {
+ user: {
+ title: 'Personal Information',
+ username: 'User Name',
+ nickname: 'Nick Name',
+ mobile: 'Phone Number',
+ email: 'User Mail',
+ dept: 'Department',
+ posts: 'Position',
+ roles: 'Own Role',
+ sex: 'Sex',
+ man: 'Man',
+ woman: 'Woman',
+ createTime: 'Created Date'
+ },
+ info: {
+ title: 'Basic Information',
+ basicInfo: 'Basic Information',
+ resetPwd: 'Reset Password',
+ userSocial: 'Social Information'
+ },
+ rules: {
+ nickname: 'Please Enter User Nickname',
+ mail: 'Please Input The Email Address',
+ truemail: 'Please Input The Correct Email Address',
+ phone: 'Please Enter The Phone Number',
+ truephone: 'Please Enter The Correct Phone Number'
+ },
+ password: {
+ oldPassword: 'Old PassWord',
+ newPassword: 'New Password',
+ confirmPassword: 'Confirm Password',
+ oldPwdMsg: 'Please Enter Old Password',
+ newPwdMsg: 'Please Enter New Password',
+ cfPwdMsg: 'Please Enter Confirm Password',
+ diffPwd: 'The Passwords Entered Twice No Match'
+ }
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/locales/zh-CN.ts b/yudao-ui-admin-vue3/src/locales/zh-CN.ts
new file mode 100644
index 0000000000..e27a3befe4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/locales/zh-CN.ts
@@ -0,0 +1,409 @@
+export default {
+ common: {
+ inputText: '请输入',
+ selectText: '请选择',
+ startTimeText: '开始时间',
+ endTimeText: '结束时间',
+ login: '登录',
+ required: '该项为必填项',
+ loginOut: '退出系统',
+ document: '项目文档',
+ profile: '个人中心',
+ reminder: '温馨提示',
+ loginOutMessage: '是否退出本系统?',
+ back: '返回',
+ ok: '确定',
+ save: '保存',
+ cancel: '取消',
+ close: '关闭',
+ reload: '重新加载',
+ closeTab: '关闭标签页',
+ closeTheLeftTab: '关闭左侧标签页',
+ closeTheRightTab: '关闭右侧标签页',
+ closeOther: '关闭其他标签页',
+ closeAll: '关闭全部标签页',
+ prevLabel: '上一步',
+ nextLabel: '下一步',
+ skipLabel: '跳过',
+ doneLabel: '结束',
+ menu: '菜单',
+ menuDes: '以路由的结构渲染的菜单栏',
+ collapse: '展开缩收',
+ collapseDes: '展开和缩放菜单栏',
+ tagsView: '标签页',
+ tagsViewDes: '用于记录路由历史记录',
+ tool: '工具',
+ toolDes: '用于设置定制系统',
+ query: '查询',
+ reset: '重置',
+ shrink: '收起',
+ expand: '展开',
+ confirmTitle: '系统提示',
+ exportMessage: '是否确认导出数据项?',
+ importMessage: '是否确认导入数据项?',
+ createSuccess: '新增成功',
+ updateSuccess: '修改成功',
+ delMessage: '是否删除所选中数据?',
+ delDataMessage: '是否删除数据?',
+ delNoData: '请选择需要删除的数据',
+ delSuccess: '删除成功',
+ index: '序号',
+ status: '状态',
+ createTime: '创建时间',
+ updateTime: '更新时间',
+ copy: '复制',
+ copySuccess: '复制成功',
+ copyError: '复制失败'
+ },
+ error: {
+ noPermission: `抱歉,您无权访问此页面。`,
+ pageError: '抱歉,您访问的页面不存在。',
+ networkError: '抱歉,服务器报告错误。',
+ returnToHome: '返回首页'
+ },
+ permission: {
+ hasPermission: `请设置操作权限标签值`,
+ hasRole: `请设置角色权限标签值`
+ },
+ setting: {
+ projectSetting: '项目配置',
+ theme: '主题',
+ layout: '布局',
+ systemTheme: '系统主题',
+ menuTheme: '菜单主题',
+ interfaceDisplay: '界面显示',
+ breadcrumb: '面包屑',
+ breadcrumbIcon: '面包屑图标',
+ collapseMenu: '折叠菜单',
+ hamburgerIcon: '折叠图标',
+ screenfullIcon: '全屏图标',
+ sizeIcon: '尺寸图标',
+ localeIcon: '多语言图标',
+ tagsView: '标签页',
+ logo: '标志',
+ greyMode: '灰色模式',
+ fixedHeader: '固定头部',
+ headerTheme: '头部主题',
+ cutMenu: '切割菜单',
+ copy: '拷贝',
+ clearAndReset: '清除缓存并且重置',
+ copySuccess: '拷贝成功',
+ copyFailed: '拷贝失败',
+ footer: '页脚',
+ uniqueOpened: '菜单手风琴',
+ tagsViewIcon: '标签页图标'
+ },
+ size: {
+ default: '默认',
+ large: '大',
+ small: '小'
+ },
+ login: {
+ welcome: '欢迎使用本系统',
+ message: '开箱即用的中后台管理系统',
+ tenantname: '租户名称',
+ username: '用户名',
+ password: '密码',
+ code: '验证码',
+ login: '登录',
+ relogin: '重新登录',
+ otherLogin: '其他登录方式',
+ remember: '记住我',
+ forgetPassword: '忘记密码?',
+ tenantNamePlaceholder: '请输入租户名称',
+ usernamePlaceholder: '请输入用户名',
+ passwordPlaceholder: '请输入密码',
+ codePlaceholder: '请输入验证码',
+ mobileTitle: '手机登录',
+ mobileNumber: '手机号码',
+ mobileNumberPlaceholder: '请输入手机号码',
+ backLogin: '返回',
+ getSmsCode: '获取验证码',
+ btnMobile: '手机登录',
+ btnQRCode: '二维码登录',
+ btnRegister: '注册',
+ SmsSendMsg: '验证码已发送'
+ },
+ router: {
+ login: '登录',
+ home: '首页',
+ analysis: '分析页',
+ workplace: '工作台'
+ },
+ analysis: {
+ newUser: '新增用户',
+ unreadInformation: '未读消息',
+ transactionAmount: '成交金额',
+ totalShopping: '购物总量',
+ monthlySales: '每月销售额',
+ userAccessSource: '用户访问来源',
+ january: '一月',
+ february: '二月',
+ march: '三月',
+ april: '四月',
+ may: '五月',
+ june: '六月',
+ july: '七月',
+ august: '八月',
+ september: '九月',
+ october: '十月',
+ november: '十一月',
+ december: '十二月',
+ estimate: '预计',
+ actual: '实际',
+ directAccess: '直接访问',
+ mailMarketing: '邮件营销',
+ allianceAdvertising: '联盟广告',
+ videoAdvertising: '视频广告',
+ searchEngines: '搜索引擎',
+ weeklyUserActivity: '每周用户活跃量',
+ activeQuantity: '活跃量',
+ monday: '周一',
+ tuesday: '周二',
+ wednesday: '周三',
+ thursday: '周四',
+ friday: '周五',
+ saturday: '周六',
+ sunday: '周日'
+ },
+ workplace: {
+ goodMorning: '早安',
+ happyDay: '祝你开心每一天!',
+ toady: '今日晴',
+ project: '项目数',
+ access: '项目访问',
+ toDo: '待办',
+ introduction: '一个正经的简介',
+ more: '更多',
+ shortcutOperation: '快捷操作',
+ operation: '操作',
+ index: '指数',
+ personal: '个人',
+ team: '团队',
+ quote: '引用',
+ contribution: '贡献',
+ hot: '热度',
+ yield: '产量',
+ dynamic: '动态',
+ push: '推送',
+ pushCode: '推送 代码到 Github',
+ follow: '关注'
+ },
+ form: {
+ input: '输入框',
+ inputNumber: '数字输入框',
+ default: '默认',
+ icon: '图标',
+ mixed: '复合型',
+ textarea: '多行文本',
+ slot: '插槽',
+ position: '位置',
+ autocomplete: '自动补全',
+ select: '选择器',
+ selectGroup: '选项分组',
+ selectV2: '虚拟列表选择器',
+ cascader: '级联选择器',
+ switch: '开关',
+ rate: '评分',
+ colorPicker: '颜色选择器',
+ transfer: '穿梭框',
+ render: '渲染器',
+ radio: '单选框',
+ button: '按钮',
+ checkbox: '多选框',
+ slider: '滑块',
+ datePicker: '日期选择器',
+ shortcuts: '快捷选项',
+ today: '今天',
+ yesterday: '昨天',
+ aWeekAgo: '一周前',
+ week: '周',
+ year: '年',
+ month: '月',
+ dates: '日期',
+ daterange: '日期范围',
+ monthrange: '月份范围',
+ dateTimePicker: '日期时间选择器',
+ dateTimerange: '日期时间范围',
+ timePicker: '时间选择器',
+ timeSelect: '时间选择',
+ inputPassword: '密码输入框',
+ passwordStrength: '密码强度',
+ operate: '操作',
+ change: '更改',
+ restore: '还原',
+ disabled: '禁用',
+ disablement: '解除禁用',
+ delete: '删除',
+ add: '添加',
+ setValue: '设置值',
+ resetValue: '重置值',
+ set: '设置',
+ subitem: '子项',
+ formValidation: '表单验证',
+ verifyReset: '验证重置',
+ remark: '备注'
+ },
+ watermark: {
+ watermark: '水印'
+ },
+ table: {
+ table: '表格',
+ index: '序号',
+ title: '标题',
+ author: '作者',
+ createTime: '创建时间',
+ action: '操作',
+ pagination: '分页',
+ reserveIndex: '叠加序号',
+ restoreIndex: '还原序号',
+ showSelections: '显示多选',
+ hiddenSelections: '隐藏多选',
+ showExpandedRows: '显示展开行',
+ hiddenExpandedRows: '隐藏展开行',
+ header: '头部'
+ },
+ action: {
+ create: '新增',
+ add: '新增',
+ del: '删除',
+ edit: '编辑',
+ update: '编辑',
+ preview: '预览',
+ sync: '同步',
+ save: '保存',
+ detail: '详情',
+ export: '导出',
+ import: '导入',
+ generate: '生成',
+ logout: '强制退出',
+ test: '测试',
+ typeCreate: '字典类型新增',
+ typeUpdate: '字典类型编辑',
+ dataCreate: '字典数据新增',
+ dataUpdate: '字典数据编辑'
+ },
+ dialog: {
+ dialog: '弹窗',
+ open: '打开',
+ close: '关闭'
+ },
+ sys: {
+ api: {
+ operationFailed: '操作失败',
+ errorTip: '错误提示',
+ errorMessage: '操作失败,系统异常!',
+ timeoutMessage: '登录超时,请重新登录!',
+ apiTimeoutMessage: '接口请求超时,请刷新页面重试!',
+ apiRequestFailed: '请求出错,请稍候重试',
+ networkException: '网络异常',
+ networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!',
+ errMsg401: '用户没有权限(令牌、用户名、密码错误)!',
+ errMsg403: '用户得到授权,但是访问是被禁止的。!',
+ errMsg404: '网络请求错误,未找到该资源!',
+ errMsg405: '网络请求错误,请求方法未允许!',
+ errMsg408: '网络请求超时!',
+ errMsg500: '服务器错误,请联系管理员!',
+ errMsg501: '网络未实现!',
+ errMsg502: '网络错误!',
+ errMsg503: '服务不可用,服务器暂时过载或维护!',
+ errMsg504: '网络超时!',
+ errMsg505: 'http版本不支持该请求!',
+ errMsg901: '演示模式,无法进行写操作!'
+ },
+ app: {
+ logoutTip: '温馨提醒',
+ logoutMessage: '是否确认退出系统?',
+ menuLoading: '菜单加载中...'
+ },
+ exception: {
+ backLogin: '返回登录',
+ backHome: '返回首页',
+ subTitle403: '抱歉,您无权访问此页面。',
+ subTitle404: '抱歉,您访问的页面不存在。',
+ subTitle500: '抱歉,服务器报告错误。',
+ noDataTitle: '当前页无数据',
+ networkErrorTitle: '网络错误',
+ networkErrorSubTitle: '抱歉,您的网络连接已断开,请检查您的网络!'
+ },
+ lock: {
+ unlock: '点击解锁',
+ alert: '锁屏密码错误',
+ backToLogin: '返回登录',
+ entry: '进入系统',
+ placeholder: '请输入锁屏密码或者用户密码'
+ },
+ login: {
+ backSignIn: '返回',
+ signInFormTitle: '登录',
+ mobileSignInFormTitle: '手机登录',
+ qrSignInFormTitle: '二维码登录',
+ signUpFormTitle: '注册',
+ forgetFormTitle: '重置密码',
+ signInTitle: '开箱即用的中后台管理系统',
+ signInDesc: '输入您的个人详细信息开始使用!',
+ policy: '我同意xxx隐私政策',
+ scanSign: `扫码后点击"确认",即可完成登录`,
+ loginButton: '登录',
+ registerButton: '注册',
+ rememberMe: '记住我',
+ forgetPassword: '忘记密码?',
+ otherSignIn: '其他登录方式',
+ // notify
+ loginSuccessTitle: '登录成功',
+ loginSuccessDesc: '欢迎回来',
+ // placeholder
+ accountPlaceholder: '请输入账号',
+ passwordPlaceholder: '请输入密码',
+ smsPlaceholder: '请输入验证码',
+ mobilePlaceholder: '请输入手机号码',
+ policyPlaceholder: '勾选后才能注册',
+ diffPwd: '两次输入密码不一致',
+ userName: '账号',
+ password: '密码',
+ confirmPassword: '确认密码',
+ email: '邮箱',
+ smsCode: '短信验证码',
+ mobile: '手机号码'
+ }
+ },
+ profile: {
+ user: {
+ title: '个人信息',
+ username: '用户名称',
+ nickname: '用户昵称',
+ mobile: '手机号码',
+ email: '用户邮箱',
+ dept: '所属部门',
+ posts: '所属岗位',
+ roles: '所属角色',
+ sex: '性别',
+ man: '男',
+ woman: '女',
+ createTime: '创建日期'
+ },
+ info: {
+ title: '基本信息',
+ basicInfo: '基本资料',
+ resetPwd: '修改密码',
+ userSocial: '社交信息'
+ },
+ rules: {
+ nickname: '请输入用户昵称',
+ mail: '请输入邮箱地址',
+ truemail: '请输入正确的邮箱地址',
+ phone: '请输入正确的手机号码',
+ truephone: '请输入正确的手机号码'
+ },
+ password: {
+ oldPassword: '旧密码',
+ newPassword: '新密码',
+ confirmPassword: '确认密码',
+ oldPwdMsg: '请输入旧密码',
+ newPwdMsg: '请输入新密码',
+ cfPwdMsg: '请输入确认密码',
+ pwdRules: '长度在 6 到 20 个字符',
+ diffPwd: '两次输入密码不一致'
+ }
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/main.ts b/yudao-ui-admin-vue3/src/main.ts
new file mode 100644
index 0000000000..d59300be69
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/main.ts
@@ -0,0 +1,42 @@
+// 引入windi css
+import '@/plugins/windi.css'
+// 导入全局的svg图标
+import '@/plugins/svgIcon'
+// 初始化多语言
+import { setupI18n } from '@/plugins/vueI18n'
+// 引入状态管理
+import { setupStore } from '@/store'
+// 全局组件
+import { setupGlobCom } from '@/components'
+// 引入element-plus
+import { setupElementPlus } from '@/plugins/elementPlus'
+// 引入全局样式
+import '@/styles/index.less'
+// 引入动画
+import '@/plugins/animate.css'
+// 路由
+import { setupRouter } from './router'
+// 权限
+import { setupAuth } from './directive'
+import { createApp } from 'vue'
+import App from './App.vue'
+// 创建实例
+const setupAll = async () => {
+ const app = createApp(App)
+
+ await setupI18n(app)
+
+ setupStore(app)
+
+ setupGlobCom(app)
+
+ setupElementPlus(app)
+
+ setupRouter(app)
+
+ setupAuth(app)
+
+ app.mount('#app')
+}
+
+setupAll()
diff --git a/yudao-ui-admin-vue3/src/plugins/animate.css/index.ts b/yudao-ui-admin-vue3/src/plugins/animate.css/index.ts
new file mode 100644
index 0000000000..3e9345131b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/animate.css/index.ts
@@ -0,0 +1 @@
+import 'animate.css'
diff --git a/yudao-ui-admin-vue3/src/plugins/echarts/index.ts b/yudao-ui-admin-vue3/src/plugins/echarts/index.ts
new file mode 100644
index 0000000000..34f756f64c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/echarts/index.ts
@@ -0,0 +1,41 @@
+import * as echarts from 'echarts/core'
+
+import {
+ BarChart,
+ LineChart,
+ PieChart,
+ MapChart,
+ PictorialBarChart,
+ RadarChart
+} from 'echarts/charts'
+
+import {
+ TitleComponent,
+ TooltipComponent,
+ GridComponent,
+ PolarComponent,
+ AriaComponent,
+ ParallelComponent,
+ LegendComponent
+} from 'echarts/components'
+
+import { CanvasRenderer } from 'echarts/renderers'
+
+echarts.use([
+ LegendComponent,
+ TitleComponent,
+ TooltipComponent,
+ GridComponent,
+ PolarComponent,
+ AriaComponent,
+ ParallelComponent,
+ BarChart,
+ LineChart,
+ PieChart,
+ MapChart,
+ CanvasRenderer,
+ PictorialBarChart,
+ RadarChart
+])
+
+export default echarts
diff --git a/yudao-ui-admin-vue3/src/plugins/elementPlus/index.ts b/yudao-ui-admin-vue3/src/plugins/elementPlus/index.ts
new file mode 100644
index 0000000000..0ae2a8b20e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/elementPlus/index.ts
@@ -0,0 +1,17 @@
+import type { App } from 'vue'
+// 需要全局引入一些组件,如ElScrollbar,不然一些下拉项样式有问题
+import { ElLoading, ElScrollbar, ElButton } from 'element-plus'
+
+const plugins = [ElLoading]
+
+const components = [ElScrollbar, ElButton]
+
+export const setupElementPlus = (app: App) => {
+ plugins.forEach((plugin) => {
+ app.use(plugin)
+ })
+
+ components.forEach((component) => {
+ app.component(component.name, component)
+ })
+}
diff --git a/yudao-ui-admin-vue3/src/plugins/elementPlus/message.ts b/yudao-ui-admin-vue3/src/plugins/elementPlus/message.ts
new file mode 100644
index 0000000000..0957aa4ae0
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/elementPlus/message.ts
@@ -0,0 +1,72 @@
+import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
+import { useI18n } from '@/hooks/web/useI18n'
+const { t } = useI18n() // 国际化
+
+const message = {
+ // 消息提示
+ msg(content: string) {
+ ElMessage.info(content)
+ },
+ // 错误消息
+ msgError(content: string) {
+ ElMessage.error(content)
+ },
+ // 成功消息
+ msgSuccess(content: string) {
+ ElMessage.success(content)
+ },
+ // 警告消息
+ msgWarning(content: string) {
+ ElMessage.warning(content)
+ },
+ // 弹出提示
+ alert(content: string) {
+ ElMessageBox.alert(content, t('common.confirmTitle'))
+ },
+ // 错误提示
+ alertError(content: string) {
+ ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'error' })
+ },
+ // 成功提示
+ alertSuccess(content: string) {
+ ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'success' })
+ },
+ // 警告提示
+ alertWarning(content: string) {
+ ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'warning' })
+ },
+ // 通知提示
+ notify(content: string) {
+ ElNotification.info(content)
+ },
+ // 错误通知
+ notifyError(content: string) {
+ ElNotification.error(content)
+ },
+ // 成功通知
+ notifySuccess(content: string) {
+ ElNotification.success(content)
+ },
+ // 警告通知
+ notifyWarning(content: string) {
+ ElNotification.warning(content)
+ },
+ // 确认窗体
+ confirm(content: string) {
+ return ElMessageBox.confirm(content, t('common.confirmTitle'), {
+ confirmButtonText: t('common.ok'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ })
+ },
+ // 提交内容
+ prompt(content: string) {
+ return ElMessageBox.prompt(content, t('common.confirmTitle'), {
+ confirmButtonText: t('common.ok'),
+ cancelButtonText: t('common.cancel'),
+ type: 'warning'
+ })
+ }
+}
+
+export default message
diff --git a/yudao-ui-admin-vue3/src/plugins/svgIcon/index.ts b/yudao-ui-admin-vue3/src/plugins/svgIcon/index.ts
new file mode 100644
index 0000000000..b5b7f70d52
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/svgIcon/index.ts
@@ -0,0 +1,3 @@
+import 'virtual:svg-icons-register'
+
+import '@purge-icons/generated'
diff --git a/yudao-ui-admin-vue3/src/plugins/vueI18n/helper.ts b/yudao-ui-admin-vue3/src/plugins/vueI18n/helper.ts
new file mode 100644
index 0000000000..da6bc8c907
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/vueI18n/helper.ts
@@ -0,0 +1,3 @@
+export const setHtmlPageLang = (locale: LocaleType) => {
+ document.querySelector('html')?.setAttribute('lang', locale)
+}
diff --git a/yudao-ui-admin-vue3/src/plugins/vueI18n/index.ts b/yudao-ui-admin-vue3/src/plugins/vueI18n/index.ts
new file mode 100644
index 0000000000..f845b13f72
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/vueI18n/index.ts
@@ -0,0 +1,42 @@
+import type { App } from 'vue'
+import { createI18n } from 'vue-i18n'
+import { useLocaleStoreWithOut } from '@/store/modules/locale'
+import type { I18n, I18nOptions } from 'vue-i18n'
+import { setHtmlPageLang } from './helper'
+
+export let i18n: ReturnType
+
+const createI18nOptions = async (): Promise => {
+ const localeStore = useLocaleStoreWithOut()
+ const locale = localeStore.getCurrentLocale
+ const localeMap = localeStore.getLocaleMap
+ const defaultLocal = await import(`../../locales/${locale.lang}.ts`)
+ const message = defaultLocal.default ?? {}
+
+ setHtmlPageLang(locale.lang)
+
+ localeStore.setCurrentLocale({
+ lang: locale.lang
+ // elLocale: elLocal
+ })
+
+ return {
+ legacy: false,
+ locale: locale.lang,
+ fallbackLocale: locale.lang,
+ messages: {
+ [locale.lang]: message
+ },
+ availableLocales: localeMap.map((v) => v.lang),
+ sync: true,
+ silentTranslationWarn: true,
+ missingWarn: false,
+ silentFallbackWarn: true
+ }
+}
+
+export const setupI18n = async (app: App) => {
+ const options = await createI18nOptions()
+ i18n = createI18n(options) as I18n
+ app.use(i18n)
+}
diff --git a/yudao-ui-admin-vue3/src/plugins/windi.css/index.ts b/yudao-ui-admin-vue3/src/plugins/windi.css/index.ts
new file mode 100644
index 0000000000..dbdfbbf226
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/plugins/windi.css/index.ts
@@ -0,0 +1,3 @@
+import 'virtual:windi.css'
+
+import 'virtual:windi-devtools'
diff --git a/yudao-ui-admin-vue3/src/router/index.ts b/yudao-ui-admin-vue3/src/router/index.ts
new file mode 100644
index 0000000000..3b3921e362
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/router/index.ts
@@ -0,0 +1,107 @@
+import type { App } from 'vue'
+import { getAccessToken } from '@/utils/auth'
+import type { RouteRecordRaw } from 'vue-router'
+import remainingRouter from './modules/remaining'
+import { useCache } from '@/hooks/web/useCache'
+import { useTitle } from '@/hooks/web/useTitle'
+import { useNProgress } from '@/hooks/web/useNProgress'
+import { usePageLoading } from '@/hooks/web/usePageLoading'
+import { createRouter, createWebHashHistory } from 'vue-router'
+import { usePermissionStoreWithOut } from '@/store/modules/permission'
+import { useDictStoreWithOut } from '@/store/modules/dict'
+import { listSimpleDictDataApi } from '@/api/system/dict/dict.data'
+
+const permissionStore = usePermissionStoreWithOut()
+
+const dictStore = useDictStoreWithOut()
+
+const { wsCache } = useCache()
+
+const { start, done } = useNProgress()
+
+const { loadStart, loadDone } = usePageLoading()
+
+// 创建路由实例
+const router = createRouter({
+ history: createWebHashHistory(),
+ strict: true,
+ routes: remainingRouter as RouteRecordRaw[],
+ // routes: constantRoutes.concat(...remainingRouter),
+ scrollBehavior: () => ({ left: 0, top: 0 })
+})
+
+// 路由白名单
+const whiteList = [
+ '/login',
+ '/social-login',
+ '/auth-redirect',
+ '/bind',
+ '/register',
+ '/oauthLogin/gitee'
+]
+
+// 路由加载前
+router.beforeEach(async (to, from, next) => {
+ start()
+ loadStart()
+ if (getAccessToken()) {
+ if (to.path === '/login') {
+ next({ path: '/' })
+ } else {
+ if (!dictStore.getIsSetDict) {
+ // 获取所有字典
+ const res = await listSimpleDictDataApi()
+ if (res) {
+ dictStore.setDictMap(res)
+ dictStore.setIsSetDict(true)
+ }
+ }
+ if (permissionStore.getIsAddRouters) {
+ next()
+ return
+ }
+ // 开发者可根据实际情况进行修改
+ const roleRouters = wsCache.get('roleRouters') || []
+
+ await permissionStore.generateRoutes(roleRouters as AppCustomRouteRecordRaw[])
+
+ permissionStore.getAddRouters.forEach((route) => {
+ router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
+ })
+ const redirectPath = from.query.redirect || to.path
+ const redirect = decodeURIComponent(redirectPath as string)
+ const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }
+ permissionStore.setIsAddRouters(true)
+ next(nextData)
+ }
+ } else {
+ if (whiteList.indexOf(to.path) !== -1) {
+ next()
+ } else {
+ next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
+ }
+ }
+})
+
+router.afterEach((to) => {
+ useTitle(to?.meta?.title as string)
+ done() // 结束Progress
+ loadDone()
+})
+
+export const resetRouter = (): void => {
+ const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root']
+ router.getRoutes().forEach((route) => {
+ const { name } = route
+ if (name && !resetWhiteNameList.includes(name as string)) {
+ router.hasRoute(name) && router.removeRoute(name)
+ }
+ })
+ routes: remainingRouter as RouteRecordRaw[]
+}
+
+export const setupRouter = (app: App) => {
+ app.use(router)
+}
+
+export default router
diff --git a/yudao-ui-admin-vue3/src/router/modules/error.ts b/yudao-ui-admin-vue3/src/router/modules/error.ts
new file mode 100644
index 0000000000..30bd0497b8
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/router/modules/error.ts
@@ -0,0 +1,45 @@
+import { Layout } from '@/utils/routerHelper'
+import { useI18n } from '@/hooks/web/useI18n'
+const { t } = useI18n()
+
+const errorRouter = [
+ {
+ path: '/error',
+ component: Layout,
+ redirect: '/error/404',
+ name: 'Error',
+ meta: {
+ title: t('router.errorPage'),
+ icon: 'ci:error',
+ alwaysShow: true
+ },
+ children: [
+ {
+ path: '404-demo',
+ component: () => import('@/views/Error/404.vue'),
+ name: '404Demo',
+ meta: {
+ title: '404'
+ }
+ },
+ {
+ path: '403-demo',
+ component: () => import('@/views/Error/403.vue'),
+ name: '403Demo',
+ meta: {
+ title: '403'
+ }
+ },
+ {
+ path: '500-demo',
+ component: () => import('@/views/Error/500.vue'),
+ name: '500Demo',
+ meta: {
+ title: '500'
+ }
+ }
+ ]
+ }
+]
+
+export default errorRouter
diff --git a/yudao-ui-admin-vue3/src/router/modules/remaining.ts b/yudao-ui-admin-vue3/src/router/modules/remaining.ts
new file mode 100644
index 0000000000..1b48de376b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/router/modules/remaining.ts
@@ -0,0 +1,154 @@
+import { Layout } from '@/utils/routerHelper'
+import { useI18n } from '@/hooks/web/useI18n'
+const { t } = useI18n()
+
+const remainingRouter: AppRouteRecordRaw[] = [
+ {
+ path: '/redirect',
+ component: Layout,
+ name: 'Redirect',
+ children: [
+ {
+ path: '/redirect/:path(.*)',
+ name: 'Redirect',
+ component: () => import('@/views/Redirect/Redirect.vue'),
+ meta: {}
+ }
+ ],
+ meta: {
+ hidden: true,
+ noTagsView: true
+ }
+ },
+ {
+ path: '/',
+ component: Layout,
+ redirect: '/index',
+ name: 'Home',
+ meta: {},
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/Home/Index.vue'),
+ name: 'Index',
+ meta: {
+ title: t('router.home'),
+ icon: 'ep:home-filled',
+ noCache: true,
+ affix: true
+ }
+ }
+ ]
+ },
+ {
+ path: '/user',
+ component: Layout,
+ name: 'User',
+ meta: {
+ hidden: true
+ },
+ children: [
+ {
+ path: 'profile',
+ component: () => import('@/views/Profile/Index.vue'),
+ name: 'Profile',
+ meta: {
+ hidden: true,
+ icon: 'ep:user',
+ canTo: true,
+ title: t('common.profile')
+ }
+ }
+ ]
+ },
+ {
+ path: '/codegen',
+ component: Layout,
+ name: 'Codegen',
+ meta: {
+ hidden: true
+ },
+ children: [
+ {
+ path: 'edit',
+ component: () => import('@/views/infra/codegen/EditTable.vue'),
+ name: 'EditTable',
+ meta: {
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ canTo: true,
+ icon: 'ep:edit',
+ title: '修改生成配置',
+ activeMenu: 'infra/codegen/index'
+ }
+ }
+ ]
+ },
+ {
+ path: '/job',
+ component: Layout,
+ name: 'Job',
+ meta: {
+ hidden: true
+ },
+ children: [
+ {
+ path: 'job-log',
+ component: () => import('@/views/infra/job/JobLog.vue'),
+ name: 'JobLog',
+ meta: {
+ noTagsView: true,
+ noCache: true,
+ hidden: true,
+ canTo: true,
+ icon: 'ep:edit',
+ title: '调度日志',
+ activeMenu: 'infra/job/index'
+ }
+ }
+ ]
+ },
+ {
+ path: '/login',
+ component: () => import('@/views/Login/Login.vue'),
+ name: 'Login',
+ meta: {
+ hidden: true,
+ title: t('router.login'),
+ noTagsView: true
+ }
+ },
+ {
+ path: '/403',
+ component: () => import('@/views/Error/403.vue'),
+ name: 'NoAccess',
+ meta: {
+ hidden: true,
+ title: '403',
+ noTagsView: true
+ }
+ },
+ {
+ path: '/404',
+ component: () => import('@/views/Error/404.vue'),
+ name: 'NoFound',
+ meta: {
+ hidden: true,
+ title: '404',
+ noTagsView: true
+ }
+ },
+ {
+ path: '/500',
+ component: () => import('@/views/Error/500.vue'),
+ name: 'Error',
+ meta: {
+ hidden: true,
+ title: '500',
+ noTagsView: true
+ }
+ }
+]
+
+export default remainingRouter
diff --git a/yudao-ui-admin-vue3/src/store/index.ts b/yudao-ui-admin-vue3/src/store/index.ts
new file mode 100644
index 0000000000..4038068bec
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/store/index.ts
@@ -0,0 +1,13 @@
+import type { App } from 'vue'
+import { createPinia } from 'pinia'
+import piniaPluginPersist from 'pinia-plugin-persist'
+
+const store = createPinia()
+
+store.use(piniaPluginPersist)
+
+export const setupStore = (app: App) => {
+ app.use(store)
+}
+
+export { store }
diff --git a/yudao-ui-admin-vue3/src/store/modules/app.ts b/yudao-ui-admin-vue3/src/store/modules/app.ts
new file mode 100644
index 0000000000..8f00ed189f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/store/modules/app.ts
@@ -0,0 +1,177 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { useCache } from '@/hooks/web/useCache'
+import { appModules } from '@/config/app'
+import type { AppState, LayoutType, ThemeTypes } from '@/config/app'
+import { setCssVar, humpToUnderline } from '@/utils'
+import { ElMessage } from 'element-plus'
+
+const { wsCache } = useCache()
+
+export const useAppStore = defineStore({
+ id: 'app',
+ state: (): AppState => appModules,
+ persist: {
+ enabled: true
+ },
+ getters: {
+ getBreadcrumb(): boolean {
+ return this.breadcrumb
+ },
+ getBreadcrumbIcon(): boolean {
+ return this.breadcrumbIcon
+ },
+ getCollapse(): boolean {
+ return this.collapse
+ },
+ getUniqueOpened(): boolean {
+ return this.uniqueOpened
+ },
+ getHamburger(): boolean {
+ return this.hamburger
+ },
+ getScreenfull(): boolean {
+ return this.screenfull
+ },
+ getSize(): boolean {
+ return this.size
+ },
+ getLocale(): boolean {
+ return this.locale
+ },
+ getTagsView(): boolean {
+ return this.tagsView
+ },
+ getTagsViewIcon(): boolean {
+ return this.tagsViewIcon
+ },
+ getLogo(): boolean {
+ return this.logo
+ },
+ getFixedHeader(): boolean {
+ return this.fixedHeader
+ },
+ getGreyMode(): boolean {
+ return this.greyMode
+ },
+ getPageLoading(): boolean {
+ return this.pageLoading
+ },
+ getLayout(): LayoutType {
+ return this.layout
+ },
+ getTitle(): string {
+ return this.title
+ },
+ getUserInfo(): string {
+ return this.userInfo
+ },
+ getIsDark(): boolean {
+ return this.isDark
+ },
+ getCurrentSize(): ElememtPlusSize {
+ return this.currentSize
+ },
+ getSizeMap(): ElememtPlusSize[] {
+ return this.sizeMap
+ },
+ getMobile(): boolean {
+ return this.mobile
+ },
+ getTheme(): ThemeTypes {
+ return this.theme
+ },
+ getFooter(): boolean {
+ return this.footer
+ }
+ },
+ actions: {
+ setBreadcrumb(breadcrumb: boolean) {
+ this.breadcrumb = breadcrumb
+ },
+ setBreadcrumbIcon(breadcrumbIcon: boolean) {
+ this.breadcrumbIcon = breadcrumbIcon
+ },
+ setCollapse(collapse: boolean) {
+ this.collapse = collapse
+ },
+ setUniqueOpened(uniqueOpened: boolean) {
+ this.uniqueOpened = uniqueOpened
+ },
+ setHamburger(hamburger: boolean) {
+ this.hamburger = hamburger
+ },
+ setScreenfull(screenfull: boolean) {
+ this.screenfull = screenfull
+ },
+ setSize(size: boolean) {
+ this.size = size
+ },
+ setLocale(locale: boolean) {
+ this.locale = locale
+ },
+ setTagsView(tagsView: boolean) {
+ this.tagsView = tagsView
+ },
+ setTagsViewIcon(tagsViewIcon: boolean) {
+ this.tagsViewIcon = tagsViewIcon
+ },
+ setLogo(logo: boolean) {
+ this.logo = logo
+ },
+ setFixedHeader(fixedHeader: boolean) {
+ this.fixedHeader = fixedHeader
+ },
+ setGreyMode(greyMode: boolean) {
+ this.greyMode = greyMode
+ },
+ setPageLoading(pageLoading: boolean) {
+ this.pageLoading = pageLoading
+ },
+ setLayout(layout: LayoutType) {
+ if (this.mobile && layout !== 'classic') {
+ ElMessage.warning('移动端模式下不支持切换其他布局')
+ return
+ }
+ this.layout = layout
+ wsCache.set('layout', this.layout)
+ },
+ setTitle(title: string) {
+ this.title = title
+ },
+ setIsDark(isDark: boolean) {
+ this.isDark = isDark
+ if (this.isDark) {
+ document.documentElement.classList.add('dark')
+ document.documentElement.classList.remove('light')
+ } else {
+ document.documentElement.classList.add('light')
+ document.documentElement.classList.remove('dark')
+ }
+ wsCache.set('isDark', this.isDark)
+ },
+ setCurrentSize(currentSize: ElememtPlusSize) {
+ this.currentSize = currentSize
+ wsCache.set('currentSize', this.currentSize)
+ },
+ setMobile(mobile: boolean) {
+ this.mobile = mobile
+ },
+ setTheme(theme: ThemeTypes) {
+ this.theme = Object.assign(this.theme, theme)
+ wsCache.set('theme', this.theme)
+ },
+ setCssVarTheme() {
+ for (const key in this.theme) {
+ setCssVar(`--${humpToUnderline(key)}`, this.theme[key])
+ }
+ },
+ setFooter(footer: boolean) {
+ this.footer = footer
+ }
+ }
+})
+
+export const useAppStoreWithOut = () => {
+ return useAppStore(store)
+}
diff --git a/yudao-ui-admin-vue3/src/store/modules/dict.ts b/yudao-ui-admin-vue3/src/store/modules/dict.ts
new file mode 100644
index 0000000000..11ee352c1b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/store/modules/dict.ts
@@ -0,0 +1,65 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { DictDataVO } from '@/api/system/dict/types'
+
+export interface DictValueType {
+ value: string
+ label: string
+ clorType: string
+ cssClass: string
+}
+export interface DictTypeType {
+ dictType: string
+ dictValue: DictValueType[]
+}
+export interface DictState {
+ isSetDict: boolean
+ dictMap: Recordable
+}
+
+export const useDictStore = defineStore({
+ id: 'dict',
+ state: (): DictState => ({
+ isSetDict: false,
+ dictMap: {}
+ }),
+ persist: {
+ enabled: true
+ },
+ getters: {
+ getDictMap(): Recordable {
+ return this.dictMap
+ },
+ getIsSetDict(): boolean {
+ return this.isSetDict
+ }
+ },
+ actions: {
+ setDictMap(dictMap: Recordable) {
+ // 设置数据
+ const dictDataMap = {}
+ dictMap.forEach((dictData: DictDataVO) => {
+ // 获得 dictType 层级
+ const enumValueObj = dictDataMap[dictData.dictType]
+ if (!enumValueObj) {
+ dictDataMap[dictData.dictType] = []
+ }
+ // 处理 dictValue 层级
+ dictDataMap[dictData.dictType].push({
+ value: dictData.value,
+ label: dictData.label,
+ colorType: dictData.colorType,
+ cssClass: dictData.cssClass
+ })
+ })
+ this.dictMap = dictMap
+ },
+ setIsSetDict(isSetDict: boolean) {
+ this.isSetDict = isSetDict
+ }
+ }
+})
+
+export const useDictStoreWithOut = () => {
+ return useDictStore(store)
+}
diff --git a/yudao-ui-admin-vue3/src/store/modules/locale.ts b/yudao-ui-admin-vue3/src/store/modules/locale.ts
new file mode 100644
index 0000000000..4b7d0640c0
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/store/modules/locale.ts
@@ -0,0 +1,35 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { useCache } from '@/hooks/web/useCache'
+import { localeModules, elLocaleMap } from '@/config/locale'
+import type { LocaleState } from '@/config/locale'
+
+const { wsCache } = useCache()
+
+export const useLocaleStore = defineStore({
+ id: 'locales',
+ state: (): LocaleState => localeModules,
+ persist: {
+ enabled: true
+ },
+ getters: {
+ getCurrentLocale(): LocaleDropdownType {
+ return this.currentLocale
+ },
+ getLocaleMap(): LocaleDropdownType[] {
+ return this.localeMap
+ }
+ },
+ actions: {
+ setCurrentLocale(localeMap: LocaleDropdownType) {
+ // this.locale = Object.assign(this.locale, localeMap)
+ this.currentLocale.lang = localeMap?.lang
+ this.currentLocale.elLocale = elLocaleMap[localeMap?.lang]
+ wsCache.set('lang', localeMap?.lang)
+ }
+ }
+})
+
+export const useLocaleStoreWithOut = () => {
+ return useLocaleStore(store)
+}
diff --git a/yudao-ui-admin-vue3/src/store/modules/permission.ts b/yudao-ui-admin-vue3/src/store/modules/permission.ts
new file mode 100644
index 0000000000..dfce2949cf
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/store/modules/permission.ts
@@ -0,0 +1,72 @@
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { cloneDeep } from 'lodash-es'
+import remainingRouter from '@/router/modules/remaining'
+import { generateRoutes, flatMultiLevelRoutes } from '@/utils/routerHelper'
+
+export interface PermissionState {
+ routers: AppRouteRecordRaw[]
+ addRouters: AppRouteRecordRaw[]
+ isAddRouters: boolean
+ menuTabRouters: AppRouteRecordRaw[]
+}
+
+export const usePermissionStore = defineStore({
+ id: 'permission',
+ state: (): PermissionState => ({
+ routers: [],
+ addRouters: [],
+ isAddRouters: false,
+ menuTabRouters: []
+ }),
+ persist: {
+ enabled: true
+ },
+ getters: {
+ getRouters(): AppRouteRecordRaw[] {
+ return this.routers
+ },
+ getAddRouters(): AppRouteRecordRaw[] {
+ return flatMultiLevelRoutes(cloneDeep(this.addRouters))
+ },
+ getIsAddRouters(): boolean {
+ return this.isAddRouters
+ },
+ getMenuTabRouters(): AppRouteRecordRaw[] {
+ return this.menuTabRouters
+ }
+ },
+ actions: {
+ generateRoutes(routers?: AppCustomRouteRecordRaw[] | string[]): Promise {
+ return new Promise((resolve) => {
+ let routerMap: AppRouteRecordRaw[] = []
+ routerMap = generateRoutes(routers as AppCustomRouteRecordRaw[])
+ // 动态路由,404一定要放到最后面
+ this.addRouters = routerMap.concat([
+ {
+ path: '/:path(.*)*',
+ redirect: '/404',
+ name: '404Page',
+ meta: {
+ hidden: true,
+ breadcrumb: false
+ }
+ }
+ ])
+ // 渲染菜单的所有路由
+ this.routers = cloneDeep(remainingRouter).concat(routerMap)
+ resolve()
+ })
+ },
+ setIsAddRouters(state: boolean): void {
+ this.isAddRouters = state
+ },
+ setMenuTabRouters(routers: AppRouteRecordRaw[]): void {
+ this.menuTabRouters = routers
+ }
+ }
+})
+
+export const usePermissionStoreWithOut = () => {
+ return usePermissionStore(store)
+}
diff --git a/yudao-ui-admin-vue3/src/store/modules/tagsView.ts b/yudao-ui-admin-vue3/src/store/modules/tagsView.ts
new file mode 100644
index 0000000000..33da805de2
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/store/modules/tagsView.ts
@@ -0,0 +1,141 @@
+import router from '@/router'
+import type { RouteLocationNormalizedLoaded } from 'vue-router'
+import { getRawRoute } from '@/utils/routerHelper'
+import { defineStore } from 'pinia'
+import { store } from '../index'
+import { findIndex } from '@/utils'
+
+export interface TagsViewState {
+ visitedViews: RouteLocationNormalizedLoaded[]
+ cachedViews: Set
+}
+
+export const useTagsViewStore = defineStore({
+ id: 'tagsView',
+ state: (): TagsViewState => ({
+ visitedViews: [],
+ cachedViews: new Set()
+ }),
+ getters: {
+ getVisitedViews(): RouteLocationNormalizedLoaded[] {
+ return this.visitedViews
+ },
+ getCachedViews(): string[] {
+ return Array.from(this.cachedViews)
+ }
+ },
+ actions: {
+ // 新增缓存和tag
+ addView(view: RouteLocationNormalizedLoaded): void {
+ this.addVisitedView(view)
+ this.addCachedView()
+ },
+ // 新增tag
+ addVisitedView(view: RouteLocationNormalizedLoaded) {
+ if (this.visitedViews.some((v) => v.path === view.path)) return
+ if (view.meta?.noTagsView) return
+ this.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta?.title || 'no-name'
+ })
+ )
+ },
+ // 新增缓存
+ addCachedView() {
+ const cacheMap: Set = new Set()
+ for (const v of this.visitedViews) {
+ const item = getRawRoute(v)
+ const needCache = !item.meta?.noCache
+ if (!needCache) {
+ continue
+ }
+ const name = item.name as string
+ cacheMap.add(name)
+ }
+ if (Array.from(this.cachedViews).sort().toString() === Array.from(cacheMap).sort().toString())
+ return
+ this.cachedViews = cacheMap
+ },
+ // 删除某个
+ delView(view: RouteLocationNormalizedLoaded) {
+ this.delVisitedView(view)
+ this.addCachedView()
+ },
+ // 删除tag
+ delVisitedView(view: RouteLocationNormalizedLoaded) {
+ for (const [i, v] of this.visitedViews.entries()) {
+ if (v.path === view.path) {
+ this.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ },
+ // 删除缓存
+ delCachedView() {
+ const route = router.currentRoute.value
+ const index = findIndex(this.getCachedViews, (v) => v === route.name)
+ if (index > -1) {
+ this.cachedViews.delete(this.getCachedViews[index])
+ }
+ },
+ // 删除所有缓存和tag
+ delAllViews() {
+ this.delAllVisitedViews()
+ this.addCachedView()
+ },
+ // 删除所有tag
+ delAllVisitedViews() {
+ // const affixTags = this.visitedViews.filter((tag) => tag.meta.affix)
+ this.visitedViews = []
+ },
+ // 删除其他
+ delOthersViews(view: RouteLocationNormalizedLoaded) {
+ this.delOthersVisitedViews(view)
+ this.addCachedView()
+ },
+ // 删除其他tag
+ delOthersVisitedViews(view: RouteLocationNormalizedLoaded) {
+ this.visitedViews = this.visitedViews.filter((v) => {
+ return v?.meta?.affix || v.path === view.path
+ })
+ },
+ // 删除左侧
+ delLeftViews(view: RouteLocationNormalizedLoaded) {
+ const index = findIndex(
+ this.visitedViews,
+ (v) => v.path === view.path
+ )
+ if (index > -1) {
+ this.visitedViews = this.visitedViews.filter((v, i) => {
+ return v?.meta?.affix || v.path === view.path || i > index
+ })
+ this.addCachedView()
+ }
+ },
+ // 删除右侧
+ delRightViews(view: RouteLocationNormalizedLoaded) {
+ const index = findIndex(
+ this.visitedViews,
+ (v) => v.path === view.path
+ )
+ if (index > -1) {
+ this.visitedViews = this.visitedViews.filter((v, i) => {
+ return v?.meta?.affix || v.path === view.path || i < index
+ })
+ this.addCachedView()
+ }
+ },
+ updateVisitedView(view: RouteLocationNormalizedLoaded) {
+ for (let v of this.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ }
+ }
+})
+
+export const useTagsViewStoreWithOut = () => {
+ return useTagsViewStore(store)
+}
diff --git a/yudao-ui-admin-vue3/src/store/modules/user.ts b/yudao-ui-admin-vue3/src/store/modules/user.ts
new file mode 100644
index 0000000000..aaa3a2017d
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/store/modules/user.ts
@@ -0,0 +1,56 @@
+import { store } from '../index'
+import { defineStore } from 'pinia'
+import { getInfoApi } from '@/api/login'
+import { getAccessToken } from '@/utils/auth'
+import { useCache } from '@/hooks/web/useCache'
+
+interface UserInfoVO {
+ permissions: []
+ roles: []
+ user: {
+ avatar: string
+ id: number
+ nickname: string
+ }
+}
+const { wsCache } = useCache()
+
+export const useUserStore = defineStore({
+ id: 'admin-user',
+ state: (): UserInfoVO => ({
+ permissions: [],
+ roles: [],
+ user: {
+ id: 0,
+ avatar: '',
+ nickname: ''
+ }
+ }),
+ actions: {
+ // TODO 设置store刷新页面就消失
+ async getUserInfoAction() {
+ if (!getAccessToken()) {
+ this.resetState()
+ return null
+ }
+ const res = await getInfoApi()
+ this.permissions = res.permissions
+ this.roles = res.roles
+ this.user = res.user
+ wsCache.set('user', res)
+ },
+ resetState() {
+ this.permissions = []
+ this.roles = []
+ this.user = {
+ id: 0,
+ avatar: '',
+ nickname: ''
+ }
+ }
+ }
+})
+
+export const useUserStoreWithOut = () => {
+ return useUserStore(store)
+}
diff --git a/yudao-ui-admin-vue3/src/styles/index.less b/yudao-ui-admin-vue3/src/styles/index.less
new file mode 100644
index 0000000000..3b539c5b46
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/styles/index.less
@@ -0,0 +1,2 @@
+@import './var.css';
+@import 'element-plus/theme-chalk/dark/css-vars.css';
\ No newline at end of file
diff --git a/yudao-ui-admin-vue3/src/styles/theme.less b/yudao-ui-admin-vue3/src/styles/theme.less
new file mode 100644
index 0000000000..39b03b3dda
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/styles/theme.less
@@ -0,0 +1,6 @@
+// .text-color {
+// color: var(--el-text-color-regular);
+// }
+// .dark .dark\:text-color {
+// color: rgba(255, 255, 255, var(--dark-text-color));
+// }
diff --git a/yudao-ui-admin-vue3/src/styles/var.css b/yudao-ui-admin-vue3/src/styles/var.css
new file mode 100644
index 0000000000..23d8b68248
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/styles/var.css
@@ -0,0 +1,67 @@
+:root {
+ --dark-bg-color: #293146;
+
+ /* left menu start */
+ --left-menu-border-color: '#eee';
+
+ --left-menu-max-width: 200px;
+
+ --left-menu-min-width: 64px;
+
+ --left-menu-bg-color: #001529;
+
+ --left-menu-bg-light-color: #0f2438;
+
+ --left-menu-bg-active-color: var(--el-color-primary);
+
+ --left-menu-text-color: #bfcbd9;
+
+ --left-menu-text-active-color: #fff;
+
+ --left-menu-collapse-bg-active-color: var(--el-color-primary);
+ /* left menu end */
+
+ /* logo start */
+ --logo-height: 50px;
+
+ --logo-title-text-color: #fff;
+
+ --logo-border-color: 'inherit';
+ /* logo end */
+
+ /* header start */
+ --top-header-bg-color: '#fff';
+
+ --top-header-text-color: 'inherit';
+
+ --top-header-hover-color: #f6f6f6;
+
+ --top-tool-height: var(--logo-height);
+
+ --top-tool-p-x: 0;
+
+ --top-tool-border-color: #eee;
+
+ --tags-view-height: 35px;
+
+ --tags-view-border-color: #eee;
+ /* header start */
+
+ /* tab menu start */
+ --tab-menu-max-width: 80px;
+
+ --tab-menu-min-width: 30px;
+
+ --tab-menu-collapse-height: 36px;
+
+ --tab-menu-border-color: #eee;
+ /* tab menu end */
+
+ --app-content-padding: 20px;
+
+ --app-contnet-bg-color: #f5f7f9;
+
+ --app-footer-height: 50px;
+
+ --transition-time-02: 0.2s;
+}
diff --git a/yudao-ui-admin-vue3/src/styles/variables.module.less b/yudao-ui-admin-vue3/src/styles/variables.module.less
new file mode 100644
index 0000000000..e97028d229
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/styles/variables.module.less
@@ -0,0 +1,10 @@
+// 命名空间
+@namespace: v;
+// el命名空间
+@elNamespace: el;
+
+// 导出变量
+:export {
+ namespace: @namespace;
+ elNamespace: @elNamespace;
+}
diff --git a/yudao-ui-admin-vue3/src/utils/auth.ts b/yudao-ui-admin-vue3/src/utils/auth.ts
new file mode 100644
index 0000000000..4588567fc6
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/auth.ts
@@ -0,0 +1,29 @@
+import { useCache } from '@/hooks/web/useCache'
+import { TokenType } from '@/api/login/types'
+
+const { wsCache } = useCache()
+const AccessTokenKey = 'ACCESS_TOKEN'
+const RefreshTokenKey = 'REFRESH_TOKEN'
+
+// 获取token
+export function getAccessToken() {
+ // 此处与TokenKey相同,此写法解决初始化时Cookies中不存在TokenKey报错
+ return wsCache.get('ACCESS_TOKEN')
+}
+
+// 刷新token
+export function getRefreshToken() {
+ return wsCache.get(RefreshTokenKey)
+}
+
+// 设置token
+export function setToken(token: TokenType) {
+ wsCache.set(RefreshTokenKey, token.refreshToken, { exp: token.expiresTime })
+ wsCache.set(AccessTokenKey, token.accessToken)
+}
+
+// 删除token
+export function removeToken() {
+ wsCache.delete(AccessTokenKey)
+ wsCache.delete(RefreshTokenKey)
+}
diff --git a/yudao-ui-admin-vue3/src/utils/builder.ts b/yudao-ui-admin-vue3/src/utils/builder.ts
new file mode 100644
index 0000000000..7ec8c68896
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/builder.ts
@@ -0,0 +1,130 @@
+import { required as requiredRule } from '@/utils/formRules'
+import dayjs from 'dayjs'
+import { useI18n } from '@/hooks/web/useI18n'
+const { t } = useI18n() // 国际化
+
+export class FormSchemaBuilder {
+ static input(label: string, field: string, required: Boolean = false): FormSchema {
+ return {
+ label,
+ field,
+ component: 'Input',
+ formItemProps: {
+ rules: required ? [requiredRule] : []
+ }
+ }
+ }
+ static inputNumber(
+ label: string,
+ field: string,
+ value: number,
+ required: Boolean = false
+ ): FormSchema {
+ return {
+ label,
+ field,
+ value,
+ component: 'InputNumber',
+ formItemProps: {
+ rules: required ? [requiredRule] : []
+ }
+ }
+ }
+ static radioButton(
+ label: string,
+ field: string,
+ value: number,
+ options: ComponentOptions[],
+ required: Boolean = false
+ ): FormSchema {
+ return {
+ label,
+ field,
+ component: 'RadioButton',
+ value,
+ formItemProps: {
+ rules: required ? [requiredRule] : []
+ },
+ componentProps: {
+ options
+ }
+ }
+ }
+ static select(
+ label: string,
+ field: string,
+ value: number | null,
+ options: ComponentOptions[],
+ required: Boolean = false
+ ): FormSchema {
+ return {
+ label,
+ field,
+ component: 'Select',
+ value,
+ formItemProps: {
+ rules: required ? [requiredRule] : []
+ },
+ componentProps: {
+ options
+ }
+ }
+ }
+ static textarea(
+ label: string,
+ field: string,
+ rows: number,
+ span: number,
+ required: Boolean = false
+ ): FormSchema {
+ return {
+ label,
+ field,
+ component: 'Input',
+ componentProps: {
+ type: 'textarea',
+ rows: rows
+ },
+ formItemProps: {
+ rules: required ? [requiredRule] : []
+ },
+ colProps: {
+ span: span
+ }
+ }
+ }
+}
+
+export class TableColumnBuilder {
+ static column(label: string, field: string): TableColumn {
+ return {
+ label,
+ field
+ }
+ }
+ static date(label: string, field: string, template?: string): TableColumn {
+ return {
+ label,
+ field,
+ formatter: (_: Recordable, __: TableColumn, cellValue: string) => {
+ return dayjs(cellValue).format(template || 'YYYY-MM-DD HH:mm:ss')
+ }
+ }
+ }
+ static action(width: number): TableColumn {
+ return {
+ label: t('table.action'),
+ field: 'action',
+ width: width + 'px'
+ }
+ }
+}
+
+export class ComponentOptionsBuilder {
+ static option(label: string, value: number): ComponentOptions {
+ return {
+ label,
+ value
+ }
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/utils/color.ts b/yudao-ui-admin-vue3/src/utils/color.ts
new file mode 100644
index 0000000000..6888583a7e
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/color.ts
@@ -0,0 +1,153 @@
+/**
+ * 判断是否 十六进制颜色值.
+ * 输入形式可为 #fff000 #f00
+ *
+ * @param String color 十六进制颜色值
+ * @return Boolean
+ */
+export const isHexColor = (color: string) => {
+ const reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-f]{6})$/
+ return reg.test(color)
+}
+
+/**
+ * RGB 颜色值转换为 十六进制颜色值.
+ * r, g, 和 b 需要在 [0, 255] 范围内
+ *
+ * @return String 类似#ff00ff
+ * @param r
+ * @param g
+ * @param b
+ */
+export const rgbToHex = (r: number, g: number, b: number) => {
+ // tslint:disable-next-line:no-bitwise
+ const hex = ((r << 16) | (g << 8) | b).toString(16)
+ return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex
+}
+
+/**
+ * Transform a HEX color to its RGB representation
+ * @param {string} hex The color to transform
+ * @returns The RGB representation of the passed color
+ */
+export const hexToRGB = (hex: string, opacity?: number) => {
+ let sHex = hex.toLowerCase()
+ if (isHexColor(hex)) {
+ if (sHex.length === 4) {
+ let sColorNew = '#'
+ for (let i = 1; i < 4; i += 1) {
+ sColorNew += sHex.slice(i, i + 1).concat(sHex.slice(i, i + 1))
+ }
+ sHex = sColorNew
+ }
+ const sColorChange: number[] = []
+ for (let i = 1; i < 7; i += 2) {
+ sColorChange.push(parseInt('0x' + sHex.slice(i, i + 2)))
+ }
+ return opacity
+ ? 'RGBA(' + sColorChange.join(',') + ',' + opacity + ')'
+ : 'RGB(' + sColorChange.join(',') + ')'
+ }
+ return sHex
+}
+
+export const colorIsDark = (color: string) => {
+ if (!isHexColor(color)) return
+ const [r, g, b] = hexToRGB(color)
+ .replace(/(?:\(|\)|rgb|RGB)*/g, '')
+ .split(',')
+ .map((item) => Number(item))
+ return r * 0.299 + g * 0.578 + b * 0.114 < 192
+}
+
+/**
+ * Darkens a HEX color given the passed percentage
+ * @param {string} color The color to process
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The HEX representation of the processed color
+ */
+export const darken = (color: string, amount: number) => {
+ color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color
+ amount = Math.trunc((255 * amount) / 100)
+ return `#${subtractLight(color.substring(0, 2), amount)}${subtractLight(
+ color.substring(2, 4),
+ amount
+ )}${subtractLight(color.substring(4, 6), amount)}`
+}
+
+/**
+ * Lightens a 6 char HEX color according to the passed percentage
+ * @param {string} color The color to change
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The processed color represented as HEX
+ */
+export const lighten = (color: string, amount: number) => {
+ color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color
+ amount = Math.trunc((255 * amount) / 100)
+ return `#${addLight(color.substring(0, 2), amount)}${addLight(
+ color.substring(2, 4),
+ amount
+ )}${addLight(color.substring(4, 6), amount)}`
+}
+
+/* Suma el porcentaje indicado a un color (RR, GG o BB) hexadecimal para aclararlo */
+/**
+ * Sums the passed percentage to the R, G or B of a HEX color
+ * @param {string} color The color to change
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The processed part of the color
+ */
+const addLight = (color: string, amount: number) => {
+ const cc = parseInt(color, 16) + amount
+ const c = cc > 255 ? 255 : cc
+ return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`
+}
+
+/**
+ * Calculates luminance of an rgb color
+ * @param {number} r red
+ * @param {number} g green
+ * @param {number} b blue
+ */
+const luminanace = (r: number, g: number, b: number) => {
+ const a = [r, g, b].map((v) => {
+ v /= 255
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)
+ })
+ return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722
+}
+
+/**
+ * Calculates contrast between two rgb colors
+ * @param {string} rgb1 rgb color 1
+ * @param {string} rgb2 rgb color 2
+ */
+const contrast = (rgb1: string[], rgb2: number[]) => {
+ return (
+ (luminanace(~~rgb1[0], ~~rgb1[1], ~~rgb1[2]) + 0.05) /
+ (luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05)
+ )
+}
+
+/**
+ * Determines what the best text color is (black or white) based con the contrast with the background
+ * @param hexColor - Last selected color by the user
+ */
+export const calculateBestTextColor = (hexColor: string) => {
+ const rgbColor = hexToRGB(hexColor.substring(1))
+ const contrastWithBlack = contrast(rgbColor.split(','), [0, 0, 0])
+
+ return contrastWithBlack >= 12 ? '#000000' : '#FFFFFF'
+}
+
+/**
+ * Subtracts the indicated percentage to the R, G or B of a HEX color
+ * @param {string} color The color to change
+ * @param {number} amount The amount to change the color by
+ * @returns {string} The processed part of the color
+ */
+const subtractLight = (color: string, amount: number) => {
+ const cc = parseInt(color, 16) - amount
+ const c = cc < 0 ? 0 : cc
+ return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`
+}
diff --git a/yudao-ui-admin-vue3/src/utils/constants.ts b/yudao-ui-admin-vue3/src/utils/constants.ts
new file mode 100644
index 0000000000..901c04e922
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/constants.ts
@@ -0,0 +1,218 @@
+/**
+ * Created by 芋道源码
+ *
+ * 枚举类
+ */
+
+// 全局通用状态枚举
+export const CommonStatusEnum = {
+ ENABLE: 0, // 开启
+ DISABLE: 1 // 禁用
+}
+
+/**
+ * 菜单的类型枚举
+ */
+export const SystemMenuTypeEnum = {
+ DIR: 1, // 目录
+ MENU: 2, // 菜单
+ BUTTON: 3 // 按钮
+}
+
+/**
+ * 角色的类型枚举
+ */
+export const SystemRoleTypeEnum = {
+ SYSTEM: 1, // 内置角色
+ CUSTOM: 2 // 自定义角色
+}
+
+/**
+ * 数据权限的范围枚举
+ */
+export const SystemDataScopeEnum = {
+ ALL: 1, // 全部数据权限
+ DEPT_CUSTOM: 2, // 指定部门数据权限
+ DEPT_ONLY: 3, // 部门数据权限
+ DEPT_AND_CHILD: 4, // 部门及以下数据权限
+ DEPT_SELF: 5 // 仅本人数据权限
+}
+
+/**
+ * 代码生成模板类型
+ */
+export const InfraCodegenTemplateTypeEnum = {
+ CRUD: 1, // 基础 CRUD
+ TREE: 2, // 树形 CRUD
+ SUB: 3 // 主子表 CRUD
+}
+
+/**
+ * 任务状态的枚举
+ */
+export const InfraJobStatusEnum = {
+ INIT: 0, // 初始化中
+ NORMAL: 1, // 运行中
+ STOP: 2 // 暂停运行
+}
+
+/**
+ * API 异常数据的处理状态
+ */
+export const InfraApiErrorLogProcessStatusEnum = {
+ INIT: 0, // 未处理
+ DONE: 1, // 已处理
+ IGNORE: 2 // 已忽略
+}
+
+/**
+ * 用户的社交平台的类型枚举
+ */
+export const SystemUserSocialTypeEnum = {
+ DINGTALK: {
+ title: '钉钉',
+ type: 20,
+ source: 'dingtalk',
+ img: 'https://s1.ax1x.com/2022/05/22/OzMDRs.png'
+ },
+ WECHAT_ENTERPRISE: {
+ title: '企业微信',
+ type: 30,
+ source: 'wechat_enterprise',
+ img: 'https://s1.ax1x.com/2022/05/22/OzMrzn.png'
+ }
+}
+
+/**
+ * 支付渠道枚举
+ */
+export const PayChannelEnum = {
+ WX_PUB: {
+ code: 'wx_pub',
+ name: '微信 JSAPI 支付'
+ },
+ WX_LITE: {
+ code: 'wx_lite',
+ name: '微信小程序支付'
+ },
+ WX_APP: {
+ code: 'wx_app',
+ name: '微信 APP 支付'
+ },
+ ALIPAY_PC: {
+ code: 'alipay_pc',
+ name: '支付宝 PC 网站支付'
+ },
+ ALIPAY_WAP: {
+ code: 'alipay_wap',
+ name: '支付宝 WAP 网站支付'
+ },
+ ALIPAY_APP: {
+ code: 'alipay_app',
+ name: '支付宝 APP 支付'
+ },
+ ALIPAY_QR: {
+ code: 'alipay_qr',
+ name: '支付宝扫码支付'
+ }
+}
+
+/**
+ * 支付类型枚举
+ */
+export const PayType = {
+ WECHAT: 'WECHAT',
+ ALIPAY: 'ALIPAY'
+}
+
+/**
+ * 支付订单状态枚举
+ */
+export const PayOrderStatusEnum = {
+ WAITING: {
+ status: 0,
+ name: '未支付'
+ },
+ SUCCESS: {
+ status: 10,
+ name: '已支付'
+ },
+ CLOSED: {
+ status: 20,
+ name: '未支付'
+ }
+}
+
+/**
+ * 支付订单回调状态枚举
+ */
+export const PayOrderNotifyStatusEnum = {
+ NO: {
+ status: 0,
+ name: '未通知'
+ },
+ SUCCESS: {
+ status: 10,
+ name: '通知成功'
+ },
+ FAILURE: {
+ status: 20,
+ name: '通知失败'
+ }
+}
+
+/**
+ * 支付订单退款状态枚举
+ */
+export const PayOrderRefundStatusEnum = {
+ NO: {
+ status: 0,
+ name: '未退款'
+ },
+ SOME: {
+ status: 10,
+ name: '部分退款'
+ },
+ ALL: {
+ status: 20,
+ name: '全部退款'
+ }
+}
+
+/**
+ * 支付退款订单状态枚举
+ */
+export const PayRefundStatusEnum = {
+ CREATE: {
+ status: 0,
+ name: '退款订单生成'
+ },
+ SUCCESS: {
+ status: 1,
+ name: '退款成功'
+ },
+ FAILURE: {
+ status: 2,
+ name: '退款失败'
+ },
+ PROCESSING_NOTIFY: {
+ status: 3,
+ name: '退款中,渠道通知结果'
+ },
+ PROCESSING_QUERY: {
+ status: 4,
+ name: '退款中,系统查询结果'
+ },
+ UNKNOWN_RETRY: {
+ status: 5,
+ name: '状态未知,请重试'
+ },
+ UNKNOWN_QUERY: {
+ status: 6,
+ name: '状态未知,系统查询结果'
+ },
+ CLOSE: {
+ status: 99,
+ name: '退款关闭'
+ }
+}
diff --git a/yudao-ui-admin-vue3/src/utils/dict.ts b/yudao-ui-admin-vue3/src/utils/dict.ts
new file mode 100644
index 0000000000..7b122cba48
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/dict.ts
@@ -0,0 +1,107 @@
+/**
+ * 数据字典工具类
+ */
+import { useDictStoreWithOut } from '@/store/modules/dict'
+
+const dictStore = useDictStoreWithOut()
+
+/**
+ * 获取 dictType 对应的数据字典数组
+ *
+ * @param dictType 数据类型
+ * @returns {*|Array} 数据字典数组
+ */
+export interface DictDataType {
+ dictType: string
+ label: string
+ value: string | number
+ colorType: ElementPlusInfoType | '' | 'default' | 'primary'
+ cssClass: string
+}
+
+export const getDictOptions = (dictType: string) => {
+ const dictOptions: DictDataType[] = []
+ dictStore.getDictMap.forEach((dict: DictDataType) => {
+ if (dict.dictType + '' === dictType) {
+ dictOptions.push(dict)
+ }
+ })
+ return dictOptions
+}
+
+// TODO @芋艿:暂时提供这个方法,主要考虑 ElSelect。下拉如果可以解,就可以不用这个方法
+export const getIntDictOptions = (dictType: string) => {
+ const dictOptions: DictDataType[] = []
+ dictStore.getDictMap.forEach((dict: DictDataType) => {
+ if (dict.dictType + '' === dictType) {
+ dictOptions.push({
+ ...dict,
+ value: parseInt(dict.value + '')
+ })
+ }
+ })
+ return dictOptions
+}
+
+export const getDictObj = (dictType: string, value: string) => {
+ const dictOptions: DictDataType[] = getDictOptions(dictType)
+ dictOptions.forEach((dict: DictDataType) => {
+ if (dict.value === value) {
+ return dict
+ }
+ })
+}
+
+export enum DICT_TYPE {
+ USER_TYPE = 'user_type',
+ COMMON_STATUS = 'common_status',
+ SYSTEM_TENANT_PACKAGE_ID = 'system_tenant_package_id',
+
+ // ========== SYSTEM 模块 ==========
+ SYSTEM_USER_SEX = 'system_user_sex',
+ SYSTEM_MENU_TYPE = 'system_menu_type',
+ SYSTEM_ROLE_TYPE = 'system_role_type',
+ SYSTEM_DATA_SCOPE = 'system_data_scope',
+ SYSTEM_NOTICE_TYPE = 'system_notice_type',
+ SYSTEM_OPERATE_TYPE = 'system_operate_type',
+ SYSTEM_LOGIN_TYPE = 'system_login_type',
+ SYSTEM_LOGIN_RESULT = 'system_login_result',
+ SYSTEM_SMS_CHANNEL_CODE = 'system_sms_channel_code',
+ SYSTEM_SMS_TEMPLATE_TYPE = 'system_sms_template_type',
+ SYSTEM_SMS_SEND_STATUS = 'system_sms_send_status',
+ SYSTEM_SMS_RECEIVE_STATUS = 'system_sms_receive_status',
+ SYSTEM_ERROR_CODE_TYPE = 'system_error_code_type',
+ SYSTEM_OAUTH2_GRANT_TYPE = 'system_oauth2_grant_type',
+
+ // ========== INFRA 模块 ==========
+ INFRA_BOOLEAN_STRING = 'infra_boolean_string',
+ INFRA_REDIS_TIMEOUT_TYPE = 'infra_redis_timeout_type',
+ INFRA_JOB_STATUS = 'infra_job_status',
+ INFRA_JOB_LOG_STATUS = 'infra_job_log_status',
+ INFRA_API_ERROR_LOG_PROCESS_STATUS = 'infra_api_error_log_process_status',
+ INFRA_CONFIG_TYPE = 'infra_config_type',
+ INFRA_CODEGEN_TEMPLATE_TYPE = 'infra_codegen_template_type',
+ INFRA_CODEGEN_SCENE = 'infra_codegen_scene',
+ INFRA_FILE_STORAGE = 'infra_file_storage',
+
+ // ========== BPM 模块 ==========
+ BPM_MODEL_CATEGORY = 'bpm_model_category',
+ BPM_MODEL_FORM_TYPE = 'bpm_model_form_type',
+ BPM_TASK_ASSIGN_RULE_TYPE = 'bpm_task_assign_rule_type',
+ BPM_PROCESS_INSTANCE_STATUS = 'bpm_process_instance_status',
+ BPM_PROCESS_INSTANCE_RESULT = 'bpm_process_instance_result',
+ BPM_TASK_ASSIGN_SCRIPT = 'bpm_task_assign_script',
+ BPM_OA_LEAVE_TYPE = 'bpm_oa_leave_type',
+
+ // ========== PAY 模块 ==========
+ PAY_CHANNEL_WECHAT_VERSION = 'pay_channel_wechat_version', // 微信渠道版本
+ PAY_CHANNEL_ALIPAY_SIGN_TYPE = 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型
+ PAY_CHANNEL_ALIPAY_MODE = 'pay_channel_alipay_mode', // 支付宝公钥类型
+ PAY_CHANNEL_ALIPAY_SERVER_TYPE = 'pay_channel_alipay_server_type', // 支付宝网关地址
+ PAY_CHANNEL_CODE_TYPE = 'pay_channel_code_type', // 支付渠道编码类型
+ PAY_ORDER_NOTIFY_STATUS = 'pay_order_notify_status', // 商户支付订单回调状态
+ PAY_ORDER_STATUS = 'pay_order_status', // 商户支付订单状态
+ PAY_ORDER_REFUND_STATUS = 'pay_order_refund_status', // 商户支付订单退款状态
+ PAY_REFUND_ORDER_STATUS = 'pay_refund_order_status', // 退款订单状态
+ PAY_REFUND_ORDER_TYPE = 'pay_refund_order_type' // 退款订单类别
+}
diff --git a/yudao-ui-admin-vue3/src/utils/domUtils.ts b/yudao-ui-admin-vue3/src/utils/domUtils.ts
new file mode 100644
index 0000000000..dbc1989cb4
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/domUtils.ts
@@ -0,0 +1,289 @@
+import { isServer } from './is'
+const ieVersion = isServer ? 0 : Number((document as any).documentMode)
+const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g
+const MOZ_HACK_REGEXP = /^moz([A-Z])/
+
+export interface ViewportOffsetResult {
+ left: number
+ top: number
+ right: number
+ bottom: number
+ rightIncludeBody: number
+ bottomIncludeBody: number
+}
+
+/* istanbul ignore next */
+const trim = function (string: string) {
+ return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '')
+}
+
+/* istanbul ignore next */
+const camelCase = function (name: string) {
+ return name
+ .replace(SPECIAL_CHARS_REGEXP, function (_, __, letter, offset) {
+ return offset ? letter.toUpperCase() : letter
+ })
+ .replace(MOZ_HACK_REGEXP, 'Moz$1')
+}
+
+/* istanbul ignore next */
+export function hasClass(el: Element, cls: string) {
+ if (!el || !cls) return false
+ if (cls.indexOf(' ') !== -1) {
+ throw new Error('className should not contain space.')
+ }
+ if (el.classList) {
+ return el.classList.contains(cls)
+ } else {
+ return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1
+ }
+}
+
+/* istanbul ignore next */
+export function addClass(el: Element, cls: string) {
+ if (!el) return
+ let curClass = el.className
+ const classes = (cls || '').split(' ')
+
+ for (let i = 0, j = classes.length; i < j; i++) {
+ const clsName = classes[i]
+ if (!clsName) continue
+
+ if (el.classList) {
+ el.classList.add(clsName)
+ } else if (!hasClass(el, clsName)) {
+ curClass += ' ' + clsName
+ }
+ }
+ if (!el.classList) {
+ el.className = curClass
+ }
+}
+
+/* istanbul ignore next */
+export function removeClass(el: Element, cls: string) {
+ if (!el || !cls) return
+ const classes = cls.split(' ')
+ let curClass = ' ' + el.className + ' '
+
+ for (let i = 0, j = classes.length; i < j; i++) {
+ const clsName = classes[i]
+ if (!clsName) continue
+
+ if (el.classList) {
+ el.classList.remove(clsName)
+ } else if (hasClass(el, clsName)) {
+ curClass = curClass.replace(' ' + clsName + ' ', ' ')
+ }
+ }
+ if (!el.classList) {
+ el.className = trim(curClass)
+ }
+}
+
+export function getBoundingClientRect(element: Element): DOMRect | number {
+ if (!element || !element.getBoundingClientRect) {
+ return 0
+ }
+ return element.getBoundingClientRect()
+}
+
+/**
+ * 获取当前元素的left、top偏移
+ * left:元素最左侧距离文档左侧的距离
+ * top:元素最顶端距离文档顶端的距离
+ * right:元素最右侧距离文档右侧的距离
+ * bottom:元素最底端距离文档底端的距离
+ * rightIncludeBody:元素最左侧距离文档右侧的距离
+ * bottomIncludeBody:元素最底端距离文档最底部的距离
+ *
+ * @description:
+ */
+export function getViewportOffset(element: Element): ViewportOffsetResult {
+ const doc = document.documentElement
+
+ const docScrollLeft = doc.scrollLeft
+ const docScrollTop = doc.scrollTop
+ const docClientLeft = doc.clientLeft
+ const docClientTop = doc.clientTop
+
+ const pageXOffset = window.pageXOffset
+ const pageYOffset = window.pageYOffset
+
+ const box = getBoundingClientRect(element)
+
+ const { left: retLeft, top: rectTop, width: rectWidth, height: rectHeight } = box as DOMRect
+
+ const scrollLeft = (pageXOffset || docScrollLeft) - (docClientLeft || 0)
+ const scrollTop = (pageYOffset || docScrollTop) - (docClientTop || 0)
+ const offsetLeft = retLeft + pageXOffset
+ const offsetTop = rectTop + pageYOffset
+
+ const left = offsetLeft - scrollLeft
+ const top = offsetTop - scrollTop
+
+ const clientWidth = window.document.documentElement.clientWidth
+ const clientHeight = window.document.documentElement.clientHeight
+ return {
+ left: left,
+ top: top,
+ right: clientWidth - rectWidth - left,
+ bottom: clientHeight - rectHeight - top,
+ rightIncludeBody: clientWidth - left,
+ bottomIncludeBody: clientHeight - top
+ }
+}
+
+/* istanbul ignore next */
+export const on = function (
+ element: HTMLElement | Document | Window,
+ event: string,
+ handler: EventListenerOrEventListenerObject
+): void {
+ if (element && event && handler) {
+ element.addEventListener(event, handler, false)
+ }
+}
+
+/* istanbul ignore next */
+export const off = function (
+ element: HTMLElement | Document | Window,
+ event: string,
+ handler: any
+): void {
+ if (element && event && handler) {
+ element.removeEventListener(event, handler, false)
+ }
+}
+
+/* istanbul ignore next */
+export const once = function (el: HTMLElement, event: string, fn: EventListener): void {
+ const listener = function (this: any, ...args: unknown[]) {
+ if (fn) {
+ // @ts-ignore
+ fn.apply(this, args)
+ }
+ off(el, event, listener)
+ }
+ on(el, event, listener)
+}
+
+/* istanbul ignore next */
+export const getStyle =
+ ieVersion < 9
+ ? function (element: Element | any, styleName: string) {
+ if (isServer) return
+ if (!element || !styleName) return null
+ styleName = camelCase(styleName)
+ if (styleName === 'float') {
+ styleName = 'styleFloat'
+ }
+ try {
+ switch (styleName) {
+ case 'opacity':
+ try {
+ return element.filters.item('alpha').opacity / 100
+ } catch (e) {
+ return 1.0
+ }
+ default:
+ return element.style[styleName] || element.currentStyle
+ ? element.currentStyle[styleName]
+ : null
+ }
+ } catch (e) {
+ return element.style[styleName]
+ }
+ }
+ : function (element: Element | any, styleName: string) {
+ if (isServer) return
+ if (!element || !styleName) return null
+ styleName = camelCase(styleName)
+ if (styleName === 'float') {
+ styleName = 'cssFloat'
+ }
+ try {
+ const computed = (document as any).defaultView.getComputedStyle(element, '')
+ return element.style[styleName] || computed ? computed[styleName] : null
+ } catch (e) {
+ return element.style[styleName]
+ }
+ }
+
+/* istanbul ignore next */
+export function setStyle(element: Element | any, styleName: any, value: any) {
+ if (!element || !styleName) return
+
+ if (typeof styleName === 'object') {
+ for (const prop in styleName) {
+ if (Object.prototype.hasOwnProperty.call(styleName, prop)) {
+ setStyle(element, prop, styleName[prop])
+ }
+ }
+ } else {
+ styleName = camelCase(styleName)
+ if (styleName === 'opacity' && ieVersion < 9) {
+ element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')'
+ } else {
+ element.style[styleName] = value
+ }
+ }
+}
+
+/* istanbul ignore next */
+export const isScroll = (el: Element, vertical: any) => {
+ if (isServer) return
+
+ const determinedDirection = vertical !== null || vertical !== undefined
+ const overflow = determinedDirection
+ ? vertical
+ ? getStyle(el, 'overflow-y')
+ : getStyle(el, 'overflow-x')
+ : getStyle(el, 'overflow')
+
+ return overflow.match(/(scroll|auto)/)
+}
+
+/* istanbul ignore next */
+export const getScrollContainer = (el: Element, vertical?: any) => {
+ if (isServer) return
+
+ let parent: any = el
+ while (parent) {
+ if ([window, document, document.documentElement].includes(parent)) {
+ return window
+ }
+ if (isScroll(parent, vertical)) {
+ return parent
+ }
+ parent = parent.parentNode
+ }
+
+ return parent
+}
+
+/* istanbul ignore next */
+export const isInContainer = (el: Element, container: any) => {
+ if (isServer || !el || !container) return false
+
+ const elRect = el.getBoundingClientRect()
+ let containerRect
+
+ if ([window, document, document.documentElement, null, undefined].includes(container)) {
+ containerRect = {
+ top: 0,
+ right: window.innerWidth,
+ bottom: window.innerHeight,
+ left: 0
+ }
+ } else {
+ containerRect = container.getBoundingClientRect()
+ }
+
+ return (
+ elRect.top < containerRect.bottom &&
+ elRect.bottom > containerRect.top &&
+ elRect.right > containerRect.left &&
+ elRect.left < containerRect.right
+ )
+}
diff --git a/yudao-ui-admin-vue3/src/utils/download.ts b/yudao-ui-admin-vue3/src/utils/download.ts
new file mode 100644
index 0000000000..12c01fea1b
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/download.ts
@@ -0,0 +1,38 @@
+const download0 = (data: any, fileName: string, mineType: string) => {
+ // 创建 blob
+ const blob = new Blob([data], { type: mineType })
+ // 创建 href 超链接,点击进行下载
+ window.URL = window.URL || window.webkitURL
+ const href = URL.createObjectURL(blob)
+ const downA = document.createElement('a')
+ downA.href = href
+ downA.download = fileName
+ downA.click()
+ // 销毁超连接
+ window.URL.revokeObjectURL(href)
+}
+
+const download = {
+ // 下载 Excel 方法
+ excel: (data: any, fileName: string) => {
+ download0(data, fileName, 'application/vnd.ms-excel')
+ },
+ // 下载 Word 方法
+ word: (data: any, fileName: string) => {
+ download0(data, fileName, 'application/msword')
+ },
+ // 下载 Zip 方法
+ zip: (data: any, fileName: string) => {
+ download0(data, fileName, 'application/zip')
+ },
+ // 下载 Html 方法
+ html: (data: any, fileName: string) => {
+ download0(data, fileName, 'text/html')
+ },
+ // 下载 Markdown 方法
+ markdown: (data: any, fileName: string) => {
+ download0(data, fileName, 'text/markdown')
+ }
+}
+
+export default download
diff --git a/yudao-ui-admin-vue3/src/utils/filt.ts b/yudao-ui-admin-vue3/src/utils/filt.ts
new file mode 100644
index 0000000000..b1a7b2c7cf
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/filt.ts
@@ -0,0 +1,157 @@
+export const openWindow = (
+ url: string,
+ opt?: {
+ target?: '_self' | '_blank' | string
+ noopener?: boolean
+ noreferrer?: boolean
+ }
+) => {
+ const { target = '__blank', noopener = true, noreferrer = true } = opt || {}
+ const feature: string[] = []
+
+ noopener && feature.push('noopener=yes')
+ noreferrer && feature.push('noreferrer=yes')
+
+ window.open(url, target, feature.join(','))
+}
+
+/**
+ * @description: base64 to blob
+ */
+export const dataURLtoBlob = (base64Buf: string): Blob => {
+ const arr = base64Buf.split(',')
+ const typeItem = arr[0]
+ const mime = typeItem.match(/:(.*?);/)![1]
+ const bstr = window.atob(arr[1])
+ let n = bstr.length
+ const u8arr = new Uint8Array(n)
+ while (n--) {
+ u8arr[n] = bstr.charCodeAt(n)
+ }
+ return new Blob([u8arr], { type: mime })
+}
+
+/**
+ * img url to base64
+ * @param url
+ */
+export const urlToBase64 = (url: string, mineType?: string): Promise => {
+ return new Promise((resolve, reject) => {
+ let canvas = document.createElement('CANVAS') as Nullable
+ const ctx = canvas!.getContext('2d')
+
+ const img = new Image()
+ img.crossOrigin = ''
+ img.onload = function () {
+ if (!canvas || !ctx) {
+ return reject()
+ }
+ canvas.height = img.height
+ canvas.width = img.width
+ ctx.drawImage(img, 0, 0)
+ const dataURL = canvas.toDataURL(mineType || 'image/png')
+ canvas = null
+ resolve(dataURL)
+ }
+ img.src = url
+ })
+}
+
+/**
+ * Download online pictures
+ * @param url
+ * @param filename
+ * @param mime
+ * @param bom
+ */
+export const downloadByOnlineUrl = (
+ url: string,
+ filename: string,
+ mime?: string,
+ bom?: BlobPart
+) => {
+ urlToBase64(url).then((base64) => {
+ downloadByBase64(base64, filename, mime, bom)
+ })
+}
+
+/**
+ * Download pictures based on base64
+ * @param buf
+ * @param filename
+ * @param mime
+ * @param bom
+ */
+export const downloadByBase64 = (buf: string, filename: string, mime?: string, bom?: BlobPart) => {
+ const base64Buf = dataURLtoBlob(buf)
+ downloadByData(base64Buf, filename, mime, bom)
+}
+
+/**
+ * Download according to the background interface file stream
+ * @param {*} data
+ * @param {*} filename
+ * @param {*} mime
+ * @param {*} bom
+ */
+export const downloadByData = (data: BlobPart, filename: string, mime?: string, bom?: BlobPart) => {
+ const blobData = typeof bom !== 'undefined' ? [bom, data] : [data]
+ const blob = new Blob(blobData, { type: mime || 'application/octet-stream' })
+
+ const blobURL = window.URL.createObjectURL(blob)
+ const tempLink = document.createElement('a')
+ tempLink.style.display = 'none'
+ tempLink.href = blobURL
+ tempLink.setAttribute('download', filename)
+ if (typeof tempLink.download === 'undefined') {
+ tempLink.setAttribute('target', '_blank')
+ }
+ document.body.appendChild(tempLink)
+ tempLink.click()
+ document.body.removeChild(tempLink)
+ window.URL.revokeObjectURL(blobURL)
+}
+
+/**
+ * Download file according to file address
+ * @param {*} sUrl
+ */
+export const downloadByUrl = ({
+ url,
+ target = '_blank',
+ fileName
+}: {
+ url: string
+ target?: '_self' | '_blank'
+ fileName?: string
+}): boolean => {
+ const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1
+ const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1
+
+ if (/(iP)/g.test(window.navigator.userAgent)) {
+ console.error('Your browser does not support download!')
+ return false
+ }
+ if (isChrome || isSafari) {
+ const link = document.createElement('a')
+ link.href = url
+ link.target = target
+
+ if (link.download !== undefined) {
+ link.download = fileName || url.substring(url.lastIndexOf('/') + 1, url.length)
+ }
+
+ if (document.createEvent) {
+ const e = document.createEvent('MouseEvents')
+ e.initEvent('click', true, true)
+ link.dispatchEvent(e)
+ return true
+ }
+ }
+ if (url.indexOf('?') === -1) {
+ url += '?download'
+ }
+
+ openWindow(url, { target })
+ return true
+}
diff --git a/yudao-ui-admin-vue3/src/utils/formRules.ts b/yudao-ui-admin-vue3/src/utils/formRules.ts
new file mode 100644
index 0000000000..d9090a9038
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/formRules.ts
@@ -0,0 +1,9 @@
+import { useI18n } from '@/hooks/web/useI18n'
+
+const { t } = useI18n()
+
+// 必填项
+export const required = {
+ required: true,
+ message: t('common.required')
+}
diff --git a/yudao-ui-admin-vue3/src/utils/formatTime.ts b/yudao-ui-admin-vue3/src/utils/formatTime.ts
new file mode 100644
index 0000000000..3b799139d5
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/formatTime.ts
@@ -0,0 +1,149 @@
+/**
+ * 时间日期转换
+ * @param date 当前时间,new Date() 格式
+ * @param format 需要转换的时间格式字符串
+ * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd`
+ * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ"
+ * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW"
+ * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ"
+ * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatDate(date: Date, format: string): string {
+ const we = date.getDay() // 星期
+ const z = getWeek(date) // 周
+ const qut = Math.floor((date.getMonth() + 3) / 3).toString() // 季度
+ const opt: { [key: string]: string } = {
+ 'Y+': date.getFullYear().toString(), // 年
+ 'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1)
+ 'd+': date.getDate().toString(), // 日
+ 'H+': date.getHours().toString(), // 时
+ 'M+': date.getMinutes().toString(), // 分
+ 'S+': date.getSeconds().toString(), // 秒
+ 'q+': qut // 季度
+ }
+ // 中文数字 (星期)
+ const week: { [key: string]: string } = {
+ '0': '日',
+ '1': '一',
+ '2': '二',
+ '3': '三',
+ '4': '四',
+ '5': '五',
+ '6': '六'
+ }
+ // 中文数字(季度)
+ const quarter: { [key: string]: string } = {
+ '1': '一',
+ '2': '二',
+ '3': '三',
+ '4': '四'
+ }
+ if (/(W+)/.test(format))
+ format = format.replace(
+ RegExp.$1,
+ RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]
+ )
+ if (/(Q+)/.test(format))
+ format = format.replace(
+ RegExp.$1,
+ RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut]
+ )
+ if (/(Z+)/.test(format))
+ format = format.replace(RegExp.$1, RegExp.$1.length == 3 ? '第' + z + '周' : z + '')
+ for (const k in opt) {
+ const r = new RegExp('(' + k + ')').exec(format)
+ // 若输入的长度不为1,则前面补零
+ if (r)
+ format = format.replace(
+ r[1],
+ RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0')
+ )
+ }
+ return format
+}
+
+/**
+ * 获取当前日期是第几周
+ * @param dateTime 当前传入的日期值
+ * @returns 返回第几周数字值
+ */
+export function getWeek(dateTime: Date): number {
+ const temptTime = new Date(dateTime.getTime())
+ // 周几
+ const weekday = temptTime.getDay() || 7
+ // 周1+5天=周六
+ temptTime.setDate(temptTime.getDate() - weekday + 1 + 5)
+ let firstDay = new Date(temptTime.getFullYear(), 0, 1)
+ const dayOfWeek = firstDay.getDay()
+ let spendDay = 1
+ if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1
+ firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay)
+ const d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000)
+ const result = Math.ceil(d / 7)
+ return result
+}
+
+/**
+ * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
+ * @param param 当前时间,new Date() 格式或者字符串时间格式
+ * @param format 需要转换的时间格式字符串
+ * @description param 10秒: 10 * 1000
+ * @description param 1分: 60 * 1000
+ * @description param 1小时: 60 * 60 * 1000
+ * @description param 24小时:60 * 60 * 24 * 1000
+ * @description param 3天: 60 * 60* 24 * 1000 * 3
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatPast(param: string | Date, format = 'YYYY-mm-dd HH:MM:SS'): string {
+ // 传入格式处理、存储转换值
+ let t: any, s: number
+ // 获取js 时间戳
+ let time: number = new Date().getTime()
+ // 是否是对象
+ typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param)
+ // 当前时间戳 - 传入时间戳
+ time = Number.parseInt(`${time - t}`)
+ if (time < 10000) {
+ // 10秒内
+ return '刚刚'
+ } else if (time < 60000 && time >= 10000) {
+ // 超过10秒少于1分钟内
+ s = Math.floor(time / 1000)
+ return `${s}秒前`
+ } else if (time < 3600000 && time >= 60000) {
+ // 超过1分钟少于1小时
+ s = Math.floor(time / 60000)
+ return `${s}分钟前`
+ } else if (time < 86400000 && time >= 3600000) {
+ // 超过1小时少于24小时
+ s = Math.floor(time / 3600000)
+ return `${s}小时前`
+ } else if (time < 259200000 && time >= 86400000) {
+ // 超过1天少于3天内
+ s = Math.floor(time / 86400000)
+ return `${s}天前`
+ } else {
+ // 超过3天
+ const date = typeof param === 'string' || 'object' ? new Date(param) : param
+ return formatDate(date, format)
+ }
+}
+
+/**
+ * 时间问候语
+ * @param param 当前时间,new Date() 格式
+ * @description param 调用 `formatAxis(new Date())` 输出 `上午好`
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatAxis(param: Date): string {
+ const hour: number = new Date(param).getHours()
+ if (hour < 6) return '凌晨好'
+ else if (hour < 9) return '早上好'
+ else if (hour < 12) return '上午好'
+ else if (hour < 14) return '中午好'
+ else if (hour < 17) return '下午好'
+ else if (hour < 19) return '傍晚好'
+ else if (hour < 22) return '晚上好'
+ else return '夜里好'
+}
diff --git a/yudao-ui-admin-vue3/src/utils/index.ts b/yudao-ui-admin-vue3/src/utils/index.ts
new file mode 100644
index 0000000000..246de698bc
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/index.ts
@@ -0,0 +1,110 @@
+// import type { Plugin } from 'vue'
+
+/**
+ *
+ * @param component 需要注册的组件
+ * @param alias 组件别名
+ * @returns any
+ */
+export const withInstall = (component: T, alias?: string) => {
+ const comp = component as any
+ comp.install = (app: any) => {
+ app.component(comp.name || comp.displayName, component)
+ if (alias) {
+ app.config.globalProperties[alias] = component
+ }
+ }
+ return component as T & Plugin
+}
+
+/**
+ * @param str 需要转下划线的驼峰字符串
+ * @returns 字符串下划线
+ */
+export const humpToUnderline = (str: string): string => {
+ return str.replace(/([A-Z])/g, '-$1').toLowerCase()
+}
+
+/**
+ * @param str 需要转驼峰的下划线字符串
+ * @returns 字符串驼峰
+ */
+export const underlineToHump = (str: string): string => {
+ if (!str) return ''
+ return str.replace(/\-(\w)/g, (_, letter: string) => {
+ return letter.toUpperCase()
+ })
+}
+
+export const setCssVar = (prop: string, val: any, dom = document.documentElement) => {
+ dom.style.setProperty(prop, val)
+}
+
+/**
+ * 查找数组对象的某个下标
+ * @param {Array} ary 查找的数组
+ * @param {Functon} fn 判断的方法
+ */
+// eslint-disable-next-line
+export const findIndex = (ary: Array, fn: Fn): number => {
+ if (ary.findIndex) {
+ return ary.findIndex(fn)
+ }
+ let index = -1
+ ary.some((item: T, i: number, ary: Array) => {
+ const ret: T = fn(item, i, ary)
+ if (ret) {
+ index = i
+ return ret
+ }
+ })
+ return index
+}
+
+export const trim = (str: string) => {
+ return str.replace(/(^\s*)|(\s*$)/g, '')
+}
+
+/**
+ * @param {Date | number | string} time 需要转换的时间
+ * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
+ */
+export function formatTime(time: Date | number | string, fmt: string) {
+ if (!time) return ''
+ else {
+ const date = new Date(time)
+ const o = {
+ 'M+': date.getMonth() + 1,
+ 'd+': date.getDate(),
+ 'H+': date.getHours(),
+ 'm+': date.getMinutes(),
+ 's+': date.getSeconds(),
+ 'q+': Math.floor((date.getMonth() + 3) / 3),
+ S: date.getMilliseconds()
+ }
+ if (/(y+)/.test(fmt)) {
+ fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
+ }
+ for (const k in o) {
+ if (new RegExp('(' + k + ')').test(fmt)) {
+ fmt = fmt.replace(
+ RegExp.$1,
+ RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
+ )
+ }
+ }
+ return fmt
+ }
+}
+
+/**
+ * 生成随机字符串
+ */
+export function toAnyString() {
+ const str: string = 'xxxxx-xxxxx-4xxxx-yxxxx-xxxxx'.replace(/[xy]/g, (c: string) => {
+ const r: number = (Math.random() * 16) | 0
+ const v: number = c === 'x' ? r : (r & 0x3) | 0x8
+ return v.toString()
+ })
+ return str
+}
diff --git a/yudao-ui-admin-vue3/src/utils/is.ts b/yudao-ui-admin-vue3/src/utils/is.ts
new file mode 100644
index 0000000000..375298593c
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/is.ts
@@ -0,0 +1,105 @@
+// copy to vben-admin
+
+const toString = Object.prototype.toString
+
+export const is = (val: unknown, type: string) => {
+ return toString.call(val) === `[object ${type}]`
+}
+
+export const isDef = (val?: T): val is T => {
+ return typeof val !== 'undefined'
+}
+
+export const isUnDef = (val?: T): val is T => {
+ return !isDef(val)
+}
+
+export const isObject = (val: any): val is Record => {
+ return val !== null && is(val, 'Object')
+}
+
+export const isEmpty = (val: T): val is T => {
+ if (isArray(val) || isString(val)) {
+ return val.length === 0
+ }
+
+ if (val instanceof Map || val instanceof Set) {
+ return val.size === 0
+ }
+
+ if (isObject(val)) {
+ return Object.keys(val).length === 0
+ }
+
+ return false
+}
+
+export const isDate = (val: unknown): val is Date => {
+ return is(val, 'Date')
+}
+
+export const isNull = (val: unknown): val is null => {
+ return val === null
+}
+
+export const isNullAndUnDef = (val: unknown): val is null | undefined => {
+ return isUnDef(val) && isNull(val)
+}
+
+export const isNullOrUnDef = (val: unknown): val is null | undefined => {
+ return isUnDef(val) || isNull(val)
+}
+
+export const isNumber = (val: unknown): val is number => {
+ return is(val, 'Number')
+}
+
+export const isPromise = (val: unknown): val is Promise => {
+ return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch)
+}
+
+export const isString = (val: unknown): val is string => {
+ return is(val, 'String')
+}
+
+export const isFunction = (val: unknown): val is Function => {
+ return typeof val === 'function'
+}
+
+export const isBoolean = (val: unknown): val is boolean => {
+ return is(val, 'Boolean')
+}
+
+export const isRegExp = (val: unknown): val is RegExp => {
+ return is(val, 'RegExp')
+}
+
+export const isArray = (val: any): val is Array => {
+ return val && Array.isArray(val)
+}
+
+export const isWindow = (val: any): val is Window => {
+ return typeof window !== 'undefined' && is(val, 'Window')
+}
+
+export const isElement = (val: unknown): val is Element => {
+ return isObject(val) && !!val.tagName
+}
+
+export const isMap = (val: unknown): val is Map => {
+ return is(val, 'Map')
+}
+
+export const isServer = typeof window === 'undefined'
+
+export const isClient = !isServer
+
+export const isUrl = (path: string): boolean => {
+ const reg =
+ /(((^https?:(?:\/\/)?)(?:[-:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&%@.\w_]*)#?(?:[\w]*))?)$/
+ return reg.test(path)
+}
+
+export const isDark = (): boolean => {
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+}
diff --git a/yudao-ui-admin-vue3/src/utils/propTypes.ts b/yudao-ui-admin-vue3/src/utils/propTypes.ts
new file mode 100644
index 0000000000..5d685f318f
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/propTypes.ts
@@ -0,0 +1,29 @@
+import { createTypes, VueTypesInterface, VueTypeValidableDef } from 'vue-types'
+import { CSSProperties } from 'vue'
+
+// 自定义扩展vue-types
+type PropTypes = VueTypesInterface & {
+ readonly style: VueTypeValidableDef
+}
+
+const propTypes = createTypes({
+ func: undefined,
+ bool: undefined,
+ string: undefined,
+ number: undefined,
+ object: undefined,
+ integer: undefined
+}) as PropTypes
+
+// 需要自定义扩展的类型
+// see: https://dwightjack.github.io/vue-types/advanced/extending-vue-types.html#the-extend-method
+propTypes.extend([
+ {
+ name: 'style',
+ getter: true,
+ type: [String, Object],
+ default: undefined
+ }
+])
+
+export { propTypes }
diff --git a/yudao-ui-admin-vue3/src/utils/routerHelper.ts b/yudao-ui-admin-vue3/src/utils/routerHelper.ts
new file mode 100644
index 0000000000..85c1f60ca1
--- /dev/null
+++ b/yudao-ui-admin-vue3/src/utils/routerHelper.ts
@@ -0,0 +1,197 @@
+import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
+import type { Router, RouteLocationNormalized, RouteRecordNormalized } from 'vue-router'
+import { isUrl } from '@/utils/is'
+import { omit, cloneDeep } from 'lodash-es'
+
+const modules = import.meta.glob('../views/**/*.{vue,tsx}')
+
+/* Layout */
+export const Layout = () => import('@/layout/Layout.vue')
+
+export const getParentLayout = () => {
+ return () =>
+ new Promise((resolve) => {
+ resolve({
+ name: 'ParentLayout'
+ })
+ })
+}
+
+// 按照路由中meta下的rank等级升序来排序路由
+export function ascending(arr: any[]) {
+ arr.forEach((v) => {
+ if (v?.meta?.rank === null) v.meta.rank = undefined
+ if (v?.meta?.rank === 0) {
+ if (v.name !== 'home' && v.path !== '/') {
+ console.warn('rank only the home page can be 0')
+ }
+ }
+ })
+ return arr.sort((a: { meta: { rank: number } }, b: { meta: { rank: number } }) => {
+ return a?.meta?.rank - b?.meta?.rank
+ })
+}
+
+export const getRawRoute = (route: RouteLocationNormalized): RouteLocationNormalized => {
+ if (!route) return route
+ const { matched, ...opt } = route
+ return {
+ ...opt,
+ matched: (matched
+ ? matched.map((item) => ({
+ meta: item.meta,
+ name: item.name,
+ path: item.path
+ }))
+ : undefined) as RouteRecordNormalized[]
+ }
+}
+
+// 后端控制路由生成
+export const generateRoutes = (routes: AppCustomRouteRecordRaw[]): AppRouteRecordRaw[] => {
+ const res: AppRouteRecordRaw[] = []
+ const modulesRoutesKeys = Object.keys(modules)
+ for (const route of routes) {
+ const meta = {
+ title: route.name,
+ icon: route.icon,
+ hidden: !route.visible,
+ noCache: !route.keepAlive
+ }
+ // 路由地址转首字母大写驼峰,作为路由名称,适配keepAlive
+ let data: AppRouteRecordRaw = {
+ path: route.path,
+ name: toCamelCase(route.path, true),
+ redirect: route.redirect,
+ meta: meta
+ }
+ // 目录
+ if (route.children) {
+ data.component = Layout
+ data.redirect = getRedirect(route.path, route.children)
+ // 外链
+ } else if (isUrl(route.path)) {
+ data = {
+ path: '/external-link',
+ component: Layout,
+ meta: {
+ name: route.name
+ },
+ children: [data]
+ } as AppRouteRecordRaw
+ // 菜单
+ } else {
+ // 对后端传component组件路径和不传做兼容(如果后端传component组件路径,那么path可以随便写,如果不传,component组件路径会根path保持一致)
+ const index = route?.component
+ ? modulesRoutesKeys.findIndex((ev) => ev.includes(route.component))
+ : modulesRoutesKeys.findIndex((ev) => ev.includes(route.path))
+ data.component = modules[modulesRoutesKeys[index]]
+ }
+ if (route.children) {
+ data.children = generateRoutes(route.children)
+ }
+ res.push(data)
+ }
+ return res
+}
+export const getRedirect = (parentPath: string, children: Array