@mikeyt23/node-cli-utils 2.0.0-beta.1 → 2.0.0-beta.3

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 (81) hide show
  1. package/dist/cjs/DependencyChecker.d.ts +26 -0
  2. package/dist/cjs/DependencyChecker.d.ts.map +1 -0
  3. package/dist/cjs/DependencyChecker.js +200 -0
  4. package/dist/cjs/GitUtility.d.ts +7 -0
  5. package/dist/cjs/GitUtility.d.ts.map +1 -0
  6. package/dist/cjs/GitUtility.js +49 -0
  7. package/dist/cjs/NixUtil.d.ts +8 -0
  8. package/dist/cjs/NixUtil.d.ts.map +1 -0
  9. package/dist/cjs/NixUtil.js +50 -0
  10. package/dist/cjs/TarballUtility.d.ts +17 -7
  11. package/dist/cjs/TarballUtility.d.ts.map +1 -1
  12. package/dist/cjs/TarballUtility.js +18 -24
  13. package/dist/cjs/certUtils.d.ts +53 -17
  14. package/dist/cjs/certUtils.d.ts.map +1 -1
  15. package/dist/cjs/certUtils.js +176 -111
  16. package/dist/cjs/colors.d.ts +17 -0
  17. package/dist/cjs/colors.d.ts.map +1 -0
  18. package/dist/cjs/colors.js +30 -0
  19. package/dist/cjs/dbMigrationUtils.js +44 -54
  20. package/dist/cjs/dotnetUtils.d.ts.map +1 -1
  21. package/dist/cjs/dotnetUtils.js +4 -2
  22. package/dist/cjs/esmSpecific.d.mts +5 -0
  23. package/dist/cjs/esmSpecific.d.mts.map +1 -1
  24. package/dist/cjs/esmSpecific.mjs +6 -1
  25. package/dist/cjs/generalUtils.d.ts +252 -26
  26. package/dist/cjs/generalUtils.d.ts.map +1 -1
  27. package/dist/cjs/generalUtils.js +503 -107
  28. package/dist/cjs/generalUtilsInternal.d.ts +9 -3
  29. package/dist/cjs/generalUtilsInternal.d.ts.map +1 -1
  30. package/dist/cjs/generalUtilsInternal.js +160 -59
  31. package/dist/cjs/hostFileUtils.d.ts +18 -0
  32. package/dist/cjs/hostFileUtils.d.ts.map +1 -0
  33. package/dist/cjs/hostFileUtils.js +100 -0
  34. package/dist/cjs/index.d.ts +1 -0
  35. package/dist/cjs/index.d.ts.map +1 -1
  36. package/dist/cjs/index.js +2 -1
  37. package/dist/cjs/runWhileParentAlive.js +7 -9
  38. package/dist/cjs/testUtils.d.ts +11 -0
  39. package/dist/cjs/testUtils.d.ts.map +1 -0
  40. package/dist/cjs/testUtils.js +58 -0
  41. package/dist/esm/DependencyChecker.d.ts +26 -0
  42. package/dist/esm/DependencyChecker.d.ts.map +1 -0
  43. package/dist/esm/DependencyChecker.js +172 -0
  44. package/dist/esm/GitUtility.d.ts +7 -0
  45. package/dist/esm/GitUtility.d.ts.map +1 -0
  46. package/dist/esm/GitUtility.js +43 -0
  47. package/dist/esm/NixUtil.d.ts +8 -0
  48. package/dist/esm/NixUtil.d.ts.map +1 -0
  49. package/dist/esm/NixUtil.js +46 -0
  50. package/dist/esm/TarballUtility.d.ts +17 -7
  51. package/dist/esm/TarballUtility.d.ts.map +1 -1
  52. package/dist/esm/TarballUtility.js +21 -25
  53. package/dist/esm/certUtils.d.ts +53 -17
  54. package/dist/esm/certUtils.d.ts.map +1 -1
  55. package/dist/esm/certUtils.js +173 -86
  56. package/dist/esm/colors.d.ts +17 -0
  57. package/dist/esm/colors.d.ts.map +1 -0
  58. package/dist/esm/colors.js +20 -0
  59. package/dist/esm/dbMigrationUtils.js +45 -55
  60. package/dist/esm/dotnetUtils.d.ts.map +1 -1
  61. package/dist/esm/dotnetUtils.js +4 -2
  62. package/dist/esm/esmSpecific.d.mts +5 -0
  63. package/dist/esm/esmSpecific.d.mts.map +1 -1
  64. package/dist/esm/esmSpecific.mjs +6 -1
  65. package/dist/esm/generalUtils.d.ts +252 -26
  66. package/dist/esm/generalUtils.d.ts.map +1 -1
  67. package/dist/esm/generalUtils.js +477 -105
  68. package/dist/esm/generalUtilsInternal.d.ts +9 -3
  69. package/dist/esm/generalUtilsInternal.d.ts.map +1 -1
  70. package/dist/esm/generalUtilsInternal.js +151 -57
  71. package/dist/esm/hostFileUtils.d.ts +18 -0
  72. package/dist/esm/hostFileUtils.d.ts.map +1 -0
  73. package/dist/esm/hostFileUtils.js +85 -0
  74. package/dist/esm/index.d.ts +1 -0
  75. package/dist/esm/index.d.ts.map +1 -1
  76. package/dist/esm/index.js +2 -1
  77. package/dist/esm/runWhileParentAlive.js +8 -10
  78. package/dist/esm/testUtils.d.ts +11 -0
  79. package/dist/esm/testUtils.d.ts.map +1 -0
  80. package/dist/esm/testUtils.js +47 -0
  81. package/package.json +38 -2
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assertErrorMessageEquals = exports.assertErrorMessageIncludes = exports.assertErrorMessageStartsWith = exports.fileExistsAndIsNonZero = exports.ensureEmptyTempDir = exports.only = exports.fixturesDir = exports.tempDir = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ exports.tempDir = './test/temp';
11
+ exports.fixturesDir = './test/fixtures';
12
+ exports.only = { only: true }; // Convenience object to make it easier to mark tests as "only"
13
+ const ensureEmptyTempDir = async (dir) => {
14
+ if (!dir) {
15
+ throw new Error('dir is required');
16
+ }
17
+ if (!dir.startsWith('test/temp') && !dir.startsWith('test\\temp') && !dir.startsWith('./test/temp') && !dir.startsWith('.\\test\\temp')) {
18
+ throw new Error(`dir must start with 'test/temp': ${dir}`);
19
+ }
20
+ if (node_fs_1.default.existsSync(dir)) {
21
+ await promises_1.default.rm(dir, { recursive: true, force: true });
22
+ }
23
+ await promises_1.default.mkdir(dir, { recursive: true });
24
+ };
25
+ exports.ensureEmptyTempDir = ensureEmptyTempDir;
26
+ function fileExistsAndIsNonZero(filePath) {
27
+ try {
28
+ const stats = node_fs_1.default.statSync(filePath);
29
+ return stats.isFile() && stats.size > 0;
30
+ }
31
+ catch (err) {
32
+ const e = err;
33
+ if (e.code === 'ENOENT') {
34
+ return false; // File doesn't exist
35
+ }
36
+ throw err; // Rethrow other errors
37
+ }
38
+ }
39
+ exports.fileExistsAndIsNonZero = fileExistsAndIsNonZero;
40
+ function assertErrorMessageStartsWith(err, expectedStartsWith) {
41
+ (0, node_assert_1.default)(err instanceof Error);
42
+ node_assert_1.default.strictEqual(err.message.startsWith(expectedStartsWith), true, `Error message did not start with expected value. Actual: "${err.message}".`);
43
+ return true;
44
+ }
45
+ exports.assertErrorMessageStartsWith = assertErrorMessageStartsWith;
46
+ function assertErrorMessageIncludes(err, expectedIncludes) {
47
+ (0, node_assert_1.default)(err instanceof Error);
48
+ node_assert_1.default.strictEqual(err.message.includes(expectedIncludes), true, `Error message did not include the expected value. Actual: "${err.message}".`);
49
+ return true;
50
+ }
51
+ exports.assertErrorMessageIncludes = assertErrorMessageIncludes;
52
+ function assertErrorMessageEquals(err, expected) {
53
+ (0, node_assert_1.default)(err instanceof Error);
54
+ node_assert_1.default.strictEqual(err.message, expected, `Error message did not equal the expected value. Actual: "${err.message}".`);
55
+ return true;
56
+ }
57
+ exports.assertErrorMessageEquals = assertErrorMessageEquals;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBZ0M7QUFDaEMsc0RBQXdCO0FBQ3hCLGdFQUFrQztBQUVyQixRQUFBLE9BQU8sR0FBRyxhQUFhLENBQUE7QUFDdkIsUUFBQSxXQUFXLEdBQUcsaUJBQWlCLENBQUE7QUFDL0IsUUFBQSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUEsQ0FBQywrREFBK0Q7QUFFM0YsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsR0FBVyxFQUFFLEVBQUU7SUFDdEQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtLQUNuQztJQUNELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ3ZJLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLEdBQUcsRUFBRSxDQUFDLENBQUE7S0FDM0Q7SUFDRCxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sa0JBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtLQUNwRDtJQUNELE1BQU0sa0JBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDM0MsQ0FBQyxDQUFBO0FBWFksUUFBQSxrQkFBa0Isc0JBVzlCO0FBRUQsU0FBZ0Isc0JBQXNCLENBQUMsUUFBZ0I7SUFDckQsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLGlCQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ25DLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO0tBQ3hDO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixNQUFNLENBQUMsR0FBRyxHQUF3QixDQUFBO1FBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDdkIsT0FBTyxLQUFLLENBQUEsQ0FBQyxxQkFBcUI7U0FDbkM7UUFDRCxNQUFNLEdBQUcsQ0FBQSxDQUFDLHVCQUF1QjtLQUNsQztBQUNILENBQUM7QUFYRCx3REFXQztBQUVELFNBQWdCLDRCQUE0QixDQUFDLEdBQVksRUFBRSxrQkFBMEI7SUFDbkYsSUFBQSxxQkFBTSxFQUFDLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQTtJQUM1QixxQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLElBQUksRUFBRSw2REFBNkQsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUE7SUFDbEosT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBSkQsb0VBSUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FBQyxHQUFZLEVBQUUsZ0JBQXdCO0lBQy9FLElBQUEscUJBQU0sRUFBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUE7SUFDNUIscUJBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsOERBQThELEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFBO0lBQy9JLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUpELGdFQUlDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsR0FBWSxFQUFFLFFBQWdCO0lBQ3JFLElBQUEscUJBQU0sRUFBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUE7SUFDNUIscUJBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsNERBQTRELEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFBO0lBQ3RILE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUpELDREQUlDIn0=
@@ -0,0 +1,26 @@
1
+ export type PlatformCode = 'win' | 'linux' | 'mac';
2
+ export type StringBoolEntry = {
3
+ key: string;
4
+ value: boolean;
5
+ };
6
+ export type StringBoolArray = StringBoolEntry[];
7
+ export default abstract class DependencyChecker {
8
+ protected platformCode: PlatformCode;
9
+ constructor();
10
+ abstract getReport(): Promise<StringBoolArray>;
11
+ hasAllDependencies(dependenciesReport: StringBoolArray): boolean;
12
+ getFormattedReport(report: StringBoolArray, includePlatform?: boolean, omitKeys?: string[]): string;
13
+ protected hasElevatedPermissions(): Promise<boolean>;
14
+ protected winHasElevatedPerms(): Promise<boolean>;
15
+ protected linuxHasElevatedPerms(): Promise<boolean>;
16
+ protected hasGit(): Promise<boolean>;
17
+ protected hasDotnetSdkGreaterThanOrEqualTo(minimumMajorVersion: number): Promise<boolean>;
18
+ protected hasNodejsGreaterThanOrEqualTo(minimumMajorVersion: number): Promise<boolean>;
19
+ protected hasDocker(): Promise<boolean>;
20
+ protected dockerIsRunning(): Promise<boolean>;
21
+ protected hasOpenssl(): Promise<boolean>;
22
+ protected isPortAvailableByEnvKey(envKey: string): Promise<boolean>;
23
+ protected isPortAvailable(port: number): Promise<boolean>;
24
+ private getPlatform;
25
+ }
26
+ //# sourceMappingURL=DependencyChecker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyChecker.d.ts","sourceRoot":"","sources":["../../src/DependencyChecker.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAA;AAClD,MAAM,MAAM,eAAe,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAA;AAC7D,MAAM,MAAM,eAAe,GAAG,eAAe,EAAE,CAAA;AAE/C,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,iBAAiB;IAC7C,SAAS,CAAC,YAAY,EAAE,YAAY,CAAA;;IAMpC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAE9C,kBAAkB,CAAC,kBAAkB,EAAE,eAAe,GAAG,OAAO;IAOhE,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;cA0BnF,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC;cAY1C,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;cASvC,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;cAQzC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;cAI1B,gCAAgC,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAsB/E,6BAA6B,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cA6B5E,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;cAI7B,eAAe;cAIf,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;cAmB9B,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAczD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB/D,OAAO,CAAC,WAAW;CAYpB"}
@@ -0,0 +1,172 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import chalk from 'chalk';
3
+ import { platform as rawPlatformString } from 'node:process';
4
+ import * as net from 'net';
5
+ import { isDockerRunning, isPlatformLinux, isPlatformMac, isPlatformWindows, spawnAsync, whichSync } from './generalUtils.js';
6
+ export default class DependencyChecker {
7
+ platformCode;
8
+ constructor() {
9
+ this.platformCode = this.getPlatform();
10
+ }
11
+ hasAllDependencies(dependenciesReport) {
12
+ if (dependenciesReport === null) {
13
+ return false;
14
+ }
15
+ return dependenciesReport.every(entry => entry.value);
16
+ }
17
+ getFormattedReport(report, includePlatform, omitKeys) {
18
+ const platformKey = 'Platform';
19
+ const filteredReport = omitKeys && omitKeys.length > 0 ?
20
+ report.filter(entry => !omitKeys.includes(entry.key)) :
21
+ report;
22
+ const longestKeyLength = Math.max(...filteredReport.map(entry => entry.key.length), platformKey.length);
23
+ let reportString = '\n';
24
+ if (includePlatform) {
25
+ reportString += `${platformKey}${' '.repeat(longestKeyLength - platformKey.length)}: ${this.platformCode}\n`;
26
+ }
27
+ for (const { key, value } of filteredReport) {
28
+ const padding = ' '.repeat(longestKeyLength - key.length);
29
+ reportString += `${key}${padding}: ${value ? chalk.green('true') : chalk.red('false')}\n`;
30
+ }
31
+ return reportString;
32
+ }
33
+ async hasElevatedPermissions() {
34
+ if (this.platformCode === 'win') {
35
+ return await this.winHasElevatedPerms();
36
+ }
37
+ else if (this.platformCode === 'linux') {
38
+ return await this.linuxHasElevatedPerms();
39
+ }
40
+ else if (this.platformCode === 'mac') {
41
+ return await this.linuxHasElevatedPerms();
42
+ }
43
+ return false;
44
+ }
45
+ async winHasElevatedPerms() {
46
+ try {
47
+ await spawnAsync('net', ['session'], { throwOnNonZero: true, stdio: 'ignore' });
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ async linuxHasElevatedPerms() {
55
+ if (!process.getuid) {
56
+ throw new Error('Cannot determine if linux user has elevated permissions (process.getuid is undefined)');
57
+ }
58
+ const uid = process.getuid();
59
+ return uid === 0;
60
+ }
61
+ async hasGit() {
62
+ return !!whichSync('git').location;
63
+ }
64
+ async hasDotnetSdkGreaterThanOrEqualTo(minimumMajorVersion) {
65
+ if (!whichSync('dotnet').location) {
66
+ return false;
67
+ }
68
+ const childProc = spawnSync('dotnet', ['--list-sdks'], { encoding: 'utf-8' });
69
+ if (childProc.error) {
70
+ return false;
71
+ }
72
+ const lines = childProc.stdout.split('\n').filter((line) => !!line);
73
+ const lastLine = lines[lines.length - 1];
74
+ let latestMajorVersion;
75
+ try {
76
+ latestMajorVersion = parseInt(lastLine.substring(0, lastLine.indexOf('.')));
77
+ }
78
+ catch {
79
+ throw Error('error parsing results of dotnet --list-sdks');
80
+ }
81
+ return latestMajorVersion >= minimumMajorVersion;
82
+ }
83
+ async hasNodejsGreaterThanOrEqualTo(minimumMajorVersion) {
84
+ if (!whichSync('node').location) {
85
+ return false;
86
+ }
87
+ const childProc = spawnSync('node', ['-v'], { encoding: 'utf-8' });
88
+ if (childProc.error) {
89
+ return false;
90
+ }
91
+ const output = childProc.stdout;
92
+ if (!output || output.length === 0) {
93
+ return false;
94
+ }
95
+ if (!output.startsWith('v')) {
96
+ throw Error('unexpected output for node -v');
97
+ }
98
+ let foundMajorVersion;
99
+ try {
100
+ foundMajorVersion = parseInt(output.substring(1, output.indexOf('.')));
101
+ }
102
+ catch {
103
+ throw Error('error parsing node version');
104
+ }
105
+ return foundMajorVersion >= minimumMajorVersion;
106
+ }
107
+ async hasDocker() {
108
+ return !!whichSync('docker');
109
+ }
110
+ async dockerIsRunning() {
111
+ return await isDockerRunning();
112
+ }
113
+ async hasOpenssl() {
114
+ if (this.platformCode === 'mac') {
115
+ const childProc = spawnSync('brew', ['--prefix', 'openssl'], { encoding: 'utf-8' });
116
+ if (childProc.error) {
117
+ return false;
118
+ }
119
+ const output = childProc.stdout;
120
+ if (!output || output.length === 0) {
121
+ return false;
122
+ }
123
+ return !output.toLowerCase().startsWith('error');
124
+ }
125
+ return !!whichSync('openssl').location;
126
+ }
127
+ async isPortAvailableByEnvKey(envKey) {
128
+ const errorBase = `Cannot lookup port availability for env key ${envKey}`;
129
+ const envVal = process.env[envKey];
130
+ if (!envVal) {
131
+ throw new Error(errorBase + ' - env value not found');
132
+ }
133
+ const port = parseInt(envVal);
134
+ if (isNaN(port)) {
135
+ throw new Error(errorBase + ' - env value could not be parsed into an integer');
136
+ }
137
+ return await this.isPortAvailable(port);
138
+ }
139
+ async isPortAvailable(port) {
140
+ return new Promise((resolve) => {
141
+ const tester = net.connect(port, '127.0.0.1');
142
+ tester.on('connect', () => {
143
+ tester.destroy();
144
+ resolve(false); // port is in use
145
+ });
146
+ tester.on('error', (err) => {
147
+ tester.destroy();
148
+ if (err.code === 'ECONNREFUSED') {
149
+ resolve(true); // port is available
150
+ }
151
+ else {
152
+ resolve(false); // some other error occurred, assume port is in use
153
+ }
154
+ });
155
+ });
156
+ }
157
+ getPlatform() {
158
+ if (isPlatformWindows()) {
159
+ return 'win';
160
+ }
161
+ else if (isPlatformMac()) {
162
+ return 'mac';
163
+ }
164
+ else if (isPlatformLinux()) {
165
+ return 'linux';
166
+ }
167
+ else {
168
+ throw Error(`Platform not supported: ${rawPlatformString}. Nodejs process.platform must be win32, darwin or linux.`);
169
+ }
170
+ }
171
+ }
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwZW5kZW5jeUNoZWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvRGVwZW5kZW5jeUNoZWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEVBQUUsUUFBUSxJQUFJLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzVELE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFBO0FBQzFCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFNN0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsaUJBQWlCO0lBQ25DLFlBQVksQ0FBYztJQUVwQztRQUNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3hDLENBQUM7SUFJRCxrQkFBa0IsQ0FBQyxrQkFBbUM7UUFDcEQsSUFBSSxrQkFBa0IsS0FBSyxJQUFJLEVBQUU7WUFDL0IsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUNELE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUF1QixFQUFFLGVBQXlCLEVBQUUsUUFBbUI7UUFDeEYsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFBO1FBRTlCLE1BQU0sY0FBYyxHQUFvQixRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2RSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFH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
@@ -0,0 +1,7 @@
1
+ import { spawnAsync } from './generalUtils.js';
2
+ export interface GitUtilityDependencies {
3
+ spawnAsyncFn: typeof spawnAsync;
4
+ }
5
+ export declare const isValidBranchName: (branchName: string) => boolean;
6
+ export declare const cloneProject: (repoUrl: string, localDestPath: string, branchName?: string, deleteGitFolder?: boolean) => Promise<void>;
7
+ //# sourceMappingURL=GitUtility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitUtility.d.ts","sourceRoot":"","sources":["../../src/GitUtility.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGtD,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,OAAO,UAAU,CAAA;CAChC;AAgDD,eAAO,MAAM,iBAAiB,eAvCE,MAAM,KAAG,OAuC2B,CAAA;AACpE,eAAO,MAAM,YAAY,YAzBK,MAAM,iBAAiB,MAAM,eAAc,MAAM,oBAA4B,OAAO,kBAyBxD,CAAA"}
@@ -0,0 +1,43 @@
1
+ import fs from 'node:fs';
2
+ import fsp from 'node:fs/promises';
3
+ import { mkdirp, spawnAsync } from './generalUtils.js';
4
+ import { join } from 'node:path';
5
+ class GitUtility {
6
+ spawnAsyncFn;
7
+ constructor(dependencies = {}) {
8
+ this.spawnAsyncFn = dependencies.spawnAsyncFn ?? spawnAsync;
9
+ }
10
+ isValidBranchName(branchName) {
11
+ if (branchName.startsWith('-') || branchName.endsWith('/') || branchName.endsWith('.') || branchName.endsWith('@{') || branchName.includes('..')) {
12
+ return false;
13
+ }
14
+ const invalidChars = [' ', '~', '^', ':', '\\', '*', '?', '[', ']', '/'];
15
+ for (const char of branchName) {
16
+ if (invalidChars.includes(char)) {
17
+ return false;
18
+ }
19
+ }
20
+ return true;
21
+ }
22
+ async cloneProject(repoUrl, localDestPath, branchName = 'main', deleteGitFolder = true) {
23
+ if (fs.existsSync(localDestPath)) {
24
+ throw new Error(`Cannot clone project - destination path already exists: ${localDestPath}`);
25
+ }
26
+ if (!this.isValidBranchName(branchName)) {
27
+ throw new Error(`Cannot clone project - invalid branch name: ${branchName}`);
28
+ }
29
+ await mkdirp(localDestPath);
30
+ const cloneArgs = `clone -b ${branchName} --single-branch --depth 1 ${repoUrl} ${localDestPath}`.split(' ');
31
+ const result = await this.spawnAsyncFn('git', cloneArgs);
32
+ if (result.code !== 0) {
33
+ throw new Error(`Failed to clone project '${result.stderr}' to '${localDestPath}'`);
34
+ }
35
+ if (deleteGitFolder) {
36
+ await fsp.rm(join(localDestPath, '.git'), { recursive: true });
37
+ }
38
+ }
39
+ }
40
+ const defaultGitUtility = new GitUtility();
41
+ export const isValidBranchName = defaultGitUtility.isValidBranchName;
42
+ export const cloneProject = defaultGitUtility.cloneProject;
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0VXRpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9HaXRVdGlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQTtBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFNaEMsTUFBTSxVQUFVO0lBQ04sWUFBWSxDQUFtQjtJQUV2QyxZQUFZLGVBQWdELEVBQUU7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQTtJQUM3RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsVUFBa0I7UUFDbEMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEosT0FBTyxLQUFLLENBQUE7U0FDYjtRQUVELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDeEUsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUU7WUFDN0IsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixPQUFPLEtBQUssQ0FBQTthQUNiO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQWUsRUFBRSxhQUFxQixFQUFFLGFBQXFCLE1BQU0sRUFBRSxrQkFBMkIsSUFBSTtRQUNySCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsYUFBYSxFQUFFLENBQUMsQ0FBQTtTQUM1RjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsVUFBVSxFQUFFLENBQUMsQ0FBQTtTQUM3RTtRQUVELE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTNCLE1BQU0sU0FBUyxHQUFHLFlBQVksVUFBVSw4QkFBOEIsT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzRyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3hELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsTUFBTSxDQUFDLE1BQU0sU0FBUyxhQUFhLEdBQUcsQ0FBQyxDQUFBO1NBQ3BGO1FBRUQsSUFBSSxlQUFlLEVBQUU7WUFDbkIsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtTQUMvRDtJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQTtBQUUxQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQTtBQUNwRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsWUFBWSxDQUFBIn0=
@@ -0,0 +1,8 @@
1
+ export declare class NixUtil {
2
+ private sudoerUsername;
3
+ private populateSudoerErrorMessage;
4
+ constructor();
5
+ private tryPopulateSudoerUsername;
6
+ private runAsSudoer;
7
+ }
8
+ //# sourceMappingURL=NixUtil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NixUtil.d.ts","sourceRoot":"","sources":["../../src/NixUtil.ts"],"names":[],"mappings":"AAGA,qBAAa,OAAO;IAClB,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,0BAA0B,CAAa;;YAUjC,yBAAyB;YA8BzB,WAAW;CAa1B"}
@@ -0,0 +1,46 @@
1
+ import { isPlatformWindows, log, simpleSpawnSync, spawnAsync } from './generalUtils.js';
2
+ // Untested - moved over from old project
3
+ export class NixUtil {
4
+ sudoerUsername = '';
5
+ populateSudoerErrorMessage = '';
6
+ constructor() {
7
+ if (isPlatformWindows()) {
8
+ throw new Error('NixUtil is not supported on Windows');
9
+ }
10
+ this.tryPopulateSudoerUsername();
11
+ }
12
+ async tryPopulateSudoerUsername() {
13
+ const sudoerId = process.env.SUDO_UID;
14
+ if (sudoerId === undefined) {
15
+ this.populateSudoerErrorMessage = 'cannot get sudoer username - process not started with sudo';
16
+ return;
17
+ }
18
+ log(`attempting to find username for sudoer id ${sudoerId}`);
19
+ const childProcess = simpleSpawnSync('id', ['-nu', sudoerId]);
20
+ if (childProcess.code !== 0) {
21
+ throw new Error(`Unable to get sudoer username - id command exited with code ${childProcess.code}. Stderr: ${childProcess.stderr}`);
22
+ }
23
+ let username = childProcess.stdout;
24
+ if (!username) {
25
+ this.populateSudoerErrorMessage = 'unable to get sudoer username - id command did not return a username';
26
+ return;
27
+ }
28
+ username = username.replace('\n', '');
29
+ log(`using sudoer username: ${username}`);
30
+ this.sudoerUsername = username;
31
+ }
32
+ async runAsSudoer(cmd, cwd) {
33
+ if (!this.sudoerUsername) {
34
+ if (this.populateSudoerErrorMessage) {
35
+ throw new Error(this.populateSudoerErrorMessage);
36
+ }
37
+ else {
38
+ throw new Error('sudoer username was not populated - cannot continue');
39
+ }
40
+ }
41
+ const cmdArgs = `-H -u ${this.sudoerUsername} bash -c`.split(' ');
42
+ cmdArgs.push(`'${cmd}'`);
43
+ await spawnAsync('sudo', cmdArgs, { cwd: cwd ?? process.cwd() });
44
+ }
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTml4VXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9OaXhVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRXZGLHlDQUF5QztBQUN6QyxNQUFNLE9BQU8sT0FBTztJQUNWLGNBQWMsR0FBVyxFQUFFLENBQUE7SUFDM0IsMEJBQTBCLEdBQVcsRUFBRSxDQUFBO0lBRS9DO1FBQ0UsSUFBSSxpQkFBaUIsRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtTQUN2RDtRQUVELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFBO1FBRXJDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMxQixJQUFJLENBQUMsMEJBQTBCLEdBQUcsNERBQTRELENBQUE7WUFDOUYsT0FBTTtTQUNQO1FBRUQsR0FBRyxDQUFDLDZDQUE2QyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBRTVELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUU3RCxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELFlBQVksQ0FBQyxJQUFJLGFBQWEsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7U0FDcEk7UUFFRCxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFBO1FBRWxDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixJQUFJLENBQUMsMEJBQTBCLEdBQUcsc0VBQXNFLENBQUE7WUFDeEcsT0FBTTtTQUNQO1FBRUQsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRXJDLEdBQUcsQ0FBQywwQkFBMEIsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUV6QyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQTtJQUNoQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFXLEVBQUUsR0FBWTtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTthQUNqRDtpQkFBTTtnQkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUE7YUFDdkU7U0FDRjtRQUVELE1BQU0sT0FBTyxHQUFHLFNBQVMsSUFBSSxDQUFDLGNBQWMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNqRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUN4QixNQUFNLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7Q0FDRiJ9
@@ -1,4 +1,5 @@
1
- import { whichSync } from './generalUtils.js';
1
+ import fs from 'node:fs';
2
+ import { mkdirp, spawnAsync, whichSync } from './generalUtils.js';
2
3
  export interface CreateTarballOptions {
3
4
  /**
4
5
  * A list of files or directories to exclude from the tarball.
@@ -7,16 +8,25 @@ export interface CreateTarballOptions {
7
8
  excludes?: string[];
8
9
  }
9
10
  export interface TarballUnpackOptions {
10
- createDirIfNotExists?: boolean;
11
- stripComponents?: number;
12
- throwOnNonEmptyUnpackDir?: boolean;
11
+ createDirIfNotExists: boolean;
12
+ stripComponents: number;
13
+ throwOnNonEmptyUnpackDir: boolean;
14
+ }
15
+ export interface TarballUtilityDependencies {
16
+ whichSyncFn: typeof whichSync;
17
+ spawnAsyncFn: typeof spawnAsync;
18
+ statSyncFn: typeof fs.statSync;
19
+ mkdirpFn: typeof mkdirp;
13
20
  }
14
21
  /**
15
22
  * This utility class exists so we can mock the `which` dependency in unit tests without resorting to libraries that hack the import system.
16
23
  */
17
24
  export declare class TarballUtility {
18
25
  private whichSyncFn;
19
- constructor(whichSyncFn: typeof whichSync);
26
+ private spawnAsyncFn;
27
+ private statSyncFn;
28
+ private mkdirpFn;
29
+ constructor(dependencies?: Partial<TarballUtilityDependencies>);
20
30
  /**
21
31
  * Creates a gzipped tarball from a directory by spawning a process to run OS-installed `tar` to avoid pulling in npm package dependencies.
22
32
  * Note that Windows has tar since Windows 10 1803 (see https://devblogs.microsoft.com/commandline/windows10v1803/.
@@ -35,7 +45,7 @@ export declare class TarballUtility {
35
45
  * @param unpackDirectory The directory to unpack the tarball into
36
46
  * @param options The options to use when unpacking the tarball. See {@link TarballUnpackOptions}.
37
47
  */
38
- unpackTarball: (tarballPath: string, unpackDirectory: string, options?: TarballUnpackOptions) => Promise<void>;
48
+ unpackTarball: (tarballPath: string, unpackDirectory: string, options?: Partial<TarballUnpackOptions>) => Promise<void>;
39
49
  /**
40
50
  * A more opinionated version of {@link unpackTarball} that assumes you want to create the directory and strip the first directory out of the unpacked files.
41
51
  * @param tarballPath The path to the tarball to unpack
@@ -48,6 +58,6 @@ export declare class TarballUtility {
48
58
  private tryCreateDirectory;
49
59
  }
50
60
  export declare const createTarball: (directoryToTarball: string, tarballPath: string, options?: CreateTarballOptions) => Promise<void>;
51
- export declare const unpackTarball: (tarballPath: string, unpackDirectory: string, options?: TarballUnpackOptions) => Promise<void>;
61
+ export declare const unpackTarball: (tarballPath: string, unpackDirectory: string, options?: Partial<TarballUnpackOptions>) => Promise<void>;
52
62
  export declare const unpackTarballContents: (tarballPath: string, unpackDirectory: string, stripComponents?: number) => Promise<void>;
53
63
  //# sourceMappingURL=TarballUtility.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TarballUtility.d.ts","sourceRoot":"","sources":["../../src/TarballUtility.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8D,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAGzG,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wBAAwB,CAAC,EAAE,OAAO,CAAA;CACnC;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAkB;gBAEzB,WAAW,EAAE,OAAO,SAAS;IAIzC;;;;;;;;;OASG;IACH,aAAa,uBAA8B,MAAM,eAAe,MAAM,YAAY,oBAAoB,mBA4CrG;IAED;;;;;;OAMG;IACH,aAAa,gBAAuB,MAAM,mBAAmB,MAAM,YAAY,oBAAoB,mBA0ClG;IAED;;;;;OAKG;IACH,qBAAqB,gBAAuB,MAAM,mBAAmB,MAAM,oBAAmB,MAAM,mBAEnG;IAED,OAAO,CAAC,WAAW,CAOlB;IAED,OAAO,CAAC,aAAa,CAOpB;IAED,OAAO,CAAC,kBAAkB,CAUzB;CACF;AAID,eAAO,MAAM,aAAa,uBA5ImB,MAAM,eAAe,MAAM,YAAY,oBAAoB,kBA4IlD,CAAA;AACtD,eAAO,MAAM,aAAa,gBAxFY,MAAM,mBAAmB,MAAM,YAAY,oBAAoB,kBAwF/C,CAAA;AACtD,eAAO,MAAM,qBAAqB,gBAvCY,MAAM,mBAAmB,MAAM,oBAAmB,MAAM,kBAuChC,CAAA"}
1
+ {"version":3,"file":"TarballUtility.d.ts","sourceRoot":"","sources":["../../src/TarballUtility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB,OAAO,EAAiB,MAAM,EAAmC,UAAU,EAAS,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAGxH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,OAAO,CAAA;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,wBAAwB,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,OAAO,SAAS,CAAA;IAC7B,YAAY,EAAE,OAAO,UAAU,CAAA;IAC/B,UAAU,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAA;IAC9B,QAAQ,EAAE,OAAO,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAe;gBAEnB,YAAY,GAAE,OAAO,CAAC,0BAA0B,CAAM;IAOlE;;;;;;;;;OASG;IACH,aAAa,uBAA8B,MAAM,eAAe,MAAM,YAAY,oBAAoB,mBAsCrG;IAED;;;;;;OAMG;IACH,aAAa,gBAAuB,MAAM,mBAAmB,MAAM,YAAY,QAAQ,oBAAoB,CAAC,mBA0C3G;IAED;;;;;OAKG;IACH,qBAAqB,gBAAuB,MAAM,mBAAmB,MAAM,oBAAmB,MAAM,mBAEnG;IAED,OAAO,CAAC,WAAW,CAQlB;IAED,OAAO,CAAC,aAAa,CAOpB;IAED,OAAO,CAAC,kBAAkB,CAMzB;CACF;AAID,eAAO,MAAM,aAAa,uBAnImB,MAAM,eAAe,MAAM,YAAY,oBAAoB,kBAmIlD,CAAA;AACtD,eAAO,MAAM,aAAa,gBArFY,MAAM,mBAAmB,MAAM,YAAY,QAAQ,oBAAoB,CAAC,kBAqFxD,CAAA;AACtD,eAAO,MAAM,qBAAqB,gBApCY,MAAM,mBAAmB,MAAM,oBAAmB,MAAM,kBAoChC,CAAA"}
@@ -1,15 +1,20 @@
1
1
  import fs from 'node:fs';
2
- import fsp from 'node:fs/promises';
3
2
  import path from 'node:path';
4
- import { mkdirp, requireString, requireValidPath, spawnAsync, trace, whichSync } from './generalUtils.js';
3
+ import { ExtendedError, mkdirp, requireString, requireValidPath, spawnAsync, trace, whichSync } from './generalUtils.js';
5
4
  import { config } from './NodeCliUtilsConfig.js';
6
5
  /**
7
6
  * This utility class exists so we can mock the `which` dependency in unit tests without resorting to libraries that hack the import system.
8
7
  */
9
8
  export class TarballUtility {
10
9
  whichSyncFn;
11
- constructor(whichSyncFn) {
12
- this.whichSyncFn = whichSyncFn;
10
+ spawnAsyncFn;
11
+ statSyncFn;
12
+ mkdirpFn;
13
+ constructor(dependencies = {}) {
14
+ this.whichSyncFn = dependencies.whichSyncFn ?? whichSync;
15
+ this.spawnAsyncFn = dependencies.spawnAsyncFn ?? spawnAsync;
16
+ this.statSyncFn = dependencies.statSyncFn ?? fs.statSync;
17
+ this.mkdirpFn = dependencies.mkdirpFn ?? mkdirp;
13
18
  }
14
19
  /**
15
20
  * Creates a gzipped tarball from a directory by spawning a process to run OS-installed `tar` to avoid pulling in npm package dependencies.
@@ -29,28 +34,23 @@ export class TarballUtility {
29
34
  if (!this.whichSyncFn('tar').location) {
30
35
  throw new Error('tar command not found - please install tar on your OS to use this method, or consider using the npm package node-tar instead');
31
36
  }
32
- if (!fs.existsSync(directoryToTarball)) {
33
- throw new Error(`directoryToTarball does not exist: ${directoryToTarball}`);
34
- }
35
37
  if (tarballPath.endsWith('.tar.gz') === false) {
36
38
  throw new Error(`tarballPath must end with '.tar.gz': ${tarballPath}`);
37
39
  }
38
40
  const directoryToTarballParentDir = path.dirname(directoryToTarball);
39
41
  const directoryToTarballName = path.basename(directoryToTarball);
40
42
  const outputDirectory = path.dirname(tarballPath);
41
- const tarballName = path.basename(tarballPath);
42
43
  if (!fs.existsSync(outputDirectory)) {
43
44
  trace(`tarballPath directory does not exist - creating '${outputDirectory}'`);
44
- await mkdirp(outputDirectory);
45
+ await this.mkdirpFn(outputDirectory);
45
46
  }
46
47
  else if (fs.existsSync(tarballPath)) {
47
- trace(`removing existing tarball '${tarballName}' before creating new one`);
48
- await fsp.unlink(tarballPath);
48
+ throw new Error(`tarballPath already exists - delete, move or rename it first: ${tarballPath}`);
49
49
  }
50
50
  const excludesArgs = mergedOptions.excludes.length > 0 ? mergedOptions.excludes.map(exclude => `--exclude=${exclude}`) : [];
51
51
  const verboseFlag = config.traceEnabled ? ['-v'] : [];
52
52
  const args = [...(verboseFlag), '-czf', tarballPath, '-C', directoryToTarballParentDir, ...excludesArgs, directoryToTarballName];
53
- const result = await spawnAsync('tar', args);
53
+ const result = await this.spawnAsyncFn('tar', args);
54
54
  if (result.code !== 0) {
55
55
  throw new Error(`tar command failed with code ${result.code}`);
56
56
  }
@@ -89,7 +89,7 @@ export class TarballUtility {
89
89
  }
90
90
  const verboseFlag = config.traceEnabled ? ['-v'] : [];
91
91
  const args = [...(verboseFlag), '-xzf', tarballPath, '-C', unpackDirectory, '--strip-components', mergedOptions.stripComponents.toString()];
92
- const result = await spawnAsync('tar', args);
92
+ const result = await this.spawnAsyncFn('tar', args);
93
93
  if (result.code !== 0) {
94
94
  throw new Error(`tar command failed with code ${result.code}`);
95
95
  }
@@ -106,38 +106,34 @@ export class TarballUtility {
106
106
  };
107
107
  isDirectory = (path) => {
108
108
  try {
109
- const stats = fs.statSync(path);
109
+ const stats = this.statSyncFn(path);
110
110
  return stats.isDirectory();
111
111
  }
112
112
  catch (err) {
113
+ trace('error checking idDirectory (returning false)', err);
113
114
  return false;
114
115
  }
115
116
  };
116
117
  dirIsNotEmpty = (dirPath) => {
117
118
  try {
118
- const stats = fs.statSync(dirPath);
119
+ const stats = this.statSyncFn(dirPath);
119
120
  return stats.isDirectory() && fs.readdirSync(dirPath).length > 0;
120
121
  }
121
122
  catch (err) {
122
- return false;
123
+ throw new ExtendedError('Error checking dirIsNotEmpty - see innerError', err);
123
124
  }
124
125
  };
125
126
  tryCreateDirectory = async (dirPath) => {
126
127
  try {
127
- await mkdirp(dirPath);
128
+ await this.mkdirpFn(dirPath);
128
129
  }
129
130
  catch (err) {
130
- if (err instanceof Error) {
131
- throw new Error(`Error creating unpackDirectory: ${err.message}`);
132
- }
133
- else {
134
- throw new Error(`Error creating unpackDirectory: ${err}`);
135
- }
131
+ throw new ExtendedError('Error creating unpackDirectory - see innerError', err);
136
132
  }
137
133
  };
138
134
  }
139
- const defaultUtil = new TarballUtility(whichSync);
135
+ const defaultUtil = new TarballUtility();
140
136
  export const createTarball = defaultUtil.createTarball;
141
137
  export const unpackTarball = defaultUtil.unpackTarball;
142
138
  export const unpackTarballContents = defaultUtil.unpackTarballContents;
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFyYmFsbFV0aWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVGFyYmFsbFV0aWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFBO0FBQ2xDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3pHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQWdCaEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUNqQixXQUFXLENBQWtCO0lBRXJDLFlBQVksV0FBNkI7UUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILGFBQWEsR0FBRyxLQUFLLEVBQUUsa0JBQTBCLEVBQUUsV0FBbUIsRUFBRSxPQUE4QixFQUFFLEVBQUU7UUFDeEcsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtRQUMxRCxhQUFhLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBRXpDLE1BQU0sY0FBYyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFBO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLEVBQUUsR0FBRyxjQUFjLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQTtRQUV2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4SEFBOEgsQ0FBQyxDQUFBO1NBQ2hKO1FBRUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsa0JBQWtC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
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFyYmFsbFV0aWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVGFyYmFsbFV0aWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUN4SCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUF1QmhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDakIsV0FBVyxDQUFrQjtJQUM3QixZQUFZLENBQW1CO0lBQy9CLFVBQVUsQ0FBb0I7SUFDOUIsUUFBUSxDQUFlO0lBRS9CLFlBQVksZUFBb0QsRUFBRTtRQUNoRSxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFBO1FBQ3hELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUE7UUFDM0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUE7UUFDeEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsYUFBYSxHQUFHLEtBQUssRUFBRSxrQkFBMEIsRUFBRSxXQUFtQixFQUFFLE9BQThCLEVBQUUsRUFBRTtRQUN4RyxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO1FBQzFELGFBQWEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFFekMsTUFBTSxjQUFjLEdBQUcsRUFBRSxRQUFRLEVB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