@venizia/ignis-inversion 0.2.0-9 → 0.2.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 (91) hide show
  1. package/LICENSE.md +0 -1
  2. package/README.md +83 -117
  3. package/dist/cjs/common/utilities.d.ts +31 -3
  4. package/dist/cjs/common/utilities.d.ts.map +1 -1
  5. package/dist/cjs/common/utilities.js +61 -5
  6. package/dist/cjs/common/utilities.js.map +1 -1
  7. package/dist/cjs/modules/binding/binding.d.ts +3 -0
  8. package/dist/cjs/modules/binding/binding.d.ts.map +1 -1
  9. package/dist/cjs/modules/binding/binding.js +8 -6
  10. package/dist/cjs/modules/binding/binding.js.map +1 -1
  11. package/dist/cjs/modules/binding/common/constants.d.ts.map +1 -1
  12. package/dist/cjs/modules/binding/common/constants.js +2 -6
  13. package/dist/cjs/modules/binding/common/constants.js.map +1 -1
  14. package/dist/cjs/modules/container/base.d.ts +25 -0
  15. package/dist/cjs/modules/container/base.d.ts.map +1 -1
  16. package/dist/cjs/modules/container/base.js +84 -26
  17. package/dist/cjs/modules/container/base.js.map +1 -1
  18. package/dist/cjs/modules/container/container.d.ts +9 -2
  19. package/dist/cjs/modules/container/container.d.ts.map +1 -1
  20. package/dist/cjs/modules/container/container.js +21 -11
  21. package/dist/cjs/modules/container/container.js.map +1 -1
  22. package/dist/cjs/modules/error/app-error.js +2 -5
  23. package/dist/cjs/modules/error/app-error.js.map +1 -1
  24. package/dist/cjs/modules/registry/registry.d.ts.map +1 -1
  25. package/dist/cjs/modules/registry/registry.js +7 -3
  26. package/dist/cjs/modules/registry/registry.js.map +1 -1
  27. package/dist/esm/common/index.d.ts +4 -4
  28. package/dist/esm/common/index.js +4 -4
  29. package/dist/esm/common/utilities.d.ts +32 -4
  30. package/dist/esm/common/utilities.d.ts.map +1 -1
  31. package/dist/esm/common/utilities.js +58 -4
  32. package/dist/esm/common/utilities.js.map +1 -1
  33. package/dist/esm/index.d.ts +2 -2
  34. package/dist/esm/index.js +4 -4
  35. package/dist/esm/modules/binding/binding.d.ts +8 -5
  36. package/dist/esm/modules/binding/binding.d.ts.map +1 -1
  37. package/dist/esm/modules/binding/binding.js +12 -10
  38. package/dist/esm/modules/binding/binding.js.map +1 -1
  39. package/dist/esm/modules/binding/common/constants.d.ts +1 -1
  40. package/dist/esm/modules/binding/common/constants.d.ts.map +1 -1
  41. package/dist/esm/modules/binding/common/constants.js +3 -4
  42. package/dist/esm/modules/binding/common/constants.js.map +1 -1
  43. package/dist/esm/modules/binding/common/index.d.ts +2 -2
  44. package/dist/esm/modules/binding/common/index.js +2 -2
  45. package/dist/esm/modules/binding/common/types.d.ts +3 -3
  46. package/dist/esm/modules/binding/index.d.ts +2 -2
  47. package/dist/esm/modules/binding/index.js +2 -2
  48. package/dist/esm/modules/container/abstract.d.ts +5 -5
  49. package/dist/esm/modules/container/abstract.js +1 -1
  50. package/dist/esm/modules/container/base.d.ts +29 -4
  51. package/dist/esm/modules/container/base.d.ts.map +1 -1
  52. package/dist/esm/modules/container/base.js +89 -31
  53. package/dist/esm/modules/container/base.js.map +1 -1
  54. package/dist/esm/modules/container/common/index.d.ts +1 -1
  55. package/dist/esm/modules/container/common/index.js +1 -1
  56. package/dist/esm/modules/container/common/types.d.ts +3 -3
  57. package/dist/esm/modules/container/container.d.ts +11 -4
  58. package/dist/esm/modules/container/container.d.ts.map +1 -1
  59. package/dist/esm/modules/container/container.js +24 -14
  60. package/dist/esm/modules/container/container.js.map +1 -1
  61. package/dist/esm/modules/container/index.d.ts +4 -4
  62. package/dist/esm/modules/container/index.js +4 -4
  63. package/dist/esm/modules/error/app-error.d.ts +1 -1
  64. package/dist/esm/modules/error/app-error.js +3 -3
  65. package/dist/esm/modules/error/app-error.js.map +1 -1
  66. package/dist/esm/modules/error/common/index.d.ts +1 -1
  67. package/dist/esm/modules/error/common/index.js +1 -1
  68. package/dist/esm/modules/error/common/types.d.ts +1 -1
  69. package/dist/esm/modules/error/definition.d.ts +1 -1
  70. package/dist/esm/modules/error/index.d.ts +4 -4
  71. package/dist/esm/modules/error/index.js +4 -4
  72. package/dist/esm/modules/error/message-code.d.ts +2 -2
  73. package/dist/esm/modules/index.d.ts +5 -5
  74. package/dist/esm/modules/index.js +5 -5
  75. package/dist/esm/modules/metadata/common/index.d.ts +1 -1
  76. package/dist/esm/modules/metadata/common/index.js +1 -1
  77. package/dist/esm/modules/metadata/index.d.ts +2 -2
  78. package/dist/esm/modules/metadata/index.js +2 -2
  79. package/dist/esm/modules/metadata/injectors.d.ts +2 -2
  80. package/dist/esm/modules/metadata/injectors.js +2 -2
  81. package/dist/esm/modules/registry/common/index.d.ts +1 -1
  82. package/dist/esm/modules/registry/common/index.js +1 -1
  83. package/dist/esm/modules/registry/common/types.d.ts +1 -1
  84. package/dist/esm/modules/registry/index.d.ts +2 -2
  85. package/dist/esm/modules/registry/index.js +2 -2
  86. package/dist/esm/modules/registry/registry.d.ts +3 -3
  87. package/dist/esm/modules/registry/registry.d.ts.map +1 -1
  88. package/dist/esm/modules/registry/registry.js +10 -6
  89. package/dist/esm/modules/registry/registry.js.map +1 -1
  90. package/dist/esm/package.json +6 -0
  91. package/package.json +3 -5
@@ -1,12 +1,13 @@
1
- import { BaseHelper } from '../../common/base-helper';
2
- import { TClass, TConstValue } from '../../common/types';
3
- import type { IContainer } from '../container/common/types';
4
- import { BindingValueTypes, TBindingScope } from './common/constants';
5
- import { IBinding, TBindingProvider, TBindingResolverValue } from './common/types';
1
+ import { BaseHelper } from '../../common/base-helper.js';
2
+ import { TClass, TConstValue } from '../../common/types.js';
3
+ import type { IContainer } from '../container/common/types.js';
4
+ import { BindingValueTypes, TBindingScope } from './common/constants.js';
5
+ import { IBinding, TBindingProvider, TBindingResolverValue } from './common/types.js';
6
6
  export declare class Binding<T = any> extends BaseHelper implements IBinding<T> {
7
7
  key: string;
8
8
  private bindScope;
9
9
  private tags;
10
+ /** Boxed: a singleton may legitimately be `null`, `false`, `0`, `''` or `undefined`. */
10
11
  private cached?;
11
12
  private resolver;
12
13
  constructor(opts: {
@@ -26,6 +27,8 @@ export declare class Binding<T = any> extends BaseHelper implements IBinding<T>
26
27
  hasTag(tag: string): boolean;
27
28
  getTags(): string[];
28
29
  getScope(): TBindingScope;
30
+ /** True when `getValue` answers without building anything: a cached singleton or a plain value. Nothing it reads can form a cycle. */
31
+ isSettled(): boolean;
29
32
  getValue(container?: IContainer): T;
30
33
  clearCache(): void;
31
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../../../src/modules/binding/binding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAiB,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAmB,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,qBAAa,OAAO,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,UAAW,YAAW,QAAQ,CAAC,CAAC,CAAC;IACrE,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAI;IAEnB,OAAO,CAAC,QAAQ,CAG4D;gBAEhE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;WAajB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAK/B,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAKvB,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAK5C,cAAc,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAA;KAAE,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAU/F,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKpC,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,OAAO,IAAI,MAAM,EAAE;IAInB,QAAQ,IAAI,aAAa;IAIzB,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC;IAuDnC,UAAU;CAOX"}
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../../../src/modules/binding/binding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAiB,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAmB,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,qBAAa,OAAO,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,UAAW,YAAW,QAAQ,CAAC,CAAC,CAAC;IACrE,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,IAAI,CAAc;IAC1B,wFAAwF;IACxF,OAAO,CAAC,MAAM,CAAC,CAAe;IAE9B,OAAO,CAAC,QAAQ,CAG4D;gBAEhE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;WAajB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAK/B,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAKvB,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAK5C,cAAc,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAA;KAAE,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAU/F,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKpC,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,OAAO,IAAI,MAAM,EAAE;IAInB,QAAQ,IAAI,aAAa;IAIzB,sIAAsI;IACtI,SAAS,IAAI,OAAO;IAOpB,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,CAAC;IAuDnC,UAAU;CAGX"}
@@ -1,7 +1,7 @@
1
- import { getError } from '../error';
2
- import { BaseHelper } from '../../common/base-helper';
3
- import { BindingScopes, BindingValueTypes } from './common/constants';
4
- import { isClassProvider } from './common/types';
1
+ import { getError } from '../error/index.js';
2
+ import { BaseHelper } from '../../common/base-helper.js';
3
+ import { BindingScopes, BindingValueTypes } from './common/constants.js';
4
+ import { isClassProvider } from './common/types.js';
5
5
  export class Binding extends BaseHelper {
6
6
  constructor(opts) {
7
7
  super({ scope: opts.key });
@@ -54,9 +54,14 @@ export class Binding extends BaseHelper {
54
54
  getScope() {
55
55
  return this.bindScope;
56
56
  }
57
+ /** True when `getValue` answers without building anything: a cached singleton or a plain value. Nothing it reads can form a cycle. */
58
+ isSettled() {
59
+ return ((this.bindScope === BindingScopes.SINGLETON && this.cached !== undefined) ||
60
+ this.resolver.type === BindingValueTypes.VALUE);
61
+ }
57
62
  getValue(container) {
58
- if (this.bindScope === BindingScopes.SINGLETON && this.cached !== undefined) {
59
- return this.cached;
63
+ if (this.bindScope === BindingScopes.SINGLETON && this.cached) {
64
+ return this.cached.value;
60
65
  }
61
66
  let instance;
62
67
  const { type: resolverType } = this.resolver;
@@ -96,14 +101,11 @@ export class Binding extends BaseHelper {
96
101
  }
97
102
  }
98
103
  if (this.bindScope === BindingScopes.SINGLETON) {
99
- this.cached = instance;
104
+ this.cached = { value: instance };
100
105
  }
101
106
  return instance;
102
107
  }
103
108
  clearCache() {
104
- if (!this.cached) {
105
- return;
106
- }
107
109
  this.cached = undefined;
108
110
  }
109
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../../../src/modules/binding/binding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../../../src/modules/binding/binding.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { TConstValue } from '../../../common/types';
1
+ import { TConstValue } from '../../../common/types.js';
2
2
  export declare class BindingScopes {
3
3
  static readonly SINGLETON = "singleton";
4
4
  static readonly TRANSIENT = "transient";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/modules/binding/common/constants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,SAAS,eAAe;IACxC,MAAM,CAAC,QAAQ,CAAC,SAAS,eAAe;CACzC;AACD,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,aAAa,CAAC,CAAC;AAE9D,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;CACvC;AACD,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEtE,qBAAa,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;CAgBtD"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/modules/binding/common/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,SAAS,eAAe;IACxC,MAAM,CAAC,QAAQ,CAAC,SAAS,eAAe;CACzC;AACD,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,aAAa,CAAC,CAAC;AAE9D,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;CACvC;AACD,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEtE,qBAAa,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;CAgBtD"}
@@ -1,5 +1,4 @@
1
- import isEmpty from 'lodash/isEmpty';
2
- import { getError } from '../../error';
1
+ import { getError } from '../../error/index.js';
3
2
  export class BindingScopes {
4
3
  static { this.SINGLETON = 'singleton'; }
5
4
  static { this.TRANSIENT = 'transient'; }
@@ -13,10 +12,10 @@ export class BindingKeys {
13
12
  static build(opts) {
14
13
  const { namespace, key } = opts;
15
14
  const keyParts = [];
16
- if (!isEmpty(namespace)) {
15
+ if (namespace) {
17
16
  keyParts.push(namespace);
18
17
  }
19
- if (isEmpty(key)) {
18
+ if (!key) {
20
19
  throw getError({
21
20
  message: `[BindingKeys][build] Invalid key to build | key: ${key}`,
22
21
  });
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../src/modules/binding/common/constants.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,OAAO,aAAa;aACR,cAAS,GAAG,WAAW,CAAC;aACxB,cAAS,GAAG,WAAW,CAAC;;AAI1C,MAAM,OAAO,iBAAiB;aACZ,UAAK,GAAG,OAAO,CAAC;aAChB,UAAK,GAAG,OAAO,CAAC;aAChB,aAAQ,GAAG,UAAU,CAAC;;AAIxC,MAAM,OAAO,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,IAAwC;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,oDAAoD,GAAG,EAAE;aACnE,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../src/modules/binding/common/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,OAAO,aAAa;aACR,cAAS,GAAG,WAAW,CAAC;aACxB,cAAS,GAAG,WAAW,CAAC;;AAI1C,MAAM,OAAO,iBAAiB;aACZ,UAAK,GAAG,OAAO,CAAC;aAChB,UAAK,GAAG,OAAO,CAAC;aAChB,aAAQ,GAAG,UAAU,CAAC;;AAIxC,MAAM,OAAO,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,IAAwC;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,oDAAoD,GAAG,EAAE;aACnE,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
@@ -1,3 +1,3 @@
1
- export * from './constants';
2
- export * from './types';
1
+ export * from './constants.js';
2
+ export * from './types.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,3 @@
1
- export * from './constants';
2
- export * from './types';
1
+ export * from './constants.js';
2
+ export * from './types.js';
3
3
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
- import type { IContainer } from '../../container/common/types';
2
- import { TClass, TConstValue } from '../../../common/types';
3
- import type { BindingValueTypes, TBindingScope } from './constants';
1
+ import type { IContainer } from '../../container/common/types.js';
2
+ import { TClass, TConstValue } from '../../../common/types.js';
3
+ import type { BindingValueTypes, TBindingScope } from './constants.js';
4
4
  export interface IProvider<T> {
5
5
  value(container: IContainer): T;
6
6
  }
@@ -1,3 +1,3 @@
1
- export * from './binding';
2
- export * from './common';
1
+ export * from './binding.js';
2
+ export * from './common/index.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,3 @@
1
- export * from './binding';
2
- export * from './common';
1
+ export * from './binding.js';
2
+ export * from './common/index.js';
3
3
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
- import { BaseHelper } from '../../common/base-helper';
2
- import type { TBindingKey, TClass, TNullable } from '../../common/types';
3
- import type { IBinding } from '../binding/common/types';
4
- import type { MetadataRegistry } from '../registry/registry';
5
- import type { IContainer } from './common/types';
1
+ import { BaseHelper } from '../../common/base-helper.js';
2
+ import type { TBindingKey, TClass, TNullable } from '../../common/types.js';
3
+ import type { IBinding } from '../binding/common/types.js';
4
+ import type { MetadataRegistry } from '../registry/registry.js';
5
+ import type { IContainer } from './common/types.js';
6
6
  /** Container CONTRACT as a class, typed against `IBinding` - implementations sharing no storage start here; ones that only vary resolution start at `BaseContainer`. */
7
7
  export declare abstract class AbstractContainer extends BaseHelper implements IContainer {
8
8
  constructor(opts?: {
@@ -1,4 +1,4 @@
1
- import { BaseHelper } from '../../common/base-helper';
1
+ import { BaseHelper } from '../../common/base-helper.js';
2
2
  /** Container CONTRACT as a class, typed against `IBinding` - implementations sharing no storage start here; ones that only vary resolution start at `BaseContainer`. */
3
3
  export class AbstractContainer extends BaseHelper {
4
4
  constructor(opts) {
@@ -1,6 +1,6 @@
1
- import { TBindingKey, TClass, TNullable } from '../../common/types';
2
- import { Binding } from '../binding/binding';
3
- import { AbstractContainer } from './abstract';
1
+ import { TBindingKey, TClass, TNullable } from '../../common/types.js';
2
+ import { Binding } from '../binding/binding.js';
3
+ import { AbstractContainer } from './abstract.js';
4
4
  /** Storage half of the container, keyed by normalized binding-key strings - resolution (`instantiate`) stays abstract, it is the part an implementation swaps. */
5
5
  export declare abstract class BaseContainer extends AbstractContainer {
6
6
  protected bindings: Map<string, Binding<any>>;
@@ -10,10 +10,35 @@ export declare abstract class BaseContainer extends AbstractContainer {
10
10
  protected isCountingResolutions: boolean;
11
11
  /** Whether `startResolutionCounting` has ever run. A report read without it would name every binding, which is a wrong answer rather than an empty one. */
12
12
  protected hasStartedResolutionCounting: boolean;
13
+ /** The string each BOUND symbol is stored under: `Symbol('x')` twice is two keys, and both print as "Symbol(x)". */
14
+ protected symbolKeys: Map<symbol, string>;
15
+ /** How many symbols have been bound per description, so a new one gets its suffix in one step. */
16
+ protected symbolDescriptionCounts: Map<string, number>;
17
+ /**
18
+ * Nesting depth of the reads in progress. Past {@link CYCLE_CHECK_DEPTH} the keys are tracked, and
19
+ * a key met again is a cycle: a real graph is far shallower, so the common read pays one counter.
20
+ * Only the synchronous part is checked - a cycle through an `await` is not seen.
21
+ */
22
+ protected resolutionDepth: number;
23
+ protected resolvingKeys: Set<string>;
13
24
  constructor(opts?: {
14
25
  scope: string;
15
26
  });
16
- getMetadataRegistry(): import("..").MetadataRegistry;
27
+ getMetadataRegistry(): import("../index.js").MetadataRegistry;
28
+ /**
29
+ * The string a key is stored under, or `undefined` for a symbol that was never bound - a lookup
30
+ * never records one, so reading with throwaway symbols leaves nothing behind.
31
+ */
32
+ protected toKeyString(opts: {
33
+ key: TBindingKey | {
34
+ namespace: string;
35
+ key: string;
36
+ };
37
+ }): string | undefined;
38
+ /** A bound symbol's own string: its description, suffixed (`Symbol(x)#2`) when another symbol holds it. */
39
+ protected bindSymbolKey(opts: {
40
+ key: symbol;
41
+ }): string;
17
42
  bind<T>(opts: {
18
43
  key: TBindingKey;
19
44
  }): Binding<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/modules/container/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,kKAAkK;AAClK,8BAAsB,aAAc,SAAQ,iBAAiB;IAC3D,SAAS,CAAC,QAAQ,4BAA8B;IAEhD,2EAA2E;IAC3E,SAAS,CAAC,gBAAgB,sBAA6B;IAEvD,mJAAmJ;IACnJ,SAAS,CAAC,qBAAqB,UAAS;IAExC,2JAA2J;IAC3J,SAAS,CAAC,4BAA4B,UAAS;gBAEnC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IAI3B,mBAAmB;IAInB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ/C,OAAO,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO;IAM5C,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE;QAC3B,GAAG,EAAE,WAAW,GAAG;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;KACvD,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IA2BhB,MAAM,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO;IAK3C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG,IAAI;IAK3C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QACpB,GAAG,EAAE,WAAW,GAAG;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACtD,UAAU,CAAC,EAAE,KAAK,CAAC;KACpB,GAAG,CAAC;IACI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;QACpB,GAAG,EAAE,WAAW,GAAG;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACtD,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,CAAC,GAAG,SAAS;IA0BR,IAAI,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,IAAI,EAAE;QACvC,QAAQ,EAAE;aACP,CAAC,IAAI,MAAM,CAAC,GAAG;gBACd,GAAG,EAAE,WAAW,GAAG;oBAAE,SAAS,EAAE,MAAM,CAAC;oBAAC,GAAG,EAAE,MAAM,CAAA;iBAAE,CAAC;gBACtD,UAAU,CAAC,EAAE,OAAO,CAAC;aACtB;SACF,CAAC;KACH,GAAG;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;KAAE;IAMxC,gMAAgM;IACvL,uBAAuB,IAAI,IAAI;IAMxC,yFAAyF;IAChF,sBAAsB,IAAI,IAAI;IAIvC,4IAA4I;IACnI,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAIlD,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAI7B,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE;QAChC,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;KACvC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE;IAyBP,KAAK,IAAI,IAAI;IAOb,KAAK,IAAI,IAAI;CAGvB"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/modules/container/base.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
- import { Binding } from '../binding/binding';
2
- import { BindingKeys } from '../binding/common/constants';
3
- import { getError } from '../error';
4
- import { metadataRegistry } from '../registry/registry';
5
- import { AbstractContainer } from './abstract';
1
+ import { Binding } from '../binding/binding.js';
2
+ import { BindingKeys } from '../binding/common/constants.js';
3
+ import { getError } from '../error/index.js';
4
+ import { metadataRegistry } from '../registry/registry.js';
5
+ import { AbstractContainer } from './abstract.js';
6
+ /** A dependency graph nests far less than this; deeper is all but certainly a cycle, and is checked. */
7
+ const CYCLE_CHECK_DEPTH = 64;
6
8
  /** Storage half of the container, keyed by normalized binding-key strings - resolution (`instantiate`) stays abstract, it is the part an implementation swaps. */
7
9
  export class BaseContainer extends AbstractContainer {
8
10
  constructor(opts) {
@@ -14,49 +16,80 @@ export class BaseContainer extends AbstractContainer {
14
16
  this.isCountingResolutions = false;
15
17
  /** Whether `startResolutionCounting` has ever run. A report read without it would name every binding, which is a wrong answer rather than an empty one. */
16
18
  this.hasStartedResolutionCounting = false;
19
+ /** The string each BOUND symbol is stored under: `Symbol('x')` twice is two keys, and both print as "Symbol(x)". */
20
+ this.symbolKeys = new Map();
21
+ /** How many symbols have been bound per description, so a new one gets its suffix in one step. */
22
+ this.symbolDescriptionCounts = new Map();
23
+ /**
24
+ * Nesting depth of the reads in progress. Past {@link CYCLE_CHECK_DEPTH} the keys are tracked, and
25
+ * a key met again is a cycle: a real graph is far shallower, so the common read pays one counter.
26
+ * Only the synchronous part is checked - a cycle through an `await` is not seen.
27
+ */
28
+ this.resolutionDepth = 0;
29
+ this.resolvingKeys = new Set();
17
30
  }
18
31
  getMetadataRegistry() {
19
32
  return metadataRegistry;
20
33
  }
21
- bind(opts) {
22
- const { key } = opts;
23
- const keyStr = String(key);
24
- const binding = new Binding({ key: keyStr });
25
- this.bindings.set(keyStr, binding);
26
- return binding;
27
- }
28
- isBound(opts) {
34
+ /**
35
+ * The string a key is stored under, or `undefined` for a symbol that was never bound - a lookup
36
+ * never records one, so reading with throwaway symbols leaves nothing behind.
37
+ */
38
+ toKeyString(opts) {
29
39
  const { key } = opts;
30
- const keyStr = String(key);
31
- return this.bindings.has(keyStr);
32
- }
33
- getBinding(opts) {
34
- let key;
35
- switch (typeof opts.key) {
40
+ switch (typeof key) {
36
41
  case 'string': {
37
- key = opts.key;
38
- break;
42
+ return key;
39
43
  }
40
44
  case 'symbol': {
41
- key = opts.key.toString();
42
- break;
45
+ return this.symbolKeys.get(key);
43
46
  }
44
47
  case 'object': {
45
- key = BindingKeys.build(opts.key);
46
- break;
48
+ return BindingKeys.build(key);
47
49
  }
48
50
  default: {
49
51
  throw getError({
50
- message: `[getBinding] Invalid binding key type | opts: ${opts.key} | allowed: [string, symbol, { namespace: string, key: string }]`,
52
+ message: `[getBinding] Invalid binding key type | opts: ${String(key)} | allowed: [string, symbol, { namespace: string, key: string }]`,
51
53
  });
52
54
  }
53
55
  }
54
- const binding = this.bindings.get(key);
56
+ }
57
+ /** A bound symbol's own string: its description, suffixed (`Symbol(x)#2`) when another symbol holds it. */
58
+ bindSymbolKey(opts) {
59
+ const { key } = opts;
60
+ const known = this.symbolKeys.get(key);
61
+ if (known !== undefined) {
62
+ return known;
63
+ }
64
+ const description = key.toString();
65
+ const count = (this.symbolDescriptionCounts.get(description) ?? 0) + 1;
66
+ this.symbolDescriptionCounts.set(description, count);
67
+ const keyStr = count === 1 ? description : `${description}#${count}`;
68
+ this.symbolKeys.set(key, keyStr);
69
+ return keyStr;
70
+ }
71
+ bind(opts) {
72
+ const { key } = opts;
73
+ const keyStr = typeof key === 'symbol' ? this.bindSymbolKey({ key }) : key;
74
+ const binding = new Binding({ key: keyStr });
75
+ this.bindings.set(keyStr, binding);
55
76
  return binding;
56
77
  }
78
+ isBound(opts) {
79
+ const keyStr = this.toKeyString({ key: opts.key });
80
+ return keyStr !== undefined && this.bindings.has(keyStr);
81
+ }
82
+ getBinding(opts) {
83
+ const keyStr = this.toKeyString({ key: opts.key });
84
+ return keyStr === undefined ? undefined : this.bindings.get(keyStr);
85
+ }
57
86
  unbind(opts) {
58
- const key = String(opts.key);
59
- return this.bindings.delete(key);
87
+ const { key } = opts;
88
+ const keyStr = this.toKeyString({ key });
89
+ if (typeof key === 'symbol') {
90
+ this.symbolKeys.delete(key);
91
+ }
92
+ return keyStr !== undefined && this.bindings.delete(keyStr);
60
93
  }
61
94
  set(opts) {
62
95
  const { binding } = opts;
@@ -71,11 +104,34 @@ export class BaseContainer extends AbstractContainer {
71
104
  if (this.isCountingResolutions) {
72
105
  this.resolutionCounts.set(binding.key, (this.resolutionCounts.get(binding.key) ?? 0) + 1);
73
106
  }
74
- return binding.getValue(this);
107
+ // The hot path: a cached singleton or a value builds nothing, so it cannot be part of a cycle.
108
+ if (binding.isSettled()) {
109
+ return binding.getValue(this);
110
+ }
111
+ this.resolutionDepth++;
112
+ const isTracked = this.resolutionDepth > CYCLE_CHECK_DEPTH;
113
+ if (isTracked && this.resolvingKeys.has(binding.key)) {
114
+ this.resolutionDepth--;
115
+ throw getError({
116
+ message: `Circular dependency | ${[...this.resolvingKeys, binding.key].join(' -> ')}`,
117
+ });
118
+ }
119
+ if (isTracked) {
120
+ this.resolvingKeys.add(binding.key);
121
+ }
122
+ try {
123
+ return binding.getValue(this);
124
+ }
125
+ finally {
126
+ this.resolutionDepth--;
127
+ if (isTracked) {
128
+ this.resolvingKeys.delete(binding.key);
129
+ }
130
+ }
75
131
  }
76
132
  if (!isOptional) {
77
133
  throw getError({
78
- message: `Binding key: ${opts.key.toString()} is not bounded in context!`,
134
+ message: `Binding key: ${typeof key === 'object' ? BindingKeys.build(key) : String(key)} is not bounded in context!`,
79
135
  });
80
136
  }
81
137
  return undefined;
@@ -126,6 +182,8 @@ export class BaseContainer extends AbstractContainer {
126
182
  }
127
183
  reset() {
128
184
  this.bindings.clear();
185
+ this.symbolKeys.clear();
186
+ this.symbolDescriptionCounts.clear();
129
187
  }
130
188
  }
131
189
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/modules/container/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/modules/container/base.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export * from './types';
1
+ export * from './types.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,2 @@
1
- export * from './types';
1
+ export * from './types.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
- import type { IBinding } from '../../binding/common/types';
2
- import type { TBindingKey, TClass, TNullable } from '../../../common/types';
3
- import type { MetadataRegistry } from '../../registry/registry';
1
+ import type { IBinding } from '../../binding/common/types.js';
2
+ import type { TBindingKey, TClass, TNullable } from '../../../common/types.js';
3
+ import type { MetadataRegistry } from '../../registry/registry.js';
4
4
  export interface IContainer {
5
5
  getMetadataRegistry(): MetadataRegistry;
6
6
  bind<T>(opts: {
@@ -1,17 +1,24 @@
1
- import { AnyType, TBindingKey, TClass, TInjectTarget } from '../../common/types';
2
- import { BaseContainer } from './base';
1
+ import { AnyType, TBindingKey, TClass, TInjectTarget } from '../../common/types.js';
2
+ import { BaseContainer } from './base.js';
3
3
  /** Default container: constructor + property injection driven by the decorator metadata registry. */
4
4
  export declare class Container extends BaseContainer {
5
5
  constructor(opts?: {
6
6
  scope: string;
7
7
  });
8
- /** The class form reads the key the REGISTRATION recorded, so a call-site override and an imperative `application.service(X)` both resolve. */
8
+ /**
9
+ * The class form reads the key the REGISTRATION recorded, so a call-site override and an imperative
10
+ * `application.service(X)` both resolve. `@inject` takes a key or a class; metadata a framework
11
+ * writes may carry both, and then the class wins and the key is the fallback for a class nothing
12
+ * recorded - one bound by hand with `bind({ key }).toClass(X)`. An optional class with neither
13
+ * resolves to `undefined`, as an optional key would.
14
+ */
9
15
  protected resolveBindingKey(opts: {
10
16
  key?: TBindingKey;
11
17
  target?: TInjectTarget;
18
+ isOptional?: boolean;
12
19
  cls: TClass<AnyType>;
13
20
  at: string;
14
- }): TBindingKey;
21
+ }): TBindingKey | undefined;
15
22
  instantiate<T>(cls: TClass<T>): T;
16
23
  }
17
24
  //# sourceMappingURL=container.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../src/modules/container/container.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,qGAAqG;AACrG,qBAAa,SAAU,SAAQ,aAAa;gBAC9B,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IAIpC,+IAA+I;IAC/I,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE;QAChC,GAAG,CAAC,EAAE,WAAW,CAAC;QAClB,MAAM,CAAC,EAAE,aAAa,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,EAAE,EAAE,MAAM,CAAC;KACZ,GAAG,WAAW;IA8BN,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;CAwD3C"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../src/modules/container/container.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,qGAAqG;AACrG,qBAAa,SAAU,SAAQ,aAAa;gBAC9B,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IAIpC;;;;;;OAMG;IACH,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE;QAChC,GAAG,CAAC,EAAE,WAAW,CAAC;QAClB,MAAM,CAAC,EAAE,aAAa,CAAC;QACvB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,EAAE,EAAE,MAAM,CAAC;KACZ,GAAG,WAAW,GAAG,SAAS;IAkClB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;CAyD3C"}
@@ -1,15 +1,21 @@
1
- import { getError } from '../error';
2
- import { resolveInjectTarget } from '../../common/utilities';
3
- import { BaseContainer } from './base';
1
+ import { getError } from '../error/index.js';
2
+ import { resolveInjectTarget } from '../../common/utilities.js';
3
+ import { BaseContainer } from './base.js';
4
4
  /** Default container: constructor + property injection driven by the decorator metadata registry. */
5
5
  export class Container extends BaseContainer {
6
6
  constructor(opts) {
7
7
  super({ scope: opts?.scope ?? Container.name });
8
8
  }
9
- /** The class form reads the key the REGISTRATION recorded, so a call-site override and an imperative `application.service(X)` both resolve. */
9
+ /**
10
+ * The class form reads the key the REGISTRATION recorded, so a call-site override and an imperative
11
+ * `application.service(X)` both resolve. `@inject` takes a key or a class; metadata a framework
12
+ * writes may carry both, and then the class wins and the key is the fallback for a class nothing
13
+ * recorded - one bound by hand with `bind({ key }).toClass(X)`. An optional class with neither
14
+ * resolves to `undefined`, as an optional key would.
15
+ */
10
16
  resolveBindingKey(opts) {
11
- const { key, target: declared, cls, at } = opts;
12
- if (key !== undefined) {
17
+ const { key, target: declared, isOptional = false, cls, at } = opts;
18
+ if (declared === undefined && key !== undefined) {
13
19
  return key;
14
20
  }
15
21
  if (declared === undefined) {
@@ -17,13 +23,16 @@ export class Container extends BaseContainer {
17
23
  message: `[${cls.name}] ${at} has neither an @inject key nor a class`,
18
24
  });
19
25
  }
20
- const target = resolveInjectTarget(declared);
26
+ const target = resolveInjectTarget({ target: declared });
21
27
  if (target === undefined) {
22
28
  throw getError({
23
29
  message: `[${cls.name}] ${at} names a function that did not return a class`,
24
30
  });
25
31
  }
26
- const recorded = this.getMetadataRegistry().getBindingKey({ target });
32
+ const recorded = this.getMetadataRegistry().getBindingKey({ target }) ?? key;
33
+ if (recorded === undefined && isOptional) {
34
+ return undefined;
35
+ }
27
36
  if (recorded === undefined) {
28
37
  throw getError({
29
38
  message: `[${cls.name}] ${at} names '${target.name}', which is not registered as an artifact | Decorate it (@service, @repository, ...) or register it on the application before it is injected`,
@@ -44,13 +53,15 @@ export class Container extends BaseContainer {
44
53
  message: `[${cls.name}] Constructor parameter ${index} has no @inject | Every parameter of a container-instantiated class must be decorated - the container cannot supply an undecorated one`,
45
54
  });
46
55
  }
56
+ const isOptional = meta.isOptional ?? false;
47
57
  const key = this.resolveBindingKey({
48
58
  key: meta.key,
49
59
  target: meta.target,
60
+ isOptional,
50
61
  cls,
51
62
  at: `Constructor parameter ${index}`,
52
63
  });
53
- args[meta.index] = this.get({ key, isOptional: meta.isOptional ?? false });
64
+ args[meta.index] = key === undefined ? undefined : this.get({ key, isOptional });
54
65
  }
55
66
  const instance = new cls(...args);
56
67
  const propertyMetadata = registry.getPropertiesMetadata({
@@ -61,17 +72,16 @@ export class Container extends BaseContainer {
61
72
  }
62
73
  const properties = propertyMetadata.entries();
63
74
  for (const [propertyKey, metadata] of properties) {
75
+ const isOptional = metadata.isOptional ?? false;
64
76
  const key = this.resolveBindingKey({
65
77
  key: metadata.bindingKey,
66
78
  target: metadata.target,
79
+ isOptional,
67
80
  cls,
68
81
  at: `Property '${String(propertyKey)}'`,
69
82
  });
70
- const dep = this.get({
71
- key,
72
- isOptional: metadata.isOptional ?? false,
73
- });
74
- instance[propertyKey] = dep;
83
+ instance[propertyKey] =
84
+ key === undefined ? undefined : this.get({ key, isOptional });
75
85
  }
76
86
  return instance;
77
87
  }