From 34bbb86038916a9303a57a2938a0a29727965137 Mon Sep 17 00:00:00 2001 From: haoziqaq <357229046@qq.com> Date: Tue, 10 Jan 2023 01:26:43 +0800 Subject: [PATCH 1/4] feat: support vite4 and create a new package vite-plugins (#824) --- .gitignore | 2 + .prettierignore | 2 + package.json | 4 +- packages/varlet-cli/package.json | 13 +- packages/varlet-cli/src/node/commands/lint.ts | 2 +- .../varlet-cli/src/node/config/vite.config.ts | 76 +- .../varlet-markdown-vite-plugin/package.json | 27 - .../varlet-ui-playground/auto-imports.d.ts | 1 + packages/varlet-ui-playground/package.json | 5 +- packages/varlet-ui-playground/public/logo.svg | 30 - packages/varlet-ui-playground/src/main.ts | 3 +- packages/varlet-ui-playground/vite.config.ts | 25 +- packages/varlet-vite-plugins/package.json | 42 + packages/varlet-vite-plugins/src/html.ts | 20 + packages/varlet-vite-plugins/src/index.ts | 3 + packages/varlet-vite-plugins/src/inlineCss.ts | 41 + .../src/markdown.ts} | 42 +- packages/varlet-vite-plugins/tsconfig.json | 7 + pnpm-lock.yaml | 979 +++++++++++------- scripts/bootstrap.mjs | 11 +- scripts/build.mjs | 3 + scripts/publish.mjs | 11 +- 22 files changed, 833 insertions(+), 516 deletions(-) delete mode 100644 packages/varlet-markdown-vite-plugin/package.json create mode 100644 packages/varlet-vite-plugins/package.json create mode 100644 packages/varlet-vite-plugins/src/html.ts create mode 100644 packages/varlet-vite-plugins/src/index.ts create mode 100644 packages/varlet-vite-plugins/src/inlineCss.ts rename packages/{varlet-markdown-vite-plugin/index.js => varlet-vite-plugins/src/markdown.ts} (81%) create mode 100644 packages/varlet-vite-plugins/tsconfig.json diff --git a/.gitignore b/.gitignore index 3ba23570ead..2ca1f31116f 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ packages/varlet-cli/site/site.config.json packages/varlet-cli/site/*.site.config.json packages/varlet-cli/lib/node/bin.d.ts +packages/varlet-vite-plugins/lib + packages/varlet-ui/site packages/varlet-ui/lib packages/varlet-ui/es diff --git a/.prettierignore b/.prettierignore index b3c8578e797..4bce6bf29c7 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,6 +2,8 @@ packages/varlet-cli/lib/** packages/varlet-cli/site/** packages/varlet-cli/template/** +packages/varlet-vite-plugins/lib/** + packages/varlet-icons/dist/** packages/varlet-ui/es/** diff --git a/package.json b/package.json index 6f39ad4af05..6a940726ecd 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "packages/varlet-cli/template/**", "packages/varlet-cli/client.js", "packages/varlet-cli/client.d.ts", + "packages/varlet-vite-plugins/lib/**", "packages/varlet-vscode-extension/dist/**", "packages/varlet-ui/lib/**", "packages/varlet-ui/es/**", @@ -56,6 +57,7 @@ "packages/varlet-cli/template/**", "packages/varlet-cli/client.js", "packages/varlet-cli/client.d.ts", + "packages/varlet-vite-plugins/lib/**", "packages/varlet-icons/dist/**", "packages/varlet-ui/lib/**", "packages/varlet-ui/es/**", @@ -87,4 +89,4 @@ "engines": { "pnpm": ">=7.9" } -} \ No newline at end of file +} diff --git a/packages/varlet-cli/package.json b/packages/varlet-cli/package.json index 0d649c9bf7f..194538ec0f5 100644 --- a/packages/varlet-cli/package.json +++ b/packages/varlet-cli/package.json @@ -39,15 +39,15 @@ "build": "tsc" }, "dependencies": { + "@varlet/vite-plugins": "workspace:*", + "@varlet/shared": "workspace:*", "@babel/core": "^7.14.8", "@babel/helper-plugin-utils": "^7.14.5", "@babel/preset-env": "^7.14.8", "@babel/preset-typescript": "^7.14.5", "@types/inquirer": "^9.0.2", - "@varlet/markdown-vite-plugin": "workspace:*", - "@varlet/shared": "workspace:*", - "@vitejs/plugin-vue": "3.0.1", - "@vitejs/plugin-vue-jsx": "2.0.0", + "@vitejs/plugin-vue": "4.0.0", + "@vitejs/plugin-vue-jsx": "3.0.0", "@vue/babel-plugin-jsx": "1.1.1", "@vue/compiler-sfc": "3.2.25", "@vue/runtime-core": "3.2.25", @@ -70,8 +70,7 @@ "slash": "^3.0.0", "ts-jest": "^26.5.1", "typescript": "^4.4.4", - "vite": "3.0.4", - "vite-plugin-html": "^2.1.0", + "vite": "4.0.4", "vue": "3.2.25", "vue-jest": "^5.0.0-alpha.8" }, @@ -98,4 +97,4 @@ "vue": "3.2.25", "vue-router": "4.0.12" } -} \ No newline at end of file +} diff --git a/packages/varlet-cli/src/node/commands/lint.ts b/packages/varlet-cli/src/node/commands/lint.ts index 8742a225278..22d057773a1 100644 --- a/packages/varlet-cli/src/node/commands/lint.ts +++ b/packages/varlet-cli/src/node/commands/lint.ts @@ -26,7 +26,7 @@ export async function lint() { './packages/varlet-cli/src', './packages/varlet-ui/src', './packages/varlet-icons/lib', - './packages/varlet-markdown-vite-plugin', + './packages/varlet-vite-plugins/src', './packages/varlet-touch-emulator', './packages/varlet-vscode-extension/src', ] diff --git a/packages/varlet-cli/src/node/config/vite.config.ts b/packages/varlet-cli/src/node/config/vite.config.ts index 8a14f4f7486..54a31450b4b 100644 --- a/packages/varlet-cli/src/node/config/vite.config.ts +++ b/packages/varlet-cli/src/node/config/vite.config.ts @@ -1,10 +1,9 @@ +import fse from 'fs-extra' import vue from '@vitejs/plugin-vue' -import md from '@varlet/markdown-vite-plugin' import jsx from '@vitejs/plugin-vue-jsx' -import fse from 'fs-extra' -import { injectHtml } from 'vite-plugin-html' +import { markdown, html, inlineCss } from '@varlet/vite-plugins' +import { kebabCase } from '@varlet/shared' import { - CWD, ES_DIR, LIB_DIR, SITE_CONFIG, @@ -16,13 +15,12 @@ import { UMD_DIR, VITE_RESOLVE_EXTENSIONS, } from '../shared/constant.js' -import { InlineConfig, PluginOption } from 'vite' +import { InlineConfig } from 'vite' import { get } from 'lodash-es' -import { kebabCase } from '@varlet/shared' import { resolve } from 'path' import { VarletConfig } from './varlet.config' -const { copyFileSync, pathExistsSync, readFileSync, removeSync, writeFileSync } = fse +const { copyFileSync, removeSync } = fse export function getDevConfig(varletConfig: Required): InlineConfig { const defaultLanguage = get(varletConfig, 'defaultLanguage') @@ -33,6 +31,7 @@ export function getDevConfig(varletConfig: Required): InlineConfig resolve: { extensions: VITE_RESOLVE_EXTENSIONS, + alias: { '@config': SITE_CONFIG, '@pc-routes': SITE_PC_ROUTES, @@ -51,14 +50,17 @@ export function getDevConfig(varletConfig: Required): InlineConfig vue({ include: [/\.vue$/, /\.md$/], }), - md({ style: get(varletConfig, 'highlight.style') }), + jsx(), - injectHtml({ + + markdown({ style: get(varletConfig, 'highlight.style') }), + + html({ data: { - pcTitle: get(varletConfig, `pc.title['${defaultLanguage}']`), - mobileTitle: get(varletConfig, `mobile.title['${defaultLanguage}']`), logo: get(varletConfig, `logo`), baidu: get(varletConfig, `analysis.baidu`, ''), + pcTitle: get(varletConfig, `pc.title['${defaultLanguage}']`), + mobileTitle: get(varletConfig, `mobile.title['${defaultLanguage}']`), }, }), ], @@ -88,39 +90,6 @@ export function getBuildConfig(varletConfig: Required): InlineConf } } -function inlineCSS(fileName: string, dir: string): PluginOption { - return { - name: 'varlet-inline-css-vite-plugin', - apply: 'build', - closeBundle() { - const cssFile = resolve(dir, 'style.css') - if (!pathExistsSync(cssFile)) { - return - } - - const jsFile = resolve(dir, fileName) - const cssCode = readFileSync(cssFile, 'utf-8') - const jsCode = readFileSync(jsFile, 'utf-8') - const injectCode = `;(function(){var style=document.createElement('style');style.type='text/css';\ -style.rel='stylesheet';style.appendChild(document.createTextNode(\`${cssCode.replace(/\\/g, '\\\\')}\`));\ -var head=document.querySelector('head');head.appendChild(style)})();` - writeFileSync(jsFile, `${injectCode}${jsCode}`) - copyFileSync(cssFile, resolve(LIB_DIR, 'style.css')) - removeSync(cssFile) - }, - } -} - -function clear(): PluginOption { - return { - name: 'varlet-clear-vite-plugin', - apply: 'build', - closeBundle() { - removeSync(resolve(CWD, 'dist')) - }, - } -} - export function getESMBundleConfig(varletConfig: Required): InlineConfig { const name = get(varletConfig, 'name') const fileName = `${kebabCase(name)}.esm.js` @@ -129,7 +98,8 @@ export function getESMBundleConfig(varletConfig: Required): Inline logLevel: 'silent', build: { - emptyOutDir: true, + emptyOutDir: false, + copyPublicDir: false, lib: { name, formats: ['es'], @@ -147,20 +117,21 @@ export function getESMBundleConfig(varletConfig: Required): Inline }, }, }, - - plugins: [clear()], } } export function getUMDConfig(varletConfig: Required): InlineConfig { const name = get(varletConfig, 'name') const fileName = `${kebabCase(name)}.js` + const jsFile = resolve(UMD_DIR, fileName) + const cssFile = resolve(UMD_DIR, 'style.css') return { logLevel: 'silent', build: { emptyOutDir: true, + copyPublicDir: false, lib: { name, formats: ['umd'], @@ -179,6 +150,15 @@ export function getUMDConfig(varletConfig: Required): InlineConfig }, }, - plugins: [inlineCSS(fileName, UMD_DIR), clear()], + plugins: [ + inlineCss({ + jsFile, + cssFile, + onEnd() { + copyFileSync(cssFile, resolve(LIB_DIR, 'style.css')) + removeSync(cssFile) + }, + }), + ], } } diff --git a/packages/varlet-markdown-vite-plugin/package.json b/packages/varlet-markdown-vite-plugin/package.json deleted file mode 100644 index 76724449540..00000000000 --- a/packages/varlet-markdown-vite-plugin/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@varlet/markdown-vite-plugin", - "version": "2.5.6", - "type": "module", - "description": "markdown vite plugin of varlet", - "main": "index.js", - "module": "index.js", - "keywords": [ - "vite", - "plugin", - "varlet" - ], - "author": "haoziqaq <357229046@qq.com>", - "homepage": "https://github.com/varletjs/varlet#readme", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/varletjs/varlet.git" - }, - "bugs": { - "url": "https://github.com/varletjs/varlet/issues" - }, - "dependencies": { - "highlight.js": "^10.7.2", - "markdown-it": "^12.0.2" - } -} \ No newline at end of file diff --git a/packages/varlet-ui-playground/auto-imports.d.ts b/packages/varlet-ui-playground/auto-imports.d.ts index 57c23e047a6..43121b7459a 100644 --- a/packages/varlet-ui-playground/auto-imports.d.ts +++ b/packages/varlet-ui-playground/auto-imports.d.ts @@ -2,6 +2,7 @@ export {} declare global { const Dialog: typeof import('@varlet/ui')['Dialog'] + const Locale: typeof import('@varlet/ui')['Locale'] const Snackbar: typeof import('@varlet/ui')['Snackbar'] const StyleProvider: typeof import('@varlet/ui')['StyleProvider'] } diff --git a/packages/varlet-ui-playground/package.json b/packages/varlet-ui-playground/package.json index 7e022564b32..2a56f19c2d3 100644 --- a/packages/varlet-ui-playground/package.json +++ b/packages/varlet-ui-playground/package.json @@ -27,12 +27,13 @@ } }, "devDependencies": { + "@varlet/cli": "workspace: *", + "vite": "^4.0.4", "@types/file-saver": "^2.0.5", "@types/node": "*", - "@varlet/cli": "workspace: *", "live-server": "^1.2.1", "typescript": "^4.4.4", "unplugin-auto-import": "^0.12.1", "unplugin-vue-components": "^0.22.12" } -} \ No newline at end of file +} diff --git a/packages/varlet-ui-playground/public/logo.svg b/packages/varlet-ui-playground/public/logo.svg index 393832802f6..e69de29bb2d 100644 --- a/packages/varlet-ui-playground/public/logo.svg +++ b/packages/varlet-ui-playground/public/logo.svg @@ -1,30 +0,0 @@ - - - 编组 2备份 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/varlet-ui-playground/src/main.ts b/packages/varlet-ui-playground/src/main.ts index dbacd388e41..bc487721a6d 100644 --- a/packages/varlet-ui-playground/src/main.ts +++ b/packages/varlet-ui-playground/src/main.ts @@ -1,6 +1,5 @@ -import { createApp } from 'vue' -import { Locale } from '@varlet/ui' import '@vue/repl/style.css' +import { createApp } from 'vue' import App from './App.vue' Locale.add('en-US', Locale.enUS) diff --git a/packages/varlet-ui-playground/vite.config.ts b/packages/varlet-ui-playground/vite.config.ts index b225a2ab656..18ec56a090e 100644 --- a/packages/varlet-ui-playground/vite.config.ts +++ b/packages/varlet-ui-playground/vite.config.ts @@ -3,15 +3,17 @@ import components from 'unplugin-vue-components/vite' import autoImport from 'unplugin-auto-import/vite' import { resolve } from 'path' import { VarletUIResolver } from 'unplugin-vue-components/resolvers' +import { defineConfig, Plugin } from 'vite' const varletESMBundleFile = resolve(__dirname, '../varlet-ui/es/varlet.esm.js') const varletTouchEmulatorFile = resolve(__dirname, '../varlet-touch-emulator/index.js') const varletCSSFile = resolve(__dirname, '../varlet-ui/es/style.css') const varletArea = resolve(__dirname, '../varlet-ui/json/area.json') -function copyVarletDependencies() { +function copyVarletDependencies(): Plugin { return { name: 'copy-varlet-dependencies', + buildStart() { fs.copyFileSync(varletESMBundleFile, resolve('public/varlet.esm.js')) fs.copyFileSync(varletTouchEmulatorFile, resolve('public/varlet-touch-emulator.js')) @@ -21,8 +23,18 @@ function copyVarletDependencies() { } } -export default { +export default defineConfig({ base: './', + + server: { + host: '0.0.0.0', + port: 3000, + }, + + build: { + outDir: 'site', + }, + plugins: [ copyVarletDependencies(), components({ @@ -32,11 +44,4 @@ export default { resolvers: [VarletUIResolver({ autoImport: true })], }), ], - server: { - host: '0.0.0.0', - port: 3000, - }, - build: { - outDir: 'site', - }, -} +}) diff --git a/packages/varlet-vite-plugins/package.json b/packages/varlet-vite-plugins/package.json new file mode 100644 index 00000000000..cec4a27aee1 --- /dev/null +++ b/packages/varlet-vite-plugins/package.json @@ -0,0 +1,42 @@ +{ + "name": "@varlet/vite-plugins", + "version": "2.5.6", + "type": "module", + "description": "vite plugins of varlet", + "main": "lib/index.js", + "module": "lib/index.js", + "keywords": [ + "vite", + "plugins", + "varlet" + ], + "author": "haoziqaq <357229046@qq.com>", + "homepage": "https://github.com/varletjs/varlet#readme", + "license": "MIT", + "scripts": { + "dev": "tsc --watch", + "build": "tsc" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/varletjs/varlet.git" + }, + "bugs": { + "url": "https://github.com/varletjs/varlet/issues" + }, + "dependencies": { + "@varlet/shared": "workspace:*", + "ejs": "^3.1.8", + "fs-extra": "^9.0.1", + "highlight.js": "^10.7.2", + "markdown-it": "^12.2.3" + }, + "devDependencies": { + "vite": "^4.0.4", + "typescript": "^4.4.4", + "@types/node": "^18.7.20", + "@types/ejs": "^3.1.1", + "@types/markdown-it": "^12.2.3", + "@types/fs-extra": "^9.0.2" + } +} diff --git a/packages/varlet-vite-plugins/src/html.ts b/packages/varlet-vite-plugins/src/html.ts new file mode 100644 index 00000000000..ce3838331ff --- /dev/null +++ b/packages/varlet-vite-plugins/src/html.ts @@ -0,0 +1,20 @@ +import ejs from 'ejs' +import type { Plugin } from 'vite' + +export interface HtmlOptions { + data?: Record +} + +export function html(options: HtmlOptions): Plugin { + return { + name: 'vite-plugin-varlet-html', + + transformIndexHtml: { + order: 'pre', + + transform(html) { + return ejs.render(html, options.data) + }, + }, + } +} diff --git a/packages/varlet-vite-plugins/src/index.ts b/packages/varlet-vite-plugins/src/index.ts new file mode 100644 index 00000000000..36f6cd66f9e --- /dev/null +++ b/packages/varlet-vite-plugins/src/index.ts @@ -0,0 +1,3 @@ +export * from './markdown.js' +export * from './html.js' +export * from './inlineCss.js' diff --git a/packages/varlet-vite-plugins/src/inlineCss.ts b/packages/varlet-vite-plugins/src/inlineCss.ts new file mode 100644 index 00000000000..97ed894e94a --- /dev/null +++ b/packages/varlet-vite-plugins/src/inlineCss.ts @@ -0,0 +1,41 @@ +import type { Plugin } from 'vite' +import fse from 'fs-extra' + +const { pathExistsSync, writeFileSync, readFileSync } = fse + +export interface InlineCssOptions { + cssFile: string + jsFile: string + onEnd?(): void +} + +export function inlineCss(options: InlineCssOptions): Plugin { + return { + name: 'vite-plugin-varlet-inline-css', + + apply: 'build', + + closeBundle() { + const { cssFile, jsFile, onEnd } = options + + if (!pathExistsSync(cssFile)) { + this.error('css file cannot found') + return + } + + if (!pathExistsSync(jsFile)) { + this.error('js file cannot found') + return + } + + const cssCode = readFileSync(cssFile, 'utf-8') + const jsCode = readFileSync(jsFile, 'utf-8') + const injectCode = `;(function(){var style=document.createElement('style');style.type='text/css';\ +style.rel='stylesheet';style.appendChild(document.createTextNode(\`${cssCode.replace(/\\/g, '\\\\')}\`));\ +var head=document.querySelector('head');head.appendChild(style)})();` + + writeFileSync(jsFile, `${injectCode}${jsCode}`) + onEnd?.() + }, + } +} diff --git a/packages/varlet-markdown-vite-plugin/index.js b/packages/varlet-vite-plugins/src/markdown.ts similarity index 81% rename from packages/varlet-markdown-vite-plugin/index.js rename to packages/varlet-vite-plugins/src/markdown.ts index 315abc829d3..944ae167cbd 100644 --- a/packages/varlet-markdown-vite-plugin/index.js +++ b/packages/varlet-vite-plugins/src/markdown.ts @@ -1,30 +1,29 @@ -import markdown from 'markdown-it' +import markdownIt from 'markdown-it' import hljs from 'highlight.js' +import { kebabCase } from '@varlet/shared' +import type { Plugin } from 'vite' -function kebabCase(key) { - const ret = key.replace(/([A-Z])/g, ' $1').trim() - return ret.split(' ').join('-').toLowerCase() -} - -function htmlWrapper(html) { +function htmlWrapper(html: string) { const hGroup = html.replace(/

(fragment.includes('${fragment}` : fragment)) .join('') + return cardGroup.replace(//g, '') } -function extractComponents(source) { +function extractComponents(source: string) { const componentRE = /import (.+) from ['"].+['"]/ const importRE = /import .+ from ['"].+['"]/g const vueRE = /```vue((.|\r|\n)*?)```/g - const imports = [] - const components = [] + const imports: string[] = [] + const components: string[] = [] source = source.replace(vueRE, (_, p1) => { const partImports = p1.match(importRE) - const partComponents = partImports?.map((importer) => { + const partComponents = partImports?.map((importer: string) => { importer = importer.replace(/(\n|\r)/g, '') const component = importer.replace(componentRE, '$1') !imports.includes(importer) && imports.push(importer) @@ -43,7 +42,7 @@ function extractComponents(source) { } } -function injectCodeExample(source) { +function injectCodeExample(source: string) { const codeRE = /(
(.|\r|\n)*?<\/pre>)/g
 
   return source.replace(codeRE, (str) => {
@@ -63,7 +62,7 @@ function injectCodeExample(source) {
   })
 }
 
-function highlight(str, lang, style) {
+function highlight(str: string, lang: string, style?: string) {
   let link = ''
 
   if (style) {
@@ -82,9 +81,9 @@ function highlight(str, lang, style) {
   return ''
 }
 
-function markdownToVue(source, options) {
+function markdownToVue(source: string, options: MarkdownOptions) {
   const { source: vueSource, imports, components } = extractComponents(source)
-  const md = markdown({
+  const md = markdownIt({
     html: true,
     highlight: (str, lang) => highlight(str, lang, options.style),
   })
@@ -107,10 +106,16 @@ export default {
   `
 }
 
-export default function VarletMarkdownVitePlugin(options) {
+export interface MarkdownOptions {
+  style?: string
+}
+
+export function markdown(options: MarkdownOptions): Plugin {
   return {
-    name: 'varlet-markdown-vite-plugin',
+    name: 'vite-plugin-varlet-markdown',
+
     enforce: 'pre',
+
     transform(source, id) {
       if (!/\.md$/.test(id)) {
         return
@@ -118,11 +123,12 @@ export default function VarletMarkdownVitePlugin(options) {
 
       try {
         return markdownToVue(source, options)
-      } catch (e) {
+      } catch (e: any) {
         this.error(e)
         return ''
       }
     },
+
     async handleHotUpdate(ctx) {
       if (!/\.md$/.test(ctx.file)) return
 
diff --git a/packages/varlet-vite-plugins/tsconfig.json b/packages/varlet-vite-plugins/tsconfig.json
new file mode 100644
index 00000000000..040770d8e7e
--- /dev/null
+++ b/packages/varlet-vite-plugins/tsconfig.json
@@ -0,0 +1,7 @@
+{
+  "extends": "../../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "./lib"
+  },
+  "include": ["src/**/*"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2c083ecb2d7..f0cc8e4ae6f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -46,11 +46,11 @@ importers:
       '@types/node': ^18.7.20
       '@types/semver': ^7.3.9
       '@varlet/icons': workspace:*
-      '@varlet/markdown-vite-plugin': workspace:*
       '@varlet/shared': workspace:*
       '@varlet/touch-emulator': workspace:*
-      '@vitejs/plugin-vue': 3.0.1
-      '@vitejs/plugin-vue-jsx': 2.0.0
+      '@varlet/vite-plugins': workspace:*
+      '@vitejs/plugin-vue': 4.0.0
+      '@vitejs/plugin-vue-jsx': 3.0.0
       '@vue/babel-plugin-jsx': 1.1.1
       '@vue/compiler-sfc': 3.2.25
       '@vue/runtime-core': 3.2.25
@@ -76,8 +76,7 @@ importers:
       slash: ^3.0.0
       ts-jest: ^26.5.1
       typescript: ^4.4.4
-      vite: 3.0.4
-      vite-plugin-html: ^2.1.0
+      vite: 4.0.4
       vue: 3.2.25
       vue-jest: ^5.0.0-alpha.8
       vue-router: 4.0.12
@@ -87,10 +86,10 @@ importers:
       '@babel/preset-env': 7.18.10_@babel+core@7.18.10
       '@babel/preset-typescript': 7.18.6_@babel+core@7.18.10
       '@types/inquirer': 9.0.2
-      '@varlet/markdown-vite-plugin': link:../varlet-markdown-vite-plugin
       '@varlet/shared': link:../varlet-shared
-      '@vitejs/plugin-vue': 3.0.1_vite@3.0.4+vue@3.2.25
-      '@vitejs/plugin-vue-jsx': 2.0.0_vite@3.0.4+vue@3.2.25
+      '@varlet/vite-plugins': link:../varlet-vite-plugins
+      '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.25
+      '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.0.4+vue@3.2.25
       '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.18.10
       '@vue/compiler-sfc': 3.2.25
       '@vue/runtime-core': 3.2.25
@@ -116,8 +115,7 @@ importers:
       slash: 3.0.0
       ts-jest: 26.5.6_rnfpnlbz3wqspag7uftsmccrvy
       typescript: 4.7.4
-      vite: 3.0.4_less@3.13.1
-      vite-plugin-html: 2.1.2_vite@3.0.4
+      vite: 4.0.4_ddabosvllpsfqtxj354v4r5yke
       vue: 3.2.25
       vue-jest: 5.0.0-alpha.10_uayt3xpdn3f2bpkonpo42bhaku
       vue-router: 4.0.12_vue@3.2.25
@@ -162,14 +160,6 @@ importers:
     devDependencies:
       '@types/node': 18.7.20
 
-  packages/varlet-markdown-vite-plugin:
-    specifiers:
-      highlight.js: ^10.7.2
-      markdown-it: ^12.0.2
-    dependencies:
-      highlight.js: 10.7.3
-      markdown-it: 12.3.2
-
   packages/varlet-shared:
     specifiers:
       typescript: ^4.4.4
@@ -243,6 +233,7 @@ importers:
       typescript: ^4.4.4
       unplugin-auto-import: ^0.12.1
       unplugin-vue-components: ^0.22.12
+      vite: ^4.0.4
       vue: 3.2.29
     dependencies:
       '@varlet/ui': link:../varlet-ui
@@ -258,6 +249,34 @@ importers:
       typescript: 4.7.4
       unplugin-auto-import: 0.12.1
       unplugin-vue-components: 0.22.12_vue@3.2.29
+      vite: 4.0.4_@types+node@18.7.6
+
+  packages/varlet-vite-plugins:
+    specifiers:
+      '@types/ejs': ^3.1.1
+      '@types/fs-extra': ^9.0.2
+      '@types/markdown-it': ^12.2.3
+      '@types/node': ^18.7.20
+      '@varlet/shared': workspace:*
+      ejs: ^3.1.8
+      fs-extra: ^9.0.1
+      highlight.js: ^10.7.2
+      markdown-it: ^12.2.3
+      typescript: ^4.4.4
+      vite: ^4.0.4
+    dependencies:
+      '@varlet/shared': link:../varlet-shared
+      ejs: 3.1.8
+      fs-extra: 9.1.0
+      highlight.js: 10.7.3
+      markdown-it: 12.3.2
+    devDependencies:
+      '@types/ejs': 3.1.1
+      '@types/fs-extra': 9.0.13
+      '@types/markdown-it': 12.2.3
+      '@types/node': 18.7.20
+      typescript: 4.7.4
+      vite: 4.0.4_@types+node@18.7.20
 
   packages/varlet-vscode-extension:
     specifiers:
@@ -309,6 +328,11 @@ packages:
     resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==}
     engines: {node: '>=6.9.0'}
 
+  /@babel/compat-data/7.20.10:
+    resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==}
+    engines: {node: '>=6.9.0'}
+    dev: false
+
   /@babel/core/7.18.10:
     resolution: {integrity: sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==}
     engines: {node: '>=6.9.0'}
@@ -331,6 +355,29 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@babel/core/7.20.12:
+    resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@ampproject/remapping': 2.2.0
+      '@babel/code-frame': 7.18.6
+      '@babel/generator': 7.20.7
+      '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12
+      '@babel/helper-module-transforms': 7.20.11
+      '@babel/helpers': 7.20.7
+      '@babel/parser': 7.20.7
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.20.12
+      '@babel/types': 7.20.7
+      convert-source-map: 1.8.0
+      debug: 4.3.4
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@babel/generator/7.18.12:
     resolution: {integrity: sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==}
     engines: {node: '>=6.9.0'}
@@ -339,6 +386,15 @@ packages:
       '@jridgewell/gen-mapping': 0.3.2
       jsesc: 2.5.2
 
+  /@babel/generator/7.20.7:
+    resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.20.7
+      '@jridgewell/gen-mapping': 0.3.2
+      jsesc: 2.5.2
+    dev: false
+
   /@babel/helper-annotate-as-pure/7.18.6:
     resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
     engines: {node: '>=6.9.0'}
@@ -366,6 +422,20 @@ packages:
       browserslist: 4.21.3
       semver: 6.3.0
 
+  /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12:
+    resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/compat-data': 7.20.10
+      '@babel/core': 7.20.12
+      '@babel/helper-validator-option': 7.18.6
+      browserslist: 4.21.3
+      lru-cache: 5.1.1
+      semver: 6.3.0
+    dev: false
+
   /@babel/helper-create-class-features-plugin/7.18.9_@babel+core@7.18.10:
     resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==}
     engines: {node: '>=6.9.0'}
@@ -384,6 +454,25 @@ packages:
       - supports-color
     dev: false
 
+  /@babel/helper-create-class-features-plugin/7.20.12_@babel+core@7.20.12:
+    resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.20.12
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-environment-visitor': 7.18.9
+      '@babel/helper-function-name': 7.19.0
+      '@babel/helper-member-expression-to-functions': 7.20.7
+      '@babel/helper-optimise-call-expression': 7.18.6
+      '@babel/helper-replace-supers': 7.20.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
+      '@babel/helper-split-export-declaration': 7.18.6
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.18.10:
     resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==}
     engines: {node: '>=6.9.0'}
@@ -429,6 +518,14 @@ packages:
       '@babel/template': 7.18.10
       '@babel/types': 7.18.10
 
+  /@babel/helper-function-name/7.19.0:
+    resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/template': 7.18.10
+      '@babel/types': 7.20.7
+    dev: false
+
   /@babel/helper-hoist-variables/7.18.6:
     resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
     engines: {node: '>=6.9.0'}
@@ -442,6 +539,13 @@ packages:
       '@babel/types': 7.18.10
     dev: false
 
+  /@babel/helper-member-expression-to-functions/7.20.7:
+    resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.20.7
+    dev: false
+
   /@babel/helper-module-imports/7.18.6:
     resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
     engines: {node: '>=6.9.0'}
@@ -463,6 +567,22 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@babel/helper-module-transforms/7.20.11:
+    resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-environment-visitor': 7.18.9
+      '@babel/helper-module-imports': 7.18.6
+      '@babel/helper-simple-access': 7.20.2
+      '@babel/helper-split-export-declaration': 7.18.6
+      '@babel/helper-validator-identifier': 7.19.1
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.20.12
+      '@babel/types': 7.20.7
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@babel/helper-optimise-call-expression/7.18.6:
     resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
     engines: {node: '>=6.9.0'}
@@ -475,6 +595,11 @@ packages:
     engines: {node: '>=6.9.0'}
     dev: false
 
+  /@babel/helper-plugin-utils/7.20.2:
+    resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
+    engines: {node: '>=6.9.0'}
+    dev: false
+
   /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.18.10:
     resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==}
     engines: {node: '>=6.9.0'}
@@ -503,12 +628,33 @@ packages:
       - supports-color
     dev: false
 
+  /@babel/helper-replace-supers/7.20.7:
+    resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-environment-visitor': 7.18.9
+      '@babel/helper-member-expression-to-functions': 7.20.7
+      '@babel/helper-optimise-call-expression': 7.18.6
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.20.12
+      '@babel/types': 7.20.7
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@babel/helper-simple-access/7.18.6:
     resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/types': 7.18.10
 
+  /@babel/helper-simple-access/7.20.2:
+    resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.20.7
+    dev: false
+
   /@babel/helper-skip-transparent-expression-wrappers/7.18.9:
     resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==}
     engines: {node: '>=6.9.0'}
@@ -516,6 +662,13 @@ packages:
       '@babel/types': 7.18.10
     dev: false
 
+  /@babel/helper-skip-transparent-expression-wrappers/7.20.0:
+    resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.20.7
+    dev: false
+
   /@babel/helper-split-export-declaration/7.18.6:
     resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
     engines: {node: '>=6.9.0'}
@@ -526,10 +679,20 @@ packages:
     resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==}
     engines: {node: '>=6.9.0'}
 
+  /@babel/helper-string-parser/7.19.4:
+    resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
+    engines: {node: '>=6.9.0'}
+    dev: false
+
   /@babel/helper-validator-identifier/7.18.6:
     resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
     engines: {node: '>=6.9.0'}
 
+  /@babel/helper-validator-identifier/7.19.1:
+    resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+    engines: {node: '>=6.9.0'}
+    dev: false
+
   /@babel/helper-validator-option/7.18.6:
     resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
     engines: {node: '>=6.9.0'}
@@ -556,6 +719,17 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@babel/helpers/7.20.7:
+    resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/template': 7.20.7
+      '@babel/traverse': 7.20.12
+      '@babel/types': 7.20.7
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@babel/highlight/7.18.6:
     resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
     engines: {node: '>=6.9.0'}
@@ -571,6 +745,14 @@ packages:
     dependencies:
       '@babel/types': 7.18.10
 
+  /@babel/parser/7.20.7:
+    resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+    dependencies:
+      '@babel/types': 7.20.7
+    dev: false
+
   /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.18.10:
     resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
     engines: {node: '>=6.9.0'}
@@ -870,6 +1052,16 @@ packages:
       '@babel/helper-plugin-utils': 7.18.9
     dev: false
 
+  /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12:
+    resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.20.12
+      '@babel/helper-plugin-utils': 7.18.9
+    dev: false
+
   /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.10:
     resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
     peerDependencies:
@@ -954,6 +1146,16 @@ packages:
       '@babel/helper-plugin-utils': 7.18.9
     dev: false
 
+  /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.12:
+    resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.20.12
+      '@babel/helper-plugin-utils': 7.20.2
+    dev: false
+
   /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.18.10:
     resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==}
     engines: {node: '>=6.9.0'}
@@ -1309,6 +1511,20 @@ packages:
       - supports-color
     dev: false
 
+  /@babel/plugin-transform-typescript/7.20.7_@babel+core@7.20.12:
+    resolution: {integrity: sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.20.12
+      '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12
+      '@babel/helper-plugin-utils': 7.20.2
+      '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.12
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.18.10:
     resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==}
     engines: {node: '>=6.9.0'}
@@ -1458,6 +1674,15 @@ packages:
       '@babel/parser': 7.18.11
       '@babel/types': 7.18.10
 
+  /@babel/template/7.20.7:
+    resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/code-frame': 7.18.6
+      '@babel/parser': 7.20.7
+      '@babel/types': 7.20.7
+    dev: false
+
   /@babel/traverse/7.18.11:
     resolution: {integrity: sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==}
     engines: {node: '>=6.9.0'}
@@ -1475,6 +1700,24 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@babel/traverse/7.20.12:
+    resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/code-frame': 7.18.6
+      '@babel/generator': 7.20.7
+      '@babel/helper-environment-visitor': 7.18.9
+      '@babel/helper-function-name': 7.19.0
+      '@babel/helper-hoist-variables': 7.18.6
+      '@babel/helper-split-export-declaration': 7.18.6
+      '@babel/parser': 7.20.7
+      '@babel/types': 7.20.7
+      debug: 4.3.4
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@babel/types/7.18.10:
     resolution: {integrity: sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==}
     engines: {node: '>=6.9.0'}
@@ -1483,6 +1726,15 @@ packages:
       '@babel/helper-validator-identifier': 7.18.6
       to-fast-properties: 2.0.0
 
+  /@babel/types/7.20.7:
+    resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-string-parser': 7.19.4
+      '@babel/helper-validator-identifier': 7.19.1
+      to-fast-properties: 2.0.0
+    dev: false
+
   /@bcoe/v8-coverage/0.2.3:
     resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
     dev: false
@@ -1501,13 +1753,180 @@ packages:
     engines: {node: '>=10.0.0'}
     dev: true
 
-  /@esbuild/linux-loong64/0.14.54:
-    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
+  /@esbuild/android-arm/0.16.16:
+    resolution: {integrity: sha512-BUuWMlt4WSXod1HSl7aGK8fJOsi+Tab/M0IDK1V1/GstzoOpqc/v3DqmN8MkuapPKQ9Br1WtLAN4uEgWR8x64A==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/android-arm64/0.16.16:
+    resolution: {integrity: sha512-hFHVAzUKp9Tf8psGq+bDVv+6hTy1bAOoV/jJMUWwhUnIHsh6WbFMhw0ZTkqDuh7TdpffFoHOiIOIxmHc7oYRBQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/android-x64/0.16.16:
+    resolution: {integrity: sha512-9WhxJpeb6XumlfivldxqmkJepEcELekmSw3NkGrs+Edq6sS5KRxtUBQuKYDD7KqP59dDkxVbaoPIQFKWQG0KLg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/darwin-arm64/0.16.16:
+    resolution: {integrity: sha512-8Z+wld+vr/prHPi2O0X7o1zQOfMbXWGAw9hT0jEyU/l/Yrg+0Z3FO9pjPho72dVkZs4ewZk0bDOFLdZHm8jEfw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/darwin-x64/0.16.16:
+    resolution: {integrity: sha512-CYkxVvkZzGCqFrt7EgjFxQKhlUPyDkuR9P0Y5wEcmJqVI8ncerOIY5Kej52MhZyzOBXkYrJgZeVZC9xXXoEg9A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/freebsd-arm64/0.16.16:
+    resolution: {integrity: sha512-fxrw4BYqQ39z/3Ja9xj/a1gMsVq0xEjhSyI4a9MjfvDDD8fUV8IYliac96i7tzZc3+VytyXX+XNsnpEk5sw5Wg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/freebsd-x64/0.16.16:
+    resolution: {integrity: sha512-8p3v1D+du2jiDvSoNVimHhj7leSfST9YlKsAEO7etBfuqjaBMndo0fmjNLp0JCMld+XIx9L80tooOkyUv1a1PQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-arm/0.16.16:
+    resolution: {integrity: sha512-bYaocE1/PTMRmkgSckZ0D0Xn2nox8v2qlk+MVVqm+VECNKDdZvghVZtH41dNtBbwADSvA6qkCHGYeWm9LrNCBw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-arm64/0.16.16:
+    resolution: {integrity: sha512-N3u6BBbCVY3xeP2D8Db7QY8I+nZ+2AgOopUIqk+5yCoLnsWkcVxD2ay5E9iIdvApFi1Vg1lZiiwaVp8bOpAc4A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-ia32/0.16.16:
+    resolution: {integrity: sha512-dxjqLKUW8GqGemoRT9v8IgHk+T4tRm1rn1gUcArsp26W9EkK/27VSjBVUXhEG5NInHZ92JaQ3SSMdTwv/r9a2A==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-loong64/0.16.16:
+    resolution: {integrity: sha512-MdUFggHjRiCCwNE9+1AibewoNq6wf94GLB9Q9aXwl+a75UlRmbRK3h6WJyrSGA6ZstDJgaD2wiTSP7tQNUYxwA==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
     requiresBuild: true
-    dev: false
+    optional: true
+
+  /@esbuild/linux-mips64el/0.16.16:
+    resolution: {integrity: sha512-CO3YmO7jYMlGqGoeFeKzdwx/bx8Vtq/SZaMAi+ZLDUnDUdfC7GmGwXzIwDJ70Sg+P9pAemjJyJ1icKJ9R3q/Fg==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-ppc64/0.16.16:
+    resolution: {integrity: sha512-DSl5Czh5hCy/7azX0Wl9IdzPHX2H8clC6G87tBnZnzUpNgRxPFhfmArbaHoAysu4JfqCqbB/33u/GL9dUgCBAw==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-riscv64/0.16.16:
+    resolution: {integrity: sha512-sSVVMEXsqf1fQu0j7kkhXMViroixU5XoaJXl1u/u+jbXvvhhCt9YvA/B6VM3aM/77HuRQ94neS5bcisijGnKFQ==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-s390x/0.16.16:
+    resolution: {integrity: sha512-jRqBCre9gZGoCdCN/UWCCMwCMsOg65IpY9Pyj56mKCF5zXy9d60kkNRdDN6YXGjr3rzcC4DXnS/kQVCGcC4yPQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/linux-x64/0.16.16:
+    resolution: {integrity: sha512-G1+09TopOzo59/55lk5Q0UokghYLyHTKKzD5lXsAOOlGDbieGEFJpJBr3BLDbf7cz89KX04sBeExAR/pL/26sA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/netbsd-x64/0.16.16:
+    resolution: {integrity: sha512-xwjGJB5wwDEujLaJIrSMRqWkbigALpBNcsF9SqszoNKc+wY4kPTdKrSxiY5ik3IatojePP+WV108MvF6q6np4w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/openbsd-x64/0.16.16:
+    resolution: {integrity: sha512-yeERkoxG2nR2oxO5n+Ms7MsCeNk23zrby2GXCqnfCpPp7KNc0vxaaacIxb21wPMfXXRhGBrNP4YLIupUBrWdlg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/sunos-x64/0.16.16:
+    resolution: {integrity: sha512-nHfbEym0IObXPhtX6Va3H5GaKBty2kdhlAhKmyCj9u255ktAj0b1YACUs9j5H88NRn9cJCthD1Ik/k9wn8YKVg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/win32-arm64/0.16.16:
+    resolution: {integrity: sha512-pdD+M1ZOFy4hE15ZyPX09fd5g4DqbbL1wXGY90YmleVS6Y5YlraW4BvHjim/X/4yuCpTsAFvsT4Nca2lbyDH/A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/win32-ia32/0.16.16:
+    resolution: {integrity: sha512-IPEMfU9p0c3Vb8PqxaPX6BM9rYwlTZGYOf9u+kMdhoILZkVKEjq6PKZO0lB+isojWwAnAqh4ZxshD96njTXajg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    optional: true
+
+  /@esbuild/win32-x64/0.16.16:
+    resolution: {integrity: sha512-1YYpoJ39WV/2bnShPwgdzJklc+XS0bysN6Tpnt1cWPdeoKOG4RMEY1g7i534QxXX/rPvNx/NLJQTTCeORYzipg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
     optional: true
 
   /@eslint/eslintrc/0.4.3:
@@ -1774,6 +2193,7 @@ packages:
     dependencies:
       '@jridgewell/gen-mapping': 0.3.2
       '@jridgewell/trace-mapping': 0.3.15
+    dev: true
 
   /@jridgewell/sourcemap-codec/1.4.14:
     resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
@@ -1819,14 +2239,6 @@ packages:
     resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==}
     dev: false
 
-  /@rollup/pluginutils/4.2.1:
-    resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
-    engines: {node: '>= 8.0.0'}
-    dependencies:
-      estree-walker: 2.0.2
-      picomatch: 2.3.1
-    dev: false
-
   /@rollup/pluginutils/5.0.2:
     resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
     engines: {node: '>=14.0.0'}
@@ -1995,6 +2407,10 @@ packages:
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
     dev: false
 
+  /@types/linkify-it/3.0.2:
+    resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==}
+    dev: true
+
   /@types/lodash-es/4.17.6:
     resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==}
     dependencies:
@@ -2005,11 +2421,22 @@ packages:
     resolution: {integrity: sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==}
     dev: true
 
+  /@types/markdown-it/12.2.3:
+    resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
+    dependencies:
+      '@types/linkify-it': 3.0.2
+      '@types/mdurl': 1.0.2
+    dev: true
+
   /@types/mdast/3.0.10:
     resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==}
     dependencies:
       '@types/unist': 2.0.6
 
+  /@types/mdurl/1.0.2:
+    resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
+    dev: true
+
   /@types/minimatch/3.0.5:
     resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==}
 
@@ -2184,31 +2611,30 @@ packages:
       eslint-visitor-keys: 2.1.0
     dev: false
 
-  /@vitejs/plugin-vue-jsx/2.0.0_vite@3.0.4+vue@3.2.25:
-    resolution: {integrity: sha512-WF9ApZ/ivyyW3volQfu0Td0KNPhcccYEaRNzNY1NxRLVJQLSX0nFqquv3e2g7MF74p1XZK4bGtDL2y5i5O5+1A==}
-    engines: {node: '>=14.18.0'}
+  /@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.4+vue@3.2.25:
+    resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==}
+    engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
-      vite: ^3.0.0
+      vite: ^4.0.0
       vue: ^3.0.0
     dependencies:
-      '@babel/core': 7.18.10
-      '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.18.10
-      '@babel/plugin-transform-typescript': 7.18.12_@babel+core@7.18.10
-      '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.18.10
-      vite: 3.0.4_less@3.13.1
+      '@babel/core': 7.20.12
+      '@babel/plugin-transform-typescript': 7.20.7_@babel+core@7.20.12
+      '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.20.12
+      vite: 4.0.4_ddabosvllpsfqtxj354v4r5yke
       vue: 3.2.25
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@vitejs/plugin-vue/3.0.1_vite@3.0.4+vue@3.2.25:
-    resolution: {integrity: sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==}
+  /@vitejs/plugin-vue/4.0.0_vite@4.0.4+vue@3.2.25:
+    resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
-      vite: ^3.0.0
+      vite: ^4.0.0
       vue: ^3.2.25
     dependencies:
-      vite: 3.0.4_less@3.13.1
+      vite: 4.0.4_ddabosvllpsfqtxj354v4r5yke
       vue: 3.2.25
     dev: false
 
@@ -2233,6 +2659,23 @@ packages:
       - supports-color
     dev: false
 
+  /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.12:
+    resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==}
+    dependencies:
+      '@babel/helper-module-imports': 7.18.6
+      '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12
+      '@babel/template': 7.18.10
+      '@babel/traverse': 7.18.11
+      '@babel/types': 7.18.10
+      '@vue/babel-helper-vue-transform-on': 1.0.2
+      camelcase: 6.3.0
+      html-tags: 3.2.0
+      svg-tags: 1.0.0
+    transitivePeerDependencies:
+      - '@babel/core'
+      - supports-color
+    dev: false
+
   /@vue/compiler-core/3.2.25:
     resolution: {integrity: sha512-FlffKezIqztTCTyG0klkYRwhdyL6b1PTTCIerPb4p2R9qQaczccTX5g9ysi9w6tpLQ48a1WiXnFDJhWD7XoqwA==}
     dependencies:
@@ -3181,13 +3624,6 @@ packages:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     engines: {node: '>=6'}
 
-  /camel-case/4.1.2:
-    resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
-    dependencies:
-      pascal-case: 3.1.2
-      tslib: 2.4.0
-    dev: false
-
   /camelcase-keys/4.2.0:
     resolution: {integrity: sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==}
     engines: {node: '>=4'}
@@ -3351,13 +3787,6 @@ packages:
       isobject: 3.0.1
       static-extend: 0.1.2
 
-  /clean-css/5.3.1:
-    resolution: {integrity: sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==}
-    engines: {node: '>= 10.0'}
-    dependencies:
-      source-map: 0.6.1
-    dev: false
-
   /clean-stack/2.2.0:
     resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
     engines: {node: '>=6'}
@@ -3485,6 +3914,7 @@ packages:
 
   /commander/2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+    dev: true
 
   /commander/4.1.1:
     resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
@@ -4057,15 +4487,8 @@ packages:
     dependencies:
       dom-serializer: 2.0.0
       domelementtype: 2.3.0
-      domhandler: 5.0.3
-    dev: true
-
-  /dot-case/3.0.4:
-    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.4.0
-    dev: false
+      domhandler: 5.0.3
+    dev: true
 
   /dot-prop/5.3.0:
     resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
@@ -4074,15 +4497,6 @@ packages:
       is-obj: 2.0.0
     dev: false
 
-  /dotenv-expand/5.1.0:
-    resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==}
-    dev: false
-
-  /dotenv/10.0.0:
-    resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==}
-    engines: {node: '>=10'}
-    dev: false
-
   /duplexer/0.1.2:
     resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
 
@@ -4233,214 +4647,34 @@ packages:
       is-symbol: 1.0.4
     dev: false
 
-  /esbuild-android-64/0.14.54:
-    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-android-arm64/0.14.54:
-    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-darwin-64/0.14.54:
-    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-darwin-arm64/0.14.54:
-    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-freebsd-64/0.14.54:
-    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-freebsd-arm64/0.14.54:
-    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-32/0.14.54:
-    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-64/0.14.54:
-    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-arm/0.14.54:
-    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-arm64/0.14.54:
-    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-mips64le/0.14.54:
-    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-ppc64le/0.14.54:
-    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-riscv64/0.14.54:
-    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-linux-s390x/0.14.54:
-    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-netbsd-64/0.14.54:
-    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-openbsd-64/0.14.54:
-    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-sunos-64/0.14.54:
-    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-windows-32/0.14.54:
-    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-windows-64/0.14.54:
-    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild-windows-arm64/0.14.54:
-    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /esbuild/0.14.54:
-    resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
+  /esbuild/0.16.16:
+    resolution: {integrity: sha512-24JyKq10KXM5EBIgPotYIJ2fInNWVVqflv3gicIyQqfmUqi4HvDW1VR790cBgLJHCl96Syy7lhoz7tLFcmuRmg==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/linux-loong64': 0.14.54
-      esbuild-android-64: 0.14.54
-      esbuild-android-arm64: 0.14.54
-      esbuild-darwin-64: 0.14.54
-      esbuild-darwin-arm64: 0.14.54
-      esbuild-freebsd-64: 0.14.54
-      esbuild-freebsd-arm64: 0.14.54
-      esbuild-linux-32: 0.14.54
-      esbuild-linux-64: 0.14.54
-      esbuild-linux-arm: 0.14.54
-      esbuild-linux-arm64: 0.14.54
-      esbuild-linux-mips64le: 0.14.54
-      esbuild-linux-ppc64le: 0.14.54
-      esbuild-linux-riscv64: 0.14.54
-      esbuild-linux-s390x: 0.14.54
-      esbuild-netbsd-64: 0.14.54
-      esbuild-openbsd-64: 0.14.54
-      esbuild-sunos-64: 0.14.54
-      esbuild-windows-32: 0.14.54
-      esbuild-windows-64: 0.14.54
-      esbuild-windows-arm64: 0.14.54
-    dev: false
+      '@esbuild/android-arm': 0.16.16
+      '@esbuild/android-arm64': 0.16.16
+      '@esbuild/android-x64': 0.16.16
+      '@esbuild/darwin-arm64': 0.16.16
+      '@esbuild/darwin-x64': 0.16.16
+      '@esbuild/freebsd-arm64': 0.16.16
+      '@esbuild/freebsd-x64': 0.16.16
+      '@esbuild/linux-arm': 0.16.16
+      '@esbuild/linux-arm64': 0.16.16
+      '@esbuild/linux-ia32': 0.16.16
+      '@esbuild/linux-loong64': 0.16.16
+      '@esbuild/linux-mips64el': 0.16.16
+      '@esbuild/linux-ppc64': 0.16.16
+      '@esbuild/linux-riscv64': 0.16.16
+      '@esbuild/linux-s390x': 0.16.16
+      '@esbuild/linux-x64': 0.16.16
+      '@esbuild/netbsd-x64': 0.16.16
+      '@esbuild/openbsd-x64': 0.16.16
+      '@esbuild/sunos-x64': 0.16.16
+      '@esbuild/win32-arm64': 0.16.16
+      '@esbuild/win32-ia32': 0.16.16
+      '@esbuild/win32-x64': 0.16.16
 
   /escalade/3.1.1:
     resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
@@ -4982,7 +5216,7 @@ packages:
   /filelist/1.0.4:
     resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
     dependencies:
-      minimatch: 5.1.0
+      minimatch: 5.1.2
     dev: false
 
   /fill-range/4.0.0:
@@ -5068,15 +5302,6 @@ packages:
     resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
     dev: true
 
-  /fs-extra/10.1.0:
-    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
-    engines: {node: '>=12'}
-    dependencies:
-      graceful-fs: 4.2.10
-      jsonfile: 6.1.0
-      universalify: 2.0.0
-    dev: false
-
   /fs-extra/7.0.1:
     resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
     engines: {node: '>=6 <7 || >=8'}
@@ -5441,11 +5666,6 @@ packages:
     resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==}
     dev: false
 
-  /he/1.2.0:
-    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
-    hasBin: true
-    dev: false
-
   /highlight.js/10.7.3:
     resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
     dev: false
@@ -5470,20 +5690,6 @@ packages:
     resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
     dev: false
 
-  /html-minifier-terser/6.1.0:
-    resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
-    engines: {node: '>=12'}
-    hasBin: true
-    dependencies:
-      camel-case: 4.1.2
-      clean-css: 5.3.1
-      commander: 8.3.0
-      he: 1.2.0
-      param-case: 3.0.4
-      relateurl: 0.2.7
-      terser: 5.14.2
-    dev: false
-
   /html-tags/3.2.0:
     resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==}
     engines: {node: '>=8'}
@@ -6623,6 +6829,12 @@ packages:
     engines: {node: '>=6'}
     hasBin: true
 
+  /json5/2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+    dev: false
+
   /jsonc-parser/3.2.0:
     resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
     dev: true
@@ -6904,10 +7116,10 @@ packages:
       signal-exit: 3.0.7
     dev: false
 
-  /lower-case/2.0.2:
-    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+  /lru-cache/5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
     dependencies:
-      tslib: 2.4.0
+      yallist: 3.1.1
     dev: false
 
   /lru-cache/6.0.0:
@@ -7158,19 +7370,11 @@ packages:
     dependencies:
       brace-expansion: 1.1.11
 
-  /minimatch/5.1.0:
-    resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==}
-    engines: {node: '>=10'}
-    dependencies:
-      brace-expansion: 2.0.1
-    dev: false
-
   /minimatch/5.1.2:
     resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==}
     engines: {node: '>=10'}
     dependencies:
       brace-expansion: 2.0.1
-    dev: true
 
   /minimist-options/3.0.2:
     resolution: {integrity: sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==}
@@ -7304,13 +7508,6 @@ packages:
     resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
     dev: false
 
-  /no-case/3.0.4:
-    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
-    dependencies:
-      lower-case: 2.0.2
-      tslib: 2.4.0
-    dev: false
-
   /node-abi/3.24.0:
     resolution: {integrity: sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==}
     engines: {node: '>=10'}
@@ -7623,13 +7820,6 @@ packages:
     resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
     dev: false
 
-  /param-case/3.0.4:
-    resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
-    dependencies:
-      dot-case: 3.0.4
-      tslib: 2.4.0
-    dev: false
-
   /parent-module/1.0.1:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
@@ -7690,13 +7880,6 @@ packages:
     resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
     engines: {node: '>= 0.8'}
 
-  /pascal-case/3.1.2:
-    resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.4.0
-    dev: false
-
   /pascalcase/0.1.1:
     resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
     engines: {node: '>=0.10.0'}
@@ -7905,6 +8088,14 @@ packages:
       picocolors: 1.0.0
       source-map-js: 1.0.2
 
+  /postcss/8.4.21:
+    resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.4
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+
   /prebuild-install/7.1.1:
     resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==}
     engines: {node: '>=10'}
@@ -8206,11 +8397,6 @@ packages:
       jsesc: 0.5.0
     dev: false
 
-  /relateurl/0.2.7:
-    resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
-    engines: {node: '>= 0.10'}
-    dev: false
-
   /remark-parse/9.0.0:
     resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==}
     dependencies:
@@ -8324,13 +8510,12 @@ packages:
     dependencies:
       glob: 7.2.3
 
-  /rollup/2.78.1:
-    resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==}
-    engines: {node: '>=10.0.0'}
+  /rollup/3.9.1:
+    resolution: {integrity: sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w==}
+    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
       fsevents: 2.3.2
-    dev: false
 
   /rsvp/4.8.5:
     resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==}
@@ -9130,6 +9315,7 @@ packages:
       acorn: 8.8.0
       commander: 2.20.3
       source-map-support: 0.5.21
+    dev: true
 
   /test-exclude/6.0.0:
     resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
@@ -9701,44 +9887,105 @@ packages:
       unist-util-stringify-position: 2.0.3
       vfile-message: 2.0.4
 
-  /vite-plugin-html/2.1.2_vite@3.0.4:
-    resolution: {integrity: sha512-7HXkL6n7M2qDEaUV4Vnz8yM2glW4gV36d5HSBIM5gOoAG1PkuQb4Vv9FTPgPiQxq4sPRf/6IgABX0MeLVW+CyQ==}
+  /vite/4.0.4_@types+node@18.7.20:
+    resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
     peerDependencies:
-      vite: '>=2.0.0'
+      '@types/node': '>= 14'
+      less: '*'
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
     dependencies:
-      '@rollup/pluginutils': 4.2.1
-      dotenv: 10.0.0
-      dotenv-expand: 5.1.0
-      ejs: 3.1.8
-      fs-extra: 10.1.0
-      html-minifier-terser: 6.1.0
-      vite: 3.0.4_less@3.13.1
-    dev: false
+      '@types/node': 18.7.20
+      esbuild: 0.16.16
+      postcss: 8.4.21
+      resolve: 1.22.1
+      rollup: 3.9.1
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: true
+
+  /vite/4.0.4_@types+node@18.7.6:
+    resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': '>= 14'
+      less: '*'
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      '@types/node': 18.7.6
+      esbuild: 0.16.16
+      postcss: 8.4.21
+      resolve: 1.22.1
+      rollup: 3.9.1
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: true
 
-  /vite/3.0.4_less@3.13.1:
-    resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==}
+  /vite/4.0.4_ddabosvllpsfqtxj354v4r5yke:
+    resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
     engines: {node: ^14.18.0 || >=16.0.0}
     hasBin: true
     peerDependencies:
+      '@types/node': '>= 14'
       less: '*'
       sass: '*'
       stylus: '*'
+      sugarss: '*'
       terser: ^5.4.0
     peerDependenciesMeta:
+      '@types/node':
+        optional: true
       less:
         optional: true
       sass:
         optional: true
       stylus:
         optional: true
+      sugarss:
+        optional: true
       terser:
         optional: true
     dependencies:
-      esbuild: 0.14.54
+      '@types/node': 18.7.20
+      esbuild: 0.16.16
       less: 3.13.1
-      postcss: 8.4.16
+      postcss: 8.4.21
       resolve: 1.22.1
-      rollup: 2.78.1
+      rollup: 3.9.1
     optionalDependencies:
       fsevents: 2.3.2
     dev: false
@@ -10174,6 +10421,10 @@ packages:
     engines: {node: '>=10'}
     dev: false
 
+  /yallist/3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+    dev: false
+
   /yallist/4.0.0:
     resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
 
diff --git a/scripts/bootstrap.mjs b/scripts/bootstrap.mjs
index 1515e82baa5..60572b43e23 100644
--- a/scripts/bootstrap.mjs
+++ b/scripts/bootstrap.mjs
@@ -1,6 +1,11 @@
-import { buildCli, buildIcons, buildShared, buildUI, runTask } from './build.mjs'
-;(async () => {
+import { buildCli, buildIcons, buildShared, buildUI, buildVitePlugins, runTask } from './build.mjs'
+
+(async () => {
   await runTask('shared', buildShared)
-  await Promise.all([runTask('cli', buildCli), runTask('icons', buildIcons)])
+  await Promise.all([
+    runTask('cli', buildCli),
+    runTask('vite plugins', buildVitePlugins),
+    runTask('icons', buildIcons)
+  ])
   await runTask('ui', buildUI)
 })()
diff --git a/scripts/build.mjs b/scripts/build.mjs
index d8981f5974a..bcb9c9bc492 100644
--- a/scripts/build.mjs
+++ b/scripts/build.mjs
@@ -4,12 +4,15 @@ import { resolve } from 'path'
 
 const CWD = process.cwd()
 const PKG_CLI = resolve(CWD, './packages/varlet-cli')
+const PKG_VITE_PLUGINS = resolve(CWD, './packages/varlet-vite-plugins')
 const PKG_ICONS = resolve(CWD, './packages/varlet-icons')
 const PKG_UI = resolve(CWD, './packages/varlet-ui')
 const PKG_SHARED = resolve(CWD, './packages/varlet-shared')
 
 export const buildCli = () => execa('pnpm', ['build'], { cwd: PKG_CLI })
 
+export const buildVitePlugins = () => execa('pnpm', ['build'], { cwd: PKG_VITE_PLUGINS })
+
 export const buildShared = () => execa('pnpm', ['build'], { cwd: PKG_SHARED })
 
 export const buildIcons = () => execa('pnpm', ['build'], { cwd: PKG_ICONS })
diff --git a/scripts/publish.mjs b/scripts/publish.mjs
index d5fe7e4343d..a10ba49aff2 100644
--- a/scripts/publish.mjs
+++ b/scripts/publish.mjs
@@ -1,6 +1,11 @@
-import { buildCli, buildIcons, buildShared, buildUI, runTask } from './build.mjs'
-;(async () => {
+import { buildCli, buildIcons, buildShared, buildUI, buildVitePlugins, runTask } from './build.mjs'
+
+(async () => {
   await runTask('shared', buildShared)
-  await Promise.all([runTask('cli', buildCli), runTask('icons', buildIcons)])
+  await Promise.all([
+    runTask('cli', buildCli),
+    runTask('vite plugins', buildVitePlugins),
+    runTask('icons', buildIcons)
+  ])
   await runTask('ui', () => buildUI(false))
 })()

From 42212ea4d1d6b5d0f1698ae4fec102ff235cd9c7 Mon Sep 17 00:00:00 2001
From: haoziqaq <357229046@qq.com>
Date: Tue, 10 Jan 2023 01:40:57 +0800
Subject: [PATCH 2/4] chore: clean

---
 packages/varlet-cli/package.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/packages/varlet-cli/package.json b/packages/varlet-cli/package.json
index 194538ec0f5..f507586847f 100644
--- a/packages/varlet-cli/package.json
+++ b/packages/varlet-cli/package.json
@@ -45,7 +45,6 @@
     "@babel/helper-plugin-utils": "^7.14.5",
     "@babel/preset-env": "^7.14.8",
     "@babel/preset-typescript": "^7.14.5",
-    "@types/inquirer": "^9.0.2",
     "@vitejs/plugin-vue": "4.0.0",
     "@vitejs/plugin-vue-jsx": "3.0.0",
     "@vue/babel-plugin-jsx": "1.1.1",
@@ -75,6 +74,8 @@
     "vue-jest": "^5.0.0-alpha.8"
   },
   "devDependencies": {
+    "@varlet/icons": "workspace:*",
+    "@varlet/touch-emulator": "workspace:*",
     "@types/babel__core": "^7.1.12",
     "@types/ejs": "^3.1.1",
     "@types/fs-extra": "^9.0.2",
@@ -83,8 +84,7 @@
     "@types/lodash-es": "^4.17.5",
     "@types/node": "^18.7.20",
     "@types/semver": "^7.3.9",
-    "@varlet/icons": "workspace:*",
-    "@varlet/touch-emulator": "workspace:*"
+    "@types/inquirer": "^9.0.2"
   },
   "peerDependencies": {
     "@varlet/icons": "workspace:*",

From c19e385b980a6ec22a805745ce745f3784d00cd3 Mon Sep 17 00:00:00 2001
From: BeADre 
Date: Tue, 10 Jan 2023 22:55:28 +0800
Subject: [PATCH 3/4] chore: playground logo

---
 packages/varlet-ui-playground/public/logo.svg | 30 +++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/packages/varlet-ui-playground/public/logo.svg b/packages/varlet-ui-playground/public/logo.svg
index e69de29bb2d..835db067921 100644
--- a/packages/varlet-ui-playground/public/logo.svg
+++ b/packages/varlet-ui-playground/public/logo.svg
@@ -0,0 +1,30 @@
+
+
+    编组 2备份 4
+    
+        
+            
+            
+        
+        
+            
+            
+        
+        
+            
+            
+        
+        
+            
+            
+        
+    
+    
+        
+            
+            
+            
+            
+        
+    
+
\ No newline at end of file

From 16cecef6c6a33fbc042040b19b7aeacd4ec9eb3d Mon Sep 17 00:00:00 2001
From: haoziqaq <357229046@qq.com>
Date: Tue, 10 Jan 2023 23:07:11 +0800
Subject: [PATCH 4/4] v2.6.0

---
 CHANGELOG.md                                  | 9 +++++++++
 package.json                                  | 4 ++--
 packages/varlet-cli/package.json              | 4 ++--
 packages/varlet-eslint-config/package.json    | 2 +-
 packages/varlet-icons/package.json            | 2 +-
 packages/varlet-shared/package.json           | 2 +-
 packages/varlet-stylelint-config/package.json | 2 +-
 packages/varlet-touch-emulator/package.json   | 2 +-
 packages/varlet-ui-playground/package.json    | 4 ++--
 packages/varlet-ui/package.json               | 2 +-
 packages/varlet-vite-plugins/package.json     | 4 ++--
 packages/varlet-vscode-extension/package.json | 2 +-
 12 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e62d4a1fdc3..2d4eabb8390 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+# [2.6.0](https://github.com/varletjs/varlet/compare/v2.5.6...v2.6.0) (2023-01-10)
+
+
+### Features
+
+* support vite4 and create a new package vite-plugins ([#824](https://github.com/varletjs/varlet/issues/824)) ([34bbb86](https://github.com/varletjs/varlet/commit/34bbb86038916a9303a57a2938a0a29727965137))
+
+
+
 ## [2.5.6](https://github.com/varletjs/varlet/compare/v2.5.5...v2.5.6) (2023-01-07)
 
 
diff --git a/package.json b/package.json
index 6a940726ecd..e8c08fa6e48 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "private": true,
-  "version": "2.5.6",
+  "version": "2.6.0",
   "scripts": {
     "preinstall": "npx only-allow pnpm",
     "postinstall": "simple-git-hooks",
@@ -89,4 +89,4 @@
   "engines": {
     "pnpm": ">=7.9"
   }
-}
+}
\ No newline at end of file
diff --git a/packages/varlet-cli/package.json b/packages/varlet-cli/package.json
index f507586847f..6eed458442c 100644
--- a/packages/varlet-cli/package.json
+++ b/packages/varlet-cli/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/cli",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "type": "module",
   "description": "cli of varlet",
   "bin": {
@@ -97,4 +97,4 @@
     "vue": "3.2.25",
     "vue-router": "4.0.12"
   }
-}
+}
\ No newline at end of file
diff --git a/packages/varlet-eslint-config/package.json b/packages/varlet-eslint-config/package.json
index 11e35755797..226a2e0b379 100644
--- a/packages/varlet-eslint-config/package.json
+++ b/packages/varlet-eslint-config/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/eslint-config",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "description": "eslint config of varlet",
   "keywords": [
     "eslint",
diff --git a/packages/varlet-icons/package.json b/packages/varlet-icons/package.json
index 0739de3e89b..a522706a7a5 100644
--- a/packages/varlet-icons/package.json
+++ b/packages/varlet-icons/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/icons",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "description": "Icons of varlet",
   "type": "module",
   "main": "dist/index.js",
diff --git a/packages/varlet-shared/package.json b/packages/varlet-shared/package.json
index 4a0dd00440d..24275bafe95 100644
--- a/packages/varlet-shared/package.json
+++ b/packages/varlet-shared/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/shared",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "type": "module",
   "main": "lib/index.js",
   "module": "lib/index.js",
diff --git a/packages/varlet-stylelint-config/package.json b/packages/varlet-stylelint-config/package.json
index 759767b0438..5890fb26d6e 100644
--- a/packages/varlet-stylelint-config/package.json
+++ b/packages/varlet-stylelint-config/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/stylelint-config",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "description": "stylelint config of varlet",
   "keywords": [
     "stylelint",
diff --git a/packages/varlet-touch-emulator/package.json b/packages/varlet-touch-emulator/package.json
index c3f279d0f52..c6fde299835 100644
--- a/packages/varlet-touch-emulator/package.json
+++ b/packages/varlet-touch-emulator/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/touch-emulator",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "description": "touch-emulator",
   "keywords": [
     "emulator",
diff --git a/packages/varlet-ui-playground/package.json b/packages/varlet-ui-playground/package.json
index 2a56f19c2d3..51f248b79ae 100644
--- a/packages/varlet-ui-playground/package.json
+++ b/packages/varlet-ui-playground/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@varlet/ui-playground",
   "private": true,
-  "version": "2.5.6",
+  "version": "2.6.0",
   "description": "varlet ui playground",
   "keywords": [
     "varlet ui",
@@ -36,4 +36,4 @@
     "unplugin-auto-import": "^0.12.1",
     "unplugin-vue-components": "^0.22.12"
   }
-}
+}
\ No newline at end of file
diff --git a/packages/varlet-ui/package.json b/packages/varlet-ui/package.json
index 1dd1cba29f1..a68ca00c58b 100644
--- a/packages/varlet-ui/package.json
+++ b/packages/varlet-ui/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/ui",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "description": "A material like components library",
   "module": "es/index.js",
   "main": "lib/index.js",
diff --git a/packages/varlet-vite-plugins/package.json b/packages/varlet-vite-plugins/package.json
index cec4a27aee1..d31a84af1a3 100644
--- a/packages/varlet-vite-plugins/package.json
+++ b/packages/varlet-vite-plugins/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@varlet/vite-plugins",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "type": "module",
   "description": "vite plugins of varlet",
   "main": "lib/index.js",
@@ -39,4 +39,4 @@
     "@types/markdown-it": "^12.2.3",
     "@types/fs-extra": "^9.0.2"
   }
-}
+}
\ No newline at end of file
diff --git a/packages/varlet-vscode-extension/package.json b/packages/varlet-vscode-extension/package.json
index fa4f7bdaafe..06323375ae5 100644
--- a/packages/varlet-vscode-extension/package.json
+++ b/packages/varlet-vscode-extension/package.json
@@ -5,7 +5,7 @@
   "icon": "src/icon.png",
   "description": "varlet extension for vscode",
   "publisher": "haoziqaq",
-  "version": "2.5.6",
+  "version": "2.6.0",
   "engines": {
     "vscode": "^1.56.0"
   },