rbxts-orchestra 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/run.js +40 -9
- package/dist/src/commands/runScript.js +8 -3
- package/dist/src/commands/runScript.js.map +1 -1
- package/dist/src/helpers/script.d.ts +4 -0
- package/dist/src/helpers/script.js +9 -3
- package/dist/src/helpers/script.js.map +1 -1
- package/dist/src/orchestra/config.d.ts +5 -1
- package/dist/src/orchestra/config.js.map +1 -1
- package/dist/src/orchestra/orchestra.d.ts +3 -1
- package/dist/src/orchestra/orchestra.js +38 -3
- package/dist/src/orchestra/orchestra.js.map +1 -1
- package/package.json +2 -2
- package/src/commands/runScript.ts +9 -3
- package/src/helpers/script.ts +16 -5
- package/src/orchestra/config.ts +8 -2
- package/src/orchestra/orchestra.ts +42 -5
package/dist/run.js
CHANGED
|
@@ -32,7 +32,7 @@ var import_yargs = __toESM(require("yargs"));
|
|
|
32
32
|
// package.json
|
|
33
33
|
var package_default = {
|
|
34
34
|
name: "rbxts-orchestra",
|
|
35
|
-
version: "0.
|
|
35
|
+
version: "0.2.0",
|
|
36
36
|
description: "A build orchestrator.",
|
|
37
37
|
main: "src/index.ts",
|
|
38
38
|
bin: {
|
|
@@ -54,7 +54,7 @@ var package_default = {
|
|
|
54
54
|
compile: "tsc",
|
|
55
55
|
format: "prettier . --check",
|
|
56
56
|
"format:fix": "prettier . --write",
|
|
57
|
-
lint: "eslint
|
|
57
|
+
lint: "eslint ./src",
|
|
58
58
|
"lint:fix": "eslint . --fix",
|
|
59
59
|
start: "ts-node ./bin/run.ts",
|
|
60
60
|
"start:node": "node ./bin/run",
|
|
@@ -80,7 +80,7 @@ var package_default = {
|
|
|
80
80
|
consola: "^3.2.3",
|
|
81
81
|
jiti: "^2.6.1",
|
|
82
82
|
picocolors: "^1.0.1",
|
|
83
|
-
"rbxts-orchestra": "^0.1.
|
|
83
|
+
"rbxts-orchestra": "^0.1.3",
|
|
84
84
|
yargs: "^17.7.2"
|
|
85
85
|
}
|
|
86
86
|
};
|
|
@@ -136,15 +136,41 @@ var Orchestra = class _Orchestra {
|
|
|
136
136
|
}
|
|
137
137
|
environment;
|
|
138
138
|
async runScripts(scriptName, argv2) {
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
const firstScript = this.findFirstScript(scriptName);
|
|
140
|
+
if (!firstScript) return false;
|
|
141
|
+
let skipPrepare = false;
|
|
142
|
+
if (typeof firstScript !== "function") skipPrepare = firstScript[0].skipPrepare;
|
|
143
|
+
if (!skipPrepare) await this.runScript(this.resolveConfig(this.config.scripts?.prepare), void 0, argv2);
|
|
144
|
+
await this.runScript(this.resolveConfig(this.config.scripts?.[scriptName]), void 0, argv2);
|
|
141
145
|
for (const place of this.config.places) {
|
|
142
|
-
await this.resolveConfig(place.scripts[scriptName])
|
|
146
|
+
await this.runScript(this.resolveConfig(place.scripts?.[scriptName]), place, argv2);
|
|
143
147
|
}
|
|
148
|
+
return true;
|
|
144
149
|
}
|
|
145
150
|
resolveConfig(config) {
|
|
146
151
|
return resolveValue(config, this);
|
|
147
152
|
}
|
|
153
|
+
findFirstScript(targetScriptName) {
|
|
154
|
+
if (this.config.scripts) {
|
|
155
|
+
for (const [scriptName, script] of Object.entries(this.config.scripts)) {
|
|
156
|
+
if (targetScriptName == scriptName) return this.resolveConfig(script);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
for (const place of Object.values(this.config.places)) {
|
|
160
|
+
if (!place.scripts) continue;
|
|
161
|
+
for (const [scriptName, script] of Object.entries(place.scripts)) {
|
|
162
|
+
if (targetScriptName == scriptName) return this.resolveConfig(script);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return void 0;
|
|
166
|
+
}
|
|
167
|
+
async runScript(script, place, argv2 = []) {
|
|
168
|
+
if (!script) return [false, void 0];
|
|
169
|
+
let callback;
|
|
170
|
+
if (typeof script === "function") callback = script;
|
|
171
|
+
else callback = script[1];
|
|
172
|
+
return [true, await callback(this, place, argv2)];
|
|
173
|
+
}
|
|
148
174
|
};
|
|
149
175
|
|
|
150
176
|
// src/commands/runScript.ts
|
|
@@ -173,10 +199,15 @@ async function handler(argv2) {
|
|
|
173
199
|
logger.error(`Failed to find config file at ${argv2.config}`);
|
|
174
200
|
process2.exit(1);
|
|
175
201
|
});
|
|
176
|
-
await orchestra.runScripts(argv2.script, delimitedArgv).catch((
|
|
177
|
-
|
|
178
|
-
|
|
202
|
+
const anyScriptRan = await orchestra.runScripts(argv2.script, delimitedArgv).catch((err) => {
|
|
203
|
+
const formattedErr = typeof err == "number" ? `exit code ${err}` : err;
|
|
204
|
+
logger.error(`Failed to run script: ${formattedErr}`);
|
|
205
|
+
process2.exit(typeof err == "number" ? err : 1);
|
|
179
206
|
});
|
|
207
|
+
if (!anyScriptRan) {
|
|
208
|
+
logger.error(`No scripts by the name of "${argv2.script}" found`);
|
|
209
|
+
process2.exit(1);
|
|
210
|
+
}
|
|
180
211
|
}
|
|
181
212
|
|
|
182
213
|
// src/commands/index.ts
|
|
@@ -30,9 +30,14 @@ export async function handler(argv) {
|
|
|
30
30
|
logger.error(`Failed to find config file at ${argv.config}`);
|
|
31
31
|
process.exit(1);
|
|
32
32
|
});
|
|
33
|
-
await orchestra.runScripts(argv.script, delimitedArgv).catch((
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const anyScriptRan = await orchestra.runScripts(argv.script, delimitedArgv).catch((err) => {
|
|
34
|
+
const formattedErr = typeof err == "number" ? `exit code ${err}` : err;
|
|
35
|
+
logger.error(`Failed to run script: ${formattedErr}`);
|
|
36
|
+
process.exit(typeof err == "number" ? err : 1);
|
|
36
37
|
});
|
|
38
|
+
if (!anyScriptRan) {
|
|
39
|
+
logger.error(`No scripts by the name of "${argv.script}" found`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
37
42
|
}
|
|
38
43
|
//# sourceMappingURL=runScript.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runScript.js","sourceRoot":"","sources":["../../../src/commands/runScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAOpE,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC;AACtC,MAAM,CAAC,MAAM,QAAQ,GAAG,iDAAiD,CAAC;AAE1E,MAAM,UAAU,OAAO,CAAC,KAAoB;IAC3C,OAAO,KAAK;SACV,UAAU,CAAC,QAAQ,EAAE;QACrB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,aAAa;KAC1B,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QACjB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,GAAG,yBAAyB,EAAE;KACvC,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;QACnC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiC;IAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACxE,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"runScript.js","sourceRoot":"","sources":["../../../src/commands/runScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAOpE,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC;AACtC,MAAM,CAAC,MAAM,QAAQ,GAAG,iDAAiD,CAAC;AAE1E,MAAM,UAAU,OAAO,CAAC,KAAoB;IAC3C,OAAO,KAAK;SACV,UAAU,CAAC,QAAQ,EAAE;QACrB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,aAAa;KAC1B,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QACjB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,GAAG,yBAAyB,EAAE;KACvC,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;QACnC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiC;IAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACxE,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACzF,MAAM,YAAY,GAAG,OAAO,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC"}
|
|
@@ -8,6 +8,10 @@ interface SpawnConfig {
|
|
|
8
8
|
* Whether to ignore a non-zero exit code
|
|
9
9
|
*/
|
|
10
10
|
ignoreNonZeroExitCode: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Whether to skip the prepare script before running this process
|
|
13
|
+
*/
|
|
14
|
+
skipPrepare: boolean;
|
|
11
15
|
/**
|
|
12
16
|
* Additional arguments to pass to the process
|
|
13
17
|
*/
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
2
|
import { resolve } from "path";
|
|
3
|
-
import { val } from "../orchestra/config";
|
|
4
3
|
const DEFAULT_SPAWN_CONFIG = {
|
|
5
4
|
waitForExit: true,
|
|
6
5
|
ignoreNonZeroExitCode: false,
|
|
6
|
+
skipPrepare: false,
|
|
7
7
|
argv: [],
|
|
8
8
|
};
|
|
9
9
|
function generateEnv(orchestra, place) {
|
|
@@ -21,7 +21,7 @@ export function sh(cmd, config = {}) {
|
|
|
21
21
|
...DEFAULT_SPAWN_CONFIG,
|
|
22
22
|
...config,
|
|
23
23
|
};
|
|
24
|
-
|
|
24
|
+
const scriptCallback = (orchestra, place, argv = []) => {
|
|
25
25
|
return new Promise((resolvePromise, reject) => {
|
|
26
26
|
const child = spawn(`${cmd}`, [...argv, ...fullConfig.argv], {
|
|
27
27
|
cwd: place ? resolve(orchestra.resolveConfig(place.rootDir)) : undefined,
|
|
@@ -39,7 +39,13 @@ export function sh(cmd, config = {}) {
|
|
|
39
39
|
resolvePromise();
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
|
-
}
|
|
42
|
+
};
|
|
43
|
+
return () => [
|
|
44
|
+
{
|
|
45
|
+
skipPrepare: fullConfig.skipPrepare,
|
|
46
|
+
},
|
|
47
|
+
scriptCallback,
|
|
48
|
+
];
|
|
43
49
|
}
|
|
44
50
|
export function script(path, config = {}) {
|
|
45
51
|
return sh(`${resolve(path)}`, config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../../src/helpers/script.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../../src/helpers/script.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAwB/B,MAAM,oBAAoB,GAAgB;IACzC,WAAW,EAAE,IAAI;IACjB,qBAAqB,EAAE,KAAK;IAC5B,WAAW,EAAE,KAAK;IAClB,IAAI,EAAE,EAAE;CACR,CAAC;AAEF,SAAS,WAAW,CACnB,SAAuB,EACvB,KAAsB;IAEtB,OAAO;QACN,GAAG,OAAO,CAAC,GAAG;QACd,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC;QAC3B,cAAc,EAAE,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC;QACvE,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;QACnE,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE;QACrE,aAAa,EAAE,KAAK,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE;KAC/E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,EAAE,CAAyB,GAAW,EAAE,SAA+B,EAAE;IACxF,MAAM,UAAU,GAAG;QAClB,GAAG,oBAAoB;QACvB,GAAG,MAAM;KACT,CAAC;IAEF,MAAM,cAAc,GAAc,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;QACjE,OAAO,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC5D,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxE,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB;wBAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBAClE,cAAc,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,cAAc,EAAE,CAAC;YAClB,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,GAAG,EAAE,CAAC;QACZ;YACC,WAAW,EAAE,UAAU,CAAC,WAAW;SACnC;QACD,cAAc;KACd,CAAC;AACH,CAAC;AACD,MAAM,UAAU,MAAM,CAAyB,IAAY,EAAE,SAA+B,EAAE;IAC7F,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -19,7 +19,11 @@ export declare function val<E extends Environments, T>(value: T): Value<E, T>;
|
|
|
19
19
|
* Environment-based value helper
|
|
20
20
|
*/
|
|
21
21
|
export declare function env<V extends Record<string, unknown>>(values: V): <E extends { [K in keyof V]: EnvironmentConfig; }>(orchestra: Orchestra<E>) => V[keyof V];
|
|
22
|
-
export
|
|
22
|
+
export interface ScriptConfig {
|
|
23
|
+
skipPrepare: boolean;
|
|
24
|
+
}
|
|
25
|
+
export type ScriptCallback<E extends Environments, T = void> = (orchestra: Orchestra<E>, place?: PlaceConfig<E>, argv?: string[]) => Promise<T> | T;
|
|
26
|
+
export type Script<E extends Environments, T = void> = [ScriptConfig, ScriptCallback<E, T>] | ScriptCallback<E, T>;
|
|
23
27
|
/**
|
|
24
28
|
* A configuration for a place managed by an Orchestra
|
|
25
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/orchestra/config.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,UAAU,YAAY,CAA4B,KAAuB,EAAE,SAAuB;IACvG,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAE,KAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAA4B,KAAQ;IACtD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAoC,MAAS;IAC/D,OAAO,CAAkD,SAAuB,EAAc,EAAE;QAC/F,OAAO,MAAM,CAAC,SAAS,CAAC,WAAsB,CAAC,CAAC;IACjD,CAAC,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/orchestra/config.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,UAAU,YAAY,CAA4B,KAAuB,EAAE,SAAuB;IACvG,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAE,KAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAA4B,KAAQ;IACtD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAoC,MAAS;IAC/D,OAAO,CAAkD,SAAuB,EAAc,EAAE;QAC/F,OAAO,MAAM,CAAC,SAAS,CAAC,WAAsB,CAAC,CAAC;IACjD,CAAC,CAAC;AACH,CAAC;AAoFD;;GAEG;AACH,MAAM,UAAU,eAAe,CAA+B,UAA8B;IAC3F,OAAO,UAAU,CAAC;AACnB,CAAC"}
|
|
@@ -6,6 +6,8 @@ export declare class Orchestra<E extends Environments> {
|
|
|
6
6
|
static fromFileConfig(filePath: string): Promise<Orchestra<never>>;
|
|
7
7
|
readonly environment: keyof E;
|
|
8
8
|
constructor(config: OrchestraConfig<E>);
|
|
9
|
-
runScripts(scriptName: string, argv?: string[]): Promise<
|
|
9
|
+
runScripts(scriptName: string, argv?: string[]): Promise<boolean>;
|
|
10
10
|
resolveConfig<T>(config: MaybeValue<E, T>): T;
|
|
11
|
+
private findFirstScript;
|
|
12
|
+
private runScript;
|
|
11
13
|
}
|
|
@@ -32,14 +32,49 @@ export class Orchestra {
|
|
|
32
32
|
assert(this.environment, `Orchestra config is invalid, no default or otherwise valid environments provided`);
|
|
33
33
|
}
|
|
34
34
|
async runScripts(scriptName, argv) {
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
const firstScript = this.findFirstScript(scriptName);
|
|
36
|
+
if (!firstScript)
|
|
37
|
+
return false;
|
|
38
|
+
let skipPrepare = false;
|
|
39
|
+
if (typeof firstScript !== "function")
|
|
40
|
+
skipPrepare = firstScript[0].skipPrepare;
|
|
41
|
+
if (!skipPrepare)
|
|
42
|
+
await this.runScript(this.resolveConfig(this.config.scripts?.prepare), undefined, argv);
|
|
43
|
+
await this.runScript(this.resolveConfig(this.config.scripts?.[scriptName]), undefined, argv);
|
|
37
44
|
for (const place of this.config.places) {
|
|
38
|
-
await this.resolveConfig(place.scripts[scriptName])
|
|
45
|
+
await this.runScript(this.resolveConfig(place.scripts?.[scriptName]), place, argv);
|
|
39
46
|
}
|
|
47
|
+
return true;
|
|
40
48
|
}
|
|
41
49
|
resolveConfig(config) {
|
|
42
50
|
return resolveValue(config, this);
|
|
43
51
|
}
|
|
52
|
+
findFirstScript(targetScriptName) {
|
|
53
|
+
if (this.config.scripts) {
|
|
54
|
+
for (const [scriptName, script] of Object.entries(this.config.scripts)) {
|
|
55
|
+
if (targetScriptName == scriptName)
|
|
56
|
+
return this.resolveConfig(script);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const place of Object.values(this.config.places)) {
|
|
60
|
+
if (!place.scripts)
|
|
61
|
+
continue;
|
|
62
|
+
for (const [scriptName, script] of Object.entries(place.scripts)) {
|
|
63
|
+
if (targetScriptName == scriptName)
|
|
64
|
+
return this.resolveConfig(script);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
async runScript(script, place, argv = []) {
|
|
70
|
+
if (!script)
|
|
71
|
+
return [false, undefined];
|
|
72
|
+
let callback;
|
|
73
|
+
if (typeof script === "function")
|
|
74
|
+
callback = script;
|
|
75
|
+
else
|
|
76
|
+
callback = script[1];
|
|
77
|
+
return [true, await callback(this, place, argv)];
|
|
78
|
+
}
|
|
44
79
|
}
|
|
45
80
|
//# sourceMappingURL=orchestra.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestra.js","sourceRoot":"","sources":["../../../src/orchestra/orchestra.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAA6C,YAAY,
|
|
1
|
+
{"version":3,"file":"orchestra.js","sourceRoot":"","sources":["../../../src/orchestra/orchestra.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rbxts-orchestra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A build orchestrator.",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"bin": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"compile": "tsc",
|
|
23
23
|
"format": "prettier . --check",
|
|
24
24
|
"format:fix": "prettier . --write",
|
|
25
|
-
"lint": "eslint
|
|
25
|
+
"lint": "eslint ./src",
|
|
26
26
|
"lint:fix": "eslint . --fix",
|
|
27
27
|
"start": "ts-node ./bin/run.ts",
|
|
28
28
|
"start:node": "node ./bin/run",
|
|
@@ -41,8 +41,14 @@ export async function handler(argv: ArgumentsCamelCase<RunArgv>) {
|
|
|
41
41
|
process.exit(1);
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
await orchestra.runScripts(argv.script, delimitedArgv).catch((
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
const anyScriptRan = await orchestra.runScripts(argv.script, delimitedArgv).catch((err) => {
|
|
45
|
+
const formattedErr = typeof err == "number" ? `exit code ${err}` : err;
|
|
46
|
+
logger.error(`Failed to run script: ${formattedErr}`);
|
|
47
|
+
process.exit(typeof err == "number" ? err : 1);
|
|
47
48
|
});
|
|
49
|
+
|
|
50
|
+
if (!anyScriptRan) {
|
|
51
|
+
logger.error(`No scripts by the name of "${argv.script}" found`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
48
54
|
}
|
package/src/helpers/script.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
2
|
import { resolve } from "path";
|
|
3
3
|
|
|
4
|
-
import { Environments, PlaceConfig, Script,
|
|
4
|
+
import { Environments, PlaceConfig, Script, Value } from "../orchestra/config";
|
|
5
5
|
import { Orchestra } from "../orchestra/orchestra";
|
|
6
6
|
|
|
7
7
|
interface SpawnConfig {
|
|
@@ -13,6 +13,10 @@ interface SpawnConfig {
|
|
|
13
13
|
* Whether to ignore a non-zero exit code
|
|
14
14
|
*/
|
|
15
15
|
ignoreNonZeroExitCode: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Whether to skip the prepare script before running this process
|
|
18
|
+
*/
|
|
19
|
+
skipPrepare: boolean;
|
|
16
20
|
/**
|
|
17
21
|
* Additional arguments to pass to the process
|
|
18
22
|
*/
|
|
@@ -22,6 +26,7 @@ interface SpawnConfig {
|
|
|
22
26
|
const DEFAULT_SPAWN_CONFIG: SpawnConfig = {
|
|
23
27
|
waitForExit: true,
|
|
24
28
|
ignoreNonZeroExitCode: false,
|
|
29
|
+
skipPrepare: false,
|
|
25
30
|
argv: [],
|
|
26
31
|
};
|
|
27
32
|
|
|
@@ -45,14 +50,13 @@ export function sh<E extends Environments>(cmd: string, config: Partial<SpawnCon
|
|
|
45
50
|
...config,
|
|
46
51
|
};
|
|
47
52
|
|
|
48
|
-
|
|
49
|
-
return new Promise((resolvePromise, reject) => {
|
|
53
|
+
const scriptCallback: Script<E> = (orchestra, place, argv = []) => {
|
|
54
|
+
return new Promise<void>((resolvePromise, reject) => {
|
|
50
55
|
const child = spawn(`${cmd}`, [...argv, ...fullConfig.argv], {
|
|
51
56
|
cwd: place ? resolve(orchestra.resolveConfig(place.rootDir)) : undefined,
|
|
52
57
|
stdio: "inherit",
|
|
53
58
|
env: generateEnv(orchestra, place),
|
|
54
59
|
});
|
|
55
|
-
|
|
56
60
|
if (fullConfig.waitForExit) {
|
|
57
61
|
child.on("exit", (code) => {
|
|
58
62
|
if (code !== 0 && !fullConfig.ignoreNonZeroExitCode) reject(code);
|
|
@@ -62,7 +66,14 @@ export function sh<E extends Environments>(cmd: string, config: Partial<SpawnCon
|
|
|
62
66
|
resolvePromise();
|
|
63
67
|
}
|
|
64
68
|
});
|
|
65
|
-
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return () => [
|
|
72
|
+
{
|
|
73
|
+
skipPrepare: fullConfig.skipPrepare,
|
|
74
|
+
},
|
|
75
|
+
scriptCallback,
|
|
76
|
+
];
|
|
66
77
|
}
|
|
67
78
|
export function script<E extends Environments>(path: string, config: Partial<SpawnConfig> = {}): Value<E, Script<E>> {
|
|
68
79
|
return sh(`${resolve(path)}`, config);
|
package/src/orchestra/config.ts
CHANGED
|
@@ -33,11 +33,17 @@ export function env<V extends Record<string, unknown>>(values: V) {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
export
|
|
36
|
+
export interface ScriptConfig {
|
|
37
|
+
skipPrepare: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type ScriptCallback<E extends Environments, T = void> = (
|
|
37
41
|
orchestra: Orchestra<E>,
|
|
38
42
|
place?: PlaceConfig<E>,
|
|
39
43
|
argv?: string[],
|
|
40
|
-
) => Promise<
|
|
44
|
+
) => Promise<T> | T;
|
|
45
|
+
|
|
46
|
+
export type Script<E extends Environments, T = void> = [ScriptConfig, ScriptCallback<E, T>] | ScriptCallback<E, T>;
|
|
41
47
|
|
|
42
48
|
/**
|
|
43
49
|
* A configuration for a place managed by an Orchestra
|
|
@@ -2,7 +2,7 @@ import assert from "assert";
|
|
|
2
2
|
import { createJiti } from "jiti";
|
|
3
3
|
import { resolve } from "path";
|
|
4
4
|
|
|
5
|
-
import { Environments, MaybeValue, OrchestraConfig, resolveValue } from "./config";
|
|
5
|
+
import { Environments, MaybeValue, OrchestraConfig, resolveValue, Script, ScriptCallback, PlaceConfig } from "./config";
|
|
6
6
|
|
|
7
7
|
const jiti = createJiti(__filename);
|
|
8
8
|
|
|
@@ -36,17 +36,54 @@ export class Orchestra<E extends Environments> {
|
|
|
36
36
|
assert(this!.environment, `Orchestra config is invalid, no default or otherwise valid environments provided`);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
public async runScripts(scriptName: string, argv?: string[]) {
|
|
40
|
-
|
|
39
|
+
public async runScripts(scriptName: string, argv?: string[]): Promise<boolean> {
|
|
40
|
+
const firstScript = this.findFirstScript(scriptName);
|
|
41
|
+
if (!firstScript) return false;
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
let skipPrepare = false;
|
|
44
|
+
if (typeof firstScript !== "function") skipPrepare = firstScript[0].skipPrepare;
|
|
45
|
+
if (!skipPrepare) await this.runScript(this.resolveConfig(this.config.scripts?.prepare), undefined, argv);
|
|
46
|
+
|
|
47
|
+
await this.runScript(this.resolveConfig(this.config.scripts?.[scriptName]), undefined, argv);
|
|
43
48
|
|
|
44
49
|
for (const place of this.config.places) {
|
|
45
|
-
await this.resolveConfig(place.scripts[scriptName])
|
|
50
|
+
await this.runScript(this.resolveConfig(place.scripts?.[scriptName]), place, argv);
|
|
46
51
|
}
|
|
52
|
+
|
|
53
|
+
return true;
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
public resolveConfig<T>(config: MaybeValue<E, T>): T {
|
|
50
57
|
return resolveValue(config, this);
|
|
51
58
|
}
|
|
59
|
+
|
|
60
|
+
private findFirstScript(targetScriptName: string): Script<E, unknown> | undefined {
|
|
61
|
+
if (this.config.scripts) {
|
|
62
|
+
for (const [scriptName, script] of Object.entries(this.config.scripts)) {
|
|
63
|
+
if (targetScriptName == scriptName) return this.resolveConfig(script);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
for (const place of Object.values(this.config.places)) {
|
|
68
|
+
if (!place.scripts) continue;
|
|
69
|
+
for (const [scriptName, script] of Object.entries(place.scripts)) {
|
|
70
|
+
if (targetScriptName == scriptName) return this.resolveConfig(script);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private async runScript<T>(
|
|
78
|
+
script?: Script<E, T>,
|
|
79
|
+
place?: PlaceConfig<E>,
|
|
80
|
+
argv: string[] = [],
|
|
81
|
+
): Promise<[boolean, T | undefined]> {
|
|
82
|
+
if (!script) return [false, undefined];
|
|
83
|
+
let callback: ScriptCallback<E, T>;
|
|
84
|
+
if (typeof script === "function") callback = script;
|
|
85
|
+
else callback = script[1];
|
|
86
|
+
|
|
87
|
+
return [true, await callback(this, place, argv)];
|
|
88
|
+
}
|
|
52
89
|
}
|