Forráskód Böngészése

feat: export upload tbook with basicinfo

ryanemax 7 hónapja
szülő
commit
a053f88ae5

+ 1 - 1
docker-front

@@ -1 +1 @@
-Subproject commit 358be7327229e41502eb135e681309929f34ed72
+Subproject commit fa9142c46427d306cdc0025ef9466717265d83e3

+ 2 - 1
server/.gitignore

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

+ 125 - 11
server/cloud/tbook/func-tbook-export.js

@@ -1,56 +1,170 @@
-const { replaceDocx, docsToPdf } = require("../../lib/docs");
+const { replaceDocx, docsToPdf, createZip, uploadFileToOSS } = require("../../lib/docs");
 const Parse = global.Parse;
 
 const path = require("path")
 const TemplateDocxPath = path.join(__dirname,"template/模板-推荐申报表.docx")
 /**
  * 导出流程教材申报文件
+ * @returns
+ * docsList
+ * zipUrl
  */
 async function exportProcessReportDocs(processId) {
     let query = new Parse.Query("EduTextbook")
     query.equalTo("eduProcess",processId);
     let textbookList = await query.find();
+    let docsList = []
     for (let index = 0; index < textbookList.length; index++) {
         let textbook = textbookList[index];
-        renderReportDocsByTextbook(textbook)
+        let result = await renderReportDocsByTextbook(textbook);
+        docsList.push(result)
     }
     console.log(textbookList);
+    console.log(docsList)
+    let zipPath,zipUrl
+    if(docsList?.length){
+        zipPath = await createZip(docsList?.map(item=>item?.filePath),`流程合集-${processId}.zip`)
+        if(zipPath){
+            zipUrl = (await uploadFileToOSS(zipPath))?.url || null
+        }
+        docsList = docsList.map(item=>{return {code:item.code,title:item.title,url:item?.url}})
+    }
+
+    let result = {
+        docsList,
+        zipUrl
+    }
+    return result
 }
 
 module.exports.exportProcessReportDocs = exportProcessReportDocs
 
-async function renderReportDocsByTextbook(textbook){
+function renderReportDocsByTextbook(textbook){
     let json = textbook.toJSON();
 
     // 圆圈选中未选 ○ 未选 ● 选中
     let circleCheck = ["○","●"];
-    let squareCheck = [``,`☑`];
     // 方块选中未选 ○ 未选 ● 选中
+    let squareCheck = [``,`☑`];
+
+    // 联系电话:默认为作者首个存在的电话;
+    let mobile = json?.authorList?.find(item => item.mobile)?.mobile || ""
+    // 填报时间:默认为创建时间
+    let createdAt = new Date(textbook?.createdAt);
+    let createdDate = `${createdAt?.getFullYear()}年${createdAt?.getMonth()+1}月${createdAt?.getDate()}日`;
+    // 专业代码:前四位
+    let majorCode = json?.majorId || json?.major?.code
+    if(majorCode?.length>4){
+        majorCode = majorCode.slice(0,4)
+    }
+    let majorName = json?.majorName || json?.major?.name
+    // 是否重点立项
+    let isJC = circleCheck[(json?.approval?.indexOf("基础")>-1)?1:0];
+    let isZL = circleCheck[(json?.approval?.indexOf("战略")>-1)?1:0];
+    let isSX = circleCheck[(json?.approval?.indexOf("四新")>-1)?1:0];
+    let isNotImpt = (json?.approval?.indexOf("基础")==-1) && (json?.approval?.indexOf("战略")==-1) && (json?.approval?.indexOf("四新")==-1)
+    isNotImpt = circleCheck[isNotImpt?1:0];
+    // 初版时间
+    let firstDate = new Date(textbook?.get("editionFirst"));
+    let firstYear = firstDate?.getFullYear();
+    let firstMonth = firstDate?.getMonth()+1;
+    // 本版时间印次
+    let currentDate = new Date(textbook?.get("editionDate"));
+    let currentYear = currentDate?.getFullYear();
+    let currentMonth = currentDate?.getMonth()+1;
+    // 最新时间印次
+    let latestDate = new Date(textbook?.get("printDate"));
+    let latestYear = latestDate?.getFullYear();
+    let latestMonth = latestDate?.getMonth()+1;
+    // 初版至今重点项目
+    let isBSQT =  !((json?.importantProject?.indexOf("建设")>-1) || (json?.importantProject?.indexOf("本科国家")>-1) || (json?.importantProject?.indexOf("省级优秀")>-1) || (json?.importantProject?.indexOf("省级规划")>-1))// 是否其他省级奖项
+
     let bookData = {
-        title:padString(json?.title,21),
+        // 封面信息
+        titlePad:padString(json?.title,21),
         ISBN:padString(json?.ISBN,21),
-        one:squareCheck[(json?.type=="单本"||json?.type=="单册")?1:0], // 单本/单册 ○ 未选 ● 选中
+        one:squareCheck[(json?.type=="单本"||json?.type=="单册")?1:0], // 单本/单册 方框
         full:squareCheck[json?.type=="全册"?1:0], // 全册
+        oneCircle:circleCheck[(json?.type=="单本"||json?.type=="单册")?1:0], // 单本/单册 圆圈
+        fullCircle:circleCheck[json?.type=="全册"?1:0], // 全册
+        tn:json?.typeNumber,
+        authorPad:padString(json?.author,21),
+        mobile:padString(mobile,21),
+        authorUnit:padString(json?.unit,21),
+        publisherPad:padString(json?.editionUnit,21),
+        recommandUnit:padString("",21), // 未找到
+        majorCodePad:padString((majorCode),14),
+        createdDate:padString(createdDate,21),
+        // 基本信息
+        title:json?.title,
+        author:json?.author,
+        unit:json?.unit,
+        mc:majorCode,
+        mn:majorName,
+        lCN:circleCheck[(json?.lang=="中文")?1:0],
+        lEN:circleCheck[(json?.lang=="英文")?1:0],
+        lOT:circleCheck[(json?.lang?.indexOf("其他")>-1)?1:0],
+        lSS:circleCheck[(json?.lang?.indexOf("少数")>-1)?1:0],
+        authors:json?.authors, // 其他主编
+        editor:json?.editor, // 其他编者
+        isJC:isJC,
+        isZL:isZL,
+        isSX:isSX,
+        isNotImpt:isNotImpt,
+        publisher:json?.editionUnit,
+        firstYear:firstYear,
+        firstMonth:firstMonth,
+        isZZ:circleCheck[(json?.carrierShape?.indexOf("纸质")>-1)?1:0],
+        isDZ:circleCheck[(json?.carrierShape?.indexOf("电子")>-1)?1:0],
+        isSZ:circleCheck[(json?.carrierShape?.indexOf("数字")>-1)?1:0],
+        isQT:circleCheck[(json?.carrierShape?.indexOf("附带")>-1)?1:0],
+        isFD:circleCheck[(json?.carrierShape?.indexOf("其他")>-1)?1:0],
+        latestY:latestYear,
+        latestM:latestMonth,
+        latestNum:json?.printNumber || "",
+        currentY:currentYear,
+        currentM:currentMonth,
+        currentNum:json?.editionNumber || "",
+        printSum:json?.printSum || "",
+        isJS:circleCheck[(json?.importantProject?.indexOf("建设")>-1)?1:0],
+        isBGJ:circleCheck[(json?.importantProject?.indexOf("本科国家")>-1)?1:0],
+        isBSYX:circleCheck[(json?.importantProject?.indexOf("省级优秀")>-1)?1:0],
+        isBSGH:circleCheck[(json?.importantProject?.indexOf("省级规划")>-1)?1:0],
+        isBSQT:circleCheck[isBSQT?1:0],
+        bsqtName:isBSQT?json?.importantProject:"",
+        isFirstNot:circleCheck[json?.importantProject?0:1],
     }
     console.log(bookData)
     let bookid = json.code || json?.objectId;
     let tempFileName = path.join(`${bookid}${json.title}.docx`)
-    replaceDocx(TemplateDocxPath,tempFileName,bookData,{onDocxComplete:(filePath)=>{
-        // 需要API支持
-        // docsToPdf(filePath)
-    }})
+    return new Promise((resolve)=>{
+        replaceDocx(TemplateDocxPath,tempFileName,bookData,{onDocxComplete:async (filePath)=>{
+            // 需要API支持
+            // docsToPdf(filePath)
+            let url = (await uploadFileToOSS(filePath))?.url || null
+            resolve({
+                code:bookid,
+                title:json?.title,
+                filePath,
+                url
+            })
+        }})
+    })
 }
 
 
 function padString(str,width) {
+    str = str || ""
+    str = String(str)
     width = width || 21 // 目标宽度为21个单位
     spaceChar = "&#160;" // 占位符
     // 计算字符串的宽度
     let strWidth = 0;
+    console.log(str)
     for (let char of str) {
         // 判断字符是否为中文
         if (char.match(/[\u4e00-\u9fa5]/)) {
-            strWidth += 4; // 中文字符占4个单位
+            strWidth += 2; // 中文字符占4个单位
         } else {
             strWidth += 1; // 英文字符占1个单位
         }

BIN
server/cloud/tbook/template/模板-推荐申报表.docx


+ 4 - 1
server/cloud/tbook/test/test-export.js

@@ -5,4 +5,7 @@ global.Parse = Parse;
 
 const { exportProcessReportDocs } = require("../func-tbook-export");
 
-exportProcessReportDocs("Wz34loxdbO")
+async function main(){
+    console.log(await exportProcessReportDocs("Wz34loxdbO"))
+}
+main()

+ 82 - 1
server/lib/docs/index.js

@@ -7,6 +7,88 @@ const shell = require('shelljs');
 const crypto = require('crypto');
 
 const { LibreOffice } = require("chromiumly");
+const tempDir = path.join(__dirname , "temp")
+
+const OSS = require("ali-oss");
+const ALI_OSS_BUCKET = process.env.ALI_OSS_BUCKET || "hep-textbook"
+const ALI_OSS_ACCESS_KEY_ID = process.env.ALI_OSS_ACCESS_KEY_ID || "LTAI5t6AbTiAvXmeoVdJZhL3"
+const ALI_OSS_ACCESS_KEY_SECRET = process.env.ALI_OSS_ACCESS_KEY_SECRET || "KLtQRdIW69KLP7jnzHNUf7eKmdptxH"
+
+async function uploadFileToOSS(filePath){
+    let client = new OSS({
+        // yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
+        region: "oss-cn-beijing",
+        accessKeyId: ALI_OSS_ACCESS_KEY_ID,
+        accessKeySecret: ALI_OSS_ACCESS_KEY_SECRET,
+        // 填写Bucket名称。
+        bucket: ALI_OSS_BUCKET || "hep-textbook",
+    });
+
+    let now = new Date();
+    let fileName = getFileName(filePath);
+    let fileKey = `export/report/${fileName}`;
+    const r1 = await client?.put(fileKey, filePath);
+    console.log('put success: %j', r1);
+    return r1
+}
+function getFileName(filePath) {
+    // 使用 '/' 或 '\' 作为分隔符,分割路径
+    const parts = filePath.split(/[/\\]/);
+    // 返回最后一个部分,即文件名
+    return parts.pop();
+}
+module.exports.uploadFileToOSS = uploadFileToOSS
+
+/**
+ * 将给定的文件路径数组打包成指定名称的zip压缩包
+ * @param {Array<string>} filePathList - 要打包的文件路径数组
+ * @param {string} outputZipName - 输出的zip文件名称
+ */
+ function createZip(filePathList, outputZipName) {
+    let zipStream = new compressing.zip.Stream();
+    return new Promise((resolve)=>{
+        try {
+            let outputPath = path.join(tempDir,outputZipName)
+            // 遍历文件路径列表,将每个文件添加到zip流中
+            for (const filePath of filePathList) {
+                // 检查文件是否存在
+                if (fs.existsSync(filePath)) {
+                    // 将文件添加到zip流中
+                    zipStream.addEntry(filePath);
+                } else {
+                    console.error(`文件不存在: ${filePath}`);
+                }
+            }
+            
+            // 创建一个写入流
+            const output = fs.createWriteStream(outputPath);
+            
+            // 使用 compressing 库的 zip 方法将文件打包
+            console.log(filePathList)
+            // await compressing.zip.compressDir(filePathList, output);
+            // 将zip流写入文件
+            zipStream.pipe(output);
+
+            output.on('finish', () => {
+                console.log(`成功创建压缩包: ${outputPath}`);
+                resolve(outputPath)
+            });
+
+            output.on('error', (error) => {
+                console.error('写入压缩包时出错:', error);
+                resolve(null)
+            });
+
+            // console.log(`成功创建压缩包: ${outputPath}`);
+            // return outputPath
+        } catch (error) {
+            console.error('创建压缩包时出错:', error);
+            return null
+        }
+    })
+
+}
+module.exports.createZip = createZip
 
 /**
  * 将 DOCX 文件转换为 PDF
@@ -63,7 +145,6 @@ function replaceDocx(inputDocxPath, outputDocxPath, options,eventMap) {
     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)

+ 2 - 430
server/package-lock.json

@@ -14,7 +14,6 @@
         "authing-node-sdk": "^3.1.0",
         "chromiumly": "^3.6.0",
         "compressing": "^1.10.1",
-        "docx-pdf": "^0.0.1",
         "node-schedule": "^2.1.1",
         "parse-dashboard": "^5.4.0",
         "parse-server": "^7.0.0",
@@ -3407,14 +3406,6 @@
       "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==",
       "dev": true
     },
-    "node_modules/@xmldom/xmldom": {
-      "version": "0.8.10",
-      "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
-      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
     "node_modules/@xstate/fsm": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/@xstate/fsm/-/fsm-1.4.0.tgz",
@@ -3937,11 +3928,6 @@
         "readable-stream": "^3.4.0"
       }
     },
-    "node_modules/bluebird": {
-      "version": "3.4.7",
-      "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz",
-      "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA=="
-    },
     "node_modules/body-parser": {
       "version": "1.20.2",
       "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.2.tgz",
@@ -4103,7 +4089,7 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/buffer-writer": {
       "version": "2.0.0",
@@ -4574,51 +4560,6 @@
       "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
-    "node_modules/concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "engines": [
-        "node >= 0.8"
-      ],
-      "optional": true,
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "node_modules/concat-stream/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==",
-      "optional": true,
-      "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/concat-stream/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==",
-      "optional": true
-    },
-    "node_modules/concat-stream/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==",
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
     "node_modules/config": {
       "version": "3.3.12",
       "resolved": "https://registry.npmmirror.com/config/-/config-3.3.12.tgz",
@@ -5144,11 +5085,6 @@
       "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
       "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
     },
-    "node_modules/dingbat-to-unicode": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz",
-      "integrity": "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w=="
-    },
     "node_modules/dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5183,15 +5119,6 @@
         "node": ">=6.0.0"
       }
     },
-    "node_modules/docx-pdf": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmmirror.com/docx-pdf/-/docx-pdf-0.0.1.tgz",
-      "integrity": "sha512-JbQ7w2ZPRzJGY2uLjL5nCAtCtjRoiZS2YYh7eVjax5K6XIFSEalt5FyK3OLwac37qLywtBlx3TG+z1MqYTA0Vw==",
-      "dependencies": {
-        "html-pdf": "^2.1.0",
-        "mammoth": "^1.3.4"
-      }
-    },
     "node_modules/dotenv": {
       "version": "16.4.5",
       "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.5.tgz",
@@ -5212,14 +5139,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/duck": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmmirror.com/duck/-/duck-0.1.12.tgz",
-      "integrity": "sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==",
-      "dependencies": {
-        "underscore": "^1.13.1"
-      }
-    },
     "node_modules/duplexify": {
       "version": "4.1.3",
       "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-4.1.3.tgz",
@@ -5408,12 +5327,6 @@
       "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==",
       "dev": true
     },
-    "node_modules/es6-promise": {
-      "version": "4.2.8",
-      "resolved": "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz",
-      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
-      "optional": true
-    },
     "node_modules/es6-symbol": {
       "version": "3.1.4",
       "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
@@ -6006,48 +5919,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/extract-zip": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-1.7.0.tgz",
-      "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
-      "optional": true,
-      "dependencies": {
-        "concat-stream": "^1.6.2",
-        "debug": "^2.6.9",
-        "mkdirp": "^0.5.4",
-        "yauzl": "^2.10.0"
-      },
-      "bin": {
-        "extract-zip": "cli.js"
-      }
-    },
-    "node_modules/extract-zip/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "optional": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/extract-zip/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==",
-      "optional": true,
-      "dependencies": {
-        "minimist": "^1.2.6"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/extract-zip/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "optional": true
-    },
     "node_modules/extsprintf": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -6167,15 +6038,6 @@
       "resolved": "https://registry.npmmirror.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz",
       "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
     },
-    "node_modules/fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
-      "optional": true,
-      "dependencies": {
-        "pend": "~1.2.0"
-      }
-    },
     "node_modules/fd-slicer2": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/fd-slicer2/-/fd-slicer2-1.2.0.tgz",
@@ -6847,7 +6709,7 @@
       "version": "4.2.11",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/graphemer": {
       "version": "1.4.0",
@@ -7063,28 +6925,6 @@
       "resolved": "https://registry.npmmirror.com/has-unicode/-/has-unicode-2.0.1.tgz",
       "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
     },
-    "node_modules/hasha": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmmirror.com/hasha/-/hasha-2.2.0.tgz",
-      "integrity": "sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==",
-      "optional": true,
-      "dependencies": {
-        "is-stream": "^1.0.1",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/hasha/node_modules/is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/hasown": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
@@ -7134,21 +6974,6 @@
       ],
       "optional": true
     },
-    "node_modules/html-pdf": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmmirror.com/html-pdf/-/html-pdf-2.2.0.tgz",
-      "integrity": "sha512-k4F0znJNVx5ViGEq2HlQIcI8eosSOxFQBbwj8zBqYPT7xx508IDamIhmXiJNha7xuJqRIxn70beDn1qMgYlEdw==",
-      "deprecated": "Please migrate your projects to a newer library like puppeteer",
-      "bin": {
-        "html-pdf": "bin/index.js"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      },
-      "optionalDependencies": {
-        "phantomjs-prebuilt": "^2.1.4"
-      }
-    },
     "node_modules/http-cache-semantics": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
@@ -7290,11 +7115,6 @@
         "node": ">= 4"
       }
     },
-    "node_modules/immediate": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
-      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
-    },
     "node_modules/immutable": {
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz",
@@ -8210,44 +8030,6 @@
       "resolved": "https://registry.npmmirror.com/jstoxml/-/jstoxml-2.2.9.tgz",
       "integrity": "sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw=="
     },
-    "node_modules/jszip": {
-      "version": "3.10.1",
-      "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz",
-      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
-      "dependencies": {
-        "lie": "~3.3.0",
-        "pako": "~1.0.2",
-        "readable-stream": "~2.3.6",
-        "setimmediate": "^1.0.5"
-      }
-    },
-    "node_modules/jszip/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/jszip/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/jszip/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/jwa": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/jwa/-/jwa-2.0.0.tgz",
@@ -8290,12 +8072,6 @@
       "resolved": "https://registry.npmmirror.com/jwt-decode/-/jwt-decode-2.2.0.tgz",
       "integrity": "sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ=="
     },
-    "node_modules/kew": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmmirror.com/kew/-/kew-0.7.0.tgz",
-      "integrity": "sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==",
-      "optional": true
-    },
     "node_modules/keygrip": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/keygrip/-/keygrip-1.1.0.tgz",
@@ -8315,15 +8091,6 @@
         "json-buffer": "3.0.1"
       }
     },
-    "node_modules/klaw": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmmirror.com/klaw/-/klaw-1.3.1.tgz",
-      "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
-      "optional": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.9"
-      }
-    },
     "node_modules/kolorist": {
       "version": "1.8.0",
       "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz",
@@ -8376,14 +8143,6 @@
       "integrity": "sha512-F/R50HQuWWYcmU/esP5jrH5LiWYaN7DpN0a/99U8+mnGGtnx8kmRE+649dQh3v+CowXXZc8vpkf5AmYkO0AQ7Q==",
       "dev": true
     },
-    "node_modules/lie": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz",
-      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
-      "dependencies": {
-        "immediate": "~3.0.5"
-      }
-    },
     "node_modules/limiter": {
       "version": "1.1.5",
       "resolved": "https://registry.npmmirror.com/limiter/-/limiter-1.1.5.tgz",
@@ -8587,16 +8346,6 @@
         "loose-envify": "cli.js"
       }
     },
-    "node_modules/lop": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmmirror.com/lop/-/lop-0.4.1.tgz",
-      "integrity": "sha512-9xyho9why2A2tzm5aIcMWKvzqKsnxrf9B5I+8O30olh6lQU8PH978LqZoI4++37RBgS1Em5i54v1TFs/3wnmXQ==",
-      "dependencies": {
-        "duck": "^0.1.12",
-        "option": "~0.2.1",
-        "underscore": "^1.13.1"
-      }
-    },
     "node_modules/lowercase-keys": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
@@ -8658,50 +8407,6 @@
         "@jridgewell/sourcemap-codec": "^1.4.15"
       }
     },
-    "node_modules/mammoth": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmmirror.com/mammoth/-/mammoth-1.8.0.tgz",
-      "integrity": "sha512-pJNfxSk9IEGVpau+tsZFz22ofjUsl2mnA5eT8PjPs2n0BP+rhVte4Nez6FdgEuxv3IGI3afiV46ImKqTGDVlbA==",
-      "dependencies": {
-        "@xmldom/xmldom": "^0.8.6",
-        "argparse": "~1.0.3",
-        "base64-js": "^1.5.1",
-        "bluebird": "~3.4.0",
-        "dingbat-to-unicode": "^1.0.1",
-        "jszip": "^3.7.1",
-        "lop": "^0.4.1",
-        "path-is-absolute": "^1.0.0",
-        "underscore": "^1.13.1",
-        "xmlbuilder": "^10.0.0"
-      },
-      "bin": {
-        "mammoth": "bin/mammoth"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/mammoth/node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "node_modules/mammoth/node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
-    },
-    "node_modules/mammoth/node_modules/xmlbuilder": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
-      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
     "node_modules/markdown-it": {
       "version": "12.3.2",
       "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-12.3.2.tgz",
@@ -9365,11 +9070,6 @@
         "opencollective-postinstall": "index.js"
       }
     },
-    "node_modules/option": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmmirror.com/option/-/option-0.2.4.tgz",
-      "integrity": "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A=="
-    },
     "node_modules/optionator": {
       "version": "0.9.4",
       "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz",
@@ -9602,11 +9302,6 @@
       "resolved": "https://registry.npmmirror.com/packet-reader/-/packet-reader-1.0.0.tgz",
       "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
     },
-    "node_modules/pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
-    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
@@ -10271,69 +9966,6 @@
         "split2": "^4.1.0"
       }
     },
-    "node_modules/phantomjs-prebuilt": {
-      "version": "2.1.16",
-      "resolved": "https://registry.npmmirror.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
-      "integrity": "sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==",
-      "deprecated": "this package is now deprecated",
-      "hasInstallScript": true,
-      "optional": true,
-      "dependencies": {
-        "es6-promise": "^4.0.3",
-        "extract-zip": "^1.6.5",
-        "fs-extra": "^1.0.0",
-        "hasha": "^2.2.0",
-        "kew": "^0.7.0",
-        "progress": "^1.1.8",
-        "request": "^2.81.0",
-        "request-progress": "^2.0.1",
-        "which": "^1.2.10"
-      },
-      "bin": {
-        "phantomjs": "bin/phantomjs"
-      }
-    },
-    "node_modules/phantomjs-prebuilt/node_modules/fs-extra": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-1.0.0.tgz",
-      "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==",
-      "optional": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^2.1.0",
-        "klaw": "^1.0.0"
-      }
-    },
-    "node_modules/phantomjs-prebuilt/node_modules/jsonfile": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-2.4.0.tgz",
-      "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
-      "optional": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/phantomjs-prebuilt/node_modules/progress": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmmirror.com/progress/-/progress-1.1.8.tgz",
-      "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/phantomjs-prebuilt/node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "optional": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
     "node_modules/picocolors": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz",
@@ -10351,27 +9983,6 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "node_modules/pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
-      "optional": true,
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/pkg": {
       "version": "5.8.1",
       "resolved": "https://registry.npmmirror.com/pkg/-/pkg-5.8.1.tgz",
@@ -11639,15 +11250,6 @@
         "node": ">= 4"
       }
     },
-    "node_modules/request-progress": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/request-progress/-/request-progress-2.0.1.tgz",
-      "integrity": "sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA==",
-      "optional": true,
-      "dependencies": {
-        "throttleit": "^1.0.0"
-      }
-    },
     "node_modules/request/node_modules/form-data": {
       "version": "2.3.3",
       "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
@@ -12797,15 +12399,6 @@
         "node": ">=0.8"
       }
     },
-    "node_modules/throttleit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/throttleit/-/throttleit-1.0.1.tgz",
-      "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
-      "optional": true,
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
@@ -13007,12 +12600,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
-      "optional": true
-    },
     "node_modules/typescript": {
       "version": "4.8.3",
       "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.3.tgz",
@@ -13063,11 +12650,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/underscore": {
-      "version": "1.13.6",
-      "resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.13.6.tgz",
-      "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
-    },
     "node_modules/undici-types": {
       "version": "5.26.5",
       "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz",
@@ -14018,16 +13600,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
-      "optional": true,
-      "dependencies": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    },
     "node_modules/yazl": {
       "version": "2.5.1",
       "resolved": "https://registry.npmmirror.com/yazl/-/yazl-2.5.1.tgz",