1
0
Эх сурвалжийг харах

perf: improve login logic

vben 4 жил өмнө
parent
commit
a09a0eedd2

+ 6 - 9
package.json

@@ -13,7 +13,6 @@
     "log": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
     "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
     "clean:lib": "npx rimraf node_modules",
-    "typecheck": "vuedx-typecheck .",
     "lint:eslint": "eslint \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
     "lint:prettier": "prettier --write --loglevel warn \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
     "lint:stylelint": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
@@ -27,7 +26,7 @@
   },
   "dependencies": {
     "@iconify/iconify": "^2.0.0-rc.6",
-    "@vueuse/core": "^4.1.1",
+    "@vueuse/core": "^4.2.1",
     "@zxcvbn-ts/core": "^0.2.0",
     "ant-design-vue": "2.0.0",
     "apexcharts": "^3.25.0",
@@ -52,7 +51,7 @@
   "devDependencies": {
     "@commitlint/cli": "^11.0.0",
     "@commitlint/config-conventional": "^11.0.0",
-    "@iconify/json": "^1.1.306",
+    "@iconify/json": "^1.1.307",
     "@ls-lint/ls-lint": "^1.9.2",
     "@purge-icons/generated": "^0.7.0",
     "@types/fs-extra": "^9.0.7",
@@ -70,8 +69,6 @@
     "@vitejs/plugin-vue": "^1.1.4",
     "@vitejs/plugin-vue-jsx": "^1.1.0",
     "@vue/compiler-sfc": "^3.0.5",
-    "@vuedx/typecheck": "^0.6.3",
-    "@vuedx/typescript-plugin-vue": "^0.6.3",
     "autoprefixer": "^10.2.4",
     "commitizen": "^4.2.3",
     "conventional-changelog-cli": "^2.1.1",
@@ -84,7 +81,7 @@
     "esno": "^0.4.4",
     "fs-extra": "^9.1.0",
     "http-server": "^0.12.3",
-    "husky": "^5.0.9",
+    "husky": "^5.1.0",
     "is-ci": "^3.0.0",
     "less": "^4.1.1",
     "lint-staged": "^10.5.4",
@@ -100,14 +97,14 @@
     "typescript": "^4.1.5",
     "vite": "2.0.1",
     "vite-plugin-compression": "^0.2.1",
-    "vite-plugin-html": "^2.0.0",
+    "vite-plugin-html": "^2.0.1",
     "vite-plugin-imagemin": "^0.2.7",
     "vite-plugin-mock": "^2.1.4",
     "vite-plugin-purge-icons": "^0.7.0",
-    "vite-plugin-pwa": "^0.5.2",
+    "vite-plugin-pwa": "^0.5.3",
     "vite-plugin-style-import": "^0.7.3",
     "vite-plugin-theme": "^0.4.3",
-    "vite-plugin-windicss": "0.4.3",
+    "vite-plugin-windicss": "0.4.4",
     "vue-eslint-parser": "^7.5.0",
     "yargs": "^16.2.0"
   },

+ 5 - 8
src/components/CountDown/src/CountdownInput.vue

@@ -1,11 +1,9 @@
 <template>
-  <div :class="prefixCls">
-    <AInput v-bind="$attrs" :size="size" v-model:value="state">
-      <template #addonAfter>
-        <CountButton :size="size" :count="count" :beforeStartFunc="sendCodeApi" />
-      </template>
-    </AInput>
-  </div>
+  <AInput v-bind="$attrs" :class="prefixCls" :size="size">
+    <template #addonAfter>
+      <CountButton :size="size" :count="count" :beforeStartFunc="sendCodeApi" />
+    </template>
+  </AInput>
 </template>
 <script lang="ts">
   import { defineComponent, PropType } from 'vue';
@@ -32,7 +30,6 @@
     },
     setup(props) {
       const { prefixCls } = useDesign('countdown-input');
-
       const [state] = useRuleFormItem(props);
       return { prefixCls, state };
     },

+ 19 - 4
src/design/var/breakpoint.less

@@ -2,17 +2,32 @@
 // ==============屏幕断点============
 // =================================
 
+// Extra small screen / phone
+@screen-xs: 480px;
+@screen-xs-min: @screen-xs;
+
 // Small screen / tablet
-@screen-sm: 640px;
+@screen-sm: 576px;
+@screen-sm-min: @screen-sm;
 
 // Medium screen / desktop
 @screen-md: 768px;
+@screen-md-min: @screen-md;
 
 // Large screen / wide desktop
-@screen-lg: 1024px;
+@screen-lg: 992px;
+@screen-lg-min: @screen-lg;
 
 // Extra large screen / full hd
-@screen-xl: 1280px;
+@screen-xl: 1200px;
+@screen-xl-min: @screen-xl;
 
 // Extra extra large screen / large desktop
-@screen-2xl: 1536px;
+@screen-2xl: 1600px;
+@screen-2xl-min: @screen-2xl;
+
+@screen-xs-max: (@screen-sm-min - 1px);
+@screen-sm-max: (@screen-md-min - 1px);
+@screen-md-max: (@screen-lg-min - 1px);
+@screen-lg-max: (@screen-xl-min - 1px);
+@screen-xl-max: (@screen-2xl-min - 1px);

+ 1 - 1
src/hooks/component/useFormItem.ts

@@ -17,7 +17,7 @@ export function useRuleFormItem<T extends Indexable>(
 
   const defaultState = readonly(innerState);
 
-  const setState = (val: UnwrapRef<T[keyof T]>) => {
+  const setState = (val: UnwrapRef<T[keyof T]>): void => {
     innerState.value = val as T[keyof T];
   };
 

+ 2 - 2
src/hooks/web/useECharts.ts

@@ -1,7 +1,7 @@
 import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
 import { unref, Ref, nextTick } from 'vue';
-import type { EChartsType, EChartsOption } from 'echarts';
+import type { EChartsOption } from 'echarts';
 import { useDebounce } from '/@/hooks/core/useDebounce';
 import { useEventListener } from '/@/hooks/event/useEventListener';
 import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
@@ -12,7 +12,7 @@ export function useECharts(
   elRef: Ref<HTMLDivElement>,
   theme: 'light' | 'dark' | 'default' = 'light'
 ) {
-  let chartInstance: Nullable<EChartsType> = null;
+  let chartInstance: echarts.ECharts | null = null;
   let resizeFn: Fn = resize;
   let removeResizeFn: Fn = () => {};
 

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

@@ -1,13 +0,0 @@
-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;
-};

+ 12 - 11
src/hooks/web/useI18n.ts

@@ -11,23 +11,24 @@ type I18nGlobalTranslation = {
 
 type I18nTranslationRestParameters = [string, any];
 
+function getKey(namespace: string | undefined, key: string) {
+  if (!namespace) {
+    return key;
+  }
+  if (key.startsWith(namespace)) {
+    return key;
+  }
+  return `${namespace}.${key}`;
+}
+
 export function useI18n(
   namespace?: string
 ): {
   t: I18nGlobalTranslation;
 } {
-  function getKey(key: string) {
-    if (!namespace) {
-      return key;
-    }
-    if (key.startsWith(namespace)) {
-      return key;
-    }
-    return `${namespace}.${key}`;
-  }
   const normalFn = {
     t: (key: string) => {
-      return getKey(key);
+      return getKey(namespace, key);
     },
   };
 
@@ -39,7 +40,7 @@ export function useI18n(
 
   const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => {
     if (!key) return '';
-    return t(getKey(key), ...(arg as I18nTranslationRestParameters));
+    return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters));
   };
   return {
     ...methods,

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

@@ -1,33 +0,0 @@
-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,
-  };
-};

+ 5 - 5
src/layouts/default/header/components/user-dropdown/index.vue

@@ -1,9 +1,11 @@
 <template>
   <Dropdown placement="bottomLeft" :overlayClassName="`${prefixCls}-dropdown-overlay`">
-    <span :class="[prefixCls, `${prefixCls}--${theme}`]">
+    <span :class="[prefixCls, `${prefixCls}--${theme}`]" class="flex">
       <img :class="`${prefixCls}__header`" :src="headerImg" />
-      <span :class="`${prefixCls}__info`">
-        <span :class="`${prefixCls}__name`" class="truncate">{{ getUserInfo.realName }}</span>
+      <span :class="`${prefixCls}__info hidden md:block`">
+        <span :class="`${prefixCls}__name  `" class="truncate">
+          {{ getUserInfo.realName }}
+        </span>
       </span>
     </span>
 
@@ -121,9 +123,7 @@
   @prefix-cls: ~'@{namespace}-header-user-dropdown';
 
   .@{prefix-cls} {
-    display: flex;
     height: @header-height;
-    min-width: 100px;
     padding: 0 0 0 10px;
     padding-right: 10px;
     overflow: hidden;

+ 1 - 0
src/main.ts

@@ -16,6 +16,7 @@ import { isDevMode } from '/@/utils/env';
 
 const app = createApp(App);
 
+// Register global components
 registerGlobComp(app);
 
 // Multilingual configuration

+ 3 - 3
src/router/constant.ts

@@ -2,7 +2,9 @@ import type { AppRouteRecordRaw } from '/@/router/types';
 import ParentLayout from '/@/layouts/page/ParentView.vue';
 import { t } from '/@/hooks/web/useI18n';
 
-const EXCEPTION_COMPONENT = () => import('../views/sys/exception/Exception.vue');
+export const REDIRECT_NAME = 'Redirect';
+
+export const EXCEPTION_COMPONENT = () => import('../views/sys/exception/Exception.vue');
 
 /**
  * @description: default layout
@@ -44,8 +46,6 @@ export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {
   ],
 };
 
-export const REDIRECT_NAME = 'Redirect';
-
 export const REDIRECT_ROUTE: AppRouteRecordRaw = {
   path: '/redirect',
   name: REDIRECT_NAME,

+ 4 - 0
src/router/guard/httpGuard.ts

@@ -2,6 +2,10 @@ import type { Router } from 'vue-router';
 import { useProjectSetting } from '/@/hooks/setting';
 import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel';
 
+/**
+ * The interface used to close the current page to complete the request when the route is switched
+ * @param router
+ */
 export function createHttpGuard(router: Router) {
   const { removeAllHttpPending } = useProjectSetting();
   let axiosCanceler: Nullable<AxiosCanceler>;

+ 4 - 0
src/router/guard/messageGuard.ts

@@ -4,6 +4,10 @@ import { Modal, notification } from 'ant-design-vue';
 
 import { warn } from '/@/utils/log';
 
+/**
+ * Used to close the message instance when the route is switched
+ * @param router
+ */
 export function createMessageGuard(router: Router) {
   const { closeMessageOnSwitch } = useProjectSetting();
 

+ 1 - 2
src/router/index.ts

@@ -6,7 +6,6 @@ import { createRouter, createWebHashHistory } from 'vue-router';
 import { createGuard } from './guard/';
 
 import { basicRoutes } from './routes/';
-import { scrollBehavior } from './scrollBehavior';
 import { REDIRECT_NAME } from './constant';
 
 // app router
@@ -14,7 +13,7 @@ const router = createRouter({
   history: createWebHashHistory(),
   routes: (basicRoutes as unknown) as RouteRecordRaw[],
   strict: true,
-  scrollBehavior: scrollBehavior,
+  scrollBehavior: () => ({ left: 0, top: 0 }),
 });
 
 // reset router

+ 0 - 57
src/router/scrollBehavior.ts

@@ -1,57 +0,0 @@
-// see https://github.com/vuejs/vue-router-next/blob/master/playground/scrollWaiter.ts
-import type { RouteLocationNormalized } from 'vue-router';
-// class ScrollQueue {
-//   private resolve: (() => void) | null = null;
-//   private promise: Promise<any> | null = null;
-
-//   add() {
-//     this.promise = new Promise((resolve) => {
-//       this.resolve = resolve as () => void;
-//     });
-//   }
-
-//   flush() {
-//     this.resolve && this.resolve();
-//     this.resolve = null;
-//     this.promise = null;
-//   }
-
-//   async wait() {
-//     await this.promise;
-//   }
-// }
-// const scrollWaiter = new ScrollQueue();
-
-/**
- * Handles the scroll behavior on route navigation
- *
- * @param {object} to Route object of next page
- * @param {object} from Route object of previous page
- * @param {object} savedPosition Used by popstate navigations
- * @returns {(object|boolean)} Scroll position or `false`
- */
-// @ts-ignore
-export async function scrollBehavior(to, from, savedPosition) {
-  // await scrollWaiter.wait();
-  // Use predefined scroll behavior if defined, defaults to no scroll behavior
-  const behavior = 'smooth';
-  // Returning the `savedPosition` (if available) will result in a native-like
-  // behavior when navigating with back/forward buttons
-  if (savedPosition) {
-    return { ...savedPosition, behavior };
-  }
-
-  // Scroll to anchor by returning the selector
-  if (to.hash) {
-    return { el: decodeURI(to.hash), behavior };
-  }
-
-  // Check if any matched route config has meta that discourages scrolling to top
-  if (to.matched.some((m: RouteLocationNormalized) => m.meta.scrollToTop === false)) {
-    // Leave scroll as it is
-    return false;
-  }
-
-  // Always scroll to top
-  return { left: 0, top: 0, behavior };
-}

+ 0 - 7
src/router/types.ts

@@ -89,12 +89,5 @@ export interface MenuModule {
   menu: Menu;
 }
 
-// interface RouteModule {
-//   layout: AppRouteRecordRaw;
-//   routes: AppRouteRecordRaw[];
-//   children?: AppRouteRecordRaw[];
-//   component?: Component;
-// }
-
 // export type AppRouteModule = RouteModule | AppRouteRecordRaw;
 export type AppRouteModule = AppRouteRecordRaw;

+ 2 - 9
src/store/index.ts

@@ -1,19 +1,12 @@
 import type { App } from 'vue';
-import {
-  createStore,
-  // createLogger, Plugin
-} from 'vuex';
+import { createStore } 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 store = createStore({
-  // modules: {},
-  strict: isDev,
-  // plugins,
+  strict: isDevMode(),
 });
 
 export function setupStore(app: App<Element>) {

+ 3 - 1
src/utils/encryption/aesEncryption.ts

@@ -1,8 +1,10 @@
 import CryptoES from 'crypto-es';
+
 export interface EncryptionParams {
   key: string;
   iv: string;
 }
+
 export class Encryption {
   private key;
 
@@ -16,7 +18,7 @@ export class Encryption {
 
   get getOptions(): CryptoES.lib.CipherCfg {
     return {
-      mode: CryptoES.mode.CBC as any,
+      mode: CryptoES.mode.CBC,
       padding: CryptoES.pad.Pkcs7,
       iv: this.iv,
     };

+ 38 - 37
src/views/sys/login/ForgetPasswordForm.vue

@@ -1,45 +1,46 @@
 <template>
-  <Form class="p-4" :model="formData" :rules="getFormRules" ref="formRef">
-    <FormItem name="account" class="enter-x">
-      <Input size="large" v-model:value="formData.account" :placeholder="t('sys.login.userName')" />
-    </FormItem>
+  <template v-if="getShow">
+    <LoginFormTitle class="enter-x" />
+    <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef">
+      <FormItem name="account" class="enter-x">
+        <Input
+          size="large"
+          v-model:value="formData.account"
+          :placeholder="t('sys.login.userName')"
+        />
+      </FormItem>
 
-    <FormItem name="mobile" class="enter-x">
-      <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" />
-    </FormItem>
-    <FormItem name="sms" class="enter-x">
-      <CountdownInput
-        size="large"
-        v-model:value="formData.sms"
-        :placeholder="t('sys.login.smsCode')"
-      />
-    </FormItem>
+      <FormItem name="mobile" class="enter-x">
+        <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" />
+      </FormItem>
+      <FormItem name="sms" class="enter-x">
+        <CountdownInput
+          size="large"
+          v-model:value="formData.sms"
+          :placeholder="t('sys.login.smsCode')"
+        />
+      </FormItem>
 
-    <FormItem class="enter-x">
-      <Button
-        type="primary"
-        size="large"
-        block
-        @click="handleReset"
-        :loading="loading"
-        class="enter-x"
-      >
-        {{ t('common.resetText') }}
-      </Button>
-      <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
-        {{ t('sys.login.backSignIn') }}
-      </Button>
-    </FormItem>
-  </Form>
+      <FormItem class="enter-x">
+        <Button type="primary" size="large" block @click="handleReset" :loading="loading">
+          {{ t('common.resetText') }}
+        </Button>
+        <Button size="large" block class="mt-4" @click="handleBackLogin">
+          {{ t('sys.login.backSignIn') }}
+        </Button>
+      </FormItem>
+    </Form>
+  </template>
 </template>
 <script lang="ts">
-  import { defineComponent, reactive, ref } from 'vue';
+  import { defineComponent, reactive, ref, computed, unref } from 'vue';
 
+  import LoginFormTitle from './LoginFormTitle.vue';
   import { Form, Input, Button } from 'ant-design-vue';
   import { CountdownInput } from '/@/components/CountDown';
 
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
+  import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin';
 
   export default defineComponent({
     name: 'ForgetPasswordForm',
@@ -49,10 +50,11 @@
       FormItem: Form.Item,
       Input,
       CountdownInput,
+      LoginFormTitle,
     },
     setup() {
       const { t } = useI18n();
-      const { setLoginState } = useLoginState();
+      const { handleBackLogin, getLoginState } = useLoginState();
       const { getFormRules } = useFormRules();
 
       const formRef = ref<any>(null);
@@ -66,16 +68,14 @@
 
       const { validForm } = useFormValid(formRef);
 
+      const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD);
+
       async function handleReset() {
         const data = await validForm();
         if (!data) return;
         console.log(data);
       }
 
-      function handleBackLogin() {
-        setLoginState(LoginStateEnum.LOGIN);
-      }
-
       return {
         t,
         formRef,
@@ -84,6 +84,7 @@
         handleReset,
         loading,
         handleBackLogin,
+        getShow,
       };
     },
   });

+ 6 - 13
src/views/sys/login/Login.vue

@@ -9,7 +9,7 @@
       <AppLogo :alwaysShowTitle="true" />
     </span>
 
-    <div class="container relative h-full py-2 mx-auto sm:px-10">
+    <div class="container relative h-full py-2 mx-auto sm:px-10 -enter-x">
       <div class="flex h-full">
         <div class="hidden xl:flex xl:flex-col xl:w-6/12 min-h-full mr-4 pl-4">
           <AppLogo class="-enter-x" />
@@ -31,14 +31,11 @@
           <div
             class="my-auto mx-auto xl:ml-20 bg-white xl:bg-transparent px-5 py-8 sm:px-8 xl:p-0 rounded-md shadow-md xl:shadow-none w-full sm:w-3/4 lg:w-2/4 xl:w-auto enter-x relative"
           >
-            <h2 class="font-bold text-2xl xl:text-3xl enter-x text-center xl:text-left mb-6">
-              {{ getFormTitle }}
-            </h2>
-            <LoginForm v-show="getShowLogin" />
-            <ForgetPasswordForm v-if="getShowResetPassword" />
-            <RegisterForm v-if="getShowRegister" />
-            <MobileForm v-if="getShowMobile" />
-            <QrCodeForm v-if="getShowQrCode" />
+            <LoginForm />
+            <ForgetPasswordForm />
+            <RegisterForm />
+            <MobileForm />
+            <QrCodeForm />
           </div>
         </div>
       </div>
@@ -59,7 +56,6 @@
   import { useGlobSetting, useProjectSetting } from '/@/hooks/setting';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useDesign } from '/@/hooks/web/useDesign';
-  import { useShowLoginForm, useFormTitle } from './useLogin';
 
   export default defineComponent({
     name: 'Login',
@@ -74,7 +70,6 @@
     },
     setup() {
       const globSetting = useGlobSetting();
-      const { getFormTitle } = useFormTitle();
       const { prefixCls } = useDesign('login');
       const { locale } = useProjectSetting();
       const { t } = useI18n();
@@ -84,8 +79,6 @@
         prefixCls,
         title: computed(() => globSetting?.title ?? ''),
         showLocale: computed(() => locale.show),
-        getFormTitle,
-        ...useShowLoginForm(),
       };
     },
   });

+ 13 - 14
src/views/sys/login/LoginForm.vue

@@ -1,5 +1,6 @@
 <template>
-  <Form class="p-4" :model="formData" :rules="getFormRules" ref="formRef">
+  <LoginFormTitle v-show="getShow" class="enter-x" />
+  <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef" v-show="getShow">
     <FormItem name="account" class="enter-x">
       <Input size="large" v-model:value="formData.account" :placeholder="t('sys.login.userName')" />
     </FormItem>
@@ -32,14 +33,7 @@
     </ARow>
 
     <FormItem class="enter-x">
-      <Button
-        type="primary"
-        size="large"
-        block
-        @click="handleLogin"
-        :loading="loading"
-        class="enter-x"
-      >
+      <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
         {{ t('sys.login.loginButton') }}
       </Button>
       <!-- <Button size="large" class="mt-4 enter-x" block @click="handleRegister">
@@ -64,7 +58,7 @@
       </ACol>
     </ARow>
 
-    <Divider>{{ t('sys.login.otherSignIn') }}</Divider>
+    <Divider class="enter-x">{{ t('sys.login.otherSignIn') }}</Divider>
 
     <div class="flex justify-evenly enter-x" :class="`${prefixCls}-sign-in-way`">
       <GithubFilled />
@@ -76,7 +70,7 @@
   </Form>
 </template>
 <script lang="ts">
-  import { defineComponent, reactive, ref, toRaw } from 'vue';
+  import { defineComponent, reactive, ref, toRaw, unref, computed } from 'vue';
 
   import { Checkbox, Form, Input, Row, Col, Button, Divider } from 'ant-design-vue';
   import {
@@ -86,6 +80,7 @@
     GoogleCircleFilled,
     TwitterCircleFilled,
   } from '@ant-design/icons-vue';
+  import LoginFormTitle from './LoginFormTitle.vue';
 
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
@@ -97,15 +92,16 @@
   export default defineComponent({
     name: 'LoginForm',
     components: {
+      [Col.name]: Col,
+      [Row.name]: Row,
       Checkbox,
       Button,
       Form,
       FormItem: Form.Item,
       Input,
       Divider,
+      LoginFormTitle,
       InputPassword: Input.Password,
-      [Col.name]: Col,
-      [Row.name]: Row,
       GithubFilled,
       WechatFilled,
       AlipayCircleFilled,
@@ -117,7 +113,7 @@
       const { notification } = useMessage();
       const { prefixCls } = useDesign('login');
 
-      const { setLoginState } = useLoginState();
+      const { setLoginState, getLoginState } = useLoginState();
       const { getFormRules } = useFormRules();
 
       const formRef = ref<any>(null);
@@ -131,6 +127,8 @@
 
       const { validForm } = useFormValid(formRef);
 
+      const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN);
+
       async function handleLogin() {
         const data = await validForm();
         if (!data) return;
@@ -165,6 +163,7 @@
         loading,
         setLoginState,
         LoginStateEnum,
+        getShow,
       };
     },
   });

+ 35 - 0
src/views/sys/login/LoginFormTitle.vue

@@ -0,0 +1,35 @@
+<template>
+  <h2 class="font-bold text-2xl xl:text-3xl enter-x text-center xl:text-left mb-6">
+    {{ getFormTitle }}
+  </h2>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, unref } from 'vue';
+
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { LoginStateEnum, useLoginState } from './useLogin';
+
+  export default defineComponent({
+    name: 'LoginFormTitle',
+    setup() {
+      const { t } = useI18n();
+
+      const { getLoginState } = useLoginState();
+
+      const getFormTitle = computed(() => {
+        const titleObj = {
+          [LoginStateEnum.RESET_PASSWORD]: t('sys.login.forgetFormTitle'),
+          [LoginStateEnum.LOGIN]: t('sys.login.signInFormTitle'),
+          [LoginStateEnum.REGISTER]: t('sys.login.signUpFormTitle'),
+          [LoginStateEnum.MOBILE]: t('sys.login.mobileSignInFormTitle'),
+          [LoginStateEnum.QR_CODE]: t('sys.login.qrSignInFormTitle'),
+        };
+        return titleObj[unref(getLoginState)];
+      });
+
+      return {
+        getFormTitle,
+      };
+    },
+  });
+</script>

+ 31 - 34
src/views/sys/login/MobileForm.vue

@@ -1,41 +1,38 @@
 <template>
-  <Form class="p-4" :model="formData" :rules="getFormRules" ref="formRef">
-    <FormItem name="mobile" class="enter-x">
-      <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" />
-    </FormItem>
-    <FormItem name="sms" class="enter-x">
-      <CountdownInput
-        size="large"
-        v-model:value="formData.sms"
-        :placeholder="t('sys.login.smsCode')"
-      />
-    </FormItem>
+  <template v-if="getShow">
+    <LoginFormTitle class="enter-x" />
+    <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef">
+      <FormItem name="mobile" class="enter-x">
+        <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" />
+      </FormItem>
+      <FormItem name="sms" class="enter-x">
+        <CountdownInput
+          size="large"
+          v-model:value="formData.sms"
+          :placeholder="t('sys.login.smsCode')"
+        />
+      </FormItem>
 
-    <FormItem class="enter-x">
-      <Button
-        type="primary"
-        size="large"
-        block
-        @click="handleLogin"
-        :loading="loading"
-        class="enter-x"
-      >
-        {{ t('sys.login.loginButton') }}
-      </Button>
-      <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
-        {{ t('sys.login.backSignIn') }}
-      </Button>
-    </FormItem>
-  </Form>
+      <FormItem class="enter-x">
+        <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
+          {{ t('sys.login.loginButton') }}
+        </Button>
+        <Button size="large" block class="mt-4" @click="handleBackLogin">
+          {{ t('sys.login.backSignIn') }}
+        </Button>
+      </FormItem>
+    </Form>
+  </template>
 </template>
 <script lang="ts">
-  import { defineComponent, reactive, ref } from 'vue';
+  import { defineComponent, reactive, ref, computed, unref } from 'vue';
 
   import { Form, Input, Button } from 'ant-design-vue';
   import { CountdownInput } from '/@/components/CountDown';
+  import LoginFormTitle from './LoginFormTitle.vue';
 
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
+  import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin';
 
   export default defineComponent({
     name: 'MobileForm',
@@ -45,10 +42,11 @@
       FormItem: Form.Item,
       Input,
       CountdownInput,
+      LoginFormTitle,
     },
     setup() {
       const { t } = useI18n();
-      const { setLoginState } = useLoginState();
+      const { handleBackLogin, getLoginState } = useLoginState();
       const { getFormRules } = useFormRules();
 
       const formRef = ref<any>(null);
@@ -61,16 +59,14 @@
 
       const { validForm } = useFormValid(formRef);
 
+      const getShow = computed(() => unref(getLoginState) === LoginStateEnum.MOBILE);
+
       async function handleLogin() {
         const data = await validForm();
         if (!data) return;
         console.log(data);
       }
 
-      function handleBackLogin() {
-        setLoginState(LoginStateEnum.LOGIN);
-      }
-
       return {
         t,
         formRef,
@@ -79,6 +75,7 @@
         handleLogin,
         loading,
         handleBackLogin,
+        getShow,
       };
     },
   });

+ 24 - 14
src/views/sys/login/QrCodeForm.vue

@@ -1,20 +1,29 @@
 <template>
-  <div class="enter-x min-w-64 min-h-64">
-    <QrCode :value="qrCodeUrl" class="enter-x flex justify-center xl:justify-start" :width="280" />
-    <Divider>{{ t('sys.login.scanSign') }}</Divider>
-    <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
-      {{ t('sys.login.backSignIn') }}
-    </Button>
-  </div>
+  <template v-if="getShow">
+    <LoginFormTitle class="enter-x" />
+    <div class="enter-x min-w-64 min-h-64">
+      <QrCode
+        :value="qrCodeUrl"
+        class="enter-x flex justify-center xl:justify-start"
+        :width="280"
+      />
+      <Divider class="enter-x">{{ t('sys.login.scanSign') }}</Divider>
+      <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
+        {{ t('sys.login.backSignIn') }}
+      </Button>
+    </div>
+  </template>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
+  import { defineComponent, computed, unref } from 'vue';
 
+  import LoginFormTitle from './LoginFormTitle.vue';
   import { Button, Divider } from 'ant-design-vue';
+  import { QrCode } from '/@/components/Qrcode/index';
 
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { LoginStateEnum, useLoginState } from './useLogin';
-  import { QrCode } from '/@/components/Qrcode/index';
+  import { useLoginState, LoginStateEnum } from './useLogin';
+
   const qrCodeUrl = 'https://vvbin.cn/next/login';
   export default defineComponent({
     name: 'QrCodeForm',
@@ -22,18 +31,19 @@
       Button,
       QrCode,
       Divider,
+      LoginFormTitle,
     },
     setup() {
       const { t } = useI18n();
-      const { setLoginState } = useLoginState();
+      const { handleBackLogin, getLoginState } = useLoginState();
+
+      const getShow = computed(() => unref(getLoginState) === LoginStateEnum.QR_CODE);
 
-      function handleBackLogin() {
-        setLoginState(LoginStateEnum.LOGIN);
-      }
       return {
         t,
         handleBackLogin,
         qrCodeUrl,
+        getShow,
       };
     },
   });

+ 64 - 56
src/views/sys/login/RegisterForm.vue

@@ -1,65 +1,73 @@
 <template>
-  <Form class="p-4" :model="formData" :rules="getFormRules" ref="formRef">
-    <FormItem name="account" class="enter-x">
-      <Input size="large" v-model:value="formData.account" :placeholder="t('sys.login.userName')" />
-    </FormItem>
-    <FormItem name="mobile" class="enter-x">
-      <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" />
-    </FormItem>
-    <FormItem name="sms" class="enter-x">
-      <CountdownInput
-        size="large"
-        v-model:value="formData.sms"
-        :placeholder="t('sys.login.smsCode')"
-      />
-    </FormItem>
-    <FormItem name="password" class="enter-x">
-      <StrengthMeter
-        size="large"
-        v-model:value="formData.password"
-        :placeholder="t('sys.login.password')"
-      />
-    </FormItem>
-    <FormItem name="confirmPassword" class="enter-x">
-      <InputPassword
-        size="large"
-        visibilityToggle
-        v-model:value="formData.confirmPassword"
-        :placeholder="t('sys.login.confirmPassword')"
-      />
-    </FormItem>
+  <template v-if="getShow">
+    <LoginFormTitle class="enter-x" />
+    <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef">
+      <FormItem name="account" class="enter-x">
+        <Input
+          size="large"
+          v-model:value="formData.account"
+          :placeholder="t('sys.login.userName')"
+        />
+      </FormItem>
+      <FormItem name="mobile" class="enter-x">
+        <Input size="large" v-model:value="formData.mobile" :placeholder="t('sys.login.mobile')" />
+      </FormItem>
+      <FormItem name="sms" class="enter-x">
+        <CountdownInput
+          size="large"
+          v-model:value="formData.sms"
+          :placeholder="t('sys.login.smsCode')"
+        />
+      </FormItem>
+      <FormItem name="password" class="enter-x">
+        <StrengthMeter
+          size="large"
+          v-model:value="formData.password"
+          :placeholder="t('sys.login.password')"
+        />
+      </FormItem>
+      <FormItem name="confirmPassword" class="enter-x">
+        <InputPassword
+          size="large"
+          visibilityToggle
+          v-model:value="formData.confirmPassword"
+          :placeholder="t('sys.login.confirmPassword')"
+        />
+      </FormItem>
 
-    <FormItem class="enter-x" name="policy">
-      <!-- No logic, you need to deal with it yourself -->
-      <Checkbox v-model:checked="formData.policy" size="small">
-        {{ t('sys.login.policy') }}
-      </Checkbox>
-    </FormItem>
+      <FormItem class="enter-x" name="policy">
+        <!-- No logic, you need to deal with it yourself -->
+        <Checkbox v-model:checked="formData.policy" size="small">
+          {{ t('sys.login.policy') }}
+        </Checkbox>
+      </FormItem>
 
-    <Button
-      type="primary"
-      size="large"
-      block
-      @click="handleReset"
-      :loading="loading"
-      class="enter-x"
-    >
-      {{ t('sys.login.registerButton') }}
-    </Button>
-    <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
-      {{ t('sys.login.backSignIn') }}
-    </Button>
-  </Form>
+      <Button
+        type="primary"
+        class="enter-x"
+        size="large"
+        block
+        @click="handleReset"
+        :loading="loading"
+      >
+        {{ t('sys.login.registerButton') }}
+      </Button>
+      <Button size="large" block class="enter-x mt-4" @click="handleBackLogin">
+        {{ t('sys.login.backSignIn') }}
+      </Button>
+    </Form>
+  </template>
 </template>
 <script lang="ts">
-  import { defineComponent, reactive, ref } from 'vue';
+  import { defineComponent, reactive, ref, unref, computed } from 'vue';
 
+  import LoginFormTitle from './LoginFormTitle.vue';
   import { Form, Input, Button, Checkbox } from 'ant-design-vue';
   import { StrengthMeter } from '/@/components/StrengthMeter';
   import { CountdownInput } from '/@/components/CountDown';
 
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
+  import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin';
 
   export default defineComponent({
     name: 'RegisterPasswordForm',
@@ -72,10 +80,11 @@
       Checkbox,
       StrengthMeter,
       CountdownInput,
+      LoginFormTitle,
     },
     setup() {
       const { t } = useI18n();
-      const { setLoginState } = useLoginState();
+      const { handleBackLogin, getLoginState } = useLoginState();
 
       const formRef = ref<any>(null);
       const loading = ref(false);
@@ -92,16 +101,14 @@
       const { getFormRules } = useFormRules(formData);
       const { validForm } = useFormValid(formRef);
 
+      const getShow = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER);
+
       async function handleReset() {
         const data = await validForm();
         if (!data) return;
         console.log(data);
       }
 
-      function handleBackLogin() {
-        setLoginState(LoginStateEnum.LOGIN);
-      }
-
       return {
         t,
         formRef,
@@ -110,6 +117,7 @@
         handleReset,
         loading,
         handleBackLogin,
+        getShow,
       };
     },
   });

+ 11 - 28
src/views/sys/login/useLogin.ts

@@ -12,22 +12,6 @@ export enum LoginStateEnum {
 
 const currentState = ref(LoginStateEnum.LOGIN);
 
-export function useFormTitle() {
-  const { t } = useI18n();
-
-  const getFormTitle = computed(() => {
-    const titleObj = {
-      [LoginStateEnum.RESET_PASSWORD]: t('sys.login.forgetFormTitle'),
-      [LoginStateEnum.LOGIN]: t('sys.login.signInFormTitle'),
-      [LoginStateEnum.REGISTER]: t('sys.login.signUpFormTitle'),
-      [LoginStateEnum.MOBILE]: t('sys.login.mobileSignInFormTitle'),
-      [LoginStateEnum.QR_CODE]: t('sys.login.qrSignInFormTitle'),
-    };
-    return titleObj[unref(currentState)];
-  });
-  return { getFormTitle };
-}
-
 export function useLoginState() {
   function setLoginState(state: LoginStateEnum) {
     currentState.value = state;
@@ -35,19 +19,11 @@ export function useLoginState() {
 
   const getLoginState = computed(() => currentState.value);
 
-  return { setLoginState, getLoginState };
-}
-
-export function useShowLoginForm() {
-  const getShowLogin = computed(() => unref(currentState) === LoginStateEnum.LOGIN);
-  const getShowResetPassword = computed(
-    () => unref(currentState) === LoginStateEnum.RESET_PASSWORD
-  );
-  const getShowRegister = computed(() => unref(currentState) === LoginStateEnum.REGISTER);
-  const getShowMobile = computed(() => unref(currentState) === LoginStateEnum.MOBILE);
-  const getShowQrCode = computed(() => unref(currentState) === LoginStateEnum.QR_CODE);
+  function handleBackLogin() {
+    setLoginState(LoginStateEnum.LOGIN);
+  }
 
-  return { getShowLogin, getShowResetPassword, getShowRegister, getShowMobile, getShowQrCode };
+  return { setLoginState, getLoginState, handleBackLogin };
 }
 
 export function useFormValid<T extends Object = any>(formRef: Ref<any>) {
@@ -96,6 +72,7 @@ export function useFormRules(formData?: Recordable) {
       mobile: mobileFormRule,
     };
     switch (unref(currentState)) {
+      // register form rules
       case LoginStateEnum.REGISTER:
         return {
           account: accountFormRule,
@@ -106,13 +83,19 @@ export function useFormRules(formData?: Recordable) {
           policy: [{ validator: validatePolicy, trigger: 'change' }],
           ...mobileRule,
         };
+
+      // reset password form rules
       case LoginStateEnum.RESET_PASSWORD:
         return {
           account: accountFormRule,
           ...mobileRule,
         };
+
+      // mobile form rules
       case LoginStateEnum.MOBILE:
         return mobileRule;
+
+      // login form rules
       default:
         return {
           account: accountFormRule,

+ 0 - 5
tsconfig.json

@@ -25,11 +25,6 @@
       "/@/*": ["src/*"]
     }
   },
-  "plugins": [
-    {
-      "name": "@vuedx/typescript-plugin-vue"
-    }
-  ],
   "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
   "exclude": ["node_modules", "dist", "**/*.js"]
 }

+ 7 - 8
windi.config.ts

@@ -10,14 +10,13 @@ export default defineConfig({
     extend: {
       colors,
     },
-
-    // screen: {
-    //   sm: '576px',
-    //   md: '768px',
-    //   lg: '992px',
-    //   xl: '1200px',
-    //   '2xl': '1600px',
-    // },
+    screens: {
+      sm: '576px',
+      md: '768px',
+      lg: '992px',
+      xl: '1200px',
+      '2xl': '1600px',
+    },
   },
 });
 

+ 55 - 447
yarn.lock

@@ -67,7 +67,7 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.12.1", "@babel/generator@^7.12.10", "@babel/generator@^7.12.11":
+"@babel/generator@^7.12.10", "@babel/generator@^7.12.11":
   version "7.12.11"
   resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af"
   integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==
@@ -278,12 +278,7 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@7.12.3":
-  version "7.12.3"
-  resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd"
-  integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==
-
-"@babel/parser@^7.12.0", "@babel/parser@^7.12.1", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.3", "@babel/parser@^7.12.7":
+"@babel/parser@^7.12.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7":
   version "7.12.11"
   resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79"
   integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==
@@ -862,21 +857,6 @@
     "@babel/parser" "^7.12.7"
     "@babel/types" "^7.12.7"
 
-"@babel/traverse@7.12.1":
-  version "7.12.1"
-  resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e"
-  integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==
-  dependencies:
-    "@babel/code-frame" "^7.10.4"
-    "@babel/generator" "^7.12.1"
-    "@babel/helper-function-name" "^7.10.4"
-    "@babel/helper-split-export-declaration" "^7.11.0"
-    "@babel/parser" "^7.12.1"
-    "@babel/types" "^7.12.1"
-    debug "^4.1.0"
-    globals "^11.1.0"
-    lodash "^4.17.19"
-
 "@babel/traverse@^7.0.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5":
   version "7.12.12"
   resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376"
@@ -892,15 +872,6 @@
     globals "^11.1.0"
     lodash "^4.17.19"
 
-"@babel/types@7.12.1":
-  version "7.12.1"
-  resolved "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae"
-  integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==
-  dependencies:
-    "@babel/helper-validator-identifier" "^7.10.4"
-    lodash "^4.17.19"
-    to-fast-properties "^2.0.0"
-
 "@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.4":
   version "7.12.12"
   resolved "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299"
@@ -1112,20 +1083,10 @@
   dependencies:
     cross-fetch "^3.0.6"
 
-"@iconify/json@^1.1.306":
-  version "1.1.306"
-  resolved "https://registry.npmjs.org/@iconify/json/-/json-1.1.306.tgz#cad12ad858a61689009c12d3d2df0fde6a202bb9"
-  integrity sha512-OT1H/non+J8i9BBery8VhXn2JJeUMr8iKA166wsW74UWgez2HsPnkNNdtQmZxIuAyL6FuHQ+WvDi18uD9eAo0Q==
-
-"@intlify/core-base@9.0.0-beta.16":
-  version "9.0.0-beta.16"
-  resolved "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.0.0-beta.16.tgz#ab35802b982f52db20d4758d020c2dcd1724e7f9"
-  integrity sha512-PJLDVYy3x8Mf9+XtWljEfk4Lo6mudopYlRvB89NQR3TkR+Tqkbcsegj09XdXpTKBYiq+yQrlZKZ0KEHb7l5Zuw==
-  dependencies:
-    "@intlify/message-compiler" "9.0.0-beta.16"
-    "@intlify/message-resolver" "9.0.0-beta.16"
-    "@intlify/runtime" "9.0.0-beta.16"
-    "@intlify/shared" "9.0.0-beta.16"
+"@iconify/json@^1.1.307":
+  version "1.1.307"
+  resolved "https://registry.npmjs.org/@iconify/json/-/json-1.1.307.tgz#db97e8faba1183e0411471dafe210deba0cc1fe2"
+  integrity sha512-2hyKd4DKGWNtQ9CNC4s7tRzMHyDai3GnARC26nGZo7f4/r86FTspvjCEbqpbuM5spJ1fn5jx00Iv4Qee89ooRA==
 
 "@intlify/core-base@9.0.0-rc.2":
   version "9.0.0-rc.2"
@@ -1137,22 +1098,6 @@
     "@intlify/runtime" "9.0.0-rc.2"
     "@intlify/shared" "9.0.0-rc.2"
 
-"@intlify/core@^9.0.0-beta.15":
-  version "9.0.0-beta.16"
-  resolved "https://registry.npmjs.org/@intlify/core/-/core-9.0.0-beta.16.tgz#d74d4678868b37b641bdf999552b237d84dacb88"
-  integrity sha512-tPXf9rr+ZzG1zXgdLo8rCO2jws6eIXzJSaTvgnanZpfyyMKE+T8Ra5vVu3f/Sm0J7flT+z/Q3kLfnbpOMQ1UiQ==
-  dependencies:
-    "@intlify/core-base" "9.0.0-beta.16"
-
-"@intlify/message-compiler@9.0.0-beta.16":
-  version "9.0.0-beta.16"
-  resolved "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.0.0-beta.16.tgz#359993251a303f148b3a325eca055cdbaf0cd95f"
-  integrity sha512-dE4UZsbVl5TKogYdfrJ6nQKdin1R4XMKVBVa9dE1A8HVvVHBSLy6iQiYpcw8TwcEHIa+rFjuuHuh+IdN3eCw+g==
-  dependencies:
-    "@intlify/message-resolver" "9.0.0-beta.16"
-    "@intlify/shared" "9.0.0-beta.16"
-    source-map "0.6.1"
-
 "@intlify/message-compiler@9.0.0-rc.2":
   version "9.0.0-rc.2"
   resolved "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.0.0-rc.2.tgz#b2ea4852af26f62e850c36157c4b8c03e7a072f4"
@@ -1162,25 +1107,11 @@
     "@intlify/shared" "9.0.0-rc.2"
     source-map "0.6.1"
 
-"@intlify/message-resolver@9.0.0-beta.16":
-  version "9.0.0-beta.16"
-  resolved "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.0.0-beta.16.tgz#f8960344201050d17560f8d01f63e3cd0b9bf59c"
-  integrity sha512-xwjsFuDDYEv7g1KE5QZRbrPgfsrNsDhYLtNYR7Tn4inzbmB6ipak2UlDzDcQGLieSFbe1WwAoNL0IXy4sUKboQ==
-
 "@intlify/message-resolver@9.0.0-rc.2":
   version "9.0.0-rc.2"
   resolved "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.0.0-rc.2.tgz#d6f5eac6dc594ebb1c5e2f68a94fd9e5429c4a15"
   integrity sha512-CNRrIflQmq3aZWsyGu3mfR9d+xA7W0t5HZQeSh+YR9IBHxNg+2uWbYhGDab87yzovIGOnUSO9yxUdD8gBBmR9Q==
 
-"@intlify/runtime@9.0.0-beta.16":
-  version "9.0.0-beta.16"
-  resolved "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.0.0-beta.16.tgz#6a210a5b0984f9e295025e3dde5262108e0e69d9"
-  integrity sha512-py+stHrbkBoEB2OsBB+rySevR+54uhybF54LToGjErr740R/AVuOVTJEKRS/LF9VvinGZZTu/WVOXcPpMfqt8Q==
-  dependencies:
-    "@intlify/message-compiler" "9.0.0-beta.16"
-    "@intlify/message-resolver" "9.0.0-beta.16"
-    "@intlify/shared" "9.0.0-beta.16"
-
 "@intlify/runtime@9.0.0-rc.2":
   version "9.0.0-rc.2"
   resolved "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.0.0-rc.2.tgz#20f83a2f57a7789a9588e42a2cf5163f6f13255b"
@@ -1190,11 +1121,6 @@
     "@intlify/message-resolver" "9.0.0-rc.2"
     "@intlify/shared" "9.0.0-rc.2"
 
-"@intlify/shared@9.0.0-beta.16":
-  version "9.0.0-beta.16"
-  resolved "https://registry.npmjs.org/@intlify/shared/-/shared-9.0.0-beta.16.tgz#51a80ca4705c93cb14c8f06398dfc550df09d67d"
-  integrity sha512-A7GSOovcZn/NMoAmDc8FG9uRcFv6iygriK8+C6HFeOnMQ9X+T9f5A9bPtXhCOCiRpQm9SUtGqXedxO5Y8rz9/A==
-
 "@intlify/shared@9.0.0-rc.2":
   version "9.0.0-rc.2"
   resolved "https://registry.npmjs.org/@intlify/shared/-/shared-9.0.0-rc.2.tgz#31f53616fe515e8629f39c179f217ca562d06256"
@@ -1301,74 +1227,6 @@
     estree-walker "^2.0.1"
     picomatch "^2.2.2"
 
-"@sentry/core@5.30.0":
-  version "5.30.0"
-  resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
-  integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
-  dependencies:
-    "@sentry/hub" "5.30.0"
-    "@sentry/minimal" "5.30.0"
-    "@sentry/types" "5.30.0"
-    "@sentry/utils" "5.30.0"
-    tslib "^1.9.3"
-
-"@sentry/hub@5.30.0":
-  version "5.30.0"
-  resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
-  integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
-  dependencies:
-    "@sentry/types" "5.30.0"
-    "@sentry/utils" "5.30.0"
-    tslib "^1.9.3"
-
-"@sentry/minimal@5.30.0":
-  version "5.30.0"
-  resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
-  integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
-  dependencies:
-    "@sentry/hub" "5.30.0"
-    "@sentry/types" "5.30.0"
-    tslib "^1.9.3"
-
-"@sentry/node@^5.30.0":
-  version "5.30.0"
-  resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
-  integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
-  dependencies:
-    "@sentry/core" "5.30.0"
-    "@sentry/hub" "5.30.0"
-    "@sentry/tracing" "5.30.0"
-    "@sentry/types" "5.30.0"
-    "@sentry/utils" "5.30.0"
-    cookie "^0.4.1"
-    https-proxy-agent "^5.0.0"
-    lru_map "^0.3.3"
-    tslib "^1.9.3"
-
-"@sentry/tracing@5.30.0":
-  version "5.30.0"
-  resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
-  integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
-  dependencies:
-    "@sentry/hub" "5.30.0"
-    "@sentry/minimal" "5.30.0"
-    "@sentry/types" "5.30.0"
-    "@sentry/utils" "5.30.0"
-    tslib "^1.9.3"
-
-"@sentry/types@5.30.0":
-  version "5.30.0"
-  resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
-  integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
-
-"@sentry/utils@5.30.0":
-  version "5.30.0"
-  resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
-  integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
-  dependencies:
-    "@sentry/types" "5.30.0"
-    tslib "^1.9.3"
-
 "@simonwep/pickr@~1.8.0":
   version "1.8.0"
   resolved "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.0.tgz#adbff9a4f7f0e59dec9946508c5e481b7abae0f8"
@@ -1405,11 +1263,6 @@
     ejs "^2.6.1"
     magic-string "^0.25.0"
 
-"@types/braces@*":
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb"
-  integrity sha512-TbH79tcyi9FHwbyboOKeRachRq63mSuWYXOflsNO9ZyE5ClQ/JaozNKl+aWUq87qPNsXasXxi2AbgfwIJ+8GQw==
-
 "@types/estree@0.0.39":
   version "0.0.39"
   resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
@@ -1511,13 +1364,6 @@
   dependencies:
     "@types/unist" "*"
 
-"@types/micromatch@^4.0.1":
-  version "4.0.1"
-  resolved "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.1.tgz#9381449dd659fc3823fd2a4190ceacc985083bc7"
-  integrity sha512-my6fLBvpY70KattTNzYOK6KU1oR1+UCz9ug/JbcF5UrEmeCt9P7DV2t7L8+t18mMPINqGQCE4O8PLOPbI84gxw==
-  dependencies:
-    "@types/braces" "*"
-
 "@types/minimatch@*", "@types/minimatch@^3.0.3":
   version "3.0.3"
   resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@@ -1729,7 +1575,7 @@
     html-tags "^3.1.0"
     svg-tags "^1.0.0"
 
-"@vue/compiler-core@3.0.5", "@vue/compiler-core@^3.0.0", "@vue/compiler-core@^3.0.1", "@vue/compiler-core@^3.0.2":
+"@vue/compiler-core@3.0.5":
   version "3.0.5"
   resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.5.tgz#a6e54cabe9536e74c6513acd2649f311af1d43ac"
   integrity sha512-iFXwk2gmU/GGwN4hpBwDWWMLvpkIejf/AybcFtlQ5V1ur+5jwfBaV0Y1RXoR6ePfBPJixtKZ3PmN+M+HgMAtfQ==
@@ -1812,134 +1658,25 @@
   resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.0.5.tgz#c131d88bd6713cc4d93b3bb1372edb1983225ff0"
   integrity sha512-gYsNoGkWejBxNO6SNRjOh/xKeZ0H0V+TFzaPzODfBjkAIb0aQgBuixC1brandC/CDJy1wYPwSoYrXpvul7m6yw==
 
-"@vuedx/analyze@0.6.3":
-  version "0.6.3"
-  resolved "https://registry.npmjs.org/@vuedx/analyze/-/analyze-0.6.3.tgz#f7f367ea1a1b10e22212a4f2f89d5781f17f3c84"
-  integrity sha512-LiQ7Ppw4nEr5qjth+gg1m48yXD7usOcAygUU10lLwfRRlDZevxAdZRcNuC0vBOXUG3xbl6CSDXnAMeWFdlUiyw==
-  dependencies:
-    "@babel/code-frame" "^7.10.4"
-    "@babel/generator" "^7.12.1"
-    "@babel/parser" "^7.12.3"
-    "@babel/template" "^7.12.7"
-    "@babel/traverse" "7.12.1"
-    "@babel/types" "7.12.1"
-    "@types/micromatch" "^4.0.1"
-    "@vuedx/compiler-sfc" "0.6.2"
-    "@vuedx/compiler-tsx" "0.6.3"
-    "@vuedx/projectconfig" "0.6.2"
-    "@vuedx/shared" "0.6.2"
-    "@vuedx/template-ast-types" "0.6.2"
-    cli-highlight "^2.1.4"
-    commander "^6.1.0"
-    fast-glob "^3.2.4"
-    hash-sum "^2.0.0"
-    micromatch "^4.0.2"
-
-"@vuedx/compiler-sfc@0.6.2":
-  version "0.6.2"
-  resolved "https://registry.npmjs.org/@vuedx/compiler-sfc/-/compiler-sfc-0.6.2.tgz#f9a0d66eb48be839d363364ed4cd96967929f3cb"
-  integrity sha512-mJehCyO6BJiHCLPfVQQZb7RliuwBh7voGkrF27SkA3yhv44VSDaMbDIX2VRm3utl1CacFEVdNFqB9QYviZByfg==
-  dependencies:
-    "@vue/compiler-core" "^3.0.2"
-    lru-cache "^6.0.0"
-    source-map "^0.6.1"
-
-"@vuedx/compiler-tsx@0.6.3":
-  version "0.6.3"
-  resolved "https://registry.npmjs.org/@vuedx/compiler-tsx/-/compiler-tsx-0.6.3.tgz#d5ed641ee5c90baf3a04962f47e8c9d31d318b9a"
-  integrity sha512-H1SSgUHQXWoTnrIxvl9uXGMUqKlWjNddp8xc+EAg7BRQ4F7kFzHTzOsafG5xzrqnmZujj8cLUknG123rWgsxIg==
-  dependencies:
-    "@babel/parser" "7.12.3"
-    "@babel/types" "7.12.1"
-    "@vue/compiler-core" "^3.0.1"
-    "@vuedx/shared" "0.6.2"
-    "@vuedx/template-ast-types" "0.6.2"
-
-"@vuedx/projectconfig@0.6.2":
-  version "0.6.2"
-  resolved "https://registry.npmjs.org/@vuedx/projectconfig/-/projectconfig-0.6.2.tgz#4c7c32fc76a5a0cb2a8a8b4c4530183d7b70decc"
-  integrity sha512-qoekczmYpg4bOHMUduGgwGEWYq2CZL9HfztNzSPaJnErTBc4VNFnCBLsAtFPLkILASh6vzE2m/EpIzSpMW5mJQ==
-
-"@vuedx/shared@0.6.2":
-  version "0.6.2"
-  resolved "https://registry.npmjs.org/@vuedx/shared/-/shared-0.6.2.tgz#ada493a0af75306e37ac19fe8e836f1ce07c8745"
-  integrity sha512-xCXK+X5iDXkNfLglxFGFeEtqSWlopU8Cj6dGgMABWlee7HVDl47A4sj5oQpKuTjwRJHyE+BYtgGxtf1eLee5Yg==
-  dependencies:
-    "@sentry/node" "^5.30.0"
-    node-unique-machine-id "^1.1.0"
-    uuid "^8.3.2"
-
-"@vuedx/template-ast-types@0.6.2":
-  version "0.6.2"
-  resolved "https://registry.npmjs.org/@vuedx/template-ast-types/-/template-ast-types-0.6.2.tgz#8932b665abfed4593a0bdbfa91ed788056876770"
-  integrity sha512-TY3IesmF6/XbZnlLnImE30MXVJeXpMh8F5ZKZeeVDIvDWmPDZ6fC8DbDj1GycZtx77C85yZRnJJqq5v0AED4aw==
-  dependencies:
-    "@vue/compiler-core" "^3.0.0"
-
-"@vuedx/typecheck@^0.6.3":
-  version "0.6.3"
-  resolved "https://registry.npmjs.org/@vuedx/typecheck/-/typecheck-0.6.3.tgz#d66b8dcfa8d7d37ccfa196d019c8a5cc8bc7fc4d"
-  integrity sha512-1WfUI+bqg1O8Vklz24EZdsUE6ak4QCxtV6gWrUw+VUbep7ANhZM4RkaMsDFWVdeb2dip9ROrO8ESBrsIViPT8Q==
-  dependencies:
-    "@vuedx/shared" "0.6.2"
-    "@vuedx/typescript-plugin-vue" "0.6.3"
-    "@vuedx/vue-virtual-textdocument" "0.6.3"
-    chalk "^4.1.0"
-    fast-glob "^3.2.4"
-    minimist "^1.2.5"
-    resolve-from "^5.0.0"
-    typescript "^4.0.3"
-
-"@vuedx/typescript-plugin-vue@0.6.3", "@vuedx/typescript-plugin-vue@^0.6.3":
-  version "0.6.3"
-  resolved "https://registry.npmjs.org/@vuedx/typescript-plugin-vue/-/typescript-plugin-vue-0.6.3.tgz#cc2d99bdc0abbde9bb5909341c47715af00539a3"
-  integrity sha512-zAhXM9LDVYvjAMnTiqf6yZcJXXh1rQrH3JhcmQNmlxk26sRysfa/VWNC8qkfq9vcOKRf1eQusH4g+Vov6qPGig==
-  dependencies:
-    "@intlify/core" "^9.0.0-beta.15"
-    "@vuedx/analyze" "0.6.3"
-    "@vuedx/compiler-sfc" "0.6.2"
-    "@vuedx/projectconfig" "0.6.2"
-    "@vuedx/shared" "0.6.2"
-    "@vuedx/template-ast-types" "0.6.2"
-    "@vuedx/vue-virtual-textdocument" "0.6.3"
-    de-indent "^1.0.2"
-    json5 "^2.1.3"
-    quick-lru "^5.1.1"
-    vscode-uri "^2.1.2"
-    vscode-web-custom-data "^0.3.2"
-
-"@vuedx/vue-virtual-textdocument@0.6.3":
-  version "0.6.3"
-  resolved "https://registry.npmjs.org/@vuedx/vue-virtual-textdocument/-/vue-virtual-textdocument-0.6.3.tgz#750484d93378b47ead5f6e319e32d33160ed5658"
-  integrity sha512-FN5h4GsIcYAIfFbal0+1ryddDgpxMx/gxGE5QYinbwj5PwILZzyAUt//drQfppIHzCL+TJuZSml7fAod5tYvQA==
-  dependencies:
-    "@vuedx/analyze" "0.6.3"
-    "@vuedx/compiler-sfc" "0.6.2"
-    "@vuedx/compiler-tsx" "0.6.3"
-    "@vuedx/shared" "0.6.2"
-    source-map "^0.6.1"
-    vscode-languageserver-textdocument "^1.0.1"
-    vscode-uri "^2.1.2"
-
-"@vueuse/core@^4.1.1":
-  version "4.1.1"
-  resolved "https://registry.npmjs.org/@vueuse/core/-/core-4.1.1.tgz#9136952bc435dfc42263959bea8dac35965bac43"
-  integrity sha512-a+fu7FUHDzLpgcOGwbgyNZXLbm85NHEf4jkPkyqTtqHEHqU4aVbdyM0Vzl90PpFEDe92pJjoYJnZEQQgq9nEHw==
+"@vueuse/core@^4.2.1":
+  version "4.2.1"
+  resolved "https://registry.npmjs.org/@vueuse/core/-/core-4.2.1.tgz#ac72801c67f26315723d4d244e843c28047f7bc4"
+  integrity sha512-V8KohPwbIN9t5ZWfqB+TJhzM2iwrugq78t6I1QwoGdaw9fdbQfHJiiaf83MGxgYO2B9IwVtuYc4Vjd9X/0Kppg==
   dependencies:
-    "@vueuse/shared" "4.1.1"
+    "@vueuse/shared" "4.2.1"
     vue-demi latest
 
-"@vueuse/shared@4.1.1":
-  version "4.1.1"
-  resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-4.1.1.tgz#58e4333d5ab45927e25578fad83bc81cecfea475"
-  integrity sha512-M1bNwOaJZypu/AUYKrOU87pQLRp8VgMYHQyL1hVc6V3hi3ZcUBSjZuyFVaUdxGk0OeA0NPzHoYbByTMrpxElug==
+"@vueuse/shared@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-4.2.1.tgz#67e3229e7df68e2c4225d0086537e3a972fe89eb"
+  integrity sha512-lSrzRHRzdqf4LTczeTrVmRd4cmJ6D1u77fJ2E9gksfKHZs+zwSZku7EiAqVj/g1nqZglTu5Z4y6aE6dp3YLYWw==
   dependencies:
     vue-demi latest
 
-"@windicss/plugin-utils@0.4.3":
-  version "0.4.3"
-  resolved "https://registry.npmjs.org/@windicss/plugin-utils/-/plugin-utils-0.4.3.tgz#84e85fd3cd6eaf54ca72cae276f9cf0610f45e56"
-  integrity sha512-ilddLED+sZQIA9rOwE5eYwdBEBWKREvAVkkiAOOTNf7oDcP/a1cxT3f/nE4tgfhz+MC/FKcy7NkfrqfXRdEQaQ==
+"@windicss/plugin-utils@0.4.4":
+  version "0.4.4"
+  resolved "https://registry.npmjs.org/@windicss/plugin-utils/-/plugin-utils-0.4.4.tgz#fd18565a23df7896d8a4550bcecad631311db538"
+  integrity sha512-qQHtNPt0eI2K2lsFHBN5y/rbC3ndXgR+PZuKdj2oirQLKMXFyU70+GdeMShi3OkZXAwGqN08MvdoiTsC2jGEMQ==
   dependencies:
     esbuild "^0.8.49"
     esbuild-register "^2.0.0"
@@ -1983,13 +1720,6 @@ adler-32@~1.2.0:
     exit-on-epipe "~1.0.1"
     printj "~1.1.0"
 
-agent-base@6:
-  version "6.0.2"
-  resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
-  integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
-  dependencies:
-    debug "4"
-
 aggregate-error@^3.0.0:
   version "3.1.0"
   resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
@@ -2097,11 +1827,6 @@ ant-design-vue@2.0.0:
     vue-types "^3.0.0"
     warning "^4.0.0"
 
-any-promise@^1.0.0:
-  version "1.3.0"
-  resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
-  integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
-
 anymatch@~3.1.1:
   version "3.1.1"
   resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
@@ -2755,18 +2480,6 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
-cli-highlight@^2.1.4:
-  version "2.1.10"
-  resolved "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.10.tgz#26a087da9209dce4fcb8cf5427dc97cd96ac173a"
-  integrity sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw==
-  dependencies:
-    chalk "^4.0.0"
-    highlight.js "^10.0.0"
-    mz "^2.4.0"
-    parse5 "^5.1.1"
-    parse5-htmlparser2-tree-adapter "^6.0.0"
-    yargs "^16.0.0"
-
 cli-truncate@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
@@ -2895,7 +2608,7 @@ commander@^4.1.1:
   resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
   integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
 
-commander@^6.1.0, commander@^6.2.0:
+commander@^6.2.0:
   version "6.2.1"
   resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
   integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
@@ -3179,11 +2892,6 @@ convert-source-map@^1.7.0:
   dependencies:
     safe-buffer "~5.1.1"
 
-cookie@^0.4.1:
-  version "0.4.1"
-  resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
-  integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
-
 copy-anything@^2.0.1:
   version "2.0.1"
   resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.1.tgz#2afbce6da684bdfcbec93752fa762819cb480d9a"
@@ -3394,11 +3102,6 @@ dayjs@^1.10.4:
   resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2"
   integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==
 
-de-indent@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
-  integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=
-
 debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
   version "2.6.9"
   resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -3406,13 +3109,6 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
   dependencies:
     ms "2.0.0"
 
-debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1:
-  version "4.3.1"
-  resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
-  integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
-  dependencies:
-    ms "2.1.2"
-
 debug@^3.1.1, debug@^3.2.6:
   version "3.2.7"
   resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
@@ -3420,6 +3116,13 @@ debug@^3.1.1, debug@^3.2.6:
   dependencies:
     ms "^2.1.1"
 
+debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+  integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+  dependencies:
+    ms "2.1.2"
+
 debug@^4.3.2:
   version "4.3.2"
   resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
@@ -3726,10 +3429,10 @@ ejs@^2.6.1:
   resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 
-ejs@^3.1.5:
-  version "3.1.5"
-  resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz#aed723844dc20acb4b170cd9ab1017e476a0d93b"
-  integrity sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==
+ejs@^3.1.6:
+  version "3.1.6"
+  resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a"
+  integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==
   dependencies:
     jake "^10.6.1"
 
@@ -4216,7 +3919,7 @@ fast-diff@^1.1.2:
   resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
   integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
 
-fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.4, fast-glob@^3.2.5:
+fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.5:
   version "3.2.5"
   resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
   integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
@@ -4966,11 +4669,6 @@ header-case@^2.0.4:
     capital-case "^1.0.4"
     tslib "^2.0.3"
 
-highlight.js@^10.0.0:
-  version "10.5.0"
-  resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.5.0.tgz#3f09fede6a865757378f2d9ebdcbc15ba268f98f"
-  integrity sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw==
-
 homedir-polyfill@^1.0.1:
   version "1.0.3"
   resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
@@ -5066,23 +4764,15 @@ http-server@^0.12.3:
     secure-compare "3.0.1"
     union "~0.5.0"
 
-https-proxy-agent@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
-  integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
-  dependencies:
-    agent-base "6"
-    debug "4"
-
 human-signals@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
   integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
 
-husky@^5.0.9:
-  version "5.0.9"
-  resolved "https://registry.npmjs.org/husky/-/husky-5.0.9.tgz#6d38706643d66ed395bcd4ee952d02e3f15eb3a3"
-  integrity sha512-0SjcaY21a+IRdx7p7r/X33Vc09UR2m8SbP8yfkhUX2/jAmwcz+GR7i9jXkp2pP3GfX23JhMkVP6SWwXB18uXtg==
+husky@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmjs.org/husky/-/husky-5.1.0.tgz#68b1148523acc838af0655ead71bf4671adb9f93"
+  integrity sha512-Os0EY2haOO+59YZSwMiUDsHY43RFwBVIRStHcnnT8/kvA+sFfaA/YS4uLFRiymXYgQl6E6TQTt3y4v/Z2ctEtw==
 
 iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
   version "0.4.24"
@@ -5738,7 +5428,7 @@ json5@^1.0.1:
   dependencies:
     minimist "^1.2.0"
 
-json5@^2.1.2, json5@^2.1.3:
+json5@^2.1.2:
   version "2.1.3"
   resolved "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
   integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
@@ -6092,11 +5782,6 @@ lru-cache@^6.0.0:
   dependencies:
     yallist "^4.0.0"
 
-lru_map@^0.3.3:
-  version "0.3.3"
-  resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
-  integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
-
 magic-string@^0.25.0, magic-string@^0.25.7:
   version "0.25.7"
   resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
@@ -6449,15 +6134,6 @@ mute-stream@0.0.7:
   resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
   integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
 
-mz@^2.4.0:
-  version "2.7.0"
-  resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
-  integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
-  dependencies:
-    any-promise "^1.0.0"
-    object-assign "^4.0.1"
-    thenify-all "^1.0.0"
-
 nanoid@^3.0.1, nanoid@^3.1.20:
   version "3.1.20"
   resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
@@ -6532,13 +6208,6 @@ node-releases@^1.1.69:
   resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08"
   integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==
 
-node-unique-machine-id@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.npmjs.org/node-unique-machine-id/-/node-unique-machine-id-1.1.0.tgz#dbd9351da927cfc0e85a663a55e8644da384b746"
-  integrity sha512-uJtdcFelVD08XdvxYWYzMYprSTPYl9CYiQbyGYbjXZcMZtLRlEqNUs+C/va/81DNgExsMHL5g0YDYQFS0pENRQ==
-  dependencies:
-    uuid "^3.3.3"
-
 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"
   resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -6973,23 +6642,6 @@ parse-passwd@^1.0.0:
   resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
   integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
 
-parse5-htmlparser2-tree-adapter@^6.0.0:
-  version "6.0.1"
-  resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
-  integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==
-  dependencies:
-    parse5 "^6.0.1"
-
-parse5@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
-  integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
-
-parse5@^6.0.1:
-  version "6.0.1"
-  resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
-  integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
-
 parseurl@~1.3.3:
   version "1.3.3"
   resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -7428,11 +7080,6 @@ quick-lru@^4.0.1:
   resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
   integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
 
-quick-lru@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
-  integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
-
 randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -8724,20 +8371,6 @@ text-table@^0.2.0:
   resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
-thenify-all@^1.0.0:
-  version "1.6.0"
-  resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
-  integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
-  dependencies:
-    thenify ">= 3.1.0 < 4"
-
-"thenify@>= 3.1.0 < 4":
-  version "3.3.1"
-  resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
-  integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
-  dependencies:
-    any-promise "^1.0.0"
-
 through2@^2.0.0, through2@^2.0.2:
   version "2.0.5"
   resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
@@ -8873,7 +8506,7 @@ tslib@2.0.3:
   resolved "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
   integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
 
-tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
+tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
   version "1.14.1"
   resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@@ -8944,11 +8577,6 @@ typedarray-to-buffer@^3.1.5:
   dependencies:
     is-typedarray "^1.0.0"
 
-typescript@^4.0.3:
-  version "4.1.3"
-  resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7"
-  integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==
-
 typescript@^4.1.5:
   version "4.1.5"
   resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72"
@@ -9158,16 +8786,11 @@ utils-merge@1.0.1:
   resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
   integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
 
-uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3:
+uuid@^3.0.1, uuid@^3.3.2:
   version "3.4.0"
   resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
-uuid@^8.3.2:
-  version "8.3.2"
-  resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
-  integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-
 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"
@@ -9215,12 +8838,12 @@ vite-plugin-compression@^0.2.1:
     debug "^4.3.2"
     fs-extra "^9.1.0"
 
-vite-plugin-html@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-2.0.0.tgz#de39b99ce7df4d0e1234bfae5c23215647d71a28"
-  integrity sha512-6nfzAcMp345FRI5WTHOq11O585nlJ2ELwFarhZEi/yvrR1FauhDcFOGGL67/IKiTruYZaatZ3xnFg5BIxK6/7w==
+vite-plugin-html@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-2.0.1.tgz#6a8fa9a705024aa47e03b9b990c650773e2bd29b"
+  integrity sha512-qmoPTTkajxCuctxoAreIF9JW6HjrUr6hKJWLHnwRPoBd9SNzcyDwI6cW4gd4DQy2zHcQA7dD8LzgmT1Qz0vvgw==
   dependencies:
-    ejs "^3.1.5"
+    ejs "^3.1.6"
     fs-extra "^9.1.0"
     html-minifier-terser "^5.1.1"
 
@@ -9274,10 +8897,10 @@ vite-plugin-purge-icons@^0.7.0:
     "@purge-icons/generated" "^0.7.0"
     rollup-plugin-purge-icons "^0.7.0"
 
-vite-plugin-pwa@^0.5.2:
-  version "0.5.2"
-  resolved "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.5.2.tgz#48131ebadc0c98c34a543dbf1bb1c86aeef532e0"
-  integrity sha512-4SHKxYhd5sCF/ebbgxGYlN91UHlylzh7C32a5+Y2c2vbrWzw5x62ZxsYzolQzBosdOim4Ez+e/dX4hmP3BCmow==
+vite-plugin-pwa@^0.5.3:
+  version "0.5.3"
+  resolved "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.5.3.tgz#60d97d62335846144c8e6b6a911704d6c0f75171"
+  integrity sha512-xGh0gIgzczvYNj8ED5HhpJ2iT5kMiieim2qI8kT/3+rfo83hTyuzhEICkljIbhausvOaGxtzLKWE8RS6cUg0Fw==
   dependencies:
     debug "^4.3.2"
     fast-glob "^3.2.5"
@@ -9307,12 +8930,12 @@ vite-plugin-theme@^0.4.3:
     es-module-lexer "^0.3.26"
     tinycolor2 "^1.4.2"
 
-vite-plugin-windicss@0.4.3:
-  version "0.4.3"
-  resolved "https://registry.npmjs.org/vite-plugin-windicss/-/vite-plugin-windicss-0.4.3.tgz#f86e5a3b78882caa3cdd50cba2b08770e2d627c8"
-  integrity sha512-Lnv6OhcYzcJvecTs4LIpMSfo54rSewkHrW85IVwy8hacR0krY319jXr5nwiDpSTp6HM3QJhoJ4zxHF+t5Q+Nwg==
+vite-plugin-windicss@0.4.4:
+  version "0.4.4"
+  resolved "https://registry.npmjs.org/vite-plugin-windicss/-/vite-plugin-windicss-0.4.4.tgz#fd13fba5b55211f34768f5acfadfd743f95c24a6"
+  integrity sha512-VDQn4cO+cq7sEV2yD1n+Mg6sN4TiFZwdeuteN7uDk6gintbUAMNHyoFyZUF0Z0/vYN4Ca62HvXlXdTgheE4QYg==
   dependencies:
-    "@windicss/plugin-utils" "0.4.3"
+    "@windicss/plugin-utils" "0.4.4"
     windicss "^2.1.15"
 
 vite@2.0.1:
@@ -9327,21 +8950,6 @@ vite@2.0.1:
   optionalDependencies:
     fsevents "~2.3.1"
 
-vscode-languageserver-textdocument@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f"
-  integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==
-
-vscode-uri@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c"
-  integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==
-
-vscode-web-custom-data@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.npmjs.org/vscode-web-custom-data/-/vscode-web-custom-data-0.3.2.tgz#62a5a924397d8056c5524ff0ff8f14eb815b7066"
-  integrity sha512-GGZ99dJbARyh6rv03dXZImGlP5WvNG382A3nIt0yX1uyqBa558L/klHWcgEJzcVkG4t16OQWwPedMR3JkeD2Qg==
-
 vue-demi@latest:
   version "0.6.0"
   resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.6.0.tgz#e314282f704cb449119b9fd002cbbc0e39f591fe"
@@ -9773,7 +9381,7 @@ yargs@^15.1.0:
     y18n "^4.0.0"
     yargs-parser "^18.1.2"
 
-yargs@^16.0.0, yargs@^16.0.3, yargs@^16.2.0:
+yargs@^16.0.3, yargs@^16.2.0:
   version "16.2.0"
   resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
   integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==