刘洋 2 лет назад
Родитель
Сommit
74b9ed67c5

+ 2 - 1
.eslintrc.js

@@ -17,6 +17,7 @@ module.exports = {
     "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
     "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
     '@typescript-eslint/no-explicit-any' : 'off',
-    '@typescript-eslint/no-var-requires' : 'off'
+    '@typescript-eslint/no-var-requires' : 'off',
+    "no-var-requires": "off"
   },
 };

+ 2 - 2
config.json

@@ -20,7 +20,7 @@
     "logger": {
         "level": "info"
     },
-    "imagemagickDev": "C:\\ImageMagick-7.1.0-Q16\\",
+    "imagemagickDev": "C:\\ImageMagick-7.1.1-Q16\\",
     "openDevTools": false,
     "servers": [
         {
@@ -33,7 +33,7 @@
         },
         {
             "name": "线下环境-yt",
-            "host": "http://192.168.11.204:8090"
+            "host": "http://192.168.10.225:8000"
         },
         {
             "name": "线下环境-221",

+ 2 - 0
package.json

@@ -23,6 +23,7 @@
     "gm": "^1.23.1",
     "image-size": "^0.6.3",
     "jquery": "^3.3.1",
+    "jspdf": "^2.5.1",
     "lodash": "^4.17.21",
     "log4js": "^3.0.6",
     "mkdirp": "^0.5.1",
@@ -40,6 +41,7 @@
     "@types/electron-devtools-installer": "^2.2.0",
     "@types/gm": "^1.18.10",
     "@types/image-size": "^0.8.0",
+    "@types/lodash": "^4.14.194",
     "@types/mkdirp": "^1.0.2",
     "@types/mustache": "^4.1.2",
     "@types/mysql": "^2.15.19",

+ 12 - 2
src/features/ImageDownload/ImageDownload.vue

@@ -23,7 +23,6 @@ const router = useRouter();
 import { countStudents, getPackages, getStudents } from "@/api/api";
 import { httpApp } from "@/plugins/axiosApp";
 import mustache from "mustache";
-const path = require("path");
 
 async function getImageDim(
   blob: Blob
@@ -163,6 +162,8 @@ onMounted(async () => {
             }
           }
           console.log("colorMap:", colorMap);
+          let resultImgList: any[] = [];
+          let sheetUrlsLength = (student.sheetUrls || []).length;
           for (const sheetUrl of student.sheetUrls) {
             if (stopSignal) return;
             try {
@@ -200,7 +201,7 @@ onMounted(async () => {
               // console.log(imageRes.data);
               // console.log(await imageRes.data.arrayBuffer());
               // console.log(new Uint8Array(await imageRes.data.arrayBuffer()));
-              await window.electron.addWatermark(
+              let fileLocation = await window.electron.addWatermark(
                 storePassedToNodeJs,
                 arrayBuffer,
                 width,
@@ -213,6 +214,8 @@ onMounted(async () => {
                 config.y,
                 colorMap
               );
+              resultImgList.push(fileLocation);
+              console.log(resultImgList.length, sheetUrlsLength);
             } catch (error) {
               errorCount.value += 1;
               if (config.failover) {
@@ -225,6 +228,13 @@ onMounted(async () => {
           }
           // 下载完一个学生
           finishedCount.value += 1;
+          console.log(resultImgList.length, sheetUrlsLength);
+          if (resultImgList.length === sheetUrlsLength) {
+            window.electron.saveToPDF(resultImgList, [
+              config.dir,
+              `/pdfs/${store.env.examId}/${student.subjectCode}/${student.examNumber}.pdf`,
+            ]);
+          }
         }
       }
       console.log(

+ 2 - 2
src/features/Login/Login.vue

@@ -54,8 +54,8 @@ const servers = store.config.servers.map((v) => {
   return { label: v.name, value: v.host };
 });
 
-let loginName = ref("");
-let password = ref("");
+let loginName = ref("admin01");
+let password = ref("123456");
 
 // FIXME: restore original state
 // onMounted(() => {

+ 76 - 0
src/lib/pdfUtil.ts

@@ -0,0 +1,76 @@
+import fs from "fs";
+import path from "path";
+import { jsPDF } from "jspdf";
+import mkdirp from "mkdirp";
+export async function saveToPDF(imgList: string[], filePath: string[]) {
+  const targetLocation = path.join(...filePath);
+  // 生成pdf
+  // 第一个参数:l横向,p纵向
+  // 第二个参数:计量单位: cm mm px等
+  // 第三个参数:格式: 默认a4
+  const { maxWidth, maxHeight } = await getMaxWidthHeight(imgList);
+  const recordPdf: any = new jsPDF("l", "px", [maxWidth, maxHeight]);
+  // 从top的位置开始加图片
+  for (let i = 0; i < imgList.length; i++) {
+    const url = imgList[i];
+    const { width, height }: any = await getImgWidthHeight(url);
+    recordPdf.addImage(url, "jpg", 1, 1, width, height);
+    recordPdf.addPage([maxWidth, maxHeight]);
+  }
+  // 删除最后一页留白
+  const targetPage = recordPdf.internal.getNumberOfPages();
+  recordPdf.deletePage(targetPage);
+  // recordPdf.save("PDF存档.pdf");
+  const rawdata = recordPdf.output();
+  let len = rawdata.length;
+  const u8 = new Uint8Array(len);
+  while (len--) u8[len] = rawdata.charCodeAt(len);
+  const buffer = new Buffer(u8);
+  mkdirp.sync(path.dirname(targetLocation));
+  fs.writeFile(targetLocation, buffer, function (e) {
+    if (e) throw e;
+  });
+}
+// 获取图片数组里面最大的宽度和高度
+async function getMaxWidthHeight(imgList: string[]) {
+  const widthList = [];
+  const heightList = [];
+  let maxHeight = 0;
+  let maxWidth = 0;
+  for (let i = 0; i < imgList.length; i++) {
+    const url = imgList[i];
+    const { width, height }: any = await getImgWidthHeight(url);
+    widthList.push(width);
+    heightList.push(height);
+  }
+  // 把数组变成升序然后倒过来取第一个就是拿最大宽度
+  maxWidth = widthList.sort().reverse()[0];
+  maxHeight = heightList.sort().reverse()[0];
+  return {
+    maxWidth,
+    maxHeight,
+  };
+}
+//获取图片宽高
+function getImgWidthHeight(src: any) {
+  return new Promise((resolve, reject) => {
+    const img = new Image();
+    img.src = src;
+    // 图片是否有缓存 如果有缓存可以直接拿 如果没有缓存 需要从onload拿
+    if (img.complete) {
+      const { width, height } = img;
+      resolve({
+        width,
+        height,
+      });
+    } else {
+      img.onload = function () {
+        const { width, height } = img;
+        resolve({
+          width,
+          height,
+        });
+      };
+    }
+  });
+}

+ 5 - 3
src/lib/watermark.ts

@@ -19,7 +19,7 @@ export async function addWatermark(
   x = 0.01,
   y = 0.03,
   colorMap: any = {}
-): Promise<boolean> {
+): Promise<boolean | string> {
   const file = path.join(...filePath);
   if (
     index !== 1 &&
@@ -265,7 +265,8 @@ export async function addWatermark(
         // logger.error(error);
         reject(error);
       } else {
-        resolve(true);
+        // resolve(true);
+        resolve(file);
       }
     });
   });
@@ -290,7 +291,8 @@ export async function saveImage(
       if (error) {
         reject(error);
       } else {
-        resolve(true);
+        // resolve(true);
+        resolve(file);
       }
     });
   });

+ 2 - 1
src/preload.ts

@@ -3,7 +3,7 @@ import { contextBridge, remote } from "electron";
 import config from "./lib/config";
 import { existsImage, saveImage, addWatermark } from "./lib/watermark";
 import { queryStudentCount, replaceStudents, replacePackage } from "./lib/sync";
-
+import { saveToPDF } from "./lib/pdfUtil";
 export const electronInWindow = {
   dialog: remote.dialog,
   config,
@@ -13,6 +13,7 @@ export const electronInWindow = {
   replaceStudents,
   replacePackage,
   existsImage,
+  saveToPDF
 };
 
 contextBridge.exposeInMainWorld("electron", electronInWindow);

+ 2 - 7
src/store.ts

@@ -27,16 +27,13 @@ const _store = {
 
 const handler = function () {
   return {
-    // @ts-ignore
-    set(obj, prop, value) {
+    set(obj: any, prop: any, value: any) {
       // console.log("set", obj, prop, value);
-      // @ts-ignore
       obj[prop] = value;
       window.localStorage.setItem("store", JSON.stringify(_store));
       return true;
     },
-    // @ts-ignore
-    get(obj, prop) {
+    get(obj: any, prop: any): any {
       // console.log("get", obj, prop);
       if (!_inited) {
         Object.assign(
@@ -54,7 +51,6 @@ const handler = function () {
       ) {
         return new Proxy(obj[prop], handler());
       }
-      // @ts-ignore
       return obj[prop];
     },
   };
@@ -63,5 +59,4 @@ const store = new Proxy(_store, handler()) as Store;
 
 export { store };
 
-// @ts-ignore
 window.store = store;

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

@@ -26,6 +26,7 @@ declare global {
   interface Window {
     electron: typeof electronInWindow;
     // electron: string;
+    store: any;
   }
 }
 

+ 127 - 0
yarn.lock

@@ -898,6 +898,13 @@
   dependencies:
     regenerator-runtime "^0.13.4"
 
+"@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0":
+  version "7.21.5"
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/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.14.5":
   version "7.14.5"
   resolved "https://registry.nlark.com/@babel/template/download/@babel/template-7.14.5.tgz?cache=0&sync_timestamp=1623280480241&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftemplate%2Fdownload%2F%40babel%2Ftemplate-7.14.5.tgz"
@@ -1210,6 +1217,11 @@
   resolved "https://registry.nlark.com/@types/lodash/download/@types/lodash-4.14.172.tgz?cache=0&sync_timestamp=1627979605404&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Flodash%2Fdownload%2F%40types%2Flodash-4.14.172.tgz#aad774c28e7bfd7a67de25408e03ee5a8c3d028a"
   integrity sha1-qtd0wo57/Xpn3iVAjgPuWow9Aoo=
 
+"@types/lodash@^4.14.194":
+  version "4.14.194"
+  resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76"
+  integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==
+
 "@types/mime@^1":
   version "1.3.2"
   resolved "https://registry.nlark.com/@types/mime/download/@types/mime-1.3.2.tgz?cache=0&sync_timestamp=1621241862733&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fmime%2Fdownload%2F%40types%2Fmime-1.3.2.tgz"
@@ -1287,6 +1299,11 @@
   resolved "https://registry.nlark.com/@types/qs/download/@types/qs-6.9.7.tgz?cache=0&sync_timestamp=1625678512400&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fqs%2Fdownload%2F%40types%2Fqs-6.9.7.tgz"
   integrity sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss=
 
+"@types/raf@^3.4.0":
+  version "3.4.0"
+  resolved "https://registry.npmmirror.com/@types/raf/-/raf-3.4.0.tgz#2b72cbd55405e071f1c4d29992638e022b20acc2"
+  integrity sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==
+
 "@types/range-parser@*":
   version "1.2.4"
   resolved "https://registry.nlark.com/@types/range-parser/download/@types/range-parser-1.2.4.tgz"
@@ -2488,6 +2505,11 @@ balanced-match@^1.0.0:
   resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&sync_timestamp=1617714223283&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz"
   integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=
 
+base64-arraybuffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
+  integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==
+
 base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1:
   version "1.5.1"
   resolved "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz"
@@ -2742,6 +2764,11 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4
     escalade "^3.1.1"
     node-releases "^1.1.73"
 
+btoa@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
+  integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==
+
 buffer-crc32@~0.2.3:
   version "0.2.13"
   resolved "https://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz"
@@ -2999,6 +3026,20 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001248:
   resolved "https://registry.nlark.com/caniuse-lite/download/caniuse-lite-1.0.30001251.tgz"
   integrity sha1-aFOmBuxQiTEV22YPgsCU0Y8JbYU=
 
+canvg@^3.0.6:
+  version "3.0.10"
+  resolved "https://registry.npmmirror.com/canvg/-/canvg-3.0.10.tgz#8e52a2d088b6ffa23ac78970b2a9eebfae0ef4b3"
+  integrity sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@types/raf" "^3.4.0"
+    core-js "^3.8.3"
+    raf "^3.4.1"
+    regenerator-runtime "^0.13.7"
+    rgbcolor "^1.0.1"
+    stackblur-canvas "^2.0.0"
+    svg-pathdata "^6.0.3"
+
 case-sensitive-paths-webpack-plugin@^2.3.0:
   version "2.4.0"
   resolved "https://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.4.0.tgz"
@@ -3525,6 +3566,11 @@ core-js@^3.12.1, core-js@^3.6.5:
   resolved "https://registry.nlark.com/core-js/download/core-js-3.16.2.tgz"
   integrity sha1-P0hYIoicf8SO9GPjW+XMKkoBofQ=
 
+core-js@^3.6.0, core-js@^3.8.3:
+  version "3.30.2"
+  resolved "https://registry.npmmirror.com/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc"
+  integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==
+
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz"
@@ -3661,6 +3707,13 @@ css-declaration-sorter@^4.0.1:
     postcss "^7.0.1"
     timsort "^0.3.0"
 
+css-line-break@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0"
+  integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==
+  dependencies:
+    utrie "^1.0.2"
+
 css-loader@^3.5.3:
   version "3.6.0"
   resolved "https://registry.nlark.com/css-loader/download/css-loader-3.6.0.tgz?cache=0&sync_timestamp=1626725852525&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-loader%2Fdownload%2Fcss-loader-3.6.0.tgz"
@@ -4151,6 +4204,11 @@ domhandler@^4.0.0, domhandler@^4.2.0:
   dependencies:
     domelementtype "^2.2.0"
 
+dompurify@^2.2.0:
+  version "2.4.5"
+  resolved "https://registry.npmmirror.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87"
+  integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==
+
 domutils@^1.7.0:
   version "1.7.0"
   resolved "https://registry.nlark.com/domutils/download/domutils-1.7.0.tgz"
@@ -4898,6 +4956,11 @@ fd-slicer@~1.1.0:
   dependencies:
     pend "~1.2.0"
 
+fflate@^0.4.8:
+  version "0.4.8"
+  resolved "https://registry.npmmirror.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae"
+  integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==
+
 figgy-pudding@^3.5.1:
   version "3.5.2"
   resolved "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz"
@@ -5691,6 +5754,14 @@ html-webpack-plugin@^3.2.0:
     toposort "^1.0.0"
     util.promisify "1.0.0"
 
+html2canvas@^1.0.0-rc.5:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543"
+  integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==
+  dependencies:
+    css-line-break "^2.1.0"
+    text-segmentation "^1.0.3"
+
 htmlparser2@^6.1.0:
   version "6.1.0"
   resolved "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-6.1.0.tgz?cache=0&sync_timestamp=1617914940336&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-6.1.0.tgz"
@@ -6586,6 +6657,21 @@ jsonfile@^6.0.1:
   optionalDependencies:
     graceful-fs "^4.1.6"
 
+jspdf@^2.5.1:
+  version "2.5.1"
+  resolved "https://registry.npmmirror.com/jspdf/-/jspdf-2.5.1.tgz#00c85250abf5447a05f3b32ab9935ab4a56592cc"
+  integrity sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==
+  dependencies:
+    "@babel/runtime" "^7.14.0"
+    atob "^2.1.2"
+    btoa "^1.2.1"
+    fflate "^0.4.8"
+  optionalDependencies:
+    canvg "^3.0.6"
+    core-js "^3.6.0"
+    dompurify "^2.2.0"
+    html2canvas "^1.0.0-rc.5"
+
 jsprim@^1.2.2:
   version "1.4.1"
   resolved "https://registry.nlark.com/jsprim/download/jsprim-1.4.1.tgz"
@@ -8558,6 +8644,13 @@ queue@6.0.2:
   dependencies:
     inherits "~2.0.3"
 
+raf@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
+  integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
+  dependencies:
+    performance-now "^2.1.0"
+
 randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz"
@@ -8669,6 +8762,11 @@ regenerate@^1.4.0:
   resolved "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.2.tgz?cache=0&sync_timestamp=1604220147658&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.2.tgz"
   integrity sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=
 
+regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7:
+  version "0.13.11"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+  integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+
 regenerator-runtime@^0.13.4:
   version "0.13.9"
   resolved "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz"
@@ -8914,6 +9012,11 @@ rgba-regex@^1.0.0:
   resolved "https://registry.nlark.com/rgba-regex/download/rgba-regex-1.0.0.tgz"
   integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
 
+rgbcolor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d"
+  integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==
+
 rimraf@2.6.3:
   version "2.6.3"
   resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.6.3.tgz"
@@ -9514,6 +9617,11 @@ stable@^0.1.8:
   resolved "https://registry.nlark.com/stable/download/stable-0.1.8.tgz"
   integrity sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=
 
+stackblur-canvas@^2.0.0:
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz#aa87bbed1560fdcd3138fff344fc6a1c413ebac4"
+  integrity sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==
+
 stackframe@^1.1.1:
   version "1.2.0"
   resolved "https://registry.npm.taobao.org/stackframe/download/stackframe-1.2.0.tgz?cache=0&sync_timestamp=1590854170093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstackframe%2Fdownload%2Fstackframe-1.2.0.tgz"
@@ -9740,6 +9848,11 @@ supports-color@^7.0.0, supports-color@^7.1.0:
   dependencies:
     has-flag "^4.0.0"
 
+svg-pathdata@^6.0.3:
+  version "6.0.3"
+  resolved "https://registry.npmmirror.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac"
+  integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==
+
 svg-tags@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz"
@@ -9838,6 +9951,13 @@ terser@^4.1.2, terser@^4.8.0:
     source-map "~0.6.1"
     source-map-support "~0.5.12"
 
+text-segmentation@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943"
+  integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==
+  dependencies:
+    utrie "^1.0.2"
+
 text-table@^0.2.0:
   version "0.2.0"
   resolved "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz"
@@ -10414,6 +10534,13 @@ utils-merge@1.0.1:
   resolved "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz"
   integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
 
+utrie@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645"
+  integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==
+  dependencies:
+    base64-arraybuffer "^1.0.2"
+
 uuid@^3.3.2, uuid@^3.4.0:
   version "3.4.0"
   resolved "https://registry.nlark.com/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1622213399220&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz"