create a single archive. add an export path flag

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™ 2024-09-23 21:31:39 +02:00
parent 5d35e61937
commit 9ca333735f
No known key found for this signature in database
4 changed files with 203 additions and 27 deletions

View file

@ -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",

View file

@ -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
}

View file

@ -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() {

View file

@ -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