@venizia/ignis-boot 0.0.6-1 → 0.1.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.
Files changed (33) hide show
  1. package/dist/cjs/base/base-artifact-booter.d.ts.map +1 -1
  2. package/dist/cjs/base/base-artifact-booter.js +6 -2
  3. package/dist/cjs/base/base-artifact-booter.js.map +1 -1
  4. package/dist/cjs/boot.mixin.d.ts +10 -9
  5. package/dist/cjs/boot.mixin.d.ts.map +1 -1
  6. package/dist/cjs/boot.mixin.js +13 -7
  7. package/dist/cjs/boot.mixin.js.map +1 -1
  8. package/dist/cjs/bootstrapper.d.ts.map +1 -1
  9. package/dist/cjs/bootstrapper.js +35 -8
  10. package/dist/cjs/bootstrapper.js.map +1 -1
  11. package/dist/cjs/common/types.d.ts +8 -0
  12. package/dist/cjs/common/types.d.ts.map +1 -1
  13. package/dist/cjs/utilities/boot.utility.d.ts +1 -6
  14. package/dist/cjs/utilities/boot.utility.d.ts.map +1 -1
  15. package/dist/cjs/utilities/boot.utility.js +8 -10
  16. package/dist/cjs/utilities/boot.utility.js.map +1 -1
  17. package/dist/esm/base/base-artifact-booter.d.ts.map +1 -1
  18. package/dist/esm/base/base-artifact-booter.js +6 -2
  19. package/dist/esm/base/base-artifact-booter.js.map +1 -1
  20. package/dist/esm/boot.mixin.d.ts +10 -9
  21. package/dist/esm/boot.mixin.d.ts.map +1 -1
  22. package/dist/esm/boot.mixin.js +8 -2
  23. package/dist/esm/boot.mixin.js.map +1 -1
  24. package/dist/esm/bootstrapper.d.ts.map +1 -1
  25. package/dist/esm/bootstrapper.js +35 -8
  26. package/dist/esm/bootstrapper.js.map +1 -1
  27. package/dist/esm/common/types.d.ts +8 -0
  28. package/dist/esm/common/types.d.ts.map +1 -1
  29. package/dist/esm/utilities/boot.utility.d.ts +1 -6
  30. package/dist/esm/utilities/boot.utility.d.ts.map +1 -1
  31. package/dist/esm/utilities/boot.utility.js +7 -8
  32. package/dist/esm/utilities/boot.utility.js.map +1 -1
  33. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"base-artifact-booter.d.ts","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,8BAAsB,kBAAmB,SAAQ,UAAW,YAAW,OAAO;IAC5E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAM;IAC5B,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAM;IACjD,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IACzC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAM;IAE5C,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,MAAM,EAAE;IAC7C,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,MAAM,EAAE;IACnD,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;gBAE5B,IAAI,EAAE,cAAc;IAOhC,SAAS,CAAC,UAAU,IAAI,MAAM;IA+BxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAY1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
1
+ {"version":3,"file":"base-artifact-booter.d.ts","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,8BAAsB,kBAAmB,SAAQ,UAAW,YAAW,OAAO;IAC5E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAM;IAC5B,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAM;IACjD,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IACzC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAM;IAE5C,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,MAAM,EAAE;IAC7C,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,MAAM,EAAE;IACnD,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;gBAE5B,IAAI,EAAE,cAAc;IAOhC,SAAS,CAAC,UAAU,IAAI,MAAM;IA+BxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAc1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB5B"}
@@ -40,12 +40,14 @@ class BaseArtifactBooter extends ignis_helpers_1.BaseHelper {
40
40
  }
41
41
  }
42
42
  async configure() {
43
+ // No trailing `...this.artifactOptions` spread: a key that EXISTS but holds undefined - the
44
+ // shape `dirs: process.env.APP_DIRS?.split(',')` produces - would overwrite the default that
45
+ // was just computed, and getPattern() would throw "No directories specified".
43
46
  this.artifactOptions = {
44
47
  dirs: this.artifactOptions?.dirs ?? this.getDefaultDirs(),
45
48
  extensions: this.artifactOptions?.extensions ?? this.getDefaultExtensions(),
46
49
  isNested: this.artifactOptions?.isNested ?? true,
47
50
  glob: this.artifactOptions?.glob,
48
- ...this.artifactOptions,
49
51
  };
50
52
  this.logger.for(this.configure.name).debug(`Configured: %j`, this.artifactOptions);
51
53
  }
@@ -61,6 +63,7 @@ class BaseArtifactBooter extends ignis_helpers_1.BaseHelper {
61
63
  catch (error) {
62
64
  throw (0, ignis_helpers_1.getError)({
63
65
  message: `[discover] Failed to discover files using pattern: ${pattern} | Error: ${error?.message}`,
66
+ cause: error,
64
67
  });
65
68
  }
66
69
  }
@@ -71,12 +74,13 @@ class BaseArtifactBooter extends ignis_helpers_1.BaseHelper {
71
74
  }
72
75
  try {
73
76
  this.loadedClasses = [];
74
- this.loadedClasses = await (0, utilities_1.loadClasses)({ files: this.discoveredFiles, root: this.root });
77
+ this.loadedClasses = await (0, utilities_1.loadClasses)({ files: this.discoveredFiles });
75
78
  await this.bind();
76
79
  }
77
80
  catch (error) {
78
81
  throw (0, ignis_helpers_1.getError)({
79
82
  message: `[load] Failed to load classes from discovered files | Error: ${error?.message}`,
83
+ cause: error,
80
84
  });
81
85
  }
82
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-artifact-booter.js","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-artifact-booter.js","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"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"}
@@ -1,39 +1,41 @@
1
- import { IBootOptions, IBootReport } from '@venizia/ignis-boot';
1
+ import { IBootOptions, IBootReport } from './common/types';
2
2
  import { TMixinTarget } from '@venizia/ignis-helpers';
3
3
  import { Container } from '@venizia/ignis-inversion';
4
4
  export declare const BootMixin: <T extends TMixinTarget<Container>>(baseClass: T) => {
5
5
  new (...args: any[]): {
6
6
  bootOptions?: IBootOptions | undefined;
7
+ projectRoot?: string;
7
8
  boot(): Promise<IBootReport>;
9
+ instantiate: <T_1>(cls: import("@venizia/ignis-inversion").TClass<T_1>) => T_1;
8
10
  getMetadataRegistry: () => import("@venizia/ignis-inversion").MetadataRegistry;
9
11
  bind: <T_1>(opts: {
10
- key: string | symbol;
12
+ key: import("@venizia/ignis-inversion").TBindingKey;
11
13
  }) => import("@venizia/ignis-inversion").Binding<T_1>;
12
14
  isBound: (opts: {
13
- key: string | symbol;
15
+ key: import("@venizia/ignis-inversion").TBindingKey;
14
16
  }) => boolean;
15
17
  getBinding: <T_1>(opts: {
16
- key: string | symbol | {
18
+ key: import("@venizia/ignis-inversion").TBindingKey | {
17
19
  namespace: string;
18
20
  key: string;
19
21
  };
20
22
  }) => import("@venizia/ignis-inversion").TNullable<import("@venizia/ignis-inversion").Binding<T_1>>;
21
23
  unbind: (opts: {
22
- key: string | symbol;
24
+ key: import("@venizia/ignis-inversion").TBindingKey;
23
25
  }) => boolean;
24
26
  set: <T_1>(opts: {
25
27
  binding: import("@venizia/ignis-inversion").Binding<T_1>;
26
28
  }) => void;
27
29
  get: {
28
30
  <T_1>(opts: {
29
- key: string | symbol | {
31
+ key: import("@venizia/ignis-inversion").TBindingKey | {
30
32
  namespace: string;
31
33
  key: string;
32
34
  };
33
35
  isOptional?: false;
34
36
  }): T_1;
35
37
  <T_1>(opts: {
36
- key: string | symbol | {
38
+ key: import("@venizia/ignis-inversion").TBindingKey | {
37
39
  namespace: string;
38
40
  key: string;
39
41
  };
@@ -42,7 +44,7 @@ export declare const BootMixin: <T extends TMixinTarget<Container>>(baseClass: T
42
44
  };
43
45
  gets: <T_1 extends unknown[]>(opts: {
44
46
  bindings: { [K in keyof T_1]: {
45
- key: string | symbol | {
47
+ key: import("@venizia/ignis-inversion").TBindingKey | {
46
48
  namespace: string;
47
49
  key: string;
48
50
  };
@@ -50,7 +52,6 @@ export declare const BootMixin: <T extends TMixinTarget<Container>>(baseClass: T
50
52
  }; };
51
53
  }) => { [K in keyof T_1]: T_1[K] | undefined; };
52
54
  resolve: <T_1>(cls: import("@venizia/ignis-inversion").TClass<T_1>) => T_1;
53
- instantiate: <T_1>(cls: import("@venizia/ignis-inversion").TClass<T_1>) => T_1;
54
55
  findByTag: <T_1 = any>(opts: {
55
56
  tag: string;
56
57
  exclude?: Array<string> | Set<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"boot.mixin.d.ts","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,YAAY,EACZ,WAAW,EAGZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAiB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEpE,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,YAAY,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;kBAEhD,GAAG,EAAE;sBAaZ,YAAY,GAAG,SAAS;gBAE9B,OAAO,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;0BAQyd,CAAC;;;;;;;0BAA6J,CAAC;;;;;;;;;0BAAwR,CAAC;;;;;;;mBAA6O,CAAC;;;;;;;KAD9pC,CAAC"}
1
+ {"version":3,"file":"boot.mixin.d.ts","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAiB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEpE,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,YAAY,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;kBAEhD,GAAG,EAAE;sBAaZ,YAAY,GAAG,SAAS;sBACxB,MAAM;gBAEZ,OAAO,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAH5B,CAAC;;;;;;;0BAI+C,CAAC;;;;;;;;;0BAUpC,CAAC;;;;;;mBAAsM,CAAC;;;;;;;KADxN,CAAC"}
@@ -1,20 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BootMixin = void 0;
4
- const ignis_boot_1 = require("@venizia/ignis-boot");
4
+ // Never '@venizia/ignis-boot' here: importing the package from inside itself resolves through its
5
+ // own dist, so the source depends on a build of itself - a stale or half-written dist then breaks
6
+ // the very code that produces it.
7
+ const booters_1 = require("./booters");
8
+ const bootstrapper_1 = require("./bootstrapper");
5
9
  const ignis_inversion_1 = require("@venizia/ignis-inversion");
6
10
  const BootMixin = (baseClass) => {
7
11
  class Mixed extends baseClass {
8
12
  constructor(...args) {
9
13
  super(...args);
10
- this.bind({ key: `@app/boot-options` }).toValue(this.bootOptions ?? {});
11
- this.bind({ key: 'booter.DatasourceBooter' }).toClass(ignis_boot_1.DatasourceBooter).setTags('booter');
12
- this.bind({ key: 'booter.RepositoryBooter' }).toClass(ignis_boot_1.RepositoryBooter).setTags('booter');
13
- this.bind({ key: 'booter.ServiceBooter' }).toClass(ignis_boot_1.ServiceBooter).setTags('booter');
14
- this.bind({ key: 'booter.ControllerBooter' }).toClass(ignis_boot_1.ControllerBooter).setTags('booter');
15
- this.bind({ key: 'bootstrapper' }).toClass(ignis_boot_1.Bootstrapper).setScope(ignis_inversion_1.BindingScopes.SINGLETON);
14
+ this.bind({ key: '@app/instance' }).toProvider(() => this);
15
+ this.bind({ key: 'booter.DatasourceBooter' }).toClass(booters_1.DatasourceBooter).setTags('booter');
16
+ this.bind({ key: 'booter.RepositoryBooter' }).toClass(booters_1.RepositoryBooter).setTags('booter');
17
+ this.bind({ key: 'booter.ServiceBooter' }).toClass(booters_1.ServiceBooter).setTags('booter');
18
+ this.bind({ key: 'booter.ControllerBooter' }).toClass(booters_1.ControllerBooter).setTags('booter');
19
+ this.bind({ key: 'bootstrapper' }).toClass(bootstrapper_1.Bootstrapper).setScope(ignis_inversion_1.BindingScopes.SINGLETON);
16
20
  }
17
21
  boot() {
22
+ this.bind({ key: '@app/boot-options' }).toValue(this.bootOptions ?? {});
23
+ this.bind({ key: '@app/project_root' }).toValue(this.projectRoot ?? process.cwd());
18
24
  const bootstrapper = this.get({ key: 'bootstrapper' });
19
25
  return bootstrapper.boot({});
20
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"boot.mixin.js","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":";;;AAAA,oDAS6B;AAE7B,8DAAoE;AAE7D,MAAM,SAAS,GAAG,CAAoC,SAAY,EAAE,EAAE;IAC3E,MAAM,KAAM,SAAQ,SAAS;QAC3B,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAEf,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAExE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,6BAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,6BAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,0BAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpF,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,6BAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,yBAAY,CAAC,CAAC,QAAQ,CAAC,+BAAa,CAAC,SAAS,CAAC,CAAC;QAC7F,CAAC;QAID,IAAI;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAe,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;YACrE,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAxBW,QAAA,SAAS,aAwBpB"}
1
+ {"version":3,"file":"boot.mixin.js","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":";;;AAAA,kGAAkG;AAClG,kGAAkG;AAClG,kCAAkC;AAClC,uCAAgG;AAChG,iDAA8C;AAG9C,8DAAoE;AAE7D,MAAM,SAAS,GAAG,CAAoC,SAAY,EAAE,EAAE;IAC3E,MAAM,KAAM,SAAQ,SAAS;QAC3B,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAEf,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,0BAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,0BAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpF,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,0BAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,2BAAY,CAAC,CAAC,QAAQ,CAAC,+BAAa,CAAC,SAAS,CAAC,CAAC;QAC7F,CAAC;QAKD,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAEnF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAe,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;YACrE,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AA5BW,QAAA,SAAS,aA4BpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapper.d.ts","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEZ,qBAAqB,EACrB,WAAW,EACX,aAAa,EAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAG9D,qBAAa,YAAa,SAAQ,UAAW,YAAW,aAAa;IAKrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ1E,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,eAAe,CAAkC;gBAEM,WAAW,EAAE,YAAY;IAIlF,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;YAa/C,eAAe;YASf,QAAQ;IAoDtB,OAAO,CAAC,cAAc;CAMvB"}
1
+ {"version":3,"file":"bootstrapper.d.ts","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEZ,qBAAqB,EACrB,WAAW,EACX,aAAa,EAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAG9D,qBAAa,YAAa,SAAQ,UAAW,YAAW,aAAa;IAKrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ1E,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,eAAe,CAAkC;gBAEM,WAAW,EAAE,YAAY;IAIlF,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;YAgB/C,eAAe;YA4Bf,QAAQ;IAuDtB,OAAO,CAAC,cAAc;CAiBvB"}
@@ -27,24 +27,40 @@ let Bootstrapper = Bootstrapper_1 = class Bootstrapper extends ignis_helpers_1.B
27
27
  }
28
28
  async boot(opts) {
29
29
  const { phases = types_1.BOOT_PHASES, booters } = opts;
30
- await this.discoverBooters();
30
+ const startedAt = performance.now();
31
+ await this.discoverBooters({ booterNames: booters });
31
32
  this.logger
32
33
  .for(this.boot.name)
33
34
  .debug(`Starting boot | Number of booters: %d`, this.booters.length);
34
35
  for (const phase of phases) {
35
- await this.runPhase({ phase, booterNames: booters });
36
+ await this.runPhase({ phase });
36
37
  }
37
- return this.generateReport();
38
+ return this.generateReport({ phases, totalDurationMs: performance.now() - startedAt });
38
39
  }
39
- async discoverBooters() {
40
+ async discoverBooters(opts) {
41
+ const { booterNames } = opts;
42
+ // Reset first: pushing onto the previous run's list would register every artifact again -
43
+ // duplicate controllers, duplicate repository bindings - on a second boot().
44
+ this.booters = [];
45
+ this.phaseStartTimings.clear();
46
+ this.phaseEndTimings.clear();
47
+ const wanted = booterNames?.length ? new Set(booterNames) : undefined;
40
48
  const booterBindings = this.application.findByTag({ tag: 'booter' });
41
49
  for (const binding of booterBindings) {
42
- this.booters.push(binding.getValue(this.application));
50
+ const booter = binding.getValue(this.application);
51
+ // An ignored filter is worse than no filter: the caller believes it scoped the boot.
52
+ if (wanted && !wanted.has(booter.constructor.name)) {
53
+ this.logger
54
+ .for(this.discoverBooters.name)
55
+ .debug(`SKIP booter not in filter | Booter: %s`, booter.constructor.name);
56
+ continue;
57
+ }
58
+ this.booters.push(booter);
43
59
  this.logger.for(this.discoverBooters.name).debug(`Discovered booter: %s`, binding.key);
44
60
  }
45
61
  }
46
62
  async runPhase(opts) {
47
- const { phase } = opts; // TODO: booterNames filtering can be implemented later
63
+ const { phase } = opts;
48
64
  this.phaseStartTimings.set(phase, performance.now());
49
65
  this.logger.for(this.runPhase.name).debug(`Starting phase: %s`, phase.toUpperCase());
50
66
  for (const booter of this.booters) {
@@ -69,8 +85,11 @@ let Bootstrapper = Bootstrapper_1 = class Bootstrapper extends ignis_helpers_1.B
69
85
  }
70
86
  catch (error) {
71
87
  const errorMessage = error?.message || String(error);
88
+ // Without the cause, a boot failure reaches the operator as a bare message: the stack of the
89
+ // booter that actually threw - the real diagnosis - is gone.
72
90
  throw (0, ignis_helpers_1.getError)({
73
91
  message: `[Bootstrapper][runPhase] Error during phase '${phase}' on booter '${booter.constructor.name}': ${errorMessage}`,
92
+ cause: error,
74
93
  });
75
94
  }
76
95
  }
@@ -82,8 +101,16 @@ let Bootstrapper = Bootstrapper_1 = class Bootstrapper extends ignis_helpers_1.B
82
101
  .for(this.runPhase.name)
83
102
  .debug(`Completed phase: %s | Took: %d ms`, phase.toUpperCase(), duration);
84
103
  }
85
- generateReport() {
86
- const report = {};
104
+ generateReport(opts) {
105
+ const { phases, totalDurationMs } = opts;
106
+ const report = {
107
+ booters: this.booters.map(booter => booter.constructor.name),
108
+ phases: phases.map(phase => ({
109
+ phase,
110
+ durationMs: (this.phaseEndTimings.get(phase) ?? 0) - (this.phaseStartTimings.get(phase) ?? 0),
111
+ })),
112
+ totalDurationMs,
113
+ };
87
114
  this.logger.for(this.generateReport.name).debug(`Boot report: %j`, report);
88
115
  return report;
89
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapper.js","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrapper.js","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,14 @@ export interface IBootExecutionOptions {
39
39
  export interface IBootstrapper {
40
40
  boot(opts: IBootExecutionOptions): Promise<IBootReport>;
41
41
  }
42
+ export interface IBootPhaseReport {
43
+ phase: TBootPhase;
44
+ durationMs: number;
45
+ }
42
46
  export interface IBootReport {
47
+ /** Class names of the booters that actually ran, in execution order. */
48
+ booters: string[];
49
+ phases: IBootPhaseReport[];
50
+ totalDurationMs: number;
43
51
  }
44
52
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,UAAU,CAAC,CAAC;AAExD,eAAO,MAAM,WAAW,EAAE,UAAU,EAAsC,CAAC;AAE3E,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,cAAc,IAAI,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,WAAW;CAAG"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,UAAU,CAAC,CAAC;AAExD,eAAO,MAAM,WAAW,EAAE,UAAU,EAAsC,CAAC;AAE3E,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,cAAc,IAAI,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB"}
@@ -1,14 +1,9 @@
1
- import { AnyType, TClass } from '@venizia/ignis-helpers';
2
- /** Check if a value is a class constructor. */
3
- export declare const isClass: <T>(target: AnyType) => target is TClass<T>;
4
- /** Discover files matching a glob pattern. */
1
+ import { AnyType } from '@venizia/ignis-helpers';
5
2
  export declare const discoverFiles: (opts: {
6
3
  pattern: string;
7
4
  root: string;
8
5
  }) => Promise<string[]>;
9
- /** Load classes from discovered files via dynamic import. */
10
6
  export declare const loadClasses: (opts: {
11
7
  files: string[];
12
- root: string;
13
8
  }) => Promise<AnyType[]>;
14
9
  //# sourceMappingURL=boot.utility.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boot.utility.d.ts","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGnE,+CAA+C;AAC/C,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,QAAQ,OAAO,KAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAE9D,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,aAAa,EAAE,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,OAAO,CAAC,MAAM,EAAE,CAYrB,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,WAAW,EAAE,CAAC,IAAI,EAAE;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,OAAO,CAAC,OAAO,EAAE,CAuBtB,CAAC"}
1
+ {"version":3,"file":"boot.utility.d.ts","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA6B,MAAM,wBAAwB,CAAC;AAG5E,eAAO,MAAM,aAAa,EAAE,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,OAAO,CAAC,MAAM,EAAE,CAarB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CA2BzE,CAAC"}
@@ -1,14 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadClasses = exports.discoverFiles = exports.isClass = void 0;
3
+ exports.loadClasses = exports.discoverFiles = void 0;
4
4
  const ignis_helpers_1 = require("@venizia/ignis-helpers");
5
5
  const glob_1 = require("glob");
6
- /** Check if a value is a class constructor. */
7
- const isClass = (target) => {
8
- return typeof target === 'function' && target.prototype !== undefined;
9
- };
10
- exports.isClass = isClass;
11
- /** Discover files matching a glob pattern. */
12
6
  const discoverFiles = async (opts) => {
13
7
  const { pattern, root } = opts;
14
8
  try {
@@ -19,19 +13,20 @@ const discoverFiles = async (opts) => {
19
13
  const errorMessage = error.message ?? 'Unknown error';
20
14
  throw (0, ignis_helpers_1.getError)({
21
15
  message: `Failed to discover files with pattern: ${pattern} | Error: ${errorMessage}`,
16
+ cause: error,
22
17
  });
23
18
  }
24
19
  };
25
20
  exports.discoverFiles = discoverFiles;
26
- /** Load classes from discovered files via dynamic import. */
27
21
  const loadClasses = async (opts) => {
28
22
  const { files } = opts;
29
23
  const classes = [];
30
24
  for (const file of files) {
31
25
  try {
32
26
  const module = await import(file);
33
- for (const [_exportName, exported] of Object.entries(module)) {
34
- if (!(0, exports.isClass)(exported)) {
27
+ const modules = Object.values(module);
28
+ for (const exported of modules) {
29
+ if (!(0, ignis_helpers_1.isClass)(exported)) {
35
30
  continue;
36
31
  }
37
32
  classes.push(exported);
@@ -39,8 +34,11 @@ const loadClasses = async (opts) => {
39
34
  }
40
35
  catch (error) {
41
36
  const errorMessage = error.message ?? 'Unknown error';
37
+ // Without the cause, a boot failure reaches the operator as a bare message: the stack of the
38
+ // module that actually threw - the real diagnosis - is gone.
42
39
  throw (0, ignis_helpers_1.getError)({
43
40
  message: `Failed to load file: ${file} | Error: ${errorMessage}`,
41
+ cause: error,
44
42
  });
45
43
  }
46
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"boot.utility.js","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":";;;AAAA,0DAAmE;AACnE,+BAA4B;AAE5B,+CAA+C;AACxC,MAAM,OAAO,GAAG,CAAI,MAAe,EAAuB,EAAE;IACjE,OAAO,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;AACxE,CAAC,CAAC;AAFW,QAAA,OAAO,WAElB;AAEF,8CAA8C;AACvC,MAAM,aAAa,GAGA,KAAK,EAAC,IAAI,EAAC,EAAE;IACrC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;QACjE,MAAM,IAAA,wBAAQ,EAAC;YACb,OAAO,EAAE,0CAA0C,OAAO,aAAa,YAAY,EAAE;SACtF,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAfW,QAAA,aAAa,iBAexB;AAEF,6DAA6D;AACtD,MAAM,WAAW,GAGG,KAAK,EAAC,IAAI,EAAC,EAAE;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,IAAA,eAAO,EAAC,QAAQ,CAAC,EAAE,CAAC;oBACvB,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,IAAA,wBAAQ,EAAC;gBACb,OAAO,EAAE,wBAAwB,IAAI,aAAa,YAAY,EAAE;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AA1BW,QAAA,WAAW,eA0BtB"}
1
+ {"version":3,"file":"boot.utility.js","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":";;;AAAA,0DAA4E;AAC5E,+BAA4B;AAErB,MAAM,aAAa,GAGA,KAAK,EAAC,IAAI,EAAC,EAAE;IACrC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;QACjE,MAAM,IAAA,wBAAQ,EAAC;YACb,OAAO,EAAE,0CAA0C,OAAO,aAAa,YAAY,EAAE;YACrF,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAhBW,QAAA,aAAa,iBAgBxB;AAEK,MAAM,WAAW,GAAsD,KAAK,EAAC,IAAI,EAAC,EAAE;IACzF,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAA,uBAAO,EAAC,QAAQ,CAAC,EAAE,CAAC;oBACvB,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,6FAA6F;YAC7F,6DAA6D;YAC7D,MAAM,IAAA,wBAAQ,EAAC;gBACb,OAAO,EAAE,wBAAwB,IAAI,aAAa,YAAY,EAAE;gBAChE,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AA3BW,QAAA,WAAW,eA2BtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"base-artifact-booter.d.ts","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,8BAAsB,kBAAmB,SAAQ,UAAW,YAAW,OAAO;IAC5E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAM;IAC5B,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAM;IACjD,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IACzC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAM;IAE5C,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,MAAM,EAAE;IAC7C,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,MAAM,EAAE;IACnD,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;gBAE5B,IAAI,EAAE,cAAc;IAOhC,SAAS,CAAC,UAAU,IAAI,MAAM;IA+BxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAY1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
1
+ {"version":3,"file":"base-artifact-booter.d.ts","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,8BAAsB,kBAAmB,SAAQ,UAAW,YAAW,OAAO;IAC5E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAM;IAC5B,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAM;IACjD,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IACzC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAM;IAE5C,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,MAAM,EAAE;IAC7C,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,MAAM,EAAE;IACnD,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;gBAE5B,IAAI,EAAE,cAAc;IAOhC,SAAS,CAAC,UAAU,IAAI,MAAM;IA+BxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAc1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB5B"}
@@ -37,12 +37,14 @@ export class BaseArtifactBooter extends BaseHelper {
37
37
  }
38
38
  }
39
39
  async configure() {
40
+ // No trailing `...this.artifactOptions` spread: a key that EXISTS but holds undefined - the
41
+ // shape `dirs: process.env.APP_DIRS?.split(',')` produces - would overwrite the default that
42
+ // was just computed, and getPattern() would throw "No directories specified".
40
43
  this.artifactOptions = {
41
44
  dirs: this.artifactOptions?.dirs ?? this.getDefaultDirs(),
42
45
  extensions: this.artifactOptions?.extensions ?? this.getDefaultExtensions(),
43
46
  isNested: this.artifactOptions?.isNested ?? true,
44
47
  glob: this.artifactOptions?.glob,
45
- ...this.artifactOptions,
46
48
  };
47
49
  this.logger.for(this.configure.name).debug(`Configured: %j`, this.artifactOptions);
48
50
  }
@@ -58,6 +60,7 @@ export class BaseArtifactBooter extends BaseHelper {
58
60
  catch (error) {
59
61
  throw getError({
60
62
  message: `[discover] Failed to discover files using pattern: ${pattern} | Error: ${error?.message}`,
63
+ cause: error,
61
64
  });
62
65
  }
63
66
  }
@@ -68,12 +71,13 @@ export class BaseArtifactBooter extends BaseHelper {
68
71
  }
69
72
  try {
70
73
  this.loadedClasses = [];
71
- this.loadedClasses = await loadClasses({ files: this.discoveredFiles, root: this.root });
74
+ this.loadedClasses = await loadClasses({ files: this.discoveredFiles });
72
75
  await this.bind();
73
76
  }
74
77
  catch (error) {
75
78
  throw getError({
76
79
  message: `[load] Failed to load classes from discovered files | Error: ${error?.message}`,
80
+ cause: error,
77
81
  });
78
82
  }
79
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base-artifact-booter.js","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-artifact-booter.js","sourceRoot":"","sources":["../../../src/base/base-artifact-booter.ts"],"names":[],"mappings":"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"}
@@ -1,39 +1,41 @@
1
- import { IBootOptions, IBootReport } from '@venizia/ignis-boot';
1
+ import { IBootOptions, IBootReport } from './common/types';
2
2
  import { TMixinTarget } from '@venizia/ignis-helpers';
3
3
  import { Container } from '@venizia/ignis-inversion';
4
4
  export declare const BootMixin: <T extends TMixinTarget<Container>>(baseClass: T) => {
5
5
  new (...args: any[]): {
6
6
  bootOptions?: IBootOptions | undefined;
7
+ projectRoot?: string;
7
8
  boot(): Promise<IBootReport>;
9
+ instantiate: <T_1>(cls: import("@venizia/ignis-inversion").TClass<T_1>) => T_1;
8
10
  getMetadataRegistry: () => import("@venizia/ignis-inversion").MetadataRegistry;
9
11
  bind: <T_1>(opts: {
10
- key: string | symbol;
12
+ key: import("@venizia/ignis-inversion").TBindingKey;
11
13
  }) => import("@venizia/ignis-inversion").Binding<T_1>;
12
14
  isBound: (opts: {
13
- key: string | symbol;
15
+ key: import("@venizia/ignis-inversion").TBindingKey;
14
16
  }) => boolean;
15
17
  getBinding: <T_1>(opts: {
16
- key: string | symbol | {
18
+ key: import("@venizia/ignis-inversion").TBindingKey | {
17
19
  namespace: string;
18
20
  key: string;
19
21
  };
20
22
  }) => import("@venizia/ignis-inversion").TNullable<import("@venizia/ignis-inversion").Binding<T_1>>;
21
23
  unbind: (opts: {
22
- key: string | symbol;
24
+ key: import("@venizia/ignis-inversion").TBindingKey;
23
25
  }) => boolean;
24
26
  set: <T_1>(opts: {
25
27
  binding: import("@venizia/ignis-inversion").Binding<T_1>;
26
28
  }) => void;
27
29
  get: {
28
30
  <T_1>(opts: {
29
- key: string | symbol | {
31
+ key: import("@venizia/ignis-inversion").TBindingKey | {
30
32
  namespace: string;
31
33
  key: string;
32
34
  };
33
35
  isOptional?: false;
34
36
  }): T_1;
35
37
  <T_1>(opts: {
36
- key: string | symbol | {
38
+ key: import("@venizia/ignis-inversion").TBindingKey | {
37
39
  namespace: string;
38
40
  key: string;
39
41
  };
@@ -42,7 +44,7 @@ export declare const BootMixin: <T extends TMixinTarget<Container>>(baseClass: T
42
44
  };
43
45
  gets: <T_1 extends unknown[]>(opts: {
44
46
  bindings: { [K in keyof T_1]: {
45
- key: string | symbol | {
47
+ key: import("@venizia/ignis-inversion").TBindingKey | {
46
48
  namespace: string;
47
49
  key: string;
48
50
  };
@@ -50,7 +52,6 @@ export declare const BootMixin: <T extends TMixinTarget<Container>>(baseClass: T
50
52
  }; };
51
53
  }) => { [K in keyof T_1]: T_1[K] | undefined; };
52
54
  resolve: <T_1>(cls: import("@venizia/ignis-inversion").TClass<T_1>) => T_1;
53
- instantiate: <T_1>(cls: import("@venizia/ignis-inversion").TClass<T_1>) => T_1;
54
55
  findByTag: <T_1 = any>(opts: {
55
56
  tag: string;
56
57
  exclude?: Array<string> | Set<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"boot.mixin.d.ts","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,YAAY,EACZ,WAAW,EAGZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAiB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEpE,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,YAAY,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;kBAEhD,GAAG,EAAE;sBAaZ,YAAY,GAAG,SAAS;gBAE9B,OAAO,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;0BAQyd,CAAC;;;;;;;0BAA6J,CAAC;;;;;;;;;0BAAwR,CAAC;;;;;;;mBAA6O,CAAC;;;;;;;KAD9pC,CAAC"}
1
+ {"version":3,"file":"boot.mixin.d.ts","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAiB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEpE,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,YAAY,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;kBAEhD,GAAG,EAAE;sBAaZ,YAAY,GAAG,SAAS;sBACxB,MAAM;gBAEZ,OAAO,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAH5B,CAAC;;;;;;;0BAI+C,CAAC;;;;;;;;;0BAUpC,CAAC;;;;;;mBAAsM,CAAC;;;;;;;KADxN,CAAC"}
@@ -1,10 +1,14 @@
1
- import { Bootstrapper, ControllerBooter, DatasourceBooter, RepositoryBooter, ServiceBooter, } from '@venizia/ignis-boot';
1
+ // Never '@venizia/ignis-boot' here: importing the package from inside itself resolves through its
2
+ // own dist, so the source depends on a build of itself - a stale or half-written dist then breaks
3
+ // the very code that produces it.
4
+ import { ControllerBooter, DatasourceBooter, RepositoryBooter, ServiceBooter } from './booters';
5
+ import { Bootstrapper } from './bootstrapper';
2
6
  import { BindingScopes } from '@venizia/ignis-inversion';
3
7
  export const BootMixin = (baseClass) => {
4
8
  class Mixed extends baseClass {
5
9
  constructor(...args) {
6
10
  super(...args);
7
- this.bind({ key: `@app/boot-options` }).toValue(this.bootOptions ?? {});
11
+ this.bind({ key: '@app/instance' }).toProvider(() => this);
8
12
  this.bind({ key: 'booter.DatasourceBooter' }).toClass(DatasourceBooter).setTags('booter');
9
13
  this.bind({ key: 'booter.RepositoryBooter' }).toClass(RepositoryBooter).setTags('booter');
10
14
  this.bind({ key: 'booter.ServiceBooter' }).toClass(ServiceBooter).setTags('booter');
@@ -12,6 +16,8 @@ export const BootMixin = (baseClass) => {
12
16
  this.bind({ key: 'bootstrapper' }).toClass(Bootstrapper).setScope(BindingScopes.SINGLETON);
13
17
  }
14
18
  boot() {
19
+ this.bind({ key: '@app/boot-options' }).toValue(this.bootOptions ?? {});
20
+ this.bind({ key: '@app/project_root' }).toValue(this.projectRoot ?? process.cwd());
15
21
  const bootstrapper = this.get({ key: 'bootstrapper' });
16
22
  return bootstrapper.boot({});
17
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"boot.mixin.js","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAIhB,gBAAgB,EAChB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAa,MAAM,0BAA0B,CAAC;AAEpE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAoC,SAAY,EAAE,EAAE;IAC3E,MAAM,KAAM,SAAQ,SAAS;QAC3B,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAEf,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAExE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpF,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC7F,CAAC;QAID,IAAI;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAe,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;YACrE,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"boot.mixin.js","sourceRoot":"","sources":["../../src/boot.mixin.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,kGAAkG;AAClG,kCAAkC;AAClC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAa,MAAM,0BAA0B,CAAC;AAEpE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAoC,SAAY,EAAE,EAAE;IAC3E,MAAM,KAAM,SAAQ,SAAS;QAC3B,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAEf,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpF,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE1F,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC7F,CAAC;QAKD,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAEnF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAe,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;YACrE,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapper.d.ts","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEZ,qBAAqB,EACrB,WAAW,EACX,aAAa,EAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAG9D,qBAAa,YAAa,SAAQ,UAAW,YAAW,aAAa;IAKrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ1E,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,eAAe,CAAkC;gBAEM,WAAW,EAAE,YAAY;IAIlF,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;YAa/C,eAAe;YASf,QAAQ;IAoDtB,OAAO,CAAC,cAAc;CAMvB"}
1
+ {"version":3,"file":"bootstrapper.d.ts","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEZ,qBAAqB,EACrB,WAAW,EACX,aAAa,EAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAY,MAAM,wBAAwB,CAAC;AAG9D,qBAAa,YAAa,SAAQ,UAAW,YAAW,aAAa;IAKrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ1E,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,eAAe,CAAkC;gBAEM,WAAW,EAAE,YAAY;IAIlF,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;YAgB/C,eAAe;YA4Bf,QAAQ;IAuDtB,OAAO,CAAC,cAAc;CAiBvB"}
@@ -24,24 +24,40 @@ let Bootstrapper = Bootstrapper_1 = class Bootstrapper extends BaseHelper {
24
24
  }
25
25
  async boot(opts) {
26
26
  const { phases = BOOT_PHASES, booters } = opts;
27
- await this.discoverBooters();
27
+ const startedAt = performance.now();
28
+ await this.discoverBooters({ booterNames: booters });
28
29
  this.logger
29
30
  .for(this.boot.name)
30
31
  .debug(`Starting boot | Number of booters: %d`, this.booters.length);
31
32
  for (const phase of phases) {
32
- await this.runPhase({ phase, booterNames: booters });
33
+ await this.runPhase({ phase });
33
34
  }
34
- return this.generateReport();
35
+ return this.generateReport({ phases, totalDurationMs: performance.now() - startedAt });
35
36
  }
36
- async discoverBooters() {
37
+ async discoverBooters(opts) {
38
+ const { booterNames } = opts;
39
+ // Reset first: pushing onto the previous run's list would register every artifact again -
40
+ // duplicate controllers, duplicate repository bindings - on a second boot().
41
+ this.booters = [];
42
+ this.phaseStartTimings.clear();
43
+ this.phaseEndTimings.clear();
44
+ const wanted = booterNames?.length ? new Set(booterNames) : undefined;
37
45
  const booterBindings = this.application.findByTag({ tag: 'booter' });
38
46
  for (const binding of booterBindings) {
39
- this.booters.push(binding.getValue(this.application));
47
+ const booter = binding.getValue(this.application);
48
+ // An ignored filter is worse than no filter: the caller believes it scoped the boot.
49
+ if (wanted && !wanted.has(booter.constructor.name)) {
50
+ this.logger
51
+ .for(this.discoverBooters.name)
52
+ .debug(`SKIP booter not in filter | Booter: %s`, booter.constructor.name);
53
+ continue;
54
+ }
55
+ this.booters.push(booter);
40
56
  this.logger.for(this.discoverBooters.name).debug(`Discovered booter: %s`, binding.key);
41
57
  }
42
58
  }
43
59
  async runPhase(opts) {
44
- const { phase } = opts; // TODO: booterNames filtering can be implemented later
60
+ const { phase } = opts;
45
61
  this.phaseStartTimings.set(phase, performance.now());
46
62
  this.logger.for(this.runPhase.name).debug(`Starting phase: %s`, phase.toUpperCase());
47
63
  for (const booter of this.booters) {
@@ -66,8 +82,11 @@ let Bootstrapper = Bootstrapper_1 = class Bootstrapper extends BaseHelper {
66
82
  }
67
83
  catch (error) {
68
84
  const errorMessage = error?.message || String(error);
85
+ // Without the cause, a boot failure reaches the operator as a bare message: the stack of the
86
+ // booter that actually threw - the real diagnosis - is gone.
69
87
  throw getError({
70
88
  message: `[Bootstrapper][runPhase] Error during phase '${phase}' on booter '${booter.constructor.name}': ${errorMessage}`,
89
+ cause: error,
71
90
  });
72
91
  }
73
92
  }
@@ -79,8 +98,16 @@ let Bootstrapper = Bootstrapper_1 = class Bootstrapper extends BaseHelper {
79
98
  .for(this.runPhase.name)
80
99
  .debug(`Completed phase: %s | Took: %d ms`, phase.toUpperCase(), duration);
81
100
  }
82
- generateReport() {
83
- const report = {};
101
+ generateReport(opts) {
102
+ const { phases, totalDurationMs } = opts;
103
+ const report = {
104
+ booters: this.booters.map(booter => booter.constructor.name),
105
+ phases: phases.map(phase => ({
106
+ phase,
107
+ durationMs: (this.phaseEndTimings.get(phase) ?? 0) - (this.phaseStartTimings.get(phase) ?? 0),
108
+ })),
109
+ totalDurationMs,
110
+ };
84
111
  this.logger.for(this.generateReport.name).debug(`Boot report: %j`, report);
85
112
  return report;
86
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrapper.js","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EACL,WAAW,GAOZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,IAAa,YAAY,oBAAzB,MAAa,YAAa,SAAQ,UAAU;IAK1C,YAA8C,WAA0C;QACtF,KAAK,CAAC,EAAE,KAAK,EAAE,cAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QADyB,gBAAW,GAAX,WAAW,CAAc;QAJhF,YAAO,GAAc,EAAE,CAAC;QACxB,sBAAiB,GAAwB,IAAI,GAAG,EAAE,CAAC;QACnD,oBAAe,GAAwB,IAAI,GAAG,EAAE,CAAC;IAIzD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAA2B;QACpC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAE/C,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM;aACR,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;aACnB,KAAK,CAAC,uCAAuC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE9E,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,uBAAuB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAmD;QACxE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,uDAAuD;QAC/E,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAErF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM;qBACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;qBACvB,KAAK,CACJ,sDAAsD,EACtD,KAAK,EACL,MAAM,CAAC,WAAW,CAAC,IAAI,CACxB,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM;qBACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;qBACvB,KAAK,CACJ,qDAAqD,EACrD,KAAK,EACL,MAAM,CAAC,WAAW,CAAC,IAAI,CACxB,CAAC;gBACJ,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM;qBACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;qBACvB,KAAK,CAAC,kCAAkC,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC7E,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAI,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;gBAEhE,MAAM,QAAQ,CAAC;oBACb,OAAO,EAAE,gDAAgD,KAAK,gBAAgB,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,YAAY,EAAE;iBAC1H,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC;QAE7B,IAAI,CAAC,MAAM;aACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;aACvB,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAEO,cAAc;QACpB,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAE3E,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAA;AAzFY,YAAY;IAKV,WAAA,MAAM,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAA;;GALlC,YAAY,CAyFxB"}
1
+ {"version":3,"file":"bootstrapper.js","sourceRoot":"","sources":["../../src/bootstrapper.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EACL,WAAW,GAOZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,IAAa,YAAY,oBAAzB,MAAa,YAAa,SAAQ,UAAU;IAK1C,YAA8C,WAA0C;QACtF,KAAK,CAAC,EAAE,KAAK,EAAE,cAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QADyB,gBAAW,GAAX,WAAW,CAAc;QAJhF,YAAO,GAAc,EAAE,CAAC;QACxB,sBAAiB,GAAwB,IAAI,GAAG,EAAE,CAAC;QACnD,oBAAe,GAAwB,IAAI,GAAG,EAAE,CAAC;IAIzD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAA2B;QACpC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;aACR,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;aACnB,KAAK,CAAC,uCAAuC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAgC;QAC5D,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAE7B,0FAA0F;QAC1F,6EAA6E;QAC7E,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAE7B,MAAM,MAAM,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE9E,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAElD,qFAAqF;YACrF,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,MAAM;qBACR,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;qBAC9B,KAAK,CAAC,wCAAwC,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC5E,SAAS;YACX,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,uBAAuB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAA2B;QAChD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAErF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM;qBACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;qBACvB,KAAK,CACJ,sDAAsD,EACtD,KAAK,EACL,MAAM,CAAC,WAAW,CAAC,IAAI,CACxB,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM;qBACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;qBACvB,KAAK,CACJ,qDAAqD,EACrD,KAAK,EACL,MAAM,CAAC,WAAW,CAAC,IAAI,CACxB,CAAC;gBACJ,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM;qBACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;qBACvB,KAAK,CAAC,kCAAkC,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC7E,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAI,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;gBAEhE,6FAA6F;gBAC7F,6DAA6D;gBAC7D,MAAM,QAAQ,CAAC;oBACb,OAAO,EAAE,gDAAgD,KAAK,gBAAgB,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,YAAY,EAAE;oBACzH,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC;QAE7B,IAAI,CAAC,MAAM;aACR,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;aACvB,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAEO,cAAc,CAAC,IAAuD;QAC5E,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;QAEzC,MAAM,MAAM,GAAgB;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;YAC5D,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC3B,KAAK;gBACL,UAAU,EACR,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aACpF,CAAC,CAAC;YACH,eAAe;SAChB,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAE3E,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAA;AA7HY,YAAY;IAKV,WAAA,MAAM,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAA;;GALlC,YAAY,CA6HxB"}
@@ -39,6 +39,14 @@ export interface IBootExecutionOptions {
39
39
  export interface IBootstrapper {
40
40
  boot(opts: IBootExecutionOptions): Promise<IBootReport>;
41
41
  }
42
+ export interface IBootPhaseReport {
43
+ phase: TBootPhase;
44
+ durationMs: number;
45
+ }
42
46
  export interface IBootReport {
47
+ /** Class names of the booters that actually ran, in execution order. */
48
+ booters: string[];
49
+ phases: IBootPhaseReport[];
50
+ totalDurationMs: number;
43
51
  }
44
52
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,UAAU,CAAC,CAAC;AAExD,eAAO,MAAM,WAAW,EAAE,UAAU,EAAsC,CAAC;AAE3E,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,cAAc,IAAI,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,WAAW;CAAG"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,UAAU,CAAC,CAAC;AAExD,eAAO,MAAM,WAAW,EAAE,UAAU,EAAsC,CAAC;AAE3E,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,cAAc,IAAI,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB"}
@@ -1,14 +1,9 @@
1
- import { AnyType, TClass } from '@venizia/ignis-helpers';
2
- /** Check if a value is a class constructor. */
3
- export declare const isClass: <T>(target: AnyType) => target is TClass<T>;
4
- /** Discover files matching a glob pattern. */
1
+ import { AnyType } from '@venizia/ignis-helpers';
5
2
  export declare const discoverFiles: (opts: {
6
3
  pattern: string;
7
4
  root: string;
8
5
  }) => Promise<string[]>;
9
- /** Load classes from discovered files via dynamic import. */
10
6
  export declare const loadClasses: (opts: {
11
7
  files: string[];
12
- root: string;
13
8
  }) => Promise<AnyType[]>;
14
9
  //# sourceMappingURL=boot.utility.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boot.utility.d.ts","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGnE,+CAA+C;AAC/C,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,QAAQ,OAAO,KAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAE9D,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,aAAa,EAAE,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,OAAO,CAAC,MAAM,EAAE,CAYrB,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,WAAW,EAAE,CAAC,IAAI,EAAE;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,OAAO,CAAC,OAAO,EAAE,CAuBtB,CAAC"}
1
+ {"version":3,"file":"boot.utility.d.ts","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA6B,MAAM,wBAAwB,CAAC;AAG5E,eAAO,MAAM,aAAa,EAAE,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,OAAO,CAAC,MAAM,EAAE,CAarB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CA2BzE,CAAC"}
@@ -1,10 +1,5 @@
1
- import { getError } from '@venizia/ignis-helpers';
1
+ import { getError, isClass } from '@venizia/ignis-helpers';
2
2
  import { glob } from 'glob';
3
- /** Check if a value is a class constructor. */
4
- export const isClass = (target) => {
5
- return typeof target === 'function' && target.prototype !== undefined;
6
- };
7
- /** Discover files matching a glob pattern. */
8
3
  export const discoverFiles = async (opts) => {
9
4
  const { pattern, root } = opts;
10
5
  try {
@@ -15,17 +10,18 @@ export const discoverFiles = async (opts) => {
15
10
  const errorMessage = error.message ?? 'Unknown error';
16
11
  throw getError({
17
12
  message: `Failed to discover files with pattern: ${pattern} | Error: ${errorMessage}`,
13
+ cause: error,
18
14
  });
19
15
  }
20
16
  };
21
- /** Load classes from discovered files via dynamic import. */
22
17
  export const loadClasses = async (opts) => {
23
18
  const { files } = opts;
24
19
  const classes = [];
25
20
  for (const file of files) {
26
21
  try {
27
22
  const module = await import(file);
28
- for (const [_exportName, exported] of Object.entries(module)) {
23
+ const modules = Object.values(module);
24
+ for (const exported of modules) {
29
25
  if (!isClass(exported)) {
30
26
  continue;
31
27
  }
@@ -34,8 +30,11 @@ export const loadClasses = async (opts) => {
34
30
  }
35
31
  catch (error) {
36
32
  const errorMessage = error.message ?? 'Unknown error';
33
+ // Without the cause, a boot failure reaches the operator as a bare message: the stack of the
34
+ // module that actually threw - the real diagnosis - is gone.
37
35
  throw getError({
38
36
  message: `Failed to load file: ${file} | Error: ${errorMessage}`,
37
+ cause: error,
39
38
  });
40
39
  }
41
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"boot.utility.js","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAU,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,+CAA+C;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,MAAe,EAAuB,EAAE;IACjE,OAAO,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;AACxE,CAAC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,aAAa,GAGA,KAAK,EAAC,IAAI,EAAC,EAAE;IACrC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;QACjE,MAAM,QAAQ,CAAC;YACb,OAAO,EAAE,0CAA0C,OAAO,aAAa,YAAY,EAAE;SACtF,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,WAAW,GAGG,KAAK,EAAC,IAAI,EAAC,EAAE;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvB,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,wBAAwB,IAAI,aAAa,YAAY,EAAE;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
1
+ {"version":3,"file":"boot.utility.js","sourceRoot":"","sources":["../../../src/utilities/boot.utility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,OAAO,EAAU,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,aAAa,GAGA,KAAK,EAAC,IAAI,EAAC,EAAE;IACrC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;QACjE,MAAM,QAAQ,CAAC;YACb,OAAO,EAAE,0CAA0C,OAAO,aAAa,YAAY,EAAE;YACrF,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAsD,KAAK,EAAC,IAAI,EAAC,EAAE;IACzF,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvB,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,IAAI,eAAe,CAAC;YACjE,6FAA6F;YAC7F,6DAA6D;YAC7D,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,wBAAwB,IAAI,aAAa,YAAY,EAAE;gBAChE,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venizia/ignis-boot",
3
- "version": "0.0.6-1",
3
+ "version": "0.1.0",
4
4
  "description": "Convention-based auto-discovery and bootstrapping system for TypeScript applications. Three-phase lifecycle (configure, discover, load) using glob-based file matching and Template Method pattern. Auto-registers controllers, services, repositories, and datasources into the IoC container by file naming conventions. Inspired by LoopBack 4 boot system. Extensible via custom booters for any artifact type.",
5
5
  "keywords": [
6
6
  "artifact-discovery",
@@ -98,8 +98,8 @@
98
98
  "test:watch": "NODE_ENV=test bun test --watch --env-file=.env.test dist/cjs/__tests__/{**/**,**}/*.test.js"
99
99
  },
100
100
  "dependencies": {
101
- "@venizia/ignis-helpers": "^0.0.9-1",
102
- "@venizia/ignis-inversion": "^0.0.7-0",
101
+ "@venizia/ignis-helpers": "^0.1.0",
102
+ "@venizia/ignis-inversion": "^0.1.0",
103
103
  "glob": "^13.0.6",
104
104
  "lodash": "^4.18.1",
105
105
  "reflect-metadata": "^0.2.2"
@@ -107,10 +107,10 @@
107
107
  "devDependencies": {
108
108
  "@types/bun": "^1.3.14",
109
109
  "@types/lodash": "^4.17.23",
110
- "@venizia/dev-configs": "^0.0.8-0",
111
- "eslint": "^10.4.0",
112
- "prettier": "^3.8.3",
113
- "tsc-alias": "^1.8.17",
110
+ "@venizia/dev-configs": "^0.1.0",
111
+ "eslint": "^10.7.0",
112
+ "prettier": "^3.9.5",
113
+ "tsc-alias": "^1.9.0",
114
114
  "typescript": "^6.0.3"
115
115
  }
116
116
  }