Browse Source

feat: auto import route

vben 4 years ago
parent
commit
8a1bfdf13d

+ 6 - 3
.env.development

@@ -4,11 +4,14 @@ VITE_USE_MOCK = true
 # public path
 VITE_PUBLIC_PATH = /
 
+# Cross-domain proxy, you can configure multiple
+VITE_PROXY=[["/api","http://localhost:3000"]]
+
+# Delete console
+VITE_DROP_CONSOLE = false
+
 # Basic interface address SPA
 VITE_GLOB_API_URL=/api
 
 # Interface prefix
 VITE_GLOB_API_URL_PREFIX=
-
-# Cross-domain proxy, you can configure multiple
-VITE_PROXY=[["/api","http://localhost:3000"]]

+ 6 - 1
.env.production

@@ -4,12 +4,17 @@ VITE_USE_MOCK = true
 # public path
 VITE_PUBLIC_PATH = ./
 
+# Delete console
+VITE_DROP_CONSOLE = true
+
+# Delete console
+VITE_BUILD_GZIP = false
+
 # Basic interface address SPA
 VITE_GLOB_API_URL=/api
 
 # Interface prefix
 VITE_GLOB_API_URL_PREFIX=
 
-
 # TODO use Cdn
 VITE_USE_CDN = true

+ 25 - 0
CHANGELOG.zh_CN.md

@@ -1,3 +1,28 @@
+# wip
+
+### ✨ Features
+
+- 打包可以配置输出`gizp`
+- 打包可以配置删除`console`
+- 路由及菜单不需要在手动引入,改为自动引入
+
+### 🎫 Chores
+
+- 升级 vue 到`3.0.1`
+- 将`vite`版本改为每日构建版本
+
+### 🐛 Bug Fixes
+
+- 修复菜单报错
+- 修复表格自适应高度问题
+- 修复`window系统`执行 script 报错问题
+
+### ⚡ Performance Improvements
+
+- 删除菜单最小化背景
+- 阻止页面刷新重新渲染菜单
+- 其他一些细节优化
+
 # 2.0.0-rc.1 (2020-10-14)
 
 ### ✨ Features

+ 6 - 5
README.en-US.md

@@ -92,7 +92,6 @@ The documentation for 2.0 hasn't started yet, it will be provided later.
 - [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - Mock plugin base on vite
 - [vue-i18n](https://github.com/intlify/vue-i18n-next) - Internationalization
 - [lodash-es](https://github.com/lodash/lodash) - JavaScript utility library
-- [moment](https://github.com/moment/moment) - Time operation library
 - [axios](https://github.com/axios/axios) - Http data interaction
 - [TypeScript](https://www.typescriptlang.org/)
 
@@ -225,6 +224,7 @@ yarn clean:lib # Delete node_modules, supported window
 - [x] Digital animation
 - [x] First screen loading waiting animation
 - [x] Extract the production environment profile
+- [x] Build Gzip
 
 ## Developing features
 
@@ -234,7 +234,6 @@ yarn clean:lib # Delete node_modules, supported window
 - [ ] Global error handling
 - [ ] Theme configuration
 - [ ] Dark theme
-- [ ] Build Gzip
 - [ ] Build CDN
 - [ ] System performance optimization
 
@@ -246,6 +245,8 @@ It is recommended to use the `Chrome` browser for local development. Development
 
 Support modern browsers, Not currently supported ie11,Follow-up consideration support ie11
 
-| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
-| :-: | :-: | :-: | :-: |
-| Not currently supported | last 2 versions | last 2 versions | last 2 versions |
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
+| :-: | :-: | :-: | :-: | :-: |
+| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
+
+More browsers can view [Can I Use Es Module](https://caniuse.com/?search=ES%20Module)

+ 7 - 10
README.md

@@ -35,10 +35,6 @@
 
 ## 介绍
 
-该分支为 2.0 新分支,使用 vue3 进行开发。
-
-1.0 分支请切换到`master`分支。1.0 采用`vue2.6`+`vue-composition-api`+`vue-cli`开发
-
 项目基于`ant-design-vue`,`typescript`,`vue3.0`,`vite`,`tsx`实现的 vue3 风格的后台管理系统,
 
 ## gitHub 地址
@@ -65,7 +61,7 @@
 
 ## 文档
 
-2.0 文档还没开始写。后续补上
+2.0 文档很快完成,请耐心等待
 
 ## 预安装
 
@@ -93,7 +89,6 @@
 - [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - 基于 vite 的 mock 插件.
 - [vue-i18n](https://github.com/intlify/vue-i18n-next) - 国际化
 - [lodash-es](https://github.com/lodash/lodash) - JavaScript 实用程序库
-- [moment](https://github.com/moment/moment) - 时间操作库
 - [axios](https://github.com/axios/axios) - Http 数据交互
 - [TypeScript](https://www.typescriptlang.org/)
 
@@ -227,6 +222,7 @@ yarn clean:lib # 删除node_modules,兼容window系统
 - [x] 数字动画
 - [x] 首屏加载等待动画
 - [x] 抽取生产环境配置文件
+- [x] 打包 Gzip
 
 ## 正在开发的功能
 
@@ -236,7 +232,6 @@ yarn clean:lib # 删除node_modules,兼容window系统
 - [ ] 全局错误处理
 - [ ] 主题配置
 - [ ] 黑暗主题
-- [ ] 打包 Gzip
 - [ ] 打包 CDN
 - [ ] 系统性能优化
 
@@ -248,9 +243,11 @@ yarn clean:lib # 删除node_modules,兼容window系统
 
 支持现代浏览器, IE 暂不支持,后续考虑支持 ie11
 
-| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
-| :-: | :-: | :-: | :-: |
-| not support | last 2 versions | last 2 versions | last 2 versions |
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
+| :-: | :-: | :-: | :-: | :-: |
+| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
+
+更多浏览器可以查看 [Can I Use Es Module](https://caniuse.com/?search=ES%20Module)
 
 ## 加入我们
 

+ 0 - 22
build/gzip/index.ts

@@ -1,22 +0,0 @@
-// Build gzip after packaging
-// import { readFile, writeFile } from 'fs';
-import viteConfig from '../../vite.config';
-import {
-  // basename,
-  join,
-} from 'path';
-// import { promisify } from 'util';
-// import { gzip, ZlibOptions } from 'zlib';
-import { readAllFile } from '../utils';
-
-// const readFilePromise = promisify(readFile);
-// const writeFilePromise = promisify(writeFile);
-
-// function createGzip() {}
-
-const FILE_REG = /\.(js|mjs|json|css|html)$/;
-
-const OUT_DIR = viteConfig.outDir || 'dist';
-
-// TODO 待开发
-const files = readAllFile(join(process.cwd(), OUT_DIR), FILE_REG);

+ 36 - 0
build/plugin/gzip/compress.ts

@@ -0,0 +1,36 @@
+import { gzip } from 'zlib';
+import { readFileSync, writeFileSync } from 'fs';
+import { GzipPluginOptions } from './types';
+import viteConfig from '../../vite.config';
+import { readAllFile, getCwdPath, isBuildGzip, isSiteMode } from '../utils';
+
+export function startGzip(
+  fileContent: string | Buffer,
+  options: GzipPluginOptions = {}
+): Promise<Buffer> {
+  return new Promise((resolve, reject) => {
+    gzip(fileContent, options.gzipOptions || {}, (err, result) => {
+      if (err) {
+        reject(err);
+      } else {
+        resolve(result);
+      }
+    });
+  });
+}
+
+// 手动压缩css
+export async function startGzipStyle() {
+  if (isBuildGzip() || isSiteMode()) {
+    const outDir = viteConfig.outDir || 'dist';
+    const assets = viteConfig.assetsDir || '_assets';
+    const allCssFile = readAllFile(getCwdPath(outDir, assets), /\.(css)$/);
+    for (const path of allCssFile) {
+      const source = readFileSync(path);
+      const content = await startGzip(source);
+      const ds = path.split('/');
+      const fileName = ds[ds.length - 1];
+      writeFileSync(getCwdPath(outDir, assets, `${fileName}.gz`), content);
+    }
+  }
+}

+ 195 - 0
build/plugin/gzip/index.ts

@@ -0,0 +1,195 @@
+// 修改自https://github.com/kryops/rollup-plugin-gzip
+// 因为rollup-plugin-gzip不支持vite
+// vite对css打包独立的。所以不能在打包的时候顺带打包css
+
+import { readFile, writeFile } from 'fs';
+import { basename } from 'path';
+import { promisify } from 'util';
+import { gzip } from 'zlib';
+
+import { OutputAsset, OutputChunk, OutputOptions, Plugin } from 'rollup';
+import { GzipPluginOptions } from './types';
+
+const isFunction = (arg: unknown): arg is (...args: any[]) => any => typeof arg === 'function';
+const isRegExp = (arg: unknown): arg is RegExp =>
+  Object.prototype.toString.call(arg) === '[object RegExp]';
+
+export type StringMappingOption = (originalString: string) => string;
+export type CustomCompressionOption = (
+  content: string | Buffer
+) => string | Buffer | Promise<string | Buffer>;
+
+const readFilePromise = promisify(readFile);
+const writeFilePromise = promisify(writeFile);
+
+// functionality partially copied from rollup
+
+/**
+ * copied from https://github.com/rollup/rollup/blob/master/src/rollup/index.ts#L450
+ */
+function isOutputChunk(file: OutputAsset | OutputChunk): file is OutputChunk {
+  return typeof (file as OutputChunk).code === 'string';
+}
+
+/**
+ * Gets the string/buffer content from a file object.
+ * Important for adding source map comments
+ *
+ * Copied partially from rollup.writeOutputFile
+ * https://github.com/rollup/rollup/blob/master/src/rollup/index.ts#L454
+ */
+function getOutputFileContent(
+  outputFileName: string,
+  outputFile: OutputAsset | OutputChunk,
+  outputOptions: OutputOptions
+): string | Buffer {
+  if (isOutputChunk(outputFile)) {
+    let source: string | Buffer;
+    source = outputFile.code;
+    if (outputOptions.sourcemap && outputFile.map) {
+      const url =
+        outputOptions.sourcemap === 'inline'
+          ? outputFile.map.toUrl()
+          : `${basename(outputFileName)}.map`;
+
+      // https://github.com/rollup/rollup/blob/master/src/utils/sourceMappingURL.ts#L1
+      source += `//# source` + `MappingURL=${url}\n`;
+    }
+    return source;
+  } else {
+    return typeof outputFile.source === 'string'
+      ? outputFile.source
+      : // just to be sure, as it is typed string | Uint8Array in rollup 2.0.0
+        Buffer.from(outputFile.source);
+  }
+}
+
+// actual plugin code
+
+function gzipPlugin(options: GzipPluginOptions = {}): Plugin {
+  // check for old options
+  if ('algorithm' in options) {
+    console.warn(
+      '[rollup-plugin-gzip] The "algorithm" option is not supported any more! ' +
+        'Use "customCompression" instead to specify a different compression algorithm.'
+    );
+  }
+  if ('options' in options) {
+    console.warn('[rollup-plugin-gzip] The "options" option was renamed to "gzipOptions"!');
+  }
+  if ('additional' in options) {
+    console.warn('[rollup-plugin-gzip] The "additional" option was renamed to "additionalFiles"!');
+  }
+  if ('delay' in options) {
+    console.warn('[rollup-plugin-gzip] The "delay" option was renamed to "additionalFilesDelay"!');
+  }
+
+  const compressGzip: CustomCompressionOption = (fileContent) => {
+    return new Promise((resolve, reject) => {
+      gzip(fileContent, options.gzipOptions || {}, (err, result) => {
+        if (err) {
+          reject(err);
+        } else {
+          resolve(result);
+        }
+      });
+    });
+  };
+
+  const doCompress = options.customCompression || compressGzip;
+
+  const mapFileName: StringMappingOption = isFunction(options.fileName)
+    ? (options.fileName as StringMappingOption)
+    : (fileName: string) => fileName + (options.fileName || '.gz');
+
+  const plugin: Plugin = {
+    name: 'gzip',
+
+    generateBundle(outputOptions, bundle) {
+      return Promise.all(
+        Object.keys(bundle)
+          .map((fileName) => {
+            const fileEntry = bundle[fileName];
+
+            // file name filter option check
+
+            const fileNameFilter = options.filter || /\.(js|mjs|json|css|html)$/;
+
+            if (isRegExp(fileNameFilter) && !fileName.match(fileNameFilter)) {
+              return Promise.resolve();
+            }
+
+            if (
+              isFunction(fileNameFilter) &&
+              !(fileNameFilter as (x: string) => boolean)(fileName)
+            ) {
+              return Promise.resolve();
+            }
+
+            const fileContent = getOutputFileContent(fileName, fileEntry, outputOptions);
+
+            // minSize option check
+            if (options.minSize && options.minSize > fileContent.length) {
+              return Promise.resolve();
+            }
+
+            return Promise.resolve(doCompress(fileContent))
+              .then((compressedContent) => {
+                const compressedFileName = mapFileName(fileName);
+                bundle[compressedFileName] = {
+                  type: 'asset', // Rollup >= 1.21
+                  name: compressedFileName,
+                  fileName: compressedFileName,
+                  isAsset: true, // Rollup < 1.21
+                  source: compressedContent,
+                };
+              })
+              .catch((err: any) => {
+                console.error(err);
+                return Promise.reject('[rollup-plugin-gzip] Error compressing file ' + fileName);
+              });
+          })
+          .concat([
+            (() => {
+              if (!options.additionalFiles || !options.additionalFiles.length)
+                return Promise.resolve();
+
+              const compressAdditionalFiles = () =>
+                Promise.all(
+                  options.additionalFiles!.map((filePath) =>
+                    readFilePromise(filePath)
+                      .then((fileContent) => doCompress(fileContent))
+                      .then((compressedContent) => {
+                        return writeFilePromise(mapFileName(filePath), compressedContent);
+                      })
+                      .catch(() => {
+                        return Promise.reject(
+                          '[rollup-plugin-gzip] Error compressing additional file ' +
+                            filePath +
+                            '. Please check the spelling of your configured additionalFiles. ' +
+                            'You might also have to increase the value of the additionalFilesDelay option.'
+                        );
+                      })
+                  )
+                ) as Promise<any>;
+
+              // additional files can be processed outside of rollup after a delay
+              // for older plugins or plugins that write to disk (curcumventing rollup) without awaiting
+              const additionalFilesDelay = options.additionalFilesDelay || 0;
+
+              if (additionalFilesDelay) {
+                setTimeout(compressAdditionalFiles, additionalFilesDelay);
+                return Promise.resolve();
+              } else {
+                return compressAdditionalFiles();
+              }
+            })(),
+          ])
+      ) as Promise<any>;
+    },
+  };
+
+  return plugin;
+}
+
+export default gzipPlugin;

+ 0 - 0
build/gzip/types.ts → build/plugin/gzip/types.ts


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

@@ -49,8 +49,9 @@ const globbyTransform = function (config: SharedConfig): Transform {
       let result = cache.get(path);
       if (!result) {
         const reg = /import\s+([\w\s{}*]+)\s+from\s+(['"])globby(\?path)?!([^'"]+)\2/g;
-        const lastImport = urlMap.get(path);
         const match = code.match(reg);
+        if (!match) return code;
+        const lastImport = urlMap.get(path);
         if (lastImport && match) {
           code = code.replace(lastImport, match[0]);
         }

+ 2 - 0
build/script/build.ts

@@ -6,6 +6,7 @@ import { argv } from 'yargs';
 import { runBuildConfig } from './buildConf';
 import { runUpdateHtml } from './updateHtml';
 import { errorConsole, successConsole } from '../utils';
+import { startGzipStyle } from '../plugin/gzip/compress';
 
 export const runBuild = async () => {
   try {
@@ -22,6 +23,7 @@ export const runBuild = async () => {
       await runBuildConfig();
     }
     await runUpdateHtml();
+    await startGzipStyle();
     successConsole('Vite Build successfully!');
   } catch (error) {
     errorConsole('Vite Build Error\n' + error);

+ 2 - 5
build/script/preview.ts

@@ -1,12 +1,12 @@
 import chalk from 'chalk';
 import Koa from 'koa';
 import inquirer from 'inquirer';
-import { sh } from 'tasksfile';
 import staticServer from 'koa-static';
 import portfinder from 'portfinder';
 import { resolve } from 'path';
 import viteConfig from '../../vite.config';
 import { getIPAddress } from '../utils';
+import { runBuild } from './build';
 
 const BUILD = 1;
 const NO_BUILD = 2;
@@ -53,10 +53,7 @@ export const runPreview = async () => {
   });
   const { type } = await prompt;
   if (type === BUILD) {
-    await sh('npm run build', {
-      async: true,
-      nopipe: true,
-    });
+    runBuild();
   }
   startApp();
 };

+ 8 - 0
build/utils.ts

@@ -70,6 +70,12 @@ export function isProdFn(): boolean {
 export function isReportMode(): boolean {
   return process.env.REPORT === 'true';
 }
+export function isBuildGzip(): boolean {
+  return process.env.VITE_BUILD_GZIP === 'true';
+}
+export function isSiteMode(): boolean {
+  return process.env.SITE === 'true';
+}
 
 export interface ViteEnv {
   VITE_PORT: number;
@@ -78,6 +84,8 @@ export interface ViteEnv {
   VITE_PROXY: [string, string][];
   VITE_GLOB_APP_TITLE: string;
   VITE_USE_CDN: boolean;
+  VITE_DROP_CONSOLE: boolean;
+  VITE_BUILD_GZIP: boolean;
 }
 
 export function loadEnv(): ViteEnv {

+ 1 - 1
package.json

@@ -91,7 +91,7 @@
     "tasksfile": "^5.1.1",
     "ts-node": "^9.0.0",
     "typescript": "^4.0.3",
-    "vite": "^1.0.0-rc.4",
+    "vite": "npm:@knightly/vite",
     "vite-plugin-mock": "^1.0.2",
     "vite-plugin-purge-icons": "^0.4.4",
     "vue-eslint-parser": "^7.1.1",

+ 1 - 1
src/components/Menu/src/BasicMenu.tsx

@@ -91,7 +91,7 @@ export default defineComponent({
     });
 
     watch(
-      () => currentRoute.value.path,
+      () => currentRoute.value.name,
       (name: string) => {
         name !== 'Redirect' && handleMenuChange();
         getParentPath();

+ 3 - 1
src/components/Transition/src/ExpandTransition.ts

@@ -48,7 +48,9 @@ export default function (expandedParentClass = '', x = false) {
       if (expandedParentClass && el._parent) {
         el._parent.classList.add(expandedParentClass);
       }
-
+      console.log('======================');
+      console.log(sizeProperty, offset);
+      console.log('======================');
       requestAnimationFrame(() => {
         el.style[sizeProperty] = offset;
       });

+ 29 - 24
src/router/menus/index.ts

@@ -1,4 +1,4 @@
-import type { Menu } from '/@/router/types';
+import type { Menu, MenuModule } from '/@/router/types';
 import type { RouteRecordNormalized } from 'vue-router';
 import { appStore } from '/@/store/modules/app';
 import { permissionStore } from '/@/store/modules/permission';
@@ -7,35 +7,40 @@ import { filter } from '/@/utils/helper/treeHelper';
 import router from '/@/router';
 import { PermissionModeEnum } from '/@/enums/appEnum';
 import { pathToRegexp } from 'path-to-regexp';
+import modules from 'globby!/@/router/menus/modules/**/*.@(ts)';
 
 // ===========================
 // ==========module import====
 // ===========================
-import dashboard from './modules/dashboard';
-
-import exceptionDemo from './modules/demo/exception';
-import iframeDemo from './modules/demo/iframe';
-import compDemo from './modules/demo/comp';
-import permissionDemo from './modules/demo/permission';
-import featDemo from './modules/demo/feat';
-import chartsDemo from './modules/demo/charts';
-import tableDemo from './modules/demo/table';
-import formDemo from './modules/demo/form';
-import treeDemo from './modules/demo/tree';
-
-const menuModules = [
-  dashboard,
-  featDemo,
-  exceptionDemo,
-  iframeDemo,
-  compDemo,
-  permissionDemo,
-  chartsDemo,
-  tableDemo,
-  formDemo,
-  treeDemo,
+// import dashboard from './modules/dashboard';
+
+// import exceptionDemo from './modules/demo/exception';
+// import iframeDemo from './modules/demo/iframe';
+// import compDemo from './modules/demo/comp';
+// import permissionDemo from './modules/demo/permission';
+// import featDemo from './modules/demo/feat';
+// import chartsDemo from './modules/demo/charts';
+// import tableDemo from './modules/demo/table';
+// import formDemo from './modules/demo/form';
+// import treeDemo from './modules/demo/tree';
+
+const menuModules: MenuModule[] = [
+  // dashboard,
+  // featDemo,
+  // exceptionDemo,
+  // iframeDemo,
+  // compDemo,
+  // permissionDemo,
+  // chartsDemo,
+  // tableDemo,
+  // formDemo,
+  // treeDemo,
 ];
 
+Object.keys(modules).forEach((key) => {
+  menuModules.push(modules[key]);
+});
+
 // ===========================
 // ==========Helper===========
 // ===========================

+ 25 - 21
src/router/routes/index.ts

@@ -2,33 +2,37 @@ import type { AppRouteRecordRaw, AppRouteModule } from '/@/router/types';
 
 import { DEFAULT_LAYOUT_COMPONENT, PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '../constant';
 import { genRouteModule } from '/@/utils/helper/routeHelper';
+import modules from 'globby!/@/router/routes/modules/**/*.@(ts)';
 
-import dashboard from './modules/dashboard';
-
+// import dashboard from './modules/dashboard';
 // demo
-import exceptionDemo from './modules/demo/exception';
-import iframeDemo from './modules/demo/iframe';
-import compDemo from './modules/demo/comp';
-import permissionDemo from './modules/demo/permission';
-import featDemo from './modules/demo/feat';
-import chartsDemo from './modules/demo/charts';
-import tableDemo from './modules/demo/table';
-import formDemo from './modules/demo/form';
-import treeDemo from './modules/demo/tree';
+// import exceptionDemo from './modules/demo/exception';
+// import iframeDemo from './modules/demo/iframe';
+// import compDemo from './modules/demo/comp';
+// import permissionDemo from './modules/demo/permission';
+// import featDemo from './modules/demo/feat';
+// import chartsDemo from './modules/demo/charts';
+// import tableDemo from './modules/demo/table';
+// import formDemo from './modules/demo/form';
+// import treeDemo from './modules/demo/tree';
 
 const routeModuleList: AppRouteModule[] = [
-  exceptionDemo,
-  dashboard,
-  iframeDemo,
-  compDemo,
-  featDemo,
-  permissionDemo,
-  chartsDemo,
-  tableDemo,
-  formDemo,
-  treeDemo,
+  // exceptionDemo,
+  // dashboard,
+  // iframeDemo,
+  // compDemo,
+  // featDemo,
+  // permissionDemo,
+  // chartsDemo,
+  // tableDemo,
+  // formDemo,
+  // treeDemo,
 ];
 
+Object.keys(modules).forEach((key) => {
+  routeModuleList.push(modules[key]);
+});
+
 export const asyncRoutes = [
   REDIRECT_ROUTE,
   PAGE_NOT_FOUND_ROUTE,

+ 31 - 12
vite.config.ts

@@ -12,8 +12,10 @@ import {
 import { createProxy } from './build/config/vite/proxy';
 import { createMockServer } from 'vite-plugin-mock';
 import PurgeIcons from 'vite-plugin-purge-icons';
+import gzipPlugin from './build/plugin/gzip/index';
+import globbyTransform from './build/plugin/vite-plugin-context-plugin/transform';
 
-import { isDevFn, isReportMode, isProdFn, loadEnv } from './build/utils';
+import { isDevFn, isReportMode, isProdFn, loadEnv, isBuildGzip, isSiteMode } from './build/utils';
 const pkg = require('./package.json');
 
 const {
@@ -22,6 +24,7 @@ const {
   VITE_PUBLIC_PATH,
   VITE_PROXY,
   VITE_GLOB_APP_TITLE,
+  VITE_DROP_CONSOLE,
   // VITE_USE_CDN,
 } = loadEnv();
 
@@ -33,12 +36,18 @@ const rollupPlugins: any[] = [];
 const vitePlugins: VitePlugin[] = [];
 
 (() => {
-  if (isReportMode() && isProdFn()) {
-    // report
-    rollupPlugins.push(
-      visualizer({ filename: './node_modules/.cache/stats.html', open: true }) as Plugin
-    );
+  if (isProdFn()) {
+    if (isReportMode()) {
+      // report
+      rollupPlugins.push(
+        visualizer({ filename: './node_modules/.cache/stats.html', open: true }) as Plugin
+      );
+    }
+    if (isBuildGzip() || isSiteMode()) {
+      rollupPlugins.push(gzipPlugin());
+    }
   }
+
   if (isDevFn() && VITE_USE_MOCK) {
     // open mock
     vitePlugins.push(
@@ -99,14 +108,21 @@ const viteConfig: UserConfig = {
   assetsInlineLimit: 4096,
   /**
    * esbuild转换目标。
-   * @default 'es2019'
+   * @default 'es2020'
    */
-  esbuildTarget: 'es2019',
+  esbuildTarget: 'es2020',
   silent: false,
   // 别名
   alias: {
     '/@/': pathResolve('src'),
   },
+  // terser配置
+  terserOption: {
+    compress: {
+      // 是否删除console
+      drop_console: VITE_DROP_CONSOLE,
+    },
+  },
   define: {
     __VERSION__: pkg.version,
   },
@@ -128,6 +144,7 @@ const viteConfig: UserConfig = {
       'moment/locale/zh-cn',
     ],
   },
+
   // 本地跨域代理
   proxy: createProxy(VITE_PROXY),
 
@@ -140,8 +157,6 @@ const viteConfig: UserConfig = {
   },
 };
 
-// 用于打包部署站点使用。实际项目可以删除
-const isSite = process.env.SITE === 'true';
 // 扩展配置, 往打包后的html注入内容
 // 只针对生产环境
 // TODO 目前只是简单手动注入实现,后续vite应该会提供配置项
@@ -164,7 +179,8 @@ export const htmlConfig: {
   // html title
   title: VITE_GLOB_APP_TITLE,
   // 百度统计,不需要可以删除
-  addHm: isSite,
+  // 用于打包部署站点使用。实际项目可以删除
+  addHm: isSiteMode(),
   // 使用cdn打包
   // TODO Cdn esm使用方式需要只能支持google,暂时关闭,后续查询更好的方式
   useCdn: false,
@@ -179,4 +195,7 @@ export const htmlConfig: {
     minifyCSS: true,
   },
 };
-export default viteConfig;
+export default {
+  ...viteConfig,
+  transforms: [globbyTransform(viteConfig)],
+} as UserConfig;

+ 145 - 234
yarn.lock

@@ -34,7 +34,7 @@
     "@babel/runtime" "^7.10.4"
     lodash "^4.17.15"
 
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4":
   version "7.10.4"
   resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
   integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
@@ -170,7 +170,7 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.9.4":
+"@babel/parser@^7.10.4", "@babel/parser@^7.11.5":
   version "7.11.5"
   resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
   integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
@@ -460,39 +460,26 @@
   dependencies:
     "@iconify/iconify" ">=2.0.0-rc.1"
 
-"@rollup/plugin-commonjs@^14.0.0":
-  version "14.0.0"
-  resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz#4285f9ec2db686a31129e5a2b415c94aa1f836f0"
-  integrity sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==
+"@rollup/plugin-commonjs@^15.0.0":
+  version "15.1.0"
+  resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz#1e7d076c4f1b2abf7e65248570e555defc37c238"
+  integrity sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==
   dependencies:
-    "@rollup/pluginutils" "^3.0.8"
+    "@rollup/pluginutils" "^3.1.0"
     commondir "^1.0.1"
-    estree-walker "^1.0.1"
-    glob "^7.1.2"
-    is-reference "^1.1.2"
-    magic-string "^0.25.2"
-    resolve "^1.11.0"
+    estree-walker "^2.0.1"
+    glob "^7.1.6"
+    is-reference "^1.2.1"
+    magic-string "^0.25.7"
+    resolve "^1.17.0"
 
-"@rollup/plugin-json@^4.0.3":
+"@rollup/plugin-json@^4.1.0":
   version "4.1.0"
   resolved "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3"
   integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==
   dependencies:
     "@rollup/pluginutils" "^3.0.8"
 
-"@rollup/plugin-node-resolve@^8.4.0":
-  version "8.4.0"
-  resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz#261d79a680e9dc3d86761c14462f24126ba83575"
-  integrity sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==
-  dependencies:
-    "@rollup/pluginutils" "^3.1.0"
-    "@types/resolve" "1.17.1"
-    builtin-modules "^3.1.0"
-    deep-freeze "^0.0.1"
-    deepmerge "^4.2.2"
-    is-module "^1.0.0"
-    resolve "^1.17.0"
-
 "@rollup/plugin-node-resolve@^9.0.0":
   version "9.0.0"
   resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6"
@@ -700,7 +687,7 @@
     "@types/koa" "*"
     "@types/koa-send" "*"
 
-"@types/koa@*", "@types/koa@^2.11.3":
+"@types/koa@*":
   version "2.11.4"
   resolved "https://registry.npmjs.org/@types/koa/-/koa-2.11.4.tgz#8af02a069a9f8e08fa47b8da28d982e652f69cfb"
   integrity sha512-Etqs0kdqbuAsNr5k6mlZQelpZKVwMu9WPRHVVTLnceZlhr0pYmblRNJbCgoCMzKWWePldydU0AYEOX4Q9fnGUQ==
@@ -714,6 +701,20 @@
     "@types/koa-compose" "*"
     "@types/node" "*"
 
+"@types/koa@^2.11.4":
+  version "2.11.5"
+  resolved "https://registry.npmjs.org/@types/koa/-/koa-2.11.5.tgz#a2b81382bf65d72bdc3bd906abdee259fefdebc2"
+  integrity sha512-egP+ceD3+v9PnFW+DLTFO8mt6wa5sDqfGOBIwOAZ61Wzsq4bGZc5kMpJgcCwq7ARGIBfHBY+KkK/1RsMftV/qQ==
+  dependencies:
+    "@types/accepts" "*"
+    "@types/content-disposition" "*"
+    "@types/cookies" "*"
+    "@types/http-assert" "*"
+    "@types/http-errors" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
 "@types/lodash-es@^4.17.3":
   version "4.17.3"
   resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.3.tgz#87eb0b3673b076b8ee655f1890260a136af09a2d"
@@ -935,17 +936,6 @@
     "@typescript-eslint/types" "4.4.1"
     eslint-visitor-keys "^2.0.0"
 
-"@vue/compiler-core@3.0.0":
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.0.tgz#25e4f079cf6c39f83bad23700f814c619105a0f2"
-  integrity sha512-XqPC7vdv4rFE77S71oCHmT1K4Ks3WE2Gi6Lr4B5wn0Idmp+NyQQBUHsCNieMDRiEpgtJrw+yOHslrsV0AfAsfQ==
-  dependencies:
-    "@babel/parser" "^7.11.5"
-    "@babel/types" "^7.11.5"
-    "@vue/shared" "3.0.0"
-    estree-walker "^2.0.1"
-    source-map "^0.6.1"
-
 "@vue/compiler-core@3.0.1":
   version "3.0.1"
   resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.1.tgz#3ce57531078c6220be7ea458e41e4bab3522015b"
@@ -957,15 +947,7 @@
     estree-walker "^2.0.1"
     source-map "^0.6.1"
 
-"@vue/compiler-dom@3.0.0", "@vue/compiler-dom@^3.0.0-rc.5":
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.0.tgz#4cbb48fcf1f852daef2babcf9953b681ac463526"
-  integrity sha512-ukDEGOP8P7lCPyStuM3F2iD5w2QPgUu2xwCW2XNeqPjFKIlR2xMsWjy4raI/cLjN6W16GtlMFaZdK8tLj5PRog==
-  dependencies:
-    "@vue/compiler-core" "3.0.0"
-    "@vue/shared" "3.0.0"
-
-"@vue/compiler-dom@3.0.1":
+"@vue/compiler-dom@3.0.1", "@vue/compiler-dom@^3.0.0-rc.10":
   version "3.0.1"
   resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.1.tgz#00b12f2e4aa55e624e2a5257e4bed93cf7555f0b"
   integrity sha512-8cjgswVU2YmV35H9ARZmSlDr1P9VZxUihRwefkrk6Vrsb7kui5C3d/WQ2/su34FSDpyMU1aacUOiL2CV/vdX6w==
@@ -973,29 +955,7 @@
     "@vue/compiler-core" "3.0.1"
     "@vue/shared" "3.0.1"
 
-"@vue/compiler-sfc@^3.0.0-rc.5":
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.0.0.tgz#efa38037984bd64aae315828aa5c1248c6eadca9"
-  integrity sha512-1Bn4L5jNRm6tlb79YwqYUGGe+Yc9PRoRSJi67NJX6icdhf84+tRMtESbx1zCLL9QixQXu2+7aLkXHxvh4RpqAA==
-  dependencies:
-    "@babel/parser" "^7.11.5"
-    "@babel/types" "^7.11.5"
-    "@vue/compiler-core" "3.0.0"
-    "@vue/compiler-dom" "3.0.0"
-    "@vue/compiler-ssr" "3.0.0"
-    "@vue/shared" "3.0.0"
-    consolidate "^0.16.0"
-    estree-walker "^2.0.1"
-    hash-sum "^2.0.0"
-    lru-cache "^5.1.1"
-    magic-string "^0.25.7"
-    merge-source-map "^1.1.0"
-    postcss "^7.0.32"
-    postcss-modules "^3.2.2"
-    postcss-selector-parser "^6.0.2"
-    source-map "^0.6.1"
-
-"@vue/compiler-sfc@^3.0.1":
+"@vue/compiler-sfc@^3.0.0-rc.10", "@vue/compiler-sfc@^3.0.1":
   version "3.0.1"
   resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.0.1.tgz#f340f8f75b5c1c4509e0f3a12c79d1544899b663"
   integrity sha512-VO5gJ7SyHw0hf1rkKXRlxjXI9+Q4ngcuUWYnyjOSDch7Wtt2IdOEiC82KFWIkfWMpHqA5HPzL2nDmys3y9d19w==
@@ -1017,14 +977,6 @@
     postcss-selector-parser "^6.0.4"
     source-map "^0.6.1"
 
-"@vue/compiler-ssr@3.0.0":
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.0.0.tgz#d717abcd23a89fb38d1497228633a21bcf9a0e28"
-  integrity sha512-Er41F9ZFyKB3YnNbE6JSTIGCVWve3NAQimgDOk4uP42OnckxBYKGBTutDeFNeqUZBMu/9vRHYrxlGFC9Z5jBVQ==
-  dependencies:
-    "@vue/compiler-dom" "3.0.0"
-    "@vue/shared" "3.0.0"
-
 "@vue/compiler-ssr@3.0.1":
   version "3.0.1"
   resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.0.1.tgz#0455b011d72d4ed02faa93610f14981c3d44a079"
@@ -1063,15 +1015,6 @@
     "@vue/reactivity" "3.0.1"
     "@vue/shared" "3.0.1"
 
-"@vue/runtime-dom@3.0.0", "@vue/runtime-dom@^3.0.0-rc.1":
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0.tgz#e0d1f7c7e22e1318696014cc3501e06b288c2e11"
-  integrity sha512-f312n5w9gK6mVvkDSj6/Xnot1XjlKXzFBYybmoy6ahAVC8ExbQ+LOWti1IZM/adU8VMNdKaw7Q53Hxz3y5jX8g==
-  dependencies:
-    "@vue/runtime-core" "3.0.0"
-    "@vue/shared" "3.0.0"
-    csstype "^2.6.8"
-
 "@vue/runtime-dom@3.0.1":
   version "3.0.1"
   resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.1.tgz#2cc74550a635f38eb5f61f35f374d5bdb55156b0"
@@ -1081,6 +1024,15 @@
     "@vue/shared" "3.0.1"
     csstype "^2.6.8"
 
+"@vue/runtime-dom@^3.0.0-rc.1":
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.0.tgz#e0d1f7c7e22e1318696014cc3501e06b288c2e11"
+  integrity sha512-f312n5w9gK6mVvkDSj6/Xnot1XjlKXzFBYybmoy6ahAVC8ExbQ+LOWti1IZM/adU8VMNdKaw7Q53Hxz3y5jX8g==
+  dependencies:
+    "@vue/runtime-core" "3.0.0"
+    "@vue/shared" "3.0.0"
+    csstype "^2.6.8"
+
 "@vue/shared@3.0.0":
   version "3.0.0"
   resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.0.0.tgz#ec089236629ecc0f10346b92f101ff4339169f1a"
@@ -1226,7 +1178,7 @@ ant-design-vue@^2.0.0-beta.10:
     shallowequal "^1.0.2"
     warning "^4.0.0"
 
-any-promise@^1.0.0, any-promise@^1.1.0:
+any-promise@^1.1.0:
   version "1.3.0"
   resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
   integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
@@ -1644,14 +1596,6 @@ chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
-chalk@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
-  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
-  dependencies:
-    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"
@@ -1677,7 +1621,7 @@ chardet@^0.7.0:
   resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
   integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
 
-chokidar@^3.3.1, chokidar@^3.4.2:
+chokidar@^3.4.2:
   version "3.4.2"
   resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
   integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
@@ -1733,10 +1677,10 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
-cli-spinners@^2.2.0:
-  version "2.4.0"
-  resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f"
-  integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==
+cli-spinners@^2.4.0:
+  version "2.5.0"
+  resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047"
+  integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==
 
 cli-truncate@^2.1.0:
   version "2.1.0"
@@ -2290,11 +2234,6 @@ deep-equal@~1.0.1:
   resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
   integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
 
-deep-freeze@^0.0.1:
-  version "0.0.1"
-  resolved "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84"
-  integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=
-
 deep-is@^0.1.3:
   version "0.1.3"
   resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@@ -2540,12 +2479,12 @@ error-ex@^1.2.0, error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
-es-module-lexer@^0.3.18:
+es-module-lexer@^0.3.25:
   version "0.3.25"
   resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.25.tgz#24a1abcb9c5dc96923a8e42be033b801f788de06"
   integrity sha512-H9VoFD5H9zEfiOX2LeTWDwMvAbLqcAyA2PIb40TOAvGpScOjit02oTGWgIh+M0rx2eJOKyJVM9wtpKFVgnyC3A==
 
-esbuild@^0.6.10:
+esbuild@^0.6.33:
   version "0.6.34"
   resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.6.34.tgz#76565a60e006f45d5f273b6e59e61ed0816551f5"
   integrity sha512-InRdL/Q96pUucPqovJzvuLhquZr6jOn81FDVwFjCKz1rYKIm9OdOC+7Fs4vr6x48vKBl5LzKgtjU39BUpO636A==
@@ -2734,7 +2673,7 @@ esutils@^2.0.2:
   resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
-etag@^1.3.0, etag@^1.8.1:
+etag@^1.8.1:
   version "1.8.1"
   resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
   integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
@@ -2744,7 +2683,7 @@ eventemitter3@^4.0.0:
   resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
   integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
 
-execa@^4.0.1, execa@^4.0.3:
+execa@^4.0.3:
   version "4.0.3"
   resolved "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2"
   integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==
@@ -3173,7 +3112,7 @@ glob@7.1.4:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6:
+glob@^7.0.0, glob@^7.1.3, glob@^7.1.6:
   version "7.1.6"
   resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
   integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -3853,7 +3792,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
   dependencies:
     isobject "^3.0.1"
 
-is-reference@^1.1.2:
+is-reference@^1.2.1:
   version "1.2.1"
   resolved "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
   integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
@@ -3958,13 +3897,14 @@ isobject@^3.0.0, isobject@^3.0.1:
   resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
   integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
 
-jest-worker@^24.9.0:
-  version "24.9.0"
-  resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5"
-  integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==
+jest-worker@^26.2.1:
+  version "26.5.0"
+  resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz#87deee86dbbc5f98d9919e0dadf2c40e3152fa30"
+  integrity sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==
   dependencies:
+    "@types/node" "*"
     merge-stream "^2.0.0"
-    supports-color "^6.1.0"
+    supports-color "^7.0.0"
 
 joycon@^2.2.5:
   version "2.2.5"
@@ -4112,10 +4052,10 @@ koa-compose@^4.1.0:
   resolved "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
   integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==
 
-koa-conditional-get@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/koa-conditional-get/-/koa-conditional-get-2.0.0.tgz#a43f3723c1d014b730a34ece8adf30b93c8233f2"
-  integrity sha1-pD83I8HQFLcwo07Oit8wuTyCM/I=
+koa-conditional-get@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/koa-conditional-get/-/koa-conditional-get-3.0.0.tgz#552cb64a217dfb907e90b7c34f42009e441c4b8e"
+  integrity sha512-VKyPS7SuNH26TjTV2IRz+oh0HV/jc2lYAo51PTQTkj0XFn8ebNZW9riczmrW7ZVBFSnls1Z88DPUYKnvVymruA==
 
 koa-convert@^1.2.0:
   version "1.2.0"
@@ -4125,13 +4065,12 @@ koa-convert@^1.2.0:
     co "^4.6.0"
     koa-compose "^3.0.0"
 
-koa-etag@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/koa-etag/-/koa-etag-3.0.0.tgz#9ef7382ddd5a82ab0deb153415c915836f771d3f"
-  integrity sha1-nvc4Ld1agqsN6xU0FckVg293HT8=
+koa-etag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz#2c2bb7ae69ca1ac6ced09ba28dcb78523c810414"
+  integrity sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==
   dependencies:
-    etag "^1.3.0"
-    mz "^2.1.0"
+    etag "^1.8.1"
 
 koa-proxies@^0.11.0:
   version "0.11.0"
@@ -4141,7 +4080,7 @@ koa-proxies@^0.11.0:
     http-proxy "^1.16.2"
     path-match "^1.2.4"
 
-koa-send@^5.0.0:
+koa-send@^5.0.0, koa-send@^5.0.1:
   version "5.0.1"
   resolved "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79"
   integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==
@@ -4158,7 +4097,7 @@ koa-static@^5.0.0:
     debug "^3.1.0"
     koa-send "^5.0.0"
 
-koa@^2.11.0:
+koa@^2.13.0:
   version "2.13.0"
   resolved "https://registry.npmjs.org/koa/-/koa-2.13.0.tgz#25217e05efd3358a7e5ddec00f0a380c9b71b501"
   integrity sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ==
@@ -4365,13 +4304,6 @@ lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17
   resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
   integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
 
-log-symbols@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
-  integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
-  dependencies:
-    chalk "^2.4.2"
-
 log-symbols@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
@@ -4426,7 +4358,14 @@ lru-cache@^5.1.1:
   dependencies:
     yallist "^3.0.2"
 
-magic-string@^0.25.2, magic-string@^0.25.7:
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+magic-string@^0.25.7:
   version "0.25.7"
   resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
   integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
@@ -4712,15 +4651,6 @@ mute-stream@0.0.8:
   resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
-mz@^2.1.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:
   version "3.1.12"
   resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654"
@@ -4905,7 +4835,7 @@ only@~0.0.2:
   resolved "https://registry.npmjs.org/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
   integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=
 
-open@^7.0.3:
+open@^7.0.3, open@^7.2.1:
   version "7.3.0"
   resolved "https://registry.npmjs.org/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69"
   integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==
@@ -4930,16 +4860,16 @@ optionator@^0.9.1:
     type-check "^0.4.0"
     word-wrap "^1.2.3"
 
-ora@^4.0.4:
-  version "4.1.1"
-  resolved "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz#566cc0348a15c36f5f0e979612842e02ba9dddbc"
-  integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==
+ora@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz#b188cf8cd2d4d9b13fd25383bc3e5cba352c94f8"
+  integrity sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==
   dependencies:
-    chalk "^3.0.0"
+    chalk "^4.1.0"
     cli-cursor "^3.1.0"
-    cli-spinners "^2.2.0"
+    cli-spinners "^2.4.0"
     is-interactive "^1.0.0"
-    log-symbols "^3.0.0"
+    log-symbols "^4.0.0"
     mute-stream "0.0.8"
     strip-ansi "^6.0.0"
     wcwidth "^1.0.1"
@@ -5381,7 +5311,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.28, 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.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==
@@ -5778,7 +5708,7 @@ resolve-url@^0.2.1:
   resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
   integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
 
-resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.17.0, resolve@^1.3.2:
+resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2:
   version "1.17.0"
   resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
   integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@@ -5830,7 +5760,7 @@ rollup-plugin-analyzer@^3.3.0:
   resolved "https://registry.npmjs.org/rollup-plugin-analyzer/-/rollup-plugin-analyzer-3.3.0.tgz#52fb30465ae927d9c078b6ec90c578cfb9164fc2"
   integrity sha512-zUPGitW4usmZcVa0nKecRvw3odtXgnxdCben9Hx1kxVoR3demek8RU9tmRG/R35hnRPQTb7wEsYEe3GUcjxIMA==
 
-rollup-plugin-dynamic-import-variables@^1.0.1:
+rollup-plugin-dynamic-import-variables@^1.1.0:
   version "1.1.0"
   resolved "https://registry.npmjs.org/rollup-plugin-dynamic-import-variables/-/rollup-plugin-dynamic-import-variables-1.1.0.tgz#4981d38907a471b35234398a09047bef47a2006a"
   integrity sha512-C1avEmnXC8cC4aAQ5dB63O9oQf7IrhEHc98bQw9Qd6H36FxtZooLCvVfcO4SNYrqaNrzH3ErucQt/zdFSLPHNw==
@@ -5857,16 +5787,15 @@ rollup-plugin-purge-icons@^0.4.4:
     "@purge-icons/core" "^0.4.4"
     "@purge-icons/generated" "^0.4.1"
 
-rollup-plugin-terser@^5.3.0:
-  version "5.3.1"
-  resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413"
-  integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==
+rollup-plugin-terser@^7.0.2:
+  version "7.0.2"
+  resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d"
+  integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==
   dependencies:
-    "@babel/code-frame" "^7.5.5"
-    jest-worker "^24.9.0"
-    rollup-pluginutils "^2.8.2"
+    "@babel/code-frame" "^7.10.4"
+    jest-worker "^26.2.1"
     serialize-javascript "^4.0.0"
-    terser "^4.6.2"
+    terser "^5.0.0"
 
 rollup-plugin-visualizer@^4.1.1:
   version "4.1.1"
@@ -5888,7 +5817,7 @@ rollup-plugin-vue@^6.0.0-beta.10:
     hash-sum "^2.0.0"
     rollup-pluginutils "^2.8.2"
 
-rollup-plugin-web-worker-loader@^1.3.0:
+rollup-plugin-web-worker-loader@^1.3.1:
   version "1.4.0"
   resolved "https://registry.npmjs.org/rollup-plugin-web-worker-loader/-/rollup-plugin-web-worker-loader-1.4.0.tgz#b4fd711118758c2111c30e794e2f2757b75a27b8"
   integrity sha512-jhlOwSkrXkAVFY2Fded0M1AS9iqZDNjUJxNz4BFjBlaKuUzTx8Ikey+b3LSegUJE4mzAAw2DqJD8pX12R0ZdDw==
@@ -5908,7 +5837,7 @@ rollup@^0.63.4:
     "@types/estree" "0.0.39"
     "@types/node" "*"
 
-rollup@^2.20.0, rollup@^2.26.11:
+rollup@^2.26.11:
   version "2.29.0"
   resolved "https://registry.npmjs.org/rollup/-/rollup-2.29.0.tgz#0c5c5968530b21ca0e32f8b94b7cd9346cfb0eec"
   integrity sha512-gtU0sjxMpsVlpuAf4QXienPmUAhd6Kc7owQ4f5lypoxBW18fw2UNYZ4NssLGsri6WhUZkE/Ts3EMRebN+gNLiQ==
@@ -6139,7 +6068,7 @@ source-map-resolve@^0.5.0:
     source-map-url "^0.4.0"
     urix "^0.1.0"
 
-source-map-support@^0.5.17, source-map-support@~0.5.12:
+source-map-support@^0.5.17, source-map-support@~0.5.19:
   version "0.5.19"
   resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
   integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
@@ -6157,12 +6086,12 @@ source-map@^0.5.0, source-map@^0.5.6:
   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:
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0:
   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.3, source-map@~0.7.2:
   version "0.7.3"
   resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
   integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
@@ -6507,7 +6436,7 @@ supports-color@^6.1.0:
   dependencies:
     has-flag "^3.0.0"
 
-supports-color@^7.1.0:
+supports-color@^7.0.0, supports-color@^7.1.0:
   version "7.2.0"
   resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
   integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
@@ -6616,14 +6545,14 @@ tempfile@^3.0.0:
     temp-dir "^2.0.0"
     uuid "^3.3.2"
 
-terser@^4.6.2:
-  version "4.8.0"
-  resolved "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
-  integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+terser@^5.0.0:
+  version "5.3.5"
+  resolved "https://registry.npmjs.org/terser/-/terser-5.3.5.tgz#9e080baa0568f96654621b20eb9effa440b1484e"
+  integrity sha512-Qw3CZAMmmfU824AoGKalx+riwocSI5Cs0PoGp9RdSLfmxkmJgyBxqLBP/isDNtFyhHnitikvRMZzyVgeq+U+Tg==
   dependencies:
     commander "^2.20.0"
-    source-map "~0.6.1"
-    source-map-support "~0.5.12"
+    source-map "~0.7.2"
+    source-map-support "~0.5.19"
 
 text-extensions@^1.0.0:
   version "1.9.0"
@@ -6635,20 +6564,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"
@@ -7042,61 +6957,61 @@ vite-plugin-purge-icons@^0.4.4:
     "@purge-icons/generated" "^0.4.1"
     rollup-plugin-purge-icons "^0.4.4"
 
-vite@^1.0.0-rc.4:
-  version "1.0.0-rc.4"
-  resolved "https://registry.npmjs.org/vite/-/vite-1.0.0-rc.4.tgz#210106136861b231704e6381ac9eb1bcd655d4f0"
-  integrity sha512-D9gpKKaE2U0YpIxNrSn+nlFPBT0sfg68Y1EReYW8YHMhbNFcxwS7RZIa1W/8Pq6yDfVRAhbOZNijv1mLG5pCEg==
+"vite@npm:@knightly/vite":
+  version "1.0.0-knightly.202010140013"
+  resolved "https://registry.npmjs.org/@knightly/vite/-/vite-1.0.0-knightly.202010140013.tgz#8feb5926fe056538384e35c91d356675df3c3504"
+  integrity sha512-wsCJ7ISIpO2ek5/t5t8t+3EhDZu5y51tmf6P7yQKupaMw14CZ5YZY/VSeTWZfD5CIa2vaSCLf+x4fCv36Jw+kw==
   dependencies:
-    "@babel/parser" "^7.9.4"
-    "@rollup/plugin-commonjs" "^14.0.0"
-    "@rollup/plugin-json" "^4.0.3"
-    "@rollup/plugin-node-resolve" "^8.4.0"
-    "@types/koa" "^2.11.3"
+    "@babel/parser" "^7.11.5"
+    "@rollup/plugin-commonjs" "^15.0.0"
+    "@rollup/plugin-json" "^4.1.0"
+    "@rollup/plugin-node-resolve" "^9.0.0"
+    "@rollup/pluginutils" "^4.0.0"
+    "@types/koa" "^2.11.4"
     "@types/lru-cache" "^5.1.0"
-    "@vue/compiler-dom" "^3.0.0-rc.5"
-    "@vue/compiler-sfc" "^3.0.0-rc.5"
+    "@vue/compiler-dom" "^3.0.0-rc.10"
+    "@vue/compiler-sfc" "^3.0.0-rc.10"
     brotli-size "^4.0.0"
-    chalk "^4.0.0"
-    chokidar "^3.3.1"
+    chalk "^4.1.0"
+    chokidar "^3.4.2"
     clean-css "^4.2.3"
     debug "^4.1.1"
     dotenv "^8.2.0"
     dotenv-expand "^5.1.0"
-    es-module-lexer "^0.3.18"
-    esbuild "^0.6.10"
+    es-module-lexer "^0.3.25"
+    esbuild "^0.6.33"
     etag "^1.8.1"
-    execa "^4.0.1"
-    fs-extra "^9.0.0"
+    execa "^4.0.3"
+    fs-extra "^9.0.1"
     hash-sum "^2.0.0"
     isbuiltin "^1.0.0"
-    koa "^2.11.0"
-    koa-conditional-get "^2.0.0"
-    koa-etag "^3.0.0"
+    koa "^2.13.0"
+    koa-conditional-get "^3.0.0"
+    koa-etag "^4.0.0"
     koa-proxies "^0.11.0"
-    koa-send "^5.0.0"
+    koa-send "^5.0.1"
     koa-static "^5.0.0"
-    lru-cache "^5.1.1"
+    lru-cache "^6.0.0"
     magic-string "^0.25.7"
     merge-source-map "^1.1.0"
     mime-types "^2.1.27"
     minimist "^1.2.5"
-    open "^7.0.3"
-    ora "^4.0.4"
-    postcss "^7.0.28"
+    open "^7.2.1"
+    ora "^5.1.0"
+    postcss "^7.0.32"
     postcss-discard-comments "^4.0.2"
     postcss-import "^12.0.1"
     postcss-load-config "^2.1.0"
     resolve "^1.17.0"
-    rollup "^2.20.0"
-    rollup-plugin-dynamic-import-variables "^1.0.1"
-    rollup-plugin-terser "^5.3.0"
+    rollup "^2.26.11"
+    rollup-plugin-dynamic-import-variables "^1.1.0"
+    rollup-plugin-terser "^7.0.2"
     rollup-plugin-vue "^6.0.0-beta.10"
-    rollup-plugin-web-worker-loader "^1.3.0"
-    rollup-pluginutils "^2.8.2"
+    rollup-plugin-web-worker-loader "^1.3.1"
     selfsigned "^1.10.7"
     slash "^3.0.0"
-    vue "^3.0.0-rc.5"
-    ws "^7.2.3"
+    vue "^3.0.0-rc.10"
+    ws "^7.3.1"
 
 vue-eslint-parser@^7.1.0:
   version "7.1.0"
@@ -7132,16 +7047,7 @@ vue-router@^4.0.0-beta.13:
   resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.0.0-beta.13.tgz#4611d09a9e44f231cc401ecc294a7f2dcb30e6a6"
   integrity sha512-dYv9qpHPaojQlfujViiTkPkf1Bf5RCFzkCkdVFc1cENzWJYAGJanpIHiyjyKoM4u7IDFBZMItci+U4ieaEWA8A==
 
-vue@^3.0.0-rc.5:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/vue/-/vue-3.0.0.tgz#cfb5df5c34efce319b113a1667d12b74dcfd9c90"
-  integrity sha512-ZMrAARZ32sGIaYKr7Fk2GZEBh/VhulSrGxcGBiAvbN4fhjl3tuJyNFbbbLFqGjndbLoBW66I2ECq8ICdvkKdJw==
-  dependencies:
-    "@vue/compiler-dom" "3.0.0"
-    "@vue/runtime-dom" "3.0.0"
-    "@vue/shared" "3.0.0"
-
-vue@^3.0.1:
+vue@^3.0.0-rc.10, vue@^3.0.1:
   version "3.0.1"
   resolved "https://registry.npmjs.org/vue/-/vue-3.0.1.tgz#dcdabf07da37e655e23d7d22eacc18c2da5f5a16"
   integrity sha512-WBTgaQMJIWQuhlzMV6C0qvVrxyQSpx3gKwflYC0sqGKEZSxMIOYRnrIlHUN4ivUVvP7mUMxcnFTt7P+akdOkQA==
@@ -7257,7 +7163,7 @@ write@1.0.3:
   dependencies:
     mkdirp "^0.5.1"
 
-ws@^7.2.3:
+ws@^7.3.1:
   version "7.3.1"
   resolved "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
   integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
@@ -7282,6 +7188,11 @@ yallist@^3.0.2:
   resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
 
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
 yaml@^1.10.0:
   version "1.10.0"
   resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"