@mikeyt23/node-cli-utils 1.4.1 → 2.0.0-beta.1
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/README.md +45 -87
- package/dist/cjs/NodeCliUtilsConfig.d.ts +21 -0
- package/dist/cjs/NodeCliUtilsConfig.d.ts.map +1 -0
- package/dist/cjs/NodeCliUtilsConfig.js +41 -0
- package/dist/cjs/TarballUtility.d.ts +53 -0
- package/dist/cjs/TarballUtility.d.ts.map +1 -0
- package/dist/cjs/TarballUtility.js +149 -0
- package/dist/cjs/certUtils.d.ts +30 -0
- package/dist/cjs/certUtils.d.ts.map +1 -0
- package/dist/cjs/certUtils.js +219 -0
- package/dist/cjs/dbMigrationUtils.d.ts +39 -0
- package/dist/cjs/dbMigrationUtils.d.ts.map +1 -0
- package/dist/cjs/dbMigrationUtils.js +205 -0
- package/dist/cjs/dotnetUtils.d.ts +25 -0
- package/dist/cjs/dotnetUtils.d.ts.map +1 -0
- package/dist/cjs/dotnetUtils.js +59 -0
- package/dist/cjs/esmSpecific.d.mts +2 -0
- package/dist/cjs/esmSpecific.d.mts.map +1 -0
- package/dist/cjs/esmSpecific.mjs +10 -0
- package/dist/cjs/generalUtils.d.ts +323 -0
- package/dist/cjs/generalUtils.d.ts.map +1 -0
- package/dist/cjs/generalUtils.js +652 -0
- package/dist/cjs/generalUtilsInternal.d.ts +9 -0
- package/dist/cjs/generalUtilsInternal.d.ts.map +1 -0
- package/dist/cjs/generalUtilsInternal.js +217 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/runWhileParentAlive.d.ts +2 -0
- package/dist/cjs/runWhileParentAlive.d.ts.map +1 -0
- package/dist/cjs/runWhileParentAlive.js +161 -0
- package/dist/esm/NodeCliUtilsConfig.d.ts +21 -0
- package/dist/esm/NodeCliUtilsConfig.d.ts.map +1 -0
- package/dist/esm/NodeCliUtilsConfig.js +35 -0
- package/dist/esm/TarballUtility.d.ts +53 -0
- package/dist/esm/TarballUtility.d.ts.map +1 -0
- package/dist/esm/TarballUtility.js +143 -0
- package/dist/esm/certUtils.d.ts +30 -0
- package/dist/esm/certUtils.d.ts.map +1 -0
- package/dist/esm/certUtils.js +185 -0
- package/dist/esm/dbMigrationUtils.d.ts +39 -0
- package/dist/esm/dbMigrationUtils.d.ts.map +1 -0
- package/dist/esm/dbMigrationUtils.js +194 -0
- package/dist/esm/dotnetUtils.d.ts +25 -0
- package/dist/esm/dotnetUtils.d.ts.map +1 -0
- package/dist/esm/dotnetUtils.js +52 -0
- package/dist/esm/esmSpecific.d.mts +2 -0
- package/dist/esm/esmSpecific.d.mts.map +1 -0
- package/dist/esm/esmSpecific.mjs +6 -0
- package/dist/esm/generalUtils.d.ts +323 -0
- package/dist/esm/generalUtils.d.ts.map +1 -0
- package/dist/esm/generalUtils.js +591 -0
- package/dist/esm/generalUtilsInternal.d.ts +9 -0
- package/dist/esm/generalUtilsInternal.d.ts.map +1 -0
- package/dist/esm/generalUtilsInternal.js +185 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/runWhileParentAlive.d.ts +2 -0
- package/dist/esm/runWhileParentAlive.d.ts.map +1 -0
- package/dist/esm/runWhileParentAlive.js +153 -0
- package/package.json +67 -10
- package/index.js +0 -627
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import fsp from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { config } from './NodeCliUtilsConfig.js';
|
|
6
|
+
import { SpawnError, isPlatformWindows, log, requireValidPath, sortDictionaryByKeyAsc, spawnAsync, stringToNonEmptyLines, trace } from './generalUtils.js';
|
|
7
|
+
const isCommonJS = typeof require === "function" && typeof module === "object" && module.exports;
|
|
8
|
+
const isEsm = !isCommonJS;
|
|
9
|
+
const spawnWorkaroundScriptName = 'runWhileParentAlive.js';
|
|
10
|
+
const currentModuleDir = ''; // Lazy loaded in getCurrentModuleDir
|
|
11
|
+
export async function copyEnv(sourcePath, destinationPath, overrideExistingDestinationValues = true, suppressAddKeysMessages = false) {
|
|
12
|
+
requireValidPath('sourcePath', sourcePath);
|
|
13
|
+
// If the destination .env file doesn't exist, just copy it and return
|
|
14
|
+
if (!fs.existsSync(destinationPath)) {
|
|
15
|
+
log(`creating ${destinationPath} from ${sourcePath}`);
|
|
16
|
+
await fsp.copyFile(sourcePath, destinationPath);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const sourceDict = getEnvAsDictionary(sourcePath);
|
|
20
|
+
const destinationDict = getEnvAsDictionary(destinationPath);
|
|
21
|
+
// Determine what keys are missing from destinationPath .env that are in sourcePath .env or .env.template
|
|
22
|
+
const templateKeys = Object.keys(sourceDict);
|
|
23
|
+
const destinationKeysBeforeChanging = Object.keys(destinationDict);
|
|
24
|
+
const keysMissingInDestination = templateKeys.filter(envKey => !destinationKeysBeforeChanging.includes(envKey));
|
|
25
|
+
if (keysMissingInDestination.length > 0) {
|
|
26
|
+
if (!suppressAddKeysMessages) {
|
|
27
|
+
log(`adding missing keys in ${destinationPath}: ${keysMissingInDestination.join(', ')}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// For instances where both .env files have the same key, use the value from the source if
|
|
31
|
+
// overrideExistingDestinationValues param is true, otherwise leave the value from the destination intact.
|
|
32
|
+
const newDict = {};
|
|
33
|
+
for (const [key, value] of Object.entries(overrideExistingDestinationValues ? sourceDict : destinationDict)) {
|
|
34
|
+
newDict[key] = value;
|
|
35
|
+
}
|
|
36
|
+
// Add entries that the destination doesn't have yet
|
|
37
|
+
for (const key of keysMissingInDestination) {
|
|
38
|
+
newDict[key] = sourceDict[key];
|
|
39
|
+
}
|
|
40
|
+
const newSortedDict = sortDictionaryByKeyAsc(newDict);
|
|
41
|
+
const newEnvFileContent = dictionaryToEnvFileString(newSortedDict);
|
|
42
|
+
await fsp.writeFile(destinationPath, newEnvFileContent);
|
|
43
|
+
}
|
|
44
|
+
export function getEnvAsDictionary(envPath) {
|
|
45
|
+
const dict = {};
|
|
46
|
+
const lines = stringToNonEmptyLines(fs.readFileSync(envPath).toString());
|
|
47
|
+
for (const line of lines) {
|
|
48
|
+
if (line && line.indexOf('=') !== -1) {
|
|
49
|
+
const parts = line.split('=');
|
|
50
|
+
dict[parts[0].trim()] = parts[1].trim();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return dict;
|
|
54
|
+
}
|
|
55
|
+
export function dictionaryToEnvFileString(dict) {
|
|
56
|
+
return Object.entries(dict).map(kvp => `${kvp[0]}=${kvp[1]}`).join('\n') + '\n';
|
|
57
|
+
}
|
|
58
|
+
export async function spawnAsyncInternal(command, args, options) {
|
|
59
|
+
const moduleDir = await getCurrentModuleDir();
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
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);
|
|
110
|
+
const childId = child.pid;
|
|
111
|
+
if (childId === undefined) {
|
|
112
|
+
throw new Error(`${logPrefix}ChildProcess pid is undefined - spawn failed`);
|
|
113
|
+
}
|
|
114
|
+
// This event will only be emitted when stdio is NOT set to 'inherit'
|
|
115
|
+
child.stdout?.on('data', (data) => {
|
|
116
|
+
process.stdout.write(data);
|
|
117
|
+
result.stdout += data.toString();
|
|
118
|
+
});
|
|
119
|
+
// This event will only be emitted when stdio is NOT set to 'inherit'
|
|
120
|
+
child.stderr?.on('data', (data) => {
|
|
121
|
+
process.stdout.write(data);
|
|
122
|
+
result.stderr += data.toString();
|
|
123
|
+
});
|
|
124
|
+
const listener = new SignalListener(child, logPrefix);
|
|
125
|
+
child.on('exit', (code, signal) => {
|
|
126
|
+
const signalMessage = signal ? ` with signal ${signal}` : '';
|
|
127
|
+
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;
|
|
130
|
+
child.removeAllListeners();
|
|
131
|
+
listener.detach();
|
|
132
|
+
if (options?.throwOnNonZero && result.code !== 0) {
|
|
133
|
+
reject(getSpawnError(result.code, result, mergedOptions));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
resolve(result);
|
|
137
|
+
});
|
|
138
|
+
child.on('error', (error) => {
|
|
139
|
+
trace(`${logPrefix}ChildProcess emitted an error event: `, error);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
reject(err);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function getSpawnError(code, result, options) {
|
|
148
|
+
const additional = options.throwOnNonZero && options.stdio === 'inherit' ? `. See above for more details (stdio is 'inherit').` : '';
|
|
149
|
+
return new SpawnError(`Spawning child process failed with code ${code}${additional}`, result);
|
|
150
|
+
}
|
|
151
|
+
class SignalListener {
|
|
152
|
+
signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
|
|
153
|
+
child;
|
|
154
|
+
logPrefix;
|
|
155
|
+
constructor(child, logPrefix) {
|
|
156
|
+
this.child = child;
|
|
157
|
+
this.logPrefix = logPrefix;
|
|
158
|
+
this.attach();
|
|
159
|
+
}
|
|
160
|
+
// Arrow function provides unique handler function for each instance of SignalListener
|
|
161
|
+
handler = (signal) => {
|
|
162
|
+
trace(`${this.logPrefix}Process received ${signal} - killing ChildProcess with ID ${this.child.pid}`);
|
|
163
|
+
this.child.kill(signal);
|
|
164
|
+
this.detach();
|
|
165
|
+
};
|
|
166
|
+
attach() {
|
|
167
|
+
this.signals.forEach(signal => process.on(signal, this.handler));
|
|
168
|
+
}
|
|
169
|
+
detach() {
|
|
170
|
+
this.signals.forEach(signal => process.removeListener(signal, this.handler));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function getCurrentModuleDir() {
|
|
174
|
+
if (currentModuleDir) {
|
|
175
|
+
return currentModuleDir;
|
|
176
|
+
}
|
|
177
|
+
if (isEsm) {
|
|
178
|
+
const module = await import('./esmSpecific.mjs');
|
|
179
|
+
const metaUrlFilePath = module.getImportMetaUrlFilePath();
|
|
180
|
+
const directory = path.dirname(metaUrlFilePath);
|
|
181
|
+
return path.normalize(directory);
|
|
182
|
+
}
|
|
183
|
+
return __dirname;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbFV0aWxzSW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhbFV0aWxzSW50ZXJuYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4QixLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUE2RCxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRXJOLE1BQU0sVUFBVSxHQUFHLE9BQU8sT0FBTyxLQUFLLFVBQVUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQTtBQUNoRyxNQUFNLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQTtBQUN6QixNQUFNLHlCQUF5QixHQUFHLHdCQUF3QixDQUFBO0FBQzFELE1BQU0sZ0JBQWdCLEdBQVcsRUFBRSxDQUFBLENBQUMscUNBQXFDO0FBRXpFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLFVBQWtCLEVBQUUsZUFBdUIsRUFBRSxpQ0FBaUMsR0FBRyxJQUFJLEVBQUUsdUJBQXVCLEdBQUcsS0FBSztJQUNsSixnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFFMUMsc0VBQXNFO0lBQ3RFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ25DLEdBQUcsQ0FBQyxZQUFZLGVBQWUsU0FBUyxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FB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
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './generalUtils.js';
|
|
2
|
+
export { config } from './NodeCliUtilsConfig.js';
|
|
3
|
+
export { createTarball, unpackTarball, unpackTarballContents } from './TarballUtility.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runWhileParentAlive.d.ts","sourceRoot":"","sources":["../../src/runWhileParentAlive.ts"],"names":[],"mappings":"AAqBA,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,QAGpE"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// runWhileParentAlive.ts
|
|
2
|
+
// Also referred to as "orphan protection" or "long running windows process workaround script"
|
|
3
|
+
import { spawn, execSync, spawnSync } from 'node:child_process';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import { config } from './NodeCliUtilsConfig.js';
|
|
6
|
+
const DEV_LOGGING = false; // Set to true while developing this script to see more logging in the console
|
|
7
|
+
let loggingEnabled = true; // Will be set below by process.argv[2] === 'true' from spawnAsync in generalUtils.js
|
|
8
|
+
let traceEnabled = true; // Will be set below by process.argv[3] === 'true' from spawnAsync in generalUtils.js
|
|
9
|
+
let pollingMillis = config.orphanProtectionPollingIntervalMillis; // Will be set by process.argv[4] from spawnAsync in generalUtils.js
|
|
10
|
+
function getLogPrefix() {
|
|
11
|
+
const now = new Date();
|
|
12
|
+
const hours = now.getHours().toString().padStart(2, '0');
|
|
13
|
+
const minutes = now.getMinutes().toString().padStart(2, '0');
|
|
14
|
+
const seconds = now.getSeconds().toString().padStart(2, '0');
|
|
15
|
+
const milliseconds = now.getMilliseconds().toString().padStart(3, '0');
|
|
16
|
+
return `[${hours}:${minutes}:${seconds}:${milliseconds}] `;
|
|
17
|
+
}
|
|
18
|
+
// Using this trace method instead of importing from generalUtils.js since config is not shared between processes
|
|
19
|
+
export function trace(message, ...optionalParams) {
|
|
20
|
+
const prefix = `[TRACE]`;
|
|
21
|
+
console.log(prefix, message, ...optionalParams);
|
|
22
|
+
}
|
|
23
|
+
function logToFile(message) {
|
|
24
|
+
fs.appendFileSync(config.orphanProtectionLoggingPath, `${getLogPrefix()}${message}` + ((message && message.length && message[message.length - 1] !== '\n') ? '\n' : ''));
|
|
25
|
+
}
|
|
26
|
+
function traceAndLog(message, isDevTrace = false) {
|
|
27
|
+
if (isDevTrace && !DEV_LOGGING) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (isDevTrace && DEV_LOGGING) {
|
|
31
|
+
trace(getLogPrefix() + message);
|
|
32
|
+
logToFile(message);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (traceEnabled) {
|
|
36
|
+
trace(getLogPrefix() + message);
|
|
37
|
+
}
|
|
38
|
+
if (loggingEnabled) {
|
|
39
|
+
logToFile(message);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isParentProcessAlive(parentId) {
|
|
43
|
+
try {
|
|
44
|
+
const result = spawnSync('tasklist', { shell: true });
|
|
45
|
+
const resultToLog = {
|
|
46
|
+
status: result.status,
|
|
47
|
+
stderr: result.stderr?.toString(),
|
|
48
|
+
stdoutIncludesParentId: result.stdout?.toString().includes(parentId.toString()) ?? false
|
|
49
|
+
};
|
|
50
|
+
traceAndLog('tasklist result: ' + JSON.stringify(resultToLog), true);
|
|
51
|
+
return resultToLog.stdoutIncludesParentId;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (err instanceof Error) {
|
|
55
|
+
console.log(err.message);
|
|
56
|
+
console.log(err.stack);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.error(err);
|
|
60
|
+
}
|
|
61
|
+
traceAndLog(`Error attempting to fetch task list using 'tasklist' - returning false for isParentAlive(): ${err instanceof Error ? err.toString() : err}`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function killTree(pid) {
|
|
66
|
+
try {
|
|
67
|
+
execSync(`taskkill /pid ${pid} /T /F`);
|
|
68
|
+
traceAndLog(`No errors running killTree`);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
traceAndLog(`Error running taskkill with PID ${pid}: ${err instanceof Error ? err.toString() : err}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
loggingEnabled = process.argv[2] === 'true';
|
|
76
|
+
traceEnabled = process.argv[3] === 'true';
|
|
77
|
+
pollingMillis = Number(process.argv[4]);
|
|
78
|
+
if (Number.isNaN(pollingMillis) || pollingMillis < 0 || pollingMillis > (3600 * 1000)) {
|
|
79
|
+
pollingMillis = config.orphanProtectionPollingIntervalMillis;
|
|
80
|
+
}
|
|
81
|
+
const passthroughArgs = process.argv.slice(5);
|
|
82
|
+
if (loggingEnabled) {
|
|
83
|
+
traceAndLog(`Logging enabled with polling rate set to: ${pollingMillis}ms`);
|
|
84
|
+
traceAndLog(`Trace enabled: ${traceEnabled}`);
|
|
85
|
+
}
|
|
86
|
+
if (DEV_LOGGING) {
|
|
87
|
+
const argvString = JSON.stringify(process.argv);
|
|
88
|
+
console.log(argvString);
|
|
89
|
+
logToFile(argvString);
|
|
90
|
+
traceAndLog(`process.argv[2] (logging enabled): ${process.argv[2]}`, true);
|
|
91
|
+
traceAndLog(`process.argv[3] (trace enabled): ${process.argv[3]}`, true);
|
|
92
|
+
traceAndLog(`process.argv[4] (polling millis): ${process.argv[4]}`, true);
|
|
93
|
+
traceAndLog(`rest of process.argv: ${JSON.stringify(passthroughArgs)}`, true);
|
|
94
|
+
}
|
|
95
|
+
const parentId = process.ppid;
|
|
96
|
+
if (!parentId) {
|
|
97
|
+
const noParentIdMessage = `Middle process cannot continue - parent process id not found`;
|
|
98
|
+
console.error(noParentIdMessage);
|
|
99
|
+
traceAndLog(noParentIdMessage);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
const [command, ...args] = passthroughArgs;
|
|
103
|
+
const child = spawn(command, args, { stdio: 'inherit', shell: true });
|
|
104
|
+
const childId = child.pid;
|
|
105
|
+
if (!childId) {
|
|
106
|
+
const noChildIdMessage = 'spawning ChildProcess failed - no pid on returned handle';
|
|
107
|
+
console.error(noChildIdMessage);
|
|
108
|
+
traceAndLog(noChildIdMessage);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
const interval = setInterval(() => {
|
|
112
|
+
if (!isParentProcessAlive(parentId)) {
|
|
113
|
+
traceAndLog('Parent process is not alive. Shutting down.');
|
|
114
|
+
killTree(childId);
|
|
115
|
+
clearInterval(interval);
|
|
116
|
+
traceAndLog('Used taskkill and cleared interval - exiting...');
|
|
117
|
+
process.exit(0);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (DEV_LOGGING) {
|
|
121
|
+
traceAndLog('Parent is alive, keep running.');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}, pollingMillis);
|
|
125
|
+
child.on('exit', (code, signal) => {
|
|
126
|
+
const andSignal = signal ? ` and signal ${signal}` : '';
|
|
127
|
+
traceAndLog(`ChildProcess exit event emitted with code ${code}${andSignal} - exiting`);
|
|
128
|
+
clearInterval(interval);
|
|
129
|
+
process.exit(code ?? 1);
|
|
130
|
+
});
|
|
131
|
+
const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
|
|
132
|
+
signals.forEach((signal) => {
|
|
133
|
+
process.on(signal, () => {
|
|
134
|
+
traceAndLog(`Middle process received signal ${signal} - will attempt to kill child process tree, clear interval and exit`);
|
|
135
|
+
try {
|
|
136
|
+
clearInterval(interval);
|
|
137
|
+
traceAndLog(`Ran clearInterval in signal event ${signal} - exiting`);
|
|
138
|
+
process.exit(0);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
traceAndLog(`Error attempting to run clearInterval during signal event ${signal}: ${err instanceof Error ? err.toString() : err}`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const msg = `Unexpected error in runWhileParentAlive: ${err instanceof Error ? err.toString() : err}`;
|
|
149
|
+
console.error(msg);
|
|
150
|
+
logToFile(msg);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuV2hpbGVQYXJlbnRBbGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5XaGlsZVBhcmVudEFsaXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QjtBQUN6Qiw4RkFBOEY7QUFDOUYsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDL0QsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUVoRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUEsQ0FBQyw4RUFBOEU7QUFDeEcsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFBLENBQUMscUZBQXFGO0FBQy9HLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQSxDQUFDLHFGQUFxRjtBQUM3RyxJQUFJLGFBQWEsR0FBVyxNQUFNLENBQUMscUNBQXFDLENBQUEsQ0FBQyxvRUFBb0U7QUFFN0ksU0FBUyxZQUFZO0lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7SUFDdEIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDeEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDNUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDNUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVB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
|
package/package.json
CHANGED
|
@@ -1,22 +1,79 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikeyt23/node-cli-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-beta.1",
|
|
4
4
|
"description": "Some node cli utility functions",
|
|
5
5
|
"author": "Mike Thompson",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"private": false,
|
|
8
|
-
"files": [
|
|
9
|
-
"index.js"
|
|
10
|
-
],
|
|
11
7
|
"homepage": "https://github.com/mikey-t/node-cli-utils",
|
|
12
8
|
"repository": {
|
|
13
9
|
"type": "git",
|
|
14
10
|
"url": "https://github.com/mikey-t/node-cli-utils.git"
|
|
15
11
|
},
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
|
|
12
|
+
"type": "module",
|
|
13
|
+
"scripts": {
|
|
14
|
+
"watch": "tsc -w --p tsconfig.esm.json",
|
|
15
|
+
"watch:cjs": "tsc -w --p tsconfig.cjs.json"
|
|
16
|
+
},
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"import": {
|
|
20
|
+
"types": "./dist/esm/index.d.ts",
|
|
21
|
+
"default": "./dist/esm/index.js"
|
|
22
|
+
},
|
|
23
|
+
"require": {
|
|
24
|
+
"types": "./dist/cjs/index.d.ts",
|
|
25
|
+
"default": "./dist/cjs/index.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"./certUtils": {
|
|
29
|
+
"import": {
|
|
30
|
+
"default": "./dist/esm/certUtils.js"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"default": "./dist/cjs/certUtils.js"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"./dotnetUtils": {
|
|
37
|
+
"import": {
|
|
38
|
+
"default": "./dist/esm/dotnetUtils.js"
|
|
39
|
+
},
|
|
40
|
+
"require": {
|
|
41
|
+
"default": "./dist/cjs/dotnetUtils.js"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"./dbMigrationUtils": {
|
|
45
|
+
"import": {
|
|
46
|
+
"default": "./dist/esm/dbMigrationUtils.js"
|
|
47
|
+
},
|
|
48
|
+
"require": {
|
|
49
|
+
"default": "./dist/cjs/dbMigrationUtils.js"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"main": "./dist/esm/index.js",
|
|
54
|
+
"types": "dist/esm/index.d.ts",
|
|
55
|
+
"files": [
|
|
56
|
+
"package.json",
|
|
57
|
+
"dist/",
|
|
58
|
+
"readme.md",
|
|
59
|
+
"LICENSE"
|
|
60
|
+
],
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=16.0.0"
|
|
63
|
+
},
|
|
64
|
+
"volta": {
|
|
65
|
+
"node": "18.17.1"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@types/node": "^18.17.15",
|
|
69
|
+
"@typescript-eslint/eslint-plugin": "^6.6.0",
|
|
70
|
+
"@typescript-eslint/parser": "^6.6.0",
|
|
71
|
+
"eslint": "^8.49.0",
|
|
72
|
+
"swig-cli": "^0.0.9",
|
|
73
|
+
"ts-node": "^10.9.1",
|
|
74
|
+
"tsx": "^3.12.10",
|
|
75
|
+
"typedoc": "^0.25.1",
|
|
76
|
+
"typedoc-plugin-missing-exports": "^2.1.0",
|
|
77
|
+
"typescript": "^5.2.2"
|
|
21
78
|
}
|
|
22
79
|
}
|