@brianmcd/di 0.0.1

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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +320 -0
  3. package/dist/cjs/index.d.ts +12 -0
  4. package/dist/cjs/index.d.ts.map +1 -0
  5. package/dist/cjs/index.js +16 -0
  6. package/dist/cjs/index.js.map +1 -0
  7. package/dist/cjs/lib/container-builder.d.ts +76 -0
  8. package/dist/cjs/lib/container-builder.d.ts.map +1 -0
  9. package/dist/cjs/lib/container-builder.js +283 -0
  10. package/dist/cjs/lib/container-builder.js.map +1 -0
  11. package/dist/cjs/lib/container.d.ts +52 -0
  12. package/dist/cjs/lib/container.d.ts.map +1 -0
  13. package/dist/cjs/lib/container.js +113 -0
  14. package/dist/cjs/lib/container.js.map +1 -0
  15. package/dist/cjs/lib/scoped-container.d.ts +36 -0
  16. package/dist/cjs/lib/scoped-container.d.ts.map +1 -0
  17. package/dist/cjs/lib/scoped-container.js +119 -0
  18. package/dist/cjs/lib/scoped-container.js.map +1 -0
  19. package/dist/cjs/lib/types/factory-provider.d.ts +18 -0
  20. package/dist/cjs/lib/types/factory-provider.d.ts.map +1 -0
  21. package/dist/cjs/lib/types/factory-provider.js +3 -0
  22. package/dist/cjs/lib/types/factory-provider.js.map +1 -0
  23. package/dist/cjs/lib/types/injectable-class.d.ts +11 -0
  24. package/dist/cjs/lib/types/injectable-class.d.ts.map +1 -0
  25. package/dist/cjs/lib/types/injectable-class.js +3 -0
  26. package/dist/cjs/lib/types/injectable-class.js.map +1 -0
  27. package/dist/cjs/lib/types/lifecycle.d.ts +13 -0
  28. package/dist/cjs/lib/types/lifecycle.d.ts.map +1 -0
  29. package/dist/cjs/lib/types/lifecycle.js +3 -0
  30. package/dist/cjs/lib/types/lifecycle.js.map +1 -0
  31. package/dist/cjs/lib/types/options.d.ts +5 -0
  32. package/dist/cjs/lib/types/options.d.ts.map +1 -0
  33. package/dist/cjs/lib/types/options.js +3 -0
  34. package/dist/cjs/lib/types/options.js.map +1 -0
  35. package/dist/cjs/lib/types/resolvers.d.ts +15 -0
  36. package/dist/cjs/lib/types/resolvers.d.ts.map +1 -0
  37. package/dist/cjs/lib/types/resolvers.js +3 -0
  38. package/dist/cjs/lib/types/resolvers.js.map +1 -0
  39. package/dist/cjs/lib/types/scope.d.ts +6 -0
  40. package/dist/cjs/lib/types/scope.d.ts.map +1 -0
  41. package/dist/cjs/lib/types/scope.js +8 -0
  42. package/dist/cjs/lib/types/scope.js.map +1 -0
  43. package/dist/cjs/lib/types/tokens.d.ts +13 -0
  44. package/dist/cjs/lib/types/tokens.d.ts.map +1 -0
  45. package/dist/cjs/lib/types/tokens.js +3 -0
  46. package/dist/cjs/lib/types/tokens.js.map +1 -0
  47. package/dist/cjs/lib/utils/create-token.d.ts +10 -0
  48. package/dist/cjs/lib/utils/create-token.d.ts.map +1 -0
  49. package/dist/cjs/lib/utils/create-token.js +14 -0
  50. package/dist/cjs/lib/utils/create-token.js.map +1 -0
  51. package/dist/cjs/lib/utils/define-factory.d.ts +28 -0
  52. package/dist/cjs/lib/utils/define-factory.d.ts.map +1 -0
  53. package/dist/cjs/lib/utils/define-factory.js +31 -0
  54. package/dist/cjs/lib/utils/define-factory.js.map +1 -0
  55. package/dist/cjs/lib/utils/has-on-destroy.d.ts +6 -0
  56. package/dist/cjs/lib/utils/has-on-destroy.d.ts.map +1 -0
  57. package/dist/cjs/lib/utils/has-on-destroy.js +10 -0
  58. package/dist/cjs/lib/utils/has-on-destroy.js.map +1 -0
  59. package/dist/cjs/lib/utils/has-on-init.d.ts +6 -0
  60. package/dist/cjs/lib/utils/has-on-init.d.ts.map +1 -0
  61. package/dist/cjs/lib/utils/has-on-init.js +10 -0
  62. package/dist/cjs/lib/utils/has-on-init.js.map +1 -0
  63. package/dist/cjs/lib/utils/token-to-string.d.ts +6 -0
  64. package/dist/cjs/lib/utils/token-to-string.d.ts.map +1 -0
  65. package/dist/cjs/lib/utils/token-to-string.js +13 -0
  66. package/dist/cjs/lib/utils/token-to-string.js.map +1 -0
  67. package/dist/cjs/package.json +1 -0
  68. package/dist/esm/index.d.ts +12 -0
  69. package/dist/esm/index.d.ts.map +1 -0
  70. package/dist/esm/index.js +7 -0
  71. package/dist/esm/index.js.map +1 -0
  72. package/dist/esm/lib/container-builder.d.ts +76 -0
  73. package/dist/esm/lib/container-builder.d.ts.map +1 -0
  74. package/dist/esm/lib/container-builder.js +279 -0
  75. package/dist/esm/lib/container-builder.js.map +1 -0
  76. package/dist/esm/lib/container.d.ts +52 -0
  77. package/dist/esm/lib/container.d.ts.map +1 -0
  78. package/dist/esm/lib/container.js +109 -0
  79. package/dist/esm/lib/container.js.map +1 -0
  80. package/dist/esm/lib/scoped-container.d.ts +36 -0
  81. package/dist/esm/lib/scoped-container.d.ts.map +1 -0
  82. package/dist/esm/lib/scoped-container.js +115 -0
  83. package/dist/esm/lib/scoped-container.js.map +1 -0
  84. package/dist/esm/lib/types/factory-provider.d.ts +18 -0
  85. package/dist/esm/lib/types/factory-provider.d.ts.map +1 -0
  86. package/dist/esm/lib/types/factory-provider.js +2 -0
  87. package/dist/esm/lib/types/factory-provider.js.map +1 -0
  88. package/dist/esm/lib/types/injectable-class.d.ts +11 -0
  89. package/dist/esm/lib/types/injectable-class.d.ts.map +1 -0
  90. package/dist/esm/lib/types/injectable-class.js +2 -0
  91. package/dist/esm/lib/types/injectable-class.js.map +1 -0
  92. package/dist/esm/lib/types/lifecycle.d.ts +13 -0
  93. package/dist/esm/lib/types/lifecycle.d.ts.map +1 -0
  94. package/dist/esm/lib/types/lifecycle.js +2 -0
  95. package/dist/esm/lib/types/lifecycle.js.map +1 -0
  96. package/dist/esm/lib/types/options.d.ts +5 -0
  97. package/dist/esm/lib/types/options.d.ts.map +1 -0
  98. package/dist/esm/lib/types/options.js +2 -0
  99. package/dist/esm/lib/types/options.js.map +1 -0
  100. package/dist/esm/lib/types/resolvers.d.ts +15 -0
  101. package/dist/esm/lib/types/resolvers.d.ts.map +1 -0
  102. package/dist/esm/lib/types/resolvers.js +2 -0
  103. package/dist/esm/lib/types/resolvers.js.map +1 -0
  104. package/dist/esm/lib/types/scope.d.ts +6 -0
  105. package/dist/esm/lib/types/scope.d.ts.map +1 -0
  106. package/dist/esm/lib/types/scope.js +5 -0
  107. package/dist/esm/lib/types/scope.js.map +1 -0
  108. package/dist/esm/lib/types/tokens.d.ts +13 -0
  109. package/dist/esm/lib/types/tokens.d.ts.map +1 -0
  110. package/dist/esm/lib/types/tokens.js +2 -0
  111. package/dist/esm/lib/types/tokens.js.map +1 -0
  112. package/dist/esm/lib/utils/create-token.d.ts +10 -0
  113. package/dist/esm/lib/utils/create-token.d.ts.map +1 -0
  114. package/dist/esm/lib/utils/create-token.js +11 -0
  115. package/dist/esm/lib/utils/create-token.js.map +1 -0
  116. package/dist/esm/lib/utils/define-factory.d.ts +28 -0
  117. package/dist/esm/lib/utils/define-factory.d.ts.map +1 -0
  118. package/dist/esm/lib/utils/define-factory.js +28 -0
  119. package/dist/esm/lib/utils/define-factory.js.map +1 -0
  120. package/dist/esm/lib/utils/has-on-destroy.d.ts +6 -0
  121. package/dist/esm/lib/utils/has-on-destroy.d.ts.map +1 -0
  122. package/dist/esm/lib/utils/has-on-destroy.js +7 -0
  123. package/dist/esm/lib/utils/has-on-destroy.js.map +1 -0
  124. package/dist/esm/lib/utils/has-on-init.d.ts +6 -0
  125. package/dist/esm/lib/utils/has-on-init.d.ts.map +1 -0
  126. package/dist/esm/lib/utils/has-on-init.js +7 -0
  127. package/dist/esm/lib/utils/has-on-init.js.map +1 -0
  128. package/dist/esm/lib/utils/token-to-string.d.ts +6 -0
  129. package/dist/esm/lib/utils/token-to-string.d.ts.map +1 -0
  130. package/dist/esm/lib/utils/token-to-string.js +10 -0
  131. package/dist/esm/lib/utils/token-to-string.js.map +1 -0
  132. package/package.json +75 -0
@@ -0,0 +1,18 @@
1
+ import type { ResolveDeps } from './resolvers.js';
2
+ import type { Token } from './tokens.js';
3
+ export interface FactoryProvider<T, Deps extends readonly Token<any>[] = readonly Token<any>[], DestroyDeps extends readonly Token<any>[] = readonly []> {
4
+ provide: Token<T>;
5
+ deps: Deps;
6
+ factory: FactoryFn<T, Deps>;
7
+ onDestroy?: {
8
+ deps?: DestroyDeps;
9
+ handler: (...args: ResolveDeps<DestroyDeps>) => void | Promise<void>;
10
+ };
11
+ }
12
+ /**
13
+ * Factory function type - can be sync or async.
14
+ * Parameters must match the types resolved from deps.
15
+ */
16
+ type FactoryFn<T, Deps extends readonly Token<any>[] = readonly Token<any>[]> = (...args: ResolveDeps<Deps>) => T | Promise<T>;
17
+ export {};
18
+ //# sourceMappingURL=factory-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-provider.d.ts","sourceRoot":"","sources":["../../../../src/lib/types/factory-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,eAAe,CAC9B,CAAC,EACD,IAAI,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAC1D,WAAW,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,EAAE;IAEvD,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtE,CAAC;CACH;AAED;;;GAGG;AACH,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAC9E,GAAG,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,KACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=factory-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-provider.js","sourceRoot":"","sources":["../../../../src/lib/types/factory-provider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { ResolveDeps } from './resolvers.js';
2
+ import { Token } from './tokens.js';
3
+ /**
4
+ * Interface for classes with static deps property.
5
+ * Enforces that the constructor parameters must match the types resolved from deps.
6
+ */
7
+ export interface InjectableClass<T = unknown, Deps extends readonly Token<any>[] = readonly Token<any>[]> {
8
+ deps: Deps;
9
+ new (...args: ResolveDeps<Deps>): T;
10
+ }
11
+ //# sourceMappingURL=injectable-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable-class.d.ts","sourceRoot":"","sources":["../../../../src/lib/types/injectable-class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,eAAe,CAC9B,CAAC,GAAG,OAAO,EACX,IAAI,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE;IAE1D,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,GAAG,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;CACrC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=injectable-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectable-class.js","sourceRoot":"","sources":["../../../../src/lib/types/injectable-class.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Interface for services that need initialization after all dependencies are resolved
3
+ */
4
+ export interface OnInit {
5
+ onInit(): Promise<void> | void;
6
+ }
7
+ /**
8
+ * Interface for services that need cleanup on container destruction
9
+ */
10
+ export interface OnDestroy {
11
+ onDestroy(): Promise<void> | void;
12
+ }
13
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/lib/types/lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACnC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../../src/lib/types/lifecycle.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { Scope } from './scope.js';
2
+ export interface RegistrationOptions {
3
+ scope?: Scope;
4
+ }
5
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../src/lib/types/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../src/lib/types/options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { TypedToken, Token } from './tokens.js';
2
+ /**
3
+ * Extract the resolved type from a service token.
4
+ * - For TypedToken<T> → returns T
5
+ * - For class constructor → returns the instance type
6
+ */
7
+ export type ResolveToken<T> = T extends TypedToken<infer U> ? U : T extends new (...args: any[]) => infer U ? U : never;
8
+ /**
9
+ * Extract types from a deps array as a tuple.
10
+ * Maps each token to its resolved type.
11
+ */
12
+ export type ResolveDeps<T extends readonly Token<any>[]> = {
13
+ [K in keyof T]: ResolveToken<T[K]>;
14
+ };
15
+ //# sourceMappingURL=resolvers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../../src/lib/types/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IACxB,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE5F;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI;KACxD,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=resolvers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../../../../src/lib/types/resolvers.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export declare const Scope: {
2
+ readonly Singleton: "singleton";
3
+ readonly Scoped: "scoped";
4
+ };
5
+ export type Scope = (typeof Scope)[keyof typeof Scope];
6
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../../src/lib/types/scope.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAEX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Scope = void 0;
4
+ exports.Scope = {
5
+ Singleton: 'singleton',
6
+ Scoped: 'scoped',
7
+ };
8
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../../src/lib/types/scope.ts"],"names":[],"mappings":";;;AAAa,QAAA,KAAK,GAAG;IACnB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;CACR,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ *
3
+ * Service token types - can be a class constructor or a typed symbol
4
+ */
5
+ export type Token<T> = TypedToken<T> | (new (...args: any[]) => T);
6
+ /**
7
+ * A branded symbol type that carries type information at the type level.
8
+ * Use createToken<T>() to create typed tokens for non-class dependencies.
9
+ */
10
+ export type TypedToken<T> = symbol & {
11
+ readonly __type?: T;
12
+ };
13
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/lib/types/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../../src/lib/types/tokens.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { TypedToken } from '../types/tokens.js';
2
+ /**
3
+ * Create a typed token for non-class dependencies (like database connections).
4
+ * The type parameter T specifies what type the token resolves to.
5
+ *
6
+ * @example
7
+ * export const DATABASE = createToken<Database>('DATABASE');
8
+ */
9
+ export declare function createToken<T>(name: string): TypedToken<T>;
10
+ //# sourceMappingURL=create-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-token.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/create-token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAE1D"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToken = createToken;
4
+ /**
5
+ * Create a typed token for non-class dependencies (like database connections).
6
+ * The type parameter T specifies what type the token resolves to.
7
+ *
8
+ * @example
9
+ * export const DATABASE = createToken<Database>('DATABASE');
10
+ */
11
+ function createToken(name) {
12
+ return Symbol.for(name);
13
+ }
14
+ //# sourceMappingURL=create-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-token.js","sourceRoot":"","sources":["../../../../src/lib/utils/create-token.ts"],"names":[],"mappings":";;AASA,kCAEC;AATD;;;;;;GAMG;AACH,SAAgB,WAAW,CAAI,IAAY;IACzC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAkB,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { FactoryProvider } from '../types/factory-provider.js';
2
+ import type { Token } from '../types/tokens.js';
3
+ /**
4
+ * Helper to define factories with type inference.
5
+ *
6
+ * This function is an identity function that returns the config object unchanged.
7
+ * Its purpose is to provide automatic type inference for the generic parameters,
8
+ * so you don't have to manually specify them when creating a FactoryProvider.
9
+ *
10
+ * Without defineFactory:
11
+ * const factory: FactoryProvider<DbType, readonly [typeof CONFIG]> = { ... };
12
+ *
13
+ * With defineFactory:
14
+ * const factory = defineFactory({ ... }); // Types inferred from provide and deps
15
+ *
16
+ * @example
17
+ * const dbFactory = defineFactory({
18
+ * provide: DATABASE,
19
+ * deps: [DB_CONTAINER_OPTIONS] as const,
20
+ * factory: (options) => new Database(options.connectionString),
21
+ * onDestroy: {
22
+ * deps: [DATABASE] as const,
23
+ * handler: async (db) => await db.destroy()
24
+ * }
25
+ * });
26
+ */
27
+ export declare function defineFactory<T, Deps extends readonly Token<any>[], DestroyDeps extends readonly Token<any>[] = readonly []>(config: FactoryProvider<T, Deps, DestroyDeps>): FactoryProvider<T, Deps, DestroyDeps>;
28
+ //# sourceMappingURL=define-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-factory.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/define-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EACD,IAAI,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAClC,WAAW,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,EAAE,EACvD,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAEtF"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineFactory = defineFactory;
4
+ /**
5
+ * Helper to define factories with type inference.
6
+ *
7
+ * This function is an identity function that returns the config object unchanged.
8
+ * Its purpose is to provide automatic type inference for the generic parameters,
9
+ * so you don't have to manually specify them when creating a FactoryProvider.
10
+ *
11
+ * Without defineFactory:
12
+ * const factory: FactoryProvider<DbType, readonly [typeof CONFIG]> = { ... };
13
+ *
14
+ * With defineFactory:
15
+ * const factory = defineFactory({ ... }); // Types inferred from provide and deps
16
+ *
17
+ * @example
18
+ * const dbFactory = defineFactory({
19
+ * provide: DATABASE,
20
+ * deps: [DB_CONTAINER_OPTIONS] as const,
21
+ * factory: (options) => new Database(options.connectionString),
22
+ * onDestroy: {
23
+ * deps: [DATABASE] as const,
24
+ * handler: async (db) => await db.destroy()
25
+ * }
26
+ * });
27
+ */
28
+ function defineFactory(config) {
29
+ return config;
30
+ }
31
+ //# sourceMappingURL=define-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-factory.js","sourceRoot":"","sources":["../../../../src/lib/utils/define-factory.ts"],"names":[],"mappings":";;AA2BA,sCAMC;AA9BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,aAAa,CAI3B,MAA6C;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { OnDestroy } from '../types/lifecycle.js';
2
+ /**
3
+ * Type guard to check if an instance implements OnDestroy
4
+ */
5
+ export declare function hasOnDestroy(instance: unknown): instance is OnDestroy;
6
+ //# sourceMappingURL=has-on-destroy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-on-destroy.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/has-on-destroy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,SAAS,CAErE"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasOnDestroy = hasOnDestroy;
4
+ /**
5
+ * Type guard to check if an instance implements OnDestroy
6
+ */
7
+ function hasOnDestroy(instance) {
8
+ return typeof instance.onDestroy === 'function';
9
+ }
10
+ //# sourceMappingURL=has-on-destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-on-destroy.js","sourceRoot":"","sources":["../../../../src/lib/utils/has-on-destroy.ts"],"names":[],"mappings":";;AAKA,oCAEC;AALD;;GAEG;AACH,SAAgB,YAAY,CAAC,QAAiB;IAC5C,OAAO,OAAQ,QAAsB,CAAC,SAAS,KAAK,UAAU,CAAC;AACjE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { OnInit } from '../types/lifecycle.js';
2
+ /**
3
+ * Type guard to check if an instance implements OnInit
4
+ */
5
+ export declare function hasOnInit(instance: unknown): instance is OnInit;
6
+ //# sourceMappingURL=has-on-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-on-init.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/has-on-init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,MAAM,CAE/D"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasOnInit = hasOnInit;
4
+ /**
5
+ * Type guard to check if an instance implements OnInit
6
+ */
7
+ function hasOnInit(instance) {
8
+ return typeof instance.onInit === 'function';
9
+ }
10
+ //# sourceMappingURL=has-on-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-on-init.js","sourceRoot":"","sources":["../../../../src/lib/utils/has-on-init.ts"],"names":[],"mappings":";;AAKA,8BAEC;AALD;;GAEG;AACH,SAAgB,SAAS,CAAC,QAAiB;IACzC,OAAO,OAAQ,QAAmB,CAAC,MAAM,KAAK,UAAU,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Token } from '../types/tokens.js';
2
+ /**
3
+ * Convert a service token to a string for error messages
4
+ */
5
+ export declare function tokenToString(token: Token<unknown>): string;
6
+ //# sourceMappingURL=token-to-string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-to-string.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/token-to-string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAK3D"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenToString = tokenToString;
4
+ /**
5
+ * Convert a service token to a string for error messages
6
+ */
7
+ function tokenToString(token) {
8
+ if (typeof token === 'symbol') {
9
+ return token.description ?? token.toString();
10
+ }
11
+ return token.name;
12
+ }
13
+ //# sourceMappingURL=token-to-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-to-string.js","sourceRoot":"","sources":["../../../../src/lib/utils/token-to-string.ts"],"names":[],"mappings":";;AAKA,sCAKC;AARD;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAqB;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,12 @@
1
+ export { Container } from './lib/container.js';
2
+ export { ContainerBuilder } from './lib/container-builder.js';
3
+ export { ScopedContainer } from './lib/scoped-container.js';
4
+ export type { OnDestroy, OnInit } from './lib/types/lifecycle.js';
5
+ export type { FactoryProvider } from './lib/types/factory-provider.js';
6
+ export type { RegistrationOptions } from './lib/types/options.js';
7
+ export { Scope } from './lib/types/scope.js';
8
+ export type { Scope as ScopeType } from './lib/types/scope.js';
9
+ export type { Token, TypedToken } from './lib/types/tokens.js';
10
+ export { createToken } from './lib/utils/create-token.js';
11
+ export { defineFactory } from './lib/utils/define-factory.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,YAAY,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { Container } from './lib/container.js';
2
+ export { ContainerBuilder } from './lib/container-builder.js';
3
+ export { ScopedContainer } from './lib/scoped-container.js';
4
+ export { Scope } from './lib/types/scope.js';
5
+ export { createToken } from './lib/utils/create-token.js';
6
+ export { defineFactory } from './lib/utils/define-factory.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAK5D,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAI7C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { Container } from './container.js';
2
+ import type { FactoryProvider } from './types/factory-provider.js';
3
+ import type { InjectableClass } from './types/injectable-class.js';
4
+ import type { RegistrationOptions } from './types/options.js';
5
+ import type { Token } from './types/tokens.js';
6
+ /**
7
+ * ContainerBuilder is the class you use to configure a Container.
8
+ *
9
+ * The ContainerBuilder has 2 main responsibilities:
10
+ * 1. Collect all provider registrations, which can be defined in any order.
11
+ * - Handled by register* methods.
12
+ * 2. Instantiate instances and register them in a new Container.
13
+ * - Handled by `.build()`.
14
+ *
15
+ * The ContainerBuilder does a topological sort to ensure that instances are created and destroyed
16
+ * in the correct order (e.g. all of a providers dependencies must be created before that
17
+ * provider's instance can be created, and destruction needs to happen in the opposite order).
18
+ */
19
+ export declare class ContainerBuilder {
20
+ private readonly registrations;
21
+ /**
22
+ * Register a static value.
23
+ */
24
+ registerValue<T>(token: Token<T>, value: T): this;
25
+ /**
26
+ * Register a class with static deps property.
27
+ * Dependencies are resolved automatically during build().
28
+ * Type safety between the deps array and constructor params is enforced at this method.
29
+ */
30
+ registerClass<T, Deps extends readonly Token<any>[]>(Class: InjectableClass<T, Deps>, options?: RegistrationOptions): this;
31
+ /**
32
+ * Register a factory provider, which can be async or sync and can inject other dependencies.
33
+ */
34
+ registerFactory<T, Deps extends readonly Token<any>[], DestroyDeps extends readonly Token<any>[]>(provider: FactoryProvider<T, Deps, DestroyDeps>, options?: RegistrationOptions): this;
35
+ /**
36
+ * Merge providers from another container.
37
+ *
38
+ * This is useful for creating standalone packages/libraries that export a ContainerBuilder.
39
+ * You can use `merge` to bring these standalone packages together into a single Container.
40
+ */
41
+ merge(other: ContainerBuilder): this;
42
+ /**
43
+ * Override an existing provider with a value; intended for mocking during tests.
44
+ */
45
+ override<T>(token: Token<T>, value: T): this;
46
+ /**
47
+ * Build the container - topologically sorts providers and instantiates singletons.
48
+ * Scoped providers are validated but not instantiated - they're stored for later use in Scopes.
49
+ * By default, also initializes the container (calls onInit on all services).
50
+ */
51
+ build(options?: {
52
+ init?: boolean;
53
+ }): Promise<Container>;
54
+ /**
55
+ * Topologically sort providers by their dependencies using Kahn's algorithm.
56
+ *
57
+ * This ensures that dependent providers are created and initialized BEFORE the providers that
58
+ * depend on them, and that dependent providers are destroyed AFTER providers that depend on them.
59
+ *
60
+ * Also validates that singleton providers do not depend on scoped providers.
61
+ */
62
+ private topologicalSort;
63
+ /**
64
+ * Find a cycle path using DFS with coloring.
65
+ * Returns the cycle as an array of tokens ending with the repeated token.
66
+ */
67
+ private findCyclePath;
68
+ private addRegistration;
69
+ private isScoped;
70
+ private isSingleton;
71
+ /**
72
+ * Resolve dependencies from the instances map.
73
+ */
74
+ private resolveDeps;
75
+ }
76
+ //# sourceMappingURL=container-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-builder.d.ts","sourceRoot":"","sources":["../../../src/lib/container-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgD;IAE9E;;OAEG;IACI,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKxD;;;;OAIG;IACI,aAAa,CAAC,CAAC,EAAE,IAAI,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EACxD,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EAC/B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI;IAYP;;OAEG;IACI,eAAe,CACpB,CAAC,EACD,IAAI,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAClC,WAAW,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EACzC,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAYvF;;;;;OAKG;IACI,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAO3C;;OAEG;IACI,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAQnD;;;;OAIG;IACU,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IA+DpE;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IA+EvB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAmDrB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,WAAW;CAYpB"}