@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.
- package/CHANGELOG.json +31 -0
- package/CHANGELOG.md +11 -0
- package/LICENSE +24 -0
- package/README.md +48 -0
- package/bin/zipsync +2 -0
- package/lib/ZipSyncCommandLineParser.d.ts +17 -0
- package/lib/ZipSyncCommandLineParser.d.ts.map +1 -0
- package/lib/ZipSyncCommandLineParser.js +97 -0
- package/lib/ZipSyncCommandLineParser.js.map +1 -0
- package/lib/benchmark.test.d.ts +2 -0
- package/lib/benchmark.test.d.ts.map +1 -0
- package/lib/benchmark.test.js.map +1 -0
- package/lib/compress.d.ts +8 -0
- package/lib/compress.d.ts.map +1 -0
- package/lib/compress.js +121 -0
- package/lib/compress.js.map +1 -0
- package/lib/crc32.d.ts +3 -0
- package/lib/crc32.d.ts.map +1 -0
- package/lib/crc32.js +69 -0
- package/lib/crc32.js.map +1 -0
- package/lib/crc32.test.d.ts +2 -0
- package/lib/crc32.test.d.ts.map +1 -0
- package/lib/crc32.test.js.map +1 -0
- package/lib/fs.d.ts +13 -0
- package/lib/fs.d.ts.map +1 -0
- package/lib/fs.js +57 -0
- package/lib/fs.js.map +1 -0
- package/lib/hash.d.ts +3 -0
- package/lib/hash.d.ts.map +1 -0
- package/lib/hash.js +43 -0
- package/lib/hash.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +10 -0
- package/lib/index.js.map +1 -0
- package/lib/index.test.d.ts +2 -0
- package/lib/index.test.d.ts.map +1 -0
- package/lib/index.test.js.map +1 -0
- package/lib/pack.d.ts +55 -0
- package/lib/pack.d.ts.map +1 -0
- package/lib/pack.js +415 -0
- package/lib/pack.js.map +1 -0
- package/lib/packWorker.d.ts +31 -0
- package/lib/packWorker.d.ts.map +1 -0
- package/lib/packWorker.js +60 -0
- package/lib/packWorker.js.map +1 -0
- package/lib/packWorkerAsync.d.ts +4 -0
- package/lib/packWorkerAsync.d.ts.map +1 -0
- package/lib/packWorkerAsync.js +79 -0
- package/lib/packWorkerAsync.js.map +1 -0
- package/lib/perf.d.ts +7 -0
- package/lib/perf.d.ts.map +1 -0
- package/lib/perf.js +56 -0
- package/lib/perf.js.map +1 -0
- package/lib/start.d.ts +2 -0
- package/lib/start.d.ts.map +1 -0
- package/lib/start.js +19 -0
- package/lib/start.js.map +1 -0
- package/lib/start.test.d.ts +2 -0
- package/lib/start.test.d.ts.map +1 -0
- package/lib/start.test.js.map +1 -0
- package/lib/testUtils.d.ts +9 -0
- package/lib/testUtils.d.ts.map +1 -0
- package/lib/testUtils.js +77 -0
- package/lib/testUtils.js.map +1 -0
- package/lib/unpack.d.ts +41 -0
- package/lib/unpack.d.ts.map +1 -0
- package/lib/unpack.js +370 -0
- package/lib/unpack.js.map +1 -0
- package/lib/unpackWorker.d.ts +31 -0
- package/lib/unpackWorker.d.ts.map +1 -0
- package/lib/unpackWorker.js +56 -0
- package/lib/unpackWorker.js.map +1 -0
- package/lib/unpackWorkerAsync.d.ts +4 -0
- package/lib/unpackWorkerAsync.d.ts.map +1 -0
- package/lib/unpackWorkerAsync.js +79 -0
- package/lib/unpackWorkerAsync.js.map +1 -0
- package/lib/workerAsync.test.d.ts +2 -0
- package/lib/workerAsync.test.d.ts.map +1 -0
- package/lib/workerAsync.test.js.map +1 -0
- package/lib/zipSyncUtils.d.ts +20 -0
- package/lib/zipSyncUtils.d.ts.map +1 -0
- package/lib/zipSyncUtils.js +9 -0
- package/lib/zipSyncUtils.js.map +1 -0
- package/lib/zipUtils.d.ts +127 -0
- package/lib/zipUtils.d.ts.map +1 -0
- package/lib/zipUtils.js +304 -0
- package/lib/zipUtils.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,79 @@
|
|
|
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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.packWorkerAsync = packWorkerAsync;
|
|
39
|
+
async function packWorkerAsync(options) {
|
|
40
|
+
const { Worker } = await Promise.resolve().then(() => __importStar(require('node:worker_threads')));
|
|
41
|
+
const worker = new Worker(require.resolve('./packWorker'));
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
worker.on('message', (message) => {
|
|
44
|
+
switch (message.type) {
|
|
45
|
+
case 'zipsync-pack': {
|
|
46
|
+
resolve(message.result);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'error': {
|
|
50
|
+
const error = new Error(message.args.message);
|
|
51
|
+
error.stack = message.args.stack;
|
|
52
|
+
reject(error);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
default: {
|
|
56
|
+
const exhaustiveCheck = message;
|
|
57
|
+
throw new Error(`Unexpected message type: ${JSON.stringify(exhaustiveCheck)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
worker.on('error', (err) => {
|
|
62
|
+
reject(err);
|
|
63
|
+
});
|
|
64
|
+
worker.on('exit', (code) => {
|
|
65
|
+
if (code !== 0) {
|
|
66
|
+
reject(new Error(`Worker stopped with exit code ${code}`));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const commandMessage = {
|
|
70
|
+
type: 'zipsync-pack',
|
|
71
|
+
id: 0,
|
|
72
|
+
options
|
|
73
|
+
};
|
|
74
|
+
worker.postMessage(commandMessage);
|
|
75
|
+
}).finally(() => {
|
|
76
|
+
worker.postMessage(false);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=packWorkerAsync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packWorkerAsync.js","sourceRoot":"","sources":["../src/packWorkerAsync.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAa3D,0CA8CC;AA9CM,KAAK,UAAU,eAAe,CACnC,OAA8C;IAE9C,MAAM,EAAE,MAAM,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;IAEvD,MAAM,MAAM,GAAW,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAEnE,OAAO,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/D,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAA6B,EAAE,EAAE;YACrD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACxB,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,KAAK,GAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACrD,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;oBACjC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,MAAM;gBACR,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,eAAe,GAAU,OAAO,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAyB;YAC3C,IAAI,EAAE,cAAc;YACpB,EAAE,EAAE,CAAC;YACL,OAAO;SACR,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACd,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,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 type { Worker } from 'node:worker_threads';\n\nimport type {\n IWorkerToHostMessage,\n IHostToWorkerMessage,\n IZipSyncPackWorkerResult,\n IZipSyncPackOptions\n} from './packWorker';\n\nexport type { IZipSyncPackWorkerResult } from './packWorker';\n\nexport async function packWorkerAsync(\n options: Omit<IZipSyncPackOptions, 'terminal'>\n): Promise<IZipSyncPackWorkerResult> {\n const { Worker } = await import('node:worker_threads');\n\n const worker: Worker = new Worker(require.resolve('./packWorker'));\n\n return new Promise<IZipSyncPackWorkerResult>((resolve, reject) => {\n worker.on('message', (message: IWorkerToHostMessage) => {\n switch (message.type) {\n case 'zipsync-pack': {\n resolve(message.result);\n break;\n }\n case 'error': {\n const error: Error = new Error(message.args.message);\n error.stack = message.args.stack;\n reject(error);\n break;\n }\n default: {\n const exhaustiveCheck: never = message;\n throw new Error(`Unexpected message type: ${JSON.stringify(exhaustiveCheck)}`);\n }\n }\n });\n\n worker.on('error', (err) => {\n reject(err);\n });\n\n worker.on('exit', (code) => {\n if (code !== 0) {\n reject(new Error(`Worker stopped with exit code ${code}`));\n }\n });\n\n const commandMessage: IHostToWorkerMessage = {\n type: 'zipsync-pack',\n id: 0,\n options\n };\n worker.postMessage(commandMessage);\n }).finally(() => {\n worker.postMessage(false);\n });\n}\n"]}
|
package/lib/perf.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ITerminal } from '@rushstack/terminal/lib/ITerminal';
|
|
2
|
+
export declare function markStart(name: string): void;
|
|
3
|
+
export declare function markEnd(name: string): void;
|
|
4
|
+
export declare function getDuration(name: string): number;
|
|
5
|
+
export declare function formatDuration(ms: number): string;
|
|
6
|
+
export declare function emitSummary(operation: 'pack' | 'unpack', term: ITerminal): void;
|
|
7
|
+
//# sourceMappingURL=perf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../src/perf.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAEnE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AACD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1C;AACD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AACD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEjD;AACD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CA2B/E"}
|
package/lib/perf.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
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.markStart = markStart;
|
|
6
|
+
exports.markEnd = markEnd;
|
|
7
|
+
exports.getDuration = getDuration;
|
|
8
|
+
exports.formatDuration = formatDuration;
|
|
9
|
+
exports.emitSummary = emitSummary;
|
|
10
|
+
const node_perf_hooks_1 = require("node:perf_hooks");
|
|
11
|
+
function markStart(name) {
|
|
12
|
+
node_perf_hooks_1.performance.mark(`zipsync:${name}:start`);
|
|
13
|
+
}
|
|
14
|
+
function markEnd(name) {
|
|
15
|
+
const base = `zipsync:${name}`;
|
|
16
|
+
node_perf_hooks_1.performance.mark(`${base}:end`);
|
|
17
|
+
node_perf_hooks_1.performance.measure(base, `${base}:start`, `${base}:end`);
|
|
18
|
+
}
|
|
19
|
+
function getDuration(name) {
|
|
20
|
+
const measures = node_perf_hooks_1.performance.getEntriesByName(`zipsync:${name}`);
|
|
21
|
+
if (measures.length === 0)
|
|
22
|
+
return 0;
|
|
23
|
+
return measures[measures.length - 1].duration;
|
|
24
|
+
}
|
|
25
|
+
function formatDuration(ms) {
|
|
26
|
+
return ms >= 1000 ? (ms / 1000).toFixed(2) + 's' : ms.toFixed(2) + 'ms';
|
|
27
|
+
}
|
|
28
|
+
function emitSummary(operation, term) {
|
|
29
|
+
const totalName = `${operation}.total`;
|
|
30
|
+
// Ensure total is measured
|
|
31
|
+
markEnd(totalName);
|
|
32
|
+
const totalDuration = getDuration(totalName);
|
|
33
|
+
const prefix = `zipsync:${operation}.`;
|
|
34
|
+
const measures = node_perf_hooks_1.performance.getEntriesByType('measure');
|
|
35
|
+
const rows = [];
|
|
36
|
+
for (const m of measures) {
|
|
37
|
+
if (!m.name.startsWith(prefix))
|
|
38
|
+
continue;
|
|
39
|
+
if (m.name === `zipsync:${totalName}`)
|
|
40
|
+
continue;
|
|
41
|
+
// Extract segment name (remove prefix)
|
|
42
|
+
const segment = m.name.substring(prefix.length);
|
|
43
|
+
rows.push({ name: segment, dur: m.duration });
|
|
44
|
+
}
|
|
45
|
+
rows.sort((a, b) => b.dur - a.dur);
|
|
46
|
+
const lines = rows.map((r) => {
|
|
47
|
+
const pct = totalDuration ? (r.dur / totalDuration) * 100 : 0;
|
|
48
|
+
return ` ${r.name}: ${formatDuration(r.dur)} (${pct.toFixed(1)}%)`;
|
|
49
|
+
});
|
|
50
|
+
lines.push(` TOTAL ${operation}.total: ${formatDuration(totalDuration)}`);
|
|
51
|
+
term.writeVerboseLine(`Performance summary (${operation}):\n` + lines.join('\n'));
|
|
52
|
+
// Cleanup marks/measures to avoid unbounded growth
|
|
53
|
+
node_perf_hooks_1.performance.clearMarks();
|
|
54
|
+
node_perf_hooks_1.performance.clearMeasures();
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=perf.js.map
|
package/lib/perf.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf.js","sourceRoot":"","sources":["../src/perf.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 type { PerformanceEntry } from 'node:perf_hooks';\nimport { performance } from 'node:perf_hooks';\n\nimport type { ITerminal } from '@rushstack/terminal/lib/ITerminal';\n\nexport function markStart(name: string): void {\n performance.mark(`zipsync:${name}:start`);\n}\nexport function markEnd(name: string): void {\n const base: string = `zipsync:${name}`;\n performance.mark(`${base}:end`);\n performance.measure(base, `${base}:start`, `${base}:end`);\n}\nexport function getDuration(name: string): number {\n const measures: PerformanceEntry[] = performance.getEntriesByName(\n `zipsync:${name}`\n ) as unknown as PerformanceEntry[];\n if (measures.length === 0) return 0;\n return measures[measures.length - 1].duration;\n}\nexport function formatDuration(ms: number): string {\n return ms >= 1000 ? (ms / 1000).toFixed(2) + 's' : ms.toFixed(2) + 'ms';\n}\nexport function emitSummary(operation: 'pack' | 'unpack', term: ITerminal): void {\n const totalName: string = `${operation}.total`;\n // Ensure total is measured\n markEnd(totalName);\n const totalDuration: number = getDuration(totalName);\n const prefix: string = `zipsync:${operation}.`;\n const measures: PerformanceEntry[] = performance.getEntriesByType(\n 'measure'\n ) as unknown as PerformanceEntry[];\n const rows: Array<{ name: string; dur: number }> = [];\n for (const m of measures) {\n if (!m.name.startsWith(prefix)) continue;\n if (m.name === `zipsync:${totalName}`) continue;\n // Extract segment name (remove prefix)\n const segment: string = m.name.substring(prefix.length);\n rows.push({ name: segment, dur: m.duration });\n }\n rows.sort((a, b) => b.dur - a.dur);\n const lines: string[] = rows.map((r) => {\n const pct: number = totalDuration ? (r.dur / totalDuration) * 100 : 0;\n return ` ${r.name}: ${formatDuration(r.dur)} (${pct.toFixed(1)}%)`;\n });\n lines.push(` TOTAL ${operation}.total: ${formatDuration(totalDuration)}`);\n term.writeVerboseLine(`Performance summary (${operation}):\\n` + lines.join('\\n'));\n // Cleanup marks/measures to avoid unbounded growth\n performance.clearMarks();\n performance.clearMeasures();\n}\n"]}
|
package/lib/start.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":""}
|
package/lib/start.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
const ConsoleTerminalProvider_1 = require("@rushstack/terminal/lib/ConsoleTerminalProvider");
|
|
6
|
+
const Terminal_1 = require("@rushstack/terminal/lib/Terminal");
|
|
7
|
+
const package_json_1 = require("../package.json");
|
|
8
|
+
const ZipSyncCommandLineParser_1 = require("./ZipSyncCommandLineParser");
|
|
9
|
+
const toolVersion = package_json_1.version;
|
|
10
|
+
const consoleTerminalProvider = new ConsoleTerminalProvider_1.ConsoleTerminalProvider();
|
|
11
|
+
const terminal = new Terminal_1.Terminal(consoleTerminalProvider);
|
|
12
|
+
terminal.writeLine();
|
|
13
|
+
terminal.writeLine(`zipsync ${toolVersion} - https://rushstack.io`);
|
|
14
|
+
terminal.writeLine();
|
|
15
|
+
const commandLine = new ZipSyncCommandLineParser_1.ZipSyncCommandLineParser(consoleTerminalProvider, terminal);
|
|
16
|
+
commandLine.executeAsync().catch((error) => {
|
|
17
|
+
terminal.writeError(error);
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=start.js.map
|
package/lib/start.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,6FAA0F;AAC1F,+DAA4D;AAE5D,kDAA0C;AAC1C,yEAAsE;AAEtE,MAAM,WAAW,GAAW,sBAAO,CAAC;AAEpC,MAAM,uBAAuB,GAA4B,IAAI,iDAAuB,EAAE,CAAC;AACvF,MAAM,QAAQ,GAAa,IAAI,mBAAQ,CAAC,uBAAuB,CAAC,CAAC;AAEjE,QAAQ,CAAC,SAAS,EAAE,CAAC;AACrB,QAAQ,CAAC,SAAS,CAAC,WAAW,WAAW,yBAAyB,CAAC,CAAC;AACpE,QAAQ,CAAC,SAAS,EAAE,CAAC;AAErB,MAAM,WAAW,GAA6B,IAAI,mDAAwB,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;AAC9G,WAAW,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACzC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC,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 { ConsoleTerminalProvider } from '@rushstack/terminal/lib/ConsoleTerminalProvider';\nimport { Terminal } from '@rushstack/terminal/lib/Terminal';\n\nimport { version } from '../package.json';\nimport { ZipSyncCommandLineParser } from './ZipSyncCommandLineParser';\n\nconst toolVersion: string = version;\n\nconst consoleTerminalProvider: ConsoleTerminalProvider = new ConsoleTerminalProvider();\nconst terminal: Terminal = new Terminal(consoleTerminalProvider);\n\nterminal.writeLine();\nterminal.writeLine(`zipsync ${toolVersion} - https://rushstack.io`);\nterminal.writeLine();\n\nconst commandLine: ZipSyncCommandLineParser = new ZipSyncCommandLineParser(consoleTerminalProvider, terminal);\ncommandLine.executeAsync().catch((error) => {\n terminal.writeError(error);\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.test.d.ts","sourceRoot":"","sources":["../src/start.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.test.js","sourceRoot":"","sources":["../src/start.test.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,iDAAyC;AAEzC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,WAAW,GAAG,IAAA,wBAAQ,EAAC,0BAA0B,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,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 { execSync } from 'child_process';\n\ndescribe('CLI Tool Tests', () => {\n it('should display help for \"zipsync --help\"', () => {\n const startOutput = execSync('node lib/start.js --help').toString();\n expect(startOutput).toMatchSnapshot();\n });\n});\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IMetadata } from './zipSyncUtils';
|
|
2
|
+
export declare function getTempDir(): string;
|
|
3
|
+
export declare function getDemoDataDirectoryDisposable(numFiles: number): {
|
|
4
|
+
targetDirectories: string[];
|
|
5
|
+
baseDir: string;
|
|
6
|
+
metadata: IMetadata;
|
|
7
|
+
[Symbol.dispose](): void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=testUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG;IAChE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;IACpB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;CAC1B,CA+BA"}
|
package/lib/testUtils.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.getTempDir = getTempDir;
|
|
39
|
+
exports.getDemoDataDirectoryDisposable = getDemoDataDirectoryDisposable;
|
|
40
|
+
const node_os_1 = require("node:os");
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const fs = __importStar(require("node:fs"));
|
|
43
|
+
const crypto = __importStar(require("node:crypto"));
|
|
44
|
+
function getTempDir() {
|
|
45
|
+
const randomId = crypto.randomUUID();
|
|
46
|
+
const tempDir = path.join((0, node_os_1.tmpdir)(), `zipsync-test-${randomId}`);
|
|
47
|
+
fs.mkdirSync(tempDir);
|
|
48
|
+
return tempDir;
|
|
49
|
+
}
|
|
50
|
+
function getDemoDataDirectoryDisposable(numFiles) {
|
|
51
|
+
const baseDir = getTempDir();
|
|
52
|
+
const metadata = { files: {}, version: '1.0' };
|
|
53
|
+
const targetDirectories = ['demo-data-1', 'demo-data-2', 'demo-data-3', 'nested/demo/dir/4'].map((folderName) => {
|
|
54
|
+
const dataDir = path.join(baseDir, folderName);
|
|
55
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
56
|
+
const subdir = path.join(dataDir, 'subdir');
|
|
57
|
+
fs.mkdirSync(subdir);
|
|
58
|
+
for (let i = 0; i < numFiles; ++i) {
|
|
59
|
+
const filePath = path.join(subdir, `file-${i}.txt`);
|
|
60
|
+
const content = `This is file ${i} in ${folderName}/subdir\n`;
|
|
61
|
+
const sha1Hash = crypto.createHash('sha1').update(content).digest('hex');
|
|
62
|
+
fs.writeFileSync(filePath, content, { encoding: 'utf-8' });
|
|
63
|
+
const relativeFilePath = path.relative(baseDir, filePath).replace(/\\/g, '/');
|
|
64
|
+
metadata.files[relativeFilePath] = { size: content.length, sha1Hash };
|
|
65
|
+
}
|
|
66
|
+
return folderName;
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
targetDirectories,
|
|
70
|
+
baseDir,
|
|
71
|
+
metadata,
|
|
72
|
+
[Symbol.dispose]() {
|
|
73
|
+
fs.rmSync(baseDir, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=testUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQ3D,gCAKC;AAED,wEAoCC;AAjDD,qCAAiC;AACjC,gDAAkC;AAClC,4CAA8B;AAC9B,oDAAsC;AAGtC,SAAgB,UAAU;IACxB,MAAM,QAAQ,GAAW,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAW,IAAI,CAAC,IAAI,CAAC,IAAA,gBAAM,GAAE,EAAE,gBAAgB,QAAQ,EAAE,CAAC,CAAC;IACxE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,8BAA8B,CAAC,QAAgB;IAM7D,MAAM,OAAO,GAAW,UAAU,EAAE,CAAC;IAErC,MAAM,QAAQ,GAAc,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAE1D,MAAM,iBAAiB,GAAa,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC,GAAG,CACxG,CAAC,UAAU,EAAE,EAAE;QACb,MAAM,OAAO,GAAW,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAW,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpD,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAW,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAW,gBAAgB,CAAC,OAAO,UAAU,WAAW,CAAC;YACtE,MAAM,QAAQ,GAAW,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3D,MAAM,gBAAgB,GAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACtF,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QACxE,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC,CACF,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,OAAO;QACP,QAAQ;QACR,CAAC,MAAM,CAAC,OAAO,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,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 { tmpdir } from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport * as crypto from 'node:crypto';\nimport type { IMetadata } from './zipSyncUtils';\n\nexport function getTempDir(): string {\n const randomId: string = crypto.randomUUID();\n const tempDir: string = path.join(tmpdir(), `zipsync-test-${randomId}`);\n fs.mkdirSync(tempDir);\n return tempDir;\n}\n\nexport function getDemoDataDirectoryDisposable(numFiles: number): {\n targetDirectories: string[];\n baseDir: string;\n metadata: IMetadata;\n [Symbol.dispose](): void;\n} {\n const baseDir: string = getTempDir();\n\n const metadata: IMetadata = { files: {}, version: '1.0' };\n\n const targetDirectories: string[] = ['demo-data-1', 'demo-data-2', 'demo-data-3', 'nested/demo/dir/4'].map(\n (folderName) => {\n const dataDir: string = path.join(baseDir, folderName);\n fs.mkdirSync(dataDir, { recursive: true });\n const subdir: string = path.join(dataDir, 'subdir');\n fs.mkdirSync(subdir);\n for (let i: number = 0; i < numFiles; ++i) {\n const filePath: string = path.join(subdir, `file-${i}.txt`);\n const content: string = `This is file ${i} in ${folderName}/subdir\\n`;\n const sha1Hash: string = crypto.createHash('sha1').update(content).digest('hex');\n fs.writeFileSync(filePath, content, { encoding: 'utf-8' });\n const relativeFilePath: string = path.relative(baseDir, filePath).replace(/\\\\/g, '/');\n metadata.files[relativeFilePath] = { size: content.length, sha1Hash };\n }\n return folderName;\n }\n );\n\n return {\n targetDirectories,\n baseDir,\n metadata,\n [Symbol.dispose]() {\n fs.rmSync(baseDir, { recursive: true, force: true });\n }\n };\n}\n"]}
|
package/lib/unpack.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ITerminal } from '@rushstack/terminal';
|
|
2
|
+
import { type IMetadata } from './zipSyncUtils';
|
|
3
|
+
/**
|
|
4
|
+
* @public
|
|
5
|
+
* Options for zipsync
|
|
6
|
+
*/
|
|
7
|
+
export interface IZipSyncUnpackOptions {
|
|
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 unpack, 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
|
+
* Optional buffer that can be provided to avoid internal allocations.
|
|
26
|
+
*/
|
|
27
|
+
outputBuffer?: Buffer<ArrayBuffer>;
|
|
28
|
+
}
|
|
29
|
+
export interface IZipSyncUnpackResult {
|
|
30
|
+
metadata: IMetadata;
|
|
31
|
+
filesExtracted: number;
|
|
32
|
+
filesSkipped: number;
|
|
33
|
+
filesDeleted: number;
|
|
34
|
+
foldersDeleted: number;
|
|
35
|
+
otherEntriesDeleted: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Unpack a zipsync archive into the provided target directories.
|
|
39
|
+
*/
|
|
40
|
+
export declare function unpack({ archivePath, targetDirectories: rawTargetDirectories, baseDir: rawBaseDir, terminal, outputBuffer }: IZipSyncUnpackOptions): IZipSyncUnpackResult;
|
|
41
|
+
//# sourceMappingURL=unpack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpack.d.ts","sourceRoot":"","sources":["../src/unpack.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAiBrD,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAQxB;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;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;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EACrB,WAAW,EACX,iBAAiB,EAAE,oBAAoB,EACvC,OAAO,EAAE,UAAU,EACnB,QAAQ,EACR,YAAwD,EACzD,EAAE,qBAAqB,GAAG,oBAAoB,CA2R9C"}
|