rbxts-orchestra 0.1.3 → 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 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.1.3",
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.0",
83
+ "rbxts-orchestra": "^0.1.3",
84
84
  yargs: "^17.7.2"
85
85
  }
86
86
  };
@@ -123,7 +123,7 @@ var Orchestra = class _Orchestra {
123
123
  this.environment = environmentName;
124
124
  }
125
125
  }
126
- (0, import_assert.default)(this.environment, `Orchestra confiag is invalid, no default or otherwise valid environments provided`);
126
+ (0, import_assert.default)(this.environment, `Orchestra config is invalid, no default or otherwise valid environments provided`);
127
127
  }
128
128
  static async fromDirectory(directoryPath) {
129
129
  return await _Orchestra.fromFileConfig((0, import_path.resolve)(directoryPath, ORCHESTRA_CONFIG_FILENAME));
@@ -136,15 +136,41 @@ var Orchestra = class _Orchestra {
136
136
  }
137
137
  environment;
138
138
  async runScripts(scriptName, argv2) {
139
- await this.resolveConfig(this.config.scripts?.prepare)?.(this, void 0, argv2);
140
- await this.resolveConfig(this.config.scripts?.[scriptName])?.(this, void 0, argv2);
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])?.(this, place, argv2);
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((code) => {
177
- logger.error(`Failed to run script: exit code ${code}`);
178
- process2.exit(code);
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((code) => {
34
- logger.error(`Failed to run script: exit code ${code}`);
35
- process.exit(code);
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,IAAI,EAAE,EAAE;QACrE,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACJ,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,14 @@ 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;
15
+ /**
16
+ * Additional arguments to pass to the process
17
+ */
18
+ argv: string[];
11
19
  }
12
20
  export declare function sh<E extends Environments>(cmd: string, config?: Partial<SpawnConfig>): Value<E, Script<E>>;
13
21
  export declare function script<E extends Environments>(path: string, config?: Partial<SpawnConfig>): Value<E, Script<E>>;
@@ -1,9 +1,10 @@
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
+ argv: [],
7
8
  };
8
9
  function generateEnv(orchestra, place) {
9
10
  return {
@@ -20,9 +21,9 @@ export function sh(cmd, config = {}) {
20
21
  ...DEFAULT_SPAWN_CONFIG,
21
22
  ...config,
22
23
  };
23
- return val((orchestra, place, argv = []) => {
24
+ const scriptCallback = (orchestra, place, argv = []) => {
24
25
  return new Promise((resolvePromise, reject) => {
25
- const child = spawn(`${cmd}`, argv, {
26
+ const child = spawn(`${cmd}`, [...argv, ...fullConfig.argv], {
26
27
  cwd: place ? resolve(orchestra.resolveConfig(place.rootDir)) : undefined,
27
28
  stdio: "inherit",
28
29
  env: generateEnv(orchestra, place),
@@ -38,7 +39,13 @@ export function sh(cmd, config = {}) {
38
39
  resolvePromise();
39
40
  }
40
41
  });
41
- });
42
+ };
43
+ return () => [
44
+ {
45
+ skipPrepare: fullConfig.skipPrepare,
46
+ },
47
+ scriptCallback,
48
+ ];
42
49
  }
43
50
  export function script(path, config = {}) {
44
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;AAE/B,OAAO,EAAqC,GAAG,EAAS,MAAM,qBAAqB,CAAC;AAcpF,MAAM,oBAAoB,GAAgB;IACzC,WAAW,EAAE,IAAI;IACjB,qBAAqB,EAAE,KAAK;CAC5B,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,OAAO,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;QAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE;gBACnC,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;YAEH,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,CAAC;AACJ,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"}
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 type Script<E extends Environments> = (orchestra: Orchestra<E>, place?: PlaceConfig<E>, argv?: string[]) => Promise<void> | void;
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;AA8ED;;GAEG;AACH,MAAM,UAAU,eAAe,CAA+B,UAA8B;IAC3F,OAAO,UAAU,CAAC;AACnB,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<void>;
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
  }
@@ -29,17 +29,52 @@ export class Orchestra {
29
29
  this.environment = environmentName;
30
30
  }
31
31
  }
32
- assert(this.environment, `Orchestra confiag is invalid, no default or otherwise valid environments provided`);
32
+ assert(this.environment, `Orchestra config is invalid, no default or otherwise valid environments provided`);
33
33
  }
34
34
  async runScripts(scriptName, argv) {
35
- await this.resolveConfig(this.config.scripts?.prepare)?.(this, undefined, argv);
36
- await this.resolveConfig(this.config.scripts?.[scriptName])?.(this, undefined, argv);
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])?.(this, place, argv);
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,EAAE,MAAM,UAAU,CAAC;AAEnF,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAE/D,MAAM,OAAO,SAAS;IAeO;IAdrB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,aAAqB;QACtD,OAAO,MAAM,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAC1F,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAgB;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACnD,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,OAAO,IAAI,SAAS,CAAC,MAAgC,CAAC,CAAC;IACxD,CAAC;IAEe,WAAW,CAAU;IAErC,YAA4B,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;QACrD,KAAK,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACxF,IAAI,IAAK,CAAC,WAAW;gBAAE,SAAS;YAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC;YACnD,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC;YACpC,CAAC;iBAAM,IAAI,QAAQ,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAClD,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC;YACpC,CAAC;QACF,CAAC;QACD,MAAM,CAAC,IAAK,CAAC,WAAW,EAAE,mFAAmF,CAAC,CAAC;IAChH,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,IAAe;QAC1D,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAEhF,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAErF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC;IACF,CAAC;IAEM,aAAa,CAAI,MAAwB;QAC/C,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;CACD"}
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.1.3",
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",
@@ -48,7 +48,7 @@
48
48
  "consola": "^3.2.3",
49
49
  "jiti": "^2.6.1",
50
50
  "picocolors": "^1.0.1",
51
- "rbxts-orchestra": "^0.1.0",
51
+ "rbxts-orchestra": "^0.1.3",
52
52
  "yargs": "^17.7.2"
53
53
  }
54
54
  }
@@ -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((code) => {
45
- logger.error(`Failed to run script: exit code ${code}`);
46
- process.exit(code);
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
  }
@@ -1,7 +1,7 @@
1
1
  import { spawn } from "child_process";
2
2
  import { resolve } from "path";
3
3
 
4
- import { Environments, PlaceConfig, Script, val, Value } from "../orchestra/config";
4
+ import { Environments, PlaceConfig, Script, Value } from "../orchestra/config";
5
5
  import { Orchestra } from "../orchestra/orchestra";
6
6
 
7
7
  interface SpawnConfig {
@@ -13,11 +13,21 @@ 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;
20
+ /**
21
+ * Additional arguments to pass to the process
22
+ */
23
+ argv: string[];
16
24
  }
17
25
 
18
26
  const DEFAULT_SPAWN_CONFIG: SpawnConfig = {
19
27
  waitForExit: true,
20
28
  ignoreNonZeroExitCode: false,
29
+ skipPrepare: false,
30
+ argv: [],
21
31
  };
22
32
 
23
33
  function generateEnv<E extends Environments>(
@@ -40,14 +50,13 @@ export function sh<E extends Environments>(cmd: string, config: Partial<SpawnCon
40
50
  ...config,
41
51
  };
42
52
 
43
- return val((orchestra, place, argv = []) => {
44
- return new Promise((resolvePromise, reject) => {
45
- const child = spawn(`${cmd}`, argv, {
53
+ const scriptCallback: Script<E> = (orchestra, place, argv = []) => {
54
+ return new Promise<void>((resolvePromise, reject) => {
55
+ const child = spawn(`${cmd}`, [...argv, ...fullConfig.argv], {
46
56
  cwd: place ? resolve(orchestra.resolveConfig(place.rootDir)) : undefined,
47
57
  stdio: "inherit",
48
58
  env: generateEnv(orchestra, place),
49
59
  });
50
-
51
60
  if (fullConfig.waitForExit) {
52
61
  child.on("exit", (code) => {
53
62
  if (code !== 0 && !fullConfig.ignoreNonZeroExitCode) reject(code);
@@ -57,7 +66,14 @@ export function sh<E extends Environments>(cmd: string, config: Partial<SpawnCon
57
66
  resolvePromise();
58
67
  }
59
68
  });
60
- });
69
+ };
70
+
71
+ return () => [
72
+ {
73
+ skipPrepare: fullConfig.skipPrepare,
74
+ },
75
+ scriptCallback,
76
+ ];
61
77
  }
62
78
  export function script<E extends Environments>(path: string, config: Partial<SpawnConfig> = {}): Value<E, Script<E>> {
63
79
  return sh(`${resolve(path)}`, config);
@@ -33,11 +33,17 @@ export function env<V extends Record<string, unknown>>(values: V) {
33
33
  };
34
34
  }
35
35
 
36
- export type Script<E extends Environments> = (
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<void> | void;
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
 
@@ -33,20 +33,57 @@ export class Orchestra<E extends Environments> {
33
33
  this.environment = environmentName;
34
34
  }
35
35
  }
36
- assert(this!.environment, `Orchestra confiag is invalid, no default or otherwise valid environments provided`);
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
- await this.resolveConfig(this.config.scripts?.prepare)?.(this, undefined, argv);
39
+ public async runScripts(scriptName: string, argv?: string[]): Promise<boolean> {
40
+ const firstScript = this.findFirstScript(scriptName);
41
+ if (!firstScript) return false;
41
42
 
42
- await this.resolveConfig(this.config.scripts?.[scriptName])?.(this, undefined, argv);
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])?.(this, place, argv);
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
  }