@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.
Files changed (64) hide show
  1. package/README.md +45 -87
  2. package/dist/cjs/NodeCliUtilsConfig.d.ts +21 -0
  3. package/dist/cjs/NodeCliUtilsConfig.d.ts.map +1 -0
  4. package/dist/cjs/NodeCliUtilsConfig.js +41 -0
  5. package/dist/cjs/TarballUtility.d.ts +53 -0
  6. package/dist/cjs/TarballUtility.d.ts.map +1 -0
  7. package/dist/cjs/TarballUtility.js +149 -0
  8. package/dist/cjs/certUtils.d.ts +30 -0
  9. package/dist/cjs/certUtils.d.ts.map +1 -0
  10. package/dist/cjs/certUtils.js +219 -0
  11. package/dist/cjs/dbMigrationUtils.d.ts +39 -0
  12. package/dist/cjs/dbMigrationUtils.d.ts.map +1 -0
  13. package/dist/cjs/dbMigrationUtils.js +205 -0
  14. package/dist/cjs/dotnetUtils.d.ts +25 -0
  15. package/dist/cjs/dotnetUtils.d.ts.map +1 -0
  16. package/dist/cjs/dotnetUtils.js +59 -0
  17. package/dist/cjs/esmSpecific.d.mts +2 -0
  18. package/dist/cjs/esmSpecific.d.mts.map +1 -0
  19. package/dist/cjs/esmSpecific.mjs +10 -0
  20. package/dist/cjs/generalUtils.d.ts +323 -0
  21. package/dist/cjs/generalUtils.d.ts.map +1 -0
  22. package/dist/cjs/generalUtils.js +652 -0
  23. package/dist/cjs/generalUtilsInternal.d.ts +9 -0
  24. package/dist/cjs/generalUtilsInternal.d.ts.map +1 -0
  25. package/dist/cjs/generalUtilsInternal.js +217 -0
  26. package/dist/cjs/index.d.ts +4 -0
  27. package/dist/cjs/index.d.ts.map +1 -0
  28. package/dist/cjs/index.js +25 -0
  29. package/dist/cjs/package.json +5 -0
  30. package/dist/cjs/runWhileParentAlive.d.ts +2 -0
  31. package/dist/cjs/runWhileParentAlive.d.ts.map +1 -0
  32. package/dist/cjs/runWhileParentAlive.js +161 -0
  33. package/dist/esm/NodeCliUtilsConfig.d.ts +21 -0
  34. package/dist/esm/NodeCliUtilsConfig.d.ts.map +1 -0
  35. package/dist/esm/NodeCliUtilsConfig.js +35 -0
  36. package/dist/esm/TarballUtility.d.ts +53 -0
  37. package/dist/esm/TarballUtility.d.ts.map +1 -0
  38. package/dist/esm/TarballUtility.js +143 -0
  39. package/dist/esm/certUtils.d.ts +30 -0
  40. package/dist/esm/certUtils.d.ts.map +1 -0
  41. package/dist/esm/certUtils.js +185 -0
  42. package/dist/esm/dbMigrationUtils.d.ts +39 -0
  43. package/dist/esm/dbMigrationUtils.d.ts.map +1 -0
  44. package/dist/esm/dbMigrationUtils.js +194 -0
  45. package/dist/esm/dotnetUtils.d.ts +25 -0
  46. package/dist/esm/dotnetUtils.d.ts.map +1 -0
  47. package/dist/esm/dotnetUtils.js +52 -0
  48. package/dist/esm/esmSpecific.d.mts +2 -0
  49. package/dist/esm/esmSpecific.d.mts.map +1 -0
  50. package/dist/esm/esmSpecific.mjs +6 -0
  51. package/dist/esm/generalUtils.d.ts +323 -0
  52. package/dist/esm/generalUtils.d.ts.map +1 -0
  53. package/dist/esm/generalUtils.js +591 -0
  54. package/dist/esm/generalUtilsInternal.d.ts +9 -0
  55. package/dist/esm/generalUtilsInternal.d.ts.map +1 -0
  56. package/dist/esm/generalUtilsInternal.js +185 -0
  57. package/dist/esm/index.d.ts +4 -0
  58. package/dist/esm/index.d.ts.map +1 -0
  59. package/dist/esm/index.js +4 -0
  60. package/dist/esm/runWhileParentAlive.d.ts +2 -0
  61. package/dist/esm/runWhileParentAlive.d.ts.map +1 -0
  62. package/dist/esm/runWhileParentAlive.js +153 -0
  63. package/package.json +67 -10
  64. package/index.js +0 -627
@@ -0,0 +1,9 @@
1
+ import { SpawnOptionsWithThrow, SpawnResult, StringKeyedDictionary } from './generalUtils.js';
2
+ export declare function copyEnv(sourcePath: string, destinationPath: string, overrideExistingDestinationValues?: boolean, suppressAddKeysMessages?: boolean): Promise<void>;
3
+ export declare function getEnvAsDictionary(envPath: string): StringKeyedDictionary;
4
+ export declare function dictionaryToEnvFileString(dict: StringKeyedDictionary): string;
5
+ export interface SpawnOptionsInternal extends SpawnOptionsWithThrow {
6
+ isLongRunning?: boolean;
7
+ }
8
+ export declare function spawnAsyncInternal(command: string, args?: string[], options?: SpawnOptionsInternal): Promise<SpawnResult>;
9
+ //# sourceMappingURL=generalUtilsInternal.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.spawnAsyncInternal = exports.dictionaryToEnvFileString = exports.getEnvAsDictionary = exports.copyEnv = void 0;
30
+ const node_child_process_1 = require("node:child_process");
31
+ const node_fs_1 = __importDefault(require("node:fs"));
32
+ const promises_1 = __importDefault(require("node:fs/promises"));
33
+ const node_path_1 = __importDefault(require("node:path"));
34
+ const NodeCliUtilsConfig_js_1 = require("./NodeCliUtilsConfig.js");
35
+ const generalUtils_js_1 = require("./generalUtils.js");
36
+ const isCommonJS = typeof require === "function" && typeof module === "object" && module.exports;
37
+ const isEsm = !isCommonJS;
38
+ const spawnWorkaroundScriptName = 'runWhileParentAlive.js';
39
+ const currentModuleDir = ''; // Lazy loaded in getCurrentModuleDir
40
+ async function copyEnv(sourcePath, destinationPath, overrideExistingDestinationValues = true, suppressAddKeysMessages = false) {
41
+ (0, generalUtils_js_1.requireValidPath)('sourcePath', sourcePath);
42
+ // If the destination .env file doesn't exist, just copy it and return
43
+ if (!node_fs_1.default.existsSync(destinationPath)) {
44
+ (0, generalUtils_js_1.log)(`creating ${destinationPath} from ${sourcePath}`);
45
+ await promises_1.default.copyFile(sourcePath, destinationPath);
46
+ return;
47
+ }
48
+ const sourceDict = getEnvAsDictionary(sourcePath);
49
+ const destinationDict = getEnvAsDictionary(destinationPath);
50
+ // Determine what keys are missing from destinationPath .env that are in sourcePath .env or .env.template
51
+ const templateKeys = Object.keys(sourceDict);
52
+ const destinationKeysBeforeChanging = Object.keys(destinationDict);
53
+ const keysMissingInDestination = templateKeys.filter(envKey => !destinationKeysBeforeChanging.includes(envKey));
54
+ if (keysMissingInDestination.length > 0) {
55
+ if (!suppressAddKeysMessages) {
56
+ (0, generalUtils_js_1.log)(`adding missing keys in ${destinationPath}: ${keysMissingInDestination.join(', ')}`);
57
+ }
58
+ }
59
+ // For instances where both .env files have the same key, use the value from the source if
60
+ // overrideExistingDestinationValues param is true, otherwise leave the value from the destination intact.
61
+ const newDict = {};
62
+ for (const [key, value] of Object.entries(overrideExistingDestinationValues ? sourceDict : destinationDict)) {
63
+ newDict[key] = value;
64
+ }
65
+ // Add entries that the destination doesn't have yet
66
+ for (const key of keysMissingInDestination) {
67
+ newDict[key] = sourceDict[key];
68
+ }
69
+ const newSortedDict = (0, generalUtils_js_1.sortDictionaryByKeyAsc)(newDict);
70
+ const newEnvFileContent = dictionaryToEnvFileString(newSortedDict);
71
+ await promises_1.default.writeFile(destinationPath, newEnvFileContent);
72
+ }
73
+ exports.copyEnv = copyEnv;
74
+ function getEnvAsDictionary(envPath) {
75
+ const dict = {};
76
+ const lines = (0, generalUtils_js_1.stringToNonEmptyLines)(node_fs_1.default.readFileSync(envPath).toString());
77
+ for (const line of lines) {
78
+ if (line && line.indexOf('=') !== -1) {
79
+ const parts = line.split('=');
80
+ dict[parts[0].trim()] = parts[1].trim();
81
+ }
82
+ }
83
+ return dict;
84
+ }
85
+ exports.getEnvAsDictionary = getEnvAsDictionary;
86
+ function dictionaryToEnvFileString(dict) {
87
+ return Object.entries(dict).map(kvp => `${kvp[0]}=${kvp[1]}`).join('\n') + '\n';
88
+ }
89
+ exports.dictionaryToEnvFileString = dictionaryToEnvFileString;
90
+ async function spawnAsyncInternal(command, args, options) {
91
+ const moduleDir = await getCurrentModuleDir();
92
+ return new Promise((resolve, reject) => {
93
+ var _a, _b, _c, _d;
94
+ try {
95
+ const defaultSpawnOptions = { stdio: 'inherit' };
96
+ const argsForChildProcess = args !== null && args !== void 0 ? args : [];
97
+ const logPrefix = `[${command} ${argsForChildProcess.join(' ')}] `;
98
+ const mergedOptions = { ...defaultSpawnOptions, ...options };
99
+ const result = {
100
+ code: 1,
101
+ stdout: '',
102
+ stderr: '',
103
+ cwd: (_b = (_a = mergedOptions.cwd) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : process.cwd()
104
+ };
105
+ // Windows has an issue where child processes are orphaned when using the shell option. This workaround will spawn
106
+ // 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.
107
+ const workaroundCommand = 'node';
108
+ const workaroundScriptPath = node_path_1.default.join(moduleDir, spawnWorkaroundScriptName);
109
+ // First check if this is the request for the workaround process itself
110
+ if ((options === null || options === void 0 ? void 0 : options.isLongRunning) && (0, generalUtils_js_1.isPlatformWindows)() && command !== workaroundCommand && (!argsForChildProcess[0] || !argsForChildProcess[0].endsWith(spawnWorkaroundScriptName))) {
111
+ (0, generalUtils_js_1.trace)(`${logPrefix}Running on Windows with shell option - using middle process hack to prevent orphaned processes`);
112
+ const loggingEnabledString = NodeCliUtilsConfig_js_1.config.orphanProtectionLoggingEnabled.toString();
113
+ const traceEnabledString = NodeCliUtilsConfig_js_1.config.traceEnabled.toString();
114
+ const pollingMillisString = NodeCliUtilsConfig_js_1.config.orphanProtectionPollingIntervalMillis.toString();
115
+ (0, generalUtils_js_1.trace)(`${logPrefix}Orphan protection logging enabled: ${loggingEnabledString}`);
116
+ (0, generalUtils_js_1.trace)(`${logPrefix}Orphan protection trace enabled: ${traceEnabledString}`);
117
+ (0, generalUtils_js_1.trace)(`${logPrefix}Orphan protection polling interval: ${pollingMillisString}ms`);
118
+ if (NodeCliUtilsConfig_js_1.config.orphanProtectionLoggingEnabled) {
119
+ (0, generalUtils_js_1.trace)(`${logPrefix}Orphan protection logging path: ${NodeCliUtilsConfig_js_1.config.orphanProtectionLoggingPath}`);
120
+ }
121
+ const workaroundArgs = [
122
+ workaroundScriptPath,
123
+ loggingEnabledString,
124
+ traceEnabledString,
125
+ pollingMillisString,
126
+ command,
127
+ ...(args !== null && args !== void 0 ? args : [])
128
+ ];
129
+ (0, generalUtils_js_1.spawnAsync)(workaroundCommand, workaroundArgs, { ...mergedOptions, stdio: 'inherit', shell: true })
130
+ .then((workaroundResult) => {
131
+ result.code = workaroundResult.code;
132
+ if ((options === null || options === void 0 ? void 0 : options.throwOnNonZero) && result.code !== 0) {
133
+ reject(getSpawnError(result.code, result, options));
134
+ return;
135
+ }
136
+ resolve(result);
137
+ }).catch((err) => {
138
+ reject(err);
139
+ });
140
+ return;
141
+ }
142
+ const child = (0, node_child_process_1.spawn)(command, argsForChildProcess, mergedOptions);
143
+ const childId = child.pid;
144
+ if (childId === undefined) {
145
+ throw new Error(`${logPrefix}ChildProcess pid is undefined - spawn failed`);
146
+ }
147
+ // This event will only be emitted when stdio is NOT set to 'inherit'
148
+ (_c = child.stdout) === null || _c === void 0 ? void 0 : _c.on('data', (data) => {
149
+ process.stdout.write(data);
150
+ result.stdout += data.toString();
151
+ });
152
+ // This event will only be emitted when stdio is NOT set to 'inherit'
153
+ (_d = child.stderr) === null || _d === void 0 ? void 0 : _d.on('data', (data) => {
154
+ process.stdout.write(data);
155
+ result.stderr += data.toString();
156
+ });
157
+ const listener = new SignalListener(child, logPrefix);
158
+ child.on('exit', (code, signal) => {
159
+ const signalMessage = signal ? ` with signal ${signal}` : '';
160
+ (0, generalUtils_js_1.trace)(`${logPrefix}ChildProcess exited with code ${code}${signalMessage}`);
161
+ // If long running, ctrl+c will cause null, which we don't necessarily want to consider an error
162
+ result.code = (code === null && (options === null || options === void 0 ? void 0 : options.isLongRunning)) ? 0 : code !== null && code !== void 0 ? code : 1;
163
+ child.removeAllListeners();
164
+ listener.detach();
165
+ if ((options === null || options === void 0 ? void 0 : options.throwOnNonZero) && result.code !== 0) {
166
+ reject(getSpawnError(result.code, result, mergedOptions));
167
+ return;
168
+ }
169
+ resolve(result);
170
+ });
171
+ child.on('error', (error) => {
172
+ (0, generalUtils_js_1.trace)(`${logPrefix}ChildProcess emitted an error event: `, error);
173
+ });
174
+ }
175
+ catch (err) {
176
+ reject(err);
177
+ }
178
+ });
179
+ }
180
+ exports.spawnAsyncInternal = spawnAsyncInternal;
181
+ function getSpawnError(code, result, options) {
182
+ const additional = options.throwOnNonZero && options.stdio === 'inherit' ? `. See above for more details (stdio is 'inherit').` : '';
183
+ return new generalUtils_js_1.SpawnError(`Spawning child process failed with code ${code}${additional}`, result);
184
+ }
185
+ class SignalListener {
186
+ constructor(child, logPrefix) {
187
+ this.signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
188
+ // Arrow function provides unique handler function for each instance of SignalListener
189
+ this.handler = (signal) => {
190
+ (0, generalUtils_js_1.trace)(`${this.logPrefix}Process received ${signal} - killing ChildProcess with ID ${this.child.pid}`);
191
+ this.child.kill(signal);
192
+ this.detach();
193
+ };
194
+ this.child = child;
195
+ this.logPrefix = logPrefix;
196
+ this.attach();
197
+ }
198
+ attach() {
199
+ this.signals.forEach(signal => process.on(signal, this.handler));
200
+ }
201
+ detach() {
202
+ this.signals.forEach(signal => process.removeListener(signal, this.handler));
203
+ }
204
+ }
205
+ async function getCurrentModuleDir() {
206
+ if (currentModuleDir) {
207
+ return currentModuleDir;
208
+ }
209
+ if (isEsm) {
210
+ const module = await Promise.resolve().then(() => __importStar(require('./esmSpecific.mjs')));
211
+ const metaUrlFilePath = module.getImportMetaUrlFilePath();
212
+ const directory = node_path_1.default.dirname(metaUrlFilePath);
213
+ return node_path_1.default.normalize(directory);
214
+ }
215
+ return __dirname;
216
+ }
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbFV0aWxzSW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhbFV0aWxzSW50ZXJuYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBc0U7QUFDdEUsc0RBQXdCO0FBQ3hCLGdFQUFrQztBQUNsQywwREFBNEI7QUFDNUIsbUVBQWdEO0FBQ2hELHVEQUFxTjtBQUVyTixNQUFNLFVBQVUsR0FBRyxPQUFPLE9BQU8sS0FBSyxVQUFVLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUE7QUFDaEcsTUFBTSxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUE7QUFDekIsTUFBTSx5QkFBeUIsR0FBRyx3QkFBd0IsQ0FBQTtBQUMxRCxNQUFNLGdCQUFnQixHQUFXLEVBQUUsQ0FBQSxDQUFDLHFDQUFxQztBQUVsRSxLQUFLLFVBQVUsT0FBTyxDQUFDLFVBQWtCLEVBQUUsZUFBdUIsRUFBRSxpQ0FBaUMsR0FBRyxJQUFJLEVBQUUsdUJBQXVCLEdBQUcsS0FBSztJQUNsSixJQUFBLGtDQUFnQixFQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUUxQyxzRUFBc0U7SUFDdEUsSUFBSSxDQUFDLGlCQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ25DLElBQUEscUJBQUcsRUFBQyxZQUFZLGVBQWUsU0FBUyxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQ3JELE1BQU0sa0JBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBQy9DLE9BQU07S0FDUDtJQUVELE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBRTNELHlHQUF5RztJQUN6RyxNQUFNLFlBQVks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
@@ -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=index.d.ts.map
@@ -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,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.unpackTarballContents = exports.unpackTarball = exports.createTarball = exports.config = void 0;
18
+ __exportStar(require("./generalUtils.js"), exports);
19
+ var NodeCliUtilsConfig_js_1 = require("./NodeCliUtilsConfig.js");
20
+ Object.defineProperty(exports, "config", { enumerable: true, get: function () { return NodeCliUtilsConfig_js_1.config; } });
21
+ var TarballUtility_js_1 = require("./TarballUtility.js");
22
+ Object.defineProperty(exports, "createTarball", { enumerable: true, get: function () { return TarballUtility_js_1.createTarball; } });
23
+ Object.defineProperty(exports, "unpackTarball", { enumerable: true, get: function () { return TarballUtility_js_1.unpackTarball; } });
24
+ Object.defineProperty(exports, "unpackTarballContents", { enumerable: true, get: function () { return TarballUtility_js_1.unpackTarballContents; } });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBaUM7QUFDakMsaUVBQWdEO0FBQXZDLCtHQUFBLE1BQU0sT0FBQTtBQUNmLHlEQUF5RjtBQUFoRixrSEFBQSxhQUFhLE9BQUE7QUFBRSxrSEFBQSxhQUFhLE9BQUE7QUFBRSwwSEFBQSxxQkFBcUIsT0FBQSJ9
@@ -0,0 +1,5 @@
1
+ {
2
+ "type": "commonjs",
3
+ "main": "./index.cjs",
4
+ "types": "./index.d.ts"
5
+ }
@@ -0,0 +1,2 @@
1
+ export declare function trace(message?: unknown, ...optionalParams: unknown[]): void;
2
+ //# sourceMappingURL=runWhileParentAlive.d.ts.map
@@ -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,161 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.trace = void 0;
7
+ // runWhileParentAlive.ts
8
+ // Also referred to as "orphan protection" or "long running windows process workaround script"
9
+ const node_child_process_1 = require("node:child_process");
10
+ const node_fs_1 = __importDefault(require("node:fs"));
11
+ const NodeCliUtilsConfig_js_1 = require("./NodeCliUtilsConfig.js");
12
+ const DEV_LOGGING = false; // Set to true while developing this script to see more logging in the console
13
+ let loggingEnabled = true; // Will be set below by process.argv[2] === 'true' from spawnAsync in generalUtils.js
14
+ let traceEnabled = true; // Will be set below by process.argv[3] === 'true' from spawnAsync in generalUtils.js
15
+ let pollingMillis = NodeCliUtilsConfig_js_1.config.orphanProtectionPollingIntervalMillis; // Will be set by process.argv[4] from spawnAsync in generalUtils.js
16
+ function getLogPrefix() {
17
+ const now = new Date();
18
+ const hours = now.getHours().toString().padStart(2, '0');
19
+ const minutes = now.getMinutes().toString().padStart(2, '0');
20
+ const seconds = now.getSeconds().toString().padStart(2, '0');
21
+ const milliseconds = now.getMilliseconds().toString().padStart(3, '0');
22
+ return `[${hours}:${minutes}:${seconds}:${milliseconds}] `;
23
+ }
24
+ // Using this trace method instead of importing from generalUtils.js since config is not shared between processes
25
+ function trace(message, ...optionalParams) {
26
+ const prefix = `[TRACE]`;
27
+ console.log(prefix, message, ...optionalParams);
28
+ }
29
+ exports.trace = trace;
30
+ function logToFile(message) {
31
+ node_fs_1.default.appendFileSync(NodeCliUtilsConfig_js_1.config.orphanProtectionLoggingPath, `${getLogPrefix()}${message}` + ((message && message.length && message[message.length - 1] !== '\n') ? '\n' : ''));
32
+ }
33
+ function traceAndLog(message, isDevTrace = false) {
34
+ if (isDevTrace && !DEV_LOGGING) {
35
+ return;
36
+ }
37
+ if (isDevTrace && DEV_LOGGING) {
38
+ trace(getLogPrefix() + message);
39
+ logToFile(message);
40
+ return;
41
+ }
42
+ if (traceEnabled) {
43
+ trace(getLogPrefix() + message);
44
+ }
45
+ if (loggingEnabled) {
46
+ logToFile(message);
47
+ }
48
+ }
49
+ function isParentProcessAlive(parentId) {
50
+ var _a, _b, _c;
51
+ try {
52
+ const result = (0, node_child_process_1.spawnSync)('tasklist', { shell: true });
53
+ const resultToLog = {
54
+ status: result.status,
55
+ stderr: (_a = result.stderr) === null || _a === void 0 ? void 0 : _a.toString(),
56
+ stdoutIncludesParentId: (_c = (_b = result.stdout) === null || _b === void 0 ? void 0 : _b.toString().includes(parentId.toString())) !== null && _c !== void 0 ? _c : false
57
+ };
58
+ traceAndLog('tasklist result: ' + JSON.stringify(resultToLog), true);
59
+ return resultToLog.stdoutIncludesParentId;
60
+ }
61
+ catch (err) {
62
+ if (err instanceof Error) {
63
+ console.log(err.message);
64
+ console.log(err.stack);
65
+ }
66
+ else {
67
+ console.error(err);
68
+ }
69
+ traceAndLog(`Error attempting to fetch task list using 'tasklist' - returning false for isParentAlive(): ${err instanceof Error ? err.toString() : err}`);
70
+ return false;
71
+ }
72
+ }
73
+ function killTree(pid) {
74
+ try {
75
+ (0, node_child_process_1.execSync)(`taskkill /pid ${pid} /T /F`);
76
+ traceAndLog(`No errors running killTree`);
77
+ }
78
+ catch (err) {
79
+ traceAndLog(`Error running taskkill with PID ${pid}: ${err instanceof Error ? err.toString() : err}`);
80
+ }
81
+ }
82
+ try {
83
+ loggingEnabled = process.argv[2] === 'true';
84
+ traceEnabled = process.argv[3] === 'true';
85
+ pollingMillis = Number(process.argv[4]);
86
+ if (Number.isNaN(pollingMillis) || pollingMillis < 0 || pollingMillis > (3600 * 1000)) {
87
+ pollingMillis = NodeCliUtilsConfig_js_1.config.orphanProtectionPollingIntervalMillis;
88
+ }
89
+ const passthroughArgs = process.argv.slice(5);
90
+ if (loggingEnabled) {
91
+ traceAndLog(`Logging enabled with polling rate set to: ${pollingMillis}ms`);
92
+ traceAndLog(`Trace enabled: ${traceEnabled}`);
93
+ }
94
+ if (DEV_LOGGING) {
95
+ const argvString = JSON.stringify(process.argv);
96
+ console.log(argvString);
97
+ logToFile(argvString);
98
+ traceAndLog(`process.argv[2] (logging enabled): ${process.argv[2]}`, true);
99
+ traceAndLog(`process.argv[3] (trace enabled): ${process.argv[3]}`, true);
100
+ traceAndLog(`process.argv[4] (polling millis): ${process.argv[4]}`, true);
101
+ traceAndLog(`rest of process.argv: ${JSON.stringify(passthroughArgs)}`, true);
102
+ }
103
+ const parentId = process.ppid;
104
+ if (!parentId) {
105
+ const noParentIdMessage = `Middle process cannot continue - parent process id not found`;
106
+ console.error(noParentIdMessage);
107
+ traceAndLog(noParentIdMessage);
108
+ process.exit(1);
109
+ }
110
+ const [command, ...args] = passthroughArgs;
111
+ const child = (0, node_child_process_1.spawn)(command, args, { stdio: 'inherit', shell: true });
112
+ const childId = child.pid;
113
+ if (!childId) {
114
+ const noChildIdMessage = 'spawning ChildProcess failed - no pid on returned handle';
115
+ console.error(noChildIdMessage);
116
+ traceAndLog(noChildIdMessage);
117
+ process.exit(1);
118
+ }
119
+ const interval = setInterval(() => {
120
+ if (!isParentProcessAlive(parentId)) {
121
+ traceAndLog('Parent process is not alive. Shutting down.');
122
+ killTree(childId);
123
+ clearInterval(interval);
124
+ traceAndLog('Used taskkill and cleared interval - exiting...');
125
+ process.exit(0);
126
+ }
127
+ else {
128
+ if (DEV_LOGGING) {
129
+ traceAndLog('Parent is alive, keep running.');
130
+ }
131
+ }
132
+ }, pollingMillis);
133
+ child.on('exit', (code, signal) => {
134
+ const andSignal = signal ? ` and signal ${signal}` : '';
135
+ traceAndLog(`ChildProcess exit event emitted with code ${code}${andSignal} - exiting`);
136
+ clearInterval(interval);
137
+ process.exit(code !== null && code !== void 0 ? code : 1);
138
+ });
139
+ const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
140
+ signals.forEach((signal) => {
141
+ process.on(signal, () => {
142
+ traceAndLog(`Middle process received signal ${signal} - will attempt to kill child process tree, clear interval and exit`);
143
+ try {
144
+ clearInterval(interval);
145
+ traceAndLog(`Ran clearInterval in signal event ${signal} - exiting`);
146
+ process.exit(0);
147
+ }
148
+ catch (err) {
149
+ traceAndLog(`Error attempting to run clearInterval during signal event ${signal}: ${err instanceof Error ? err.toString() : err}`);
150
+ process.exit(1);
151
+ }
152
+ });
153
+ });
154
+ }
155
+ catch (err) {
156
+ const msg = `Unexpected error in runWhileParentAlive: ${err instanceof Error ? err.toString() : err}`;
157
+ console.error(msg);
158
+ logToFile(msg);
159
+ process.exit(1);
160
+ }
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuV2hpbGVQYXJlbnRBbGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5XaGlsZVBhcmVudEFsaXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw4RkFBOEY7QUFDOUYsMkRBQStEO0FBQy9ELHNEQUF3QjtBQUN4QixtRUFBZ0Q7QUFFaEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFBLENBQUMsOEVBQThFO0FBQ3hHLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQSxDQUFDLHFGQUFxRjtBQUMvRyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUEsQ0FBQyxxRkFBcUY7QUFDN0csSUFBSSxhQUFhLEdBQVcsOEJBQU0sQ0FBQyxxQ0FBcUMsQ0FBQSxDQUFDLG9FQUFvRTtBQUU3SSxTQUFTLFlBQVk7SUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUN0QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM1RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM1RCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN0RSxPQUFPLElBQUksS0FBSyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksWUFBWSxJQUFJLENBQUE7QUFDNUQsQ0FBQztB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
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Config to control a few misc settings in the node-cli-utils package. This module exports a singleton instance.
3
+ */
4
+ export declare class NodeCliUtilsConfig {
5
+ private _traceEnabled;
6
+ private _orphanProtectionPollingIntervalMillis;
7
+ private _orphanProtectionLoggingEnabled;
8
+ private _orphanProtectionLoggingPath;
9
+ get traceEnabled(): boolean;
10
+ set traceEnabled(value: boolean);
11
+ get orphanProtectionPollingIntervalMillis(): number;
12
+ set orphanProtectionPollingIntervalMillis(value: number);
13
+ get orphanProtectionLoggingEnabled(): boolean;
14
+ set orphanProtectionLoggingEnabled(value: boolean);
15
+ get orphanProtectionLoggingPath(): string;
16
+ }
17
+ /**
18
+ * Singleton instance of {@link NodeCliUtilsConfig}.
19
+ */
20
+ export declare const config: NodeCliUtilsConfig;
21
+ //# sourceMappingURL=NodeCliUtilsConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeCliUtilsConfig.d.ts","sourceRoot":"","sources":["../../src/NodeCliUtilsConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,sCAAsC,CAAQ;IACtD,OAAO,CAAC,+BAA+B,CAAQ;IAC/C,OAAO,CAAC,4BAA4B,CAA2B;IAE/D,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,EAE9B;IAED,IAAI,qCAAqC,IAAI,MAAM,CAElD;IAED,IAAI,qCAAqC,CAAC,KAAK,EAAE,MAAM,EAEtD;IAED,IAAI,8BAA8B,IAAI,OAAO,CAE5C;IAED,IAAI,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAEhD;IAED,IAAI,2BAA2B,IAAI,MAAM,CAExC;CACF;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,oBAA2B,CAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Config to control a few misc settings in the node-cli-utils package. This module exports a singleton instance.
3
+ */
4
+ export class NodeCliUtilsConfig {
5
+ _traceEnabled = false;
6
+ _orphanProtectionPollingIntervalMillis = 15000;
7
+ _orphanProtectionLoggingEnabled = false;
8
+ _orphanProtectionLoggingPath = './orphanProtection.log';
9
+ get traceEnabled() {
10
+ return this._traceEnabled;
11
+ }
12
+ set traceEnabled(value) {
13
+ this._traceEnabled = value;
14
+ }
15
+ get orphanProtectionPollingIntervalMillis() {
16
+ return this._orphanProtectionPollingIntervalMillis;
17
+ }
18
+ set orphanProtectionPollingIntervalMillis(value) {
19
+ this._orphanProtectionPollingIntervalMillis = value;
20
+ }
21
+ get orphanProtectionLoggingEnabled() {
22
+ return this._orphanProtectionLoggingEnabled;
23
+ }
24
+ set orphanProtectionLoggingEnabled(value) {
25
+ this._orphanProtectionLoggingEnabled = value;
26
+ }
27
+ get orphanProtectionLoggingPath() {
28
+ return this._orphanProtectionLoggingPath;
29
+ }
30
+ }
31
+ /**
32
+ * Singleton instance of {@link NodeCliUtilsConfig}.
33
+ */
34
+ export const config = new NodeCliUtilsConfig();
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZUNsaVV0aWxzQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL05vZGVDbGlVdGlsc0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUMvQixzQ0FBc0MsR0FBRyxLQUFLLENBQUE7SUFDOUMsK0JBQStCLEdBQUcsS0FBSyxDQUFBO0lBQ3ZDLDRCQUE0QixHQUFHLHdCQUF3QixDQUFBO0lBRS9ELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQTtJQUMzQixDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsS0FBYztRQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtJQUM1QixDQUFDO0lBRUQsSUFBSSxxQ0FBcUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsc0NBQXNDLENBQUE7SUFDcEQsQ0FBQztJQUVELElBQUkscUNBQXFDLENBQUMsS0FBYTtRQUNyRCxJQUFJLENBQUMsc0NBQXNDLEdBQUcsS0FBSyxDQUFBO0lBQ3JELENBQUM7SUFFRCxJQUFJLDhCQUE4QjtRQUNoQyxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsSUFBSSw4QkFBOEIsQ0FBQyxLQUFjO1FBQy9DLElBQUksQ0FBQywrQkFBK0IsR0FBRyxLQUFLLENBQUE7SUFDOUMsQ0FBQztJQUVELElBQUksMkJBQTJCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFBO0lBQzFDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQSJ9
@@ -0,0 +1,53 @@
1
+ import { whichSync } from './generalUtils.js';
2
+ export interface CreateTarballOptions {
3
+ /**
4
+ * A list of files or directories to exclude from the tarball.
5
+ * The paths should be relative to the directoryToTarball.
6
+ */
7
+ excludes?: string[];
8
+ }
9
+ export interface TarballUnpackOptions {
10
+ createDirIfNotExists?: boolean;
11
+ stripComponents?: number;
12
+ throwOnNonEmptyUnpackDir?: boolean;
13
+ }
14
+ /**
15
+ * This utility class exists so we can mock the `which` dependency in unit tests without resorting to libraries that hack the import system.
16
+ */
17
+ export declare class TarballUtility {
18
+ private whichSyncFn;
19
+ constructor(whichSyncFn: typeof whichSync);
20
+ /**
21
+ * Creates a gzipped tarball from a directory by spawning a process to run OS-installed `tar` to avoid pulling in npm package dependencies.
22
+ * Note that Windows has tar since Windows 10 1803 (see https://devblogs.microsoft.com/commandline/windows10v1803/.
23
+ *
24
+ * It's possible this isn't 100% reliable due to differences in `tar` versions across platforms. If better normalization
25
+ * is required, consider using the npm package `node-tar` instead.
26
+ * @param directoryToTarball The directory to tarball. The directory name will be used as the root directory in the tarball
27
+ * @param tarballPath The path to the tarball to create - must end with '.tar.gz'
28
+ * @param options See {@link CreateTarballOptions}
29
+ */
30
+ createTarball: (directoryToTarball: string, tarballPath: string, options?: CreateTarballOptions) => Promise<void>;
31
+ /**
32
+ * Unpacks a gzipped tarball by spawning a process to run OS-installed `tar` to avoid pulling in npm package dependencies.
33
+ * This method will throw an error if the unpackDirectory is not empty, unless the `throwOnNonEmptyUnpackDir` option is set to false.
34
+ * @param tarballPath The path to the tarball to unpack
35
+ * @param unpackDirectory The directory to unpack the tarball into
36
+ * @param options The options to use when unpacking the tarball. See {@link TarballUnpackOptions}.
37
+ */
38
+ unpackTarball: (tarballPath: string, unpackDirectory: string, options?: TarballUnpackOptions) => Promise<void>;
39
+ /**
40
+ * A more opinionated version of {@link unpackTarball} that assumes you want to create the directory and strip the first directory out of the unpacked files.
41
+ * @param tarballPath The path to the tarball to unpack
42
+ * @param unpackDirectory The directory to unpack the tarball into - will be created if it doesn't exist and will throw if it exists but is not empty
43
+ * @param stripComponents The number of leading directories to strip out of the unpacked files, defaults to 1
44
+ */
45
+ unpackTarballContents: (tarballPath: string, unpackDirectory: string, stripComponents?: number) => Promise<void>;
46
+ private isDirectory;
47
+ private dirIsNotEmpty;
48
+ private tryCreateDirectory;
49
+ }
50
+ export declare const createTarball: (directoryToTarball: string, tarballPath: string, options?: CreateTarballOptions) => Promise<void>;
51
+ export declare const unpackTarball: (tarballPath: string, unpackDirectory: string, options?: TarballUnpackOptions) => Promise<void>;
52
+ export declare const unpackTarballContents: (tarballPath: string, unpackDirectory: string, stripComponents?: number) => Promise<void>;
53
+ //# sourceMappingURL=TarballUtility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TarballUtility.d.ts","sourceRoot":"","sources":["../../src/TarballUtility.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8D,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAGzG,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wBAAwB,CAAC,EAAE,OAAO,CAAA;CACnC;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAkB;gBAEzB,WAAW,EAAE,OAAO,SAAS;IAIzC;;;;;;;;;OASG;IACH,aAAa,uBAA8B,MAAM,eAAe,MAAM,YAAY,oBAAoB,mBA4CrG;IAED;;;;;;OAMG;IACH,aAAa,gBAAuB,MAAM,mBAAmB,MAAM,YAAY,oBAAoB,mBA0ClG;IAED;;;;;OAKG;IACH,qBAAqB,gBAAuB,MAAM,mBAAmB,MAAM,oBAAmB,MAAM,mBAEnG;IAED,OAAO,CAAC,WAAW,CAOlB;IAED,OAAO,CAAC,aAAa,CAOpB;IAED,OAAO,CAAC,kBAAkB,CAUzB;CACF;AAID,eAAO,MAAM,aAAa,uBA5ImB,MAAM,eAAe,MAAM,YAAY,oBAAoB,kBA4IlD,CAAA;AACtD,eAAO,MAAM,aAAa,gBAxFY,MAAM,mBAAmB,MAAM,YAAY,oBAAoB,kBAwF/C,CAAA;AACtD,eAAO,MAAM,qBAAqB,gBAvCY,MAAM,mBAAmB,MAAM,oBAAmB,MAAM,kBAuChC,CAAA"}