diff --git a/bin/patch.js b/bin/patch.js index 53f82a41..94ad66f4 100644 --- a/bin/patch.js +++ b/bin/patch.js @@ -1,10 +1,11 @@ // @ts-check -const inquirer = require('inquirer') -const prompt = inquirer.createPromptModule() -const package = require('../package.json') -const { $, chalk } = require('zx') const { resolve } = require('path') const { readdirSync } = require('fs') +const inquirer = require('inquirer') + +const prompt = inquirer.createPromptModule() +const { $, chalk } = require('zx-cjs') +const package = require('../package.json') const PATCH_DIR = resolve(process.cwd(), './patch') async function bootstarp() { @@ -23,7 +24,7 @@ async function bootstarp() { choices: patchFiles.map((f) => f.replace(/\.js$/, '')), }).then(async ({ version }) => { const patchPath = resolve(PATCH_DIR, `./${version}.js`) - console.log(chalk.green('starting patch... ' + patchPath)) + console.log(chalk.green(`starting patch... ${patchPath}`)) await $`node ${patchPath}` }) } diff --git a/global.d.ts b/global.d.ts index 7a552546..07b9eda0 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1,7 +1,7 @@ import { ModelType } from '@typegoose/typegoose/lib/types' import { Consola } from 'consola' import { Document, PaginateModel } from 'mongoose' -import 'zx/globals' +import 'zx-cjs/globals' declare global { export type KV = Record diff --git a/package.json b/package.json index 64131958..40361d7a 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "@babel/plugin-transform-typescript": "7.16.8", "@babel/types": "*", "@innei/class-validator-jsonschema": "3.1.1", + "@innei/zx-cjs": "6.0.6", "@nestjs/common": "8.4.1", "@nestjs/core": "8.4.1", "@nestjs/event-emitter": "1.1.0", @@ -129,10 +130,9 @@ "ua-parser-js": "1.0.2", "vm2": "3.9.9", "xss": "1.0.11", - "zx": "4.3.0" + "zx-cjs": "link:./node_modules/@innei/zx-cjs" }, "devDependencies": { - "@babel__types@*": "link:@types/@babel__types@*", "@innei-util/eslint-config-ts": "0.5.0", "@innei-util/prettier": "0.4.1", "@nestjs/cli": "8.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f58e969..6f7af1a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ specifiers: '@babel/core': 7.17.8 '@babel/plugin-transform-typescript': 7.16.8 '@babel/types': '*' - '@babel__types@*': link:@types/@babel__types@* '@innei-util/eslint-config-ts': 0.5.0 '@innei-util/prettier': 0.4.1 '@innei/class-validator-jsonschema': 3.1.1 + '@innei/zx-cjs': 6.0.6 '@nestjs/cli': 8.2.3 '@nestjs/common': 8.4.1 '@nestjs/core': 8.4.1 @@ -119,7 +119,7 @@ specifiers: vm2: 3.9.9 webpack-node-externals: 3.0.0 xss: 1.0.11 - zx: 4.3.0 + zx-cjs: link:./node_modules/@innei/zx-cjs dependencies: '@algolia/client-search': 4.12.1 @@ -127,6 +127,7 @@ dependencies: '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.17.8 '@babel/types': 7.17.0 '@innei/class-validator-jsonschema': 3.1.1_279461c9b8c03a205cdbc4878bc60cf8 + '@innei/zx-cjs': 6.0.6 '@nestjs/common': 8.4.1_add13df2cdecb4b62cd3f7664ea82e18 '@nestjs/core': 8.4.1_b4e0a43386936f36c413921c49aca7e6 '@nestjs/event-emitter': 1.1.0_891fcd1c5b0f2c9b3aea247fec3c8ce1 @@ -188,14 +189,13 @@ dependencies: ua-parser-js: 1.0.2 vm2: 3.9.9 xss: 1.0.11 - zx: 4.3.0 + zx-cjs: link:node_modules/@innei/zx-cjs optionalDependencies: mongodb-memory-server: 8.4.1 redis-memory-server: 0.5.0 devDependencies: - '@babel__types@*': link:@types/@babel__types@* '@innei-util/eslint-config-ts': 0.5.0_typescript@4.6.2 '@innei-util/prettier': 0.4.1 '@nestjs/cli': 8.2.3 @@ -954,6 +954,11 @@ packages: tslib: 2.3.1 dev: false + /@innei/zx-cjs/6.0.6: + resolution: {integrity: sha512-0xbwDdyhuCOpjLNPTfBxfKw7bqEHQ1rq92Cct6dA8mEBtyIT05MJ8sfShVDvDnKrAec74tDQTAaPaZQ1nvRpxQ==} + engines: {node: '>= 16.0.0'} + dev: false + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1506,10 +1511,12 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + dev: true /@nodelib/fs.stat/2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + dev: true /@nodelib/fs.walk/1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -1517,6 +1524,7 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 + dev: true /@nuxtjs/opencollective/0.3.2: resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} @@ -1733,12 +1741,6 @@ packages: '@types/serve-static': 1.13.10 dev: true - /@types/fs-extra/9.0.13: - resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - dependencies: - '@types/node': 16.11.26 - dev: false - /@types/get-image-colors/4.0.1: resolution: {integrity: sha512-SJw1xtewG0w9btZqeG8evQpvSvo7Hp12cPRUi5XouM7sfe/CcvkSk8x8u2XDLwc2UIW2D7qrf/iffv9dJmSVsQ==} dependencies: @@ -1837,10 +1839,6 @@ packages: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} dev: true - /@types/minimist/1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: false - /@types/mongoose-paginate-v2/1.4.3: resolution: {integrity: sha512-FmRDvLpVhRR1MT255R8N1lzYlwrPtNN7d/ZhnkrnyMQ1u3iyc2z9KaQi4y1AuCFdnK8IdTpw3jbRTcUSsjp5BQ==} dependencies: @@ -1849,13 +1847,6 @@ packages: - supports-color dev: true - /@types/node-fetch/2.5.12: - resolution: {integrity: sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==} - dependencies: - '@types/node': 16.11.26 - form-data: 3.0.1 - dev: false - /@types/node/14.17.33: resolution: {integrity: sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==} dev: false @@ -2525,11 +2516,6 @@ packages: engines: {node: '>=8'} dev: true - /array-union/3.0.1: - resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} - engines: {node: '>=12'} - dev: false - /array.prototype.flat/1.2.3: resolution: {integrity: sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==} engines: {node: '>= 0.4'} @@ -2762,6 +2748,7 @@ packages: engines: {node: '>=8'} dependencies: fill-range: 7.0.1 + dev: true /browser-process-hrtime/1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} @@ -3411,6 +3398,7 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -3485,10 +3473,6 @@ packages: is-obj: 2.0.0 dev: false - /duplexer/0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: false - /eastasianwidth/0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true @@ -3839,18 +3823,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /event-stream/3.3.4: - resolution: {integrity: sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=} - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - dev: false - /eventemitter2/6.4.5: resolution: {integrity: sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==} dev: false @@ -3953,6 +3925,7 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.4 + dev: true /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -4115,6 +4088,7 @@ packages: engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 + dev: true /find-cache-dir/3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} @@ -4234,6 +4208,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.34 + dev: true /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -4254,24 +4229,11 @@ packages: engines: {node: '>= 0.6'} dev: false - /from/0.1.7: - resolution: {integrity: sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=} - dev: false - /fs-constants/1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false optional: true - /fs-extra/10.0.0: - resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.9 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - /fs-extra/10.0.1: resolution: {integrity: sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==} engines: {node: '>=12'} @@ -4421,6 +4383,7 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 + dev: true /glob-parent/6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} @@ -4476,20 +4439,9 @@ packages: slash: 3.0.0 dev: true - /globby/12.2.0: - resolution: {integrity: sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - array-union: 3.0.1 - dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.0 - merge2: 1.4.1 - slash: 4.0.0 - dev: false - /graceful-fs/4.2.9: resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} + dev: true /har-schema/2.0.0: resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} @@ -4680,6 +4632,7 @@ packages: /ignore/5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} + dev: true /image-size/1.0.1: resolution: {integrity: sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==} @@ -4860,6 +4813,7 @@ packages: /is-extglob/2.1.1: resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} engines: {node: '>=0.10.0'} + dev: true /is-fullwidth-code-point/1.0.0: resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=} @@ -4887,6 +4841,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 + dev: true /is-interactive/1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} @@ -4905,6 +4860,7 @@ packages: /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + dev: true /is-obj/2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} @@ -5700,6 +5656,7 @@ packages: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.9 + dev: true /jsonwebtoken/8.5.1: resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} @@ -6058,10 +6015,6 @@ packages: engines: {node: '>=8'} dev: false - /map-stream/0.1.0: - resolution: {integrity: sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=} - dev: false - /marked/4.0.12: resolution: {integrity: sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==} engines: {node: '>= 12'} @@ -6093,6 +6046,7 @@ packages: /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + dev: true /micromatch/4.0.4: resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} @@ -6100,6 +6054,7 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 + dev: true /middie/6.0.0: resolution: {integrity: sha512-Z1DnAjhtr7xQmOdjUUtGVP4NLaR5422AwhIT6TvzLu2jP8cWK6Mik92Py/xyuyBeM0P+d+Zhuaw0Q6WKTH9Kjw==} @@ -6755,12 +6710,7 @@ packages: /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - - /pause-stream/0.0.11: - resolution: {integrity: sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=} - dependencies: - through: 2.3.8 - dev: false + dev: true /pause/0.0.1: resolution: {integrity: sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=} @@ -6781,6 +6731,7 @@ packages: /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + dev: true /pidtree/0.5.0: resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==} @@ -6899,14 +6850,6 @@ packages: ipaddr.js: 1.9.1 dev: false - /ps-tree/1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true - dependencies: - event-stream: 3.3.4 - dev: false - /psl/1.8.0: resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} @@ -7161,6 +7104,7 @@ packages: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + dev: true /run-script-webpack-plugin/0.0.11: resolution: {integrity: sha512-QmuBhiqBPmhQLpO5vMBHVTAGyoPBnrCM5gQ3IzgieiImBXiBbXcIv4kysCT1gilFNFxQk22oKQfiIhWbT/zXCw==} @@ -7339,11 +7283,6 @@ packages: engines: {node: '>=8'} dev: true - /slash/4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: false - /slice-ansi/3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -7470,12 +7409,6 @@ packages: memory-pager: 1.5.0 optional: true - /split/0.3.3: - resolution: {integrity: sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=} - dependencies: - through: 2.3.8 - dev: false - /sprintf-js/1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: true @@ -7511,12 +7444,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /stream-combiner/0.0.4: - resolution: {integrity: sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=} - dependencies: - duplexer: 0.1.2 - dev: false - /stream-wormhole/1.1.0: resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==} engines: {node: '>=4.0.0'} @@ -7805,6 +7732,7 @@ packages: engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + dev: true /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} @@ -8055,6 +7983,7 @@ packages: /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + dev: true /upper-case/1.1.3: resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} @@ -8457,23 +8386,3 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: false - - /zx/4.3.0: - resolution: {integrity: sha512-KuEjpu5QFIMx0wWfzknDRhY98s7a3tWNRmYt19XNmB7AfOmz5zISA4+3Q8vlJc2qguxMn89uSxhPDCldPa3YLA==} - engines: {node: '>= 14.13.1'} - hasBin: true - dependencies: - '@types/fs-extra': 9.0.13 - '@types/minimist': 1.2.2 - '@types/node': 16.11.26 - '@types/node-fetch': 2.5.12 - chalk: 4.1.2 - fs-extra: 10.0.0 - globby: 12.2.0 - minimist: 1.2.5 - node-fetch: 2.6.7 - ps-tree: 1.2.0 - which: 2.0.2 - transitivePeerDependencies: - - encoding - dev: false diff --git a/scripts/deploy.js b/scripts/deploy.js index fad33e91..a920a57a 100644 --- a/scripts/deploy.js +++ b/scripts/deploy.js @@ -1,6 +1,6 @@ #!/usr/bin/env zx // @ts-check -const { cd, $, os, fs, path, fetch, nothrow, sleep } = require('zx') +const { cd, $, os, fs, path, fetch, nothrow, sleep } = require('zx-cjs') const { homedir } = os const { repository } = require('../package.json') @@ -35,7 +35,7 @@ async function main() { } const buffer = await fetch( - 'https://small-lake-9960.tukon479.workers.dev/' + downloadUrl, + `https://small-lake-9960.tukon479.workers.dev/${downloadUrl}`, ).then((res) => res.buffer()) const tmpName = (Math.random() * 10).toString(16) fs.writeFileSync(`/tmp/${tmpName}.zip`, buffer, { flag: 'w' }) diff --git a/scripts/download-latest-admin-assets.js b/scripts/download-latest-admin-assets.js index a1b27d3f..f3049d52 100644 --- a/scripts/download-latest-admin-assets.js +++ b/scripts/download-latest-admin-assets.js @@ -1,7 +1,7 @@ #!env node const { createWriteStream, writeFileSync } = require('fs') const { join } = require('path') -const { fetch, $ } = require('zx') +const { fetch, $ } = require('zx-cjs') const { dashboard: { repo, version }, } = require('../package.json') diff --git a/scripts/get-latest-admin-version.js b/scripts/get-latest-admin-version.js index 2feef740..c04a3540 100644 --- a/scripts/get-latest-admin-version.js +++ b/scripts/get-latest-admin-version.js @@ -1,10 +1,10 @@ +const { resolve } = require('path') +const axios = require('axios') +const { fs } = require('zx-cjs') const { dashboard: { repo }, } = require('../package.json') const Package = require('../package.json') -const axios = require('axios') -const { fs } = require('zx') -const { resolve } = require('path') const endpoint = `https://api.github.com/repos/${repo}/releases/latest` const latestVersion = async () => { diff --git a/src/app.config.ts b/src/app.config.ts index 27b25495..397934d3 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -1,5 +1,5 @@ import cluster from 'cluster' -import { argv } from 'zx' +import { argv } from 'zx-cjs' import { isDev, isTest } from './global/env.global' export const PORT = argv.port || process.env.PORT || 2333 diff --git a/src/app.controller.ts b/src/app.controller.ts index 521dd1d0..d03aaea8 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -87,10 +87,7 @@ export class AppController { @HttpCache.disable @Auth() async cleanCatch() { - const redis = this.cacheService.getClient() - const keys: string[] = await redis.keys('mx-api-cache:*') - await Promise.all(keys.map((key) => redis.del(key))) - + await this.cacheService.cleanCatch() return } @@ -98,11 +95,7 @@ export class AppController { @HttpCache.disable @Auth() async cleanAllRedisKey() { - const redis = this.cacheService.getClient() - const keys: string[] = await redis.keys(getRedisKey('*')) - - await Promise.all(keys.map((key) => redis.del(key))) - + await this.cacheService.cleanAllRedisKey() return } } diff --git a/src/common/filters/any-exception.filter.ts b/src/common/filters/any-exception.filter.ts index 208adc74..949c5fea 100644 --- a/src/common/filters/any-exception.filter.ts +++ b/src/common/filters/any-exception.filter.ts @@ -47,7 +47,7 @@ export class AllExceptionsFilter implements ExceptionFilter { (exception as myError)?.message || '' if (status === HttpStatus.INTERNAL_SERVER_ERROR) { - message && Logger.debug(message, undefined, 'Catch') + // message && Logger.debug(message, undefined, 'Catch') Logger.error(exception, undefined, 'Catch') if (!isDev) { diff --git a/src/global/consola.global.ts b/src/global/consola.global.ts index 1f919dc0..a4abe39d 100644 --- a/src/global/consola.global.ts +++ b/src/global/consola.global.ts @@ -4,7 +4,7 @@ import { resolve } from 'path' import consola_, { FancyReporter, LogLevel } from 'consola' import { CronJob } from 'cron' import { CronExpression } from '@nestjs/schedule' -import { argv } from 'zx' +import { argv } from 'zx-cjs' import { redisSubPub } from '../utils/redis-subpub.util' import { getShortDate, getShortTime } from '../utils/time.util' import { isDev, isTest } from './env.global' diff --git a/src/global/index.global.ts b/src/global/index.global.ts index 0dc0c658..c8cb8d3f 100644 --- a/src/global/index.global.ts +++ b/src/global/index.global.ts @@ -1,5 +1,5 @@ /* eslint-disable import/order */ -import 'zx/globals' +import 'zx-cjs/globals' import './dayjs.global' import { consola, registerStdLogger } from './consola.global' diff --git a/src/modules/backup/backup.service.ts b/src/modules/backup/backup.service.ts index 3d79385f..775d2a06 100644 --- a/src/modules/backup/backup.service.ts +++ b/src/modules/backup/backup.service.ts @@ -1,9 +1,7 @@ -import { exec } from 'child_process' import { existsSync, statSync } from 'fs' -import { readFile, readdir, rm, writeFile } from 'fs/promises' +import { copyFile, cp, readFile, readdir, rm, writeFile } from 'fs/promises' import { join, resolve } from 'path' import { Readable } from 'stream' -import { promisify } from 'util' import mkdirp from 'mkdirp' import { BadRequestException, @@ -11,6 +9,8 @@ import { InternalServerErrorException, Logger, } from '@nestjs/common' +import { promiseImpl } from 'ejs' +import { quiet } from 'zx-cjs' import { ConfigsService } from '../configs/configs.service' import { MONGO_DB } from '~/app.config' import { BACKUP_DIR, DATA_DIR } from '~/constants/path.constant' @@ -18,6 +18,7 @@ import { AdminEventsGateway } from '~/processors/gateway/admin/events.gateway' import { EventTypes } from '~/processors/gateway/events.types' import { getMediumDateTime } from '~/utils' import { getFolderSize } from '~/utils/system.util' +import { CacheService } from '~/processors/cache/cache.service' @Injectable() export class BackupService { @@ -26,6 +27,7 @@ export class BackupService { constructor( private readonly adminGateway: AdminEventsGateway, private readonly configs: ConfigsService, + private readonly cacheService: CacheService, ) { this.logger = new Logger(BackupService.name) } @@ -71,25 +73,25 @@ export class BackupService { mkdirp.sync(backupDirPath) try { await $`mongodump -h ${MONGO_DB.host} --port ${MONGO_DB.port} -d ${MONGO_DB.dbName} --excludeCollection analyzes -o ${backupDirPath} >/dev/null 2>&1` - // 打包 DB - await promisify(exec)( - `zip -r backup-${dateDir} mx-space/* && rm -rf mx-space`, - { - cwd: backupDirPath, - }, - ) + cd(backupDirPath) + await quiet($`zip -r backup-${dateDir} mx-space/* && rm -rf mx-space`) // 打包数据目录 - await promisify(exec)( - `rsync -a . ./temp_copy_need --exclude temp_copy_need --exclude backup --exclude log && mv temp_copy_need backup_data && zip -r ${join( - backupDirPath, - `backup-${dateDir}`, - )} ./backup_data && rm -rf backup_data`, - { - cwd: DATA_DIR, - }, - ) + + const excludeFolders = ['backup', 'log', 'node_modules', 'admin'] + const flags = excludeFolders.map((item) => ['--exclude', item]).flat(1) + cd(DATA_DIR) + await rm(join(DATA_DIR, 'backup_data'), { recursive: true, force: true }) + await rm(join(DATA_DIR, 'temp_copy_need'), { + recursive: true, + force: true, + }) + // eslint-disable-next-line no-empty + await $`rsync -a . ./temp_copy_need --exclude temp_copy_need ${flags} && mv temp_copy_need backup_data && zip -r ${join( + backupDirPath, + `backup-${dateDir}`, + )} ./backup_data && rm -rf backup_data` this.logger.log('--> 备份成功') } catch (e) { @@ -125,44 +127,43 @@ export class BackupService { return path } - // TODO 下面两个方法有重复代码 async saveTempBackupByUpload(buffer: Buffer) { const tempDirPath = '/tmp/mx-space/backup' const tempBackupPath = join(tempDirPath, 'backup.zip') mkdirp.sync(tempDirPath) await writeFile(tempBackupPath, buffer) - try { - cd(tempDirPath) - await $`unzip backup.zip` - await $`mongorestore -h ${MONGO_DB.host || '127.0.0.1'} --port ${ - MONGO_DB.port || 27017 - } -d ${MONGO_DB.dbName} ./mx-space --drop >/dev/null 2>&1` - - this.logger.debug('恢复成功') - await this.adminGateway.broadcast( - EventTypes.CONTENT_REFRESH, - 'restore_done', - ) - } finally { - await rm(tempDirPath, { recursive: true }) - } + await this.restore(tempBackupPath) + await this.adminGateway.broadcast( + EventTypes.CONTENT_REFRESH, + 'restore_done', + ) } - async rollbackTo(dirname: string) { - const bakFilePath = this.checkBackupExist(dirname) // zip file path - const dirPath = join(BACKUP_DIR, dirname) - try { - if (existsSync(join(join(dirPath, 'mx-space')))) { - await rm(join(dirPath, 'mx-space'), { recursive: true }) - } + async restore(restoreFilePath: string) { + await this.backup() + const isExist = fs.existsSync(restoreFilePath) + if (!isExist) { + throw new InternalServerErrorException('备份文件不存在') + } + const dirPath = path.dirname(restoreFilePath) + const tempdirs = ['mx-space', 'backup_data'] + await Promise.all( + tempdirs.map((dir) => { + return rm(join(dirPath, dir), { recursive: true, force: true }) + }), + ) + + // 解压 + try { cd(dirPath) - await $`unzip ${bakFilePath}` + await $`unzip ${restoreFilePath}` } catch { throw new InternalServerErrorException('服务端 unzip 命令未找到') } try { + // 验证 if (!existsSync(join(dirPath, 'mx-space'))) { throw new InternalServerErrorException('备份文件错误, 目录不存在') } @@ -175,10 +176,33 @@ export class BackupService { this.logger.error(e) throw e } finally { - try { - await rm(join(dirPath, 'mx-space'), { recursive: true }) - } catch {} + await rm(join(dirPath, 'mx-space'), { recursive: true, force: true }) } + // 还原 backup_data + + const backupDataDirFilenames = await readdir(join(dirPath, 'backup_data')) + + await Promise.all( + backupDataDirFilenames.map(async (filename) => { + const fullpath = join(dirPath, 'backup_data', filename) + const targetPath = join(DATA_DIR, filename) + + await rm(targetPath, { recursive: true, force: true }) + + await $`cp -r ${fullpath} ${targetPath}` + }), + ) + + await Promise.all([ + this.cacheService.cleanAllRedisKey(), + this.cacheService.cleanCatch(), + ]) + } + + async rollbackTo(dirname: string) { + const bakFilePath = this.checkBackupExist(dirname) // zip file path + + await this.restore(bakFilePath) await this.adminGateway.broadcast( EventTypes.CONTENT_REFRESH, diff --git a/src/processors/cache/cache.service.ts b/src/processors/cache/cache.service.ts index 123c7e94..629cd4cf 100755 --- a/src/processors/cache/cache.service.ts +++ b/src/processors/cache/cache.service.ts @@ -2,6 +2,7 @@ import { CACHE_MANAGER, Inject, Injectable, Logger } from '@nestjs/common' import { Cache } from 'cache-manager' import { Redis } from 'ioredis' import type { RedisSubPub } from '../../utils/redis-subpub.util' +import { getRedisKey } from '~/utils/redis.util' // Cache 客户端管理器 @@ -67,4 +68,21 @@ export class CacheService { public getClient() { return this.redisClient } + + public async cleanCatch() { + const redis = this.getClient() + const keys: string[] = await redis.keys('mx-api-cache:*') + await Promise.all(keys.map((key) => redis.del(key))) + + return + } + + public async cleanAllRedisKey() { + const redis = this.getClient() + const keys: string[] = await redis.keys(getRedisKey('*')) + + await Promise.all(keys.map((key) => redis.del(key))) + + return + } } diff --git a/test-setup.js b/test-setup.js index 7c42e8c2..572aac8c 100644 --- a/test-setup.js +++ b/test-setup.js @@ -1,4 +1,4 @@ -const { registerGlobals } = require('zx') +const { registerGlobals } = require('zx-cjs') registerGlobals() const globals = { consola: console, isDev: true } diff --git a/test/global.d.ts b/test/global.d.ts index 7a552546..07b9eda0 100644 --- a/test/global.d.ts +++ b/test/global.d.ts @@ -1,7 +1,7 @@ import { ModelType } from '@typegoose/typegoose/lib/types' import { Consola } from 'consola' import { Document, PaginateModel } from 'mongoose' -import 'zx/globals' +import 'zx-cjs/globals' declare global { export type KV = Record