@mikeyt23/node-cli-utils 2.0.0-beta.1 → 2.0.0-beta.2
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/dist/cjs/GitUtility.d.ts +7 -0
- package/dist/cjs/GitUtility.d.ts.map +1 -0
- package/dist/cjs/GitUtility.js +49 -0
- package/dist/cjs/TarballUtility.d.ts +17 -7
- package/dist/cjs/TarballUtility.d.ts.map +1 -1
- package/dist/cjs/TarballUtility.js +18 -24
- package/dist/cjs/certUtils.d.ts +53 -17
- package/dist/cjs/certUtils.d.ts.map +1 -1
- package/dist/cjs/certUtils.js +175 -111
- package/dist/cjs/dbMigrationUtils.js +44 -54
- package/dist/cjs/dotnetUtils.d.ts.map +1 -1
- package/dist/cjs/dotnetUtils.js +4 -2
- package/dist/cjs/esmSpecific.d.mts +5 -0
- package/dist/cjs/esmSpecific.d.mts.map +1 -1
- package/dist/cjs/esmSpecific.mjs +6 -1
- package/dist/cjs/generalUtils.d.ts +268 -26
- package/dist/cjs/generalUtils.d.ts.map +1 -1
- package/dist/cjs/generalUtils.js +522 -106
- package/dist/cjs/generalUtilsInternal.d.ts +9 -3
- package/dist/cjs/generalUtilsInternal.d.ts.map +1 -1
- package/dist/cjs/generalUtilsInternal.js +159 -59
- package/dist/cjs/hostsUtils.d.ts +16 -0
- package/dist/cjs/hostsUtils.d.ts.map +1 -0
- package/dist/cjs/hostsUtils.js +82 -0
- package/dist/cjs/runWhileParentAlive.js +7 -9
- package/dist/esm/GitUtility.d.ts +7 -0
- package/dist/esm/GitUtility.d.ts.map +1 -0
- package/dist/esm/GitUtility.js +43 -0
- package/dist/esm/TarballUtility.d.ts +17 -7
- package/dist/esm/TarballUtility.d.ts.map +1 -1
- package/dist/esm/TarballUtility.js +21 -25
- package/dist/esm/certUtils.d.ts +53 -17
- package/dist/esm/certUtils.d.ts.map +1 -1
- package/dist/esm/certUtils.js +172 -86
- package/dist/esm/dbMigrationUtils.js +45 -55
- package/dist/esm/dotnetUtils.d.ts.map +1 -1
- package/dist/esm/dotnetUtils.js +4 -2
- package/dist/esm/esmSpecific.d.mts +5 -0
- package/dist/esm/esmSpecific.d.mts.map +1 -1
- package/dist/esm/esmSpecific.mjs +6 -1
- package/dist/esm/generalUtils.d.ts +268 -26
- package/dist/esm/generalUtils.d.ts.map +1 -1
- package/dist/esm/generalUtils.js +490 -105
- package/dist/esm/generalUtilsInternal.d.ts +9 -3
- package/dist/esm/generalUtilsInternal.d.ts.map +1 -1
- package/dist/esm/generalUtilsInternal.js +150 -57
- package/dist/esm/hostsUtils.d.ts +16 -0
- package/dist/esm/hostsUtils.d.ts.map +1 -0
- package/dist/esm/hostsUtils.js +69 -0
- package/dist/esm/runWhileParentAlive.js +8 -10
- package/package.json +4 -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
|
|
6
|
+
isLongRunning: boolean;
|
|
7
7
|
}
|
|
8
|
-
export declare function spawnAsyncInternal(command: string, args
|
|
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,
|
|
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;AAE1G,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
|
|
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
|
|
63
|
-
const
|
|
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
|
-
|
|
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 (
|
|
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,85 @@ 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
|
+
export function whichInternal(commandName, simpleCmd, simpleSpawn) {
|
|
244
|
+
requireString('commandName', commandName);
|
|
245
|
+
if (stripShellMetaCharacters(commandName) !== commandName) {
|
|
246
|
+
throw new Error(`commandName cannot contain shell meta characters: ${commandName}`);
|
|
247
|
+
}
|
|
248
|
+
const execFunc = isPlatformWindows() ? simpleCmd : simpleSpawn;
|
|
249
|
+
const cmd = isPlatformWindows() ? 'where' : 'which';
|
|
250
|
+
const args = isPlatformWindows() ? [commandName] : ['-a', commandName];
|
|
251
|
+
try {
|
|
252
|
+
const result = execFunc(cmd, args);
|
|
253
|
+
if (result instanceof Promise) {
|
|
254
|
+
return result.then(parsedResult => ({
|
|
255
|
+
location: parsedResult.stdoutLines[0],
|
|
256
|
+
additionalLocations: parsedResult.stdoutLines.slice(1),
|
|
257
|
+
error: parsedResult.error
|
|
258
|
+
})).catch(err => ({
|
|
259
|
+
location: undefined,
|
|
260
|
+
additionalLocations: undefined,
|
|
261
|
+
error: err
|
|
262
|
+
}));
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
location: result.stdoutLines[0],
|
|
266
|
+
additionalLocations: result.stdoutLines.slice(1),
|
|
267
|
+
error: result.error
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
return {
|
|
272
|
+
location: undefined,
|
|
273
|
+
additionalLocations: undefined,
|
|
274
|
+
error: err
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbFV0aWxzSW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhbFV0aWxzSW50ZXJuYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbkUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFBO0FBQ2xDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFxQixVQUFVLEVBQTBFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWhULE1BQU0sVUFBVSxHQUFHLE9BQU8sT0FBTyxLQUFLLFVBQVUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQTtBQUNoRyxNQUFNLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQTtBQUN6QixNQUFNLHlCQUF5QixHQUFHLHdCQUF3QixDQUFBO0FBQzFELE1BQU0sZ0JBQWdCLEdBQVcsRUFBRSxDQUFBLENBQUMscUNBQXFDO0FBRXpFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLFVBQWtCLEVBQUUsZUFBdUIsRUFBRSxpQ0FBaUMsR0FBRyxJQUFJLEVBQUUsdUJBQXVCLEdBQUcsS0FBSztJQUNsSixnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFFMUMsc0VBQXNFO0lBQ3RFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ25DLEdB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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function ensureHostsEntry(url: string): Promise<void>;
|
|
2
|
+
export declare function removeHostsEntry(url: string): Promise<void>;
|
|
3
|
+
export declare function getHostsPath(): string;
|
|
4
|
+
export declare function getHostsFileString(): Promise<string>;
|
|
5
|
+
export declare function hostsFileStringHasEntry(hostsFileString: string, entry: string): boolean;
|
|
6
|
+
export declare function changeHostsFile(hostname: string, operation: 'add' | 'remove'): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* The `initialString` will have line endings normalized to use os.EOL and lines with `omitLine` will be removed.
|
|
9
|
+
* Comparisons for which lines should be removed are normalizing whitespace (multiple spaces collapsed into single
|
|
10
|
+
* spaces for the comparison). This is useful to remove instances of a hosts entry, for example.
|
|
11
|
+
* @param initialString The string to normalize remove instances of omitLine from
|
|
12
|
+
* @param omitLine All instance of this string will be omitted from the result
|
|
13
|
+
* @returns A string that has instances of the omitLine removed and all line endings changed to match the os.EOL
|
|
14
|
+
*/
|
|
15
|
+
export declare function getEolNormalizedWithoutLine(initialString: string, omitLine: string): string;
|
|
16
|
+
//# sourceMappingURL=hostsUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostsUtils.d.ts","sourceRoot":"","sources":["../../src/hostsUtils.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAGD,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAKvF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BlG;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM3F"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fsp from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { getHostname, isPlatformWindows, log, requireString, stringToNonEmptyLines } from './generalUtils.js';
|
|
4
|
+
export async function ensureHostsEntry(url) {
|
|
5
|
+
const hostname = getHostname(url);
|
|
6
|
+
await changeHostsFile(hostname, 'add');
|
|
7
|
+
}
|
|
8
|
+
export async function removeHostsEntry(url) {
|
|
9
|
+
const hostname = getHostname(url);
|
|
10
|
+
await changeHostsFile(hostname, '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
|
+
// Check by normalizing whitespace (collapse consecutive spaces to single spaces) in entry and on each line checked
|
|
19
|
+
export function hostsFileStringHasEntry(hostsFileString, entry) {
|
|
20
|
+
const normalizedEntry = entry.replace(/\s+/g, ' ');
|
|
21
|
+
const hostsLines = stringToNonEmptyLines(hostsFileString).map(l => l.replace(/\s+/g, ' ')).filter(l => !l.startsWith('#'));
|
|
22
|
+
const hasLine = hostsLines.includes(normalizedEntry);
|
|
23
|
+
return hasLine;
|
|
24
|
+
}
|
|
25
|
+
export async function changeHostsFile(hostname, operation) {
|
|
26
|
+
requireString('hostname', hostname);
|
|
27
|
+
const isAddition = operation === 'add';
|
|
28
|
+
const isRemoval = operation === 'remove';
|
|
29
|
+
const hostsPath = getHostsPath();
|
|
30
|
+
const entry = getNewHostsEntryString(hostname);
|
|
31
|
+
log(`checking hosts file: ${hostsPath} for entry ${entry}`);
|
|
32
|
+
const hostsFileString = await getHostsFileString();
|
|
33
|
+
const hasLine = hostsFileStringHasEntry(hostsFileString, entry);
|
|
34
|
+
if (isAddition && hasLine) {
|
|
35
|
+
log(`there is an existing entry in the hosts file (${entry}), skipping`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (isRemoval && !hasLine) {
|
|
39
|
+
log(`there is no hosts entry to remove (${entry}), skipping`);
|
|
40
|
+
}
|
|
41
|
+
if (isAddition && !hasLine) {
|
|
42
|
+
log('existing entry not found - appending entry to the hosts file');
|
|
43
|
+
await fsp.appendFile(hostsPath, `\n${entry}`);
|
|
44
|
+
}
|
|
45
|
+
if (isRemoval && hasLine) {
|
|
46
|
+
log(`existing entry found - removing entry`);
|
|
47
|
+
const hostsWithoutEntry = getEolNormalizedWithoutLine(hostsFileString, entry);
|
|
48
|
+
await fsp.writeFile(hostsPath, hostsWithoutEntry);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The `initialString` will have line endings normalized to use os.EOL and lines with `omitLine` will be removed.
|
|
53
|
+
* Comparisons for which lines should be removed are normalizing whitespace (multiple spaces collapsed into single
|
|
54
|
+
* spaces for the comparison). This is useful to remove instances of a hosts entry, for example.
|
|
55
|
+
* @param initialString The string to normalize remove instances of omitLine from
|
|
56
|
+
* @param omitLine All instance of this string will be omitted from the result
|
|
57
|
+
* @returns A string that has instances of the omitLine removed and all line endings changed to match the os.EOL
|
|
58
|
+
*/
|
|
59
|
+
export function getEolNormalizedWithoutLine(initialString, omitLine) {
|
|
60
|
+
const normalizedOmitLine = omitLine.replace(/\s+/g, ' ');
|
|
61
|
+
const lines = initialString.split('\n')
|
|
62
|
+
.map(l => l.replace(/\r/g, ''))
|
|
63
|
+
.filter(l => l.replace(/\s+/g, ' ') !== normalizedOmitLine);
|
|
64
|
+
return lines.join(os.EOL);
|
|
65
|
+
}
|
|
66
|
+
function getNewHostsEntryString(hostname) {
|
|
67
|
+
return `127.0.0.1 ${hostname}`;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdHNVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob3N0c1V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFBO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUU3RyxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEdBQVc7SUFDaEQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUN4QyxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXO0lBQ2hELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNqQyxNQUFNLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZO0lBQzFCLE9BQU8saUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQTtBQUNyRixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0I7SUFDdEMsT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtBQUNsRSxDQUFDO0FBRUQsbUhBQW1IO0FBQ25ILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxlQUF1QixFQUFFLEtBQWE7SUFDNUUsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFD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
|
|
@@ -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,
|
|
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}` + (
|
|
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'
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
120
|
-
|
|
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,
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuV2hpbGVQYXJlbnRBbGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5XaGlsZVBhcmVudEFsaXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QjtBQUN6Qiw4RkFBOEY7QUFDOUYsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRWhELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQSxDQUFDLDhFQUE4RTtBQUN4RyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUEsQ0FBQyxxRkFBcUY7QUFDL0csSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFBLENBQUMscUZBQXFGO0FBQzdHLElBQUksYUFBYSxHQUFXLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQSxDQUFDLG9FQUFvRTtBQUU3SSxTQUFTLFlBQVk7SUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUN0QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM1RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM1RCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN0RSxPQUFPLElBQUksS0FBSyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksWUFBWSxJQUFJLENBQUE7QUFDNUQsQ0FBQztBQUVELGlIQUFpSDtBQUNqSCxNQUFNLFVBQVUsS0FBSyxDQUFDLE9BQWlCLEVBQUUsR0FBRyxjQUF5QjtJQUNuRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUE7SUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUE7QUFDakQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLE9BQWU7SUFDaEMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7QUFFN0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQWUsRUFBRSxVQUFVLEdBQUcsS0FBSztJQUN0RCxJQUFJLFVBQVUsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUM5QixPQUFNO0tBQ1A7SUFDRCxJQUFJLFVBQVUsSUFBSSxXQUFXLEVBQUU7UUFDN0IsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFBO1FBQy9CLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNsQixPQUFNO0tBQ1A7SUFDRCxJQUFJLFlBQVksRUFBRTtRQUNoQixLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUE7S0FDaEM7SUFDRCxJQUFJLGNBQWMsRUFBRTtRQUNsQixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDbkI7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQjtJQUM1QyxJQUFJO1FBQ0YsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7UUFDL0QsTUFBTSxXQUFXLEdBQUc7WUFDbEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRTtZQUNqQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxLQUFLO1NBQ3pGLENBQUE7UUFDRCxXQUFXLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNwRSxPQUFPLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQTtLQUMxQztJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osSUFBSSxHQUFHLFlBQVksS0FBSyxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ3ZCO2FBQU07WUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQ25CO1FBQ0QsV0FBVyxDQUFDLCtGQUErRixHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDekosT0FBTyxLQUFLLENBQUE7S0FDYjtBQUNILENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUFXO0lBQzNCLElBQUk7UUFDRixTQUFTLENBQUMsNENBQTRDLEdBQUcsUUFBUSxDQUFDLENBQUE7UUFDbEUsV0FBVyxDQUFDLDRCQUE0QixDQUFDLENBQUE7S0FDMUM7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLFdBQVcsQ0FBQyxtQ0FBbUMsR0FBRyxLQUFLLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtLQUN0RztBQUNILENBQUM7QUFFRCxJQUFJO0lBQ0YsY0FBYyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFBO0lBQzNDLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQTtJQUN6QyxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksYUFBYSxHQUFHLENBQUMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDckYsYUFBYSxHQUFHLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQTtLQUM3RDtJQUNELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTdDLElBQUksY0FBYyxFQUFFO1FBQ2xCLFdBQVcsQ0FBQyw2Q0FBNkMsYUFBYSxJQUFJLENBQUMsQ0FBQTtRQUMzRSxXQUFXLENBQUMsa0JBQWtCLFlBQVksRUFBRSxDQUFDLENBQUE7S0FDOUM7SUFFRCxJQUFJLFdBQVcsRUFBRTtRQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDdkIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3JCLFdBQVcsQ0FBQyxzQ0FBc0MsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFFLFdBQVcsQ0FBQyxzQ0FBc0MsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFFLFdBQVcsQ0FBQyxzQ0FBc0MsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFFLFdBQVcsQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO0tBQzlFO0lBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtJQUM3QixJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsTUFBTSxpQkFBaUIsR0FBRyw4REFBOEQsQ0FBQTtRQUN4RixPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDaEMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUE7SUFFMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUE7SUFDekIsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE1BQU0sZ0JBQWdCLEdBQUcsMERBQTBELENBQUE7UUFDbkYsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQy9CLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQyxXQUFXLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtZQUMxRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDakIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZCLFdBQVcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFBO1lBQzlELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDaEI7UUFDRCxJQUFJLFdBQVcsRUFBRTtZQUNmLFdBQVcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO1NBQzlDO0lBQ0gsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBRWpCLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ3ZELFdBQVcsQ0FBQyw2Q0FBNkMsSUFBSSxHQUFHLFNBQVMsWUFBWSxDQUFDLENBQUE7UUFDdEYsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRWhELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUN6QixPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDdEIsV0FBVyxDQUFDLGtDQUFrQyxNQUFNLHFFQUFxRSxDQUFDLENBQUE7WUFDMUgsSUFBSTtnQkFDRixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3ZCLFdBQVcsQ0FBQyxxQ0FBcUMsTUFBTSxZQUFZLENBQUMsQ0FBQTtnQkFDcEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUNoQjtZQUFDLE9BQU8sR0FBWSxFQUFFO2dCQUNyQixXQUFXLENBQUMsNkRBQTZELE1BQU0sS0FBSyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7Z0JBQ2xJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDaEI7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFBO0NBQ0g7QUFBQyxPQUFPLEdBQUcsRUFBRTtJQUNaLE1BQU0sR0FBRyxHQUFHLDRDQUE0QyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ3JHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtDQUNoQiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikeyt23/node-cli-utils",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.2",
|
|
4
4
|
"description": "Some node cli utility functions",
|
|
5
5
|
"author": "Mike Thompson",
|
|
6
6
|
"license": "MIT",
|
|
@@ -68,8 +68,10 @@
|
|
|
68
68
|
"@types/node": "^18.17.15",
|
|
69
69
|
"@typescript-eslint/eslint-plugin": "^6.6.0",
|
|
70
70
|
"@typescript-eslint/parser": "^6.6.0",
|
|
71
|
+
"c8": "^8.0.1",
|
|
72
|
+
"dotenv": "^16.3.1",
|
|
71
73
|
"eslint": "^8.49.0",
|
|
72
|
-
"swig-cli": "^0.0.
|
|
74
|
+
"swig-cli": "^0.0.14",
|
|
73
75
|
"ts-node": "^10.9.1",
|
|
74
76
|
"tsx": "^3.12.10",
|
|
75
77
|
"typedoc": "^0.25.1",
|