ZaiZai 1 year ago
parent
commit
2cc1cd1a20
9 changed files with 616 additions and 4 deletions
  1. 5 0
      package.json
  2. 64 0
      public/backup.js
  3. 3 0
      public/version.json
  4. 76 0
      scripts/build.js
  5. 116 0
      scripts/build.sh
  6. 28 0
      scripts/public.js
  7. 22 0
      scripts/restore.js
  8. 65 0
      scripts/zip.js
  9. 237 4
      yarn.lock

+ 5 - 0
package.json

@@ -5,6 +5,10 @@
     "scripts": {
         "dev": "vite",
         "build": "vite build",
+        "build:zip": "sh ./scripts/build.sh all",
+        "build:zip:wgt": "sh ./scripts/build.sh wgt",
+        "build:test": "sh ./scripts/build.sh all test",
+        "build:test:wgt": "sh ./scripts/build.sh wgt test",
         "lint": "eslint --ext .js,.vue src",
         "lint:fix": "eslint . --fix"
     },
@@ -27,6 +31,7 @@
         "@unocss/eslint-config": "^0.53.5",
         "@vitejs/plugin-vue": "^4.2.3",
         "@vue/compiler-sfc": "^3.3.4",
+        "archiver": "^5.3.1",
         "eslint": "^8.44.0",
         "eslint-plugin-vue": "^9.15.1",
         "sass": "^1.63.6",

+ 64 - 0
public/backup.js

@@ -0,0 +1,64 @@
+const path = require('path');
+const fs = require('fs');
+
+// 获取当前命令行上下文路径
+const currentDirectory = process.cwd();
+console.log(`----------------------------`)
+
+const backupPath = path.join(currentDirectory, '/backup/')
+
+//获取文件列表
+const files = fs.readdirSync(backupPath);
+if (files.length > 5) {
+    //遍历文件列表
+    console.log(`准备清理备份文件...`)
+    let newfiles = []
+    files.forEach((file) => {
+        const time = file.split('_');
+        if (time.length >= 2) {
+            newfiles.push({time: time[0], file: file})
+        }
+    })
+    //文件列表排序
+    newfiles = arrKeySort(newfiles, 'time', 'desc');
+    //移除文件
+    newfiles.forEach((item, index) => {
+        if (index >= 5) {
+            fs.unlinkSync(backupPath + item.file);
+            console.log(`已清理${item.file}`)
+        }
+    })
+    console.log('---------- 清理完成 ----------')
+} else {
+    console.log(`备份文件小于5份,不执行清理操作...`)
+}
+
+
+//数组对象排序
+function arrKeySort(arr, field = 'id', order = 'asc')
+{
+    return arr.sort(arrCompare(field, order));
+}
+
+function arrCompare(key, order = 'asc')
+{
+    return function innerSort(a, b) {
+        if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
+            // 该属性在任何一个对象上都不存在
+            return 0;
+        }
+        const varA = (typeof a[key] === 'string')
+            ? a[key].toUpperCase() : a[key];
+        const varB = (typeof b[key] === 'string')
+            ? b[key].toUpperCase() : b[key];
+        let comparison = 0;
+        if (varA > varB) {
+            comparison = 1;
+        } else if (varA < varB) {
+            comparison = -1;
+        }
+        return (
+            (order === 'desc') ? (comparison * -1) : comparison
+        );
+    };
+}

+ 3 - 0
public/version.json

@@ -0,0 +1,3 @@
+{
+  "value": "20230721115820"
+}

+ 76 - 0
scripts/build.js

@@ -0,0 +1,76 @@
+const path = require('path')
+const fs = require('fs')
+
+// 获取当前命令行上下文路径
+const currentDirectory = process.cwd()
+console.log('----------------------------')
+console.log('正在处理编译打包前的准备...')
+
+//修改版本更新信息
+console.log('更新版本更新信息...')
+const versionPath = path.join(currentDirectory, '/public/version.json')
+const versionContent = fs.readFileSync(versionPath, 'utf8')
+//修改配置文件
+const versionJson = JSON.parse(versionContent)
+versionJson.value = dateFormat(new Date()) //版本号
+
+//更新版本更新信息
+fs.writeFileSync(versionPath, JSON.stringify(versionJson, null, 2))
+
+console.log('----------------------------')
+
+//删除上次打包相关的文件
+console.log('正在删除上次打包相关的文件...')
+const distZipPath = path.join(currentDirectory, '/zip/data.zip')
+if (fs.existsSync(distZipPath)) {
+    fs.unlinkSync(distZipPath)
+}
+
+// 获取配置文件
+console.log('获取当前的配置文件...')
+const indexJsonPath = path.join(currentDirectory, 'src/config/index.json')
+const indexJsonContent = fs.readFileSync(indexJsonPath, 'utf8')
+
+// 检测上次打包异常中断的缓存文件是否存在
+console.log('检测上次打包异常中断的缓存文件是否存在...')
+const cacheFilePath = path.join(currentDirectory, 'scripts/cache.json')
+if (!fs.existsSync(cacheFilePath)) {
+    //创建缓存文件
+    console.log('创建配置缓存文件...')
+    const cacheJsonPath = path.join(currentDirectory, 'scripts/cache.json')
+    fs.writeFileSync(cacheJsonPath, indexJsonContent, 'utf8')
+}
+
+//修改配置文件
+const indexJson = JSON.parse(indexJsonContent)
+indexJson.version = dateFormat(new Date()) //版本号
+indexJson.target = 'http://127.0.0.1:8090' //接口地址
+indexJson.smsPhone = '' //短信接口手机号
+indexJson.vite = {} //vite配置
+
+//更新配置文件
+console.log('修改配置文件为生产环境的配置...')
+fs.writeFileSync(indexJsonPath, JSON.stringify(indexJson, null, 2))
+
+//时间格式化
+function dateFormat(date) {
+    let format = 'yyyyMMddhhmmss'
+    let o = {
+        'M+': date.getMonth() + 1, //month
+        'd+': date.getDate(), //day
+        'h+': date.getHours(), //hour
+        'm+': date.getMinutes(), //minute
+        's+': date.getSeconds(), //second
+        'q+': Math.floor((date.getMonth() + 3) / 3), //quarter
+        'S': date.getMilliseconds(), //millisecond
+    }
+    if (/(y+)/.test(format)) {
+        format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
+    }
+    for (let k in o) {
+        if (new RegExp('(' + k + ')').test(format)) {
+            format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length))
+        }
+    }
+    return format
+}

+ 116 - 0
scripts/build.sh

@@ -0,0 +1,116 @@
+#!/bin/bash
+
+#本地压缩文件名
+file_name="data.zip"
+
+#测试服器上的目录地址
+file_path="dv.hczcxx.cn"
+
+#测试服务器上的演示地址
+demo_url="http://192.168.0.109:5178/"
+
+#测试服务器上的登录密码
+passwd="admin123@"
+
+# 打包前的准备
+node ./scripts/build.js
+# 执行打包命令
+vite build
+# 恢复配置文件
+node ./scripts/restore.js
+# 排除打包文件
+if [ $1 == "wgt" ]; then
+    node ./scripts/public.js
+fi
+# 执行打包为zip
+node ./scripts/zip.js
+
+current_time=$(date "+%Y%m%d%H%M%S")
+
+ # 上传到测试服务器
+function testServer() {
+    expect -c "
+        spawn scp ./zip/${file_name} root@192.168.0.109:/www/wwwroot/${file_path}
+        expect {
+            \"yes/no\" {send \"yes\r\";exp_continue;}
+            \"*password\" {set timeout 500;send \"${passwd}\r\";}
+        }
+    expect eof"
+
+#服务器上的相关操作
+/usr/bin/expect << EOF
+    set time 30
+    spawn ssh root@192.168.0.109
+    expect {
+        "*yes/no" { send "yes\r"; exp_continue }
+        "*password:" { send "${passwd}\r" }
+    }
+
+    # 进入当前项目的目录
+    expect "*]#"
+    send "cd /www/wwwroot/${file_path}\r"
+
+    # 删除 static 目录
+    expect "*]#"
+    send "rm -rf static\r"
+
+    # 解压上传的文件压缩包
+    expect "*]#"
+    send "unzip -o ${file_name}\r"
+
+    # 备份上一次的压缩文件
+    expect "*]#"
+    send "mv ./backup/${file_name} ./backup/${current_time}_${file_name}\r"
+
+    # 执行清理备份文件脚本
+    expect "*]#"
+    send "node ./backup.js\r"
+
+    # 移动当前文件到备份目录
+    expect "*]#"
+    send "mv ./${file_name} ./backup/${file_name}\r"
+
+    # 退出
+    send "exit\r"
+    expect eof
+EOF
+    echo "编译打包后自动部署到测试服务器上完成"
+    echo "测试服务器地址:${demo_url}"
+}
+
+# 删除 plugins 等目录
+function delPublic() {
+    echo "准备移除 plugins 等目录"
+#服务器上的相关操作
+/usr/bin/expect << EOF
+    set time 30
+    spawn ssh root@192.168.0.109
+    expect {
+        "*yes/no" { send "yes\r"; exp_continue }
+        "*password:" { send "${passwd}\r" }
+    }
+
+    # 进入当前项目的目录
+    expect "*]#"
+    send "cd /www/wwwroot/${file_path}\r"
+
+    # 删除 plugins 目录
+    expect "*]#"
+    send "rm -rf plugins\r"
+
+    # 退出
+    send "exit\r"
+    expect eof
+EOF
+    echo "plugins 等目录移除完成"
+}
+
+ # 上传到测试服务器
+if [ $2 == "test" ]; then
+    if [ $1 == "all" ]; then
+        delPublic
+    fi
+    testServer
+else
+    echo "编译完成"
+fi

+ 28 - 0
scripts/public.js

@@ -0,0 +1,28 @@
+const path = require('path')
+const fs = require('fs')
+
+// 获取当前命令行上下文路径
+const currentDirectory = process.cwd()
+
+console.log('----------------------------')
+console.log('项目编译打包完成,准备移除非必要的 /dist/plugins 文件夹...')
+const dist_plugins = path.join(currentDirectory, '/dist/plugins')
+if (fs.existsSync(dist_plugins)) {
+    delallfilerid(dist_plugins)
+    fs.rmdirSync(dist_plugins)
+    console.log('移除非必要的 /dist/plugins 文件夹成功...')
+} else {
+    console.log('/dist/plugins 文件夹 不存在,无需移除...')
+}
+
+//删除文件夹下的所有文件
+function delallfilerid(fuckpath) {
+    fs.readdirSync(fuckpath).forEach((file, index, arr) => {
+        if (fs.lstatSync(`${fuckpath}/${file}`).isFile()) {
+            fs.unlinkSync(`${fuckpath}/${file}`)
+        } else if (fs.lstatSync(`${fuckpath}/${file}`).isDirectory()) {
+            delallfilerid(`${fuckpath}/${file}`)
+            fs.rmdirSync(`${fuckpath}/${file}`)
+        }
+    })
+}

+ 22 - 0
scripts/restore.js

@@ -0,0 +1,22 @@
+const path = require('path')
+const fs = require('fs')
+
+// 获取当前命令行上下文路径
+const currentDirectory = process.cwd()
+
+console.log('----------------------------')
+console.log('项目编译打包完成,准备恢复配置文件...')
+
+// 获取缓存文件
+console.log('获取配置缓存文件...')
+const cacheJsonPath = path.join(currentDirectory, 'scripts/cache.json')
+const cacheJsonContent = fs.readFileSync(cacheJsonPath, 'utf8')
+
+// 恢复配置文件
+console.log('正在恢复为编译前的配置文件...')
+const indexJsonPath = path.join(currentDirectory, 'src/config/index.json')
+fs.writeFileSync(indexJsonPath, cacheJsonContent, 'utf8')
+
+// 删除缓存文件
+console.log('删除配置缓存文件...')
+fs.unlinkSync(cacheJsonPath)

+ 65 - 0
scripts/zip.js

@@ -0,0 +1,65 @@
+const fs = require('fs')
+const path = require('path')
+const archiver = require('archiver')
+
+// 获取当前命令行上下文路径
+const currentDirectory = process.cwd()
+
+console.log('----------------------------')
+console.log('正在准备打包为zip压缩文件...')
+
+const distJoinPath = path.join(currentDirectory, '/zip/')
+if (!fs.existsSync(distJoinPath)) {
+    console.log('zip文件夹不存在,准备创建...')
+    fs.mkdir(distJoinPath, (err)=>{
+        if (err) {
+            console.log('zip文件夹创建失败')
+        } else {
+            console.log('zip文件夹创建成功')
+        }
+    })
+}
+
+// 创建文件输出流
+console.log('初始化zip文件流...')
+const distZipPath = path.join(currentDirectory, '/zip/data.zip')
+let output = fs.createWriteStream(distZipPath)
+let archive = archiver('zip', {
+    zlib: { level: 9 }, // 设置压缩级别
+})
+
+// 文件输出流结束
+output.on('close', function () {
+    console.log('打包完成,zip文件位于zip文件夹下,/zip/data.zip')
+})
+
+// 数据源是否耗尽
+output.on('end', function () {
+    console.log('数据源已耗尽')
+})
+
+// 存档警告
+archive.on('warning', function (err) {
+    if (err.code === 'ENOENT') {
+        console.warn('stat故障和其他非阻塞错误')
+    } else {
+        throw err
+    }
+})
+
+// 存档出错
+archive.on('error', function (err) {
+    throw err
+})
+
+// 通过管道方法将输出流存档到文件
+archive.pipe(output)
+
+console.log('正在将dist文件夹到zip中...')
+const distPath = path.join(currentDirectory, '/dist/')
+//打包dist里面的所有文件和目录
+archive.directory(distPath, false)
+
+//完成归档
+archive.finalize()
+

+ 237 - 4
yarn.lock

@@ -795,6 +795,35 @@ anymatch@~3.1.2:
     normalize-path "^3.0.0"
     picomatch "^2.0.4"
 
+archiver-utils@^2.1.0:
+  version "2.1.0"
+  resolved "http://47.110.251.215:9000/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2"
+  integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
+  dependencies:
+    glob "^7.1.4"
+    graceful-fs "^4.2.0"
+    lazystream "^1.0.0"
+    lodash.defaults "^4.2.0"
+    lodash.difference "^4.5.0"
+    lodash.flatten "^4.4.0"
+    lodash.isplainobject "^4.0.6"
+    lodash.union "^4.6.0"
+    normalize-path "^3.0.0"
+    readable-stream "^2.0.0"
+
+archiver@^5.3.1:
+  version "5.3.1"
+  resolved "http://47.110.251.215:9000/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6"
+  integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==
+  dependencies:
+    archiver-utils "^2.1.0"
+    async "^3.2.3"
+    buffer-crc32 "^0.2.1"
+    readable-stream "^3.6.0"
+    readdir-glob "^1.0.0"
+    tar-stream "^2.2.0"
+    zip-stream "^4.1.0"
+
 argparse@^2.0.1:
   version "2.0.1"
   resolved "http://47.110.251.215:9000/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
@@ -810,6 +839,11 @@ async-validator@^4.2.5:
   resolved "http://47.110.251.215:9000/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
   integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
 
+async@^3.2.3:
+  version "3.2.4"
+  resolved "http://47.110.251.215:9000/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
+  integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
+
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "http://47.110.251.215:9000/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -829,6 +863,11 @@ balanced-match@^1.0.0:
   resolved "http://47.110.251.215:9000/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
   integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
 
+base64-js@^1.3.1:
+  version "1.5.1"
+  resolved "http://47.110.251.215:9000/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
 big-integer@^1.6.44:
   version "1.6.51"
   resolved "http://47.110.251.215:9000/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
@@ -839,6 +878,15 @@ binary-extensions@^2.0.0:
   resolved "http://47.110.251.215:9000/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
   integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
 
+bl@^4.0.3:
+  version "4.1.0"
+  resolved "http://47.110.251.215:9000/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+  integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+  dependencies:
+    buffer "^5.5.0"
+    inherits "^2.0.4"
+    readable-stream "^3.4.0"
+
 boolbase@^1.0.0:
   version "1.0.0"
   resolved "http://47.110.251.215:9000/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
@@ -873,6 +921,19 @@ braces@^3.0.2, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
+buffer-crc32@^0.2.1, buffer-crc32@^0.2.13:
+  version "0.2.13"
+  resolved "http://47.110.251.215:9000/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+  integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer@^5.5.0:
+  version "5.7.1"
+  resolved "http://47.110.251.215:9000/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+  integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+  dependencies:
+    base64-js "^1.3.1"
+    ieee754 "^1.1.13"
+
 bundle-name@^3.0.0:
   version "3.0.0"
   resolved "http://47.110.251.215:9000/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a"
@@ -937,6 +998,16 @@ combined-stream@^1.0.8:
   dependencies:
     delayed-stream "~1.0.0"
 
+compress-commons@^4.1.0:
+  version "4.1.1"
+  resolved "http://47.110.251.215:9000/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d"
+  integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==
+  dependencies:
+    buffer-crc32 "^0.2.13"
+    crc32-stream "^4.0.2"
+    normalize-path "^3.0.0"
+    readable-stream "^3.6.0"
+
 concat-map@0.0.1:
   version "0.0.1"
   resolved "http://47.110.251.215:9000/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -947,6 +1018,24 @@ consola@^3.2.3:
   resolved "http://47.110.251.215:9000/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f"
   integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==
 
+core-util-is@~1.0.0:
+  version "1.0.3"
+  resolved "http://47.110.251.215:9000/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+crc-32@^1.2.0:
+  version "1.2.2"
+  resolved "http://47.110.251.215:9000/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+  integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+crc32-stream@^4.0.2:
+  version "4.0.2"
+  resolved "http://47.110.251.215:9000/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007"
+  integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==
+  dependencies:
+    crc-32 "^1.2.0"
+    readable-stream "^3.4.0"
+
 cross-spawn@^7.0.2, cross-spawn@^7.0.3:
   version "7.0.3"
   resolved "http://47.110.251.215:9000/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -1082,6 +1171,13 @@ element-plus@2.3.8:
     memoize-one "^6.0.0"
     normalize-wheel-es "^1.2.0"
 
+end-of-stream@^1.4.1:
+  version "1.4.4"
+  resolved "http://47.110.251.215:9000/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+  dependencies:
+    once "^1.4.0"
+
 esbuild@^0.18.10:
   version "0.18.13"
   resolved "http://47.110.251.215:9000/esbuild/-/esbuild-0.18.13.tgz#59160add6c3420947fe008238140ed3480baf817"
@@ -1357,6 +1453,11 @@ form-data@^4.0.0:
     combined-stream "^1.0.8"
     mime-types "^2.1.12"
 
+fs-constants@^1.0.0:
+  version "1.0.0"
+  resolved "http://47.110.251.215:9000/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+  integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
 fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "http://47.110.251.215:9000/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -1391,7 +1492,7 @@ glob-parent@^6.0.2:
   dependencies:
     is-glob "^4.0.3"
 
-glob@^7.1.3:
+glob@^7.1.3, glob@^7.1.4:
   version "7.2.3"
   resolved "http://47.110.251.215:9000/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
   integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -1422,6 +1523,11 @@ globby@^11.1.0:
     merge2 "^1.4.1"
     slash "^3.0.0"
 
+graceful-fs@^4.2.0:
+  version "4.2.11"
+  resolved "http://47.110.251.215:9000/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+  integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
 graphemer@^1.4.0:
   version "1.4.0"
   resolved "http://47.110.251.215:9000/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
@@ -1456,6 +1562,11 @@ human-signals@^4.3.0:
   resolved "http://47.110.251.215:9000/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
   integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
 
+ieee754@^1.1.13:
+  version "1.2.1"
+  resolved "http://47.110.251.215:9000/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
 ignore@^5.2.0:
   version "5.2.4"
   resolved "http://47.110.251.215:9000/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
@@ -1487,7 +1598,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2:
+inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
   version "2.0.4"
   resolved "http://47.110.251.215:9000/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -1562,6 +1673,11 @@ is-wsl@^2.2.0:
   dependencies:
     is-docker "^2.0.0"
 
+isarray@~1.0.0:
+  version "1.0.0"
+  resolved "http://47.110.251.215:9000/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
 isexe@^2.0.0:
   version "2.0.0"
   resolved "http://47.110.251.215:9000/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -1619,6 +1735,13 @@ kolorist@^1.8.0:
   resolved "http://47.110.251.215:9000/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c"
   integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==
 
+lazystream@^1.0.0:
+  version "1.0.1"
+  resolved "http://47.110.251.215:9000/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638"
+  integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==
+  dependencies:
+    readable-stream "^2.0.5"
+
 levn@^0.4.1:
   version "0.4.1"
   resolved "http://47.110.251.215:9000/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -1649,11 +1772,36 @@ lodash-unified@^1.0.2:
   resolved "http://47.110.251.215:9000/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894"
   integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
 
+lodash.defaults@^4.2.0:
+  version "4.2.0"
+  resolved "http://47.110.251.215:9000/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+  integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
+
+lodash.difference@^4.5.0:
+  version "4.5.0"
+  resolved "http://47.110.251.215:9000/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
+  integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
+
+lodash.flatten@^4.4.0:
+  version "4.4.0"
+  resolved "http://47.110.251.215:9000/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+  integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
+
+lodash.isplainobject@^4.0.6:
+  version "4.0.6"
+  resolved "http://47.110.251.215:9000/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+  integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
+
 lodash.merge@^4.6.2:
   version "4.6.2"
   resolved "http://47.110.251.215:9000/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
   integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
+lodash.union@^4.6.0:
+  version "4.6.0"
+  resolved "http://47.110.251.215:9000/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
+  integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
+
 lodash@^4.17.21:
   version "4.17.21"
   resolved "http://47.110.251.215:9000/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -1730,6 +1878,13 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
   dependencies:
     brace-expansion "^1.1.7"
 
+minimatch@^5.1.0:
+  version "5.1.6"
+  resolved "http://47.110.251.215:9000/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+  integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+  dependencies:
+    brace-expansion "^2.0.1"
+
 minimatch@^9.0.1, minimatch@^9.0.2:
   version "9.0.3"
   resolved "http://47.110.251.215:9000/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
@@ -1812,7 +1967,7 @@ ofetch@^1.1.1:
     node-fetch-native "^1.2.0"
     ufo "^1.1.2"
 
-once@^1.3.0:
+once@^1.3.0, once@^1.4.0:
   version "1.4.0"
   resolved "http://47.110.251.215:9000/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
@@ -1965,6 +2120,11 @@ prelude-ls@^1.2.1:
   resolved "http://47.110.251.215:9000/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
   integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
 
+process-nextick-args@~2.0.0:
+  version "2.0.1"
+  resolved "http://47.110.251.215:9000/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
 proxy-from-env@^1.1.0:
   version "1.1.0"
   resolved "http://47.110.251.215:9000/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
@@ -1980,6 +2140,35 @@ queue-microtask@^1.2.2:
   resolved "http://47.110.251.215:9000/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
   integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
 
+readable-stream@^2.0.0, readable-stream@^2.0.5:
+  version "2.3.8"
+  resolved "http://47.110.251.215:9000/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+  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"
+
+readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+  version "3.6.2"
+  resolved "http://47.110.251.215:9000/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+  integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
+readdir-glob@^1.0.0:
+  version "1.1.3"
+  resolved "http://47.110.251.215:9000/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584"
+  integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==
+  dependencies:
+    minimatch "^5.1.0"
+
 readdirp@~3.6.0:
   version "3.6.0"
   resolved "http://47.110.251.215:9000/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -2034,6 +2223,16 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "http://47.110.251.215:9000/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "http://47.110.251.215:9000/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
 sass@^1.63.6:
   version "1.63.6"
   resolved "http://47.110.251.215:9000/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea"
@@ -2091,6 +2290,20 @@ slash@^3.0.0:
   resolved "http://47.110.251.215:9000/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
 
+string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved "http://47.110.251.215:9000/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+  dependencies:
+    safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "http://47.110.251.215:9000/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+  dependencies:
+    safe-buffer "~5.1.0"
+
 strip-ansi@^6.0.1:
   version "6.0.1"
   resolved "http://47.110.251.215:9000/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -2140,6 +2353,17 @@ synckit@^0.8.5:
     "@pkgr/utils" "^2.3.1"
     tslib "^2.5.0"
 
+tar-stream@^2.2.0:
+  version "2.2.0"
+  resolved "http://47.110.251.215:9000/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+  integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+  dependencies:
+    bl "^4.0.3"
+    end-of-stream "^1.4.1"
+    fs-constants "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^3.1.1"
+
 text-table@^0.2.0:
   version "0.2.0"
   resolved "http://47.110.251.215:9000/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -2317,7 +2541,7 @@ uri-js@^4.2.2:
   dependencies:
     punycode "^2.1.0"
 
-util-deprecate@^1.0.2:
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "http://47.110.251.215:9000/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
@@ -2406,6 +2630,15 @@ yocto-queue@^0.1.0:
   resolved "http://47.110.251.215:9000/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
   integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
 
+zip-stream@^4.1.0:
+  version "4.1.0"
+  resolved "http://47.110.251.215:9000/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"
+  integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==
+  dependencies:
+    archiver-utils "^2.1.0"
+    compress-commons "^4.1.0"
+    readable-stream "^3.6.0"
+
 zrender@5.4.4:
   version "5.4.4"
   resolved "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz#8854f1d95ecc82cf8912f5a11f86657cb8c9e261"