@push.rocks/smartarchive 4.0.24 → 4.0.26

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartarchive',
6
- version: '4.0.24',
6
+ version: '4.0.26',
7
7
  description: 'A library for working with archive files, providing utilities for compressing and decompressing data.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVHQUF1RztDQUNySCxDQUFBIn0=
@@ -1,10 +1,21 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
2
3
  import type { SmartArchive } from './classes.smartarchive.js';
3
4
  import * as plugins from './plugins.js';
4
5
  export declare class TarTools {
5
6
  smartArchiveRef: SmartArchive;
6
7
  constructor(smartArchiveRefArg: SmartArchive);
7
- addFileToPack(pack: plugins.tarStream.Pack, fileName: string, content: string | Buffer): Promise<void>;
8
+ addFileToPack(pack: plugins.tarStream.Pack, optionsArg: {
9
+ fileName?: string;
10
+ content?: string | Buffer | plugins.smartstream.stream.Readable | plugins.smartfile.SmartFile | plugins.smartfile.StreamFile;
11
+ byteLength?: number;
12
+ filePath?: string;
13
+ }): Promise<void>;
14
+ /**
15
+ * packs a directory from disk into a tar stream
16
+ * @param directoryPath
17
+ */
18
+ packDirectory(directoryPath: string): Promise<void>;
8
19
  getPackStream(): Promise<plugins.tarStream.Pack>;
9
20
  getDecompressionStream(): plugins.tarStream.Extract;
10
21
  }
@@ -4,9 +4,47 @@ export class TarTools {
4
4
  this.smartArchiveRef = smartArchiveRefArg;
5
5
  }
6
6
  // packing
7
- addFileToPack(pack, fileName, content) {
8
- return new Promise((resolve, reject) => {
9
- const entry = pack.entry({ name: fileName, size: content.length }, (err) => {
7
+ async addFileToPack(pack, optionsArg) {
8
+ return new Promise(async (resolve, reject) => {
9
+ let fileName = optionsArg.fileName || optionsArg.content instanceof plugins.smartfile.SmartFile
10
+ ? optionsArg.content.relative
11
+ : null || optionsArg.content instanceof plugins.smartfile.StreamFile
12
+ ? optionsArg.content.relativeFilePath
13
+ : null || optionsArg.filePath;
14
+ /**
15
+ * contentByteLength is used to set the size of the entry in the tar file
16
+ */
17
+ let contentByteLength;
18
+ if (optionsArg.byteLength) {
19
+ contentByteLength = optionsArg.byteLength;
20
+ }
21
+ else if (typeof optionsArg.content === 'string') {
22
+ contentByteLength = Buffer.byteLength(optionsArg.content, 'utf8');
23
+ }
24
+ else if (Buffer.isBuffer(optionsArg.content)) {
25
+ contentByteLength = optionsArg.content.length;
26
+ }
27
+ else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
28
+ contentByteLength = await optionsArg.content.getSize(); // assuming SmartFile has getSize method
29
+ }
30
+ else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
31
+ contentByteLength = await optionsArg.content.getSize(); // assuming StreamFile has getSize method
32
+ }
33
+ else if (optionsArg.content instanceof plugins.smartstream.stream.Readable) {
34
+ console.warn('@push.rocks/smartarchive: When streaming, it is recommended to provide byteLength, if known.');
35
+ }
36
+ else if (optionsArg.filePath) {
37
+ const fileStat = await plugins.smartfile.fs.stat(optionsArg.filePath);
38
+ contentByteLength = fileStat.size;
39
+ }
40
+ const entry = pack.entry({
41
+ name: fileName,
42
+ ...(contentByteLength
43
+ ? {
44
+ size: contentByteLength,
45
+ }
46
+ : null),
47
+ }, (err) => {
10
48
  if (err) {
11
49
  reject(err);
12
50
  }
@@ -14,10 +52,46 @@ export class TarTools {
14
52
  resolve();
15
53
  }
16
54
  });
17
- entry.write(content);
18
- entry.end();
55
+ let content;
56
+ if (Buffer.isBuffer(optionsArg.content)) {
57
+ content = plugins.smartstream.stream.Readable.from(optionsArg.content);
58
+ }
59
+ else if (typeof optionsArg.content === 'string') {
60
+ content = plugins.smartstream.stream.Readable.from(Buffer.from(optionsArg.content));
61
+ }
62
+ else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
63
+ content = plugins.smartstream.stream.Readable.from(optionsArg.content.contents);
64
+ }
65
+ else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
66
+ content = await optionsArg.content.createReadStream();
67
+ }
68
+ else if (optionsArg.content instanceof plugins.smartstream.stream.Readable) {
69
+ content = optionsArg.content;
70
+ }
71
+ content.pipe(entry);
72
+ entry.on('end', () => {
73
+ resolve();
74
+ });
19
75
  });
20
76
  }
77
+ /**
78
+ * packs a directory from disk into a tar stream
79
+ * @param directoryPath
80
+ */
81
+ async packDirectory(directoryPath) {
82
+ const fileTree = await plugins.smartfile.fs.listFileTree(directoryPath, '**/*');
83
+ const pack = await this.getPackStream();
84
+ for (const filePath of fileTree) {
85
+ const absolutePath = plugins.path.join(directoryPath, filePath);
86
+ const fileStat = await plugins.smartfile.fs.stat(absolutePath);
87
+ await this.addFileToPack(pack, {
88
+ byteLength: fileStat.size,
89
+ filePath: filePath,
90
+ fileName: filePath,
91
+ content: plugins.smartfile.fsStream.createReadStream(absolutePath),
92
+ });
93
+ }
94
+ }
21
95
  async getPackStream() {
22
96
  const pack = plugins.tarStream.pack();
23
97
  return pack;
@@ -27,4 +101,4 @@ export class TarTools {
27
101
  return plugins.tarStream.extract();
28
102
  }
29
103
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXJ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudGFydG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxPQUFPLFFBQVE7SUFHbkIsWUFBWSxrQkFBZ0M7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUM1QyxDQUFDO0lBRUQsVUFBVTtJQUNILGFBQWEsQ0FBQyxJQUE0QixFQUFFLFFBQWdCLEVBQUUsT0FBd0I7UUFDM0YsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBVSxFQUFFLEVBQUU7Z0JBQ2hGLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYTtJQUNiLHNCQUFzQjtRQUNwQixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDckMsQ0FBQztDQUNGIn0=
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXJ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudGFydG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxPQUFPLFFBQVE7SUFJbkIsWUFBWSxrQkFBZ0M7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUM1QyxDQUFDO0lBRUQsVUFBVTtJQUNILEtBQUssQ0FBQyxhQUFhLENBQ3hCLElBQTRCLEVBQzVCLFVBVUM7UUFFRCxPQUFPLElBQUksT0FBTyxDQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakQsSUFBSSxRQUFRLEdBQ1YsVUFBVSxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsT0FBTyxZQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUztnQkFDOUUsQ0FBQyxDQUFFLFVBQVUsQ0FBQyxPQUF1QyxDQUFDLFFBQVE7Z0JBQzlELENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVU7b0JBQ3BFLENBQUMsQ0FBRSxVQUFVLENBQUMsT0FBd0MsQ0FBQyxnQkFBZ0I7b0JBQ3ZFLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUVsQzs7ZUFFRztZQUNILElBQUksaUJBQXlCLENBQUM7WUFDOUIsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFCLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDNUMsQ0FBQztpQkFBTSxJQUFJLE9BQU8sVUFBVSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbEQsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BFLENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNoRCxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyRSxpQkFBaUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7WUFDbEcsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLFlBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEUsaUJBQWlCLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMseUNBQXlDO1lBQ25HLENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxZQUFZLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3RSxPQUFPLENBQUMsSUFBSSxDQUNWLDhGQUE4RixDQUMvRixDQUFDO1lBQ0osQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3BDLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN0QjtnQkFDRSxJQUFJLEVBQUUsUUFBUTtnQkFDZCxHQUFHLENBQUMsaUJBQWlCO29CQUNuQixDQUFDLENBQUM7d0JBQ0UsSUFBSSxFQUFFLGlCQUFpQjtxQkFDeEI7b0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUNWLEVBQ0QsQ0FBQyxHQUFVLEVBQUUsRUFBRTtnQkFDYixJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1lBRUYsSUFBSSxPQUE0QyxDQUFDO1lBQ2pELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pFLENBQUM7aUJBQU0sSUFBSSxPQUFPLFVBQVUsQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xELE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDdEYsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLFlBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDckUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRixDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0RSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEQsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLFlBQVksT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdFLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQy9CLENBQUM7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDbkIsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBcUI7UUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLEtBQUssTUFBTSxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQy9ELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7Z0JBQzdCLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDekIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDO2FBQ25FLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWE7UUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxhQUFhO0lBQ2Isc0JBQXNCO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0YifQ==
@@ -15,7 +15,7 @@ class DecompressZipTransform extends plugins.smartstream.SmartDuplex {
15
15
  });
16
16
  this.unzipper = new plugins.fflate.Unzip(async (fileArg) => {
17
17
  let resultBuffer;
18
- fileArg.ondata = async (dataArg, dat, final) => {
18
+ fileArg.ondata = async (flateError, dat, final) => {
19
19
  resultBuffer ? resultBuffer = Buffer.concat([resultBuffer, Buffer.from(dat)])
20
20
  : resultBuffer = Buffer.from(dat);
21
21
  if (final) {
@@ -63,4 +63,4 @@ export class ZipTools {
63
63
  return new DecompressZipTransform();
64
64
  }
65
65
  }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy56aXB0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuemlwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxzQkFBdUIsU0FBUSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQTRCO0lBZW5GO1FBQ0UsS0FBSyxDQUFDO1lBQ0osVUFBVSxFQUFFLElBQUk7WUFDaEIsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFnQixFQUFFLGNBQWMsRUFBRSxFQUFFO2dCQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBekJHLGFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM1RCxJQUFJLFlBQW9CLENBQUM7WUFDekIsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDN0MsWUFBWSxDQUFBLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzFFLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3pFLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUMsQ0FBQTtZQUNELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQWNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVM7SUFHaEU7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYSxFQUFFLFFBQXdCLEVBQUUsUUFBMEM7UUFDNUYsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQTBDO1FBQy9DLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxRQUFRO0lBR25CLFlBQVksa0JBQWdDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsa0JBQWtCLENBQUM7SUFDNUMsQ0FBQztJQUVNLG9CQUFvQjtRQUN6QixPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiJ9
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy56aXB0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuemlwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxzQkFBdUIsU0FBUSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQTRCO0lBZW5GO1FBQ0UsS0FBSyxDQUFDO1lBQ0osVUFBVSxFQUFFLElBQUk7WUFDaEIsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFnQixFQUFFLGNBQWMsRUFBRSxFQUFFO2dCQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBekJHLGFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM1RCxJQUFJLFlBQW9CLENBQUM7WUFDekIsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDaEQsWUFBWSxDQUFBLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzFFLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3pFLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUMsQ0FBQTtZQUNELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQWNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVM7SUFHaEU7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYSxFQUFFLFFBQXdCLEVBQUUsUUFBMEM7UUFDNUYsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQTBDO1FBQy9DLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxRQUFRO0lBR25CLFlBQVksa0JBQWdDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsa0JBQWtCLENBQUM7SUFDNUMsQ0FBQztJQUVNLG9CQUFvQjtRQUN6QixPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartarchive",
3
- "version": "4.0.24",
3
+ "version": "4.0.26",
4
4
  "description": "A library for working with archive files, providing utilities for compressing and decompressing data.",
5
5
  "main": "dist_ts/index.js",
6
6
  "typings": "dist_ts/index.d.ts",
@@ -17,13 +17,13 @@
17
17
  "homepage": "https://code.foss.global/push.rocks/smartarchive",
18
18
  "dependencies": {
19
19
  "@push.rocks/smartdelay": "^3.0.5",
20
- "@push.rocks/smartfile": "^11.0.4",
21
- "@push.rocks/smartpath": "^5.0.11",
20
+ "@push.rocks/smartfile": "^11.0.20",
21
+ "@push.rocks/smartpath": "^5.0.18",
22
22
  "@push.rocks/smartpromise": "^4.0.3",
23
- "@push.rocks/smartrequest": "^2.0.21",
23
+ "@push.rocks/smartrequest": "^2.0.22",
24
24
  "@push.rocks/smartrx": "^3.0.7",
25
- "@push.rocks/smartstream": "^3.0.34",
26
- "@push.rocks/smartunique": "^3.0.8",
25
+ "@push.rocks/smartstream": "^3.0.44",
26
+ "@push.rocks/smartunique": "^3.0.9",
27
27
  "@push.rocks/smarturl": "^3.0.7",
28
28
  "@types/tar-stream": "^3.1.3",
29
29
  "fflate": "^0.8.2",
@@ -32,10 +32,10 @@
32
32
  "through": "^2.3.8"
33
33
  },
34
34
  "devDependencies": {
35
- "@git.zone/tsbuild": "^2.1.72",
35
+ "@git.zone/tsbuild": "^2.1.80",
36
36
  "@git.zone/tsrun": "^1.2.44",
37
- "@git.zone/tstest": "^1.0.88",
38
- "@push.rocks/tapbundle": "^5.0.17"
37
+ "@git.zone/tstest": "^1.0.90",
38
+ "@push.rocks/tapbundle": "^5.0.23"
39
39
  },
40
40
  "private": false,
41
41
  "files": [
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartarchive',
6
- version: '4.0.24',
6
+ version: '4.0.26',
7
7
  description: 'A library for working with archive files, providing utilities for compressing and decompressing data.'
8
8
  }
@@ -2,28 +2,116 @@ import type { SmartArchive } from './classes.smartarchive.js';
2
2
  import * as plugins from './plugins.js';
3
3
 
4
4
  export class TarTools {
5
+ // INSTANCE
5
6
  smartArchiveRef: SmartArchive;
6
7
 
7
8
  constructor(smartArchiveRefArg: SmartArchive) {
8
9
  this.smartArchiveRef = smartArchiveRefArg;
9
10
  }
10
-
11
+
11
12
  // packing
12
- public addFileToPack(pack: plugins.tarStream.Pack, fileName: string, content: string | Buffer) {
13
- return new Promise<void>((resolve, reject) => {
14
- const entry = pack.entry({ name: fileName, size: content.length }, (err: Error) => {
15
- if (err) {
16
- reject(err);
17
- } else {
18
- resolve();
13
+ public async addFileToPack(
14
+ pack: plugins.tarStream.Pack,
15
+ optionsArg: {
16
+ fileName?: string;
17
+ content?:
18
+ | string
19
+ | Buffer
20
+ | plugins.smartstream.stream.Readable
21
+ | plugins.smartfile.SmartFile
22
+ | plugins.smartfile.StreamFile;
23
+ byteLength?: number;
24
+ filePath?: string;
25
+ }
26
+ ): Promise<void> {
27
+ return new Promise<void>(async (resolve, reject) => {
28
+ let fileName =
29
+ optionsArg.fileName || optionsArg.content instanceof plugins.smartfile.SmartFile
30
+ ? (optionsArg.content as plugins.smartfile.SmartFile).relative
31
+ : null || optionsArg.content instanceof plugins.smartfile.StreamFile
32
+ ? (optionsArg.content as plugins.smartfile.StreamFile).relativeFilePath
33
+ : null || optionsArg.filePath;
34
+
35
+ /**
36
+ * contentByteLength is used to set the size of the entry in the tar file
37
+ */
38
+ let contentByteLength: number;
39
+ if (optionsArg.byteLength) {
40
+ contentByteLength = optionsArg.byteLength;
41
+ } else if (typeof optionsArg.content === 'string') {
42
+ contentByteLength = Buffer.byteLength(optionsArg.content, 'utf8');
43
+ } else if (Buffer.isBuffer(optionsArg.content)) {
44
+ contentByteLength = optionsArg.content.length;
45
+ } else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
46
+ contentByteLength = await optionsArg.content.getSize(); // assuming SmartFile has getSize method
47
+ } else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
48
+ contentByteLength = await optionsArg.content.getSize(); // assuming StreamFile has getSize method
49
+ } else if (optionsArg.content instanceof plugins.smartstream.stream.Readable) {
50
+ console.warn(
51
+ '@push.rocks/smartarchive: When streaming, it is recommended to provide byteLength, if known.'
52
+ );
53
+ } else if (optionsArg.filePath) {
54
+ const fileStat = await plugins.smartfile.fs.stat(optionsArg.filePath);
55
+ contentByteLength = fileStat.size;
56
+ }
57
+
58
+ const entry = pack.entry(
59
+ {
60
+ name: fileName,
61
+ ...(contentByteLength
62
+ ? {
63
+ size: contentByteLength,
64
+ }
65
+ : null),
66
+ },
67
+ (err: Error) => {
68
+ if (err) {
69
+ reject(err);
70
+ } else {
71
+ resolve();
72
+ }
19
73
  }
20
- });
74
+ );
75
+
76
+ let content: plugins.smartstream.stream.Readable;
77
+ if (Buffer.isBuffer(optionsArg.content)) {
78
+ content = plugins.smartstream.stream.Readable.from(optionsArg.content);
79
+ } else if (typeof optionsArg.content === 'string') {
80
+ content = plugins.smartstream.stream.Readable.from(Buffer.from(optionsArg.content));
81
+ } else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
82
+ content = plugins.smartstream.stream.Readable.from(optionsArg.content.contents);
83
+ } else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
84
+ content = await optionsArg.content.createReadStream();
85
+ } else if (optionsArg.content instanceof plugins.smartstream.stream.Readable) {
86
+ content = optionsArg.content;
87
+ }
21
88
 
22
- entry.write(content);
23
- entry.end();
89
+ content.pipe(entry);
90
+ entry.on('end', () => {
91
+ resolve();
92
+ });
24
93
  });
25
94
  }
26
95
 
96
+ /**
97
+ * packs a directory from disk into a tar stream
98
+ * @param directoryPath
99
+ */
100
+ public async packDirectory(directoryPath: string) {
101
+ const fileTree = await plugins.smartfile.fs.listFileTree(directoryPath, '**/*');
102
+ const pack = await this.getPackStream();
103
+ for (const filePath of fileTree) {
104
+ const absolutePath = plugins.path.join(directoryPath, filePath);
105
+ const fileStat = await plugins.smartfile.fs.stat(absolutePath);
106
+ await this.addFileToPack(pack, {
107
+ byteLength: fileStat.size,
108
+ filePath: filePath,
109
+ fileName: filePath,
110
+ content: plugins.smartfile.fsStream.createReadStream(absolutePath),
111
+ });
112
+ }
113
+ }
114
+
27
115
  public async getPackStream() {
28
116
  const pack = plugins.tarStream.pack();
29
117
  return pack;
@@ -5,7 +5,7 @@ class DecompressZipTransform extends plugins.smartstream.SmartDuplex<ArrayBuffer
5
5
  private streamtools: plugins.smartstream.IStreamTools;
6
6
  private unzipper = new plugins.fflate.Unzip(async (fileArg) => {
7
7
  let resultBuffer: Buffer;
8
- fileArg.ondata = async (dataArg, dat, final) => {
8
+ fileArg.ondata = async (flateError, dat, final) => {
9
9
  resultBuffer? resultBuffer = Buffer.concat([resultBuffer, Buffer.from(dat)])
10
10
  : resultBuffer = Buffer.from(dat);
11
11
  if (final) {