Bladeren bron

chore: add some notes

vben 4 jaren geleden
bovenliggende
commit
46e0875374
87 gewijzigde bestanden met toevoegingen van 922 en 724 verwijderingen
  1. 1 0
      .vscode/settings.json
  2. 2 1
      CHANGELOG.zh_CN.md
  3. 2 2
      build/vite/plugin/context/transform.ts
  4. 3 3
      mock/demo/account.ts
  5. 9 9
      package.json
  6. 4 0
      prettier.config.js
  7. 0 3
      public/resource/img/loading.svg
  8. 11 16
      src/App.vue
  9. 1 1
      src/api/demo/account.ts
  10. 1 1
      src/api/sys/menu.ts
  11. 2 2
      src/api/sys/model/menuModel.ts
  12. 1 1
      src/api/sys/upload.ts
  13. 7 1
      src/components/Authority/index.ts
  14. 17 8
      src/components/Authority/src/index.vue
  15. 4 0
      src/components/Basic/src/BasicArrow.vue
  16. 1 3
      src/components/Basic/src/BasicHelp.vue
  17. 6 47
      src/components/Button/index.vue
  18. 2 1
      src/components/Container/src/LazyContainer.vue
  19. 8 9
      src/components/Container/src/collapse/CollapseContainer.vue
  20. 2 4
      src/components/ContextMenu/src/props.ts
  21. 1 1
      src/components/CountTo/index.ts
  22. 7 9
      src/components/Description/src/index.tsx
  23. 4 5
      src/components/Description/src/types.ts
  24. 3 3
      src/components/Drawer/src/BasicDrawer.tsx
  25. 2 3
      src/components/Drawer/src/props.ts
  26. 1 1
      src/components/Drawer/src/types.ts
  27. 1 1
      src/components/Drawer/src/useDrawer.ts
  28. 1 49
      src/components/Dropdown/props.ts
  29. 11 7
      src/components/Form/src/BasicForm.vue
  30. 1 1
      src/components/Form/src/componentMap.ts
  31. 2 2
      src/components/Form/src/hooks/useAdvanced.ts
  32. 6 6
      src/components/Form/src/hooks/useFormAction.ts
  33. 3 3
      src/components/Form/src/hooks/useFormValues.ts
  34. 1 1
      src/components/Form/src/hooks/useLabelWidth.ts
  35. 49 49
      src/components/Form/src/types/form.ts
  36. 3 2
      src/components/Menu/src/BasicMenu.tsx
  37. 2 2
      src/components/Menu/src/SearchInput.vue
  38. 3 2
      src/components/Menu/src/props.ts
  39. 2 1
      src/components/Menu/src/types.d.ts
  40. 2 2
      src/components/Table/src/style/index.less
  41. 1 1
      src/components/registerGlobComp.ts
  42. 1 1
      src/design/var/index.less
  43. 7 0
      src/enums/appEnum.ts
  44. 0 1
      src/enums/eventBusEnum.ts
  45. 0 7
      src/enums/menuEnum.ts
  46. 0 4
      src/enums/paginationEnum.ts
  47. 0 6
      src/enums/resultEnum.ts
  48. 18 0
      src/hooks/core/onMountedOrActivated.ts
  49. 9 0
      src/hooks/core/useExpose.ts
  50. 47 0
      src/hooks/core/useModel.ts
  51. 15 0
      src/hooks/core/useRefs.ts
  52. 3 3
      src/hooks/core/useThrottle.ts
  53. 20 0
      src/hooks/core/useToggle.ts
  54. 48 0
      src/hooks/event/useIntersectionObserver.ts
  55. 7 2
      src/hooks/web/useClickOutside.ts
  56. 13 0
      src/hooks/web/useHeight.ts
  57. 20 13
      src/hooks/web/useLockPage.ts
  58. 24 13
      src/hooks/web/usePermission.ts
  59. 33 0
      src/hooks/web/useRect.ts
  60. 1 1
      src/layouts/default/setting/SettingDrawer.tsx
  61. 4 4
      src/layouts/default/setting/const.ts
  62. 15 9
      src/main.ts
  63. 4 4
      src/settings/projectSetting.ts
  64. 10 5
      src/setup/Application.ts
  65. 1 1
      src/setup/ant-design-vue/index.ts
  66. 0 14
      src/setup/ant-design-vue/spin.less
  67. 7 2
      src/setup/ant-design-vue/spin.tsx
  68. 86 0
      src/setup/application.ts
  69. 5 1
      src/setup/directives/index.ts
  70. 27 11
      src/setup/directives/permission.ts
  71. 13 6
      src/setup/directives/repeatClick.ts
  72. 45 15
      src/setup/error-handle/index.ts
  73. 21 3
      src/setup/theme/index.ts
  74. 4 7
      src/store/index.ts
  75. 4 4
      src/types/config.d.ts
  76. 2 4
      src/types/event.d.ts
  77. 5 10
      src/types/global.d.ts
  78. 1 0
      src/types/window.d.ts
  79. 2 3
      src/utils/auth/index.ts
  80. 1 1
      src/utils/event/triggerWindowResizeEvent.ts
  81. 2 4
      src/utils/is.ts
  82. 1 0
      src/utils/log.ts
  83. 0 3
      src/views/dashboard/welcome/index.vue
  84. 2 2
      src/views/demo/page/form/high/data.ts
  85. 1 1
      src/views/demo/permission/back/Btn.vue
  86. 1 1
      src/views/demo/permission/front/Btn.vue
  87. 202 295
      yarn.lock

+ 1 - 0
.vscode/settings.json

@@ -138,6 +138,7 @@
   //   "vetur.format.defaultFormatter.html": "prettyhtml",
   "vetur.format.defaultFormatter.ts": "prettier-tslint",
   "vetur.format.defaultFormatter.js": "prettier",
+    "vetur.languageFeatures.codeActions": false,
   // "vetur.useWorkspaceDependencies": true,
   "vetur.format.defaultFormatterOptions": {
     "js-beautify-html": {

+ 2 - 1
CHANGELOG.zh_CN.md

@@ -11,7 +11,8 @@
 
 ### 🎫 Chores
 
-- 更新 antdv 到`2.0.0-rc.1`
+- 更新 antdv 到`2.0.0-rc.1`(暂时还原到 beta15,rc1 菜单卡顿太严重.)
+- 添加部分注释
 
 ### 🐛 Bug Fixes
 

+ 2 - 2
build/vite/plugin/context/transform.ts

@@ -1,7 +1,7 @@
-// 修改自
+// Modified from
 // https://github.com/luxueyan/vite-transform-globby-import/blob/master/src/index.ts
 
-// TODO 目前还不能监听文件新增及删除 内容已经改变,缓存问题?
+// TODO Currently, it is not possible to monitor file addition and deletion. The content has been changed, the cache problem?
 import { join } from 'path';
 import { lstatSync } from 'fs';
 import glob from 'glob';

+ 3 - 3
mock/demo/account.ts

@@ -4,11 +4,11 @@ import { resultSuccess } from '../_util';
 const userInfo = {
   name: 'Vben',
   userid: '00000001',
-  email: 'antdesign@alipay.com',
+  email: 'test@gmail.com',
   signature: '海纳百川,有容乃大',
   introduction: '微笑着,努力着,欣赏着',
   title: '交互专家',
-  group: '蚂蚁集团11-某某某事业群-某某平台部-某某技术部-UED',
+  group: '某某某事业群-某某平台部-某某技术部-UED',
   tags: [
     {
       key: '0',
@@ -38,7 +38,7 @@ const userInfo = {
   notifyCount: 12,
   unreadCount: 11,
   country: 'China',
-  address: '厦门市 77 号',
+  address: 'Xiamen City 77',
   phone: '0592-268888888',
 };
 

+ 9 - 9
package.json

@@ -22,8 +22,8 @@
   },
   "dependencies": {
     "@iconify/iconify": "^2.0.0-rc.2",
-    "@vueuse/core": "^4.0.0-beta.41",
-    "ant-design-vue": "^2.0.0-rc.1",
+    "@vueuse/core": "4.0.0-beta.41",
+    "ant-design-vue": "2.0.0-beta.15",
     "apexcharts": "3.22.0",
     "axios": "^0.21.0",
     "echarts": "^4.9.0",
@@ -35,7 +35,7 @@
     "qrcode": "^1.4.4",
     "vditor": "^3.6.2",
     "vue": "^3.0.2",
-    "vue-i18n": "^9.0.0-beta.6",
+    "vue-i18n": "^9.0.0-beta.7",
     "vue-router": "^4.0.0-rc.3",
     "vuex": "^4.0.0-rc.1",
     "vuex-module-decorators": "^1.0.1",
@@ -45,10 +45,10 @@
   "devDependencies": {
     "@commitlint/cli": "^11.0.0",
     "@commitlint/config-conventional": "^11.0.0",
-    "@iconify/json": "^1.1.258",
+    "@iconify/json": "^1.1.260",
     "@ls-lint/ls-lint": "^1.9.2",
     "@purge-icons/generated": "^0.4.1",
-    "@types/echarts": "^4.9.0",
+    "@types/echarts": "^4.9.1",
     "@types/fs-extra": "^9.0.4",
     "@types/koa-static": "^4.0.1",
     "@types/lodash-es": "^4.17.3",
@@ -56,10 +56,10 @@
     "@types/nprogress": "^0.2.0",
     "@types/qrcode": "^1.3.5",
     "@types/rollup-plugin-visualizer": "^2.6.0",
-    "@types/yargs": "^15.0.9",
+    "@types/yargs": "^15.0.10",
     "@types/zxcvbn": "^4.4.0",
-    "@typescript-eslint/eslint-plugin": "^4.6.1",
-    "@typescript-eslint/parser": "^4.6.1",
+    "@typescript-eslint/eslint-plugin": "^4.8.1",
+    "@typescript-eslint/parser": "^4.8.1",
     "@vue/compiler-sfc": "^3.0.2",
     "@vuedx/typecheck": "^0.2.4-0",
     "@vuedx/typescript-plugin-vue": "^0.2.4-0",
@@ -84,7 +84,7 @@
     "prettier": "^2.1.2",
     "rimraf": "^3.0.2",
     "rollup-plugin-visualizer": "^4.1.2",
-    "stylelint": "^13.7.2",
+    "stylelint": "^13.8.0",
     "stylelint-config-prettier": "^8.0.2",
     "stylelint-config-standard": "^20.0.0",
     "stylelint-order": "^4.1.0",

+ 4 - 0
prettier.config.js

@@ -1,3 +1,7 @@
+/*
+ * @Author: Vben
+ * @Description:
+ */
 module.exports = {
   printWidth: 100,
   tabWidth: 2,

+ 0 - 3
public/resource/img/loading.svg

@@ -33,20 +33,17 @@
   </style>
   <circle cx="97" cy="97" r="81" stroke-width="16" stroke="#327fd8" fill="none"></circle>
   <g class="load">
-    <!--右半圆环-->
     <linearGradient id="left-linear" gradientUnits="userSpaceOnUse" x1="50" y1="0" x2="100" y2="180">
       <stop offset="0" style="stop-color: #64acff;" />
       <stop offset="1" style="stop-color: #9DBFE4;" />
     </linearGradient>
     <path class="left-linear" d="M20,100c0-44.1,35.9-80,80-80V0C44.8,0,0,44.8,0,100s44.8,100,100,100v-20C55.9,180,20,144.1,20,100z" />
-    <!--左半圆环-->
     <circle class="bottom" cx="100" cy="190" r="10" />
     <linearGradient id="right-linear" gradientUnits="userSpaceOnUse" x1="100" y1="120" x2="100" y2="180">
       <stop offset="0" style="stop-color: transparent;" />
       <stop offset="1" style="stop-color: transparent;" />
     </linearGradient>
     <path class="right-linear" d="M100,0v20c44.1,0,80,35.9,80,80c0,44.1-35.9,80-80,80v20c55.2,0,100-44.8,100-100S155.2,0,100,0z" />
-    <!--左半圆环-->
     <circle class="top" cx="100" cy="10" r="10" />
   </g>
 </svg>

+ 11 - 16
src/App.vue

@@ -1,5 +1,5 @@
 <template>
-  <ConfigProvider :locale="zhCN" :transform-cell-text="transformCellText" v-bind="lockOn">
+  <ConfigProvider v-bind="lockEvent" :locale="zhCN" :transform-cell-text="transformCellText">
     <router-view />
   </ConfigProvider>
 </template>
@@ -13,9 +13,8 @@
   import moment from 'moment';
   import 'moment/dist/locale/zh-cn';
 
-  import { useConfigProvider, useInitAppConfigStore } from './useApp';
+  import { getConfigProvider, initAppConfigStore } from '/@/setup/Application';
   import { useLockPage } from '/@/hooks/web/useLockPage';
-  import { useSetting } from '/@/hooks/core/useSetting';
 
   moment.locale('zh-cn');
 
@@ -23,26 +22,22 @@
     name: 'App',
     components: { ConfigProvider },
     setup() {
-      // Initialize application settings
-      useInitAppConfigStore();
-      // Initialize breakpoint monitoring
+      // Initialize vuex internal system configuration
+      initAppConfigStore();
+
+      // Create a global breakpoint monitor
       createBreakpointListen();
-      // Get system configuration
-      const { projectSetting } = useSetting();
+
       // Get ConfigProvider configuration
-      const { transformCellText } = useConfigProvider();
+      const { transformCellText } = getConfigProvider();
 
-      let lockOn = {};
-      if (projectSetting.lockTime) {
-        // Monitor the mouse or keyboard time, used to recalculate the lock screen time
-        const { on } = useLockPage();
-        lockOn = on;
-      }
+      // Create a lock screen monitor
+      const lockEvent = useLockPage();
 
       return {
         transformCellText,
         zhCN,
-        lockOn,
+        lockEvent,
       };
     },
   });

+ 1 - 1
src/api/demo/account.ts

@@ -5,7 +5,7 @@ enum Api {
   ACCOUNT_INFO = '/account/getAccountInfo',
 }
 
-// 获取个人中心--基础设置内容
+// Get personal center-basic settings
 export function accountInfoApi() {
   return defHttp.request<GetAccountInfoModel>({
     url: Api.ACCOUNT_INFO,

+ 1 - 1
src/api/sys/menu.ts

@@ -7,7 +7,7 @@ enum Api {
 }
 
 /**
- * @description: 根据id获取用户菜单
+ * @description: Get user menu based on id
  */
 export function getMenuListById(params: getMenuListByIdParams) {
   return defHttp.request<getMenuListByIdParamsResultModel>({

+ 2 - 2
src/api/sys/model/menuModel.ts

@@ -11,13 +11,13 @@ export interface RouteItem {
 }
 
 /**
- * @description: 获取菜单接口
+ * @description: Get menu interface
  */
 export interface getMenuListByIdParams {
   id: number | string;
 }
 
 /**
- * @description: 获取菜单返回值
+ * @description: Get menu return value
  */
 export type getMenuListByIdParamsResultModel = RouteItem[];

+ 1 - 1
src/api/sys/upload.ts

@@ -7,7 +7,7 @@ enum Api {
 }
 
 /**
- * @description: 上传接口
+ * @description: Upload interface
  */
 export function uploadApi(
   params: UploadFileParams,

+ 7 - 1
src/components/Authority/index.ts

@@ -1,2 +1,8 @@
+import type { App } from 'vue';
 import Authority from './src/index.vue';
-export default Authority;
+
+export default (app: App): void => {
+  app.component(Authority.name, Authority);
+};
+
+export { Authority };

+ 17 - 8
src/components/Authority/src/index.vue

@@ -1,17 +1,28 @@
+<!--
+ * @Author: Vben
+ * @Description:Access control component for fine-grained access control.
+-->
 <script lang="ts">
   import type { PropType } from 'vue';
   import { defineComponent, computed, unref } from 'vue';
 
   import { PermissionModeEnum } from '/@/enums/appEnum';
   import { RoleEnum } from '/@/enums/roleEnum';
+
   import { usePermission } from '/@/hooks/web/usePermission';
   import { appStore } from '/@/store/modules/app';
+
   import { getSlot } from '/@/utils/helper/tsxHelper';
 
   export default defineComponent({
     name: 'Authority',
     props: {
-      // 指定角色可见
+      /**
+       * Specified role is visible
+       * When the permission mode is the role mode, the value value can pass the role value.
+       * When the permission mode is background, the value value can pass the code permission value
+       * @default ''
+       */
       value: {
         type: [Number, Array, String] as PropType<RoleEnum | RoleEnum[] | string | string[]>,
         default: '',
@@ -23,7 +34,7 @@
       });
 
       /**
-       * 渲染角色按钮
+       * Render role button
        */
       function renderRoleAuth() {
         const { value } = props;
@@ -34,10 +45,8 @@
         return hasPermission(value) ? getSlot(slots) : null;
       }
 
-      /**
-       * 渲染编码按钮
-       * 这里只判断是否包含,具体实现可以根据项目自行写逻辑
-       */
+      //  Render coding button
+      // Here only judge whether it is included, the specific implementation can be written according to the project logic
       function renderCodeAuth() {
         const { value } = props;
         if (!value) {
@@ -49,12 +58,12 @@
 
       return () => {
         const mode = unref(getModeRef);
-        // 基于角色渲染
+        // Role-based value control
         if (mode === PermissionModeEnum.ROLE) {
           return renderRoleAuth();
         }
 
-        // 基于后台编码渲染
+        // Based on background role permission control
         if (mode === PermissionModeEnum.BACK) {
           return renderCodeAuth();
         }

+ 4 - 0
src/components/Basic/src/BasicArrow.vue

@@ -1,3 +1,7 @@
+<!--
+ * @Author: Vben
+ * @Description: Arrow component with animation
+-->
 <template>
   <span :class="getClass">
     <RightOutlined />

+ 1 - 3
src/components/Basic/src/BasicHelp.vue

@@ -71,9 +71,6 @@
         return props.absolute ? props.position : {};
       });
 
-      /**
-       * @description: 渲染内容
-       */
       const renderTitle = () => {
         const list = props.text;
         if (isString(list)) {
@@ -89,6 +86,7 @@
 
       return () => {
         return h(
+          // @ts-ignores
           Tooltip,
           {
             title: h(

+ 6 - 47
src/components/Button/index.vue

@@ -12,33 +12,19 @@
 
   import { defineComponent, computed } from 'vue';
   import { Button } from 'ant-design-vue';
-  // import { extendSlots } from '/@/utils/helper/tsxHelper';
-  // import { useThrottle } from '/@/hooks/core/useThrottle';
-  // import { isFunction } from '/@/utils/is';
   import Icon from '/@/components/Icon';
   export default defineComponent({
     name: 'AButton',
     inheritAttrs: false,
     components: { Button, Icon },
     props: {
-      // 按钮类型
       type: {
         type: String as PropType<'primary' | 'default' | 'danger' | 'dashed' | 'link'>,
         default: 'default',
       },
-      // 节流防抖类型 throttle debounce
-      // throttle: {
-      //   type: String as PropType<'throttle' | 'debounce'>,
-      //   default: 'throttle',
-      // },
       color: {
         type: String as PropType<'error' | 'warning' | 'success' | ''>,
       },
-      // // 防抖节流时间
-      // throttleTime: {
-      //   type: Number as PropType<number>,
-      //   default: 50,
-      // },
       loading: {
         type: Boolean as PropType<boolean>,
         default: false,
@@ -58,42 +44,15 @@
       const getIsCircleBtn = computed(() => {
         return attrs.shape === 'circle';
       });
-      // const getListeners = computed(() => {
-      //   const { throttle, throttleTime = 0 } = props;
-      //   // 是否开启节流防抖
-      //   const throttleType = throttle!.toLowerCase();
-      //   const isDebounce = throttleType === 'debounce';
-      //   const openThrottle = ['throttle', 'debounce'].includes(throttleType) && throttleTime > 0;
-      //   if (!openThrottle) {
-      //     return {
-      //       ...attrs,
-      //     };
-      //   }
-
-      //   const on: {
-      //     onClick?: Fn;
-      //   } = {};
-
-      //   if (attrs.onClick && isFunction(attrs.onClick) && openThrottle) {
-      //     const [handler] = useThrottle(attrs.onClick as any, throttleTime!, {
-      //       debounce: isDebounce,
-      //       immediate: false,
-      //     });
-      //     on.onClick = handler;
-      //   }
-
-      //   return {
-      //     ...attrs,
-      //     ...on,
-      //   };
-      // });
 
       const getColor = computed(() => {
-        const res: string[] = [];
         const { color, disabled } = props;
-        color && res.push(`ant-btn-${color}`);
-        disabled && res.push('is-disabled');
-        return res;
+        return [
+          {
+            [`ant-btn-${color}`]: !!color,
+            [`is-disabled`]: disabled,
+          },
+        ];
       });
 
       const getBindValue = computed((): any => {

+ 2 - 1
src/components/Container/src/LazyContainer.vue

@@ -22,7 +22,8 @@
   import { defineComponent, reactive, onMounted, ref, toRef, toRefs } from 'vue';
 
   import { Skeleton } from 'ant-design-vue';
-  import { useTimeoutFn, useIntersectionObserver } from '@vueuse/core';
+  import { useTimeoutFn } from '@vueuse/core';
+  import { useIntersectionObserver } from '/@/hooks/event/useIntersectionObserver';
   interface State {
     isInit: boolean;
     loading: boolean;

+ 8 - 9
src/components/Container/src/collapse/CollapseContainer.vue

@@ -43,23 +43,22 @@
     },
     name: 'CollapseContainer',
     props: {
-      // 标题
       title: {
         type: String as PropType<string>,
         default: '',
       },
-      // 是否可以展开
+      // Can it be expanded
       canExpan: {
         type: Boolean as PropType<boolean>,
         default: true,
       },
-      // 标题右侧温馨提醒
+      // Warm reminder on the right side of the title
       helpMessage: {
         type: [Array, String] as PropType<string[] | string>,
         default: '',
       },
-      // 展开收缩的时候是否触发window.resize,
-      // 可以适应表格和表单,当表单收缩起来,表格触发resize 自适应高度
+      // Whether to trigger window.resize when expanding and contracting,
+      // Can adapt to tables and forms, when the form shrinks, the form triggers resize to adapt to the height
       triggerWindowResize: {
         type: Boolean as PropType<boolean>,
         default: false,
@@ -68,12 +67,12 @@
         type: Boolean as PropType<boolean>,
         default: false,
       },
-      // 延时加载
+      // Delayed loading
       lazy: {
         type: Boolean as PropType<boolean>,
         default: false,
       },
-      // 延时加载时间
+      // Delayed loading time
       lazyTime: {
         type: Number as PropType<number>,
         default: 0,
@@ -82,14 +81,14 @@
     setup(props) {
       const showRef = ref(true);
       /**
-       * @description: 处理开展事件
+       * @description: Handling development events
        */
       function handleExpand() {
         const hasShow = !unref(showRef);
         showRef.value = hasShow;
 
         if (props.triggerWindowResize) {
-          // 这里200毫秒是因为展开有动画,
+          // 200 milliseconds here is because the expansion has animation,
           useTimeoutFn(triggerWindowResize, 200);
         }
       }

+ 2 - 4
src/components/ContextMenu/src/props.ts

@@ -9,25 +9,23 @@ export const props = {
     type: Object as PropType<Event>,
     default: null,
   },
-  // 样式
   styles: {
     type: Object as PropType<any>,
     default: null,
   },
   showIcon: {
-    // 是否显示icon
     type: Boolean as PropType<boolean>,
     default: true,
   },
   axis: {
-    // 鼠标右键点击的位置
+    // The position of the right mouse button click
     type: Object as PropType<Axis>,
     default() {
       return { x: 0, y: 0 };
     },
   },
   items: {
-    // 最重要的列表,没有的话直接不显示
+    // The most important list, if not, will not be displayed
     type: Array as PropType<ContextMenuItem[]>,
     default() {
       return [];

+ 1 - 1
src/components/CountTo/index.ts

@@ -1,2 +1,2 @@
-// 对vue-count-to进行改造成支持vue3版本
+// Transform vue-count-to to support vue3 version
 export { default as CountTo } from './src/index.vue';

+ 7 - 9
src/components/Description/src/index.tsx

@@ -14,9 +14,8 @@ export default defineComponent({
   props: descProps,
   emits: ['register'],
   setup(props, { attrs, slots, emit }) {
-    // props来自设置
     const propsRef = ref<Partial<DescOptions> | null>(null);
-    // 自定义title组件:获得title
+    // Custom title component: get title
     const getMergeProps = computed(() => {
       return {
         ...props,
@@ -34,19 +33,19 @@ export default defineComponent({
     });
 
     /**
-     * @description: 是否使用标题
+     * @description: Whether to use title
      */
     const useWrapper = computed(() => {
       return !!unref(getMergeProps).title;
     });
 
     /**
-     * @description: 获取配置Collapse
+     * @description: Get configuration Collapse
      */
     const getCollapseOptions = computed(
       (): CollapseContainerOptions => {
         return {
-          // 默认不能展开
+          // Cannot be expanded by default
           canExpand: false,
           ...unref(getProps).collapseOptions,
         };
@@ -57,7 +56,7 @@ export default defineComponent({
      * @description:设置desc
      */
     function setDescProps(descProps: Partial<DescOptions>): void {
-      // 保留上一次的setDrawerProps
+      // Keep the last setDrawerProps
       const mergeProps = deepMerge(unref(propsRef) || {}, descProps);
       propsRef.value = cloneDeep(mergeProps);
     }
@@ -68,7 +67,7 @@ export default defineComponent({
 
     emit('register', methods);
 
-    // 防止换行
+    // Prevent line breaks
     function renderLabel({ label, labelMinWidth, labelStyle }: DescItem) {
       if (!labelStyle && !labelMinWidth) {
         return label;
@@ -101,7 +100,6 @@ export default defineComponent({
 
         const width = contentMinWidth;
         return (
-          // @ts-ignore
           <Descriptions.Item label={renderLabel(item)} key={field} span={span}>
             {() =>
               contentMinWidth ? (
@@ -131,7 +129,7 @@ export default defineComponent({
 
     const renderContainer = () => {
       const content = props.useCollapse ? renderDesc() : <div>{renderDesc()}</div>;
-      // 减少dom层级
+      // Reduce the dom level
       return props.useCollapse ? (
         <CollapseContainer
           title={unref(getMergeProps).title}

+ 4 - 5
src/components/Description/src/types.ts

@@ -2,7 +2,6 @@ import type { VNode } from 'vue';
 import type { CollapseContainerOptions } from '/@/components/Container/index';
 
 export interface DescItem {
-  // 最小宽度
   labelMinWidth?: number;
 
   contentMinWidth?: number;
@@ -11,7 +10,7 @@ export interface DescItem {
 
   field: string;
   label: any;
-  // 和并列
+  // Merge column
   span?: number;
   show?: (...arg: any) => boolean;
   // render
@@ -19,10 +18,10 @@ export interface DescItem {
 }
 
 export interface DescOptions {
-  // 是否包含collapse组件
+  // Whether to include the collapse component
   useCollapse?: boolean;
   /**
-   * item配置
+   * item configuration
    * @type DescItem
    */
   schema: DescItem[];
@@ -32,7 +31,7 @@ export interface DescOptions {
    */
   data: any;
   /**
-   * 内置的CollapseContainer组件配置
+   * Built-in CollapseContainer component configuration
    * @type CollapseContainerOptions
    */
   collapseOptions?: CollapseContainerOptions;

+ 3 - 3
src/components/Drawer/src/BasicDrawer.tsx

@@ -71,7 +71,7 @@ export default defineComponent({
       }
     );
 
-    // 底部按钮自定义实现,
+    // Custom implementation of the bottom button,
     const getFooterHeight = computed(() => {
       const { footerHeight, showFooter }: DrawerProps = unref(getProps);
       if (showFooter && footerHeight) {
@@ -80,7 +80,7 @@ export default defineComponent({
       return `0px`;
     });
 
-    // 取消事件
+    // Cancel event
     async function onClose(e: any) {
       const { closeFunc } = unref(getProps);
       emit('close', e);
@@ -93,7 +93,7 @@ export default defineComponent({
     }
 
     function setDrawerProps(props: Partial<DrawerProps>): void {
-      // 保留上一次的setDrawerProps
+      // Keep the last setDrawerProps
       propsRef.value = deepMerge(unref(propsRef) || {}, props);
       if (Reflect.has(props, 'visible')) {
         visibleRef.value = !!props.visible;

+ 2 - 3
src/components/Drawer/src/props.ts

@@ -1,9 +1,8 @@
 import type { PropType } from 'vue';
-// import {DrawerProps} from './types'
 export const footerProps = {
   confirmLoading: Boolean as PropType<boolean>,
   /**
-   * @description: 显示关闭按钮
+   * @description: Show close button
    */
   showCancelBtn: {
     type: Boolean as PropType<boolean>,
@@ -15,7 +14,7 @@ export const footerProps = {
     default: '关闭',
   },
   /**
-   * @description: 显示确认按钮
+   * @description: Show confirmation button
    */
   showOkBtn: {
     type: Boolean as PropType<boolean>,

+ 1 - 1
src/components/Drawer/src/types.ts

@@ -73,7 +73,7 @@ export interface DrawerProps extends DrawerFooterProps {
   showDetailBack?: boolean;
   visible?: boolean;
   /**
-   * 内置的ScrollContainer组件配置
+   * Built-in ScrollContainer component configuration
    * @type ScrollContainerOptions
    */
   scrollOptions?: ScrollContainerOptions;

+ 1 - 1
src/components/Drawer/src/useDrawer.ts

@@ -22,7 +22,7 @@ import { isFunction } from '/@/utils/is';
 
 const dataTransferRef = reactive<any>({});
 /**
- * @description: 适用于将drawer独立出去,外面调用
+ * @description: Applicable to separate drawer and call outside
  */
 export function useDrawer(): UseDrawerReturnType {
   if (!getCurrentInstance()) {

+ 1 - 49
src/components/Dropdown/props.ts

@@ -1,7 +1,5 @@
 import type { PropType } from 'vue';
-/**
- * @description: 基础表格参数配置
- */
+
 export const dropdownProps = {
   /**
    * the trigger mode which executes the drop-down action
@@ -14,52 +12,6 @@ export const dropdownProps = {
       return ['contextmenu'];
     },
   },
-
-  // /**
-  //  * the dropdown menu
-  //  * @type () => Menu
-  //  */
-  // overlay: {
-  //   type: null,
-  // },
-
-  // /**
-  //  * Class name of the dropdown root element
-  //  * @type string
-  //  */
-  // overlayClassName: String,
-
-  // /**
-  //  * Style of the dropdown root element
-  //  * @type object
-  //  */
-  // overlayStyle: Object,
-
-  // /**
-  //  * whether the dropdown menu is visible
-  //  * @type boolean
-  //  */
-  // visible: Boolean,
-
-  // /**
-  //  * whether the dropdown menu is disabled
-  //  * @type boolean
-  //  */
-  // disabled: Boolean,
-
-  // /**
-  //  * to set the ontainer of the dropdown menu. The default is to create a div element in body, you can reset it to the scrolling area and make a relative reposition.
-  //  * @default () => document.body
-  //  * @type Function
-  //  */
-  // getPopupContainer: Function,
-
-  // /**
-  //  * placement of pop menu: bottomLeft bottomCenter bottomRight topLeft topCenter topRight
-  //  * @default 'bottomLeft'
-  //  * @type string
-  //  */
-  // placement: String,
 };
 export const basicDropdownProps = Object.assign({}, dropdownProps, {
   dropMenuList: {

+ 11 - 7
src/components/Form/src/BasicForm.vue

@@ -27,7 +27,7 @@
 <script lang="ts">
   import type { FormActionType, FormProps, FormSchema } from './types/form';
   import type { AdvanceState } from './types/hooks';
-  import type { Ref } from 'vue';
+  import type { Ref, WatchStopHandle } from 'vue';
   import type { ValidateFields } from 'ant-design-vue/lib/form/interface';
 
   import { defineComponent, reactive, ref, computed, unref, toRef, onMounted, watch } from 'vue';
@@ -66,6 +66,7 @@
       });
 
       const defaultValueRef = ref<any>({});
+      const isInitedDefaultRef = ref(false);
       const propsRef = ref<Partial<FormProps>>({});
       const schemaRef = ref<Nullable<FormSchema[]>>(null);
       const formElRef = ref<Nullable<FormActionType>>(null);
@@ -164,16 +165,19 @@
         }
       );
 
-      watch(
+      const stopWatch: WatchStopHandle = watch(
         () => getSchema.value,
-        () => {
-          initDefault();
+        (schema) => {
+          if (unref(isInitedDefaultRef)) {
+            return stopWatch();
+          }
+          if (schema && schema.length) {
+            initDefault();
+            isInitedDefaultRef.value = true;
+          }
         }
       );
 
-      /**
-       * @description:设置表单
-       */
       function setProps(formProps: Partial<FormProps>): void {
         const mergeProps = deepMerge(unref(propsRef) || {}, formProps);
         propsRef.value = mergeProps;

+ 1 - 1
src/components/Form/src/componentMap.ts

@@ -1,6 +1,6 @@
 import { Component } from 'vue';
 /**
- * 组件列表,在这里注册才可以在表单使用
+ * Component list, register here to use it in the form
  */
 import {
   Input,

+ 2 - 2
src/components/Form/src/hooks/useAdvanced.ts

@@ -114,7 +114,7 @@ export default function ({
       ) {
         advanceState.hideAdvanceBtn = false;
 
-        // 大于3行默认收起
+        // More than 3 lines collapsed by default
       } else if (!advanceState.isLoad) {
         advanceState.isLoad = true;
         advanceState.isAdvanced = !advanceState.isAdvanced;
@@ -124,7 +124,7 @@ export default function ({
     if (itemColSum > BASIC_COL_LEN) {
       return { isAdvanced: advanceState.isAdvanced, itemColSum };
     } else {
-      // 第一行始终显示
+      // The first line is always displayed
       return { isAdvanced: true, itemColSum };
     }
   }

+ 6 - 6
src/components/Form/src/hooks/useFormAction.ts

@@ -62,7 +62,7 @@ export function useFormAction({
     Object.keys(values).forEach((key) => {
       const element = values[key];
       if (element !== undefined && element !== null && fields.includes(key)) {
-        // 时间
+        // time type
         if (itemIsDateType(key)) {
           if (Array.isArray(element)) {
             const arr: any[] = [];
@@ -84,7 +84,7 @@ export function useFormAction({
     // }
   }
   /**
-   * @description: 根据字段名删除
+   * @description: Delete based on field name
    */
   function removeSchemaByFiled(fields: string | string[]): void {
     const schemaList: FormSchema[] = cloneDeep(unref(getSchema));
@@ -102,7 +102,7 @@ export function useFormAction({
   }
 
   /**
-   * @description: 根据字段名删除
+   * @description: Delete based on field name
    */
   function _removeSchemaByFiled(field: string, schemaList: FormSchema[]): void {
     if (isString(field)) {
@@ -114,7 +114,7 @@ export function useFormAction({
   }
 
   /**
-   * @description: 往某个字段后面插入,如果没有插入最后一个
+   * @description: Insert after a certain field, if not insert the last
    */
   function appendSchemaByField(schema: FormSchema, prefixField?: string) {
     const schemaList: FormSchema[] = cloneDeep(unref(getSchema));
@@ -169,7 +169,7 @@ export function useFormAction({
   }
 
   /**
-   * @description: 是否是时间
+   * @description: Is it time
    */
   function itemIsDateType(key: string) {
     return unref(getSchema).some((item) => {
@@ -193,7 +193,7 @@ export function useFormAction({
   }
 
   /**
-   * @description: 表单提交
+   * @description: Form submission
    */
   async function handleSubmit(e?: Event): Promise<void> {
     e && e.preventDefault();

+ 3 - 3
src/components/Form/src/hooks/useFormValues.ts

@@ -18,7 +18,7 @@ export function useFormValues({
   getSchema,
   formModel,
 }: UseFormValuesContext) {
-  // 处理表单值
+  // Processing form values
   function handleFormValues(values: any) {
     if (!isObject(values)) {
       return {};
@@ -37,7 +37,7 @@ export function useFormValues({
       if (isArray(value) && value[0]._isAMomentObject && value[1]._isAMomentObject) {
         value = value.map((item) => transformDateFunc(item));
       }
-      // 去除空格
+      // Remove spaces
       if (isString(value)) {
         value = value.trim();
       }
@@ -47,7 +47,7 @@ export function useFormValues({
   }
 
   /**
-   * @description: 处理时间区间参数
+   * @description: Processing time interval parameters
    */
   function handleRangeTimeValue(values: any) {
     const fieldMapToTime = unref(fieldMapToTimeRef);

+ 1 - 1
src/components/Form/src/hooks/useLabelWidth.ts

@@ -31,7 +31,7 @@ export function useItemLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<
       wrapperCol: globWrapperCol,
     } = unref(propsRef) as any;
 
-    // 如果全局有设置labelWidth, 则所有item使用
+    // If labelWidth is set globally, all items use
     if ((!globalLabelWidth && !labelWidth && !globalLabelCol) || disabledLabelWidth) {
       return { labelCol, wrapperCol };
     }

+ 49 - 49
src/components/Form/src/types/form.ts

@@ -42,57 +42,57 @@ export type UseFormReturnType = [RegisterFn, FormActionType];
 
 export interface FormProps {
   // layout?: 'vertical' | 'inline' | 'horizontal';
-  // 表单值
+  // Form value
   model?: any;
-  // 整个表单所有项宽度
+  // The width of all items in the entire form
   labelWidth?: number | string;
-  // 重置时提交
+  // Submit form on reset
   submitOnReset?: boolean;
-  // 整个表单通用Col配置
+  // Col configuration for the entire form
   labelCol?: Partial<ColEx>;
-  // 整个表单通用Col配置
+  // Col configuration for the entire form
   wrapperCol?: Partial<ColEx>;
 
-  // 通用col配置
+  // General col configuration
   baseColProps?: Partial<ColEx>;
 
-  // 表单配置规则
+  // Form configuration rules
   schemas?: FormSchema[];
-  // 用于合并到动态控制表单项的 函数values
+  // Function values used to merge into dynamic control form items
   mergeDynamicData?: any;
-  // 紧凑模式,用于搜索表单
+  // Compact mode for search forms
   compact?: boolean;
-  // 空白行span
+  // Blank line span
   emptySpan?: number | Partial<ColEx>;
-  // 表单内部组件大小
+  // Internal component size of the form
   size?: 'default' | 'small' | 'large';
-  // 是否禁用
+  // Whether to disable
   disabled?: boolean;
-  // 时间区间字段映射成多个
+  // Time interval fields are mapped into multiple
   fieldMapToTime?: FieldMapToTime;
-  // 自动设置placeholder
+  // Placeholder is set automatically
   autoSetPlaceHolder?: boolean;
-  // 校验信息是否加入label
+  // Check whether the information is added to the label
   rulesMessageJoinLabel?: boolean;
-  // 是否显示收起展开按钮
+  // Whether to show collapse and expand buttons
   showAdvancedButton?: boolean;
-  // 超过指定行数自动收起
+  // Automatically collapse over the specified number of rows
   autoAdvancedLine?: number;
-  // 是否显示操作按钮
+  // Whether to show the operation button
   showActionButtonGroup?: boolean;
 
-  // 重置按钮配置
+  // Reset button configuration
   resetButtonOptions?: Partial<ButtonProps>;
 
-  // 确认按钮配置
+  // Confirm button configuration
   submitButtonOptions?: Partial<ButtonProps>;
 
-  // 操作列配置
+  // Operation column configuration
   actionColOptions?: Partial<ColEx>;
 
-  // 显示重置按钮
+  // Show reset button
   showResetButton?: boolean;
-  // 显示确认按钮
+  // Show confirmation button
   showSubmitButton?: boolean;
 
   resetFunc?: () => Promise<void>;
@@ -101,27 +101,27 @@ export interface FormProps {
   colon?: boolean;
 }
 export interface FormSchema {
-  // 字段名
+  // Field name
   field: string;
-  // 内部值更改触发的事件名,默认 change
+  // Event name triggered by internal value change, default change
   changeEvent?: string;
-  // v-model绑定的变量名 默认 value
+  // Variable name bound to v-model Default value
   valueField?: string;
-  // 标签名
+  // Label name
   label: string;
-  // 辅助文本
+  // Auxiliary text
   subLabel?: string;
-  // 文本右侧帮助文本
+  // Help text on the right side of the text
   helpMessage?: string | string[];
-  // BaseHelp组件props
+  // BaseHelp component props
   helpComponentProps?: Partial<HelpComponentProps>;
-  // label宽度,有传的话 itemProps配置的 labelCol 和WrapperCol会失效
+  // Label width, if it is passed, the labelCol and WrapperCol configured by itemProps will be invalid
   labelWidth?: string | number;
-  // 禁用调有formModel全局设置的labelWidth,自己手动设置 labelCol和wrapperCol
+  // Disable the adjustment of labelWidth with global settings of formModel, and manually set labelCol and wrapperCol by yourself
   disabledLabelWidth?: boolean;
-  // 组件
+  // render component
   component: ComponentType;
-  // 组件参数
+  // Component parameters
   componentProps?:
     | ((opt: {
         schema: FormSchema;
@@ -130,35 +130,35 @@ export interface FormSchema {
         formModel: any;
       }) => any)
     | object;
-  // 必填
+  // Required
   required?: boolean;
 
-  // 校验规则
+  // Validation rules
   rules?: Rule[];
-  // 校验信息是否加入label
+  // Check whether the information is added to the label
   rulesMessageJoinLabel?: boolean;
 
-  // 参考formModelItem
+  // Reference formModelItem
   itemProps?: Partial<FormItem>;
 
-  // formModelItem外层的col配置
+  // col configuration outside formModelItem
   colProps?: Partial<ColEx>;
 
   // 默认值
   defaultValue?: any;
   isAdvanced?: boolean;
 
-  // 配合详情组件
+  // Matching details components
   span?: number;
 
   ifShow?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);
 
   show?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);
 
-  // 渲染form-item标签内的内容
+  // Render the content in the form-item tag
   render?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string;
 
-  // 渲染 col内容,需要外层包裹 form-item
+  // Rendering col content requires outer wrapper form-item
   renderColContent?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string;
 
   renderComponentContent?:
@@ -167,10 +167,10 @@ export interface FormSchema {
     | VNode[]
     | string;
 
-  // 自定义slot, 在 from-item内
+  // Custom slot, in from-item
   slot?: string;
 
-  // 自定义slot,类似renderColContent
+  // Custom slot, similar to renderColContent
   colSlot?: string;
 
   dynamicDisabled?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);
@@ -179,16 +179,16 @@ export interface FormSchema {
 }
 export interface HelpComponentProps {
   maxWidth: string;
-  // 是否显示序号
+  // Whether to display the serial number
   showIndex: boolean;
-  // 文本列表
+  // Text list
   text: any;
-  // 颜色
+  // colour
   color: string;
-  // 字体大小
+  // font size
   fontSize: string;
   icon: string;
   absolute: boolean;
-  // 定位
+  // Positioning
   position: any;
 }

+ 3 - 2
src/components/Menu/src/BasicMenu.tsx

@@ -6,7 +6,8 @@ import { Menu } from 'ant-design-vue';
 import SearchInput from './SearchInput.vue';
 import MenuContent from './MenuContent';
 
-import { MenuModeEnum, MenuThemeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
+import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
+import { ThemeEnum } from '/@/enums/appEnum';
 
 import { menuStore } from '/@/store/modules/menu';
 import { appStore } from '/@/store/modules/app';
@@ -254,7 +255,7 @@ export default defineComponent({
           {getSlot(slots, 'header')}
           <SearchInput
             class={!props.search ? 'hidden' : ''}
-            theme={props.theme as MenuThemeEnum}
+            theme={props.theme as ThemeEnum}
             onChange={handleInputChange}
             onClick={handleInputClick}
             collapsed={getCollapsedState}

+ 2 - 2
src/components/Menu/src/SearchInput.vue

@@ -11,7 +11,7 @@
 <script lang="ts">
   import type { PropType } from 'vue';
   import { defineComponent, computed } from 'vue';
-  import { MenuThemeEnum } from '/@/enums/menuEnum';
+  import { ThemeEnum } from '/@/enums/appEnum';
 
   // hook
   import { useDebounce } from '/@/hooks/core/useDebounce';
@@ -25,7 +25,7 @@
         default: true,
       },
       theme: {
-        type: String as PropType<MenuThemeEnum>,
+        type: String as PropType<ThemeEnum>,
       },
     },
     setup(props, { emit }) {

+ 3 - 2
src/components/Menu/src/props.ts

@@ -1,7 +1,8 @@
 import type { Menu } from '/@/router/types';
 import type { PropType } from 'vue';
 
-import { MenuModeEnum, MenuTypeEnum, MenuThemeEnum } from '/@/enums/menuEnum';
+import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
+import { ThemeEnum } from '/@/enums/appEnum';
 export const basicProps = {
   items: {
     type: Array as PropType<Menu[]>,
@@ -40,7 +41,7 @@ export const basicProps = {
   },
   theme: {
     type: String as PropType<string>,
-    default: MenuThemeEnum.DARK,
+    default: ThemeEnum.DARK,
   },
   showLogo: {
     type: Boolean as PropType<boolean>,

+ 2 - 1
src/components/Menu/src/types.d.ts

@@ -1,3 +1,4 @@
+import { ThemeEnum } from '/@/enums/appEnum';
 export interface MenuState {
   // 默认选中的列表
   defaultSelectedKeys: string[];
@@ -6,7 +7,7 @@ export interface MenuState {
   mode: MenuModeEnum;
 
   // 主题
-  theme: ComputedRef<MenuThemeEnum> | MenuThemeEnum;
+  theme: ComputedRef<ThemeEnum> | ThemeEnum;
 
   // 缩进
   inlineIndent?: number;

+ 2 - 2
src/components/Table/src/style/index.less

@@ -208,8 +208,8 @@
   padding: 16px;
 
   .ant-form {
-    padding: 12px 12px 4px 12px;
-    margin-bottom: 12px;
+    padding: 20px 20px 4px 12px;
+    margin-bottom: 18px;
     background: #fff;
     border-radius: 2px;
   }

+ 1 - 1
src/components/registerGlobComp.ts

@@ -33,7 +33,7 @@ import {
   Result,
   Empty,
 } from 'ant-design-vue';
-import { getApp } from '/@/useApp';
+import { getApp } from '/@/setup/Application';
 
 const compList = [Icon, Button, AntButton.Group, AppFooter];
 

+ 1 - 1
src/design/var/index.less

@@ -16,4 +16,4 @@
 @page-loading-z-index: 10000;
 
 // left-menu
-@app-menu-item-height: 46px;
+@app-menu-item-height: 44px;

+ 7 - 0
src/enums/appEnum.ts

@@ -15,6 +15,13 @@ export enum ThemeModeEnum {
   SEMI_DARK = 'semi-dark-mode',
 }
 
+// menu theme enum
+export enum ThemeEnum {
+  DARK = 'dark',
+
+  LIGHT = 'light',
+}
+
 /**
  * 权限模式
  */

+ 0 - 1
src/enums/eventBusEnum.ts

@@ -1 +0,0 @@
-export const MENU_DRAG_STATE = 'MENU_DRAG_STATE';

+ 0 - 7
src/enums/menuEnum.ts

@@ -10,13 +10,6 @@ export enum MenuTypeEnum {
   TOP_MENU = 'top-menu',
 }
 
-// menu theme enum
-export enum MenuThemeEnum {
-  DARK = 'dark',
-
-  LIGHT = 'light',
-}
-
 // 折叠触发器位置
 export enum TriggerEnum {
   // 不显示

+ 0 - 4
src/enums/paginationEnum.ts

@@ -1,4 +0,0 @@
-export enum PaginationEnum {
-  // Default number of pages
-  DEFAULT_PAGE_SIZE = 20,
-}

+ 0 - 6
src/enums/resultEnum.ts

@@ -1,6 +0,0 @@
-export enum ResultEnum {
-  SUCCESS = 0,
-  ERROR = 1,
-  TIMEOUT = 401,
-  TYPE = 'success',
-}

+ 18 - 0
src/hooks/core/onMountedOrActivated.ts

@@ -0,0 +1,18 @@
+import { nextTick, onMounted, onActivated } from 'vue';
+
+export function onMountedOrActivated(hook: Fn) {
+  let mounted: boolean;
+
+  onMounted(() => {
+    hook();
+    nextTick(() => {
+      mounted = true;
+    });
+  });
+
+  onActivated(() => {
+    if (mounted) {
+      hook();
+    }
+  });
+}

+ 9 - 0
src/hooks/core/useExpose.ts

@@ -0,0 +1,9 @@
+import { getCurrentInstance } from 'vue';
+
+// expose public api
+export function useExpose(apis: Record<string, any>) {
+  const instance = getCurrentInstance();
+  if (instance) {
+    Object.assign(instance.proxy, apis);
+  }
+}

+ 47 - 0
src/hooks/core/useModel.ts

@@ -0,0 +1,47 @@
+import { toRef, Ref, reactive, customRef, SetupContext, watch, UnwrapRef } from 'vue';
+
+export type ModelProps<U> = Readonly<
+  { [props: string]: any } & {
+    modelValue?: U;
+  }
+>;
+
+export function useModel<T>(
+  props: ModelProps<T>,
+  context: SetupContext,
+  callback?: (val: T | undefined, internalState: { value: UnwrapRef<T | undefined> }) => any
+) {
+  const outerModel: Ref<T | undefined> = toRef(props, 'modelValue');
+  const internalState = reactive({
+    value: props.modelValue,
+  });
+
+  const internalModel = customRef<UnwrapRef<T> | undefined>((track, trigger) => {
+    return {
+      get() {
+        track();
+        return internalState.value;
+      },
+      set(newVal) {
+        if (internalState.value === newVal) return;
+        internalState.value = newVal;
+        context.emit('update:modelValue', newVal);
+        trigger();
+      },
+    };
+  });
+
+  watch(outerModel, (val, oldVal) => {
+    if (val === oldVal || val === internalState.value) return;
+    if (callback) {
+      callback(val, internalState);
+      return;
+    }
+    internalState.value = val as UnwrapRef<T> | undefined;
+  });
+
+  return {
+    internalState,
+    internalModel,
+  };
+}

+ 15 - 0
src/hooks/core/useRefs.ts

@@ -0,0 +1,15 @@
+import { ref, onBeforeUpdate } from 'vue';
+
+export function useRefs() {
+  const refs = ref([] as Element[]);
+
+  onBeforeUpdate(() => {
+    refs.value = [];
+  });
+
+  const setRefs = (index: number) => (el: Element) => {
+    refs.value[index] = el;
+  };
+
+  return [refs, setRefs];
+}

+ 3 - 3
src/hooks/core/useThrottle.ts

@@ -27,7 +27,7 @@ export function throttle<T extends unknown[]>(
   }
   let { immediate = false } = options;
   const { once = false, debounce = false } = options;
-  let timeoutId: ReturnType<typeof setTimeout> | undefined;
+  let timeoutId: Nullable<TimeoutHandle>;
   // Has it been cancelled
   let cancelled: boolean | null = false;
   /**
@@ -36,7 +36,7 @@ export function throttle<T extends unknown[]>(
   function clearTimer() {
     if (timeoutId) {
       window.clearTimeout(timeoutId);
-      timeoutId = undefined;
+      timeoutId = null;
     }
   }
   /** cancel exec */
@@ -63,7 +63,7 @@ export function throttle<T extends unknown[]>(
       const callNow = !timeoutId;
       if (callNow) {
         exec();
-        timeoutId = undefined;
+        timeoutId = null;
       }
     } else {
       debounce && clearTimer();

+ 20 - 0
src/hooks/core/useToggle.ts

@@ -0,0 +1,20 @@
+import { ref, watch, Ref, SetupContext } from 'vue';
+
+export function useToggle(internalModel: Ref<unknown>, { emit }: SetupContext) {
+  const isActive = ref(!!internalModel.value);
+  const isToggled = ref(false);
+  watch(internalModel, (val) => {
+    isActive.value = !!val;
+  });
+  watch(isActive, (value) => {
+    !!value !== !!internalModel.value && emit('onUpdate:modelValue', value);
+  });
+  function toggleIt() {
+    isToggled.value = !isToggled.value;
+  }
+  return {
+    isActive,
+    toggleIt,
+    isToggled,
+  };
+}

+ 48 - 0
src/hooks/event/useIntersectionObserver.ts

@@ -0,0 +1,48 @@
+import { Ref, watchEffect, ref } from 'vue';
+
+interface IntersectionObserverProps {
+  target: Ref<Element | null | undefined>;
+  root?: Ref<Element | null | undefined>;
+  onIntersect: IntersectionObserverCallback;
+  rootMargin?: string;
+  threshold?: number;
+}
+
+export function useIntersectionObserver({
+  target,
+  root,
+  onIntersect,
+  rootMargin = '0px',
+  threshold = 0.1,
+}: IntersectionObserverProps) {
+  let cleanup = () => {};
+  const observer: Ref<Nullable<IntersectionObserver>> = ref(null);
+  const stopEffect = watchEffect(() => {
+    cleanup();
+
+    observer.value = new IntersectionObserver(onIntersect, {
+      root: root ? root.value : null,
+      rootMargin,
+      threshold,
+    });
+
+    const current = target.value;
+
+    current && observer.value.observe(current);
+
+    cleanup = () => {
+      if (observer.value) {
+        observer.value.disconnect();
+        target.value && observer.value.unobserve(target.value);
+      }
+    };
+  });
+
+  return {
+    observer,
+    stop: () => {
+      cleanup();
+      stopEffect();
+    },
+  };
+}

+ 7 - 2
src/hooks/web/useClickOutside.ts

@@ -1,10 +1,15 @@
 import { ref, Ref, unref } from 'vue';
 import { useEventListener } from '/@/hooks/event/useEventListener';
+import { isServer } from '/@/utils/is';
 export function useClickOutside<T extends HTMLElement>(
   containerRef: Ref<T>,
-  onClickOutside: (e: MouseEvent | TouchEvent) => void
+  onClickOutside: (e: MouseEvent | TouchEvent) => void,
+  eventName = 'click'
 ) {
+  if (isServer) return;
+
   const isTouchRef = ref(false);
+
   useEventListener({
     el: document,
     name: 'touchend',
@@ -13,7 +18,7 @@ export function useClickOutside<T extends HTMLElement>(
   });
   useEventListener({
     el: document,
-    name: 'click',
+    name: eventName,
     listener: handler,
     options: true,
   });

+ 13 - 0
src/hooks/web/useHeight.ts

@@ -0,0 +1,13 @@
+import { Ref, ref, onMounted, nextTick } from 'vue';
+import { useRect } from '/@/hooks/web/useRect';
+export const useHeight = (element: Element | Ref<Element>) => {
+  const height = ref();
+
+  onMounted(() => {
+    nextTick(() => {
+      height.value = useRect(element).height;
+    });
+  });
+
+  return height;
+};

+ 20 - 13
src/hooks/web/useLockPage.ts

@@ -1,4 +1,4 @@
-import { onUnmounted, watchEffect } from 'vue';
+import { computed, onUnmounted, watchEffect } from 'vue';
 import { useThrottle } from '/@/hooks/core/useThrottle';
 
 import { appStore } from '/@/store/modules/app';
@@ -7,10 +7,11 @@ import { userStore } from '/@/store/modules/user';
 export function useLockPage() {
   let timeId: ReturnType<typeof setTimeout>;
 
-  function clear() {
+  function clear(): void {
     window.clearTimeout(timeId);
   }
-  function resetCalcLockTimeout() {
+
+  function resetCalcLockTimeout(): void {
     // not login
     if (!userStore.getTokenState) {
       clear();
@@ -28,31 +29,37 @@ export function useLockPage() {
     }, lockTime * 60 * 1000);
   }
 
-  function lockPage() {
+  function lockPage(): void {
     appStore.commitLockInfoState({
       isLock: true,
       pwd: undefined,
     });
   }
 
-  watchEffect(() => {
+  watchEffect((onClean) => {
     if (userStore.getTokenState) {
       resetCalcLockTimeout();
     } else {
       clear();
     }
+    onClean(() => {
+      clear();
+    });
   });
+
   onUnmounted(() => {
     clear();
   });
+
   const [keyupFn] = useThrottle(resetCalcLockTimeout, 2000);
 
-  return {
-    registerGlobOnKeyup: keyupFn,
-    registerGlobOnMouseMove: keyupFn,
-    on: {
-      onKeyup: keyupFn,
-      onMousemove: keyupFn,
-    },
-  };
+  return computed(() => {
+    const openLockPage = appStore.getProjectConfig.lockTime;
+    if (openLockPage) {
+      return { onKeyup: keyupFn, onMousemove: keyupFn };
+    } else {
+      clear();
+      return {};
+    }
+  });
 }

+ 24 - 13
src/hooks/web/usePermission.ts

@@ -1,18 +1,24 @@
+import type { RouteRecordRaw } from 'vue-router';
+
 import { appStore } from '/@/store/modules/app';
 import { permissionStore } from '/@/store/modules/permission';
+import { userStore } from '/@/store/modules/user';
+
 import { useTabs } from './useTabs';
-import { RoleEnum } from '/@/enums/roleEnum';
+
 import router, { resetRouter } from '/@/router';
-import { userStore } from '/@/store/modules/user';
-import { isArray } from '/@/utils/is';
 import { RootRoute } from '/@/router/routes';
-import type { RouteRecordRaw } from 'vue-router';
+
 import { PermissionModeEnum } from '/@/enums/appEnum';
+import { RoleEnum } from '/@/enums/roleEnum';
+
 import { intersection } from 'lodash-es';
+import { isArray } from '/@/utils/is';
 
+// User permissions related operations
 export function usePermission() {
   /**
-   * 更换权限模式
+   * Change permission mode
    */
   async function togglePermissionMode() {
     appStore.commitProjectConfigState({
@@ -25,6 +31,10 @@ export function usePermission() {
     // location.reload();
   }
 
+  /**
+   * Reset and regain authority resource information
+   * @param id
+   */
   async function resume(id?: string | number) {
     resetRouter();
     const routes = await permissionStore.buildRoutesAction(id);
@@ -41,12 +51,12 @@ export function usePermission() {
   }
 
   /**
-   * 角色模式下判断是否显示
+   * Determine whether there is permission
    */
   function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
     const permMode = appStore.getProjectConfig.permissionMode;
     if (PermissionModeEnum.ROLE === permMode) {
-      // !不传默认可见
+      // Visible by default
       if (!value) {
         return def;
       }
@@ -56,7 +66,7 @@ export function usePermission() {
       return (intersection(value, userStore.getRoleListState) as RoleEnum[]).length > 0;
     }
     if (PermissionModeEnum.BACK === permMode) {
-      // !不传默认可见
+      // Visible by default
       if (!value) {
         return def;
       }
@@ -66,17 +76,18 @@ export function usePermission() {
       }
       return (intersection(value, allCodeList) as string[]).length > 0;
     }
-
     return true;
   }
 
   /**
-   * 更新角色
+   * Change roles
    * @param roles
    */
   async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
     if (appStore.getProjectConfig.permissionMode !== PermissionModeEnum.ROLE) {
-      throw new Error('请在配置中将PermissionModeEnum切换为ROLE模式在进行操作!');
+      throw new Error(
+        'Please switch PermissionModeEnum to ROLE mode in the configuration to operate!'
+      );
     }
     if (!isArray(roles)) {
       roles = [roles];
@@ -86,10 +97,10 @@ export function usePermission() {
   }
 
   /**
-   *
+   * Change menu
    */
   async function changeMenu(id?: string | number) {
-    // 这里传入id是为测试,实际可以不用传,会自动获取登录人的id
+    // TODO The id passed in here is for testing. Actually, you don’t need to pass it. The id of the login person will be automatically obtained.
     resume(id);
   }
 

+ 33 - 0
src/hooks/web/useRect.ts

@@ -0,0 +1,33 @@
+import { Ref, unref } from 'vue';
+import { isWindow } from '/@/utils/is';
+
+export const useRect = (elementRef: (Element | Window) | Ref<Element | Window | undefined>) => {
+  const element = unref(elementRef);
+
+  if (isWindow(element)) {
+    const width = element.innerWidth;
+    const height = element.innerHeight;
+
+    return {
+      top: 0,
+      left: 0,
+      right: width,
+      bottom: height,
+      width,
+      height,
+    };
+  }
+
+  if (element && element.getBoundingClientRect) {
+    return element.getBoundingClientRect();
+  }
+
+  return {
+    top: 0,
+    left: 0,
+    right: 0,
+    bottom: 0,
+    width: 0,
+    height: 0,
+  };
+};

+ 1 - 1
src/layouts/default/setting/SettingDrawer.tsx

@@ -35,7 +35,7 @@ interface SwitchOptions {
 }
 
 interface SelectConfig {
-  options?: SelectOptions;
+  options?: LabelValueOptions;
   def?: any;
   disabled?: boolean;
   handler?: Fn;

+ 4 - 4
src/layouts/default/setting/const.ts

@@ -1,5 +1,5 @@
-import { ContentEnum, RouterTransitionEnum } from '/@/enums/appEnum';
-import { MenuThemeEnum, TopMenuAlignEnum, TriggerEnum } from '/@/enums/menuEnum';
+import { ContentEnum, RouterTransitionEnum, ThemeEnum } from '/@/enums/appEnum';
+import { TopMenuAlignEnum, TriggerEnum } from '/@/enums/menuEnum';
 
 export enum HandlerEnum {
   CHANGE_LAYOUT,
@@ -40,11 +40,11 @@ export enum HandlerEnum {
 
 export const themeOptions = [
   {
-    value: MenuThemeEnum.LIGHT,
+    value: ThemeEnum.LIGHT,
     label: '亮色',
   },
   {
-    value: MenuThemeEnum.DARK,
+    value: ThemeEnum.DARK,
     label: '暗色',
   },
 ];

+ 15 - 9
src/main.ts

@@ -4,34 +4,40 @@ import router, { setupRouter } from '/@/router';
 import { setupStore } from '/@/store';
 import { setupAntd } from '/@/setup/ant-design-vue';
 import { setupErrorHandle } from '/@/setup/error-handle';
-import { setupDirectives } from '/@/setup/directives';
+import { setupGlobDirectives } from '/@/setup/directives';
 
-import { isDevMode, isProdMode, isUseMock } from '/@/utils/env';
 import { setupProdMockServer } from '../mock/_createProductionServer';
-import { setApp } from './useApp';
+import { setApp } from '/@/setup/Application';
 
 import App from './App.vue';
+
+import { isDevMode, isProdMode, isUseMock } from '/@/utils/env';
+
 import '/@/design/index.less';
 
 const app = createApp(App);
 
-// ui
+// Configure component library
 setupAntd(app);
-// router
+
+// Configure routing
 setupRouter(app);
-// store
+
+// Configure vuex store
 setupStore(app);
 
-// Directives
-setupDirectives(app);
+// Register global directive
+setupGlobDirectives(app);
 
-// error-handle
+// Configure global error handling
 setupErrorHandle(app);
 
+// Mount when the route is ready
 router.isReady().then(() => {
   app.mount('#app');
 });
 
+// The development environment takes effect
 if (isDevMode()) {
   app.config.performance = true;
   window.__APP__ = app;

+ 4 - 4
src/settings/projectSetting.ts

@@ -1,7 +1,7 @@
 import type { ProjectConfig } from '/@/types/config';
 
-import { MenuTypeEnum, MenuThemeEnum, MenuModeEnum, TriggerEnum } from '/@/enums/menuEnum';
-import { ContentEnum, PermissionModeEnum, RouterTransitionEnum } from '/@/enums/appEnum';
+import { MenuTypeEnum, MenuModeEnum, TriggerEnum } from '/@/enums/menuEnum';
+import { ContentEnum, PermissionModeEnum, ThemeEnum, RouterTransitionEnum } from '/@/enums/appEnum';
 import { primaryColor } from '../../build/config/lessModifyVars';
 import { isProdMode } from '/@/utils/env';
 
@@ -39,7 +39,7 @@ const setting: ProjectConfig = {
     // 是否显示顶部
     show: true,
     // theme
-    theme: MenuThemeEnum.LIGHT,
+    theme: ThemeEnum.LIGHT,
     // 开启锁屏功能
     useLockPage: true,
     // 显示刷新按钮
@@ -74,7 +74,7 @@ const setting: ProjectConfig = {
     // 菜单类型
     type: MenuTypeEnum.SIDEBAR,
     // 菜单主题
-    theme: MenuThemeEnum.DARK,
+    theme: ThemeEnum.DARK,
     // 分割菜单
     split: false,
     // 顶部菜单布局

+ 10 - 5
src/useApp.ts → src/setup/Application.ts

@@ -1,4 +1,7 @@
-// Application related functions
+/**
+ * Application configuration
+ */
+
 import type { ProjectConfig } from '/@/types/config';
 import type { App } from 'vue';
 import { computed, ref } from 'vue';
@@ -18,7 +21,9 @@ import {
 
 import { appStore } from '/@/store/modules/app';
 
+// Used to share global app instances
 let app: App;
+
 export function setApp(_app: App): void {
   app = _app;
 }
@@ -27,7 +32,7 @@ export function getApp(): App {
   return app;
 }
 
-// TODO 主题切换
+// TODO Theme switching
 export function useThemeMode(mode: ThemeModeEnum) {
   const modeRef = ref(mode);
   const html = document.documentElement;
@@ -43,7 +48,7 @@ export function useThemeMode(mode: ThemeModeEnum) {
 }
 
 // Initial project configuration
-export function useInitAppConfigStore() {
+export function initAppConfigStore() {
   let projCfg: ProjectConfig = getLocal(PROJ_CFG_KEY) as ProjectConfig;
   if (!projCfg) {
     projCfg = projectSetting;
@@ -67,8 +72,8 @@ export function useInitAppConfigStore() {
   appStore.commitProjectConfigState(projCfg);
 }
 
-// Config Provider
-export function useConfigProvider() {
+// antdv Config Provider
+export function getConfigProvider() {
   function transformCellText({ text }: { text: string }) {
     if (isNull(text) || isUnDef(text)) {
       return ' - ';

+ 1 - 1
src/setup/ant-design-vue/index.ts

@@ -1,5 +1,5 @@
 // Load on demand
-
+// This module only introduces components globally before login
 import type { App } from 'vue';
 
 import {

+ 0 - 14
src/setup/ant-design-vue/spin.less

@@ -1,14 +0,0 @@
-@import (reference) '../../design/index.less';
-
-.app-svg-loading {
-  position: relative;
-  width: auto;
-
-  &__tip {
-    display: block;
-    margin-top: 4px;
-    font-size: 13px;
-    color: #303133;
-    text-align: center;
-  }
-}

+ 7 - 2
src/setup/ant-design-vue/spin.tsx

@@ -1,11 +1,16 @@
 import { Spin } from 'ant-design-vue';
 import svgImg from '/@/assets/images/loading.svg';
 
-import './spin.less';
 Spin.setDefaultIndicator({
   indicator: () => {
     return (
-      <div class="app-svg-loading">
+      <div
+        class="app-svg-loading"
+        style={{
+          position: 'relative',
+          width: 'auto',
+        }}
+      >
         <img src={svgImg} alt="" height="32" width="32" class="g-loading" />
       </div>
     );

+ 86 - 0
src/setup/application.ts

@@ -0,0 +1,86 @@
+/**
+ * Application configuration
+ */
+
+import type { ProjectConfig } from '/@/types/config';
+import type { App } from 'vue';
+import { computed, ref } from 'vue';
+
+import { ThemeModeEnum } from '/@/enums/appEnum';
+import { PROJ_CFG_KEY } from '/@/enums/cacheEnum';
+
+import projectSetting from '/@/settings/projectSetting';
+import { getLocal } from '/@/utils/helper/persistent';
+import { isUnDef, isNull } from '/@/utils/is';
+import {
+  updateGrayMode,
+  updateColorWeak,
+  updateHeaderBgColor,
+  updateSidebarBgColor,
+} from '/@/setup/theme';
+
+import { appStore } from '/@/store/modules/app';
+
+// Used to share global app instances
+let app: App;
+
+export function setApp(_app: App): void {
+  app = _app;
+}
+
+export function getApp(): App {
+  return app;
+}
+
+// TODO Theme switching
+export function useThemeMode(mode: ThemeModeEnum) {
+  const modeRef = ref(mode);
+  const html = document.documentElement;
+  const clsList = html.classList;
+
+  const change = () => {
+    clsList.contains(mode) ? clsList.remove(mode) : clsList.add(mode);
+  };
+  return {
+    runChangeThemeMode: change,
+    mode: computed(() => modeRef.value),
+  };
+}
+
+// Initial project configuration
+export function initAppConfigStore() {
+  let projCfg: ProjectConfig = getLocal(PROJ_CFG_KEY) as ProjectConfig;
+  if (!projCfg) {
+    projCfg = projectSetting;
+  }
+  const { colorWeak, grayMode, headerBgColor, menuBgColor } = projCfg;
+  try {
+    // if (
+    //   themeColor !== primaryColor &&
+    //   themeColor &&
+    //   process.env.VUE_APP_USE_THEME_REPLACER !== 'TRUE'
+    // ) {
+    //   updateTheme(themeColor);
+    // }
+    headerBgColor && updateHeaderBgColor(headerBgColor);
+    menuBgColor && updateSidebarBgColor(menuBgColor);
+    grayMode && updateGrayMode(grayMode);
+    colorWeak && updateColorWeak(colorWeak);
+  } catch (error) {
+    console.log(error);
+  }
+  appStore.commitProjectConfigState(projCfg);
+}
+
+// antdv Config Provider
+export function getConfigProvider() {
+  function transformCellText({ text }: { text: string }) {
+    if (isNull(text) || isUnDef(text)) {
+      return ' - ';
+    }
+    return text;
+  }
+  return {
+    transformCellText,
+  };
+}

+ 5 - 1
src/setup/directives/index.ts

@@ -1,5 +1,9 @@
+/**
+ * Configure and register global directives
+ */
 import type { App } from 'vue';
 import { setupPermissionDirective } from './permission';
-export function setupDirectives(app: App) {
+
+export function setupGlobDirectives(app: App) {
   setupPermissionDirective(app);
 }

+ 27 - 11
src/setup/directives/permission.ts

@@ -1,5 +1,11 @@
+/**
+ * Global authority directive
+ * Used for fine-grained control of component permissions
+ * @Example v-auth="RoleEnum.TEST"
+ */
+import type { App, Directive, DirectiveBinding } from 'vue';
+
 import { appStore } from '/@/store/modules/app';
-import type { App } from 'vue';
 import { usePermission } from '/@/hooks/web/usePermission';
 import { PermissionModeEnum } from '/@/enums/appEnum';
 const { hasPermission } = usePermission();
@@ -13,18 +19,28 @@ function isAuth(el: Element, binding: any) {
     }
   }
 }
+
 function isBackMode() {
   return appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK;
 }
+
+const mounted = (el: Element, binding: DirectiveBinding<any>) => {
+  if (isBackMode()) return;
+  isAuth(el, binding);
+};
+
+const updated = (el: Element, binding: DirectiveBinding<any>) => {
+  if (!isBackMode()) return;
+  isAuth(el, binding);
+};
+
+const authDirective: Directive = {
+  mounted,
+  updated,
+};
+
 export function setupPermissionDirective(app: App) {
-  app.directive('auth', {
-    mounted(el: Element, binding) {
-      if (isBackMode()) return;
-      isAuth(el, binding);
-    },
-    updated(el: Element, binding) {
-      if (!isBackMode()) return;
-      isAuth(el, binding);
-    },
-  });
+  app.directive('auth', authDirective);
 }
+
+export default authDirective;

+ 13 - 6
src/setup/directives/repeatClick.ts

@@ -1,11 +1,16 @@
+/**
+ * Prevent repeated clicks
+ * @Example v-repeat-click="()=>{}"
+ */
 import { on, once } from '/@/utils/domUtils';
+import type { Directive, DirectiveBinding } from 'vue';
 
-export default {
-  beforeMount(el: Element, binding: any) {
-    let interval: ReturnType<typeof setInterval> | null = null;
+const repeatDirective: Directive = {
+  beforeMount(el: Element, binding: DirectiveBinding<any>) {
+    let interval: Nullable<IntervalHandle> = null;
     let startTime = 0;
-    const handler = () => binding.value && binding.value();
-    const clear = () => {
+    const handler = (): void => binding.value && binding.value();
+    const clear = (): void => {
       if (Date.now() - startTime < 100) {
         handler();
       }
@@ -13,7 +18,7 @@ export default {
       interval = null;
     };
 
-    on(el, 'mousedown', (e) => {
+    on(el, 'mousedown', (e: MouseEvent): void => {
       if ((e as any).button !== 0) return;
       startTime = Date.now();
       once(document as any, 'mouseup', clear);
@@ -22,3 +27,5 @@ export default {
     });
   },
 };
+
+export default repeatDirective;

+ 45 - 15
src/setup/error-handle/index.ts

@@ -1,19 +1,28 @@
+/**
+ * Used to configure the global error handling function, which can monitor vue errors, script errors, static resource errors and Promise errors
+ */
+
 import { errorStore, ErrorInfo } from '/@/store/modules/error';
 import { useSetting } from '/@/hooks/core/useSetting';
 import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
 import { App } from 'vue';
+
+/**
+ * Handling error stack information
+ * @param error
+ */
 function processStackMsg(error: Error) {
   if (!error.stack) {
     return '';
   }
   let stack = error.stack
-    .replace(/\n/gi, '') // 去掉换行,节省传输内容大小
-    .replace(/\bat\b/gi, '@') // chrome中是at,ff中是@
-    .split('@') // 以@分割信息
-    .slice(0, 9) // 最大堆栈长度(Error.stackTraceLimit = 10),所以只取前10条
-    .map((v) => v.replace(/^\s*|\s*$/g, '')) // 去除多余空格
-    .join('~') // 手动添加分隔符,便于后期展示
-    .replace(/\?[^:]+/gi, ''); // 去除js文件链接的多余参数(?x=1之类)
+    .replace(/\n/gi, '') // Remove line breaks to save the size of the transmitted content
+    .replace(/\bat\b/gi, '@') // At in chrome, @ in ff
+    .split('@') // Split information with @
+    .slice(0, 9) // The maximum stack length (Error.stackTraceLimit = 10), so only take the first 10
+    .map((v) => v.replace(/^\s*|\s*$/g, '')) // Remove extra spaces
+    .join('~') // Manually add separators for later display
+    .replace(/\?[^:]+/gi, ''); // Remove redundant parameters of js file links (?x=1 and the like)
   const msg = error.toString();
   if (stack.indexOf(msg) < 0) {
     stack = msg + '@' + stack;
@@ -21,6 +30,10 @@ function processStackMsg(error: Error) {
   return stack;
 }
 
+/**
+ * get comp name
+ * @param vm
+ */
 function formatComponentName(vm: any) {
   if (vm.$root === vm) {
     return {
@@ -43,6 +56,10 @@ function formatComponentName(vm: any) {
   };
 }
 
+/**
+ * Configure Vue error handling function
+ */
+
 function vueErrorHandler(err: Error, vm: any, info: string) {
   const { name, path } = formatComponentName(vm);
   errorStore.commitErrorInfoState({
@@ -56,6 +73,9 @@ function vueErrorHandler(err: Error, vm: any, info: string) {
   });
 }
 
+/**
+ * Configure script error handling function
+ */
 export function scriptErrorHandler(
   event: Event | string,
   source?: string,
@@ -86,6 +106,9 @@ export function scriptErrorHandler(
   return true;
 }
 
+/**
+ * Configure Promise error handling function
+ */
 function registerPromiseErrorHandler() {
   window.addEventListener(
     'unhandledrejection',
@@ -104,8 +127,11 @@ function registerPromiseErrorHandler() {
   );
 }
 
+/**
+ * Configure monitoring resource loading error handling function
+ */
 function registerResourceErrorHandler() {
-  // 监控资源加载错误(img,script,css,以及jsonp)
+  // Monitoring resource loading error(img,script,css,and jsonp)
   window.addEventListener(
     'error',
     function (e: Event) {
@@ -129,19 +155,23 @@ function registerResourceErrorHandler() {
   );
 }
 
+/**
+ * Configure global error handling
+ * @param app
+ */
 export function setupErrorHandle(app: App) {
   const { projectSetting } = useSetting();
   const { useErrorHandle } = projectSetting;
-  if (!useErrorHandle) {
-    return;
-  }
-  // Vue异常监控;
+  if (!useErrorHandle) return;
+  // Vue exception monitoring;
   app.config.errorHandler = vueErrorHandler;
-  // js错误
+
+  // script error
   window.onerror = scriptErrorHandler;
-  //  promise 异常
+
+  //  promise exception
   registerPromiseErrorHandler();
 
-  // 静态资源异常
+  // Static resource exception
   registerResourceErrorHandler();
 }

+ 21 - 3
src/setup/theme/index.ts

@@ -1,6 +1,6 @@
 import { isHexColor, colorIsDark, lighten, darken } from '/@/utils/color';
 import { appStore } from '/@/store/modules/app';
-import { MenuThemeEnum } from '/@/enums/menuEnum';
+import { ThemeEnum } from '/@/enums/appEnum';
 
 const HEADER_BG_COLOR_VAR = '--header-bg-color';
 const HEADER_BG_HOVER_COLOR_VAR = '--header-bg-hover-color';
@@ -22,14 +22,26 @@ function toggleClass(flag: boolean, clsName: string) {
   document.body.className = flag ? `${className} ${clsName} ` : className;
 }
 
+/**
+ * Change the status of the project's color weakness mode
+ * @param gray
+ */
 export const updateColorWeak = (colorWeak: boolean) => {
   toggleClass(colorWeak, 'color-weak');
 };
 
+/**
+ * Change project gray mode status
+ * @param gray
+ */
 export const updateGrayMode = (gray: boolean) => {
   toggleClass(gray, 'gray-mode');
 };
 
+/**
+ * Change the background color of the top header
+ * @param color
+ */
 export function updateHeaderBgColor(color: string) {
   if (!isHexColor(color)) return;
   // bg color
@@ -40,15 +52,20 @@ export function updateHeaderBgColor(color: string) {
   setCssVar(HEADER_BG_HOVER_COLOR_VAR, hoverColor);
   setCssVar(HEADER_MENU_ACTIVE_BG_COLOR_VAR, hoverColor);
 
+  // Determine the depth of the color value and automatically switch the theme
   const isDark = colorIsDark(color);
 
   appStore.commitProjectConfigState({
     headerSetting: {
-      theme: isDark ? MenuThemeEnum.DARK : MenuThemeEnum.LIGHT,
+      theme: isDark ? ThemeEnum.DARK : ThemeEnum.LIGHT,
     },
   });
 }
 
+/**
+ * Change the background color of the left menu
+ * @param color  bg color
+ */
 export function updateSidebarBgColor(color: string) {
   if (!isHexColor(color)) return;
 
@@ -58,11 +75,12 @@ export function updateSidebarBgColor(color: string) {
   setCssVar(SIDER_LIGHTEN_2_BG_COLOR, lighten(color, 8));
 
   // only #ffffff is light
+  // Only when the background color is #fff, the theme of the menu will be changed to light
   const isLight = ['#fff', '#ffffff'].includes(color.toLowerCase());
 
   appStore.commitProjectConfigState({
     menuSetting: {
-      theme: isLight ? MenuThemeEnum.LIGHT : MenuThemeEnum.DARK,
+      theme: isLight ? ThemeEnum.LIGHT : ThemeEnum.DARK,
     },
   });
 }

+ 4 - 7
src/store/index.ts

@@ -1,19 +1,16 @@
 import type { App } from 'vue';
-import {
-  createStore,
-  // createLogger, Plugin
-} from 'vuex';
+import { createStore, createLogger, Plugin } from 'vuex';
 import { config } from 'vuex-module-decorators';
 import { isDevMode } from '/@/utils/env';
 
 config.rawError = true;
 const isDev = isDevMode();
-// const plugins: Plugin<any>[] = isDev ? [createLogger()] : [];
+const plugins: Plugin<any>[] = isDev ? [createLogger()] : [];
 
 const store = createStore({
-  modules: {},
+  // modules: {},
   strict: isDev,
-  // plugins,
+  plugins,
 });
 
 export function setupStore(app: App<Element>) {

+ 4 - 4
src/types/config.d.ts

@@ -1,6 +1,6 @@
 // 左侧菜单, 顶部菜单
-import { MenuTypeEnum, MenuModeEnum, MenuThemeEnum, TriggerEnum } from '/@/enums/menuEnum';
-import { ContentEnum, PermissionModeEnum, RouterTransitionEnum } from '/@/enums/appEnum';
+import { MenuTypeEnum, MenuModeEnum, TriggerEnum } from '/@/enums/menuEnum';
+import { ContentEnum, PermissionModeEnum, ThemeEnum, RouterTransitionEnum } from '/@/enums/appEnum';
 
 export interface MessageSetting {
   title: string;
@@ -20,7 +20,7 @@ export interface MenuSetting {
   menuWidth: number;
   mode: MenuModeEnum;
   type: MenuTypeEnum;
-  theme: MenuThemeEnum;
+  theme: ThemeEnum;
   topMenuAlign: 'start' | 'center' | 'end';
   collapsedShowSearch: boolean;
   trigger: TriggerEnum;
@@ -41,7 +41,7 @@ export interface MultiTabsSetting {
 export interface HeaderSetting {
   fixed: boolean;
   show: boolean;
-  theme: MenuThemeEnum;
+  theme: ThemeEnum;
   // 显示刷新按钮
   showRedo: boolean;
   // 显示全屏按钮

+ 2 - 4
src/types/event.d.ts

@@ -1,9 +1,7 @@
-/**
- * @description: 输入框事件
- */
 declare interface ChangeEvent extends Event {
   target: HTMLInputElement;
 }
-interface WheelEvent {
+
+declare interface WheelEvent {
   path?: EventTarget[];
 }

+ 5 - 10
src/types/global.d.ts

@@ -6,7 +6,6 @@ declare interface PromiseFn<T = any, R = T> {
   (...arg: T[]): Promise<R>;
 }
 
-// 任意对象
 declare interface IObj<T = any> {
   [key: string]: T;
   [key: number]: T;
@@ -34,19 +33,11 @@ declare type Indexable<T = any> = {
 
 declare type Hash<T> = Indexable<T>;
 
-// declare type DeepPartial<T> = {
-//   [P in keyof T]?: T[P] extends (infer U)[]
-//     ? RecursivePartial<U>[]
-//     : T[P] extends object
-//     ? RecursivePartial<T[P]>
-//     : T[P];
-// };
-
 declare type DeepPartial<T> = {
   [P in keyof T]?: DeepPartial<T[P]>;
 };
 
-declare type SelectOptions = {
+declare type LabelValueOptions = {
   label: string;
   value: any;
 }[];
@@ -54,3 +45,7 @@ declare type SelectOptions = {
 declare type EmitType = (event: string, ...args: any[]) => void;
 
 declare type TargetContext = '_self' | '_blank';
+
+declare type TimeoutHandle = ReturnType<typeof setTimeout>;
+
+declare type IntervalHandle = ReturnType<typeof setInterval>;

+ 1 - 0
src/types/window.d.ts

@@ -2,6 +2,7 @@ import type { App } from 'vue';
 
 declare global {
   declare interface Window {
+    // Global vue app instance
     __APP__: App<Element>;
   }
 }

+ 2 - 3
src/utils/auth/index.ts

@@ -1,9 +1,8 @@
 import { userStore } from '/@/store/modules/user';
-// import { permissionStore } from '@/store/modules/permission';
-// import { RoleEnum } from '@/enums/roleEnum';
 
 /**
- * @description:  获取token
+ * @description:  Get token
+ * @return jwt token
  */
 export function getToken(): string {
   return userStore.getTokenState;

+ 1 - 1
src/utils/event/triggerWindowResizeEvent.ts

@@ -4,6 +4,6 @@
 export function triggerWindowResize() {
   const event = document.createEvent('HTMLEvents');
   event.initEvent('resize', true, true);
-  (event as any).eventType = 'message';
+  (event as ChangeEvent).eventType = 'message';
   window.dispatchEvent(event);
 }

+ 2 - 4
src/utils/is.ts

@@ -50,10 +50,6 @@ export function isArray(val: unknown): val is Array<any> {
   return val && Array.isArray(val);
 }
 
-export const isClient = () => {
-  return typeof window !== 'undefined';
-};
-
 export const isWindow = (val: any): val is Window => {
   return typeof window !== 'undefined' && is(val, 'Window');
 };
@@ -64,6 +60,8 @@ export const isElement = (val: unknown): val is Element => {
 
 export const isServer = typeof window === 'undefined';
 
+export const isClient = typeof window !== 'undefined';
+
 export function isImageDom(o: Element) {
   return o && ['IMAGE', 'IMG'].includes(o.tagName);
 }

+ 1 - 0
src/utils/log.ts

@@ -1,4 +1,5 @@
 const projectName = import.meta.env.VITE_GLOB_APP_TITLE;
+
 export function warn(message: string) {
   console.warn(`[${projectName} warn]:${message}`);
 }

+ 0 - 3
src/views/dashboard/welcome/index.vue

@@ -9,9 +9,6 @@
   export default defineComponent({
     name: 'Welcome',
     components: { House },
-    setup() {
-      return {};
-    },
   });
 </script>
 <style lang="less" scoped>

+ 2 - 2
src/views/demo/page/form/high/data.ts

@@ -1,6 +1,6 @@
 import { FormSchema } from '/@/components/Form';
 
-const basicOptions: SelectOptions = [
+const basicOptions: LabelValueOptions = [
   {
     label: '付晓晓',
     value: '1',
@@ -11,7 +11,7 @@ const basicOptions: SelectOptions = [
   },
 ];
 
-const storeTypeOptions: SelectOptions = [
+const storeTypeOptions: LabelValueOptions = [
   {
     label: '私密',
     value: '1',

+ 1 - 1
src/views/demo/permission/back/Btn.vue

@@ -58,7 +58,7 @@
   import { Alert, Divider } from 'ant-design-vue';
   import CurrentPermissionMode from '../CurrentPermissionMode.vue';
   import { usePermission } from '/@/hooks/web/usePermission';
-  import Authority from '/@/components/Authority';
+  import { Authority } from '/@/components/Authority';
   import { getPermCodeByUserId } from '/@/api/sys/user';
   import { permissionStore } from '/@/store/modules/permission';
   import { PermissionModeEnum } from '/@/enums/appEnum';

+ 1 - 1
src/views/demo/permission/front/Btn.vue

@@ -65,7 +65,7 @@
   import { userStore } from '/@/store/modules/user';
   import { RoleEnum } from '/@/enums/roleEnum';
   import { usePermission } from '/@/hooks/web/usePermission';
-  import Authority from '/@/components/Authority';
+  import { Authority } from '/@/components/Authority';
 
   export default defineComponent({
     components: { Alert, CurrentPermissionMode, Divider, Authority },

+ 202 - 295
yarn.lock

@@ -1050,10 +1050,10 @@
   resolved "https://registry.npmjs.org/@iconify/iconify/-/iconify-2.0.0-rc.2.tgz#c4a95ddc06ca9b9496df03604e66fdefb39f4c4b"
   integrity sha512-BybEHU5/I9EQ0CcwKAqmreZ2bMnAXrqLCTptAc6vPetHMbrXdZfejP5mt57e/8PNSt/qE7BHniU5PCYA+PGIHw==
 
-"@iconify/json@^1.1.258":
-  version "1.1.259"
-  resolved "https://registry.npmjs.org/@iconify/json/-/json-1.1.259.tgz#433ccff8572e42c3abab1cdbac872af0e8340419"
-  integrity sha512-tDL4IgKtj3LA2lI+IoZfylBtKWNpV5I9BLj7WGMI/SvGkkYo+9DUap3Ho6iUbQLtu9GmHwpE/cA8mwEBkj/otw==
+"@iconify/json@^1.1.260":
+  version "1.1.260"
+  resolved "https://registry.npmjs.org/@iconify/json/-/json-1.1.260.tgz#75bfcdcaf01f1a0092bb26f4ce7aebf357da431a"
+  integrity sha512-gpRn0o55mvBTCcZRb8jBtqxV/5Av01BnnVn7/FyboBNdGkEQ8EMTqJL10SDUf9TLM8s63KKSg/ZeCJj870THtA==
 
 "@koa/cors@^3.1.0":
   version "3.1.0"
@@ -1227,13 +1227,13 @@
   dependencies:
     "@babel/core" ">=7.9.0"
 
-"@stylelint/postcss-markdown@^0.36.1":
-  version "0.36.1"
-  resolved "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8"
-  integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==
+"@stylelint/postcss-markdown@^0.36.2":
+  version "0.36.2"
+  resolved "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391"
+  integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==
   dependencies:
-    remark "^12.0.0"
-    unist-util-find-all-after "^3.0.1"
+    remark "^13.0.0"
+    unist-util-find-all-after "^3.0.2"
 
 "@surma/rollup-plugin-off-main-thread@^1.1.1":
   version "1.4.2"
@@ -1280,10 +1280,10 @@
     "@types/keygrip" "*"
     "@types/node" "*"
 
-"@types/echarts@^4.9.0":
-  version "4.9.0"
-  resolved "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.0.tgz#e133ea5429ada1d814f9cc1deae855421dcdd2ef"
-  integrity sha512-9QIAUe6cxM5GyGNCIhlEwf7l5oclZDVM0HNRfehPx3dDUt1Jfhbvp/U2wfgwtL/IDqyASBVs1zu4qyaCsuJINA==
+"@types/echarts@^4.9.1":
+  version "4.9.1"
+  resolved "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.1.tgz#e21ea327af62b1148a7ab69a039f8fa002506de2"
+  integrity sha512-tpx/gqJD6oz1ZJnIqDaUppsoRuZdnbhAFPslWlTGk0q8//9l34DLwzOrviHCOE+Oy1R5A1VZ994/CPg1Cl3naw==
   dependencies:
     "@types/zrender" "*"
 
@@ -1396,6 +1396,13 @@
   resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03"
   integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==
 
+"@types/mdast@^3.0.0":
+  version "3.0.3"
+  resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb"
+  integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==
+  dependencies:
+    "@types/unist" "*"
+
 "@types/mime@*":
   version "2.0.3"
   resolved "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a"
@@ -1412,9 +1419,9 @@
   integrity sha512-OlwyyyoY81P8f7FU0zILUPxqQQ3/W+CwbqI6dWvOxaH8w948fAl1+hOG9C9ZgJcwzG+aloJcsastY4c4p91R1Q==
 
 "@types/node@*":
-  version "14.14.7"
-  resolved "https://registry.npmjs.org/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d"
-  integrity sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==
+  version "14.14.8"
+  resolved "https://registry.npmjs.org/@types/node/-/node-14.14.8.tgz#2127bd81949a95c8b7d3240f3254352d72563aec"
+  integrity sha512-z/5Yd59dCKI5kbxauAJgw6dLPzW+TNOItNE00PkpzNwUIEwdj/Lsqwq94H5DdYBX7C13aRA0CY32BK76+neEUA==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.0"
@@ -1471,14 +1478,14 @@
     rollup "^0.63.4"
 
 "@types/serve-static@*":
-  version "1.13.7"
-  resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.7.tgz#e51b51a0becda910f9fd04c718044da69d6c492e"
-  integrity sha512-3diZWucbR+xTmbDlU+FRRxBf+31OhFew7cJXML/zh9NmvSPTNoFecAwHB66BUqFgENJtqMiyl7JAwUE/siqdLw==
+  version "1.13.8"
+  resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz#851129d434433c7082148574ffec263d58309c46"
+  integrity sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==
   dependencies:
     "@types/mime" "*"
     "@types/node" "*"
 
-"@types/unist@^2.0.0", "@types/unist@^2.0.2":
+"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
   version "2.0.3"
   resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
   integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
@@ -1488,10 +1495,10 @@
   resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
   integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==
 
-"@types/yargs@^15.0.9":
-  version "15.0.9"
-  resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz#524cd7998fe810cdb02f26101b699cccd156ff19"
-  integrity sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==
+"@types/yargs@^15.0.10":
+  version "15.0.10"
+  resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.10.tgz#0fe3c8173a0d5c3e780b389050140c3f5ea6ea74"
+  integrity sha512-z8PNtlhrj7eJNLmrAivM7rjBESG6JwC5xP3RVk12i/8HVP7Xnx/sEmERnRImyEuUaJfO942X0qMOYsoupaJbZQ==
   dependencies:
     "@types/yargs-parser" "*"
 
@@ -1505,61 +1512,61 @@
   resolved "https://registry.npmjs.org/@types/zxcvbn/-/zxcvbn-4.4.0.tgz#fbc1d941cc6d9d37d18405c513ba6b294f89b609"
   integrity sha512-GQLOT+SN20a+AI51y3fAimhyTF4Y0RG+YP3gf91OibIZ7CJmPFgoZi+ZR5a+vRbS01LbQosITWum4ATmJ1Z6Pg==
 
-"@typescript-eslint/eslint-plugin@^4.6.1":
-  version "4.7.0"
-  resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.7.0.tgz#85c9bbda00c0cb604d3c241f7bc7fb171a2d3479"
-  integrity sha512-li9aiSVBBd7kU5VlQlT1AqP0uWGDK6JYKUQ9cVDnOg34VNnd9t4jr0Yqc/bKxJr/tDCPDaB4KzoSFN9fgVxe/Q==
+"@typescript-eslint/eslint-plugin@^4.8.1":
+  version "4.8.1"
+  resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.1.tgz#b362abe0ee478a6c6d06c14552a6497f0b480769"
+  integrity sha512-d7LeQ7dbUrIv5YVFNzGgaW3IQKMmnmKFneRWagRlGYOSfLJVaRbj/FrBNOBC1a3tVO+TgNq1GbHvRtg1kwL0FQ==
   dependencies:
-    "@typescript-eslint/experimental-utils" "4.7.0"
-    "@typescript-eslint/scope-manager" "4.7.0"
+    "@typescript-eslint/experimental-utils" "4.8.1"
+    "@typescript-eslint/scope-manager" "4.8.1"
     debug "^4.1.1"
     functional-red-black-tree "^1.0.1"
     regexpp "^3.0.0"
     semver "^7.3.2"
     tsutils "^3.17.1"
 
-"@typescript-eslint/experimental-utils@4.7.0":
-  version "4.7.0"
-  resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.7.0.tgz#8d1058c38bec3d3bbd9c898a1c32318d80faf3c5"
-  integrity sha512-cymzovXAiD4EF+YoHAB5Oh02MpnXjvyaOb+v+BdpY7lsJXZQN34oIETeUwVT2XfV9rSNpXaIcknDLfupO/tUoA==
+"@typescript-eslint/experimental-utils@4.8.1":
+  version "4.8.1"
+  resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.1.tgz#27275c20fa4336df99ebcf6195f7d7aa7aa9f22d"
+  integrity sha512-WigyLn144R3+lGATXW4nNcDJ9JlTkG8YdBWHkDlN0lC3gUGtDi7Pe3h5GPvFKMcRz8KbZpm9FJV9NTW8CpRHpg==
   dependencies:
     "@types/json-schema" "^7.0.3"
-    "@typescript-eslint/scope-manager" "4.7.0"
-    "@typescript-eslint/types" "4.7.0"
-    "@typescript-eslint/typescript-estree" "4.7.0"
+    "@typescript-eslint/scope-manager" "4.8.1"
+    "@typescript-eslint/types" "4.8.1"
+    "@typescript-eslint/typescript-estree" "4.8.1"
     eslint-scope "^5.0.0"
     eslint-utils "^2.0.0"
 
-"@typescript-eslint/parser@^4.6.1":
-  version "4.7.0"
-  resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.7.0.tgz#44bdab0f788b478178368baa65d3365fdc63da1c"
-  integrity sha512-+meGV8bMP1sJHBI2AFq1GeTwofcGiur8LoIr6v+rEmD9knyCqDlrQcFHR0KDDfldHIFDU/enZ53fla6ReF4wRw==
+"@typescript-eslint/parser@^4.8.1":
+  version "4.8.1"
+  resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.8.1.tgz#4fe2fbdbb67485bafc4320b3ae91e34efe1219d1"
+  integrity sha512-QND8XSVetATHK9y2Ltc/XBl5Ro7Y62YuZKnPEwnNPB8E379fDsvzJ1dMJ46fg/VOmk0hXhatc+GXs5MaXuL5Uw==
   dependencies:
-    "@typescript-eslint/scope-manager" "4.7.0"
-    "@typescript-eslint/types" "4.7.0"
-    "@typescript-eslint/typescript-estree" "4.7.0"
+    "@typescript-eslint/scope-manager" "4.8.1"
+    "@typescript-eslint/types" "4.8.1"
+    "@typescript-eslint/typescript-estree" "4.8.1"
     debug "^4.1.1"
 
-"@typescript-eslint/scope-manager@4.7.0":
-  version "4.7.0"
-  resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.7.0.tgz#2115526085fb72723ccdc1eeae75dec7126220ed"
-  integrity sha512-ILITvqwDJYbcDCROj6+Ob0oCKNg3SH46iWcNcTIT9B5aiVssoTYkhKjxOMNzR1F7WSJkik4zmuqve5MdnA0DyA==
+"@typescript-eslint/scope-manager@4.8.1":
+  version "4.8.1"
+  resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.8.1.tgz#e343c475f8f1d15801b546cb17d7f309b768fdce"
+  integrity sha512-r0iUOc41KFFbZdPAdCS4K1mXivnSZqXS5D9oW+iykQsRlTbQRfuFRSW20xKDdYiaCoH+SkSLeIF484g3kWzwOQ==
   dependencies:
-    "@typescript-eslint/types" "4.7.0"
-    "@typescript-eslint/visitor-keys" "4.7.0"
+    "@typescript-eslint/types" "4.8.1"
+    "@typescript-eslint/visitor-keys" "4.8.1"
 
-"@typescript-eslint/types@4.7.0":
-  version "4.7.0"
-  resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.7.0.tgz#5e95ef5c740f43d942542b35811f87b62fccca69"
-  integrity sha512-uLszFe0wExJc+I7q0Z/+BnP7wao/kzX0hB5vJn4LIgrfrMLgnB2UXoReV19lkJQS1a1mHWGGODSxnBx6JQC3Sg==
+"@typescript-eslint/types@4.8.1":
+  version "4.8.1"
+  resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.8.1.tgz#23829c73c5fc6f4fcd5346a7780b274f72fee222"
+  integrity sha512-ave2a18x2Y25q5K05K/U3JQIe2Av4+TNi/2YuzyaXLAsDx6UZkz1boZ7nR/N6Wwae2PpudTZmHFXqu7faXfHmA==
 
-"@typescript-eslint/typescript-estree@4.7.0":
-  version "4.7.0"
-  resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.7.0.tgz#539531167f05ba20eb0b6785567076679e29d393"
-  integrity sha512-5XZRQznD1MfUmxu1t8/j2Af4OxbA7EFU2rbo0No7meb46eHgGkSieFdfV6omiC/DGIBhH9H9gXn7okBbVOm8jw==
+"@typescript-eslint/typescript-estree@4.8.1":
+  version "4.8.1"
+  resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.1.tgz#7307e3f2c9e95df7daa8dc0a34b8c43b7ec0dd32"
+  integrity sha512-bJ6Fn/6tW2g7WIkCWh3QRlaSU7CdUUK52shx36/J7T5oTQzANvi6raoTsbwGM11+7eBbeem8hCCKbyvAc0X3sQ==
   dependencies:
-    "@typescript-eslint/types" "4.7.0"
-    "@typescript-eslint/visitor-keys" "4.7.0"
+    "@typescript-eslint/types" "4.8.1"
+    "@typescript-eslint/visitor-keys" "4.8.1"
     debug "^4.1.1"
     globby "^11.0.1"
     is-glob "^4.0.1"
@@ -1567,12 +1574,12 @@
     semver "^7.3.2"
     tsutils "^3.17.1"
 
-"@typescript-eslint/visitor-keys@4.7.0":
-  version "4.7.0"
-  resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.7.0.tgz#6783824f22acfc49e754970ed21b88ac03b80e6f"
-  integrity sha512-aDJDWuCRsf1lXOtignlfiPODkzSxxop7D0rZ91L6ZuMlcMCSh0YyK+gAfo5zN/ih6WxMwhoXgJWC3cWQdaKC+A==
+"@typescript-eslint/visitor-keys@4.8.1":
+  version "4.8.1"
+  resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.1.tgz#794f68ee292d1b2e3aa9690ebedfcb3a8c90e3c3"
+  integrity sha512-3nrwXFdEYALQh/zW8rFwP4QltqsanCDz4CwWMPiIZmwlk9GlvBeueEIbq05SEq4ganqM0g9nh02xXgv5XI3PeQ==
   dependencies:
-    "@typescript-eslint/types" "4.7.0"
+    "@typescript-eslint/types" "4.8.1"
     eslint-visitor-keys "^2.0.0"
 
 "@vue/compiler-core@*", "@vue/compiler-core@3.0.2", "@vue/compiler-core@^3.0.0-rc.5":
@@ -1725,7 +1732,7 @@
     vscode-languageserver-textdocument "^1.0.1"
     vscode-uri "^2.1.2"
 
-"@vueuse/core@^4.0.0-beta.41":
+"@vueuse/core@4.0.0-beta.41":
   version "4.0.0-beta.41"
   resolved "https://registry.npmjs.org/@vueuse/core/-/core-4.0.0-beta.41.tgz#0058aed5ade75ae2866283498009ad5172cbae84"
   integrity sha512-CgUih65PzYScorm1S4F93e6XXm+qxA8GrRLOSB1kXaqtP6vXedwkBxKkNEYNACx4reL4VEHqM/BrM6FajXkQUg==
@@ -1850,10 +1857,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
   dependencies:
     color-convert "^2.0.1"
 
-ant-design-vue@^2.0.0-rc.1:
-  version "2.0.0-rc.1"
-  resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-2.0.0-rc.1.tgz#2ef02475f3aa4c1474f2fe3cf44a52c34787be02"
-  integrity sha512-iKXkFtTHarvLHV7LWmYh6g/Cmkv+xK+vS621A1Qvg37Z6lCGg3K9BGAizmklAYzOTiPz0Ltt63eSiNqYMGh52g==
+ant-design-vue@2.0.0-beta.15:
+  version "2.0.0-beta.15"
+  resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-2.0.0-beta.15.tgz#3c787dabb70a33885d0e751e58f9a5610ed06134"
+  integrity sha512-OxZy+ZYU3LauIL4Rhqwy441K/iD++Cit6upnQy5+LVUrX0PSObPqPqMWVpncbAmJJYTEz88gkvgGeYqBdzouWA==
   dependencies:
     "@ant-design-vue/use" "^0.0.1-0"
     "@ant-design/icons-vue" "^5.1.5"
@@ -2301,11 +2308,6 @@ caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001157:
   resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001158.tgz#fce86d321369603c2bc855ee0e901a7f49f8310b"
   integrity sha512-s5loVYY+yKpuVA3HyW8BarzrtJvwHReuzugQXlv1iR3LKSReoFXRm86mT6hT7PEF5RxW+XQZg+6nYjlywYzQ+g==
 
-ccount@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043"
-  integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==
-
 cfb@^1.1.4:
   version "1.2.0"
   resolved "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz#6a4d0872b525ed60349e1ef51fb4b0bf73eca9a8"
@@ -2349,11 +2351,6 @@ chalk@^3.0.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
-character-entities-html4@^1.0.0:
-  version "1.1.4"
-  resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125"
-  integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==
-
 character-entities-legacy@^1.0.0:
   version "1.1.4"
   resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
@@ -2522,11 +2519,6 @@ codepage@~1.14.0:
     commander "~2.14.1"
     exit-on-epipe "~1.0.1"
 
-collapse-white-space@^1.0.2:
-  version "1.0.6"
-  resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287"
-  integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
-
 collection-visit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
@@ -3001,7 +2993,7 @@ debug@^3.1.0, debug@^3.1.1:
   dependencies:
     ms "^2.1.1"
 
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0:
+debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0:
   version "4.2.0"
   resolved "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
   integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
@@ -3263,9 +3255,9 @@ ejs@^2.6.1:
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 
 electron-to-chromium@^1.3.591:
-  version "1.3.596"
-  resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.596.tgz#c7ed98512c7ff36ddcbfed9e54e6355335c35257"
-  integrity sha512-nLO2Wd2yU42eSoNJVQKNf89CcEGqeFZd++QsnN2XIgje1s/19AgctfjLIbPORlvcCO8sYjLwX4iUgDdusOY8Sg==
+  version "1.3.598"
+  resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.598.tgz#8f757018902ab6190323a8c5f6124d854893a35b"
+  integrity sha512-G5Ztk23/ubLYVPxPXnB1uu105uzIPd4xB/D8ld8x1GaSC9+vU9NZL16nYZya8H77/7CCKKN7dArzJL3pBs8N7A==
 
 emoji-regex@^7.0.1:
   version "7.0.3"
@@ -3698,6 +3690,13 @@ file-entry-cache@^5.0.1:
   dependencies:
     flat-cache "^2.0.1"
 
+file-entry-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a"
+  integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==
+  dependencies:
+    flat-cache "^3.0.4"
+
 fill-range@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@@ -3792,11 +3791,24 @@ flat-cache@^2.0.1:
     rimraf "2.6.3"
     write "1.0.3"
 
+flat-cache@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+  integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+  dependencies:
+    flatted "^3.1.0"
+    rimraf "^3.0.2"
+
 flatted@^2.0.0:
   version "2.0.2"
   resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
   integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
 
+flatted@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067"
+  integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==
+
 follow-redirects@^1.0.0, follow-redirects@^1.10.0:
   version "1.13.0"
   resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db"
@@ -4415,7 +4427,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4483,11 +4495,6 @@ is-alphabetical@^1.0.0:
   resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
   integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
 
-is-alphanumeric@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
-  integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=
-
 is-alphanumerical@^1.0.0:
   version "1.0.4"
   resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
@@ -4719,21 +4726,11 @@ is-utf8@^0.2.0, is-utf8@^0.2.1:
   resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
   integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
 
-is-whitespace-character@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
-  integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
-
 is-windows@^1.0.1, is-windows@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
   integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
 
-is-word-character@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230"
-  integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
-
 is-wsl@^2.1.1:
   version "2.2.0"
   resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
@@ -4933,10 +4930,10 @@ klona@^2.0.4:
   resolved "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
   integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
 
-known-css-properties@^0.19.0:
-  version "0.19.0"
-  resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b"
-  integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==
+known-css-properties@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96"
+  integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==
 
 koa-bodyparser@^4.3.0:
   version "4.3.0"
@@ -5227,7 +5224,7 @@ log-update@^4.0.0:
     slice-ansi "^4.0.0"
     wrap-ansi "^6.2.0"
 
-longest-streak@^2.0.1:
+longest-streak@^2.0.0:
   version "2.0.4"
   resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
   integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
@@ -5320,29 +5317,37 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
-markdown-escapes@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
-  integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
-
-markdown-table@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b"
-  integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==
-  dependencies:
-    repeat-string "^1.0.0"
-
 mathml-tag-names@^2.1.3:
   version "2.1.3"
   resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
   integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
 
-mdast-util-compact@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490"
-  integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==
+mdast-util-from-markdown@^0.8.0:
+  version "0.8.1"
+  resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.1.tgz#781371d493cac11212947226190270c15dc97116"
+  integrity sha512-qJXNcFcuCSPqUF0Tb0uYcFDIq67qwB3sxo9RPdf9vG8T90ViKnksFqdB/Coq2a7sTnxL/Ify2y7aIQXDkQFH0w==
   dependencies:
-    unist-util-visit "^2.0.0"
+    "@types/mdast" "^3.0.0"
+    mdast-util-to-string "^1.0.0"
+    micromark "~2.10.0"
+    parse-entities "^2.0.0"
+
+mdast-util-to-markdown@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.3.tgz#e05c54a3ccd239bab63c48a1e5b5747f0dcd5aca"
+  integrity sha512-sr8q7fQJ1xoCqZSXW6dO/MYu2Md+a4Hfk9uO+XHCfiBhVM0EgWtfAV7BuN+ff6otUeu2xDyt1o7vhZGwOG3+BA==
+  dependencies:
+    "@types/unist" "^2.0.0"
+    longest-streak "^2.0.0"
+    mdast-util-to-string "^1.0.0"
+    parse-entities "^2.0.0"
+    repeat-string "^1.0.0"
+    zwitch "^1.0.0"
+
+mdast-util-to-string@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527"
+  integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==
 
 media-typer@0.3.0:
   version "0.3.0"
@@ -5380,23 +5385,6 @@ meow@^4.0.0:
     redent "^2.0.0"
     trim-newlines "^2.0.0"
 
-meow@^7.1.1:
-  version "7.1.1"
-  resolved "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306"
-  integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==
-  dependencies:
-    "@types/minimist" "^1.2.0"
-    camelcase-keys "^6.2.2"
-    decamelize-keys "^1.1.0"
-    hard-rejection "^2.1.0"
-    minimist-options "4.1.0"
-    normalize-package-data "^2.5.0"
-    read-pkg-up "^7.0.1"
-    redent "^3.0.0"
-    trim-newlines "^3.0.0"
-    type-fest "^0.13.1"
-    yargs-parser "^18.1.3"
-
 meow@^8.0.0:
   version "8.0.0"
   resolved "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz#1aa10ee61046719e334ffdc038bb5069250ec99a"
@@ -5436,6 +5424,14 @@ merge@^1.2.1:
   resolved "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
   integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
 
+micromark@~2.10.0:
+  version "2.10.1"
+  resolved "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz#cd73f54e0656f10e633073db26b663a221a442a7"
+  integrity sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==
+  dependencies:
+    debug "^4.0.0"
+    parse-entities "^2.0.0"
+
 micromatch@^3.0.4:
   version "3.1.10"
   resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -5658,9 +5654,9 @@ node-modules-regexp@^1.0.0:
   integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
 
 node-releases@^1.1.66:
-  version "1.1.66"
-  resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.66.tgz#609bd0dc069381015cd982300bae51ab4f1b1814"
-  integrity sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg==
+  version "1.1.67"
+  resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12"
+  integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==
 
 normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
   version "2.5.0"
@@ -6309,7 +6305,7 @@ postcss-value-parser@^4.1.0:
   resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
   integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
 
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6:
   version "7.0.35"
   resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
   integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
@@ -6626,63 +6622,35 @@ relateurl@^0.2.7:
   resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
   integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
 
-remark-parse@^8.0.0:
-  version "8.0.3"
-  resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1"
-  integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==
+remark-parse@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640"
+  integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==
   dependencies:
-    ccount "^1.0.0"
-    collapse-white-space "^1.0.2"
-    is-alphabetical "^1.0.0"
-    is-decimal "^1.0.0"
-    is-whitespace-character "^1.0.0"
-    is-word-character "^1.0.0"
-    markdown-escapes "^1.0.0"
-    parse-entities "^2.0.0"
-    repeat-string "^1.5.4"
-    state-toggle "^1.0.0"
-    trim "0.0.1"
-    trim-trailing-lines "^1.0.0"
-    unherit "^1.0.4"
-    unist-util-remove-position "^2.0.0"
-    vfile-location "^3.0.0"
-    xtend "^4.0.1"
-
-remark-stringify@^8.0.0:
-  version "8.1.1"
-  resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5"
-  integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==
-  dependencies:
-    ccount "^1.0.0"
-    is-alphanumeric "^1.0.0"
-    is-decimal "^1.0.0"
-    is-whitespace-character "^1.0.0"
-    longest-streak "^2.0.1"
-    markdown-escapes "^1.0.0"
-    markdown-table "^2.0.0"
-    mdast-util-compact "^2.0.0"
-    parse-entities "^2.0.0"
-    repeat-string "^1.5.4"
-    state-toggle "^1.0.0"
-    stringify-entities "^3.0.0"
-    unherit "^1.0.4"
-    xtend "^4.0.1"
+    mdast-util-from-markdown "^0.8.0"
 
-remark@^12.0.0:
-  version "12.0.1"
-  resolved "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f"
-  integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==
+remark-stringify@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz#8ba0c9e4167c42733832215a81550489759e3793"
+  integrity sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==
   dependencies:
-    remark-parse "^8.0.0"
-    remark-stringify "^8.0.0"
-    unified "^9.0.0"
+    mdast-util-to-markdown "^0.5.0"
+
+remark@^13.0.0:
+  version "13.0.0"
+  resolved "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425"
+  integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==
+  dependencies:
+    remark-parse "^9.0.0"
+    remark-stringify "^9.0.0"
+    unified "^9.1.0"
 
 repeat-element@^1.1.2:
   version "1.1.3"
   resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
   integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
 
-repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1:
+repeat-string@^1.0.0, repeat-string@^1.6.1:
   version "1.6.1"
   resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
   integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
@@ -7186,16 +7154,16 @@ source-map-url@^0.4.0:
   resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
   integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
 
+source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
 source-map@^0.5.0, source-map@^0.5.6:
   version "0.5.7"
   resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
 
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
-  version "0.6.1"
-  resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
-  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
 source-map@^0.7.3, source-map@~0.7.2:
   version "0.7.3"
   resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
@@ -7270,11 +7238,6 @@ ssf@~0.11.2:
   dependencies:
     frac "~1.1.2"
 
-state-toggle@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe"
-  integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
-
 static-extend@^0.1.1:
   version "0.1.2"
   resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -7343,15 +7306,6 @@ string_decoder@~1.1.1:
   dependencies:
     safe-buffer "~5.1.0"
 
-stringify-entities@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903"
-  integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==
-  dependencies:
-    character-entities-html4 "^1.0.0"
-    character-entities-legacy "^1.0.0"
-    xtend "^4.0.0"
-
 stringify-object@^3.3.0:
   version "3.3.0"
   resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
@@ -7472,22 +7426,22 @@ stylelint-order@^4.1.0:
     postcss "^7.0.31"
     postcss-sorting "^5.0.1"
 
-stylelint@^13.7.2:
-  version "13.7.2"
-  resolved "https://registry.npmjs.org/stylelint/-/stylelint-13.7.2.tgz#6f3c58eea4077680ed0ceb0d064b22b100970486"
-  integrity sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==
+stylelint@^13.8.0:
+  version "13.8.0"
+  resolved "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz#446765dbe25e3617f819a0165956faf2563ddc23"
+  integrity sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==
   dependencies:
     "@stylelint/postcss-css-in-js" "^0.37.2"
-    "@stylelint/postcss-markdown" "^0.36.1"
+    "@stylelint/postcss-markdown" "^0.36.2"
     autoprefixer "^9.8.6"
     balanced-match "^1.0.0"
     chalk "^4.1.0"
     cosmiconfig "^7.0.0"
-    debug "^4.1.1"
+    debug "^4.2.0"
     execall "^2.0.0"
     fast-glob "^3.2.4"
     fastest-levenshtein "^1.0.12"
-    file-entry-cache "^5.0.1"
+    file-entry-cache "^6.0.0"
     get-stdin "^8.0.0"
     global-modules "^2.0.0"
     globby "^11.0.1"
@@ -7496,14 +7450,14 @@ stylelint@^13.7.2:
     ignore "^5.1.8"
     import-lazy "^4.0.0"
     imurmurhash "^0.1.4"
-    known-css-properties "^0.19.0"
+    known-css-properties "^0.20.0"
     lodash "^4.17.20"
     log-symbols "^4.0.0"
     mathml-tag-names "^2.1.3"
-    meow "^7.1.1"
+    meow "^8.0.0"
     micromatch "^4.0.2"
     normalize-selector "^0.2.0"
-    postcss "^7.0.32"
+    postcss "^7.0.35"
     postcss-html "^0.36.0"
     postcss-less "^3.1.4"
     postcss-media-query-parser "^0.2.3"
@@ -7511,7 +7465,7 @@ stylelint@^13.7.2:
     postcss-safe-parser "^4.0.2"
     postcss-sass "^0.4.4"
     postcss-scss "^2.1.1"
-    postcss-selector-parser "^6.0.2"
+    postcss-selector-parser "^6.0.4"
     postcss-syntax "^0.36.2"
     postcss-value-parser "^4.1.0"
     resolve-from "^5.0.0"
@@ -7522,8 +7476,8 @@ stylelint@^13.7.2:
     style-search "^0.1.0"
     sugarss "^2.0.0"
     svg-tags "^1.0.0"
-    table "^6.0.1"
-    v8-compile-cache "^2.1.1"
+    table "^6.0.3"
+    v8-compile-cache "^2.2.0"
     write-file-atomic "^3.0.3"
 
 sugarss@^2.0.0:
@@ -7631,7 +7585,7 @@ table@^5.2.3:
     slice-ansi "^2.1.0"
     string-width "^3.0.0"
 
-table@^6.0.1:
+table@^6.0.3:
   version "6.0.3"
   resolved "https://registry.npmjs.org/table/-/table-6.0.3.tgz#e5b8a834e37e27ad06de2e0fda42b55cfd8a0123"
   integrity sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==
@@ -7687,9 +7641,9 @@ terser@^4.6.2, terser@^4.6.3, terser@^4.7.0:
     source-map-support "~0.5.12"
 
 terser@^5.0.0:
-  version "5.3.8"
-  resolved "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd"
-  integrity sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==
+  version "5.4.0"
+  resolved "https://registry.npmjs.org/terser/-/terser-5.4.0.tgz#9815c0839072d5c894e22c6fc508fbe9f5e7d7e8"
+  integrity sha512-3dZunFLbCJis9TAF2VnX+VrQLctRUmt1p3W2kCsJuZE4ZgWqh//+1MZ62EanewrqKoUf4zIaDGZAvml4UDc0OQ==
   dependencies:
     commander "^2.20.0"
     source-map "~0.7.2"
@@ -7813,16 +7767,6 @@ trim-off-newlines@^1.0.0:
   resolved "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
   integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=
 
-trim-trailing-lines@^1.0.0:
-  version "1.1.4"
-  resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0"
-  integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==
-
-trim@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
-  integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
-
 trough@^1.0.0:
   version "1.0.5"
   resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
@@ -7868,11 +7812,6 @@ type-fest@^0.11.0:
   resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
   integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
 
-type-fest@^0.13.1:
-  version "0.13.1"
-  resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
-  integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
-
 type-fest@^0.18.0:
   version "0.18.1"
   resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
@@ -7923,14 +7862,6 @@ uglify-js@^3.1.4:
   resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.6.tgz#144b50d3e05eadd3ad4dd047c60ca541a8cd4e9c"
   integrity sha512-oASI1FOJ7BBFkSCNDZ446EgkSuHkOZBuqRFrwXIKWCoXw8ZXQETooTQjkAcBS03Acab7ubCKsXnwuV2svy061g==
 
-unherit@^1.0.4:
-  version "1.1.3"
-  resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
-  integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
-  dependencies:
-    inherits "^2.0.0"
-    xtend "^4.0.0"
-
 unicode-canonical-property-names-ecmascript@^1.0.4:
   version "1.0.4"
   resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@@ -7954,7 +7885,7 @@ unicode-property-aliases-ecmascript@^1.0.4:
   resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
   integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
 
-unified@^9.0.0:
+unified@^9.1.0:
   version "9.2.0"
   resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8"
   integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==
@@ -7988,7 +7919,7 @@ unique-string@^1.0.0:
   dependencies:
     crypto-random-string "^1.0.0"
 
-unist-util-find-all-after@^3.0.1:
+unist-util-find-all-after@^3.0.2:
   version "3.0.2"
   resolved "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6"
   integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==
@@ -8000,13 +7931,6 @@ unist-util-is@^4.0.0:
   resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.3.tgz#e8b44db55fc20c43752b3346c116344d45d7c91d"
   integrity sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw==
 
-unist-util-remove-position@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc"
-  integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==
-  dependencies:
-    unist-util-visit "^2.0.0"
-
 unist-util-stringify-position@^2.0.0:
   version "2.0.3"
   resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
@@ -8014,23 +7938,6 @@ unist-util-stringify-position@^2.0.0:
   dependencies:
     "@types/unist" "^2.0.2"
 
-unist-util-visit-parents@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6"
-  integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==
-  dependencies:
-    "@types/unist" "^2.0.0"
-    unist-util-is "^4.0.0"
-
-unist-util-visit@^2.0.0:
-  version "2.0.3"
-  resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
-  integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==
-  dependencies:
-    "@types/unist" "^2.0.0"
-    unist-util-is "^4.0.0"
-    unist-util-visit-parents "^3.0.0"
-
 universalify@^0.1.0:
   version "0.1.2"
   resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -8091,7 +7998,7 @@ uuid@^3.3.2:
   resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0:
   version "2.2.0"
   resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132"
   integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==
@@ -8116,11 +8023,6 @@ vditor@^3.6.2:
   dependencies:
     diff-match-patch "^1.0.5"
 
-vfile-location@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c"
-  integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==
-
 vfile-message@^2.0.0:
   version "2.0.4"
   resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
@@ -8265,12 +8167,12 @@ vue-eslint-parser@^7.1.1:
     esquery "^1.0.1"
     lodash "^4.17.15"
 
-vue-i18n@^9.0.0-beta.6:
-  version "9.0.0-beta.6"
-  resolved "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.0.0-beta.6.tgz#ea89cee5ade18f2a2d0f2ead0ac4a6bedccade6e"
-  integrity sha512-6WWNumUYOnoFi50szUxhxNjTntWlL3SSb6DCoDQW3aKIGK6xTKj9bLI1gnSPfFn54dTYlJtzxEHuY8C/kvm7kg==
+vue-i18n@^9.0.0-beta.7:
+  version "9.0.0-beta.7"
+  resolved "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.0.0-beta.7.tgz#f6fad5b4be218018aab4797f80dd2a95ee5236f9"
+  integrity sha512-hFl0XnV91P/4UyWvHYvdYxuk3GRnKIW9zXAm6hrUU4mOIwpqchi7jVQva2TJLr52Mpsu4zYXmzL1h5pgrKmCfQ==
   dependencies:
-    source-map "^0.6.1"
+    source-map "0.6.1"
 
 vue-router@^4.0.0-rc.3:
   version "4.0.0-rc.3"
@@ -8571,7 +8473,7 @@ xlsx@^0.16.8:
     wmf "~1.0.1"
     word "~0.3.0"
 
-xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+xtend@~4.0.1:
   version "4.0.2"
   resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -8609,7 +8511,7 @@ yargs-parser@^13.1.2:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-parser@^18.1.2, yargs-parser@^18.1.3:
+yargs-parser@^18.1.2:
   version "18.1.3"
   resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
   integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
@@ -8683,6 +8585,11 @@ zrender@4.3.2:
   resolved "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6"
   integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==
 
+zwitch@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
+  integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==
+
 zxcvbn@^4.4.2:
   version "4.4.2"
   resolved "https://registry.npmjs.org/zxcvbn/-/zxcvbn-4.4.2.tgz#28ec17cf09743edcab056ddd8b1b06262cc73c30"