@enspirit/emb 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +61 -13
  2. package/dist/src/cli/commands/clean.d.ts +3 -1
  3. package/dist/src/cli/commands/clean.js +13 -2
  4. package/dist/src/cli/commands/components/build.d.ts +6 -2
  5. package/dist/src/cli/commands/components/build.js +17 -7
  6. package/dist/src/cli/commands/config/print.js +2 -3
  7. package/dist/src/cli/commands/down.d.ts +2 -2
  8. package/dist/src/cli/commands/down.js +5 -25
  9. package/dist/src/cli/commands/tasks/index.js +11 -5
  10. package/dist/src/cli/commands/tasks/run.d.ts +2 -1
  11. package/dist/src/cli/commands/tasks/run.js +30 -45
  12. package/dist/src/cli/commands/up.d.ts +1 -1
  13. package/dist/src/cli/commands/up.js +12 -34
  14. package/dist/src/config/convert.js +2 -4
  15. package/dist/src/config/index.d.ts +1 -0
  16. package/dist/src/config/index.js +1 -0
  17. package/dist/src/config/schema.d.ts +32 -25
  18. package/dist/src/config/schema.json +48 -26
  19. package/dist/src/config/types.d.ts +10 -6
  20. package/dist/src/docker/compose/index.d.ts +1 -7
  21. package/dist/src/docker/compose/index.js +1 -13
  22. package/dist/src/docker/compose/operations/ComposeDownOperation.d.ts +12 -0
  23. package/dist/src/docker/compose/operations/ComposeDownOperation.js +21 -0
  24. package/dist/src/docker/compose/operations/ComposeUpOperation.d.ts +13 -0
  25. package/dist/src/docker/compose/operations/ComposeUpOperation.js +39 -0
  26. package/dist/src/docker/compose/operations/index.d.ts +2 -0
  27. package/dist/src/docker/compose/operations/index.js +2 -0
  28. package/dist/src/errors.d.ts +57 -0
  29. package/dist/src/errors.js +66 -0
  30. package/dist/src/index.d.ts +1 -0
  31. package/dist/src/index.js +1 -0
  32. package/dist/src/monorepo/component.d.ts +2 -2
  33. package/dist/src/monorepo/component.js +6 -6
  34. package/dist/src/monorepo/config.d.ts +4 -2
  35. package/dist/src/monorepo/config.js +14 -2
  36. package/dist/src/monorepo/index.d.ts +2 -0
  37. package/dist/src/monorepo/index.js +2 -0
  38. package/dist/src/monorepo/monorepo.d.ts +5 -2
  39. package/dist/src/monorepo/monorepo.js +45 -17
  40. package/dist/src/monorepo/operations/components/BuildComponentsOperation.d.ts +12 -2
  41. package/dist/src/monorepo/operations/components/BuildComponentsOperation.js +50 -59
  42. package/dist/src/monorepo/operations/components/GetComponentContainerOperation.d.ts +1 -1
  43. package/dist/src/monorepo/operations/components/GetComponentContainerOperation.js +1 -1
  44. package/dist/src/monorepo/operations/shell/ExecuteLocalCommandOperation.d.ts +4 -6
  45. package/dist/src/monorepo/operations/shell/ExecuteLocalCommandOperation.js +2 -7
  46. package/dist/src/monorepo/operations/tasks/RunTasksOperation.d.ts +20 -0
  47. package/dist/src/monorepo/operations/tasks/RunTasksOperation.js +82 -0
  48. package/dist/src/monorepo/operations/tasks/index.d.ts +1 -1
  49. package/dist/src/monorepo/operations/tasks/index.js +1 -1
  50. package/dist/src/monorepo/plugins/ComponentDiscoverPlugin.js +3 -1
  51. package/dist/src/monorepo/plugins/EmbfileLoaderPlugin.d.ts +3 -3
  52. package/dist/src/monorepo/plugins/EmbfileLoaderPlugin.js +9 -5
  53. package/dist/src/monorepo/store/index.js +5 -3
  54. package/dist/src/monorepo/taskManagerFactory.d.ts +3 -0
  55. package/dist/src/monorepo/taskManagerFactory.js +20 -0
  56. package/dist/src/monorepo/types.d.ts +2 -1
  57. package/dist/src/monorepo/utils/findRunOrder.d.ts +34 -0
  58. package/dist/src/monorepo/utils/findRunOrder.js +165 -0
  59. package/dist/src/monorepo/utils/index.d.ts +1 -1
  60. package/dist/src/monorepo/utils/index.js +1 -1
  61. package/oclif.manifest.json +94 -64
  62. package/package.json +9 -2
  63. package/dist/src/monorepo/operations/tasks/RunTaskOperation.d.ts +0 -18
  64. package/dist/src/monorepo/operations/tasks/RunTaskOperation.js +0 -50
  65. package/dist/src/monorepo/utils/findBuildOrder.d.ts +0 -2
  66. package/dist/src/monorepo/utils/findBuildOrder.js +0 -41
package/README.md CHANGED
@@ -14,7 +14,7 @@ $ npm install -g @enspirit/emb
14
14
  $ emb COMMAND
15
15
  running command...
16
16
  $ emb (--version)
17
- @enspirit/emb/0.0.6 darwin-x64 node-v22.12.0
17
+ @enspirit/emb/0.0.8 darwin-x64 node-v22.12.0
18
18
  $ emb --help [COMMAND]
19
19
  USAGE
20
20
  $ emb COMMAND
@@ -37,8 +37,9 @@ USAGE
37
37
  * [`emb images prune`](#emb-images-prune)
38
38
  * [`emb ps`](#emb-ps)
39
39
  * [`emb tasks`](#emb-tasks)
40
- * [`emb tasks run [TASK]`](#emb-tasks-run-task)
40
+ * [`emb tasks run TASK`](#emb-tasks-run-task)
41
41
  * [`emb up`](#emb-up)
42
+ * [`emb update [CHANNEL]`](#emb-update-channel)
42
43
 
43
44
  ## `emb autocomplete [SHELL]`
44
45
 
@@ -77,7 +78,10 @@ Clean the project.
77
78
 
78
79
  ```
79
80
  USAGE
80
- $ emb clean [--json]
81
+ $ emb clean [--json] [-f]
82
+
83
+ FLAGS
84
+ -f, --force Force the deletion of containers & images
81
85
 
82
86
  GLOBAL FLAGS
83
87
  --json Format output as json.
@@ -116,12 +120,13 @@ Build the components of the monorepo
116
120
 
117
121
  ```
118
122
  USAGE
119
- $ emb components build [COMPONENT...] [--json] [--flavor <value>]
123
+ $ emb components build [COMPONENT...] [--json] [--flavor <value>] [--dry-run]
120
124
 
121
125
  ARGUMENTS
122
- COMPONENT... List of components to build
126
+ COMPONENT... List of components to build (defaults to all)
123
127
 
124
128
  FLAGS
129
+ --dry-run Do not build the components but only produce build meta information
125
130
  --flavor=<value> Specify the flavor to use.
126
131
 
127
132
  GLOBAL FLAGS
@@ -203,7 +208,10 @@ Stop the whole project.
203
208
 
204
209
  ```
205
210
  USAGE
206
- $ emb down [--json]
211
+ $ emb down [--json] [--flavor <value>]
212
+
213
+ FLAGS
214
+ --flavor=<value> Specify the flavor to use.
207
215
 
208
216
  GLOBAL FLAGS
209
217
  --json Format output as json.
@@ -340,25 +348,27 @@ EXAMPLES
340
348
  $ emb tasks
341
349
  ```
342
350
 
343
- ## `emb tasks run [TASK]`
351
+ ## `emb tasks run TASK`
344
352
 
345
- Run a task.
353
+ Run tasks.
346
354
 
347
355
  ```
348
356
  USAGE
349
- $ emb tasks run [TASK...] [--json] [-x container|local]
357
+ $ emb tasks run TASK... [--json] [-x container|local] [-a]
350
358
 
351
359
  ARGUMENTS
352
- TASK... List of tasks ids to run (eg: component:task)
360
+ TASK... List of tasks to run. You can provide either ids or names (eg: component:task or task)
353
361
 
354
362
  FLAGS
355
- -x, --executor=<option> <options: container|local>
363
+ -a, --all-matching Run all tasks matching (when multiple matches)
364
+ -x, --executor=<option> Where to run the task. (experimental!)
365
+ <options: container|local>
356
366
 
357
367
  GLOBAL FLAGS
358
368
  --json Format output as json.
359
369
 
360
370
  DESCRIPTION
361
- Run a task.
371
+ Run tasks.
362
372
 
363
373
  EXAMPLES
364
374
  $ emb tasks run
@@ -373,7 +383,7 @@ USAGE
373
383
  $ emb up [--json] [--flavor <value>] [-f]
374
384
 
375
385
  FLAGS
376
- -f, --force-recreate Recreate containers even if their configuration and image haven't changed
386
+ -f, --force Bypass caches, force the recreation of containers, etc
377
387
  --flavor=<value> Specify the flavor to use.
378
388
 
379
389
  GLOBAL FLAGS
@@ -385,4 +395,42 @@ DESCRIPTION
385
395
  EXAMPLES
386
396
  $ emb up
387
397
  ```
398
+
399
+ ## `emb update [CHANNEL]`
400
+
401
+ update the emb CLI
402
+
403
+ ```
404
+ USAGE
405
+ $ emb update [CHANNEL] [--force | | [-a | -v <value> | -i]] [-b ]
406
+
407
+ FLAGS
408
+ -a, --available See available versions.
409
+ -b, --verbose Show more details about the available versions.
410
+ -i, --interactive Interactively select version to install. This is ignored if a channel is provided.
411
+ -v, --version=<value> Install a specific version.
412
+ --force Force a re-download of the requested version.
413
+
414
+ DESCRIPTION
415
+ update the emb CLI
416
+
417
+ EXAMPLES
418
+ Update to the stable channel:
419
+
420
+ $ emb update stable
421
+
422
+ Update to a specific version:
423
+
424
+ $ emb update --version 1.0.0
425
+
426
+ Interactively select version:
427
+
428
+ $ emb update --interactive
429
+
430
+ See available versions:
431
+
432
+ $ emb update --available
433
+ ```
434
+
435
+ _See code: [@oclif/plugin-update](https://github.com/oclif/plugin-update/blob/v4.7.3/src/commands/update.ts)_
388
436
  <!-- commandsstop -->
@@ -10,6 +10,8 @@ export default class CleanCommand extends Command {
10
10
  static description: string;
11
11
  static enableJsonFlag: boolean;
12
12
  static examples: string[];
13
- static flags: {};
13
+ static flags: {
14
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ };
14
16
  run(): Promise<void>;
15
17
  }
@@ -1,5 +1,5 @@
1
1
  import { getContext } from '../../index.js';
2
- import { Command } from '@oclif/core';
2
+ import { Command, Flags } from '@oclif/core';
3
3
  import { Listr } from 'listr2';
4
4
  /**
5
5
  * For now, only cleans the stores (logs/sentinels)
@@ -12,9 +12,16 @@ export default class CleanCommand extends Command {
12
12
  static description = 'Clean the project.';
13
13
  static enableJsonFlag = true;
14
14
  static examples = ['<%= config.bin %> <%= command.id %>'];
15
- static flags = {};
15
+ static flags = {
16
+ force: Flags.boolean({
17
+ name: 'force',
18
+ char: 'f',
19
+ description: 'Force the deletion of containers & images',
20
+ }),
21
+ };
16
22
  async run() {
17
23
  const { monorepo } = getContext();
24
+ const { flags } = await this.parse(CleanCommand);
18
25
  const runner = new Listr([
19
26
  {
20
27
  rendererOptions: { persistentOutput: true },
@@ -25,5 +32,9 @@ export default class CleanCommand extends Command {
25
32
  },
26
33
  ]);
27
34
  await runner.run();
35
+ await this.config.runCommand('down');
36
+ await this.config.runCommand('containers:prune');
37
+ await this.config.runCommand('images:delete', flags.force ? ['--force'] : undefined);
38
+ await this.config.runCommand('images:prune', flags.force ? ['-a'] : undefined);
28
39
  }
29
40
  }
@@ -1,11 +1,15 @@
1
1
  import { FlavoredCommand } from '../../index.js';
2
+ import { BuildComponentMeta } from '../../../monorepo/index.js';
2
3
  export default class BuildCommand extends FlavoredCommand<typeof BuildCommand> {
3
4
  static args: {
4
5
  component: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
5
6
  };
6
7
  static description: string;
7
8
  static examples: string[];
8
- static flags: {};
9
+ static flags: {
10
+ 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ static enableJsonFlag: boolean;
9
13
  static strict: boolean;
10
- run(): Promise<void>;
14
+ run(): Promise<Record<string, BuildComponentMeta>>;
11
15
  }
@@ -1,10 +1,10 @@
1
- import { Args } from '@oclif/core';
1
+ import { Args, Flags } from '@oclif/core';
2
2
  import { FlavoredCommand, getContext } from '../../index.js';
3
- import { BuildComponentsOperation } from '../../../monorepo/operations/index.js';
3
+ import { BuildComponentsOperation } from '../../../monorepo/index.js';
4
4
  export default class BuildCommand extends FlavoredCommand {
5
5
  static args = {
6
6
  component: Args.string({
7
- description: 'List of components to build',
7
+ description: 'List of components to build (defaults to all)',
8
8
  required: false,
9
9
  }),
10
10
  };
@@ -12,13 +12,23 @@ export default class BuildCommand extends FlavoredCommand {
12
12
  static examples = [
13
13
  `<%= config.bin %> <%= command.id %> build --flavor development`,
14
14
  ];
15
- static flags = {};
15
+ static flags = {
16
+ 'dry-run': Flags.boolean({
17
+ required: false,
18
+ description: 'Do not build the components but only produce build meta information',
19
+ }),
20
+ };
21
+ static enableJsonFlag = true;
16
22
  static strict = false;
17
23
  async run() {
18
- const { argv } = await this.parse(BuildCommand);
24
+ const { argv, flags } = await this.parse(BuildCommand);
19
25
  const { monorepo } = getContext();
20
- await monorepo.run(new BuildComponentsOperation(), {
21
- components: argv.length > 0 ? argv : undefined,
26
+ return monorepo.run(new BuildComponentsOperation(), {
27
+ dryRun: flags['dry-run'],
28
+ silent: flags.json,
29
+ components: argv.length > 0
30
+ ? argv
31
+ : monorepo.components.map((c) => c.name),
22
32
  });
23
33
  }
24
34
  }
@@ -7,10 +7,9 @@ export default class ConfigPrint extends FlavoredCommand {
7
7
  async run() {
8
8
  const { flags } = await this.parse(ConfigPrint);
9
9
  const context = await getContext();
10
- const { monorepo } = context;
11
10
  if (!flags.json) {
12
- this.log(YAML.stringify(monorepo.config));
11
+ this.log(YAML.stringify(context.monorepo.config));
13
12
  }
14
- return monorepo.config;
13
+ return context.monorepo.config;
15
14
  }
16
15
  }
@@ -1,5 +1,5 @@
1
- import { Command } from '@oclif/core';
2
- export default class DownCommand extends Command {
1
+ import { FlavoredCommand } from '../index.js';
2
+ export default class DownCommand extends FlavoredCommand<typeof DownCommand> {
3
3
  static description: string;
4
4
  static enableJsonFlag: boolean;
5
5
  static examples: string[];
@@ -1,8 +1,7 @@
1
- import { getContext } from '../../index.js';
2
- import { Command } from '@oclif/core';
3
1
  import { Listr } from 'listr2';
4
- import { down } from '../../docker/index.js';
5
- export default class DownCommand extends Command {
2
+ import { FlavoredCommand, getContext } from '../index.js';
3
+ import { ComposeDownOperation } from '../../docker/index.js';
4
+ export default class DownCommand extends FlavoredCommand {
6
5
  static description = 'Stop the whole project.';
7
6
  static enableJsonFlag = true;
8
7
  static examples = ['<%= config.bin %> <%= command.id %>'];
@@ -12,27 +11,8 @@ export default class DownCommand extends Command {
12
11
  const runner = new Listr([
13
12
  {
14
13
  rendererOptions: { persistentOutput: true },
15
- async task(ctx, task) {
16
- const process = await down({ cwd: monorepo.rootDir });
17
- const handleOutput = (chunk) => {
18
- const line = chunk.toString();
19
- task.output = line.trimEnd(); // This updates the live output in Listr
20
- };
21
- process.stdout?.on('data', handleOutput);
22
- process.stderr?.on('data', handleOutput);
23
- return new Promise((resolve, reject) => {
24
- process.on('exit', (code) => {
25
- if (code === 0) {
26
- resolve(null);
27
- }
28
- else {
29
- reject(new Error(`Command failed with code ${code}`));
30
- }
31
- });
32
- process.on('error', (err) => {
33
- reject(err);
34
- });
35
- });
14
+ async task() {
15
+ return monorepo.run(new ComposeDownOperation(), {});
36
16
  },
37
17
  title: 'Stopping project',
38
18
  },
@@ -9,14 +9,20 @@ export default class TasksIndex extends Command {
9
9
  static flags = {};
10
10
  async run() {
11
11
  const { flags } = await this.parse(TasksIndex);
12
- const context = await getContext();
13
- const { monorepo } = context;
14
- const { tasks } = monorepo;
12
+ const { monorepo: { tasks }, } = await getContext();
15
13
  if (!flags.json)
16
14
  printTable({
17
15
  ...TABLE_DEFAULTS,
18
- columns: ['id', 'component', 'name', 'description'],
19
- data: tasks,
16
+ columns: ['name', 'component', 'description', 'id'],
17
+ data: tasks.toSorted((a, b) => {
18
+ if (a.component === b.component) {
19
+ return a.name < b.name ? -1 : 1;
20
+ }
21
+ if (!a.component && b.component) {
22
+ return -1;
23
+ }
24
+ return 0;
25
+ }),
20
26
  });
21
27
  return tasks;
22
28
  }
@@ -1,13 +1,14 @@
1
1
  import { Command } from '@oclif/core';
2
2
  export default class RunTask extends Command {
3
3
  static args: {
4
- task: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
4
+ task: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
5
5
  };
6
6
  static description: string;
7
7
  static enableJsonFlag: boolean;
8
8
  static examples: string[];
9
9
  static flags: {
10
10
  executor: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'all-matching': import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
12
  };
12
13
  static strict: boolean;
13
14
  run(): Promise<void>;
@@ -1,64 +1,49 @@
1
- import { getContext } from '../../../index.js';
1
+ import { AmbiguousTaskError, getContext } from '../../../index.js';
2
2
  import { Args, Command, Flags } from '@oclif/core';
3
- import { Listr } from 'listr2';
4
- import { ExecutorType, RunTaskOperation, } from '../../../monorepo/operations/tasks/RunTaskOperation.js';
3
+ import { ExecutorType, RunTasksOperation } from '../../../monorepo/index.js';
5
4
  export default class RunTask extends Command {
6
5
  static args = {
7
6
  task: Args.string({
8
- description: 'List of tasks ids to run (eg: component:task)',
9
- required: false,
7
+ description: 'List of tasks to run. You can provide either ids or names (eg: component:task or task)',
8
+ required: true,
10
9
  }),
11
10
  };
12
- static description = 'Run a task.';
11
+ static description = 'Run tasks.';
13
12
  static enableJsonFlag = true;
14
13
  static examples = ['<%= config.bin %> <%= command.id %>'];
15
14
  static flags = {
16
15
  executor: Flags.string({
17
- char: 'x',
18
16
  name: 'executor',
17
+ char: 'x',
18
+ description: 'Where to run the task. (experimental!)',
19
19
  options: Object.values(ExecutorType),
20
20
  }),
21
+ 'all-matching': Flags.boolean({
22
+ name: 'all-matching',
23
+ char: 'a',
24
+ description: 'Run all tasks matching (when multiple matches)',
25
+ default: false,
26
+ }),
21
27
  };
22
28
  static strict = false;
23
29
  async run() {
24
30
  const { argv, flags } = await this.parse(RunTask);
25
- const context = await getContext();
26
- const { monorepo } = context;
27
- const toRun = argv.length > 0
28
- ? argv.reduce((tasks, t) => {
29
- const found = monorepo.tasks.filter((task) => task.id === t);
30
- if (found.length === 0) {
31
- throw new Error(`Task ${t} not found`);
32
- }
33
- return [...tasks, ...found];
34
- }, [])
35
- : monorepo.tasks;
36
- const runTasks = toRun.map((task) => {
37
- const executor = flags.executor ||
38
- (task.component ? ExecutorType.container : ExecutorType.local);
39
- return {
40
- rendererOptions: { persistentOutput: true },
41
- async task(_ctx, listrTask) {
42
- await monorepo.run(new RunTaskOperation(listrTask.stdout()), {
43
- executor,
44
- task,
45
- });
46
- },
47
- title: `Running ${task.id} (${executor})`,
48
- };
49
- });
50
- const runner = new Listr([
51
- {
52
- rendererOptions: { persistentOutput: true },
53
- async task(ctx, task) {
54
- return task.newListr(runTasks, {
55
- exitOnError: true,
56
- rendererOptions: { collapseSubtasks: false },
57
- });
58
- },
59
- title: 'Running tasks',
60
- },
61
- ]);
62
- await runner.run();
31
+ const { monorepo } = await getContext();
32
+ try {
33
+ await monorepo.run(new RunTasksOperation(), {
34
+ tasks: argv,
35
+ executor: flags.executor,
36
+ allMatching: flags['all-matching'],
37
+ });
38
+ }
39
+ catch (error) {
40
+ if (error instanceof AmbiguousTaskError) {
41
+ throw error.toCliError([
42
+ `Specify just one. Eg: \`emb tasks run ${error.options[0]}\``,
43
+ 'Run the same command with --all-matches / -a',
44
+ 'Review the list of tasks by running `emb tasks`',
45
+ ]);
46
+ }
47
+ }
63
48
  }
64
49
  }
@@ -4,7 +4,7 @@ export default class UpCommand extends FlavoredCommand<typeof UpCommand> {
4
4
  static enableJsonFlag: boolean;
5
5
  static examples: string[];
6
6
  static flags: {
7
- 'force-recreate': import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
8
  };
9
9
  run(): Promise<void>;
10
10
  }
@@ -1,49 +1,27 @@
1
1
  import { Flags } from '@oclif/core';
2
- import { Listr } from 'listr2';
3
2
  import { FlavoredCommand, getContext } from '../index.js';
4
- import { up } from '../../docker/index.js';
3
+ import { ComposeUpOperation } from '../../docker/index.js';
4
+ import { BuildComponentsOperation } from '../../monorepo/index.js';
5
5
  export default class UpCommand extends FlavoredCommand {
6
6
  static description = 'Start the whole project.';
7
7
  static enableJsonFlag = true;
8
8
  static examples = ['<%= config.bin %> <%= command.id %>'];
9
9
  static flags = {
10
- 'force-recreate': Flags.boolean({
10
+ force: Flags.boolean({
11
11
  char: 'f',
12
12
  default: false,
13
- description: "Recreate containers even if their configuration and image haven't changed",
14
- name: 'force-recreate',
13
+ description: 'Bypass caches, force the recreation of containers, etc',
14
+ name: 'force',
15
15
  }),
16
16
  };
17
17
  async run() {
18
+ const { flags } = await this.parse(UpCommand);
18
19
  const { monorepo } = getContext();
19
- const runner = new Listr([
20
- {
21
- rendererOptions: { persistentOutput: true },
22
- async task(ctx, task) {
23
- const process = await up({ cwd: monorepo.rootDir });
24
- const handleOutput = (chunk) => {
25
- const line = chunk.toString();
26
- task.output = line.trimEnd(); // This updates the live output in Listr
27
- };
28
- process.stdout?.on('data', handleOutput);
29
- process.stderr?.on('data', handleOutput);
30
- return new Promise((resolve, reject) => {
31
- process.on('exit', (code) => {
32
- if (code === 0) {
33
- resolve(null);
34
- }
35
- else {
36
- reject(new Error(`Command failed with code ${code}`));
37
- }
38
- });
39
- process.on('error', (err) => {
40
- reject(err);
41
- });
42
- });
43
- },
44
- title: 'Starting project',
45
- },
46
- ]);
47
- await runner.run();
20
+ await monorepo.run(new BuildComponentsOperation(), {
21
+ components: monorepo.components.map((c) => c.name),
22
+ });
23
+ await monorepo.run(new ComposeUpOperation(), {
24
+ forceRecreate: flags.force,
25
+ });
48
26
  }
49
27
  }
@@ -19,8 +19,9 @@ export const toProjectConfig = (config, rootDir) => {
19
19
  project.rootDir = rootDir || cwd();
20
20
  }
21
21
  const components = config.components || [];
22
- const { defaults, env, flavors, plugins, vars } = config;
22
+ const { defaults, flavors, ...rest } = config;
23
23
  return {
24
+ ...rest,
24
25
  components,
25
26
  defaults: {
26
27
  ...defaults,
@@ -32,12 +33,9 @@ export const toProjectConfig = (config, rootDir) => {
32
33
  },
33
34
  },
34
35
  },
35
- env,
36
36
  flavors: flavors?.map(toFlavor),
37
- plugins,
38
37
  project: {
39
38
  ...project,
40
39
  },
41
- vars,
42
40
  };
43
41
  };
@@ -1,5 +1,6 @@
1
1
  import { IMonorepoConfig } from './types.js';
2
2
  export * from './convert.js';
3
+ export * from './schema.js';
3
4
  export * from './types.js';
4
5
  export * from './validation.js';
5
6
  export declare const loadConfig: (force?: boolean) => Promise<IMonorepoConfig>;
@@ -3,6 +3,7 @@ import { dirname } from 'node:path';
3
3
  import { toProjectConfig } from './convert.js';
4
4
  import { validateUserConfig } from './validation.js';
5
5
  export * from './convert.js';
6
+ export * from './schema.js';
6
7
  export * from './types.js';
7
8
  export * from './validation.js';
8
9
  let config;
@@ -3,6 +3,19 @@
3
3
  * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
4
4
  * and run json-schema-to-typescript to regenerate this file.
5
5
  */
6
+ export type Task = Task1 & {
7
+ name: string;
8
+ description?: string;
9
+ script?: string;
10
+ executor?: string;
11
+ options?: {
12
+ [k: string]: unknown;
13
+ };
14
+ pre?: string[];
15
+ };
16
+ export type Task1 = {
17
+ [k: string]: unknown;
18
+ };
6
19
  export interface EMBConfigSchema {
7
20
  project: string | {
8
21
  /**
@@ -33,6 +46,7 @@ export interface EMBConfigSchema {
33
46
  defaults?: Defaults;
34
47
  components?: Component[];
35
48
  flavors?: Flavor[];
49
+ tasks?: Task[];
36
50
  }
37
51
  /**
38
52
  * Default settings for build aspects
@@ -58,37 +72,30 @@ export interface Component {
58
72
  * The name of the component.
59
73
  */
60
74
  name: string;
61
- /**
62
- * The directory of the component.
63
- */
64
- context?: string;
75
+ docker?: {
76
+ /**
77
+ * The directory of the component.
78
+ */
79
+ context?: string;
80
+ buildArgs?: {
81
+ [k: string]: string;
82
+ };
83
+ dependencies?: string[];
84
+ /**
85
+ * The stage to target for the build
86
+ */
87
+ target?: string;
88
+ /**
89
+ * The Dockerfile to use
90
+ */
91
+ dockerfile?: string;
92
+ };
65
93
  /**
66
94
  * A description of the component.
67
95
  */
68
96
  description?: string;
69
- buildArgs?: {
70
- [k: string]: string;
71
- };
72
- dependencies?: string[];
73
- /**
74
- * The stage to target for the build
75
- */
76
- target?: string;
77
- /**
78
- * The Dockerfile to use
79
- */
80
- dockerfile?: string;
81
97
  tasks?: Task[];
82
98
  }
83
- export interface Task {
84
- name: string;
85
- description?: string;
86
- script: string;
87
- executor?: string;
88
- options?: {
89
- [k: string]: unknown;
90
- };
91
- }
92
99
  export interface Flavor {
93
100
  name: string;
94
101
  /**