@mono-labs/cli 0.0.237 → 0.0.242
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/bin/mono.js +1 -1
- package/dist/index.js +32 -51
- package/dist/lib/app.js +52 -0
- package/dist/lib/commands/build-process/boot.js +12 -0
- package/dist/lib/commands/build-process/cliFactory.js +145 -0
- package/dist/lib/commands/build-process/dataLayer.js +56 -0
- package/dist/lib/commands/build-process/index.js +11 -0
- package/dist/lib/commands/build-process/readEnv.js +34 -0
- package/dist/lib/commands/build-process/runMonoCommand.js +82 -0
- package/dist/lib/commands/build-process/runners/processManager.js +45 -0
- package/dist/lib/commands/build-process/runners/runBackground.js +46 -0
- package/dist/lib/commands/build-process/runners/runForeground.js +52 -0
- package/dist/lib/commands/build-process/test.js +32 -0
- package/dist/lib/commands/build-process/testflag.js +4 -0
- package/dist/lib/commands/build-process/validators.js +17 -0
- package/dist/lib/commands/loadFromRoot.js +53 -0
- package/dist/lib/commands/prune/index.js +10 -0
- package/dist/lib/commands/prune/prune.js +49 -0
- package/dist/lib/config.js +6 -0
- package/dist/lib/filterUnwantedEnvVars.js +88 -0
- package/dist/lib/generateNewEnvList.js +17 -0
- package/dist/lib/index.js +49 -0
- package/dist/src/cdk/cdk.js +6 -0
- package/dist/src/cdk/index.js +17 -0
- package/dist/{expo.js → src/expo.js} +18 -34
- package/dist/src/index.js +56 -0
- package/dist/src/merge-env.js +25 -0
- package/dist/{project → src/project}/build-mono-readme.js +11 -20
- package/dist/{project → src/project}/generate-readme.js +6 -13
- package/dist/{project → src/project}/index.js +4 -12
- package/dist/{stack.js → src/stack.js} +2 -2
- package/dist/src/tools.js +39 -0
- package/dist/types/index.d.ts +50 -9
- package/dist/types/lib/app.d.ts +3 -0
- package/dist/types/lib/commands/build-process/boot.d.ts +8 -0
- package/dist/types/lib/commands/build-process/cliFactory.d.ts +32 -0
- package/dist/types/lib/commands/build-process/dataLayer.d.ts +7 -0
- package/dist/types/lib/commands/build-process/readEnv.d.ts +1 -0
- package/dist/types/lib/commands/build-process/runMonoCommand.d.ts +10 -0
- package/dist/types/lib/commands/build-process/runners/processManager.d.ts +5 -0
- package/dist/types/lib/commands/build-process/runners/runBackground.d.ts +2 -0
- package/dist/types/lib/commands/build-process/runners/runForeground.d.ts +6 -0
- package/dist/types/lib/commands/build-process/test.d.ts +1 -0
- package/dist/types/lib/commands/build-process/testflag.d.ts +1 -0
- package/dist/types/lib/commands/build-process/validators.d.ts +1 -0
- package/dist/types/lib/commands/loadFromRoot.d.ts +7 -0
- package/dist/types/lib/commands/prune/prune.d.ts +1 -0
- package/dist/types/lib/config.d.ts +2 -0
- package/dist/types/lib/filterUnwantedEnvVars.d.ts +2 -0
- package/dist/types/lib/generateNewEnvList.d.ts +1 -0
- package/dist/types/lib/index.d.ts +2 -0
- package/dist/types/src/cdk/cdk.d.ts +1 -0
- package/dist/types/src/cdk/index.d.ts +1 -0
- package/dist/types/src/expo.d.ts +4 -0
- package/dist/types/src/index.d.ts +15 -0
- package/dist/types/src/project/build-mono-readme.d.ts +1 -0
- package/dist/types/src/project/generate-readme.d.ts +1 -0
- package/dist/types/{project → src/project}/index.d.ts +1 -1
- package/dist/types/src/project/merge-env.d.ts +1 -0
- package/dist/types/src/tools.d.ts +3 -0
- package/lib/app.d.ts +3 -0
- package/lib/app.ts +58 -0
- package/lib/commands/build-process/boot.d.ts +8 -0
- package/lib/commands/build-process/boot.ts +21 -0
- package/lib/commands/build-process/cliFactory.d.ts +32 -0
- package/lib/commands/build-process/cliFactory.ts +219 -0
- package/lib/commands/build-process/dataLayer.d.ts +7 -0
- package/lib/commands/build-process/dataLayer.ts +61 -0
- package/lib/commands/build-process/index.d.ts +1 -0
- package/lib/commands/build-process/index.ts +14 -0
- package/lib/commands/build-process/readEnv.d.ts +1 -0
- package/lib/commands/build-process/readEnv.ts +37 -0
- package/lib/commands/build-process/runMonoCommand.d.ts +10 -0
- package/lib/commands/build-process/runMonoCommand.ts +96 -0
- package/lib/commands/build-process/runners/processManager.d.ts +5 -0
- package/lib/commands/build-process/runners/processManager.ts +42 -0
- package/lib/commands/build-process/runners/runBackground.d.ts +2 -0
- package/lib/commands/build-process/runners/runBackground.ts +56 -0
- package/lib/commands/build-process/runners/runForeground.d.ts +6 -0
- package/lib/commands/build-process/runners/runForeground.ts +59 -0
- package/lib/commands/build-process/test.d.ts +1 -0
- package/lib/commands/build-process/test.ts +42 -0
- package/lib/commands/build-process/testflag.d.ts +1 -0
- package/lib/commands/build-process/testflag.ts +1 -0
- package/lib/commands/build-process/validators.d.ts +1 -0
- package/lib/commands/build-process/validators.ts +16 -0
- package/lib/commands/loadFromRoot.d.ts +7 -0
- package/lib/commands/loadFromRoot.ts +51 -0
- package/lib/commands/prune/index.d.ts +1 -0
- package/lib/commands/prune/index.ts +9 -0
- package/lib/commands/prune/prune.d.ts +1 -0
- package/lib/commands/prune/prune.ts +50 -0
- package/lib/config.d.ts +2 -0
- package/lib/filterUnwantedEnvVars.d.ts +2 -0
- package/lib/filterUnwantedEnvVars.ts +95 -0
- package/lib/generateNewEnvList.d.ts +1 -0
- package/lib/generateNewEnvList.ts +17 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.ts +59 -0
- package/package.json +99 -84
- package/src/cdk/cdk.d.ts +1 -7
- package/src/cdk/cdk.ts +1 -0
- package/src/cdk/index.d.ts +1 -0
- package/src/cdk/index.ts +1 -0
- package/src/expo-files/filterUnwantedEnvVars.d.ts +3 -0
- package/src/expo-files/filterUnwantedEnvVars.ts +141 -144
- package/src/expo.d.ts +2 -9
- package/src/expo.ts +116 -0
- package/src/index.d.ts +22 -0
- package/src/index.ts +39 -42
- package/src/loadFromRoot.d.ts +32 -0
- package/src/merge-env.d.ts +1 -0
- package/src/merge-env.ts +24 -0
- package/src/project/build-mono-readme.d.ts +1 -0
- package/src/project/build-mono-readme.ts +460 -514
- package/src/project/build-readme.d.ts +2 -0
- package/src/project/generate-docs.d.ts +11 -0
- package/src/project/generate-readme.d.ts +1 -0
- package/src/project/generate-readme.ts +259 -284
- package/src/project/index.d.ts +45 -0
- package/src/project/index.ts +134 -144
- package/src/project/merge-env.d.ts +1 -0
- package/src/stack.d.ts +21 -0
- package/src/stack.ts +54 -55
- package/src/tools.d.ts +3 -4
- package/src/tools.ts +48 -0
- package/src/types/expo-config.d.ts +49 -0
- package/dist/cdk/index.js +0 -55
- package/dist/project/merge-env.js +0 -31
- package/dist/tools.js +0 -35
- package/dist/types/cdk/index.d.ts +0 -2
- package/dist/types/expo.d.ts +0 -3
- package/dist/types/merge-env.d.ts +0 -1
- package/dist/types/tools.d.ts +0 -1
- package/lib/app.js +0 -49
- package/lib/commands/build-process/boot.js +0 -15
- package/lib/commands/build-process/cliFactory.js +0 -161
- package/lib/commands/build-process/dataLayer.js +0 -59
- package/lib/commands/build-process/index.js +0 -13
- package/lib/commands/build-process/readEnv.js +0 -37
- package/lib/commands/build-process/runMonoCommand.js +0 -102
- package/lib/commands/build-process/runners/processManager.js +0 -38
- package/lib/commands/build-process/runners/runBackground.js +0 -60
- package/lib/commands/build-process/runners/runForeground.js +0 -60
- package/lib/commands/build-process/test.js +0 -50
- package/lib/commands/build-process/testflag.js +0 -1
- package/lib/commands/build-process/validators.js +0 -17
- package/lib/commands/generate/generateSeed.js +0 -223
- package/lib/commands/generate/index.js +0 -30
- package/lib/commands/loadFromRoot.js +0 -55
- package/lib/commands/prune/index.js +0 -12
- package/lib/commands/prune/prune.js +0 -50
- package/lib/commands/seed/import.js +0 -30
- package/lib/commands/seed/index.js +0 -12
- package/lib/commands/submit/index.js +0 -38
- package/lib/commands/update/eas.js +0 -39
- package/lib/commands/update/index.js +0 -87
- package/lib/filterUnwantedEnvVars.js +0 -123
- package/lib/generateNewEnvList.js +0 -14
- package/lib/index.js +0 -58
- package/src/cdk/index.js +0 -59
- package/src/expo.js +0 -133
- package/src/merge-env.js +0 -32
- package/src/tools.js +0 -36
- package/types.d.ts +0 -83
- /package/dist/{expo-files → src/expo-files}/filterUnwantedEnvVars.js +0 -0
- /package/dist/{loadFromRoot.js → src/loadFromRoot.js} +0 -0
- /package/dist/{project → src/project}/build-readme.js +0 -0
- /package/dist/{project → src/project}/generate-docs.js +0 -0
- /package/dist/{merge-env.js → src/project/merge-env.js} +0 -0
- /package/dist/types/{project/build-mono-readme.d.ts → lib/commands/build-process/index.d.ts} +0 -0
- /package/dist/types/{project/generate-readme.d.ts → lib/commands/prune/index.d.ts} +0 -0
- /package/dist/types/{expo-files → src/expo-files}/filterUnwantedEnvVars.d.ts +0 -0
- /package/dist/types/{loadFromRoot.d.ts → src/loadFromRoot.d.ts} +0 -0
- /package/dist/types/{project → src}/merge-env.d.ts +0 -0
- /package/dist/types/{project → src/project}/build-readme.d.ts +0 -0
- /package/dist/types/{project → src/project}/generate-docs.d.ts +0 -0
- /package/dist/types/{stack.d.ts → src/stack.d.ts} +0 -0
- /package/lib/{config.js → config.ts} +0 -0
package/bin/mono.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
require('../dist/lib/index.js')
|
package/dist/index.js
CHANGED
|
@@ -1,56 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Main entry point for @mono-labs/cli package
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.filterUnwantedEnvVarsEAS = exports.filterUnwantedEnvVars = exports.generateNewEnvList = void 0;
|
|
5
|
-
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
10
|
-
|
|
11
|
-
Object.defineProperty(exports, "
|
|
12
|
-
Object.defineProperty(exports, "
|
|
13
|
-
Object.defineProperty(exports, "
|
|
14
|
-
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
* ------------------------------------------------------------------ */
|
|
33
|
-
function replaceTokens(str, env) {
|
|
34
|
-
if (typeof str !== 'string')
|
|
35
|
-
return str;
|
|
36
|
-
return str.replace(/\$\{([^}]+)\}|\$([A-Z0-9_]+)/g, (_match, k1, k2) => {
|
|
37
|
-
const key = k1 || k2;
|
|
38
|
-
// data layer takes priority
|
|
39
|
-
if (hasData(key)) {
|
|
40
|
-
const val = getData(key);
|
|
41
|
-
return val == null ? '' : String(val);
|
|
42
|
-
}
|
|
43
|
-
// environment variables
|
|
44
|
-
if (env && Object.prototype.hasOwnProperty.call(env, key)) {
|
|
45
|
-
const val = env[key];
|
|
46
|
-
return val == null ? '' : String(val);
|
|
47
|
-
}
|
|
48
|
-
return '';
|
|
49
|
-
});
|
|
50
|
-
}
|
|
4
|
+
exports.verifyOptionValue = exports.runMonoCommand = exports.buildCommands = exports.getRootJson = exports.getRootDirectory = exports.getMonoConfig = exports.boot = exports.hasData = exports.getData = exports.mergeData = exports.setData = exports.replaceTokens = exports.filterUnwantedEnvVarsEAS = exports.filterUnwantedEnvVars = exports.generateNewEnvList = void 0;
|
|
5
|
+
var generateNewEnvList_1 = require("./lib/generateNewEnvList");
|
|
6
|
+
Object.defineProperty(exports, "generateNewEnvList", { enumerable: true, get: function () { return generateNewEnvList_1.generateNewEnvList; } });
|
|
7
|
+
var filterUnwantedEnvVars_1 = require("./lib/filterUnwantedEnvVars");
|
|
8
|
+
Object.defineProperty(exports, "filterUnwantedEnvVars", { enumerable: true, get: function () { return filterUnwantedEnvVars_1.filterUnwantedEnvVars; } });
|
|
9
|
+
Object.defineProperty(exports, "filterUnwantedEnvVarsEAS", { enumerable: true, get: function () { return filterUnwantedEnvVars_1.filterUnwantedEnvVarsEAS; } });
|
|
10
|
+
var dataLayer_1 = require("./lib/commands/build-process/dataLayer");
|
|
11
|
+
Object.defineProperty(exports, "replaceTokens", { enumerable: true, get: function () { return dataLayer_1.replaceTokens; } });
|
|
12
|
+
Object.defineProperty(exports, "setData", { enumerable: true, get: function () { return dataLayer_1.setData; } });
|
|
13
|
+
Object.defineProperty(exports, "mergeData", { enumerable: true, get: function () { return dataLayer_1.mergeData; } });
|
|
14
|
+
Object.defineProperty(exports, "getData", { enumerable: true, get: function () { return dataLayer_1.getData; } });
|
|
15
|
+
Object.defineProperty(exports, "hasData", { enumerable: true, get: function () { return dataLayer_1.hasData; } });
|
|
16
|
+
var boot_1 = require("./lib/commands/build-process/boot");
|
|
17
|
+
Object.defineProperty(exports, "boot", { enumerable: true, get: function () { return boot_1.boot; } });
|
|
18
|
+
var loadFromRoot_1 = require("./lib/commands/loadFromRoot");
|
|
19
|
+
Object.defineProperty(exports, "getMonoConfig", { enumerable: true, get: function () { return loadFromRoot_1.getMonoConfig; } });
|
|
20
|
+
Object.defineProperty(exports, "getRootDirectory", { enumerable: true, get: function () { return loadFromRoot_1.getRootDirectory; } });
|
|
21
|
+
Object.defineProperty(exports, "getRootJson", { enumerable: true, get: function () { return loadFromRoot_1.getRootJson; } });
|
|
22
|
+
var cliFactory_1 = require("./lib/commands/build-process/cliFactory");
|
|
23
|
+
Object.defineProperty(exports, "buildCommands", { enumerable: true, get: function () { return cliFactory_1.buildCommands; } });
|
|
24
|
+
var runMonoCommand_1 = require("./lib/commands/build-process/runMonoCommand");
|
|
25
|
+
Object.defineProperty(exports, "runMonoCommand", { enumerable: true, get: function () { return runMonoCommand_1.runMonoCommand; } });
|
|
26
|
+
var validators_1 = require("./lib/commands/build-process/validators");
|
|
27
|
+
Object.defineProperty(exports, "verifyOptionValue", { enumerable: true, get: function () { return validators_1.verifyOptionValue; } });
|
|
28
|
+
const generateNewEnvList_2 = require("./lib/generateNewEnvList");
|
|
29
|
+
const filterUnwantedEnvVars_2 = require("./lib/filterUnwantedEnvVars");
|
|
30
|
+
const dataLayer_2 = require("./lib/commands/build-process/dataLayer");
|
|
31
|
+
// Default export for convenience
|
|
51
32
|
exports.default = {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
filterUnwantedEnvVars:
|
|
55
|
-
filterUnwantedEnvVarsEAS:
|
|
33
|
+
replaceTokens: dataLayer_2.replaceTokens,
|
|
34
|
+
generateNewEnvList: generateNewEnvList_2.generateNewEnvList,
|
|
35
|
+
filterUnwantedEnvVars: filterUnwantedEnvVars_2.filterUnwantedEnvVars,
|
|
36
|
+
filterUnwantedEnvVarsEAS: filterUnwantedEnvVars_2.filterUnwantedEnvVarsEAS,
|
|
56
37
|
};
|
package/dist/lib/app.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
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.generateEnvValues = exports.program = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const config_1 = require("./config");
|
|
9
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
11
|
+
function findNearestPackageJson(startDir) {
|
|
12
|
+
let current = startDir;
|
|
13
|
+
while (true) {
|
|
14
|
+
const candidate = (0, node_path_1.join)(current, 'package.json');
|
|
15
|
+
if (node_fs_1.default.existsSync(candidate))
|
|
16
|
+
return candidate;
|
|
17
|
+
const parent = (0, node_path_1.dirname)(current);
|
|
18
|
+
if (parent === current) {
|
|
19
|
+
throw new Error('Unable to locate package.json for CLI');
|
|
20
|
+
}
|
|
21
|
+
current = parent;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const pkgPath = findNearestPackageJson(__dirname);
|
|
25
|
+
const pkg = JSON.parse(node_fs_1.default.readFileSync(pkgPath, 'utf8'));
|
|
26
|
+
const version = pkg.version || '0.0.1';
|
|
27
|
+
exports.program = new commander_1.Command();
|
|
28
|
+
const getBinFromPackageJSON = () => {
|
|
29
|
+
const keyList = Object.keys(pkg.bin ?? {});
|
|
30
|
+
if (keyList.length === 0) {
|
|
31
|
+
throw new Error('No bin field found in package.json');
|
|
32
|
+
}
|
|
33
|
+
return keyList[0];
|
|
34
|
+
};
|
|
35
|
+
const programName = getBinFromPackageJSON();
|
|
36
|
+
exports.program
|
|
37
|
+
.name(programName)
|
|
38
|
+
.description(pkg.description || '')
|
|
39
|
+
.version(version);
|
|
40
|
+
const NEXT_PUBLIC_API_URL = ((process.env.NEXT_PUBLIC_API_URL &&
|
|
41
|
+
process.env.NEXT_PUBLIC_API_URL.length > 0) ||
|
|
42
|
+
config_1.STAGING_URL);
|
|
43
|
+
const generateEnvValues = (forceProd = false, ngrokUrl = 'localhost:3000', useAtlas = false) => {
|
|
44
|
+
return {
|
|
45
|
+
...process.env,
|
|
46
|
+
NEXT_PUBLIC_API_URL,
|
|
47
|
+
NEXT_FORCE_PROD: String(forceProd),
|
|
48
|
+
EXPO_PRIVATE_API_URL: ngrokUrl,
|
|
49
|
+
EXPO_UNSTABLE_ATLAS: String(useAtlas),
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
exports.generateEnvValues = generateEnvValues;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.boot = boot;
|
|
4
|
+
// Boot logic: load root + mono configuration
|
|
5
|
+
const loadFromRoot_1 = require("../loadFromRoot");
|
|
6
|
+
function boot() {
|
|
7
|
+
const rootDir = (0, loadFromRoot_1.getRootDirectory)();
|
|
8
|
+
const rootJson = (0, loadFromRoot_1.getRootJson)();
|
|
9
|
+
const { files, config } = (0, loadFromRoot_1.getMonoConfig)();
|
|
10
|
+
return { rootDir, rootJson, files, config };
|
|
11
|
+
}
|
|
12
|
+
exports.default = boot;
|
|
@@ -0,0 +1,145 @@
|
|
|
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.createConfigCommands = createConfigCommands;
|
|
7
|
+
exports.createCliCommands = createCliCommands;
|
|
8
|
+
exports.buildCommands = buildCommands;
|
|
9
|
+
const app_1 = require("../../app");
|
|
10
|
+
const commander_1 = require("commander");
|
|
11
|
+
const runMonoCommand_1 = __importDefault(require("./runMonoCommand"));
|
|
12
|
+
const validators_1 = require("./validators");
|
|
13
|
+
const dataLayer_1 = require("./dataLayer");
|
|
14
|
+
const loadFromRoot_1 = require("../loadFromRoot");
|
|
15
|
+
const prune_1 = require("../prune/prune");
|
|
16
|
+
const testflag_1 = require("./testflag");
|
|
17
|
+
function buildDefaultLookup(config) {
|
|
18
|
+
const defaults = {};
|
|
19
|
+
// Handle argument default
|
|
20
|
+
if (config.argument?.default !== undefined) {
|
|
21
|
+
defaults.arg = config.argument.default;
|
|
22
|
+
}
|
|
23
|
+
// Handle options defaults
|
|
24
|
+
if (config.options) {
|
|
25
|
+
for (const [key, option] of Object.entries(config.options)) {
|
|
26
|
+
if (option.default !== undefined) {
|
|
27
|
+
defaults[key] = option.default;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return defaults;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Register commander commands for each mono file definition.
|
|
35
|
+
* Handles argument, options, validation, and action wiring.
|
|
36
|
+
*/
|
|
37
|
+
function createConfigCommands() {
|
|
38
|
+
const config = new commander_1.Command('config').description('Manage configuration');
|
|
39
|
+
config
|
|
40
|
+
.command('set <key> <value>')
|
|
41
|
+
.description('Set a configuration value')
|
|
42
|
+
.action((_key, _value) => { });
|
|
43
|
+
config
|
|
44
|
+
.command('get <key>')
|
|
45
|
+
.description('Get a configuration value')
|
|
46
|
+
.action((_key) => { });
|
|
47
|
+
config
|
|
48
|
+
.command('list')
|
|
49
|
+
.description('List all configuration values')
|
|
50
|
+
.action(() => { });
|
|
51
|
+
return config;
|
|
52
|
+
}
|
|
53
|
+
function createCliCommands() {
|
|
54
|
+
const tools = new commander_1.Command('tools').description('Manage tools');
|
|
55
|
+
tools
|
|
56
|
+
.command('prune')
|
|
57
|
+
.description('Prune unused branches in git')
|
|
58
|
+
.action(() => {
|
|
59
|
+
(0, prune_1.pruneRepo)();
|
|
60
|
+
});
|
|
61
|
+
return tools;
|
|
62
|
+
}
|
|
63
|
+
function buildCommands(files) {
|
|
64
|
+
try {
|
|
65
|
+
const { config } = (0, loadFromRoot_1.getMonoConfig)();
|
|
66
|
+
Object.entries(files).forEach(([commandName, configObject]) => {
|
|
67
|
+
const optionsData = configObject.options || {};
|
|
68
|
+
let current = app_1.program
|
|
69
|
+
.command(commandName)
|
|
70
|
+
.description(configObject.description || 'Mono command');
|
|
71
|
+
const argInfo = configObject.argument;
|
|
72
|
+
// Argument
|
|
73
|
+
if (argInfo) {
|
|
74
|
+
const required = !!argInfo.required;
|
|
75
|
+
const type = argInfo.type || 'string';
|
|
76
|
+
const argSpec = required ? `<${type}>` : `[${type}]`;
|
|
77
|
+
current = current.argument(argSpec, argInfo.description || '');
|
|
78
|
+
}
|
|
79
|
+
// Options
|
|
80
|
+
Object.entries(optionsData).forEach(([optionKey, meta]) => {
|
|
81
|
+
const type = meta.type || 'boolean';
|
|
82
|
+
const shortcut = meta.shortcut ? `-${meta.shortcut}, ` : '';
|
|
83
|
+
if (type === 'string') {
|
|
84
|
+
current = current.option(`${shortcut}--${optionKey} <${optionKey}>`, meta.description || '');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
current = current.option(`${shortcut}--${optionKey}`, meta.description || '');
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
config.prodFlag = config.prodFlag || 'prod';
|
|
91
|
+
current = current.option(`--${config.prodFlag}`, 'Process execution mode: prduction or dev', false);
|
|
92
|
+
current.action(async (arg, cmd) => {
|
|
93
|
+
const envDefaults = {};
|
|
94
|
+
const optionValueList = argInfo?.options;
|
|
95
|
+
let actualOptions = optionValueList;
|
|
96
|
+
if (optionValueList) {
|
|
97
|
+
actualOptions = argInfo?.allowAll ? [...optionValueList, 'all'] : [...optionValueList];
|
|
98
|
+
}
|
|
99
|
+
if (argInfo) {
|
|
100
|
+
if (argInfo &&
|
|
101
|
+
optionValueList &&
|
|
102
|
+
actualOptions &&
|
|
103
|
+
!actualOptions.includes(String(arg ?? argInfo.default))) {
|
|
104
|
+
throw new Error(`Invalid argument value for ${commandName}, must be one of: ${actualOptions.join(', ')}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const optionsDataList = Object.keys(optionsData).map((key) => ({
|
|
108
|
+
...optionsData[key],
|
|
109
|
+
name: key,
|
|
110
|
+
}));
|
|
111
|
+
optionsDataList.forEach((item) => {
|
|
112
|
+
if (item.default) {
|
|
113
|
+
envDefaults[item.name] = item.default;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
try {
|
|
117
|
+
const optionVals = {
|
|
118
|
+
...envDefaults,
|
|
119
|
+
...(cmd.opts ? cmd.opts() : cmd),
|
|
120
|
+
};
|
|
121
|
+
Object.keys(optionVals).forEach((k) => {
|
|
122
|
+
optionVals[k] = (0, validators_1.verifyOptionValue)(k, optionVals[k], optionsData);
|
|
123
|
+
});
|
|
124
|
+
optionVals['prod'] = optionVals[config.prodFlag] || false;
|
|
125
|
+
const defaultLookups = buildDefaultLookup(configObject);
|
|
126
|
+
const argVal = arg || configObject.argument?.default;
|
|
127
|
+
const args = { ...defaultLookups, arg: argVal };
|
|
128
|
+
if (testflag_1.testFlag) {
|
|
129
|
+
console.log('defaults', optionVals);
|
|
130
|
+
console.log('object', { ...optionVals, ...args });
|
|
131
|
+
}
|
|
132
|
+
(0, dataLayer_1.mergeData)({ ...optionVals, ...args });
|
|
133
|
+
await (0, runMonoCommand_1.default)(configObject, optionVals);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
console.error('Error executing mono command:', err?.message);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
console.error('Error executing mono command:', err?.message);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.default = buildCommands;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Shared mutable key/value store for build-process commands.
|
|
3
|
+
// Extracts dynamic values from preactions and holds defaults from options.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.setData = setData;
|
|
6
|
+
exports.mergeData = mergeData;
|
|
7
|
+
exports.getData = getData;
|
|
8
|
+
exports.hasData = hasData;
|
|
9
|
+
exports.replaceTokens = replaceTokens;
|
|
10
|
+
const testflag_1 = require("./testflag");
|
|
11
|
+
const dataLayer = {};
|
|
12
|
+
function setData(key, value) {
|
|
13
|
+
if (testflag_1.testFlag) {
|
|
14
|
+
console.log(`→ dataLayer set: ${key} = ${String(value)}`);
|
|
15
|
+
}
|
|
16
|
+
if (value !== undefined)
|
|
17
|
+
dataLayer[key] = value;
|
|
18
|
+
}
|
|
19
|
+
function mergeData(obj = {}) {
|
|
20
|
+
if (testflag_1.testFlag) {
|
|
21
|
+
console.log(`→ dataLayer mergeData: ${JSON.stringify(obj)}`);
|
|
22
|
+
}
|
|
23
|
+
Object.entries(obj).forEach(([k, v]) => setData(k, v));
|
|
24
|
+
return dataLayer;
|
|
25
|
+
}
|
|
26
|
+
function getData(key) {
|
|
27
|
+
if (testflag_1.testFlag) {
|
|
28
|
+
console.log(`→ dataLayer get: ${String(key)}`);
|
|
29
|
+
}
|
|
30
|
+
return key ? dataLayer[key] : dataLayer;
|
|
31
|
+
}
|
|
32
|
+
function hasData(key) {
|
|
33
|
+
return Object.prototype.hasOwnProperty.call(dataLayer, key);
|
|
34
|
+
}
|
|
35
|
+
function replaceTokens(str, env) {
|
|
36
|
+
if (typeof str !== 'string')
|
|
37
|
+
return str;
|
|
38
|
+
console.log('→ replaceTokens called');
|
|
39
|
+
console.log('dataLayer:', dataLayer);
|
|
40
|
+
return str.replace(/\$\{([^}]+)\}|\$([A-Z0-9_]+)/g, (_m, k1, k2) => {
|
|
41
|
+
const k = (k1 || k2);
|
|
42
|
+
// existing data layer takes priority
|
|
43
|
+
if (hasData(k)) {
|
|
44
|
+
const val = getData(k);
|
|
45
|
+
return val == null ? '' : String(val);
|
|
46
|
+
}
|
|
47
|
+
// environment variables
|
|
48
|
+
if (env && Object.prototype.hasOwnProperty.call(env, k)) {
|
|
49
|
+
const val = env[k];
|
|
50
|
+
return val == null ? '' : String(val);
|
|
51
|
+
}
|
|
52
|
+
// fallback
|
|
53
|
+
return '';
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
exports.default = dataLayer;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Orchestrator for modular build-process command system.
|
|
4
|
+
const boot_1 = require("./boot");
|
|
5
|
+
const cliFactory_1 = require("./cliFactory");
|
|
6
|
+
const processManager_1 = require("./runners/processManager");
|
|
7
|
+
const app_1 = require("../../app");
|
|
8
|
+
const { files } = (0, boot_1.boot)();
|
|
9
|
+
(0, processManager_1.ensureSignalHandlers)();
|
|
10
|
+
(0, cliFactory_1.buildCommands)(files);
|
|
11
|
+
app_1.program.addCommand((0, cliFactory_1.createCliCommands)());
|
|
@@ -0,0 +1,34 @@
|
|
|
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.parseEnvFile = parseEnvFile;
|
|
7
|
+
// scripts/read-env.mjs
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
function parseEnvFile(filePath) {
|
|
10
|
+
if (!node_fs_1.default.existsSync(filePath)) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
const content = node_fs_1.default.readFileSync(filePath, 'utf8');
|
|
14
|
+
const keymap = {};
|
|
15
|
+
for (const line of content.split(/\r?\n/)) {
|
|
16
|
+
const trimmed = line.trim();
|
|
17
|
+
// skip empty lines and comments
|
|
18
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
19
|
+
continue;
|
|
20
|
+
// split on first "=" only
|
|
21
|
+
const idx = trimmed.indexOf('=');
|
|
22
|
+
if (idx === -1)
|
|
23
|
+
continue;
|
|
24
|
+
const key = trimmed.slice(0, idx).trim();
|
|
25
|
+
let value = trimmed.slice(idx + 1).trim();
|
|
26
|
+
// strip surrounding quotes if present
|
|
27
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
28
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
29
|
+
value = value.slice(1, -1);
|
|
30
|
+
}
|
|
31
|
+
keymap[key] = value;
|
|
32
|
+
}
|
|
33
|
+
return keymap;
|
|
34
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
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.getAllowAllKeys = getAllowAllKeys;
|
|
7
|
+
exports.runMonoCommand = runMonoCommand;
|
|
8
|
+
const runForeground_1 = require("./runners/runForeground");
|
|
9
|
+
const runBackground_1 = require("./runners/runBackground");
|
|
10
|
+
const processManager_1 = require("./runners/processManager");
|
|
11
|
+
const loadFromRoot_1 = require("../loadFromRoot");
|
|
12
|
+
const readEnv_1 = require("./readEnv");
|
|
13
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
|
+
function getAllowAllKeys(cfg) {
|
|
15
|
+
const decls = cfg.options ?? {};
|
|
16
|
+
return Object.entries(decls)
|
|
17
|
+
.filter(([, v]) => Boolean(v?.allowAll) &&
|
|
18
|
+
Array.isArray(v?.options) &&
|
|
19
|
+
v.options.length > 0)
|
|
20
|
+
.map(([k]) => k);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Orchestrate execution of a single mono command definition.
|
|
24
|
+
* Phases:
|
|
25
|
+
* 1. Preactions (sequential, blocking) via runForeground
|
|
26
|
+
* 2. Actions (background except last; last attached) via runBackground
|
|
27
|
+
* Environment selection based on --stage flag and injection of AWS_PROFILE.
|
|
28
|
+
*/
|
|
29
|
+
async function runMonoCommand(configObject, options = {}) {
|
|
30
|
+
const { config } = (0, loadFromRoot_1.getMonoConfig)();
|
|
31
|
+
const devConfig = configObject.environments?.dev ?? {};
|
|
32
|
+
console.log('configObject:', JSON.stringify(configObject, null, 2));
|
|
33
|
+
// Usage:
|
|
34
|
+
const envPath = node_path_1.default.resolve(process.cwd(), '.env');
|
|
35
|
+
const keymap = (0, readEnv_1.parseEnvFile)(envPath);
|
|
36
|
+
const prodConfig = configObject.environments?.prod ?? {};
|
|
37
|
+
const awsProfile = process.env.CDK_DEPLOY_PROFILE || 'default';
|
|
38
|
+
const envObjBase = options.prod ? { ...prodConfig } : { ...devConfig };
|
|
39
|
+
Object.keys(envObjBase).forEach((k) => {
|
|
40
|
+
if (typeof envObjBase[k] === 'string' &&
|
|
41
|
+
envObjBase[k].startsWith('$') &&
|
|
42
|
+
!envObjBase[k].startsWith('${')) {
|
|
43
|
+
const refKey = envObjBase[k].substring(1);
|
|
44
|
+
envObjBase[k] = keymap[refKey] || '';
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
envObjBase.AWS_PROFILE = awsProfile;
|
|
48
|
+
const envKeys = Object.keys(process.env).filter((k) => k.startsWith('MONO_'));
|
|
49
|
+
const envMapList = config.envMap ?? ['FAILURE'];
|
|
50
|
+
const combinedEnv = { ...process.env, ...envObjBase };
|
|
51
|
+
const envMapVals = {};
|
|
52
|
+
envKeys.forEach((k) => {
|
|
53
|
+
envMapList.forEach((item) => {
|
|
54
|
+
envMapVals[k.replace('MONO', item)] = combinedEnv[k];
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
const envObj = { ...envObjBase, ...envMapVals };
|
|
58
|
+
const preactions = configObject.preactions ?? [];
|
|
59
|
+
const actions = configObject.actions ?? [];
|
|
60
|
+
console.log(`→ Executing mono command: ${configObject.name || 'Unnamed Command'}`);
|
|
61
|
+
console.log(`→ Using AWS profile: ${awsProfile}`);
|
|
62
|
+
console.log(`→ Using environment: ${options.stage ? 'stage' : 'dev'}`);
|
|
63
|
+
console.log('→ Environment variables:', envObj);
|
|
64
|
+
// Run preactions sequentially
|
|
65
|
+
for (const cmd of preactions) {
|
|
66
|
+
await (0, runForeground_1.runForeground)(cmd, envObj);
|
|
67
|
+
}
|
|
68
|
+
if (actions.length === 0)
|
|
69
|
+
return;
|
|
70
|
+
const bg = actions.slice(0, -1);
|
|
71
|
+
const fg = actions[actions.length - 1];
|
|
72
|
+
for (const cmd of bg) {
|
|
73
|
+
void (0, runBackground_1.runBackground)(cmd, envObj, 'background');
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
await (0, runBackground_1.runBackground)(fg, envObj, 'foreground', true);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
(0, processManager_1.killAllBackground)();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.default = runMonoCommand;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bgChildren = void 0;
|
|
4
|
+
exports.registerBackground = registerBackground;
|
|
5
|
+
exports.killAllBackground = killAllBackground;
|
|
6
|
+
exports.ensureSignalHandlers = ensureSignalHandlers;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
// Track background processes so we can kill them on exit
|
|
9
|
+
exports.bgChildren = new Set();
|
|
10
|
+
function registerBackground(child) {
|
|
11
|
+
exports.bgChildren.add(child);
|
|
12
|
+
}
|
|
13
|
+
function killAllBackground() {
|
|
14
|
+
for (const child of Array.from(exports.bgChildren)) {
|
|
15
|
+
try {
|
|
16
|
+
if (process.platform === 'win32') {
|
|
17
|
+
(0, child_process_1.spawn)('taskkill', ['/PID', String(child.pid), '/T', '/F'], {
|
|
18
|
+
shell: true,
|
|
19
|
+
stdio: 'ignore',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
else if (child.pid) {
|
|
23
|
+
process.kill(-child.pid, 'SIGTERM');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// ignore
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.bgChildren.clear();
|
|
31
|
+
}
|
|
32
|
+
let signalsRegistered = false;
|
|
33
|
+
function ensureSignalHandlers() {
|
|
34
|
+
if (signalsRegistered)
|
|
35
|
+
return;
|
|
36
|
+
signalsRegistered = true;
|
|
37
|
+
process.on('SIGINT', () => {
|
|
38
|
+
killAllBackground();
|
|
39
|
+
process.exit(130);
|
|
40
|
+
});
|
|
41
|
+
process.on('SIGTERM', () => {
|
|
42
|
+
killAllBackground();
|
|
43
|
+
process.exit(143);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runBackground = runBackground;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const dataLayer_1 = require("../dataLayer");
|
|
6
|
+
const processManager_1 = require("./processManager");
|
|
7
|
+
function createdExpandedEnv(envObj) {
|
|
8
|
+
const expandedEnv = {};
|
|
9
|
+
for (const k of Object.keys(envObj)) {
|
|
10
|
+
const v = envObj[k];
|
|
11
|
+
expandedEnv[k] = typeof v === 'string' ? (0, dataLayer_1.replaceTokens)(v) : v;
|
|
12
|
+
}
|
|
13
|
+
return expandedEnv;
|
|
14
|
+
}
|
|
15
|
+
function runBackground(cmd, envObj = {}, logName = 'background', attached = false) {
|
|
16
|
+
const isWin = process.platform === 'win32';
|
|
17
|
+
// Replace ${field} tokens in env values using dataLayer
|
|
18
|
+
const expandedEnv = createdExpandedEnv(envObj);
|
|
19
|
+
console.log(`→ ${logName} action ${attached ? '(attached)' : ''}: ${cmd}`);
|
|
20
|
+
// Replace in command string
|
|
21
|
+
const outCmd = (0, dataLayer_1.replaceTokens)(cmd);
|
|
22
|
+
console.log(`→ ${logName} action ${attached ? '(attached)' : ''}: ${outCmd}`);
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const child = (0, child_process_1.spawn)(outCmd, {
|
|
25
|
+
shell: true,
|
|
26
|
+
stdio: attached ? 'inherit' : 'ignore',
|
|
27
|
+
env: { ...process.env, ...expandedEnv },
|
|
28
|
+
detached: !attached && !isWin,
|
|
29
|
+
windowsHide: !attached && isWin,
|
|
30
|
+
});
|
|
31
|
+
if (!attached && !isWin)
|
|
32
|
+
child.unref();
|
|
33
|
+
(0, processManager_1.registerBackground)(child);
|
|
34
|
+
child.once('error', (err) => {
|
|
35
|
+
reject(err);
|
|
36
|
+
});
|
|
37
|
+
child.once('exit', (code, signal) => {
|
|
38
|
+
if (signal)
|
|
39
|
+
return reject(new Error(`${cmd} exited via signal ${signal}`));
|
|
40
|
+
if (code === 0)
|
|
41
|
+
return resolve();
|
|
42
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
exports.default = runBackground;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runForeground = runForeground;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const dataLayer_1 = require("../dataLayer");
|
|
6
|
+
const filterUnwantedEnvVars_1 = require("../../../../lib/filterUnwantedEnvVars");
|
|
7
|
+
// Regex to capture tokens like: {out:field value}
|
|
8
|
+
const TOKEN_RX = /\{out:(?<field>[^\s}]+)\s+(?<value>[^\s}]+)\}/g;
|
|
9
|
+
/**
|
|
10
|
+
* Run a command in the foreground, capturing stdout/stderr. Extracts token patterns
|
|
11
|
+
* of the form {out:field value} and stores them in the shared dataLayer.
|
|
12
|
+
*/
|
|
13
|
+
function runForeground(cmd, envObj = {}, _options = {}) {
|
|
14
|
+
const filteredEnv = (0, filterUnwantedEnvVars_1.filterUnwantedEnvVars)(process.env);
|
|
15
|
+
const newEnv = { ...filteredEnv, ...envObj };
|
|
16
|
+
const newCmd = (0, dataLayer_1.replaceTokens)(cmd, newEnv);
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
let lastLine = '';
|
|
19
|
+
let buffer = '';
|
|
20
|
+
const child = (0, child_process_1.spawn)(newCmd, [], {
|
|
21
|
+
shell: true,
|
|
22
|
+
env: { ...newEnv },
|
|
23
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
24
|
+
});
|
|
25
|
+
const handleData = (chunk) => {
|
|
26
|
+
const text = chunk.toString();
|
|
27
|
+
buffer += text;
|
|
28
|
+
const lines = text.trim().split(/\r?\n/);
|
|
29
|
+
if (lines.length)
|
|
30
|
+
lastLine = lines[lines.length - 1];
|
|
31
|
+
process.stdout.write(text); // echo output
|
|
32
|
+
};
|
|
33
|
+
child.stdout.on('data', handleData);
|
|
34
|
+
child.stderr.on('data', handleData);
|
|
35
|
+
child.on('error', reject);
|
|
36
|
+
child.on('exit', (code, signal) => {
|
|
37
|
+
// Extract tokens and populate dataLayer
|
|
38
|
+
for (const match of buffer.matchAll(TOKEN_RX)) {
|
|
39
|
+
const groups = match.groups;
|
|
40
|
+
if (groups?.field) {
|
|
41
|
+
(0, dataLayer_1.setData)(groups.field, groups.value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (signal)
|
|
45
|
+
return reject(new Error(`${cmd} exited via signal ${signal}`));
|
|
46
|
+
if (code === 0)
|
|
47
|
+
return resolve(lastLine);
|
|
48
|
+
reject(new Error(`${cmd} exited with code ${code}. Last line: ${lastLine}`));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
exports.default = runForeground;
|