瀏覽代碼

feat: docs replace func

MetaPunkGames 9 月之前
父節點
當前提交
979dcb4b0d

+ 2 - 1
server/.gitignore

@@ -4,4 +4,5 @@ database/
 bin/
 bin/
 dist/
 dist/
 temp*
 temp*
-!template/
+!template/
+~$*

+ 52 - 2
server/cloud/tbook/func-tbook-export.js

@@ -1,5 +1,8 @@
-
+const { replaceDocx } = require("../../lib/docs");
 const Parse = global.Parse;
 const Parse = global.Parse;
+
+const path = require("path")
+const TemplateDocxPath = path.join(__dirname,"template/模板-推荐申报表.docx")
 /**
 /**
  * 导出流程教材申报文件
  * 导出流程教材申报文件
  */
  */
@@ -7,7 +10,54 @@ async function exportProcessReportDocs(processId) {
     let query = new Parse.Query("EduTextbook")
     let query = new Parse.Query("EduTextbook")
     query.equalTo("eduProcess",processId);
     query.equalTo("eduProcess",processId);
     let textbookList = await query.find();
     let textbookList = await query.find();
+    for (let index = 0; index < textbookList.length; index++) {
+        let textbook = textbookList[index];
+        renderReportDocsByTextbook(textbook)
+    }
     console.log(textbookList);
     console.log(textbookList);
 }
 }
 
 
-module.exports.exportProcessReportDocs = exportProcessReportDocs
+module.exports.exportProcessReportDocs = exportProcessReportDocs
+
+async function renderReportDocsByTextbook(textbook){
+    let json = textbook.toJSON();
+
+    let bookData = {
+        title:padString(json?.title,21),
+        ISBN:padString(json?.ISBN,21),
+    }
+    console.log(bookData)
+    let bookid = json.code || json?.objectId;
+    let tempFileName = path.join(`${bookid}${json.title}.docx`)
+    replaceDocx(TemplateDocxPath,tempFileName,bookData)
+}
+
+
+function padString(str,width) {
+    width = width || 21 // 目标宽度为21个单位
+    spaceChar = "&#160;" // 占位符
+    // 计算字符串的宽度
+    let strWidth = 0;
+    for (let char of str) {
+        // 判断字符是否为中文
+        if (char.match(/[\u4e00-\u9fa5]/)) {
+            strWidth += 4; // 中文字符占4个单位
+        } else {
+            strWidth += 1; // 英文字符占1个单位
+        }
+    }
+
+    const totalPadding = width - strWidth;
+    // 如果已经达到或超过目标宽度,直接返回原字符串
+    if (totalPadding <= 0) {
+        return str;
+    }
+    // 计算左右两侧的空格数
+    const leftPadding = Math.floor(totalPadding / 2) * 3;
+    const rightPadding = Math.ceil(totalPadding / 2) * 3;
+    // 生成填充空格的字符串
+    const leftSpaces = spaceChar.repeat(leftPadding);
+    const rightSpaces = spaceChar.repeat(rightPadding);
+    // 返回补充后的字符串
+    return leftSpaces + str + rightSpaces;
+}

二進制
server/cloud/tbook/template/模板-推荐申报表.docx


+ 94 - 0
server/lib/docs/index.js

@@ -0,0 +1,94 @@
+const fs = require('fs')
+const path = require('path')
+const compressing = require('compressing')
+const rimrif = require('rimraf')
+const shell = require('shelljs');
+
+const crypto = require('crypto');
+
+/**
+ * docx 替换模板字符串内容
+ * @example
+    // 要替换内容的模板
+    let inputDocx = 'cs.docx'
+    // 替换完成的docx文件
+    let outputDocx = 'dd.docx'
+    // {{xx}} 处要替换的内容
+    let replaceData = {
+        name: '替换name处的内容',
+        age: '替换age处的内容',
+    }
+    replaceDocx(inputDocx, outputDocx, replaceData)
+ */
+function replaceDocx(inputDocxPath, outputDocxPath, options) {
+    return new Promise((resolve,reject)=>{
+
+    // 解压出来的临时目录
+    let tempDir = path.join(__dirname , "temp")
+    let md5 = crypto.createHash('md5');
+    let outmd5 = md5.update(outputDocxPath).digest('hex')
+    let tempDocxPath =  path.join(tempDir , outmd5)
+    // 要替换的xml文件位置
+    let tempDocxXMLName = path.join(tempDocxPath,`word/document.xml`)
+
+    // 压缩文件夹为文件
+    let dir_to_docx = (inputFilePath, outputFilePath) => {
+        outputFilePath = path.join(tempDir,outputFilePath)
+        // 创建压缩流
+        let zipStream = new compressing.zip.Stream()
+        // 写出流
+        let outStream = fs.createWriteStream(outputFilePath)
+        fs.readdir(inputFilePath, null, (err, files) => {
+            if (!err) {
+                files.map(file => path.join(inputFilePath, file))
+                    .forEach(file => {
+                        zipStream.addEntry(file)
+                    })
+            }
+        })
+        // 写入文件内容
+        zipStream.pipe(outStream)
+            .on('close', () => {
+                // 打包完成后删除临时目录
+                // console.log(tempDocxPath)
+                shell.rm("-r",tempDocxPath)
+                // rimrif.rimrafSync(tempDocxPath)
+                resolve(true)
+            })
+    }
+
+    // 替换word/document.xml文件中{{xx}}处的内容
+    let replaceXML = (data, text) => {
+        Object.keys(data).forEach(key => {
+            text = text.replaceAll(`{{${key}}}`, data[key])
+        })
+        return text
+    }
+
+    // 解压docx文件替换内容重新打包成docx文件
+    compressing.zip.uncompress(inputDocxPath, tempDocxPath)
+        .then(() => {
+            // 读写要替换内容的xml文件
+            fs.readFile(tempDocxXMLName, null, (err, data) => {
+                if (!err) {
+                    let text = data.toString()
+                    text = replaceXML(options, text)
+                    fs.writeFile(tempDocxXMLName, text, (err) => {
+                        if (!err) {
+                            dir_to_docx(tempDocxPath, outputDocxPath)
+                        } else {
+                            reject(err)
+                        }
+                    })
+                } else {
+                    reject(err)
+                }
+            })
+        }).catch(err => {
+            reject(err)
+        })
+    })
+
+}
+
+module.exports.replaceDocx = replaceDocx

+ 486 - 16
server/package-lock.json

@@ -12,9 +12,11 @@
         "ali-oss": "^6.20.0",
         "ali-oss": "^6.20.0",
         "authing-js-sdk": "^4.23.51",
         "authing-js-sdk": "^4.23.51",
         "authing-node-sdk": "^3.1.0",
         "authing-node-sdk": "^3.1.0",
+        "compressing": "^1.10.1",
         "node-schedule": "^2.1.1",
         "node-schedule": "^2.1.1",
         "parse-dashboard": "^5.4.0",
         "parse-dashboard": "^5.4.0",
         "parse-server": "^7.0.0",
         "parse-server": "^7.0.0",
+        "rimraf": "^6.0.1",
         "shelljs": "^0.8.5",
         "shelljs": "^0.8.5",
         "yargs": "17.7.2"
         "yargs": "17.7.2"
       },
       },
@@ -736,6 +738,15 @@
         "kuler": "^2.0.0"
         "kuler": "^2.0.0"
       }
       }
     },
     },
+    "node_modules/@eggjs/yauzl": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmmirror.com/@eggjs/yauzl/-/yauzl-2.11.0.tgz",
+      "integrity": "sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==",
+      "dependencies": {
+        "buffer-crc32": "~0.2.3",
+        "fd-slicer2": "^1.2.0"
+      }
+    },
     "node_modules/@embedded-postgres/linux-x64": {
     "node_modules/@embedded-postgres/linux-x64": {
       "version": "16.2.0-beta.11",
       "version": "16.2.0-beta.11",
       "resolved": "https://registry.npmmirror.com/@embedded-postgres/linux-x64/-/linux-x64-16.2.0-beta.11.tgz",
       "resolved": "https://registry.npmmirror.com/@embedded-postgres/linux-x64/-/linux-x64-16.2.0-beta.11.tgz",
@@ -1582,6 +1593,95 @@
       "deprecated": "Use @eslint/object-schema instead",
       "deprecated": "Use @eslint/object-schema instead",
       "peer": true
       "peer": true
     },
     },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "dependencies": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+    },
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
     "node_modules/@javascript-obfuscator/escodegen": {
     "node_modules/@javascript-obfuscator/escodegen": {
       "version": "2.3.0",
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz",
       "resolved": "https://registry.npmmirror.com/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz",
@@ -2325,6 +2425,15 @@
         }
         }
       }
       }
     },
     },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/@popperjs/core": {
     "node_modules/@popperjs/core": {
       "version": "2.11.8",
       "version": "2.11.8",
       "resolved": "https://registry.npmmirror.com/@popperjs/core/-/core-2.11.8.tgz",
       "resolved": "https://registry.npmmirror.com/@popperjs/core/-/core-2.11.8.tgz",
@@ -3943,11 +4052,38 @@
         "ieee754": "^1.1.13"
         "ieee754": "^1.1.13"
       }
       }
     },
     },
+    "node_modules/buffer-alloc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+      "dependencies": {
+        "buffer-alloc-unsafe": "^1.1.0",
+        "buffer-fill": "^1.0.0"
+      }
+    },
+    "node_modules/buffer-alloc-unsafe": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+    },
+    "node_modules/buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/buffer-equal-constant-time": {
     "node_modules/buffer-equal-constant-time": {
       "version": "1.0.1",
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
       "resolved": "https://registry.npmmirror.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
       "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
       "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
     },
     },
+    "node_modules/buffer-fill": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/buffer-fill/-/buffer-fill-1.0.0.tgz",
+      "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ=="
+    },
     "node_modules/buffer-from": {
     "node_modules/buffer-from": {
       "version": "1.1.2",
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
       "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -4302,6 +4438,100 @@
         "node": ">=18"
         "node": ">=18"
       }
       }
     },
     },
+    "node_modules/compressing": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmmirror.com/compressing/-/compressing-1.10.1.tgz",
+      "integrity": "sha512-XXwUffcVjqv8NGSQu1ttp6eMmuZ3zZEAec28Rt30o/vkXE20jXhowRQ9LXLY4uOgFkxXrNzApLobpam53Dc1AA==",
+      "dependencies": {
+        "@eggjs/yauzl": "^2.11.0",
+        "flushwritable": "^1.0.0",
+        "get-ready": "^1.0.0",
+        "iconv-lite": "^0.5.0",
+        "mkdirp": "^0.5.1",
+        "pump": "^3.0.0",
+        "streamifier": "^0.1.1",
+        "tar-stream": "^1.5.2",
+        "yazl": "^2.4.2"
+      },
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/compressing/node_modules/bl": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/bl/-/bl-1.2.3.tgz",
+      "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
+      "dependencies": {
+        "readable-stream": "^2.3.5",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node_modules/compressing/node_modules/iconv-lite": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.5.2.tgz",
+      "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/compressing/node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/compressing/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/compressing/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/compressing/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/compressing/node_modules/tar-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-1.6.2.tgz",
+      "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
+      "dependencies": {
+        "bl": "^1.0.0",
+        "buffer-alloc": "^1.2.0",
+        "end-of-stream": "^1.0.0",
+        "fs-constants": "^1.0.0",
+        "readable-stream": "^2.3.0",
+        "to-buffer": "^1.1.1",
+        "xtend": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
     "node_modules/computeds": {
     "node_modules/computeds": {
       "version": "0.0.1",
       "version": "0.0.1",
       "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz",
       "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz",
@@ -4491,7 +4721,6 @@
       "version": "7.0.3",
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "peer": true,
       "dependencies": {
       "dependencies": {
         "path-key": "^3.1.0",
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
         "shebang-command": "^2.0.0",
@@ -4881,6 +5110,11 @@
         "stream-shift": "^1.0.2"
         "stream-shift": "^1.0.2"
       }
       }
     },
     },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+    },
     "node_modules/ecc-jsbn": {
     "node_modules/ecc-jsbn": {
       "version": "0.1.2",
       "version": "0.1.2",
       "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
       "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -5763,6 +5997,14 @@
       "resolved": "https://registry.npmmirror.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz",
       "resolved": "https://registry.npmmirror.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz",
       "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
       "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
     },
     },
+    "node_modules/fd-slicer2": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/fd-slicer2/-/fd-slicer2-1.2.0.tgz",
+      "integrity": "sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==",
+      "dependencies": {
+        "pend": "^1.2.0"
+      }
+    },
     "node_modules/fecha": {
     "node_modules/fecha": {
       "version": "4.2.3",
       "version": "4.2.3",
       "resolved": "https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz",
       "resolved": "https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz",
@@ -5896,12 +6138,33 @@
         "node": "^10.12.0 || >=12.0.0"
         "node": "^10.12.0 || >=12.0.0"
       }
       }
     },
     },
+    "node_modules/flat-cache/node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "peer": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/flatted": {
     "node_modules/flatted": {
       "version": "3.3.1",
       "version": "3.3.1",
       "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz",
       "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz",
       "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
       "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
       "peer": true
       "peer": true
     },
     },
+    "node_modules/flushwritable": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/flushwritable/-/flushwritable-1.0.0.tgz",
+      "integrity": "sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg=="
+    },
     "node_modules/flux": {
     "node_modules/flux": {
       "version": "4.0.4",
       "version": "4.0.4",
       "resolved": "https://registry.npmmirror.com/flux/-/flux-4.0.4.tgz",
       "resolved": "https://registry.npmmirror.com/flux/-/flux-4.0.4.tgz",
@@ -5958,6 +6221,21 @@
         "is-callable": "^1.1.3"
         "is-callable": "^1.1.3"
       }
       }
     },
     },
+    "node_modules/foreground-child": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.2.1.tgz",
+      "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/forever-agent": {
     "node_modules/forever-agent": {
       "version": "0.6.1",
       "version": "0.6.1",
       "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
       "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -6068,8 +6346,7 @@
     "node_modules/fs-constants": {
     "node_modules/fs-constants": {
       "version": "1.0.0",
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
-      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
-      "dev": true
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
     },
     },
     "node_modules/fs-extra": {
     "node_modules/fs-extra": {
       "version": "9.1.0",
       "version": "9.1.0",
@@ -7250,8 +7527,7 @@
     "node_modules/isexe": {
     "node_modules/isexe": {
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "peer": true
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
     },
     },
     "node_modules/isobject": {
     "node_modules/isobject": {
       "version": "3.0.1",
       "version": "3.0.1",
@@ -7271,6 +7547,23 @@
       "resolved": "https://registry.npmmirror.com/iterall/-/iterall-1.3.0.tgz",
       "resolved": "https://registry.npmmirror.com/iterall/-/iterall-1.3.0.tgz",
       "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="
       "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="
     },
     },
+    "node_modules/jackspeak": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-4.0.1.tgz",
+      "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==",
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
     "node_modules/javascript-obfuscator": {
     "node_modules/javascript-obfuscator": {
       "version": "4.1.1",
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/javascript-obfuscator/-/javascript-obfuscator-4.1.1.tgz",
       "resolved": "https://registry.npmmirror.com/javascript-obfuscator/-/javascript-obfuscator-4.1.1.tgz",
@@ -8261,6 +8554,14 @@
         "url": "https://github.com/sponsors/ljharb"
         "url": "https://github.com/sponsors/ljharb"
       }
       }
     },
     },
+    "node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
     "node_modules/mkdirp": {
     "node_modules/mkdirp": {
       "version": "2.1.3",
       "version": "2.1.3",
       "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-2.1.3.tgz",
       "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-2.1.3.tgz",
@@ -8951,6 +9252,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
         "url": "https://github.com/sponsors/sindresorhus"
       }
       }
     },
     },
+    "node_modules/package-json-from-dist": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+      "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="
+    },
     "node_modules/packet-reader": {
     "node_modules/packet-reader": {
       "version": "1.0.0",
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/packet-reader/-/packet-reader-1.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/packet-reader/-/packet-reader-1.0.0.tgz",
@@ -9435,7 +9741,6 @@
       "version": "3.1.1",
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
       "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "peer": true,
       "engines": {
       "engines": {
         "node": ">=8"
         "node": ">=8"
       }
       }
@@ -9445,6 +9750,29 @@
       "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
       "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
     },
     },
+    "node_modules/path-scurry": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.0.tgz",
+      "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+      "dependencies": {
+        "lru-cache": "^11.0.0",
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.0.0.tgz",
+      "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==",
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
     "node_modules/path-to-regexp": {
     "node_modules/path-to-regexp": {
       "version": "6.2.1",
       "version": "6.2.1",
       "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
       "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
@@ -9472,6 +9800,11 @@
         "through": "~2.3"
         "through": "~2.3"
       }
       }
     },
     },
+    "node_modules/pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
+    },
     "node_modules/performance-now": {
     "node_modules/performance-now": {
       "version": "2.1.0",
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
       "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
@@ -11024,16 +11357,62 @@
       }
       }
     },
     },
     "node_modules/rimraf": {
     "node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "deprecated": "Rimraf versions prior to v4 are no longer supported",
-      "peer": true,
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-6.0.1.tgz",
+      "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
       "dependencies": {
       "dependencies": {
-        "glob": "^7.1.3"
+        "glob": "^11.0.0",
+        "package-json-from-dist": "^1.0.0"
       },
       },
       "bin": {
       "bin": {
-        "rimraf": "bin.js"
+        "rimraf": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/rimraf/node_modules/glob": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-11.0.0.tgz",
+      "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^4.0.1",
+        "minimatch": "^10.0.0",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^2.0.0"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/minimatch": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.0.1.tgz",
+      "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": "20 || >=22"
       },
       },
       "funding": {
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
         "url": "https://github.com/sponsors/isaacs"
@@ -11312,7 +11691,6 @@
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "peer": true,
       "dependencies": {
       "dependencies": {
         "shebang-regex": "^3.0.0"
         "shebang-regex": "^3.0.0"
       },
       },
@@ -11324,7 +11702,6 @@
       "version": "3.0.0",
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "peer": true,
       "engines": {
       "engines": {
         "node": ">=8"
         "node": ">=8"
       }
       }
@@ -11679,6 +12056,14 @@
         "node": ">=4.0.0"
         "node": ">=4.0.0"
       }
       }
     },
     },
+    "node_modules/streamifier": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/streamifier/-/streamifier-0.1.1.tgz",
+      "integrity": "sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
     "node_modules/streamsearch": {
     "node_modules/streamsearch": {
       "version": "1.1.0",
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz",
       "resolved": "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -11723,6 +12108,20 @@
         "node": ">=8"
         "node": ">=8"
       }
       }
     },
     },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/stringz": {
     "node_modules/stringz": {
       "version": "2.1.0",
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/stringz/-/stringz-2.1.0.tgz",
       "resolved": "https://registry.npmmirror.com/stringz/-/stringz-2.1.0.tgz",
@@ -11743,6 +12142,18 @@
         "node": ">=8"
         "node": ">=8"
       }
       }
     },
     },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/strip-json-comments": {
     "node_modules/strip-json-comments": {
       "version": "3.1.1",
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
       "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -11986,6 +12397,11 @@
       "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
       "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
       "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA=="
       "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA=="
     },
     },
+    "node_modules/to-buffer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/to-buffer/-/to-buffer-1.1.1.tgz",
+      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
+    },
     "node_modules/to-fast-properties": {
     "node_modules/to-fast-properties": {
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -12832,7 +13248,6 @@
       "version": "2.0.2",
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
       "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "peer": true,
       "dependencies": {
       "dependencies": {
         "isexe": "^2.0.0"
         "isexe": "^2.0.0"
       },
       },
@@ -12969,6 +13384,53 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
       }
     },
     },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
     "node_modules/wrap-ansi/node_modules/ansi-styles": {
     "node_modules/wrap-ansi/node_modules/ansi-styles": {
       "version": "4.3.0",
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -13098,6 +13560,14 @@
         "node": ">=12"
         "node": ">=12"
       }
       }
     },
     },
+    "node_modules/yazl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/yazl/-/yazl-2.5.1.tgz",
+      "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
+      "dependencies": {
+        "buffer-crc32": "~0.2.3"
+      }
+    },
     "node_modules/yocto-queue": {
     "node_modules/yocto-queue": {
       "version": "0.1.0",
       "version": "0.1.0",
       "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",

+ 2 - 0
server/package.json

@@ -31,9 +31,11 @@
     "ali-oss": "^6.20.0",
     "ali-oss": "^6.20.0",
     "authing-js-sdk": "^4.23.51",
     "authing-js-sdk": "^4.23.51",
     "authing-node-sdk": "^3.1.0",
     "authing-node-sdk": "^3.1.0",
+    "compressing": "^1.10.1",
     "node-schedule": "^2.1.1",
     "node-schedule": "^2.1.1",
     "parse-dashboard": "^5.4.0",
     "parse-dashboard": "^5.4.0",
     "parse-server": "^7.0.0",
     "parse-server": "^7.0.0",
+    "rimraf": "^6.0.1",
     "shelljs": "^0.8.5",
     "shelljs": "^0.8.5",
     "yargs": "17.7.2"
     "yargs": "17.7.2"
   },
   },