bianjiang 1 jaar geleden
bovenliggende
commit
ad91a96709

+ 4 - 3
package.json

@@ -19,10 +19,11 @@
     "@types/quill": "^2.0.10",
     "@types/rollup-plugin-css-only": "^3.1.0",
     "@vitejs/plugin-vue-jsx": "^3.0.1",
+    "@wangeditor/editor": "^5.1.23",
     "ant-design-vue": "^3.2.19",
-    "axios": "^1.4.0",   
+    "axios": "^1.4.0",
     "less": "^4.1.3",
-    "less-loader": "^11.1.0",   
+    "less-loader": "^11.1.0",
     "pinia": "^2.0.36",
     "quill": "^1.3.7",
     "quill-better-table": "^1.2.10",
@@ -30,7 +31,7 @@
     "swiper": "^9.2.4",
     "unplugin-vue-components": "^0.24.1",
     "vite-plugin-windicss": "^1.8.10",
-    "vue": "^3.2.47",   
+    "vue": "^3.2.47",
     "vue-router": "^4.1.6",
     "vue-types": "^5.0.2",
     "windicss": "^3.5.6"

+ 23 - 21
src/controllers/UploadController.ts

@@ -1,5 +1,6 @@
 import { set } from "lodash";
-
+import loading from "@/components/Provider/Loading";
+import { message } from "ant-design-vue";
 export class UploadController {
   request: any;
   blobURLMaps = new Map<string, any>();
@@ -42,13 +43,7 @@ export class UploadController {
       fileInput.click();
     });
   }
-  async uploadBlobImages(
-    data: object,
-    options?: {
-      onProgress?: () => void;
-    }
-  ) {
-    const { onProgress } = options || {};
+  async uploadBlobImages(data: object) {
     const todoMap = new Map<string, string>();
     addBlobToList(data);
     const todoList = todoMap.entries();
@@ -60,9 +55,8 @@ export class UploadController {
       const file = this.blobURLMaps.get(blobUrl);
       if (file) {
         const paths = path.split(",");
-        onProgress?.();
+        loading.show("上传中");
         const ret = await this.uploadImage(file);
-
         if (ret.url) {
           paths.forEach((p) => {
             set(data, p, ret.url);
@@ -76,7 +70,11 @@ export class UploadController {
         err = `上传文件为空[${path}]`;
       }
     }
-    if (err) throw err;
+    loading.hidden();
+    if (err) {
+      message.error(err);
+      throw err;
+    }
     function addBlobToList(data: any, path = "") {
       if (data instanceof Object) {
         if (data instanceof Array) {
@@ -100,18 +98,22 @@ export class UploadController {
   async uploadImage(file: File): Promise<{ url?: string; error?: string }> {
     const fromData = new FormData();
     fromData.append("image", file);
-    const ret = await this.request("/upload/image", {
-      method: "POST",
-      data: fromData,
-      headers: {
-        "Content-Type": "multipart/form-data",
-      },
-    });
-    if (ret.errorNo != 200) {
+    try {
+      const ret = await this.request("/upload/image", {
+        method: "POST",
+        data: fromData,
+        headers: {
+          "Content-Type": "multipart/form-data",
+        },
+      });
+      if (ret.errorNo != 200) {
+        return { error: "上传失败!" };
+      }
+      const url = ret.result.url;
+      return { url };
+    } catch (e) {
       return { error: "上传失败!" };
     }
-    const url = ret.result.url;
-    return { url };
   }
   getBlobURLExt(url: string) {
     const blob = this.blobURLMaps.get(url);

+ 1 - 7
src/modules/admin/components/CategoryModal.tsx

@@ -5,7 +5,6 @@ import { defineComponent, onMounted, reactive, ref } from "vue";
 import { any } from "vue-types";
 import UploadImage from "./UploadImage";
 import { uploader } from "../objects";
-import loading from "@/components/Provider/Loading";
 const layout = {
   labelCol: { span: 6 },
   wrapperCol: { span: 18 },
@@ -45,12 +44,7 @@ export default defineComponent({
 
     function submit() {
       validate().then(async () => {
-        await uploader.uploadBlobImages(formState.formData, {
-          onProgress() {
-            loading.show("上传中");
-          },
-        });
-        loading.hidden();
+        await uploader.uploadBlobImages(formState.formData);
         modal.submit(formState.formData);
       });
     }

+ 0 - 1
src/styles/base.css

@@ -58,7 +58,6 @@
   box-sizing: border-box;
   margin: 0;
   position: relative;
-  font-weight: normal;
 }
 
 body {

+ 1 - 1
src/typings/asset.d.ts

@@ -18,4 +18,4 @@ declare type CategoryItem = {
   children?: CategoryItem[];
 };
 
-declare module "froala-editor";
+declare module "quill-better-table";

+ 2 - 0
src/views/admin/components/Editor.tsx

@@ -1,10 +1,12 @@
 import { css } from "@linaria/core";
+import "quill/dist/quill.snow.css";
 import { defineComponent, onMounted, ref, watch } from "vue";
 
 import Quill from "quill";
 import { any } from "vue-types";
 import { uploader } from "@/modules/admin/objects";
 import { message } from "ant-design-vue";
+
 export default defineComponent({
   props: {
     content: any(),

+ 174 - 0
src/views/admin/components/WangEditor.tsx

@@ -0,0 +1,174 @@
+import { css } from "@linaria/core";
+import "@wangeditor/editor/dist/css/style.css";
+import { defineComponent, onBeforeUnmount, onMounted, ref, watch } from "vue";
+
+import { IDomEditor, createEditor, createToolbar } from "@wangeditor/editor";
+import { any } from "vue-types";
+import { message } from "ant-design-vue";
+let editor = null as any;
+const toolbarConfig = {
+  toolbarKeys: [
+    "headerSelect",
+    "blockquote",
+    "|",
+    "bold",
+    "underline",
+    "italic",
+    {
+      key: "group-more-style",
+      title: "更多样式",
+      menuKeys: ["through", "code", "sup", "sub", "clearStyle"],
+    },
+    "color",
+    "bgColor",
+    "|",
+    "fontSize",
+    "fontFamily",
+    "lineHeight",
+    "|",
+    "bulletedList",
+    "numberedList",
+    {
+      key: "group-justify",
+      title: "对齐",
+      menuKeys: [
+        "justifyLeft",
+        "justifyRight",
+        "justifyCenter",
+        "justifyJustify",
+      ],
+    },
+    {
+      key: "group-indent",
+      title: "缩进",
+      menuKeys: ["indent", "delIndent"],
+    },
+    "|",
+    "insertLink",
+    "uploadImage",
+    "insertTable",
+    "divider",
+    "|",
+    "undo",
+    "redo",
+    "|",
+    "fullScreen",
+  ],
+};
+export default defineComponent({
+  props: {
+    content: any(),
+  },
+  emits: ["change"],
+  setup(props, { emit }) {
+    const loadingRef = ref(true);
+    watch(
+      () => props.content,
+      () => {
+        if (props.content && loadingRef.value && editor) {
+          editor.setHtml(props.content);
+          loadingRef.value = false;
+        }
+      }
+    );
+    const editorConfig = {
+      placeholder: "请输入内容...",
+      MENU_CONF: {
+        uploadImage: {
+          server: "https://www.infish.cn/adhuaxi/v1/upload/image",
+          fieldName: "image",
+          maxFileSize: 5 * 1024 * 1024, // 5M
+          allowedFileTypes: ["image/*"],
+          // 自定义增加 http  header
+          // headers: {
+          //   Accept: "text/x-json",
+          //   otherKey: "xxx",
+          // },
+          customInsert(
+            res: any,
+            insertFn: (url: string, alt: string, href: string) => void
+          ) {
+            if (res.errorNo != 200) {
+              message.error("上传失败");
+              return false;
+            }
+            const url = res.result.url;
+            insertFn(url, "", "");
+          },
+          onFailed(file: File, res: any) {
+            message.error("上传失败");
+            console.log(`${file.name} 上传失败`, res);
+          },
+          onError(file: File, err: any, res: any) {
+            message.error("上传出错");
+            console.log(`${file.name} 上传出错`, err, res);
+          },
+        },
+      },
+      onChange(editor: IDomEditor) {
+        const isEmpty = editor.isEmpty();
+        if (isEmpty && loadingRef.value) {
+          return false;
+        }
+        loadingRef.value = false;
+        const html = editor.getHtml();
+        emit("change", html);
+        console.log(html);
+      },
+    };
+
+    onMounted(() => {
+      initEditor();
+    });
+    const initEditor = () => {
+      editor = createEditor({
+        selector: "#editor-container",
+        html: undefined,
+        config: editorConfig,
+        mode: "default",
+      });
+      const toolbar = createToolbar({
+        editor,
+        selector: "#toolbar-container",
+        config: toolbarConfig,
+        mode: "default",
+      });
+    };
+
+    onBeforeUnmount(() => {
+      if (editor == null) return;
+      editor.destroy();
+      editor = null;
+    });
+
+    return () => (
+      <div class={EditorPage}>
+        <div id="editor—wrapper">
+          <div id="toolbar-container"></div>
+          <div id="editor-container"></div>
+        </div>
+      </div>
+    );
+  },
+});
+const EditorPage = css`
+  #editor—wrapper {
+    border: 1px solid #ccc;
+    z-index: 1;
+  }
+  #toolbar-container {
+    position: relative;
+    border-bottom: 1px solid #ccc;
+    .w-e-menu-tooltip-v5 {
+      &::before {
+        display: none;
+      }
+      &::after {
+        display: none;
+      }
+    }
+  }
+  #editor-container {
+    height: 600px;
+  }
+`;

+ 9 - 4
src/views/admin/detail/components/DetailEditor.tsx

@@ -1,11 +1,11 @@
 import { Button, PageHeader } from "ant-design-vue";
-import { defineComponent, onMounted, reactive, watch } from "vue";
+import { defineComponent, onMounted, reactive } from "vue";
 
+import loading from "@/components/Provider/Loading";
 import { useArticle } from "@/modules/admin";
 import { CategoryItem } from "@/typings/asset";
-import loading from "@/components/Provider/Loading";
 import { object } from "vue-types";
-import Editor from "../../components/Editor";
+import WangEditor from "../../components/WangEditor";
 
 export default defineComponent({
   props: {
@@ -17,6 +17,7 @@ export default defineComponent({
     const state = reactive({
       data: {} as any,
     });
+
     onMounted(() => {
       initDetail();
     });
@@ -60,7 +61,11 @@ export default defineComponent({
               },
             }}
           </PageHeader>
-          <Editor key={data._id} content={state.data.content} onChange={editorChange} />
+          <WangEditor
+            key={data._id}
+            content={state.data.content}
+            onChange={editorChange}
+          />
         </div>
       );
     };

+ 0 - 1
src/views/admin/main.ts

@@ -2,7 +2,6 @@ import { createApp } from "vue";
 import App from "./App.tsx";
 import router from "./router";
 import { createPinia } from "pinia";
-import "quill/dist/quill.snow.css";
 import "virtual:windi.css";
 import "ant-design-vue/dist/antd.less";
 import "@/styles/main.css";

+ 316 - 19
yarn.lock

@@ -948,6 +948,13 @@
   dependencies:
     regenerator-runtime "^0.13.11"
 
+"@babel/runtime@^7.12.0":
+  version "7.21.5"
+  resolved "http://124.70.149.18:4873/@babel%2fruntime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200"
+  integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==
+  dependencies:
+    regenerator-runtime "^0.13.11"
+
 "@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7":
   version "7.20.7"
   resolved "http://124.70.149.18:4873/@babel%2ftemplate/-/template-7.20.7.tgz"
@@ -1287,6 +1294,11 @@
     core-js "^3.15.1"
     nanopop "^2.1.0"
 
+"@transloadit/prettier-bytes@0.0.7":
+  version "0.0.7"
+  resolved "http://124.70.149.18:4873/@transloadit%2fprettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b"
+  integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==
+
 "@types/estree@0.0.39":
   version "0.0.39"
   resolved "http://124.70.149.18:4873/@types%2festree/-/estree-0.0.39.tgz"
@@ -1297,6 +1309,11 @@
   resolved "http://124.70.149.18:4873/@types%2festree/-/estree-1.0.1.tgz"
   integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
 
+"@types/event-emitter@^0.3.3":
+  version "0.3.3"
+  resolved "http://124.70.149.18:4873/@types%2fevent-emitter/-/event-emitter-0.3.3.tgz#727032a9fc67565f96bbd78b2e2809275c97d7e7"
+  integrity sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==
+
 "@types/lodash@^4.14.194":
   version "4.14.194"
   resolved "http://124.70.149.18:4873/@types%2flodash/-/lodash-4.14.194.tgz"
@@ -1323,6 +1340,49 @@
     "@types/node" "*"
     rollup "^0.63.4"
 
+"@uppy/companion-client@^2.2.2":
+  version "2.2.2"
+  resolved "http://124.70.149.18:4873/@uppy%2fcompanion-client/-/companion-client-2.2.2.tgz#c70b42fdcca728ef88b3eebf7ee3e2fa04b4923b"
+  integrity sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==
+  dependencies:
+    "@uppy/utils" "^4.1.2"
+    namespace-emitter "^2.0.1"
+
+"@uppy/core@^2.1.1":
+  version "2.3.4"
+  resolved "http://124.70.149.18:4873/@uppy%2fcore/-/core-2.3.4.tgz#260b85b6bf3aa03cdc67da231f8c69cfbfdcc84a"
+  integrity sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==
+  dependencies:
+    "@transloadit/prettier-bytes" "0.0.7"
+    "@uppy/store-default" "^2.1.1"
+    "@uppy/utils" "^4.1.3"
+    lodash.throttle "^4.1.1"
+    mime-match "^1.0.2"
+    namespace-emitter "^2.0.1"
+    nanoid "^3.1.25"
+    preact "^10.5.13"
+
+"@uppy/store-default@^2.1.1":
+  version "2.1.1"
+  resolved "http://124.70.149.18:4873/@uppy%2fstore-default/-/store-default-2.1.1.tgz#62a656a099bdaa012306e054d093754cb2d36e3e"
+  integrity sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==
+
+"@uppy/utils@^4.1.2", "@uppy/utils@^4.1.3":
+  version "4.1.3"
+  resolved "http://124.70.149.18:4873/@uppy%2futils/-/utils-4.1.3.tgz#9d0be6ece4df25f228d30ef40be0f14208258ce3"
+  integrity sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==
+  dependencies:
+    lodash.throttle "^4.1.1"
+
+"@uppy/xhr-upload@^2.0.3":
+  version "2.1.3"
+  resolved "http://124.70.149.18:4873/@uppy%2fxhr-upload/-/xhr-upload-2.1.3.tgz#0d4e355332fe0c6eb372d7731315e04d02aeeb18"
+  integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==
+  dependencies:
+    "@uppy/companion-client" "^2.2.2"
+    "@uppy/utils" "^4.1.2"
+    nanoid "^3.1.25"
+
 "@vitejs/plugin-vue-jsx@^3.0.1":
   version "3.0.1"
   resolved "http://124.70.149.18:4873/@vitejs%2fplugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz"
@@ -1496,6 +1556,84 @@
   resolved "http://124.70.149.18:4873/@vue%2fshared/-/shared-3.2.47.tgz"
   integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
 
+"@wangeditor/basic-modules@^1.1.7":
+  version "1.1.7"
+  resolved "http://124.70.149.18:4873/@wangeditor%2fbasic-modules/-/basic-modules-1.1.7.tgz#a9c3ccf4ef53332f29550d59d3676e15f395946f"
+  integrity sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==
+  dependencies:
+    is-url "^1.2.4"
+
+"@wangeditor/code-highlight@^1.0.3":
+  version "1.0.3"
+  resolved "http://124.70.149.18:4873/@wangeditor%2fcode-highlight/-/code-highlight-1.0.3.tgz#90256857714d5c0cf83ac475aea64db7bf29a7cd"
+  integrity sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==
+  dependencies:
+    prismjs "^1.23.0"
+
+"@wangeditor/core@^1.1.19":
+  version "1.1.19"
+  resolved "http://124.70.149.18:4873/@wangeditor%2fcore/-/core-1.1.19.tgz#f9155f7fd92d03cb1982405b3b82e54c31f1c2b0"
+  integrity sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==
+  dependencies:
+    "@types/event-emitter" "^0.3.3"
+    event-emitter "^0.3.5"
+    html-void-elements "^2.0.0"
+    i18next "^20.4.0"
+    scroll-into-view-if-needed "^2.2.28"
+    slate-history "^0.66.0"
+
+"@wangeditor/editor-for-vue@^5.1.12":
+  version "5.1.12"
+  resolved "http://124.70.149.18:4873/@wangeditor%2feditor-for-vue/-/editor-for-vue-5.1.12.tgz#f7d5f239b39cdfc01d31151488de8443fe6edc64"
+  integrity sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==
+
+"@wangeditor/editor@^5.1.23":
+  version "5.1.23"
+  resolved "http://124.70.149.18:4873/@wangeditor%2feditor/-/editor-5.1.23.tgz#c9d2007b7cb0ceef6b72692b4ee87b01ee2367b3"
+  integrity sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==
+  dependencies:
+    "@uppy/core" "^2.1.1"
+    "@uppy/xhr-upload" "^2.0.3"
+    "@wangeditor/basic-modules" "^1.1.7"
+    "@wangeditor/code-highlight" "^1.0.3"
+    "@wangeditor/core" "^1.1.19"
+    "@wangeditor/list-module" "^1.0.5"
+    "@wangeditor/table-module" "^1.1.4"
+    "@wangeditor/upload-image-module" "^1.0.2"
+    "@wangeditor/video-module" "^1.1.4"
+    dom7 "^3.0.0"
+    is-hotkey "^0.2.0"
+    lodash.camelcase "^4.3.0"
+    lodash.clonedeep "^4.5.0"
+    lodash.debounce "^4.0.8"
+    lodash.foreach "^4.5.0"
+    lodash.isequal "^4.5.0"
+    lodash.throttle "^4.1.1"
+    lodash.toarray "^4.4.0"
+    nanoid "^3.2.0"
+    slate "^0.72.0"
+    snabbdom "^3.1.0"
+
+"@wangeditor/list-module@^1.0.5":
+  version "1.0.5"
+  resolved "http://124.70.149.18:4873/@wangeditor%2flist-module/-/list-module-1.0.5.tgz#3fc0b167acddf885536b45fa0c127f9c6adaea33"
+  integrity sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==
+
+"@wangeditor/table-module@^1.1.4":
+  version "1.1.4"
+  resolved "http://124.70.149.18:4873/@wangeditor%2ftable-module/-/table-module-1.1.4.tgz#757d4a5868b2b658041cd323854a4d707c8347e9"
+  integrity sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==
+
+"@wangeditor/upload-image-module@^1.0.2":
+  version "1.0.2"
+  resolved "http://124.70.149.18:4873/@wangeditor%2fupload-image-module/-/upload-image-module-1.0.2.tgz#89e9b9467e10cbc6b11dc5748e08dd23aaebee30"
+  integrity sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==
+
+"@wangeditor/video-module@^1.1.4":
+  version "1.1.4"
+  resolved "http://124.70.149.18:4873/@wangeditor%2fvideo-module/-/video-module-1.1.4.tgz#b9df1b3ab2cd53f678b19b4d927e200774a6f532"
+  integrity sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==
+
 "@windicss/config@1.8.10":
   version "1.8.10"
   resolved "http://124.70.149.18:4873/@windicss%2fconfig/-/config-1.8.10.tgz"
@@ -1776,6 +1914,14 @@ csstype@^2.6.8:
   resolved "http://124.70.149.18:4873/csstype/-/csstype-2.6.21.tgz"
   integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==
 
+d@1, d@^1.0.1:
+  version "1.0.1"
+  resolved "http://124.70.149.18:4873/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+  dependencies:
+    es5-ext "^0.10.50"
+    type "^1.0.1"
+
 dayjs@^1.10.5:
   version "1.11.7"
   resolved "http://124.70.149.18:4873/dayjs/-/dayjs-1.11.7.tgz"
@@ -1840,6 +1986,13 @@ dom-scroll-into-view@^2.0.0:
   resolved "http://124.70.149.18:4873/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz"
   integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==
 
+dom7@^3.0.0:
+  version "3.0.0"
+  resolved "http://124.70.149.18:4873/dom7/-/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331"
+  integrity sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==
+  dependencies:
+    ssr-window "^3.0.0-alpha.1"
+
 electron-to-chromium@^1.4.284:
   version "1.4.374"
   resolved "http://124.70.149.18:4873/electron-to-chromium/-/electron-to-chromium-1.4.374.tgz"
@@ -1859,6 +2012,32 @@ error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
+es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14:
+  version "0.10.62"
+  resolved "http://124.70.149.18:4873/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
+  integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
+  dependencies:
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.3"
+    next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+  version "2.0.3"
+  resolved "http://124.70.149.18:4873/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+  version "3.1.3"
+  resolved "http://124.70.149.18:4873/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+  dependencies:
+    d "^1.0.1"
+    ext "^1.1.2"
+
 esbuild@^0.17.5:
   version "0.17.18"
   resolved "http://124.70.149.18:4873/esbuild/-/esbuild-0.17.18.tgz"
@@ -1907,16 +2086,26 @@ esutils@^2.0.2:
   resolved "http://124.70.149.18:4873/esutils/-/esutils-2.0.3.tgz"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
-eventemitter3@4.0.7:
-  version "4.0.7"
-  resolved "http://124.70.149.18:4873/eventemitter3/-/eventemitter3-4.0.7.tgz"
-  integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "http://124.70.149.18:4873/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
 
 eventemitter3@^2.0.3:
   version "2.0.3"
   resolved "http://124.70.149.18:4873/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
   integrity sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=
 
+ext@^1.1.2:
+  version "1.7.0"
+  resolved "http://124.70.149.18:4873/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+  integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+  dependencies:
+    type "^2.7.2"
+
 extend@^3.0.2:
   version "3.0.2"
   resolved "http://124.70.149.18:4873/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@@ -2072,6 +2261,18 @@ html-tags@^3.1.0:
   resolved "http://124.70.149.18:4873/html-tags/-/html-tags-3.3.1.tgz"
   integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==
 
+html-void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "http://124.70.149.18:4873/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
+  integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
+
+i18next@^20.4.0:
+  version "20.6.1"
+  resolved "http://124.70.149.18:4873/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345"
+  integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==
+  dependencies:
+    "@babel/runtime" "^7.12.0"
+
 iconv-lite@^0.6.3:
   version "0.6.3"
   resolved "http://124.70.149.18:4873/iconv-lite/-/iconv-lite-0.6.3.tgz"
@@ -2084,6 +2285,11 @@ image-size@~0.5.0:
   resolved "http://124.70.149.18:4873/image-size/-/image-size-0.5.5.tgz"
   integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
 
+immer@^9.0.6:
+  version "9.0.21"
+  resolved "http://124.70.149.18:4873/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
+  integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+
 import-fresh@^3.2.1:
   version "3.3.0"
   resolved "http://124.70.149.18:4873/import-fresh/-/import-fresh-3.3.0.tgz"
@@ -2145,6 +2351,11 @@ is-glob@^4.0.1, is-glob@~4.0.1:
   dependencies:
     is-extglob "^2.1.1"
 
+is-hotkey@^0.2.0:
+  version "0.2.0"
+  resolved "http://124.70.149.18:4873/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef"
+  integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved "http://124.70.149.18:4873/is-number/-/is-number-7.0.0.tgz"
@@ -2155,7 +2366,7 @@ is-plain-object@3.0.1:
   resolved "http://124.70.149.18:4873/is-plain-object/-/is-plain-object-3.0.1.tgz"
   integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
 
-is-plain-object@5.0.0:
+is-plain-object@5.0.0, is-plain-object@^5.0.0:
   version "5.0.0"
   resolved "http://124.70.149.18:4873/is-plain-object/-/is-plain-object-5.0.0.tgz"
   integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
@@ -2175,6 +2386,11 @@ is-regex@^1.0.4:
     call-bind "^1.0.2"
     has-tostringtag "^1.0.0"
 
+is-url@^1.2.4:
+  version "1.2.4"
+  resolved "http://124.70.149.18:4873/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+  integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
 is-what@^3.14.1:
   version "3.14.1"
   resolved "http://124.70.149.18:4873/is-what/-/is-what-3.14.1.tgz"
@@ -2278,6 +2494,11 @@ lodash-es@^4.17.15:
   resolved "http://124.70.149.18:4873/lodash-es/-/lodash-es-4.17.21.tgz"
   integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
 
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "http://124.70.149.18:4873/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+  integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
 lodash.clonedeep@^4.5.0:
   version "4.5.0"
   resolved "http://124.70.149.18:4873/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
@@ -2288,11 +2509,26 @@ lodash.debounce@^4.0.8:
   resolved "http://124.70.149.18:4873/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
   integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
 
+lodash.foreach@^4.5.0:
+  version "4.5.0"
+  resolved "http://124.70.149.18:4873/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+  integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==
+
 lodash.isequal@^4.5.0:
   version "4.5.0"
   resolved "http://124.70.149.18:4873/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
   integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
 
+lodash.throttle@^4.1.1:
+  version "4.1.1"
+  resolved "http://124.70.149.18:4873/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
+  integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
+
+lodash.toarray@^4.4.0:
+  version "4.4.0"
+  resolved "http://124.70.149.18:4873/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
+  integrity sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==
+
 lodash@^4.17.21:
   version "4.17.21"
   resolved "http://124.70.149.18:4873/lodash/-/lodash-4.17.21.tgz"
@@ -2366,6 +2602,13 @@ mime-db@1.52.0:
   resolved "http://124.70.149.18:4873/mime-db/-/mime-db-1.52.0.tgz"
   integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
 
+mime-match@^1.0.2:
+  version "1.0.2"
+  resolved "http://124.70.149.18:4873/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8"
+  integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==
+  dependencies:
+    wildcard "^1.1.0"
+
 mime-types@^2.1.12:
   version "2.1.35"
   resolved "http://124.70.149.18:4873/mime-types/-/mime-types-2.1.35.tgz"
@@ -2392,13 +2635,6 @@ minimatch@^9.0.0:
   dependencies:
     brace-expansion "^2.0.1"
 
-moduse@^0.0.7:
-  version "0.0.7"
-  resolved "http://124.70.149.18:4873/moduse/-/moduse-0.0.7.tgz"
-  integrity sha512-9FyEh/sg4pObHbF79BHA2ZvUOzlOkFMcvn798U7YrpDAgFMXtS4HY1CNYEgB75MpdNr8ryeDVEdAHw1AQkzlgg==
-  dependencies:
-    lodash "^4.17.21"
-
 ms@2.1.2:
   version "2.1.2"
   resolved "http://124.70.149.18:4873/ms/-/ms-2.1.2.tgz"
@@ -2414,7 +2650,12 @@ muggle-string@^0.2.2:
   resolved "http://124.70.149.18:4873/muggle-string/-/muggle-string-0.2.2.tgz"
   integrity sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==
 
-nanoid@^3.3.6:
+namespace-emitter@^2.0.1:
+  version "2.0.1"
+  resolved "http://124.70.149.18:4873/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c"
+  integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==
+
+nanoid@^3.1.25, nanoid@^3.2.0, nanoid@^3.3.6:
   version "3.3.6"
   resolved "http://124.70.149.18:4873/nanoid/-/nanoid-3.3.6.tgz"
   integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
@@ -2433,6 +2674,11 @@ needle@^3.1.0:
     iconv-lite "^0.6.3"
     sax "^1.2.4"
 
+next-tick@^1.1.0:
+  version "1.1.0"
+  resolved "http://124.70.149.18:4873/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
 node-releases@^2.0.8:
   version "2.0.10"
   resolved "http://124.70.149.18:4873/node-releases/-/node-releases-2.0.10.tgz"
@@ -2551,6 +2797,16 @@ postcss@^8.1.10, postcss@^8.4.23:
     picocolors "^1.0.0"
     source-map-js "^1.0.2"
 
+preact@^10.5.13:
+  version "10.14.1"
+  resolved "http://124.70.149.18:4873/preact/-/preact-10.14.1.tgz#1e15ef6a09e241a48d12c872b90557914b03abac"
+  integrity sha512-4XDSnUisk3YFBb3p9WeKeH1mKoxdFUsaXcvxs9wlpYR1wax/TWJVqhwmIWbByX0h7jMEJH6Zc5J6jqc58FKaNQ==
+
+prismjs@^1.23.0:
+  version "1.29.0"
+  resolved "http://124.70.149.18:4873/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12"
+  integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
+
 proxy-from-env@^1.1.0:
   version "1.1.0"
   resolved "http://124.70.149.18:4873/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
@@ -2723,7 +2979,7 @@ sax@^1.2.4:
   resolved "http://124.70.149.18:4873/sax/-/sax-1.2.4.tgz"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-scroll-into-view-if-needed@^2.2.25:
+scroll-into-view-if-needed@^2.2.25, scroll-into-view-if-needed@^2.2.28:
   version "2.2.31"
   resolved "http://124.70.149.18:4873/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz"
   integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==
@@ -2752,6 +3008,27 @@ shallow-equal@^1.0.0:
   resolved "http://124.70.149.18:4873/shallow-equal/-/shallow-equal-1.2.1.tgz"
   integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==
 
+slate-history@^0.66.0:
+  version "0.66.0"
+  resolved "http://124.70.149.18:4873/slate-history/-/slate-history-0.66.0.tgz#ac63fddb903098ceb4c944433e3f75fe63acf940"
+  integrity sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==
+  dependencies:
+    is-plain-object "^5.0.0"
+
+slate@^0.72.0:
+  version "0.72.8"
+  resolved "http://124.70.149.18:4873/slate/-/slate-0.72.8.tgz#5a018edf24e45448655293a68bfbcf563aa5ba81"
+  integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
+  dependencies:
+    immer "^9.0.6"
+    is-plain-object "^5.0.0"
+    tiny-warning "^1.0.3"
+
+snabbdom@^3.1.0:
+  version "3.5.1"
+  resolved "http://124.70.149.18:4873/snabbdom/-/snabbdom-3.5.1.tgz#25f80ef15b194baea703d9d5441892e369de18e1"
+  integrity sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==
+
 source-map-js@^1.0.2:
   version "1.0.2"
   resolved "http://124.70.149.18:4873/source-map-js/-/source-map-js-1.0.2.tgz"
@@ -2772,6 +3049,11 @@ sourcemap-codec@^1.4.8:
   resolved "http://124.70.149.18:4873/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
   integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
 
+ssr-window@^3.0.0-alpha.1:
+  version "3.0.0"
+  resolved "http://124.70.149.18:4873/ssr-window/-/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37"
+  integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==
+
 ssr-window@^4.0.2:
   version "4.0.2"
   resolved "http://124.70.149.18:4873/ssr-window/-/ssr-window-4.0.2.tgz"
@@ -2806,6 +3088,11 @@ swiper@^9.2.4:
   dependencies:
     ssr-window "^4.0.2"
 
+tiny-warning@^1.0.3:
+  version "1.0.3"
+  resolved "http://124.70.149.18:4873/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+  integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "http://124.70.149.18:4873/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
@@ -2830,6 +3117,16 @@ tslib@^2.1.0, tslib@^2.3.0:
   resolved "http://124.70.149.18:4873/tslib/-/tslib-2.5.0.tgz"
   integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
 
+type@^1.0.1:
+  version "1.2.0"
+  resolved "http://124.70.149.18:4873/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.7.2:
+  version "2.7.2"
+  resolved "http://124.70.149.18:4873/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
+  integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+
 typescript@^5.0.4:
   version "5.0.4"
   resolved "http://124.70.149.18:4873/typescript/-/typescript-5.0.4.tgz"
@@ -2918,11 +3215,6 @@ vue-demi@*:
   resolved "http://124.70.149.18:4873/vue-demi/-/vue-demi-0.14.1.tgz#1ed9af03a27642762bfed83d8750805302d0398d"
   integrity sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ==
 
-vue-moduse@^0.0.10:
-  version "0.0.10"
-  resolved "http://124.70.149.18:4873/vue-moduse/-/vue-moduse-0.0.10.tgz"
-  integrity sha512-lS0tf4kvJKw+sohwuObujk90NGD024H+pOulVRv73q+75+pccKz6R6VnENMM11AgygOmYK0fioUlgOGYMFYgrw==
-
 vue-router@^4.1.6:
   version "4.1.6"
   resolved "http://124.70.149.18:4873/vue-router/-/vue-router-4.1.6.tgz"
@@ -2989,6 +3281,11 @@ webpack-virtual-modules@^0.5.0:
   resolved "http://124.70.149.18:4873/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz"
   integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==
 
+wildcard@^1.1.0:
+  version "1.1.2"
+  resolved "http://124.70.149.18:4873/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"
+  integrity sha1-pwIEUwhNjNLv5wup02liY94XEKU=
+
 windicss@^3.5.6:
   version "3.5.6"
   resolved "http://124.70.149.18:4873/windicss/-/windicss-3.5.6.tgz"