@rushstack/zipsync 0.1.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 (89) hide show
  1. package/CHANGELOG.json +31 -0
  2. package/CHANGELOG.md +11 -0
  3. package/LICENSE +24 -0
  4. package/README.md +48 -0
  5. package/bin/zipsync +2 -0
  6. package/lib/ZipSyncCommandLineParser.d.ts +17 -0
  7. package/lib/ZipSyncCommandLineParser.d.ts.map +1 -0
  8. package/lib/ZipSyncCommandLineParser.js +97 -0
  9. package/lib/ZipSyncCommandLineParser.js.map +1 -0
  10. package/lib/benchmark.test.d.ts +2 -0
  11. package/lib/benchmark.test.d.ts.map +1 -0
  12. package/lib/benchmark.test.js.map +1 -0
  13. package/lib/compress.d.ts +8 -0
  14. package/lib/compress.d.ts.map +1 -0
  15. package/lib/compress.js +121 -0
  16. package/lib/compress.js.map +1 -0
  17. package/lib/crc32.d.ts +3 -0
  18. package/lib/crc32.d.ts.map +1 -0
  19. package/lib/crc32.js +69 -0
  20. package/lib/crc32.js.map +1 -0
  21. package/lib/crc32.test.d.ts +2 -0
  22. package/lib/crc32.test.d.ts.map +1 -0
  23. package/lib/crc32.test.js.map +1 -0
  24. package/lib/fs.d.ts +13 -0
  25. package/lib/fs.d.ts.map +1 -0
  26. package/lib/fs.js +57 -0
  27. package/lib/fs.js.map +1 -0
  28. package/lib/hash.d.ts +3 -0
  29. package/lib/hash.d.ts.map +1 -0
  30. package/lib/hash.js +43 -0
  31. package/lib/hash.js.map +1 -0
  32. package/lib/index.d.ts +3 -0
  33. package/lib/index.d.ts.map +1 -0
  34. package/lib/index.js +10 -0
  35. package/lib/index.js.map +1 -0
  36. package/lib/index.test.d.ts +2 -0
  37. package/lib/index.test.d.ts.map +1 -0
  38. package/lib/index.test.js.map +1 -0
  39. package/lib/pack.d.ts +55 -0
  40. package/lib/pack.d.ts.map +1 -0
  41. package/lib/pack.js +415 -0
  42. package/lib/pack.js.map +1 -0
  43. package/lib/packWorker.d.ts +31 -0
  44. package/lib/packWorker.d.ts.map +1 -0
  45. package/lib/packWorker.js +60 -0
  46. package/lib/packWorker.js.map +1 -0
  47. package/lib/packWorkerAsync.d.ts +4 -0
  48. package/lib/packWorkerAsync.d.ts.map +1 -0
  49. package/lib/packWorkerAsync.js +79 -0
  50. package/lib/packWorkerAsync.js.map +1 -0
  51. package/lib/perf.d.ts +7 -0
  52. package/lib/perf.d.ts.map +1 -0
  53. package/lib/perf.js +56 -0
  54. package/lib/perf.js.map +1 -0
  55. package/lib/start.d.ts +2 -0
  56. package/lib/start.d.ts.map +1 -0
  57. package/lib/start.js +19 -0
  58. package/lib/start.js.map +1 -0
  59. package/lib/start.test.d.ts +2 -0
  60. package/lib/start.test.d.ts.map +1 -0
  61. package/lib/start.test.js.map +1 -0
  62. package/lib/testUtils.d.ts +9 -0
  63. package/lib/testUtils.d.ts.map +1 -0
  64. package/lib/testUtils.js +77 -0
  65. package/lib/testUtils.js.map +1 -0
  66. package/lib/unpack.d.ts +41 -0
  67. package/lib/unpack.d.ts.map +1 -0
  68. package/lib/unpack.js +370 -0
  69. package/lib/unpack.js.map +1 -0
  70. package/lib/unpackWorker.d.ts +31 -0
  71. package/lib/unpackWorker.d.ts.map +1 -0
  72. package/lib/unpackWorker.js +56 -0
  73. package/lib/unpackWorker.js.map +1 -0
  74. package/lib/unpackWorkerAsync.d.ts +4 -0
  75. package/lib/unpackWorkerAsync.d.ts.map +1 -0
  76. package/lib/unpackWorkerAsync.js +79 -0
  77. package/lib/unpackWorkerAsync.js.map +1 -0
  78. package/lib/workerAsync.test.d.ts +2 -0
  79. package/lib/workerAsync.test.d.ts.map +1 -0
  80. package/lib/workerAsync.test.js.map +1 -0
  81. package/lib/zipSyncUtils.d.ts +20 -0
  82. package/lib/zipSyncUtils.d.ts.map +1 -0
  83. package/lib/zipSyncUtils.js +9 -0
  84. package/lib/zipSyncUtils.js.map +1 -0
  85. package/lib/zipUtils.d.ts +127 -0
  86. package/lib/zipUtils.d.ts.map +1 -0
  87. package/lib/zipUtils.js +304 -0
  88. package/lib/zipUtils.js.map +1 -0
  89. package/package.json +31 -0
package/lib/fs.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { type OpenMode } from 'node:fs';
2
+ interface IInternalDisposableFileHandle extends Disposable {
3
+ fd: number;
4
+ }
5
+ export interface IDisposableFileHandle extends IInternalDisposableFileHandle {
6
+ readonly fd: number;
7
+ }
8
+ export declare const DISPOSE_SYMBOL: typeof Symbol.dispose;
9
+ export declare function getDisposableFileHandle(path: string, openMode: OpenMode): IDisposableFileHandle;
10
+ export declare function rmdirSync(dirPath: string): boolean;
11
+ export declare function unlinkSync(filePath: string): boolean;
12
+ export {};
13
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD,UAAU,6BAA8B,SAAQ,UAAU;IACxD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAsB,SAAQ,6BAA6B;IAC1E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC,OAAwD,CAAC;AAEpG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,qBAAqB,CAY/F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAYlD;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYpD"}
package/lib/fs.js ADDED
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
+ // See LICENSE in the project root for license information.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ var _a;
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DISPOSE_SYMBOL = void 0;
10
+ exports.getDisposableFileHandle = getDisposableFileHandle;
11
+ exports.rmdirSync = rmdirSync;
12
+ exports.unlinkSync = unlinkSync;
13
+ const node_fs_1 = __importDefault(require("node:fs"));
14
+ exports.DISPOSE_SYMBOL = (_a = Symbol.dispose) !== null && _a !== void 0 ? _a : Symbol.for('Symbol.dispose');
15
+ function getDisposableFileHandle(path, openMode) {
16
+ const result = {
17
+ fd: node_fs_1.default.openSync(path, openMode),
18
+ [exports.DISPOSE_SYMBOL]: () => {
19
+ if (!isNaN(result.fd)) {
20
+ node_fs_1.default.closeSync(result.fd);
21
+ result.fd = NaN;
22
+ }
23
+ }
24
+ };
25
+ return result;
26
+ }
27
+ function rmdirSync(dirPath) {
28
+ try {
29
+ node_fs_1.default.rmdirSync(dirPath);
30
+ return true;
31
+ }
32
+ catch (e) {
33
+ if (e.code === 'ENOENT' || e.code === 'ENOTDIR') {
34
+ // Not found, ignore
35
+ }
36
+ else {
37
+ throw e;
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+ function unlinkSync(filePath) {
43
+ try {
44
+ node_fs_1.default.unlinkSync(filePath);
45
+ return true;
46
+ }
47
+ catch (e) {
48
+ if (e && e.code === 'ENOENT') {
49
+ // Not found, ignore
50
+ }
51
+ else {
52
+ throw e;
53
+ }
54
+ }
55
+ return false;
56
+ }
57
+ //# sourceMappingURL=fs.js.map
package/lib/fs.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;AAc3D,0DAYC;AAED,8BAYC;AAED,gCAYC;AApDD,sDAAuD;AAU1C,QAAA,cAAc,GAA0B,MAAA,MAAM,CAAC,OAAO,mCAAI,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAEpG,SAAgB,uBAAuB,CAAC,IAAY,EAAE,QAAkB;IACtE,MAAM,MAAM,GAAkC;QAC5C,EAAE,EAAE,iBAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC/B,CAAC,sBAAc,CAAC,EAAE,GAAG,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,iBAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC;YAClB,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,SAAS,CAAC,OAAe;IACvC,IAAI,CAAC;QACH,iBAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ,IAAK,CAA2B,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtG,oBAAoB;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,UAAU,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxD,oBAAoB;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { default as fs, type OpenMode } from 'node:fs';\n\ninterface IInternalDisposableFileHandle extends Disposable {\n fd: number;\n}\n\nexport interface IDisposableFileHandle extends IInternalDisposableFileHandle {\n readonly fd: number;\n}\n\nexport const DISPOSE_SYMBOL: typeof Symbol.dispose = Symbol.dispose ?? Symbol.for('Symbol.dispose');\n\nexport function getDisposableFileHandle(path: string, openMode: OpenMode): IDisposableFileHandle {\n const result: IInternalDisposableFileHandle = {\n fd: fs.openSync(path, openMode),\n [DISPOSE_SYMBOL]: () => {\n if (!isNaN(result.fd)) {\n fs.closeSync(result.fd);\n result.fd = NaN;\n }\n }\n };\n\n return result;\n}\n\nexport function rmdirSync(dirPath: string): boolean {\n try {\n fs.rmdirSync(dirPath);\n return true;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT' || (e as NodeJS.ErrnoException).code === 'ENOTDIR') {\n // Not found, ignore\n } else {\n throw e;\n }\n }\n return false;\n}\n\nexport function unlinkSync(filePath: string): boolean {\n try {\n fs.unlinkSync(filePath);\n return true;\n } catch (e) {\n if (e && (e as NodeJS.ErrnoException).code === 'ENOENT') {\n // Not found, ignore\n } else {\n throw e;\n }\n }\n return false;\n}\n"]}
package/lib/hash.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function computeFileHash(fd: number): string | false;
2
+ export declare function calculateSHA1(data: Buffer): string;
3
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CA6B1D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
package/lib/hash.js ADDED
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
+ // See LICENSE in the project root for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.computeFileHash = computeFileHash;
6
+ exports.calculateSHA1 = calculateSHA1;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_crypto_1 = require("node:crypto");
9
+ const buffer = Buffer.allocUnsafeSlow(1 << 24);
10
+ function computeFileHash(fd) {
11
+ try {
12
+ const hash = (0, node_crypto_1.createHash)('sha1');
13
+ let totalBytesRead = 0;
14
+ let bytesRead;
15
+ do {
16
+ bytesRead = (0, node_fs_1.readSync)(fd, buffer, 0, buffer.length, -1);
17
+ if (bytesRead <= 0) {
18
+ break;
19
+ }
20
+ totalBytesRead += bytesRead;
21
+ hash.update(buffer.subarray(0, bytesRead));
22
+ } while (bytesRead > 0);
23
+ if (totalBytesRead === 0) {
24
+ // Sometimes directories get treated as empty files
25
+ const stat = (0, node_fs_1.fstatSync)(fd);
26
+ if (!stat.isFile()) {
27
+ return false;
28
+ }
29
+ }
30
+ return hash.digest('hex');
31
+ }
32
+ catch (err) {
33
+ // There is a bug in node-core-library where it doesn't handle if the operation was on a file descriptor
34
+ if (err.code === 'EISDIR' || err.code === 'ENOENT' || err.code === 'ENOTDIR') {
35
+ return false;
36
+ }
37
+ throw err;
38
+ }
39
+ }
40
+ function calculateSHA1(data) {
41
+ return (0, node_crypto_1.createHash)('sha1').update(data).digest('hex');
42
+ }
43
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAO3D,0CA6BC;AAED,sCAEC;AAtCD,qCAA0D;AAC1D,6CAAoD;AAEpD,MAAM,MAAM,GAAW,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAEvD,SAAgB,eAAe,CAAC,EAAU;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAS,IAAA,wBAAU,EAAC,MAAM,CAAC,CAAC;QACtC,IAAI,cAAc,GAAW,CAAC,CAAC;QAC/B,IAAI,SAAiB,CAAC;QACtB,GAAG,CAAC;YACF,SAAS,GAAG,IAAA,kBAAQ,EAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,cAAc,IAAI,SAAS,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7C,CAAC,QAAQ,SAAS,GAAG,CAAC,EAAE;QACxB,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YACzB,mDAAmD;YACnD,MAAM,IAAI,GAAU,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wGAAwG;QACxG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,IAAA,wBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { readSync, fstatSync, type Stats } from 'node:fs';\nimport { createHash, type Hash } from 'node:crypto';\n\nconst buffer: Buffer = Buffer.allocUnsafeSlow(1 << 24);\n\nexport function computeFileHash(fd: number): string | false {\n try {\n const hash: Hash = createHash('sha1');\n let totalBytesRead: number = 0;\n let bytesRead: number;\n do {\n bytesRead = readSync(fd, buffer, 0, buffer.length, -1);\n if (bytesRead <= 0) {\n break;\n }\n totalBytesRead += bytesRead;\n hash.update(buffer.subarray(0, bytesRead));\n } while (bytesRead > 0);\n if (totalBytesRead === 0) {\n // Sometimes directories get treated as empty files\n const stat: Stats = fstatSync(fd);\n if (!stat.isFile()) {\n return false;\n }\n }\n\n return hash.digest('hex');\n } catch (err) {\n // There is a bug in node-core-library where it doesn't handle if the operation was on a file descriptor\n if (err.code === 'EISDIR' || err.code === 'ENOENT' || err.code === 'ENOTDIR') {\n return false;\n }\n throw err;\n }\n}\n\nexport function calculateSHA1(data: Buffer): string {\n return createHash('sha1').update(data).digest('hex');\n}\n"]}
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { pack, type IZipSyncPackResult, type IZipSyncPackOptions } from './pack';
2
+ export { unpack, type IZipSyncUnpackResult, type IZipSyncUnpackOptions } from './unpack';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,UAAU,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
+ // See LICENSE in the project root for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.unpack = exports.pack = void 0;
6
+ var pack_1 = require("./pack");
7
+ Object.defineProperty(exports, "pack", { enumerable: true, get: function () { return pack_1.pack; } });
8
+ var unpack_1 = require("./unpack");
9
+ Object.defineProperty(exports, "unpack", { enumerable: true, get: function () { return unpack_1.unpack; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,+BAAiF;AAAxE,4FAAA,IAAI,OAAA;AACb,mCAAyF;AAAhF,gGAAA,MAAM,OAAA","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nexport { pack, type IZipSyncPackResult, type IZipSyncPackOptions } from './pack';\nexport { unpack, type IZipSyncUnpackResult, type IZipSyncUnpackOptions } from './unpack';\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\n\nimport { NoOpTerminalProvider } from '@rushstack/terminal/lib/NoOpTerminalProvider';\nimport { Terminal } from '@rushstack/terminal/lib/Terminal';\n\nimport { pack } from './pack';\nimport { unpack } from './unpack';\nimport { getDemoDataDirectoryDisposable } from './testUtils';\nimport type { ZipSyncOptionCompression } from './zipSyncUtils';\n\ndescribe('zipSync tests', () => {\n it(`basic pack test`, () => {\n const compressionOptions = ['store', 'deflate', 'zstd', 'auto'] satisfies ZipSyncOptionCompression[];\n compressionOptions.forEach((compression) => {\n if (compression === 'zstd') {\n const [major, minor] = process.versions.node.split('.').map((x) => parseInt(x, 10));\n if (major < 22 || (major === 22 && minor < 15)) {\n // eslint-disable-next-line no-console\n console.warn(`Skipping zstd test on Node ${process.versions.node}`);\n return;\n }\n }\n\n using demoDataDisposable = getDemoDataDirectoryDisposable(5);\n const { targetDirectories, baseDir, metadata } = demoDataDisposable;\n\n const terminal = new Terminal(new NoOpTerminalProvider());\n\n const archivePath: string = path.join(baseDir, 'archive.zip');\n const packResult = pack({\n terminal: terminal,\n compression,\n baseDir,\n targetDirectories,\n archivePath\n });\n\n expect(packResult).toMatchObject({ filesPacked: 21, metadata });\n\n using unpackDemoDataDisposable = getDemoDataDirectoryDisposable(2);\n const { baseDir: unpackBaseDir } = unpackDemoDataDisposable;\n\n const unpackResult = unpack({\n terminal: terminal,\n archivePath,\n baseDir: unpackBaseDir,\n targetDirectories\n });\n\n expect(unpackResult).toMatchObject({\n filesDeleted: 0,\n filesExtracted: 12,\n filesSkipped: 8,\n foldersDeleted: 0,\n metadata\n });\n\n // Verify files were extracted\n for (const targetDirectory of targetDirectories) {\n const sourceDir: string = path.join(baseDir, targetDirectory);\n for (let i: number = 0; i < 5; ++i) {\n const sourceFile: string = path.join(sourceDir, 'subdir', `file-${i}.txt`);\n const destFile: string = path.join(unpackBaseDir, targetDirectory, 'subdir', `file-${i}.txt`);\n expect(fs.readFileSync(destFile, { encoding: 'utf-8' })).toEqual(\n fs.readFileSync(sourceFile, { encoding: 'utf-8' })\n );\n }\n }\n });\n });\n});\n"]}
package/lib/pack.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ import type { ITerminal } from '@rushstack/terminal/lib/ITerminal';
2
+ import { type ZipSyncOptionCompression, type IMetadata } from './zipSyncUtils';
3
+ /**
4
+ * @public
5
+ * Options for zipsync
6
+ */
7
+ export interface IZipSyncPackOptions {
8
+ /**
9
+ * \@rushstack/terminal compatible terminal for logging
10
+ */
11
+ terminal: ITerminal;
12
+ /**
13
+ * Zip file path
14
+ */
15
+ archivePath: string;
16
+ /**
17
+ * Target directories to pack (relative to baseDir)
18
+ */
19
+ targetDirectories: ReadonlyArray<string>;
20
+ /**
21
+ * Base directory for relative paths within the archive (defaults to common parent of targetDirectories)
22
+ */
23
+ baseDir: string;
24
+ /**
25
+ * Compression mode. If set to 'deflate', file data will be compressed using raw DEFLATE (method 8) when this
26
+ * produces a smaller result; otherwise it will fall back to 'store' per-file.
27
+ */
28
+ compression: ZipSyncOptionCompression;
29
+ /**
30
+ * Optional buffer that can be provided to avoid internal allocations.
31
+ */
32
+ inputBuffer?: Buffer<ArrayBuffer>;
33
+ /**
34
+ * Optional buffer that can be provided to avoid internal allocations.
35
+ */
36
+ outputBuffer?: Buffer<ArrayBuffer>;
37
+ }
38
+ export interface IZipSyncPackResult {
39
+ filesPacked: number;
40
+ metadata: IMetadata;
41
+ }
42
+ /**
43
+ * Create a zipsync archive by enumerating target directories, then streaming each file into the
44
+ * output zip using the local file header + (optional compressed data) + data descriptor pattern.
45
+ *
46
+ * Performance characteristics:
47
+ * - Single pass per file (no read-then-compress-then-write buffering). CRC32 + SHA-1 are computed
48
+ * while streaming so the metadata JSON can later be used for selective unpack.
49
+ * - Data descriptor usage (bit 3) allows writing headers before we know sizes or CRC32.
50
+ * - A single timestamp (captured once) is applied to all entries for determinism.
51
+ * - Metadata entry is added as a normal zip entry at the end (before central directory) so legacy
52
+ * tools can still list/extract it, while zipsync can quickly parse file hashes.
53
+ */
54
+ export declare function pack({ archivePath, targetDirectories: rawTargetDirectories, baseDir: rawBaseDir, compression, terminal, inputBuffer, outputBuffer }: IZipSyncPackOptions): IZipSyncPackResult;
55
+ //# sourceMappingURL=pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAmBnE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EAKf,MAAM,gBAAgB,CAAC;AAoCxB;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IACpB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,EAAE,wBAAwB,CAAC;IACtC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,IAAI,CAAC,EACnB,WAAW,EACX,iBAAiB,EAAE,oBAAoB,EACvC,OAAO,EAAE,UAAU,EACnB,WAAW,EACX,QAAQ,EACR,WAAuD,EACvD,YAAwD,EACzD,EAAE,mBAAmB,GAAG,kBAAkB,CAqS1C"}