@push.rocks/smartarchive 4.2.4 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/bzip2/bititerator.d.ts +6 -1
  3. package/dist_ts/bzip2/bititerator.js +30 -24
  4. package/dist_ts/bzip2/bzip2.d.ts +27 -12
  5. package/dist_ts/bzip2/bzip2.js +325 -263
  6. package/dist_ts/bzip2/index.d.ts +4 -1
  7. package/dist_ts/bzip2/index.js +36 -38
  8. package/dist_ts/classes.archiveanalyzer.d.ts +25 -5
  9. package/dist_ts/classes.archiveanalyzer.js +19 -8
  10. package/dist_ts/classes.bzip2tools.d.ts +1 -1
  11. package/dist_ts/classes.gziptools.d.ts +39 -6
  12. package/dist_ts/classes.gziptools.js +85 -24
  13. package/dist_ts/classes.smartarchive.d.ts +101 -16
  14. package/dist_ts/classes.smartarchive.js +395 -58
  15. package/dist_ts/classes.tartools.d.ts +31 -4
  16. package/dist_ts/classes.tartools.js +93 -32
  17. package/dist_ts/classes.ziptools.d.ts +47 -12
  18. package/dist_ts/classes.ziptools.js +142 -23
  19. package/dist_ts/errors.d.ts +44 -0
  20. package/dist_ts/errors.js +62 -0
  21. package/dist_ts/index.d.ts +4 -0
  22. package/dist_ts/index.js +9 -1
  23. package/dist_ts/interfaces.d.ts +115 -0
  24. package/dist_ts/interfaces.js +2 -0
  25. package/package.json +1 -1
  26. package/ts/00_commitinfo_data.ts +1 -1
  27. package/ts/bzip2/bititerator.ts +43 -27
  28. package/ts/bzip2/bzip2.ts +289 -171
  29. package/ts/bzip2/index.ts +52 -50
  30. package/ts/classes.archiveanalyzer.ts +42 -28
  31. package/ts/classes.gziptools.ts +96 -33
  32. package/ts/classes.smartarchive.ts +469 -118
  33. package/ts/classes.tartools.ts +124 -52
  34. package/ts/classes.ziptools.ts +160 -34
  35. package/ts/errors.ts +70 -0
  36. package/ts/index.ts +11 -0
  37. package/ts/interfaces.ts +131 -0
@@ -1,43 +1,220 @@
1
1
  import * as plugins from './plugins.js';
2
- import * as paths from './paths.js';
3
2
  import { Bzip2Tools } from './classes.bzip2tools.js';
4
3
  import { GzipTools } from './classes.gziptools.js';
5
4
  import { TarTools } from './classes.tartools.js';
6
5
  import { ZipTools } from './classes.ziptools.js';
7
- import { ArchiveAnalyzer, } from './classes.archiveanalyzer.js';
6
+ import { ArchiveAnalyzer } from './classes.archiveanalyzer.js';
7
+ /**
8
+ * Main class for archive manipulation
9
+ * Supports TAR, ZIP, GZIP, and BZIP2 formats
10
+ */
8
11
  export class SmartArchive {
9
- // STATIC
10
- static async fromArchiveUrl(urlArg) {
12
+ // ============================================
13
+ // STATIC FACTORY METHODS - EXTRACTION
14
+ // ============================================
15
+ /**
16
+ * Create SmartArchive from a URL
17
+ */
18
+ static async fromUrl(urlArg) {
11
19
  const smartArchiveInstance = new SmartArchive();
12
20
  smartArchiveInstance.sourceUrl = urlArg;
13
21
  return smartArchiveInstance;
14
22
  }
15
- static async fromArchiveFile(filePathArg) {
23
+ /**
24
+ * Create SmartArchive from a local file path
25
+ */
26
+ static async fromFile(filePathArg) {
16
27
  const smartArchiveInstance = new SmartArchive();
17
28
  smartArchiveInstance.sourceFilePath = filePathArg;
18
29
  return smartArchiveInstance;
19
30
  }
20
- static async fromArchiveStream(streamArg) {
31
+ /**
32
+ * Create SmartArchive from a readable stream
33
+ */
34
+ static async fromStream(streamArg) {
21
35
  const smartArchiveInstance = new SmartArchive();
22
36
  smartArchiveInstance.sourceStream = streamArg;
23
37
  return smartArchiveInstance;
24
38
  }
39
+ /**
40
+ * Create SmartArchive from an in-memory buffer
41
+ */
42
+ static async fromBuffer(buffer) {
43
+ const smartArchiveInstance = new SmartArchive();
44
+ smartArchiveInstance.sourceStream = plugins.stream.Readable.from(buffer);
45
+ return smartArchiveInstance;
46
+ }
47
+ // ============================================
48
+ // STATIC FACTORY METHODS - CREATION
49
+ // ============================================
50
+ /**
51
+ * Create a new archive from a directory
52
+ */
53
+ static async fromDirectory(directoryPath, options) {
54
+ const smartArchiveInstance = new SmartArchive();
55
+ smartArchiveInstance.creationOptions = options;
56
+ const tarTools = new TarTools();
57
+ if (options.format === 'tar' || options.format === 'tar.gz' || options.format === 'tgz') {
58
+ if (options.format === 'tar') {
59
+ const pack = await tarTools.packDirectory(directoryPath);
60
+ pack.finalize();
61
+ smartArchiveInstance.archiveBuffer = await SmartArchive.streamToBuffer(pack);
62
+ }
63
+ else {
64
+ smartArchiveInstance.archiveBuffer = await tarTools.packDirectoryToTarGz(directoryPath, options.compressionLevel);
65
+ }
66
+ }
67
+ else if (options.format === 'zip') {
68
+ const zipTools = new ZipTools();
69
+ const fileTree = await plugins.listFileTree(directoryPath, '**/*');
70
+ const entries = [];
71
+ for (const filePath of fileTree) {
72
+ const absolutePath = plugins.path.join(directoryPath, filePath);
73
+ const content = await plugins.fsPromises.readFile(absolutePath);
74
+ entries.push({
75
+ archivePath: filePath,
76
+ content,
77
+ });
78
+ }
79
+ smartArchiveInstance.archiveBuffer = await zipTools.createZip(entries, options.compressionLevel);
80
+ }
81
+ else {
82
+ throw new Error(`Unsupported format for directory packing: ${options.format}`);
83
+ }
84
+ return smartArchiveInstance;
85
+ }
86
+ /**
87
+ * Create a new archive from an array of entries
88
+ */
89
+ static async fromFiles(files, options) {
90
+ const smartArchiveInstance = new SmartArchive();
91
+ smartArchiveInstance.creationOptions = options;
92
+ if (options.format === 'tar' || options.format === 'tar.gz' || options.format === 'tgz') {
93
+ const tarTools = new TarTools();
94
+ if (options.format === 'tar') {
95
+ smartArchiveInstance.archiveBuffer = await tarTools.packFiles(files);
96
+ }
97
+ else {
98
+ smartArchiveInstance.archiveBuffer = await tarTools.packFilesToTarGz(files, options.compressionLevel);
99
+ }
100
+ }
101
+ else if (options.format === 'zip') {
102
+ const zipTools = new ZipTools();
103
+ smartArchiveInstance.archiveBuffer = await zipTools.createZip(files, options.compressionLevel);
104
+ }
105
+ else if (options.format === 'gz') {
106
+ if (files.length !== 1) {
107
+ throw new Error('GZIP format only supports a single file');
108
+ }
109
+ const gzipTools = new GzipTools();
110
+ let content;
111
+ if (typeof files[0].content === 'string') {
112
+ content = Buffer.from(files[0].content);
113
+ }
114
+ else if (Buffer.isBuffer(files[0].content)) {
115
+ content = files[0].content;
116
+ }
117
+ else {
118
+ throw new Error('GZIP format requires string or Buffer content');
119
+ }
120
+ smartArchiveInstance.archiveBuffer = await gzipTools.compress(content, options.compressionLevel);
121
+ }
122
+ else {
123
+ throw new Error(`Unsupported format: ${options.format}`);
124
+ }
125
+ return smartArchiveInstance;
126
+ }
127
+ /**
128
+ * Start building an archive incrementally using a builder pattern
129
+ */
130
+ static create(options) {
131
+ const smartArchiveInstance = new SmartArchive();
132
+ smartArchiveInstance.creationOptions = options;
133
+ smartArchiveInstance.pendingEntries = [];
134
+ return smartArchiveInstance;
135
+ }
136
+ /**
137
+ * Helper to convert a stream to buffer
138
+ */
139
+ static async streamToBuffer(stream) {
140
+ const chunks = [];
141
+ return new Promise((resolve, reject) => {
142
+ stream.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
143
+ stream.on('end', () => resolve(Buffer.concat(chunks)));
144
+ stream.on('error', reject);
145
+ });
146
+ }
25
147
  constructor() {
26
- // INSTANCE
148
+ // ============================================
149
+ // INSTANCE PROPERTIES
150
+ // ============================================
27
151
  this.tarTools = new TarTools();
28
152
  this.zipTools = new ZipTools();
29
153
  this.gzipTools = new GzipTools();
30
154
  this.bzip2Tools = new Bzip2Tools(this);
31
155
  this.archiveAnalyzer = new ArchiveAnalyzer(this);
32
- this.singleFileMode = false;
33
- this.addedDirectories = [];
34
- this.addedFiles = [];
35
- this.addedUrls = [];
156
+ }
157
+ // ============================================
158
+ // BUILDER METHODS (for incremental creation)
159
+ // ============================================
160
+ /**
161
+ * Add a file to the archive (builder pattern)
162
+ */
163
+ addFile(archivePath, content) {
164
+ if (!this.pendingEntries) {
165
+ throw new Error('addFile can only be called on archives created with SmartArchive.create()');
166
+ }
167
+ this.pendingEntries.push({ archivePath, content });
168
+ return this;
169
+ }
170
+ /**
171
+ * Add a SmartFile to the archive (builder pattern)
172
+ */
173
+ addSmartFile(file, archivePath) {
174
+ if (!this.pendingEntries) {
175
+ throw new Error('addSmartFile can only be called on archives created with SmartArchive.create()');
176
+ }
177
+ this.pendingEntries.push({
178
+ archivePath: archivePath || file.relative,
179
+ content: file,
180
+ });
181
+ return this;
182
+ }
183
+ /**
184
+ * Add a StreamFile to the archive (builder pattern)
185
+ */
186
+ addStreamFile(file, archivePath) {
187
+ if (!this.pendingEntries) {
188
+ throw new Error('addStreamFile can only be called on archives created with SmartArchive.create()');
189
+ }
190
+ this.pendingEntries.push({
191
+ archivePath: archivePath || file.relativeFilePath,
192
+ content: file,
193
+ });
194
+ return this;
36
195
  }
37
196
  /**
38
- * gets the original archive stream
197
+ * Build the archive from pending entries
39
198
  */
40
- async getArchiveStream() {
199
+ async build() {
200
+ if (!this.pendingEntries || !this.creationOptions) {
201
+ throw new Error('build can only be called on archives created with SmartArchive.create()');
202
+ }
203
+ const built = await SmartArchive.fromFiles(this.pendingEntries, this.creationOptions);
204
+ this.archiveBuffer = built.archiveBuffer;
205
+ this.pendingEntries = undefined;
206
+ return this;
207
+ }
208
+ // ============================================
209
+ // EXTRACTION METHODS
210
+ // ============================================
211
+ /**
212
+ * Get the original archive stream
213
+ */
214
+ async toStream() {
215
+ if (this.archiveBuffer) {
216
+ return plugins.stream.Readable.from(this.archiveBuffer);
217
+ }
41
218
  if (this.sourceStream) {
42
219
  return this.sourceStream;
43
220
  }
@@ -46,42 +223,75 @@ export class SmartArchive {
46
223
  .url(this.sourceUrl)
47
224
  .get();
48
225
  const webStream = response.stream();
49
- // @ts-ignore - Web stream to Node.js stream conversion
50
- const urlStream = plugins.stream.Readable.fromWeb(webStream);
51
- return urlStream;
226
+ return plugins.stream.Readable.fromWeb(webStream);
52
227
  }
53
228
  if (this.sourceFilePath) {
54
- const fileStream = plugins.fs.createReadStream(this.sourceFilePath);
55
- return fileStream;
229
+ return plugins.fs.createReadStream(this.sourceFilePath);
56
230
  }
231
+ throw new Error('No archive source configured');
57
232
  }
58
- async exportToTarGzStream() {
59
- const tarPackStream = await this.tarTools.getPackStream();
60
- const gzipStream = await this.gzipTools.getCompressionStream();
61
- // const archiveStream = tarPackStream.pipe(gzipStream);
62
- // return archiveStream;
233
+ /**
234
+ * Get archive as a Buffer
235
+ */
236
+ async toBuffer() {
237
+ if (this.archiveBuffer) {
238
+ return this.archiveBuffer;
239
+ }
240
+ const stream = await this.toStream();
241
+ return SmartArchive.streamToBuffer(stream);
63
242
  }
64
- async exportToFs(targetDir, fileNameArg) {
243
+ /**
244
+ * Write archive to a file
245
+ */
246
+ async toFile(filePath) {
247
+ const buffer = await this.toBuffer();
248
+ await plugins.fsPromises.mkdir(plugins.path.dirname(filePath), { recursive: true });
249
+ await plugins.fsPromises.writeFile(filePath, buffer);
250
+ }
251
+ /**
252
+ * Extract archive to filesystem
253
+ */
254
+ async extractToDirectory(targetDir, options) {
65
255
  const done = plugins.smartpromise.defer();
66
- const streamFileStream = await this.exportToStreamOfStreamFiles();
256
+ const streamFileStream = await this.extractToStream();
67
257
  streamFileStream.pipe(new plugins.smartstream.SmartDuplex({
68
258
  objectMode: true,
69
- writeFunction: async (streamFileArg, streamtools) => {
70
- const done = plugins.smartpromise.defer();
71
- console.log(streamFileArg.relativeFilePath
72
- ? streamFileArg.relativeFilePath
73
- : 'no relative path');
259
+ writeFunction: async (streamFileArg) => {
260
+ const innerDone = plugins.smartpromise.defer();
74
261
  const streamFile = streamFileArg;
262
+ let relativePath = streamFile.relativeFilePath || options?.fileName || 'extracted_file';
263
+ // Apply stripComponents if specified
264
+ if (options?.stripComponents && options.stripComponents > 0) {
265
+ const parts = relativePath.split('/');
266
+ relativePath = parts.slice(options.stripComponents).join('/');
267
+ if (!relativePath) {
268
+ innerDone.resolve();
269
+ return;
270
+ }
271
+ }
272
+ // Apply filter if specified
273
+ if (options?.filter) {
274
+ const entryInfo = {
275
+ path: relativePath,
276
+ size: 0,
277
+ isDirectory: false,
278
+ isFile: true,
279
+ };
280
+ if (!options.filter(entryInfo)) {
281
+ innerDone.resolve();
282
+ return;
283
+ }
284
+ }
75
285
  const readStream = await streamFile.createReadStream();
76
286
  await plugins.fsPromises.mkdir(targetDir, { recursive: true });
77
- const writePath = plugins.path.join(targetDir, streamFile.relativeFilePath || fileNameArg);
287
+ const writePath = plugins.path.join(targetDir, relativePath);
78
288
  await plugins.fsPromises.mkdir(plugins.path.dirname(writePath), { recursive: true });
79
289
  const writeStream = plugins.fs.createWriteStream(writePath);
80
290
  readStream.pipe(writeStream);
81
291
  writeStream.on('finish', () => {
82
- done.resolve();
292
+ innerDone.resolve();
83
293
  });
84
- await done.promise;
294
+ await innerDone.promise;
85
295
  },
86
296
  finalFunction: async () => {
87
297
  done.resolve();
@@ -89,41 +299,43 @@ export class SmartArchive {
89
299
  }));
90
300
  return done.promise;
91
301
  }
92
- async exportToStreamOfStreamFiles() {
302
+ /**
303
+ * Extract archive to a stream of StreamFile objects
304
+ */
305
+ async extractToStream() {
93
306
  const streamFileIntake = new plugins.smartstream.StreamIntake({
94
307
  objectMode: true,
95
308
  });
96
- const archiveStream = await this.getArchiveStream();
309
+ // Guard to prevent multiple signalEnd calls
310
+ let hasSignaledEnd = false;
311
+ const safeSignalEnd = () => {
312
+ if (!hasSignaledEnd) {
313
+ hasSignaledEnd = true;
314
+ streamFileIntake.signalEnd();
315
+ }
316
+ };
317
+ const archiveStream = await this.toStream();
97
318
  const createAnalyzedStream = () => this.archiveAnalyzer.getAnalyzedStream();
98
- // lets create a function that can be called multiple times to unpack layers of archives
99
319
  const createUnpackStream = () => plugins.smartstream.createTransformFunction(async (analyzedResultChunk) => {
100
320
  if (analyzedResultChunk.fileType?.mime === 'application/x-tar') {
101
321
  const tarStream = analyzedResultChunk.decompressionStream;
102
322
  tarStream.on('entry', async (header, stream, next) => {
103
323
  if (header.type === 'directory') {
104
- console.log(`tar stream directory: ${header.name} ... skipping!`);
105
- stream.resume(); // Consume directory stream
324
+ stream.resume();
106
325
  stream.on('end', () => next());
107
326
  return;
108
327
  }
109
- console.log(`tar stream file: ${header.name}`);
110
- // Create a PassThrough stream to buffer the data
111
328
  const passThrough = new plugins.stream.PassThrough();
112
329
  const streamfile = plugins.smartfile.StreamFile.fromStream(passThrough, header.name);
113
- // Push the streamfile immediately
114
330
  streamFileIntake.push(streamfile);
115
- // Pipe the tar entry stream to the passthrough
116
331
  stream.pipe(passThrough);
117
- // Move to next entry when this one ends
118
332
  stream.on('end', () => {
119
333
  passThrough.end();
120
334
  next();
121
335
  });
122
336
  });
123
- tarStream.on('finish', function () {
124
- console.log('tar extraction finished');
125
- // Only signal end if this is the final stream
126
- streamFileIntake.signalEnd();
337
+ tarStream.on('finish', () => {
338
+ safeSignalEnd();
127
339
  });
128
340
  analyzedResultChunk.resultStream.pipe(analyzedResultChunk.decompressionStream);
129
341
  }
@@ -132,33 +344,158 @@ export class SmartArchive {
132
344
  .pipe(analyzedResultChunk.decompressionStream)
133
345
  .pipe(new plugins.smartstream.SmartDuplex({
134
346
  objectMode: true,
135
- writeFunction: async (streamFileArg, streamtools) => {
347
+ writeFunction: async (streamFileArg) => {
136
348
  streamFileIntake.push(streamFileArg);
137
349
  },
138
350
  finalFunction: async () => {
139
- streamFileIntake.signalEnd();
351
+ safeSignalEnd();
140
352
  },
141
353
  }));
142
354
  }
143
- else if (analyzedResultChunk.isArchive &&
144
- analyzedResultChunk.decompressionStream) {
355
+ else if (analyzedResultChunk.isArchive && analyzedResultChunk.decompressionStream) {
145
356
  // For nested archives (like gzip containing tar)
146
- const nestedStream = analyzedResultChunk.resultStream
357
+ analyzedResultChunk.resultStream
147
358
  .pipe(analyzedResultChunk.decompressionStream)
148
359
  .pipe(createAnalyzedStream())
149
360
  .pipe(createUnpackStream());
150
- // Don't signal end here - let the nested unpacker handle it
151
361
  }
152
362
  else {
153
363
  const streamFile = plugins.smartfile.StreamFile.fromStream(analyzedResultChunk.resultStream, analyzedResultChunk.fileType?.ext);
154
364
  streamFileIntake.push(streamFile);
155
- streamFileIntake.signalEnd();
365
+ safeSignalEnd();
156
366
  }
157
- }, {
158
- objectMode: true,
159
- });
367
+ }, { objectMode: true });
160
368
  archiveStream.pipe(createAnalyzedStream()).pipe(createUnpackStream());
161
369
  return streamFileIntake;
162
370
  }
371
+ /**
372
+ * Extract archive to an array of SmartFile objects (in-memory)
373
+ */
374
+ async extractToSmartFiles() {
375
+ const streamFiles = await this.extractToStream();
376
+ const smartFiles = [];
377
+ return new Promise((resolve, reject) => {
378
+ streamFiles.on('data', async (streamFile) => {
379
+ try {
380
+ const smartFile = await streamFile.toSmartFile();
381
+ smartFiles.push(smartFile);
382
+ }
383
+ catch (err) {
384
+ reject(err);
385
+ }
386
+ });
387
+ streamFiles.on('end', () => resolve(smartFiles));
388
+ streamFiles.on('error', reject);
389
+ });
390
+ }
391
+ /**
392
+ * Extract a single file from the archive by path
393
+ */
394
+ async extractFile(filePath) {
395
+ const streamFiles = await this.extractToStream();
396
+ return new Promise((resolve, reject) => {
397
+ let found = false;
398
+ streamFiles.on('data', async (streamFile) => {
399
+ if (streamFile.relativeFilePath === filePath || streamFile.relativeFilePath?.endsWith(filePath)) {
400
+ found = true;
401
+ try {
402
+ const smartFile = await streamFile.toSmartFile();
403
+ resolve(smartFile);
404
+ }
405
+ catch (err) {
406
+ reject(err);
407
+ }
408
+ }
409
+ });
410
+ streamFiles.on('end', () => {
411
+ if (!found) {
412
+ resolve(null);
413
+ }
414
+ });
415
+ streamFiles.on('error', reject);
416
+ });
417
+ }
418
+ // ============================================
419
+ // ANALYSIS METHODS
420
+ // ============================================
421
+ /**
422
+ * Analyze the archive and return metadata
423
+ */
424
+ async analyze() {
425
+ const stream = await this.toStream();
426
+ const firstChunk = await this.readFirstChunk(stream);
427
+ const fileType = await plugins.fileType.fileTypeFromBuffer(firstChunk);
428
+ let format = null;
429
+ let isCompressed = false;
430
+ let isArchive = false;
431
+ if (fileType) {
432
+ switch (fileType.mime) {
433
+ case 'application/gzip':
434
+ format = 'gz';
435
+ isCompressed = true;
436
+ isArchive = true;
437
+ break;
438
+ case 'application/zip':
439
+ format = 'zip';
440
+ isCompressed = true;
441
+ isArchive = true;
442
+ break;
443
+ case 'application/x-tar':
444
+ format = 'tar';
445
+ isArchive = true;
446
+ break;
447
+ case 'application/x-bzip2':
448
+ format = 'bz2';
449
+ isCompressed = true;
450
+ isArchive = true;
451
+ break;
452
+ }
453
+ }
454
+ return {
455
+ format,
456
+ isCompressed,
457
+ isArchive,
458
+ };
459
+ }
460
+ /**
461
+ * List all entries in the archive without extracting
462
+ */
463
+ async listEntries() {
464
+ const entries = [];
465
+ const streamFiles = await this.extractToStream();
466
+ return new Promise((resolve, reject) => {
467
+ streamFiles.on('data', (streamFile) => {
468
+ entries.push({
469
+ path: streamFile.relativeFilePath || 'unknown',
470
+ size: 0, // Size not available without reading
471
+ isDirectory: false,
472
+ isFile: true,
473
+ });
474
+ });
475
+ streamFiles.on('end', () => resolve(entries));
476
+ streamFiles.on('error', reject);
477
+ });
478
+ }
479
+ /**
480
+ * Check if a specific file exists in the archive
481
+ */
482
+ async hasFile(filePath) {
483
+ const entries = await this.listEntries();
484
+ return entries.some((e) => e.path === filePath || e.path.endsWith(filePath));
485
+ }
486
+ /**
487
+ * Helper to read first chunk from stream
488
+ */
489
+ async readFirstChunk(stream) {
490
+ return new Promise((resolve, reject) => {
491
+ const onData = (chunk) => {
492
+ stream.removeListener('data', onData);
493
+ stream.removeListener('error', reject);
494
+ resolve(chunk);
495
+ };
496
+ stream.on('data', onData);
497
+ stream.on('error', reject);
498
+ });
499
+ }
163
500
  }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFyY2hpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnNtYXJ0YXJjaGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxFQUNMLGVBQWUsR0FFaEIsTUFBTSw4QkFBOEIsQ0FBQztBQUl0QyxNQUFNLE9BQU8sWUFBWTtJQUN2QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBYztRQUMvQyxNQUFNLG9CQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEQsb0JBQW9CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztRQUN4QyxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDakMsV0FBbUI7UUFFbkIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hELG9CQUFvQixDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUM7UUFDbEQsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FDbkMsU0FHNEI7UUFFNUIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hELG9CQUFvQixDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUMsT0FBTyxvQkFB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
501
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFyY2hpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnNtYXJ0YXJjaGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQVd4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSw4QkFBOEIsQ0FBQztBQUVyRjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QiwrQ0FBK0M7SUFDL0Msc0NBQXNDO0lBQ3RDLCtDQUErQztJQUUvQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQWM7UUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hELG9CQUFvQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDeEMsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFtQjtRQUM5QyxNQUFNLG9CQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEQsb0JBQW9CLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQztRQUNsRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUM1QixTQUFxRjtRQUVyRixNQUFNLG9CQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEQsb0JBQW9CLENBQUMs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
@@ -1,17 +1,44 @@
1
1
  import * as plugins from './plugins.js';
2
+ import type { IArchiveEntry, TCompressionLevel } from './interfaces.js';
3
+ /**
4
+ * TAR archive creation and extraction utilities
5
+ */
2
6
  export declare class TarTools {
3
- constructor();
7
+ /**
8
+ * Add a file to a TAR pack stream
9
+ */
4
10
  addFileToPack(pack: plugins.tarStream.Pack, optionsArg: {
5
11
  fileName?: string;
6
- content?: string | Buffer | plugins.smartstream.stream.Readable | plugins.smartfile.SmartFile | plugins.smartfile.StreamFile;
12
+ content?: string | Buffer | plugins.stream.Readable | plugins.smartfile.SmartFile | plugins.smartfile.StreamFile;
7
13
  byteLength?: number;
8
14
  filePath?: string;
9
15
  }): Promise<void>;
10
16
  /**
11
- * packs a directory from disk into a tar stream
12
- * @param directoryPath
17
+ * Pack a directory into a TAR stream
13
18
  */
14
19
  packDirectory(directoryPath: string): Promise<plugins.tarStream.Pack>;
20
+ /**
21
+ * Get a new TAR pack stream
22
+ */
15
23
  getPackStream(): Promise<plugins.tarStream.Pack>;
24
+ /**
25
+ * Get a TAR extraction stream
26
+ */
16
27
  getDecompressionStream(): plugins.tarStream.Extract;
28
+ /**
29
+ * Pack files into a TAR buffer
30
+ */
31
+ packFiles(files: IArchiveEntry[]): Promise<Buffer>;
32
+ /**
33
+ * Pack a directory into a TAR.GZ buffer
34
+ */
35
+ packDirectoryToTarGz(directoryPath: string, compressionLevel?: TCompressionLevel): Promise<Buffer>;
36
+ /**
37
+ * Pack a directory into a TAR.GZ stream
38
+ */
39
+ packDirectoryToTarGzStream(directoryPath: string, compressionLevel?: TCompressionLevel): Promise<plugins.stream.Readable>;
40
+ /**
41
+ * Pack files into a TAR.GZ buffer
42
+ */
43
+ packFilesToTarGz(files: IArchiveEntry[], compressionLevel?: TCompressionLevel): Promise<Buffer>;
17
44
  }