From 9ca333735fcd087771615570b63be066d9221b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Mon, 23 Sep 2024 21:31:39 +0200 Subject: [PATCH] create a single archive. add an export path flag --- packages/cli/package.json | 3 +- packages/cli/src/commands/export/all.ts | 42 ++++-- packages/cli/src/commands/import/all.ts | 15 ++- pnpm-lock.yaml | 170 ++++++++++++++++++++++-- 4 files changed, 203 insertions(+), 27 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index bf2d983749..9b50da508a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -52,6 +52,7 @@ ], "devDependencies": { "@redocly/cli": "^1.6.0", + "@types/archiver": "^6.0.2", "@types/aws4": "^1.5.1", "@types/bcryptjs": "^2.4.2", "@types/compression": "1.0.1", @@ -99,6 +100,7 @@ "@rudderstack/rudder-sdk-node": "2.0.9", "@sentry/integrations": "7.87.0", "@sentry/node": "7.87.0", + "archiver": "7.0.1", "aws4": "1.11.0", "axios": "catalog:", "bcryptjs": "2.4.3", @@ -167,7 +169,6 @@ "sshpk": "1.17.0", "swagger-ui-express": "5.0.0", "syslog-client": "1.1.1", - "tmp-promise": "3.0.3", "typedi": "catalog:", "uuid": "catalog:", "validator": "13.7.0", diff --git a/packages/cli/src/commands/export/all.ts b/packages/cli/src/commands/export/all.ts index f7aeed6d16..c7d3a52d46 100644 --- a/packages/cli/src/commands/export/all.ts +++ b/packages/cli/src/commands/export/all.ts @@ -1,11 +1,15 @@ import { DataSource, MigrationExecutor } from '@n8n/typeorm'; +import { Flags } from '@oclif/core'; +import archiver from 'archiver'; import * as assert from 'assert/strict'; import fs from 'fs'; +import { tmpdir } from 'node:os'; +import { PassThrough } from 'node:stream'; import { join } from 'path'; import Container from 'typedi'; -import { dir as tmpDir } from 'tmp-promise'; import { jsonColumnType } from '@/databases/entities/abstract-entity'; + import { BaseCommand } from '../base-command'; /** These tables are not backed up to reduce the backup size */ @@ -21,12 +25,18 @@ const excludeList = [ export class ExportAllCommand extends BaseCommand { static description = 'Export Everything'; - static examples = ['$ n8n export:all']; + static examples = ['$ n8n export:all', '$ n8n export:all --output=backup.zip']; - // TODO: add `exportPath` flag - static flags = {}; + static flags = { + output: Flags.string({ + char: 'o', + description: 'Directory to output the archive file in', + default: tmpdir(), + }), + }; async run() { + const { flags } = await this.parse(ExportAllCommand); const connection = Container.get(DataSource); const tables = connection.entityMetadatas .filter((v) => !excludeList.includes(v.tableName)) @@ -35,8 +45,12 @@ export class ExportAllCommand extends BaseCommand { columns: v.columns, })); - const { path: tempBackupDir } = await tmpDir({}); - await fs.promises.mkdir(tempBackupDir, { recursive: true }); + await fs.promises.mkdir(flags.output, { recursive: true }); + + // TODO: bail if the file already exists, or prompt to overwrite + const zipPath = join(flags.output, 'n8n-backup.zip'); + const archive = archiver('zip', { zlib: { level: 9 } }); + archive.pipe(fs.createWriteStream(zipPath)); for (const { name: tableName, columns } of tables) { const totalRowsCount = await connection @@ -44,7 +58,9 @@ export class ExportAllCommand extends BaseCommand { .then((rows: Array<{ count: number }>) => rows[0].count); if (totalRowsCount === 0) continue; - const stream = fs.createWriteStream(join(tempBackupDir, `${tableName}.jsonl`)); + const fileName = `${tableName}.jsonl`; + const stream = new PassThrough(); + archive.append(stream, { name: fileName }); let cursor = 0; const batchSize = 10; @@ -87,13 +103,13 @@ export class ExportAllCommand extends BaseCommand { assert.ok(lastExecutedMigration, 'should have been run by db.ts'); - await fs.promises.writeFile( - join(tempBackupDir, 'lastMigration'), - lastExecutedMigration.name, - 'utf8', - ); + // Add this hidden file to store the last migration. + // This is used during import to ensure that the importing DB schema is up to date + archive.append(Buffer.from(lastExecutedMigration.name, 'utf8'), { name: '.lastMigration' }); - console.log(`data exported to ${tempBackupDir}`); + await archive.finalize(); + + console.log(`data exported to ${zipPath}`); // TODO: clean up temp dir } diff --git a/packages/cli/src/commands/import/all.ts b/packages/cli/src/commands/import/all.ts index 911ae8cc06..65064f4154 100644 --- a/packages/cli/src/commands/import/all.ts +++ b/packages/cli/src/commands/import/all.ts @@ -1,8 +1,10 @@ +import { Flags } from '@oclif/core'; import { DataSource, MigrationExecutor } from '@n8n/typeorm'; import * as assert from 'assert/strict'; import fs from 'fs'; import { join } from 'path'; import Container from 'typedi'; +import { tmpdir } from 'node:os'; import { BaseCommand } from '../base-command'; import { ApplicationError } from 'n8n-workflow'; @@ -26,11 +28,16 @@ import { ApplicationError } from 'n8n-workflow'; export class ImportAllCommand extends BaseCommand { static description = 'Import Everything'; - static examples = ['$ n8n import:all']; + static examples = ['$ n8n import:all', '$ n8n import:all --input=backup.zip']; - // TODO: add `importPath` flag - // TODO: add `clean` flag - static flags = {}; + // TODO: add `clean` flag, or add a prompt to confirm + static flags = { + input: Flags.string({ + char: 'o', + description: 'Directory to load the archive file from', + default: tmpdir(), + }), + }; // TODO: do batching async run() { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 35c503c308..8815431150 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -725,6 +725,9 @@ importers: '@sentry/node': specifier: 7.87.0 version: 7.87.0 + archiver: + specifier: 7.0.1 + version: 7.0.1 aws4: specifier: 1.11.0 version: 1.11.0 @@ -929,9 +932,6 @@ importers: syslog-client: specifier: 1.1.1 version: 1.1.1 - tmp-promise: - specifier: 3.0.3 - version: 3.0.3 typedi: specifier: 'catalog:' version: 0.10.0(patch_hash=sk6omkefrosihg7lmqbzh7vfxe) @@ -966,6 +966,9 @@ importers: '@redocly/cli': specifier: ^1.6.0 version: 1.6.0(encoding@0.1.13) + '@types/archiver': + specifier: ^6.0.2 + version: 6.0.2 '@types/aws4': specifier: ^1.5.1 version: 1.11.2 @@ -4814,6 +4817,9 @@ packages: '@types/amqplib@0.10.1': resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + '@types/archiver@6.0.2': + resolution: {integrity: sha512-KmROQqbQzKGuaAbmK+ZcytkJ51+YqDa7NmbXjmtC5YBLSyQYo21YaUnQ3HbaPFKL1ooo6RQ6OPYPIDyxfpDDXw==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -5093,6 +5099,9 @@ packages: '@types/readable-stream@4.0.10': resolution: {integrity: sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==} + '@types/readdir-glob@1.1.5': + resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} + '@types/replacestream@4.0.1': resolution: {integrity: sha512-3ecTmnzB90sgarVpIszCF1cX2cnxwqDovWb31jGrKfxAL0Knui1H7Reaz/zlT9zaE3u0un7L5cNy9fQPy0d2sg==} @@ -5684,6 +5693,14 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -5862,6 +5879,9 @@ packages: axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + babel-jest@29.6.2: resolution: {integrity: sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5894,6 +5914,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} @@ -6004,6 +6027,10 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -6354,6 +6381,10 @@ packages: component-type@1.2.1: resolution: {integrity: sha512-Kgy+2+Uwr75vAi6ChWXgHuLvd+QLD7ssgpaRq2zCvt80ptvAfMc/hijcJxXkBa2wMlEZcJvC2H8Ubo+A9ATHIg==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -6455,6 +6486,15 @@ packages: resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} engines: {node: '>=10.0.0'} + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -7378,6 +7418,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -8936,6 +8979,10 @@ packages: resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} engines: {node: '> 0.8'} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + ldapts@4.2.6: resolution: {integrity: sha512-r1eOj2PtTJi+9aZxLirktoHntuYXlbQD9ZXCjiZmJx0VBQtBcWc+rueqABuh/AxMcFHNPDSJLJAXxoj5VevTwQ==} engines: {node: '>=14'} @@ -10617,6 +10664,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + quoted-printable@1.0.1: resolution: {integrity: sha512-cihC68OcGiQOjGiXuo5Jk6XHANTHl1K4JLk/xlEJRTIXfy19Sg6XzB95XonYgr+1rB88bCpr7WZE7D7AlZow4g==} hasBin: true @@ -10712,6 +10762,9 @@ packages: resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} engines: {node: '>=8'} + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -11329,6 +11382,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + streamx@2.20.1: + resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} + strict-event-emitter-types@2.0.0: resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} @@ -11503,6 +11559,9 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -11542,6 +11601,9 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + text-decoder@1.2.0: + resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} + text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -12625,6 +12687,10 @@ packages: engines: {node: '>=8.0.0'} hasBin: true + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod-class@0.0.15: resolution: {integrity: sha512-CD5B4e9unKPj1hiy7JOSwRV01WqbEBkFOlhws0C9s9wB0FSpECOnlKXOAkjo9tKYX2enQsXWyyOIBNPPNUHWRA==} peerDependencies: @@ -17000,6 +17066,10 @@ snapshots: dependencies: '@types/node': 18.16.16 + '@types/archiver@6.0.2': + dependencies: + '@types/readdir-glob': 1.1.5 + '@types/argparse@1.0.38': {} '@types/aria-query@5.0.1': {} @@ -17314,6 +17384,10 @@ snapshots: '@types/node': 18.16.16 safe-buffer: 5.1.2 + '@types/readdir-glob@1.1.5': + dependencies: + '@types/node': 18.16.16 + '@types/replacestream@4.0.1': {} '@types/request@2.48.12': @@ -18040,6 +18114,26 @@ snapshots: arch@2.2.0: {} + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.4 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 @@ -18258,6 +18352,8 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.6.6: {} + babel-jest@29.6.2(@babel/core@7.24.0): dependencies: '@babel/core': 7.24.0 @@ -18316,6 +18412,9 @@ snapshots: balanced-match@1.0.2: {} + bare-events@2.4.2: + optional: true + base-64@1.0.0: {} base64-js@1.5.1: {} @@ -18359,7 +18458,7 @@ snapshots: '@types/readable-stream': 4.0.10 buffer: 6.0.3 inherits: 2.0.4 - readable-stream: 4.4.2 + readable-stream: 4.5.2 blob-util@2.0.2: {} @@ -18430,6 +18529,8 @@ snapshots: buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} + buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} @@ -18836,6 +18937,14 @@ snapshots: component-type@1.2.1: {} + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + compressible@2.0.18: dependencies: mime-db: 1.52.0 @@ -18951,6 +19060,13 @@ snapshots: nan: 2.20.0 optional: true + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + create-require@1.1.1: optional: true @@ -20168,6 +20284,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.2.12: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -20564,8 +20682,8 @@ snapshots: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.5 - minipass: 7.0.2 - path-scurry: 1.10.1 + minipass: 7.1.2 + path-scurry: 1.11.1 glob@10.4.5: dependencies: @@ -20598,7 +20716,7 @@ snapshots: fs.realpath: 1.0.0 minimatch: 7.4.2 minipass: 4.2.5 - path-scurry: 1.10.1 + path-scurry: 1.11.1 global-dirs@3.0.0: dependencies: @@ -22080,6 +22198,10 @@ snapshots: lazy-ass@1.6.0: {} + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.7 + ldapts@4.2.6: dependencies: '@types/asn1': 0.2.0 @@ -23576,7 +23698,7 @@ snapshots: path-scurry@1.10.1: dependencies: lru-cache: 10.2.2 - minipass: 7.0.2 + minipass: 7.1.2 path-scurry@1.11.1: dependencies: @@ -24062,6 +24184,8 @@ snapshots: queue-microtask@1.2.3: {} + queue-tick@1.0.1: {} + quoted-printable@1.0.1: dependencies: utf8: 2.1.2 @@ -24187,6 +24311,10 @@ snapshots: dependencies: readable-stream: 3.6.0 + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.5 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -24997,6 +25125,14 @@ snapshots: streamsearch@1.1.0: {} + streamx@2.20.1: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.0 + optionalDependencies: + bare-events: 2.4.2 + strict-event-emitter-types@2.0.0: {} strict-uri-encode@2.0.0: {} @@ -25124,7 +25260,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -25236,6 +25372,12 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.0 + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.20.1 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -25307,6 +25449,10 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 + text-decoder@1.2.0: + dependencies: + b4a: 1.6.6 + text-hex@1.0.0: {} text-table@0.2.0: {} @@ -26395,6 +26541,12 @@ snapshots: optionalDependencies: commander: 9.4.1 + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 + zod-class@0.0.15(zod@3.23.8): dependencies: type-fest: 4.26.1