@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
@@ -1,9 +1,15 @@
1
- import { SpawnOptionsWithThrow, SpawnResult, StringKeyedDictionary } from './generalUtils.js';
1
+ import { SimpleSpawnResult, SpawnOptionsWithThrow, SpawnResult, StringKeyedDictionary, WhichResult } from './generalUtils.js';
2
2
  export declare function copyEnv(sourcePath: string, destinationPath: string, overrideExistingDestinationValues?: boolean, suppressAddKeysMessages?: boolean): Promise<void>;
3
3
  export declare function getEnvAsDictionary(envPath: string): StringKeyedDictionary;
4
4
  export declare function dictionaryToEnvFileString(dict: StringKeyedDictionary): string;
5
5
  export interface SpawnOptionsInternal extends SpawnOptionsWithThrow {
6
- isLongRunning?: boolean;
6
+ isLongRunning: boolean;
7
7
  }
8
- export declare function spawnAsyncInternal(command: string, args?: string[], options?: SpawnOptionsInternal): Promise<SpawnResult>;
8
+ export declare function spawnAsyncInternal(command: string, args: string[], options?: Partial<SpawnOptionsInternal>): Promise<SpawnResult>;
9
+ export declare function validateFindFilesRecursivelyParams(dir: string, filenamePattern: string): void;
10
+ export declare function simpleSpawnSyncInternal(command: string, args?: string[], throwOnNonZero?: boolean, useCmd?: boolean): SimpleSpawnResult;
11
+ export declare function simpleSpawnAsyncInternal(command: string, args?: string[], throwOnNonZero?: boolean, useCmd?: boolean): Promise<SimpleSpawnResult>;
12
+ type SimpleSpawnFunction = (cmd: string, args: string[]) => Promise<SimpleSpawnResult> | SimpleSpawnResult;
13
+ export declare function whichInternal(commandName: string, simpleCmd: SimpleSpawnFunction, simpleSpawn: SimpleSpawnFunction): Promise<WhichResult> | WhichResult;
14
+ export {};
9
15
  //# sourceMappingURL=generalUtilsInternal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generalUtilsInternal.d.ts","sourceRoot":"","sources":["../../src/generalUtilsInternal.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAA8G,MAAM,mBAAmB,CAAA;AAOrN,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,iCAAiC,UAAO,EAAE,uBAAuB,UAAQ,iBAuCnJ;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAUzE;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAE7E;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmG/H"}
1
+ {"version":3,"file":"generalUtilsInternal.d.ts","sourceRoot":"","sources":["../../src/generalUtilsInternal.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,iBAAiB,EAAc,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAuJ,MAAM,mBAAmB,CAAA;AAOhT,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,iCAAiC,UAAO,EAAE,uBAAuB,UAAQ,iBAuCnJ;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAUzE;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAE7E;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAqDvI;AAiHD,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,QAgBtF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,OAAc,EAAE,MAAM,GAAE,OAAe,GAAG,iBAAiB,CAmBpJ;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,GAAE,OAAc,EAAE,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBpK;AAED,KAAK,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAA;AAG1G,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAsCvJ"}
@@ -1,9 +1,9 @@
1
- import { spawn } from 'node:child_process';
1
+ import { spawn, spawnSync } from 'node:child_process';
2
2
  import fs from 'node:fs';
3
3
  import fsp from 'node:fs/promises';
4
4
  import path from 'node:path';
5
5
  import { config } from './NodeCliUtilsConfig.js';
6
- import { SpawnError, isPlatformWindows, log, requireValidPath, sortDictionaryByKeyAsc, spawnAsync, stringToNonEmptyLines, trace } from './generalUtils.js';
6
+ import { SimpleSpawnError, SpawnError, isPlatformWindows, log, requireString, requireValidPath, sortDictionaryByKeyAsc, spawnAsync, stringToNonEmptyLines, stripShellMetaCharacters, trace } from './generalUtils.js';
7
7
  const isCommonJS = typeof require === "function" && typeof module === "object" && module.exports;
8
8
  const isEsm = !isCommonJS;
9
9
  const spawnWorkaroundScriptName = 'runWhileParentAlive.js';
@@ -56,80 +56,38 @@ export function dictionaryToEnvFileString(dict) {
56
56
  return Object.entries(dict).map(kvp => `${kvp[0]}=${kvp[1]}`).join('\n') + '\n';
57
57
  }
58
58
  export async function spawnAsyncInternal(command, args, options) {
59
- const moduleDir = await getCurrentModuleDir();
59
+ const mergedOptions = setDefaultsAndMergeOptions(options);
60
+ const logPrefix = `[${command} ${args.join(' ')}] `;
61
+ // Windows has an issue where child processes are orphaned when using the shell option. This workaround will spawn
62
+ // a "middle" process using the shell option to check whether parent process is still running at intervals and if not, kill the child process tree.
63
+ const workaroundScriptPath = await getWorkaroundScriptPath(command, args, options);
64
+ if (workaroundScriptPath) {
65
+ return await spawnWithKeepaliveWorkaround(logPrefix, workaroundScriptPath, command, args, mergedOptions);
66
+ }
60
67
  return new Promise((resolve, reject) => {
61
68
  try {
62
- const defaultSpawnOptions = { stdio: 'inherit' };
63
- const argsForChildProcess = args ?? [];
64
- const logPrefix = `[${command} ${argsForChildProcess.join(' ')}] `;
65
- const mergedOptions = { ...defaultSpawnOptions, ...options };
66
- const result = {
67
- code: 1,
68
- stdout: '',
69
- stderr: '',
70
- cwd: mergedOptions.cwd?.toString() ?? process.cwd()
71
- };
72
- // Windows has an issue where child processes are orphaned when using the shell option. This workaround will spawn
73
- // a "middle" process using the shell option to check whether parent process is still running at intervals and if not, kill the child process tree.
74
- const workaroundCommand = 'node';
75
- const workaroundScriptPath = path.join(moduleDir, spawnWorkaroundScriptName);
76
- // First check if this is the request for the workaround process itself
77
- if (options?.isLongRunning && isPlatformWindows() && command !== workaroundCommand && (!argsForChildProcess[0] || !argsForChildProcess[0].endsWith(spawnWorkaroundScriptName))) {
78
- trace(`${logPrefix}Running on Windows with shell option - using middle process hack to prevent orphaned processes`);
79
- const loggingEnabledString = config.orphanProtectionLoggingEnabled.toString();
80
- const traceEnabledString = config.traceEnabled.toString();
81
- const pollingMillisString = config.orphanProtectionPollingIntervalMillis.toString();
82
- trace(`${logPrefix}Orphan protection logging enabled: ${loggingEnabledString}`);
83
- trace(`${logPrefix}Orphan protection trace enabled: ${traceEnabledString}`);
84
- trace(`${logPrefix}Orphan protection polling interval: ${pollingMillisString}ms`);
85
- if (config.orphanProtectionLoggingEnabled) {
86
- trace(`${logPrefix}Orphan protection logging path: ${config.orphanProtectionLoggingPath}`);
87
- }
88
- const workaroundArgs = [
89
- workaroundScriptPath,
90
- loggingEnabledString,
91
- traceEnabledString,
92
- pollingMillisString,
93
- command,
94
- ...(args ?? [])
95
- ];
96
- spawnAsync(workaroundCommand, workaroundArgs, { ...mergedOptions, stdio: 'inherit', shell: true })
97
- .then((workaroundResult) => {
98
- result.code = workaroundResult.code;
99
- if (options?.throwOnNonZero && result.code !== 0) {
100
- reject(getSpawnError(result.code, result, options));
101
- return;
102
- }
103
- resolve(result);
104
- }).catch((err) => {
105
- reject(err);
106
- });
107
- return;
108
- }
109
- const child = spawn(command, argsForChildProcess, mergedOptions);
69
+ const result = getInitialSpawnResult();
70
+ const child = spawn(command, args, mergedOptions);
110
71
  const childId = child.pid;
111
72
  if (childId === undefined) {
112
73
  throw new Error(`${logPrefix}ChildProcess pid is undefined - spawn failed`);
113
74
  }
114
75
  // This event will only be emitted when stdio is NOT set to 'inherit'
115
76
  child.stdout?.on('data', (data) => {
116
- process.stdout.write(data);
117
77
  result.stdout += data.toString();
118
78
  });
119
79
  // This event will only be emitted when stdio is NOT set to 'inherit'
120
80
  child.stderr?.on('data', (data) => {
121
- process.stdout.write(data);
122
81
  result.stderr += data.toString();
123
82
  });
124
83
  const listener = new SignalListener(child, logPrefix);
125
84
  child.on('exit', (code, signal) => {
126
85
  const signalMessage = signal ? ` with signal ${signal}` : '';
127
86
  trace(`${logPrefix}ChildProcess exited with code ${code}${signalMessage}`);
128
- // If long running, ctrl+c will cause null, which we don't necessarily want to consider an error
129
- result.code = (code === null && options?.isLongRunning) ? 0 : code ?? 1;
87
+ result.code = getResultCode(code, mergedOptions.isLongRunning);
130
88
  child.removeAllListeners();
131
89
  listener.detach();
132
- if (options?.throwOnNonZero && result.code !== 0) {
90
+ if (mergedOptions.throwOnNonZero && result.code !== 0) {
133
91
  reject(getSpawnError(result.code, result, mergedOptions));
134
92
  return;
135
93
  }
@@ -144,6 +102,60 @@ export async function spawnAsyncInternal(command, args, options) {
144
102
  }
145
103
  });
146
104
  }
105
+ // If long running, ctrl+c will cause a null code, which we don't necessarily want to consider an error
106
+ function getResultCode(code, isLongRunning) {
107
+ return (code === null && isLongRunning) ? 0 : code ?? 1;
108
+ }
109
+ const setDefaultsAndMergeOptions = (options) => {
110
+ const defaultSpawnOptions = { stdio: 'inherit', isLongRunning: false, throwOnNonZero: false };
111
+ return { ...defaultSpawnOptions, ...options };
112
+ };
113
+ // Return workaroundScriptPath if:
114
+ // - Long running option set to true
115
+ // - OS is Windows
116
+ // - It's not the long running workaround call itself (avoid an infinite loop)
117
+ // Otherwise return undefined
118
+ async function getWorkaroundScriptPath(command, args, options) {
119
+ const moduleDir = await getCurrentModuleDir();
120
+ let workaroundScriptPath = path.join(moduleDir, spawnWorkaroundScriptName);
121
+ // This allows use of spawnAsyncLongRunning within this project (i.e. swigfile.ts)
122
+ if (!fs.existsSync(workaroundScriptPath) && workaroundScriptPath.includes('node-cli-utils')) {
123
+ workaroundScriptPath = path.resolve('dist/esm', spawnWorkaroundScriptName);
124
+ }
125
+ if (options?.isLongRunning && isPlatformWindows() && !(command === 'node' && args && args[0]?.endsWith(spawnWorkaroundScriptName))) {
126
+ return workaroundScriptPath;
127
+ }
128
+ return undefined;
129
+ }
130
+ async function spawnWithKeepaliveWorkaround(logPrefix, workaroundScriptPath, command, args, options) {
131
+ trace(`${logPrefix}Running on Windows with shell option - using middle process hack to prevent orphaned processes`);
132
+ const loggingEnabledString = config.orphanProtectionLoggingEnabled.toString();
133
+ const traceEnabledString = config.traceEnabled.toString();
134
+ const pollingMillisString = config.orphanProtectionPollingIntervalMillis.toString();
135
+ trace(`${logPrefix}Orphan protection logging enabled: ${loggingEnabledString}`);
136
+ trace(`${logPrefix}Orphan protection trace enabled: ${traceEnabledString}`);
137
+ trace(`${logPrefix}Orphan protection polling interval: ${pollingMillisString}ms`);
138
+ if (config.orphanProtectionLoggingEnabled) {
139
+ trace(`${logPrefix}Orphan protection logging path: ${config.orphanProtectionLoggingPath}`);
140
+ }
141
+ const workaroundArgs = [
142
+ workaroundScriptPath,
143
+ loggingEnabledString,
144
+ traceEnabledString,
145
+ pollingMillisString,
146
+ command,
147
+ ...(args ?? [])
148
+ ];
149
+ return await spawnAsync('node', workaroundArgs, { ...options, stdio: 'inherit', shell: true });
150
+ }
151
+ function getInitialSpawnResult(options) {
152
+ return {
153
+ code: 1,
154
+ stdout: '',
155
+ stderr: '',
156
+ cwd: options?.cwd?.toString() ?? process.cwd()
157
+ };
158
+ }
147
159
  function getSpawnError(code, result, options) {
148
160
  const additional = options.throwOnNonZero && options.stdio === 'inherit' ? `. See above for more details (stdio is 'inherit').` : '';
149
161
  return new SpawnError(`Spawning child process failed with code ${code}${additional}`, result);
@@ -182,4 +194,86 @@ async function getCurrentModuleDir() {
182
194
  }
183
195
  return __dirname;
184
196
  }
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbFV0aWxzSW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhbFV0aWxzSW50ZXJuYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4QixLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUE2RCxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRXJOLE1BQU0sVUFBVSxHQUFHLE9BQU8sT0FBTyxLQUFLLFVBQVUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQTtBQUNoRyxNQUFNLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQTtBQUN6QixNQUFNLHlCQUF5QixHQUFHLHdCQUF3QixDQUFBO0FBQzFELE1BQU0sZ0JBQWdCLEdBQVcsRUFBRSxDQUFBLENBQUMscUNBQXFDO0FBRXpFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLFVBQWtCLEVBQUUsZUFBdUIsRUFBRSxpQ0FBaUMsR0FBRyxJQUFJLEVBQUUsdUJBQXVCLEdBQUcsS0FBSztJQUNsSixnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFFMUMsc0VBQXNFO0lBQ3RFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ25DLEdBQUcsQ0FBQyxZQUFZLGVBQWUsU0FBUyxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FB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
197
+ export function validateFindFilesRecursivelyParams(dir, filenamePattern) {
198
+ requireValidPath('dir', dir);
199
+ requireString('pattern', filenamePattern);
200
+ if (filenamePattern.length > 50) {
201
+ throw new Error(`filenamePattern param must have fewer than 50 characters`);
202
+ }
203
+ const numWildcards = filenamePattern.replace(/\*+/g, '*').split('*').length - 1;
204
+ if (numWildcards > 5) {
205
+ throw new Error(`filenamePattern param must contain 5 or fewer wildcards`);
206
+ }
207
+ if (filenamePattern.includes('/') || filenamePattern.includes('\\')) {
208
+ throw new Error('filenamePattern param must not contain slashes');
209
+ }
210
+ }
211
+ export function simpleSpawnSyncInternal(command, args, throwOnNonZero = true, useCmd = false) {
212
+ requireString('command', command);
213
+ const result = spawnSync(command, args ?? [], { encoding: 'utf-8', shell: useCmd ? 'cmd.exe' : false });
214
+ const spawnResult = {
215
+ code: result.status ?? 1,
216
+ stdout: result.stdout.toString(),
217
+ stderr: result.stdout.toString(),
218
+ stdoutLines: stringToNonEmptyLines(result.stdout.toString()),
219
+ error: result.error,
220
+ cwd: process.cwd()
221
+ };
222
+ if (spawnResult.code !== 0 && throwOnNonZero) {
223
+ throw new SimpleSpawnError(`spawned process failed with code ${spawnResult.code}`, spawnResult);
224
+ }
225
+ return spawnResult;
226
+ }
227
+ export async function simpleSpawnAsyncInternal(command, args, throwOnNonZero = true, useCmd = false) {
228
+ requireString('command', command);
229
+ const result = await spawnAsync(command, args, { stdio: 'pipe', shell: useCmd ? 'cmd.exe' : false });
230
+ const spawnResult = {
231
+ code: result.code,
232
+ stdout: result.stdout,
233
+ stderr: result.stdout,
234
+ stdoutLines: stringToNonEmptyLines(result.stdout),
235
+ error: result.error,
236
+ cwd: process.cwd()
237
+ };
238
+ if (spawnResult.code !== 0 && throwOnNonZero) {
239
+ throw new SimpleSpawnError(`spawned process failed with code ${spawnResult.code}`, spawnResult);
240
+ }
241
+ return spawnResult;
242
+ }
243
+ // Spawn functions passed here so they can be mocked in tests
244
+ export function whichInternal(commandName, simpleCmd, simpleSpawn) {
245
+ requireString('commandName', commandName);
246
+ if (stripShellMetaCharacters(commandName) !== commandName) {
247
+ throw new Error(`commandName cannot contain shell meta characters: ${commandName}`);
248
+ }
249
+ const execFunc = isPlatformWindows() ? simpleCmd : simpleSpawn;
250
+ const cmd = isPlatformWindows() ? 'where' : 'which';
251
+ const args = isPlatformWindows() ? [commandName] : ['-a', commandName];
252
+ try {
253
+ const result = execFunc(cmd, args);
254
+ if (result instanceof Promise) {
255
+ return result.then(parsedResult => ({
256
+ location: parsedResult.stdoutLines[0],
257
+ additionalLocations: parsedResult.stdoutLines.slice(1),
258
+ error: parsedResult.error
259
+ })).catch(err => ({
260
+ location: undefined,
261
+ additionalLocations: undefined,
262
+ error: err
263
+ }));
264
+ }
265
+ return {
266
+ location: result.stdoutLines[0],
267
+ additionalLocations: result.stdoutLines.slice(1),
268
+ error: result.error
269
+ };
270
+ }
271
+ catch (err) {
272
+ return {
273
+ location: undefined,
274
+ additionalLocations: undefined,
275
+ error: err
276
+ };
277
+ }
278
+ }
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbFV0aWxzSW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhbFV0aWxzSW50ZXJuYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbkUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFBO0FBQ2xDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFxQixVQUFVLEVBQTBFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWhULE1BQU0sVUFBVSxHQUFHLE9BQU8sT0FBTyxLQUFLLFVBQVUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQTtBQUNoRyxNQUFNLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQTtBQUN6QixNQUFNLHlCQUF5QixHQUFHLHdCQUF3QixDQUFBO0FBQzFELE1BQU0sZ0JBQWdCLEdBQVcsRUFBRSxDQUFBLENBQUMscUNBQXFDO0FBRXpFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLFVBQWtCLEVBQUUsZUFBdUIsRUFBRSxpQ0FBaUMsR0FBRyxJQUFJLEVBQUUsdUJBQXVCLEdBQUcsS0FBSztJQUNsSixnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFFMUMsc0VBQXNFO0lBQ3RFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ25DLEdB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
@@ -0,0 +1,18 @@
1
+ export declare function ensureHostsEntry(url: string, ipV4Address?: string): Promise<void>;
2
+ export declare function removeHostsEntry(url: string, ipV4Address?: string): Promise<void>;
3
+ export declare function getHostsPath(): string;
4
+ export declare function getHostsFileString(): Promise<string>;
5
+ export declare function hostsFileHasEntry(hostname: string, ipV4Address?: string): Promise<boolean>;
6
+ export declare function hostsFileStringHasEntry(hostsFileString: string, entry: string): boolean;
7
+ export declare function changeHostsFile(hostname: string, ipV4Address: string, operation: 'add' | 'remove'): Promise<void>;
8
+ export declare function isIpV4Address(address: string): boolean;
9
+ /**
10
+ * The `initialString` will have line endings normalized to use os.EOL and lines with `omitLine` will be removed.
11
+ * Comparisons for which lines should be removed are normalizing whitespace (multiple spaces collapsed into single
12
+ * spaces for the comparison). This is useful to remove instances of a hosts entry, for example.
13
+ * @param initialString The string to normalize remove instances of omitLine from
14
+ * @param omitLine All instance of this string will be omitted from the result
15
+ * @returns A string that has instances of the omitLine removed and all line endings changed to match the os.EOL
16
+ */
17
+ export declare function getEolNormalizedWithoutLine(initialString: string, omitLine: string): string;
18
+ //# sourceMappingURL=hostFileUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostFileUtils.d.ts","sourceRoot":"","sources":["../../src/hostFileUtils.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,MAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpG;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,MAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpG;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,MAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7G;AAGD,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAKvF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvH;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQtD;AAGD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM3F"}
@@ -0,0 +1,85 @@
1
+ import fsp from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import { getHostname, hasWhitespace, isPlatformWindows, log, requireString, stringToNonEmptyLines } from './generalUtils.js';
4
+ export async function ensureHostsEntry(url, ipV4Address = '127.0.0.1') {
5
+ const hostname = getHostname(url);
6
+ await changeHostsFile(hostname, ipV4Address, 'add');
7
+ }
8
+ export async function removeHostsEntry(url, ipV4Address = '127.0.0.1') {
9
+ const hostname = getHostname(url);
10
+ await changeHostsFile(hostname, ipV4Address, 'remove');
11
+ }
12
+ export function getHostsPath() {
13
+ return isPlatformWindows() ? 'C:/Windows/System32/drivers/etc/hosts' : '/etc/hosts';
14
+ }
15
+ export async function getHostsFileString() {
16
+ return await fsp.readFile(getHostsPath(), { encoding: 'utf-8' });
17
+ }
18
+ export async function hostsFileHasEntry(hostname, ipV4Address = '127.0.0.1') {
19
+ const entry = `${ipV4Address} ${hostname}`;
20
+ const hostsFileString = await getHostsFileString();
21
+ return hostsFileStringHasEntry(hostsFileString, entry);
22
+ }
23
+ // Check by normalizing whitespace (collapse consecutive spaces to single spaces) in entry and on each line checked
24
+ export function hostsFileStringHasEntry(hostsFileString, entry) {
25
+ const normalizedEntry = entry.replace(/\s+/g, ' ');
26
+ const hostsLines = stringToNonEmptyLines(hostsFileString).map(l => l.replace(/\s+/g, ' ')).filter(l => !l.startsWith('#'));
27
+ const hasLine = hostsLines.includes(normalizedEntry);
28
+ return hasLine;
29
+ }
30
+ export async function changeHostsFile(hostname, ipV4Address, operation) {
31
+ requireString('hostname', hostname);
32
+ if (hasWhitespace(hostname)) {
33
+ throw new Error(`Invalid hostname: ${hostname}`);
34
+ }
35
+ if (!isIpV4Address(ipV4Address)) {
36
+ throw new Error(`Invalid ipV4Address: ${ipV4Address}`);
37
+ }
38
+ const isAddition = operation === 'add';
39
+ const isRemoval = operation === 'remove';
40
+ const hostsPath = getHostsPath();
41
+ const entry = `${ipV4Address} ${hostname}`;
42
+ log(`checking hosts file: ${hostsPath} for entry ${entry}`);
43
+ const hostsFileString = await getHostsFileString();
44
+ const hasLine = hostsFileStringHasEntry(hostsFileString, entry);
45
+ if (isAddition && hasLine) {
46
+ log(`there is an existing entry in the hosts file (${entry}), skipping`);
47
+ return;
48
+ }
49
+ if (isRemoval && !hasLine) {
50
+ log(`there is no hosts entry to remove (${entry}), skipping`);
51
+ }
52
+ if (isAddition && !hasLine) {
53
+ log('existing entry not found - appending entry to the hosts file');
54
+ await fsp.appendFile(hostsPath, `\n${entry}`);
55
+ }
56
+ if (isRemoval && hasLine) {
57
+ log(`existing entry found - removing entry`);
58
+ const hostsWithoutEntry = getEolNormalizedWithoutLine(hostsFileString, entry);
59
+ await fsp.writeFile(hostsPath, hostsWithoutEntry);
60
+ }
61
+ }
62
+ export function isIpV4Address(address) {
63
+ const ipV4AddressRegex = /^(\d{1,3}\.){3}\d{1,3}$/;
64
+ if (!ipV4AddressRegex.test(address)) {
65
+ return false;
66
+ }
67
+ const octets = address.split('.').map(Number);
68
+ return octets.every(octet => octet >= 0 && octet <= 255);
69
+ }
70
+ /**
71
+ * The `initialString` will have line endings normalized to use os.EOL and lines with `omitLine` will be removed.
72
+ * Comparisons for which lines should be removed are normalizing whitespace (multiple spaces collapsed into single
73
+ * spaces for the comparison). This is useful to remove instances of a hosts entry, for example.
74
+ * @param initialString The string to normalize remove instances of omitLine from
75
+ * @param omitLine All instance of this string will be omitted from the result
76
+ * @returns A string that has instances of the omitLine removed and all line endings changed to match the os.EOL
77
+ */
78
+ export function getEolNormalizedWithoutLine(initialString, omitLine) {
79
+ const normalizedOmitLine = omitLine.replace(/\s+/g, ' ');
80
+ const lines = initialString.split('\n')
81
+ .map(l => l.replace(/\r/g, ''))
82
+ .filter(l => l.replace(/\s+/g, ' ') !== normalizedOmitLine);
83
+ return lines.join(os.EOL);
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdEZpbGVVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob3N0RmlsZVV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFBO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFNUgsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsY0FBc0IsV0FBVztJQUNuRixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDakMsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsY0FBc0IsV0FBVztJQUNuRixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDakMsTUFBTSxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVk7SUFDMUIsT0FBTyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFBO0FBQ3JGLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQjtJQUN0QyxPQUFPLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQ2xFLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsY0FBc0IsV0FBVztJQUN6RixNQUFNLEtBQUssR0FBRyxHQUFHLFdBQVcsSUFBSSxRQUFRLEVBQUUsQ0FBQTtJQUMxQyxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUE7SUFDbEQsT0FBTyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDeEQsQ0FBQztBQUVELG1IQUFtSDtBQUNuSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsZUFBdUIsRUFBRSxLQUFhO0lBQzVFLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ2xELE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDMUgsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNwRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsUUFBZ0IsRUFBRSxXQUFtQixFQUFFLFNBQTJCO0lBQ3RHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbkMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUNqRDtJQUNELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsV0FBVyxFQUFFLENBQUMsQ0FBQTtLQUN2RDtJQUNELE1BQU0sVUFBVSxHQUFHLFNBQVMsS0FBSyxLQUFLLENBQUE7SUFDdEMsTUFBTSxTQUFTLEdBQUcsU0FBUyxLQUFLLFFBQVEsQ0FBQTtJQUN4QyxNQUFNLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQTtJQUNoQyxNQUFNLEtBQUssR0FBRyxHQUFHLFdBQVcsSUFBSSxRQUFRLEVBQUUsQ0FBQTtJQUUxQyxHQUFHLENBQUMsd0JBQXdCLFNBQVMsY0FBYyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQzNELE1BQU0sZUFBZSxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQTtJQUNsRCxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFFL0QsSUFBSSxVQUFVLElBQUksT0FBTyxFQUFFO1FBQ3pCLEdBQUcsQ0FBQyxpREFBaUQsS0FBSyxhQUFhLENBQUMsQ0FBQTtRQUN4RSxPQUFNO0tBQ1A7SUFDRCxJQUFJLFNBQVMsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUN6QixHQUFHLENBQUMsc0NBQXNDLEtBQUssYUFBYSxDQUFDLENBQUE7S0FDOUQ7SUFDRCxJQUFJLFVBQVUsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUMxQixHQUFHLENBQUMsOERBQThELENBQUMsQ0FBQTtRQUNuRSxNQUFNLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQTtLQUM5QztJQUNELElBQUksU0FBUyxJQUFJLE9BQU8sRUFBRTtRQUN4QixHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtRQUM1QyxNQUFNLGlCQUFpQixHQUFHLDJCQUEyQixDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM3RSxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUE7S0FDbEQ7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFlO0lBQzNDLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUE7SUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNuQyxPQUFPLEtBQUssQ0FBQTtLQUNiO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUE7QUFDMUQsQ0FBQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsYUFBcUIsRUFBRSxRQUFnQjtJQUNqRixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1NBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLGtCQUFrQixDQUFDLENBQUE7SUFDN0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUMzQixDQUFDIn0=
@@ -1,4 +1,5 @@
1
1
  export * from './generalUtils.js';
2
2
  export { config } from './NodeCliUtilsConfig.js';
3
3
  export { createTarball, unpackTarball, unpackTarballContents } from './TarballUtility.js';
4
+ export * from './hostFileUtils.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AACzF,cAAc,oBAAoB,CAAA"}
package/dist/esm/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './generalUtils.js';
2
2
  export { config } from './NodeCliUtilsConfig.js';
3
3
  export { createTarball, unpackTarball, unpackTarballContents } from './TarballUtility.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQSJ9
4
+ export * from './hostFileUtils.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RixjQUFjLG9CQUFvQixDQUFBIn0=
@@ -1,6 +1,6 @@
1
1
  // runWhileParentAlive.ts
2
2
  // Also referred to as "orphan protection" or "long running windows process workaround script"
3
- import { spawn, execSync, spawnSync } from 'node:child_process';
3
+ import { spawn, spawnSync } from 'node:child_process';
4
4
  import fs from 'node:fs';
5
5
  import { config } from './NodeCliUtilsConfig.js';
6
6
  const DEV_LOGGING = false; // Set to true while developing this script to see more logging in the console
@@ -21,7 +21,7 @@ export function trace(message, ...optionalParams) {
21
21
  console.log(prefix, message, ...optionalParams);
22
22
  }
23
23
  function logToFile(message) {
24
- fs.appendFileSync(config.orphanProtectionLoggingPath, `${getLogPrefix()}${message}` + ((message && message.length && message[message.length - 1] !== '\n') ? '\n' : ''));
24
+ fs.appendFileSync(config.orphanProtectionLoggingPath, `${getLogPrefix()}${message}` + !message?.endsWith('\n') ? '\n' : '');
25
25
  }
26
26
  function traceAndLog(message, isDevTrace = false) {
27
27
  if (isDevTrace && !DEV_LOGGING) {
@@ -41,7 +41,7 @@ function traceAndLog(message, isDevTrace = false) {
41
41
  }
42
42
  function isParentProcessAlive(parentId) {
43
43
  try {
44
- const result = spawnSync('tasklist', { shell: true });
44
+ const result = spawnSync('C:\\Windows\\system32\\tasklist.exe');
45
45
  const resultToLog = {
46
46
  status: result.status,
47
47
  stderr: result.stderr?.toString(),
@@ -64,7 +64,7 @@ function isParentProcessAlive(parentId) {
64
64
  }
65
65
  function killTree(pid) {
66
66
  try {
67
- execSync(`taskkill /pid ${pid} /T /F`);
67
+ spawnSync(`C:\\Windows\\system32\\taskkill.exe /pid ${pid} /T /F`);
68
68
  traceAndLog(`No errors running killTree`);
69
69
  }
70
70
  catch (err) {
@@ -100,7 +100,7 @@ try {
100
100
  process.exit(1);
101
101
  }
102
102
  const [command, ...args] = passthroughArgs;
103
- const child = spawn(command, args, { stdio: 'inherit', shell: true });
103
+ const child = spawn(command, args, { stdio: 'inherit', shell: 'cmd.exe' });
104
104
  const childId = child.pid;
105
105
  if (!childId) {
106
106
  const noChildIdMessage = 'spawning ChildProcess failed - no pid on returned handle';
@@ -116,10 +116,8 @@ try {
116
116
  traceAndLog('Used taskkill and cleared interval - exiting...');
117
117
  process.exit(0);
118
118
  }
119
- else {
120
- if (DEV_LOGGING) {
121
- traceAndLog('Parent is alive, keep running.');
122
- }
119
+ if (DEV_LOGGING) {
120
+ traceAndLog('Parent is alive, keep running.');
123
121
  }
124
122
  }, pollingMillis);
125
123
  child.on('exit', (code, signal) => {
@@ -150,4 +148,4 @@ catch (err) {
150
148
  logToFile(msg);
151
149
  process.exit(1);
152
150
  }
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuV2hpbGVQYXJlbnRBbGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5XaGlsZVBhcmVudEFsaXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QjtBQUN6Qiw4RkFBOEY7QUFDOUYsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDL0QsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUVoRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUEsQ0FBQyw4RUFBOEU7QUFDeEcsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFBLENBQUMscUZBQXFGO0FBQy9HLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQSxDQUFDLHFGQUFxRjtBQUM3RyxJQUFJLGFBQWEsR0FBVyxNQUFNLENBQUMscUNBQXFDLENBQUEsQ0FBQyxvRUFBb0U7QUFFN0ksU0FBUyxZQUFZO0lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7SUFDdEIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDeEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDNUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDNUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVB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
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuV2hpbGVQYXJlbnRBbGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5XaGlsZVBhcmVudEFsaXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QjtBQUN6Qiw4RkFBOEY7QUFDOUYsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRWhELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQSxDQUFDLDhFQUE4RTtBQUN4RyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUEsQ0FBQyxxRkFBcUY7QUFDL0csSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFBLENBQUMscUZBQXFGO0FBQzdHLElBQUksYUFBYSxHQUFXLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQSxDQUFDLG9FQUFvRTtBQUU3SSxTQUFTLFlBQVk7SUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUN0QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM1RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM1RCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENB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
@@ -0,0 +1,11 @@
1
+ export declare const tempDir = "./test/temp";
2
+ export declare const fixturesDir = "./test/fixtures";
3
+ export declare const only: {
4
+ only: boolean;
5
+ };
6
+ export declare const ensureEmptyTempDir: (dir: string) => Promise<void>;
7
+ export declare function fileExistsAndIsNonZero(filePath: string): boolean;
8
+ export declare function assertErrorMessageStartsWith(err: unknown, expectedStartsWith: string): boolean;
9
+ export declare function assertErrorMessageIncludes(err: unknown, expectedIncludes: string): boolean;
10
+ export declare function assertErrorMessageEquals(err: unknown, expected: string): boolean;
11
+ //# sourceMappingURL=testUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/testUtils.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,gBAAgB,CAAA;AACpC,eAAO,MAAM,WAAW,oBAAoB,CAAA;AAC5C,eAAO,MAAM,IAAI;;CAAiB,CAAA;AAElC,eAAO,MAAM,kBAAkB,QAAe,MAAM,kBAWnD,CAAA;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWhE;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAIpF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAIhF;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAItE"}