@nexus-ioc/core 0.6.2 → 0.7.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 (220) hide show
  1. package/README.md +731 -1
  2. package/dist/cjs/browser.js +2 -2
  3. package/dist/cjs/browser.js.map +1 -1
  4. package/dist/cjs/core/child-module.js +32 -0
  5. package/dist/cjs/core/child-module.js.map +1 -0
  6. package/dist/cjs/core/graph/analyze-lazy-module.js +54 -0
  7. package/dist/cjs/core/graph/analyze-lazy-module.js.map +1 -0
  8. package/dist/cjs/core/graph/analyze-module.js +11 -0
  9. package/dist/cjs/core/graph/analyze-module.js.map +1 -1
  10. package/dist/cjs/core/graph/module-graph.js +685 -70
  11. package/dist/cjs/core/graph/module-graph.js.map +1 -1
  12. package/dist/cjs/core/injection/injection-context.js +29 -0
  13. package/dist/cjs/core/injection/injection-context.js.map +1 -0
  14. package/dist/cjs/core/lazy-module-loader.js +41 -0
  15. package/dist/cjs/core/lazy-module-loader.js.map +1 -0
  16. package/dist/cjs/core/module-ref.js +84 -0
  17. package/dist/cjs/core/module-ref.js.map +1 -0
  18. package/dist/cjs/core/modules/container.js +305 -17
  19. package/dist/cjs/core/modules/container.js.map +1 -1
  20. package/dist/cjs/core/modules/module-container-factory.js +2 -2
  21. package/dist/cjs/core/modules/module-container-factory.js.map +1 -1
  22. package/dist/cjs/core/modules/module-container.js +54 -16
  23. package/dist/cjs/core/modules/module-container.js.map +1 -1
  24. package/dist/cjs/core/modules/module-token-factory.js.map +1 -1
  25. package/dist/cjs/core/modules/modules-container.js +43 -3
  26. package/dist/cjs/core/modules/modules-container.js.map +1 -1
  27. package/dist/cjs/core/nexus-applications.browser.js +57 -15
  28. package/dist/cjs/core/nexus-applications.browser.js.map +1 -1
  29. package/dist/cjs/core/nexus-applications.js +440 -82
  30. package/dist/cjs/core/nexus-applications.js.map +1 -1
  31. package/dist/cjs/core/nexus-applications.server.js +57 -15
  32. package/dist/cjs/core/nexus-applications.server.js.map +1 -1
  33. package/dist/cjs/core/resolver/providers-container.js.map +1 -1
  34. package/dist/cjs/core/resolver/resolution-context.js +62 -0
  35. package/dist/cjs/core/resolver/resolution-context.js.map +1 -0
  36. package/dist/cjs/core/resolver/resolver.js +523 -99
  37. package/dist/cjs/core/resolver/resolver.js.map +1 -1
  38. package/dist/cjs/decorators/inject.js +6 -3
  39. package/dist/cjs/decorators/inject.js.map +1 -1
  40. package/dist/cjs/decorators/injectable.js +0 -7
  41. package/dist/cjs/decorators/injectable.js.map +1 -1
  42. package/dist/cjs/decorators/{nsModule.js → module.js} +9 -7
  43. package/dist/cjs/decorators/module.js.map +1 -0
  44. package/dist/cjs/errors/bootstrap-error.js +47 -0
  45. package/dist/cjs/errors/bootstrap-error.js.map +1 -0
  46. package/dist/cjs/errors/child-errors.js +21 -0
  47. package/dist/cjs/errors/child-errors.js.map +1 -0
  48. package/dist/cjs/errors/index.js +24 -0
  49. package/dist/cjs/errors/index.js.map +1 -0
  50. package/dist/cjs/errors/injection-errors.js +25 -0
  51. package/dist/cjs/errors/injection-errors.js.map +1 -0
  52. package/dist/cjs/errors/lazy-module-errors.js +26 -0
  53. package/dist/cjs/errors/lazy-module-errors.js.map +1 -0
  54. package/dist/cjs/errors/provider-errors.js +95 -0
  55. package/dist/cjs/errors/provider-errors.js.map +1 -0
  56. package/dist/cjs/index.js +30 -6
  57. package/dist/cjs/index.js.map +1 -1
  58. package/dist/cjs/interfaces/index.js +1 -0
  59. package/dist/cjs/interfaces/index.js.map +1 -1
  60. package/dist/cjs/interfaces/modules/index.js +1 -0
  61. package/dist/cjs/interfaces/modules/index.js.map +1 -1
  62. package/dist/cjs/interfaces/modules/module-graph.interface.js +2 -0
  63. package/dist/cjs/interfaces/modules/module-graph.interface.js.map +1 -1
  64. package/dist/cjs/interfaces/modules/parent-link.interface.js +3 -0
  65. package/dist/cjs/interfaces/modules/parent-link.interface.js.map +1 -0
  66. package/dist/cjs/interfaces/on-module-destroy.interface.js +3 -0
  67. package/dist/cjs/interfaces/on-module-destroy.interface.js.map +1 -0
  68. package/dist/cjs/interfaces/scope.interface.js +2 -55
  69. package/dist/cjs/interfaces/scope.interface.js.map +1 -1
  70. package/dist/cjs/interfaces/validate-module-keys.js +2 -0
  71. package/dist/cjs/interfaces/validate-module-keys.js.map +1 -1
  72. package/dist/cjs/internal.js +9 -0
  73. package/dist/cjs/internal.js.map +1 -0
  74. package/dist/cjs/server.js +2 -2
  75. package/dist/cjs/server.js.map +1 -1
  76. package/dist/cjs/utils/forward-ref.js +14 -0
  77. package/dist/cjs/utils/forward-ref.js.map +1 -0
  78. package/dist/cjs/utils/helpers.js +14 -4
  79. package/dist/cjs/utils/helpers.js.map +1 -1
  80. package/dist/cjs/utils/lazy-module.js +33 -0
  81. package/dist/cjs/utils/lazy-module.js.map +1 -0
  82. package/dist/esm/browser.js +1 -1
  83. package/dist/esm/browser.js.map +1 -1
  84. package/dist/esm/core/child-module.js +29 -0
  85. package/dist/esm/core/child-module.js.map +1 -0
  86. package/dist/esm/core/graph/analyze-lazy-module.js +50 -0
  87. package/dist/esm/core/graph/analyze-lazy-module.js.map +1 -0
  88. package/dist/esm/core/graph/analyze-module.js +11 -0
  89. package/dist/esm/core/graph/analyze-module.js.map +1 -1
  90. package/dist/esm/core/graph/module-graph.js +686 -71
  91. package/dist/esm/core/graph/module-graph.js.map +1 -1
  92. package/dist/esm/core/injection/injection-context.js +25 -0
  93. package/dist/esm/core/injection/injection-context.js.map +1 -0
  94. package/dist/esm/core/lazy-module-loader.js +36 -0
  95. package/dist/esm/core/lazy-module-loader.js.map +1 -0
  96. package/dist/esm/core/module-ref.js +80 -0
  97. package/dist/esm/core/module-ref.js.map +1 -0
  98. package/dist/esm/core/modules/container.js +305 -17
  99. package/dist/esm/core/modules/container.js.map +1 -1
  100. package/dist/esm/core/modules/module-container-factory.js +2 -2
  101. package/dist/esm/core/modules/module-container-factory.js.map +1 -1
  102. package/dist/esm/core/modules/module-container.js +55 -17
  103. package/dist/esm/core/modules/module-container.js.map +1 -1
  104. package/dist/esm/core/modules/module-token-factory.js.map +1 -1
  105. package/dist/esm/core/modules/modules-container.js +43 -3
  106. package/dist/esm/core/modules/modules-container.js.map +1 -1
  107. package/dist/esm/core/nexus-applications.browser.js +55 -13
  108. package/dist/esm/core/nexus-applications.browser.js.map +1 -1
  109. package/dist/esm/core/nexus-applications.js +439 -81
  110. package/dist/esm/core/nexus-applications.js.map +1 -1
  111. package/dist/esm/core/nexus-applications.server.js +55 -13
  112. package/dist/esm/core/nexus-applications.server.js.map +1 -1
  113. package/dist/esm/core/resolver/providers-container.js.map +1 -1
  114. package/dist/esm/core/resolver/resolution-context.js +58 -0
  115. package/dist/esm/core/resolver/resolution-context.js.map +1 -0
  116. package/dist/esm/core/resolver/resolver.js +524 -100
  117. package/dist/esm/core/resolver/resolver.js.map +1 -1
  118. package/dist/esm/decorators/inject.js +6 -3
  119. package/dist/esm/decorators/inject.js.map +1 -1
  120. package/dist/esm/decorators/injectable.js +0 -7
  121. package/dist/esm/decorators/injectable.js.map +1 -1
  122. package/dist/esm/decorators/{nsModule.js → module.js} +8 -6
  123. package/dist/esm/decorators/module.js.map +1 -0
  124. package/dist/esm/errors/bootstrap-error.js +42 -0
  125. package/dist/esm/errors/bootstrap-error.js.map +1 -0
  126. package/dist/esm/errors/child-errors.js +17 -0
  127. package/dist/esm/errors/child-errors.js.map +1 -0
  128. package/dist/esm/errors/index.js +6 -0
  129. package/dist/esm/errors/index.js.map +1 -0
  130. package/dist/esm/errors/injection-errors.js +20 -0
  131. package/dist/esm/errors/injection-errors.js.map +1 -0
  132. package/dist/esm/errors/lazy-module-errors.js +21 -0
  133. package/dist/esm/errors/lazy-module-errors.js.map +1 -0
  134. package/dist/esm/errors/provider-errors.js +84 -0
  135. package/dist/esm/errors/provider-errors.js.map +1 -0
  136. package/dist/esm/index.js +9 -4
  137. package/dist/esm/index.js.map +1 -1
  138. package/dist/esm/interfaces/index.js +1 -0
  139. package/dist/esm/interfaces/index.js.map +1 -1
  140. package/dist/esm/interfaces/modules/index.js +1 -0
  141. package/dist/esm/interfaces/modules/index.js.map +1 -1
  142. package/dist/esm/interfaces/modules/module-graph.interface.js +2 -0
  143. package/dist/esm/interfaces/modules/module-graph.interface.js.map +1 -1
  144. package/dist/esm/interfaces/modules/parent-link.interface.js +2 -0
  145. package/dist/esm/interfaces/modules/parent-link.interface.js.map +1 -0
  146. package/dist/esm/interfaces/on-module-destroy.interface.js +2 -0
  147. package/dist/esm/interfaces/on-module-destroy.interface.js.map +1 -0
  148. package/dist/esm/interfaces/scope.interface.js +1 -55
  149. package/dist/esm/interfaces/scope.interface.js.map +1 -1
  150. package/dist/esm/interfaces/validate-module-keys.js +2 -0
  151. package/dist/esm/interfaces/validate-module-keys.js.map +1 -1
  152. package/dist/esm/internal.js +3 -0
  153. package/dist/esm/internal.js.map +1 -0
  154. package/dist/esm/server.js +1 -1
  155. package/dist/esm/server.js.map +1 -1
  156. package/dist/esm/utils/forward-ref.js +10 -0
  157. package/dist/esm/utils/forward-ref.js.map +1 -0
  158. package/dist/esm/utils/helpers.js +14 -4
  159. package/dist/esm/utils/helpers.js.map +1 -1
  160. package/dist/esm/utils/lazy-module.js +29 -0
  161. package/dist/esm/utils/lazy-module.js.map +1 -0
  162. package/dist/types/browser.d.ts +1 -1
  163. package/dist/types/core/child-module.d.ts +8 -0
  164. package/dist/types/core/graph/analyze-lazy-module.d.ts +28 -0
  165. package/dist/types/core/graph/analyze-module.d.ts +4 -2
  166. package/dist/types/core/graph/analyze-provider.d.ts +4 -4
  167. package/dist/types/core/graph/module-graph.d.ts +200 -7
  168. package/dist/types/core/graph/providers/analyze-class-provider.d.ts +1 -1
  169. package/dist/types/core/graph/providers/analyze-factory-provider.d.ts +2 -2
  170. package/dist/types/core/graph/providers/analyze-value-provider.d.ts +1 -1
  171. package/dist/types/core/injection/injection-context.d.ts +29 -0
  172. package/dist/types/core/lazy-module-loader.d.ts +17 -0
  173. package/dist/types/core/module-ref.d.ts +34 -0
  174. package/dist/types/core/modules/container.d.ts +134 -18
  175. package/dist/types/core/modules/module-container-factory.d.ts +3 -3
  176. package/dist/types/core/modules/module-container.d.ts +44 -5
  177. package/dist/types/core/modules/module-token-factory.d.ts +2 -2
  178. package/dist/types/core/modules/modules-container.d.ts +23 -4
  179. package/dist/types/core/nexus-applications.browser.d.ts +30 -8
  180. package/dist/types/core/nexus-applications.d.ts +219 -55
  181. package/dist/types/core/nexus-applications.server.d.ts +30 -8
  182. package/dist/types/core/resolver/providers-container.d.ts +2 -2
  183. package/dist/types/core/resolver/resolution-context.d.ts +22 -0
  184. package/dist/types/core/resolver/resolver.d.ts +122 -4
  185. package/dist/types/decorators/inject.d.ts +9 -5
  186. package/dist/types/decorators/injectable.d.ts +0 -7
  187. package/dist/types/decorators/{nsModule.d.ts → module.d.ts} +6 -5
  188. package/dist/types/errors/bootstrap-error.d.ts +6 -0
  189. package/dist/types/errors/child-errors.d.ts +10 -0
  190. package/dist/types/errors/index.d.ts +5 -0
  191. package/dist/types/errors/injection-errors.d.ts +11 -0
  192. package/dist/types/errors/lazy-module-errors.d.ts +12 -0
  193. package/dist/types/errors/provider-errors.d.ts +47 -0
  194. package/dist/types/index.d.ts +13 -4
  195. package/dist/types/interfaces/abstract.interface.d.ts +1 -3
  196. package/dist/types/interfaces/dynamic-module.interface.d.ts +7 -5
  197. package/dist/types/interfaces/index.d.ts +1 -0
  198. package/dist/types/interfaces/injection-token.interface.d.ts +1 -3
  199. package/dist/types/interfaces/module-metadata.interface.d.ts +12 -4
  200. package/dist/types/interfaces/module-types.interface.d.ts +21 -24
  201. package/dist/types/interfaces/modules/container.interface.d.ts +10 -4
  202. package/dist/types/interfaces/modules/index.d.ts +1 -0
  203. package/dist/types/interfaces/modules/module-container-factory.interface.d.ts +2 -2
  204. package/dist/types/interfaces/modules/module-graph.interface.d.ts +85 -12
  205. package/dist/types/interfaces/modules/module-token-factory.interface.d.ts +2 -2
  206. package/dist/types/interfaces/modules/modules-container.interface.d.ts +5 -4
  207. package/dist/types/interfaces/modules/parent-link.interface.d.ts +12 -0
  208. package/dist/types/interfaces/nexus-application.interface.d.ts +49 -6
  209. package/dist/types/interfaces/on-module-destroy.interface.d.ts +3 -0
  210. package/dist/types/interfaces/plugins/scanner-plugin.interface.d.ts +1 -1
  211. package/dist/types/interfaces/scope.interface.d.ts +1 -54
  212. package/dist/types/interfaces/validate-module-keys.d.ts +1 -0
  213. package/dist/types/internal.d.ts +3 -0
  214. package/dist/types/server.d.ts +1 -1
  215. package/dist/types/utils/forward-ref.d.ts +5 -0
  216. package/dist/types/utils/helpers.d.ts +8 -8
  217. package/dist/types/utils/lazy-module.d.ts +20 -0
  218. package/package.json +21 -4
  219. package/dist/cjs/decorators/nsModule.js.map +0 -1
  220. package/dist/esm/decorators/nsModule.js.map +0 -1
@@ -3,7 +3,7 @@ import type { ModuleMetadata } from "../interfaces";
3
3
  /**
4
4
  * Defines a module in the application.
5
5
  *
6
- * A module is a class annotated with @NsModule() decorator that organizes
6
+ * A module is a class annotated with @Module() decorator that organizes
7
7
  * the application structure. Modules can:
8
8
  * - Declare providers that will be instantiated by the container
9
9
  * - Import other modules to use their exported providers
@@ -13,20 +13,21 @@ import type { ModuleMetadata } from "../interfaces";
13
13
  * @param metadata.imports - Modules whose exported providers should be available in this module
14
14
  * @param metadata.providers - Providers that belong to this module
15
15
  * @param metadata.exports - Providers or modules to export (make available to importing modules)
16
+ * @param metadata.children - Modules (or lazy refs) that may be created as child containers; not compiled into this graph
16
17
  * @returns A class decorator
17
18
  * @throws {Error} If invalid metadata keys are provided
18
19
  *
19
20
  * @example
20
21
  * ```typescript
21
22
  * // Basic module
22
- * @NsModule({
23
+ * @Module({
23
24
  * providers: [UserService, UserRepository],
24
25
  * exports: [UserService]
25
26
  * })
26
27
  * class UserModule {}
27
28
  *
28
29
  * // Module with imports
29
- * @NsModule({
30
+ * @Module({
30
31
  * imports: [DatabaseModule, LoggerModule],
31
32
  * providers: [ProductService],
32
33
  * exports: [ProductService]
@@ -34,11 +35,11 @@ import type { ModuleMetadata } from "../interfaces";
34
35
  * class ProductModule {}
35
36
  *
36
37
  * // Root module
37
- * @NsModule({
38
+ * @Module({
38
39
  * imports: [UserModule, ProductModule],
39
40
  * providers: [AppService]
40
41
  * })
41
42
  * class AppModule {}
42
43
  * ```
43
44
  */
44
- export declare function NsModule(metadata: ModuleMetadata): ClassDecorator;
45
+ export declare function Module(metadata: ModuleMetadata): ClassDecorator;
@@ -0,0 +1,6 @@
1
+ import type { GraphError } from "../interfaces";
2
+ export declare function formatGraphErrors(errors: GraphError[]): string;
3
+ export declare class BootstrapError extends Error {
4
+ readonly errors: GraphError[];
5
+ constructor(errors: GraphError[]);
6
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `createChild()` was called with a module that no module of the parent
3
+ * graph lists in `@Module({ children })`, or (`reason: "unloaded"`) the
4
+ * lazy module declaring it was unloaded while the child was being created.
5
+ */
6
+ export declare class ChildModuleNotDeclaredError extends Error {
7
+ readonly moduleName: string;
8
+ readonly reason: "not-declared" | "unloaded";
9
+ constructor(moduleName: string, reason?: "not-declared" | "unloaded");
10
+ }
@@ -0,0 +1,5 @@
1
+ export { BootstrapError, formatGraphErrors } from "./bootstrap-error";
2
+ export { ChildModuleNotDeclaredError } from "./child-errors";
3
+ export { CircularInjectionError, InjectionContextError, } from "./injection-errors";
4
+ export { LazyModuleGraphError, LazyModuleLoadError, } from "./lazy-module-errors";
5
+ export { AsyncFactoryError, ContainerClosedError, formatToken, InvalidScopeError, ProviderNotFoundError, ProviderNotInstantiatedError, ProviderScopeError, ProviderUnloadedError, } from "./provider-errors";
@@ -0,0 +1,11 @@
1
+ import type { ProviderToken } from "../interfaces";
2
+ /** inject() was called while no provider was being created. */
3
+ export declare class InjectionContextError extends Error {
4
+ readonly token: ProviderToken;
5
+ constructor(token: ProviderToken);
6
+ }
7
+ /** A dependency cycle that passes through inject() or the synchronous creation path. */
8
+ export declare class CircularInjectionError extends Error {
9
+ readonly path: ProviderToken[];
10
+ constructor(path: ProviderToken[]);
11
+ }
@@ -0,0 +1,12 @@
1
+ import type { GraphError } from "../interfaces";
2
+ /** The loader rejected or returned something that is not a @Module() class. */
3
+ export declare class LazyModuleLoadError extends Error {
4
+ readonly lazyModuleName: string;
5
+ constructor(lazyModuleName: string, reason: string);
6
+ }
7
+ /** The loaded module compiled with graph errors; the segment was rolled back. */
8
+ export declare class LazyModuleGraphError extends Error {
9
+ readonly lazyModuleName: string;
10
+ readonly errors: GraphError[];
11
+ constructor(lazyModuleName: string, errors: GraphError[]);
12
+ }
@@ -0,0 +1,47 @@
1
+ import type { ProviderToken } from "../interfaces";
2
+ import { Scope } from "../interfaces";
3
+ export declare function formatToken(token: ProviderToken): string;
4
+ /** No provider with this token exists in the container or any parent. */
5
+ export declare class ProviderNotFoundError extends Error {
6
+ readonly token: ProviderToken;
7
+ readonly requestedBy?: ProviderToken | undefined;
8
+ constructor(token: ProviderToken, requestedBy?: ProviderToken | undefined);
9
+ }
10
+ /**
11
+ * The singleton exists but has not been created yet (lazy mode or not
12
+ * loaded), or inject() met it while another resolution is still creating it.
13
+ */
14
+ export declare class ProviderNotInstantiatedError extends Error {
15
+ readonly token: ProviderToken;
16
+ constructor(token: ProviderToken, reason?: "not-created" | "creation-in-flight");
17
+ }
18
+ /**
19
+ * The provider's module was unloaded while `resolve()` was still creating
20
+ * it. The half-finished instance was destroyed instead of cached; load the
21
+ * module again and resolve the provider anew.
22
+ */
23
+ export declare class ProviderUnloadedError extends Error {
24
+ readonly token: ProviderToken;
25
+ constructor(token: ProviderToken);
26
+ }
27
+ /** get() only serves singletons; Transient providers are created per call. */
28
+ export declare class ProviderScopeError extends Error {
29
+ readonly token: ProviderToken;
30
+ readonly scope: Scope;
31
+ constructor(token: ProviderToken, scope: Scope);
32
+ }
33
+ /** A provider declares a scope that is not a member of `Scope`. */
34
+ export declare class InvalidScopeError extends Error {
35
+ readonly token: ProviderToken;
36
+ readonly scope: unknown;
37
+ constructor(token: ProviderToken, scope: unknown);
38
+ }
39
+ /** The application was closed; it can no longer provide instances. */
40
+ export declare class ContainerClosedError extends Error {
41
+ constructor();
42
+ }
43
+ /** A useFactory returned a promise; factories must be synchronous. */
44
+ export declare class AsyncFactoryError extends Error {
45
+ readonly token: ProviderToken;
46
+ constructor(token: ProviderToken);
47
+ }
@@ -1,10 +1,19 @@
1
- export { ContainerNotCompiledError } from "@nexus-ioc/shared";
2
- export { Container } from "./core/modules/container";
3
- export { NexusApplications } from "./core/nexus-applications";
1
+ export { ContainerNotCompiledError, InjectionToken } from "@nexus-ioc/shared";
2
+ export type { InjectOptions } from "./core/injection/injection-context";
3
+ export { inject } from "./core/injection/injection-context";
4
+ export { LazyModuleLoader } from "./core/lazy-module-loader";
5
+ export type { ModuleRefGetOptions } from "./core/module-ref";
6
+ export { ModuleRef } from "./core/module-ref";
7
+ export { NexusApplication } from "./core/nexus-applications";
4
8
  export { Global } from "./decorators/global";
5
9
  export { Inject } from "./decorators/inject";
6
10
  export { Injectable } from "./decorators/injectable";
7
- export { NsModule } from "./decorators/nsModule";
11
+ export { Module } from "./decorators/module";
8
12
  export { Optional } from "./decorators/optional";
13
+ export { AsyncFactoryError, BootstrapError, ChildModuleNotDeclaredError, CircularInjectionError, ContainerClosedError, InjectionContextError, InvalidScopeError, LazyModuleGraphError, LazyModuleLoadError, ProviderNotFoundError, ProviderNotInstantiatedError, ProviderScopeError, ProviderUnloadedError, } from "./errors";
9
14
  export * from "./interfaces";
15
+ export type { ForwardRef } from "./utils/forward-ref";
16
+ export { forwardRef } from "./utils/forward-ref";
10
17
  export * from "./utils/helpers";
18
+ export type { LazyModuleOptions } from "./utils/lazy-module";
19
+ export { isLazyModule, lazy } from "./utils/lazy-module";
@@ -1,3 +1 @@
1
- export interface Abstract<T> extends Function {
2
- prototype: T;
3
- }
1
+ export type { Abstract } from "@nexus-ioc/shared";
@@ -1,13 +1,15 @@
1
- import type { InjectionToken } from "./injection-token.interface";
2
- import type { Module, Provider } from "./module-types.interface";
1
+ import type { LazyModule } from "@nexus-ioc/shared";
2
+ import type { ProviderToken } from "./injection-token.interface";
3
+ import type { Provider } from "./module-types.interface";
4
+ import type { Type } from "./type.interface";
3
5
  export interface DynamicModule {
4
- module: Module & {
6
+ module: Type & {
5
7
  forRoot?: () => DynamicModule;
6
8
  forRootAsync?: () => DynamicModule;
7
9
  forFeature?: () => DynamicModule;
8
10
  forFeatureAsync?: () => DynamicModule;
9
11
  };
10
12
  providers?: Provider[];
11
- exports?: InjectionToken[];
12
- imports?: (Module | DynamicModule)[];
13
+ exports?: ProviderToken[];
14
+ imports?: (Type | DynamicModule | LazyModule)[];
13
15
  }
@@ -7,6 +7,7 @@ export * from "./module-metadata.interface";
7
7
  export * from "./module-types.interface";
8
8
  export * from "./modules";
9
9
  export * from "./nexus-application.interface";
10
+ export * from "./on-module-destroy.interface";
10
11
  export * from "./on-module-init.interface";
11
12
  export * from "./plugins";
12
13
  export * from "./scope.interface";
@@ -1,3 +1 @@
1
- import type { Abstract } from "./abstract.interface";
2
- import type { Type } from "./type.interface";
3
- export type InjectionToken<T = any> = string | symbol | Type<T> | Abstract<T> | Function;
1
+ export type { ProviderToken } from "@nexus-ioc/shared";
@@ -1,8 +1,16 @@
1
+ import type { LazyModule } from "@nexus-ioc/shared";
1
2
  import type { DynamicModule } from "./dynamic-module.interface";
2
- import type { InjectionToken } from "./injection-token.interface";
3
- import type { Module, Provider } from "./module-types.interface";
3
+ import type { ProviderToken } from "./injection-token.interface";
4
+ import type { Provider } from "./module-types.interface";
5
+ import type { Type } from "./type.interface";
6
+ export type { LazyModule } from "@nexus-ioc/shared";
4
7
  export interface ModuleMetadata {
5
- imports?: (Module | DynamicModule)[];
6
- exports?: (InjectionToken | Module)[];
8
+ imports?: (Type | DynamicModule | LazyModule)[];
9
+ exports?: (ProviderToken | Type)[];
7
10
  providers?: Provider[];
11
+ /**
12
+ * Modules that are not part of this graph but may later be instantiated as
13
+ * child containers. Static declaration only; never compiled into the parent.
14
+ */
15
+ children?: (Type | LazyModule)[];
8
16
  }
@@ -1,10 +1,7 @@
1
- import type { InjectionToken } from "./injection-token.interface";
1
+ import type { ForwardRef } from "../utils/forward-ref";
2
+ import type { ProviderToken } from "./injection-token.interface";
2
3
  import type { Scope } from "./scope.interface";
3
4
  import type { Type } from "./type.interface";
4
- /**
5
- * Represents a module class.
6
- */
7
- export type Module = Type;
8
5
  /**
9
6
  * Represents a provider that can be registered in a module.
10
7
  *
@@ -19,26 +16,26 @@ export type Module = Type;
19
16
  * @example
20
17
  * ```typescript
21
18
  * // Class provider (shorthand)
22
- * @NsModule({
19
+ * @Module({
23
20
  * providers: [UserService]
24
21
  * })
25
22
  *
26
23
  * // ClassProvider (explicit)
27
- * @NsModule({
24
+ * @Module({
28
25
  * providers: [
29
26
  * { provide: UserService, useClass: MockUserService }
30
27
  * ]
31
28
  * })
32
29
  *
33
30
  * // ValueProvider
34
- * @NsModule({
31
+ * @Module({
35
32
  * providers: [
36
33
  * { provide: 'CONFIG', useValue: { apiUrl: 'https://api.example.com' } }
37
34
  * ]
38
35
  * })
39
36
  *
40
37
  * // FactoryProvider
41
- * @NsModule({
38
+ * @Module({
42
39
  * providers: [
43
40
  * {
44
41
  * provide: 'DATABASE',
@@ -62,7 +59,7 @@ export type Provider<T = any> = ClassProvider<T> | ValueProvider<T> | FactoryPro
62
59
  *
63
60
  * @example
64
61
  * ```typescript
65
- * @NsModule({
62
+ * @Module({
66
63
  * providers: [
67
64
  * // Provide MockUserService when UserService is requested
68
65
  * {
@@ -76,7 +73,7 @@ export type Provider<T = any> = ClassProvider<T> | ValueProvider<T> | FactoryPro
76
73
  */
77
74
  export interface ClassProvider<T = any> {
78
75
  /** The injection token to register this provider under */
79
- provide: InjectionToken;
76
+ provide: ProviderToken;
80
77
  /** The class to instantiate */
81
78
  useClass: Type<T>;
82
79
  /** The lifecycle scope (default: Singleton) */
@@ -97,7 +94,7 @@ export interface ClassProvider<T = any> {
97
94
  *
98
95
  * @example
99
96
  * ```typescript
100
- * @NsModule({
97
+ * @Module({
101
98
  * providers: [
102
99
  * { provide: 'API_URL', useValue: 'https://api.example.com' },
103
100
  * { provide: 'MAX_RETRIES', useValue: 3 },
@@ -109,7 +106,7 @@ export interface ClassProvider<T = any> {
109
106
  */
110
107
  export interface ValueProvider<T = any> {
111
108
  /** The injection token to register this provider under */
112
- provide: InjectionToken;
109
+ provide: ProviderToken;
113
110
  /** The value to provide */
114
111
  useValue: T;
115
112
  }
@@ -120,21 +117,21 @@ export interface ValueProvider<T = any> {
120
117
  * - The value requires complex initialization logic
121
118
  * - The value depends on other providers
122
119
  * - You need to create the value dynamically
123
- * - You want to return a Promise for async initialization
120
+ * - You need to compute the value synchronously from other providers
121
+ *
122
+ * The factory must return the value synchronously. Returning a promise throws
123
+ * `AsyncFactoryError`; move async setup into `onModuleInit` of the provided
124
+ * class, or create the value before bootstrap and register it with `useValue`.
124
125
  *
125
126
  * @template T - The type of value the factory creates
126
127
  *
127
128
  * @example
128
129
  * ```typescript
129
- * @NsModule({
130
+ * @Module({
130
131
  * providers: [
131
132
  * {
132
133
  * provide: 'DATABASE',
133
- * useFactory: async (config: Config) => {
134
- * const db = await createConnection(config.dbUrl);
135
- * await db.migrate();
136
- * return db;
137
- * },
134
+ * useFactory: (config: Config) => createDatabase(config),
138
135
  * inject: ['CONFIG'],
139
136
  * scope: Scope.Singleton
140
137
  * },
@@ -148,11 +145,11 @@ export interface ValueProvider<T = any> {
148
145
  */
149
146
  export interface FactoryProvider<T = any> {
150
147
  /** The injection token to register this provider under */
151
- provide: InjectionToken;
152
- /** The factory function that creates the value */
153
- useFactory: (...args: any[]) => T | Promise<T>;
148
+ provide: ProviderToken;
149
+ /** Synchronous factory that creates the value; a returned promise throws AsyncFactoryError */
150
+ useFactory: (...args: any[]) => T;
154
151
  /** Tokens of dependencies to inject into the factory function */
155
- inject?: InjectionToken[];
152
+ inject?: (ProviderToken | ForwardRef)[];
156
153
  /** The lifecycle scope (default: Singleton) */
157
154
  scope?: Scope;
158
155
  }
@@ -1,8 +1,14 @@
1
- import type { ContainerBaseInterface } from "@nexus-ioc/shared";
2
- import type { Module } from "../module-types.interface";
3
- import type { ModuleGraphInterface } from "./module-graph.interface";
1
+ import type { ContainerBaseInterface, LazyModule } from "@nexus-ioc/shared";
2
+ import type { DynamicModule } from "../dynamic-module.interface";
3
+ import type { Type } from "../type.interface";
4
+ import type { GraphSegment, ModuleGraphInterface, UnloadResult } from "./module-graph.interface";
5
+ import type { ParentLink } from "./parent-link.interface";
4
6
  export type { ContainerBaseInterface } from "@nexus-ioc/shared";
5
7
  export interface ContainerInterface extends ContainerBaseInterface {
6
- run(rootModule: Module): Promise<void>;
8
+ run(rootModule: Type | DynamicModule, internalModules?: DynamicModule[], options?: {
9
+ link?: ParentLink;
10
+ }): Promise<void>;
11
+ load(lazyModule: LazyModule): Promise<GraphSegment>;
12
+ unload(lazyModule: LazyModule): Promise<UnloadResult>;
7
13
  graph: ModuleGraphInterface;
8
14
  }
@@ -4,4 +4,5 @@ export * from "./module-container-factory.interface";
4
4
  export * from "./module-graph.interface";
5
5
  export * from "./module-token-factory.interface";
6
6
  export * from "./modules-container.interface";
7
+ export * from "./parent-link.interface";
7
8
  export * from "./provider-token-factory.interface";
@@ -1,7 +1,7 @@
1
1
  import type { DynamicModule } from "../dynamic-module.interface";
2
- import type { Module } from "../module-types.interface";
2
+ import type { Type } from "../type.interface";
3
3
  import type { ContainerBaseInterface } from "./container.interface";
4
4
  import type { ModuleContainerInterface } from "./module-container.interface";
5
5
  export interface ModuleContainerFactoryInterface {
6
- create(module: Module | DynamicModule, container: ContainerBaseInterface): Promise<ModuleContainerInterface>;
6
+ create(module: Type | DynamicModule, container: ContainerBaseInterface): Promise<ModuleContainerInterface>;
7
7
  }
@@ -1,39 +1,112 @@
1
- import type { GraphError } from "@nexus-ioc/shared";
1
+ import type { GraphError, LazyModule, ModuleContainerInterface } from "@nexus-ioc/shared";
2
+ import type { AnalyzeLazyModule } from "../../core/graph/analyze-lazy-module";
2
3
  import type { AnalyzeModule } from "../../core/graph/analyze-module";
3
4
  import type { AnalyzeProvider } from "../../core/graph/analyze-provider";
4
- import type { InjectionToken } from "../injection-token.interface";
5
+ import type { ProviderToken } from "../injection-token.interface";
6
+ import type { Type } from "../type.interface";
5
7
  export type { GraphError } from "@nexus-ioc/shared";
6
8
  export declare enum NodeTypeEnum {
7
9
  MODULE = "module",
8
- PROVIDER = "provider"
10
+ PROVIDER = "provider",
11
+ LAZY = "lazy"
9
12
  }
10
13
  export declare enum EdgeTypeEnum {
11
14
  IMPORT = "import",
12
15
  EXPORT = "export",
13
16
  PROVIDER = "provider",
14
- DEPENDENCY = "dependency"
17
+ DEPENDENCY = "dependency",
18
+ LAZY = "lazy"
15
19
  }
16
- export type Node = AnalyzeModule | AnalyzeProvider;
20
+ export type Node = AnalyzeModule | AnalyzeProvider | AnalyzeLazyModule;
17
21
  export type Edge = {
18
22
  type: EdgeTypeEnum;
19
- source: InjectionToken;
20
- target: InjectionToken;
23
+ source: ProviderToken;
24
+ target: ProviderToken;
21
25
  metadata: {
22
26
  index?: number;
23
27
  key?: string;
24
- inject?: "constructor" | "property";
28
+ inject?: "constructor" | "property" | "runtime";
25
29
  lazy?: boolean;
26
30
  isCircular?: boolean;
27
31
  unreached?: boolean;
32
+ /**
33
+ * The dependency is satisfied by the parent container chain (a child
34
+ * graph only); its target is not resolved in this graph.
35
+ */
36
+ external?: boolean;
37
+ /**
38
+ * An `@Optional()` dependency whose target was not visible from the
39
+ * source's module when the edge was compiled (it may not have existed
40
+ * yet). Set only when true. The resolver injects the target only
41
+ * while it exists and is visible from the source's module.
42
+ */
43
+ lateBound?: boolean;
28
44
  };
29
45
  };
46
+ export interface ModuleGraphOptions {
47
+ /**
48
+ * Whether the parent container chain can provide `token`. Consulted only
49
+ * when a dependency is not visible locally.
50
+ */
51
+ externalLookup?: (token: ProviderToken) => boolean;
52
+ }
53
+ /**
54
+ * The part of the graph added by a single lazy module load.
55
+ * A non-empty `errors` list means the segment was rolled back and none of
56
+ * its nodes or edges remain in the graph.
57
+ */
58
+ export interface GraphSegment {
59
+ lazyModule: LazyModule;
60
+ moduleContainer: ModuleContainerInterface;
61
+ /** Module node ids added by this segment. */
62
+ moduleTokens: string[];
63
+ /** Provider node ids added by this segment. */
64
+ providerTokens: ProviderToken[];
65
+ errors: GraphError[];
66
+ }
67
+ /** What `ModuleGraph.unloadSegment` removed from the graph. */
68
+ export interface SegmentUnloadResult {
69
+ destroyedModules: string[];
70
+ destroyedProviders: ProviderToken[];
71
+ }
72
+ /** What unloading a lazy module did. */
73
+ export interface UnloadResult extends SegmentUnloadResult {
74
+ /**
75
+ * Child applications this unload started closing because the module
76
+ * that declared them in `@Module({ children })` was destroyed. A child
77
+ * whose close failed still counts; a child that was already closing
78
+ * (its own `close()`) does not, though the unload still waits for it.
79
+ */
80
+ closedChildren: number;
81
+ }
30
82
  export interface ModuleGraphInterface {
31
83
  compile(): Promise<void>;
32
- getNode(token: InjectionToken): Node | undefined;
33
- getEdge(token: InjectionToken): Edge[];
84
+ compileSegment(root: ModuleContainerInterface, lazyModule: LazyModule): Promise<GraphSegment>;
85
+ unloadSegment(lazyModule: LazyModule, protectedRoots: Set<string>): SegmentUnloadResult;
86
+ isProviderVisible(moduleContainer: ModuleContainerInterface, token: ProviderToken): boolean;
87
+ isProviderExported(moduleContainer: ModuleContainerInterface, token: ProviderToken): Promise<boolean>;
88
+ /**
89
+ * Records a dependency discovered at runtime by `inject()`. Idempotent;
90
+ * keeps the target's module alive while the source's module is loaded.
91
+ */
92
+ addRuntimeDependency(source: ProviderToken, target: ProviderToken): void;
93
+ /**
94
+ * The container of the module that declares `child` in `@Module({ children })`,
95
+ * including modules of loaded lazy segments.
96
+ */
97
+ findChildDeclaration(child: Type | LazyModule): ModuleContainerInterface | undefined;
98
+ getNode(token: ProviderToken): Node | undefined;
99
+ getEdge(token: ProviderToken): Edge[];
34
100
  getAllNodes(): Node[];
35
101
  getAllEdges(): Edge[][];
36
- nodes: Map<InjectionToken, Node>;
37
- edges: Map<InjectionToken, Edge[]>;
102
+ nodes: Map<ProviderToken, Node>;
103
+ edges: Map<ProviderToken, Edge[]>;
104
+ rootToken: string;
105
+ internalRootTokens: string[];
38
106
  errors: GraphError[];
107
+ /**
108
+ * Changes whenever a compile, segment load or unload may have changed
109
+ * which providers exist or are visible; lets callers cache visibility.
110
+ */
111
+ readonly version: number;
39
112
  }
@@ -1,5 +1,5 @@
1
1
  import type { DynamicModule } from "../dynamic-module.interface";
2
- import type { Module } from "../module-types.interface";
2
+ import type { Type } from "../type.interface";
3
3
  export interface ModuleTokenFactoryInterface {
4
- create(metatype: Module | DynamicModule): Promise<string>;
4
+ create(metatype: Type | DynamicModule): Promise<string>;
5
5
  }
@@ -1,8 +1,9 @@
1
1
  import type { DynamicModule } from "../dynamic-module.interface";
2
- import type { Module } from "../module-types.interface";
2
+ import type { Type } from "../type.interface";
3
3
  import type { ModuleContainerInterface } from "./module-container.interface";
4
4
  export interface ModulesContainerInterface {
5
- addModule(module: Module | DynamicModule): Promise<ModuleContainerInterface>;
6
- replaceModule(moduleToReplace: Module, newModule: Module): Promise<ModuleContainerInterface>;
7
- getModule(module: Module): ModuleContainerInterface | undefined;
5
+ addModule(module: Type | DynamicModule): Promise<ModuleContainerInterface>;
6
+ replaceModule(moduleToReplace: Type, newModule: Type): Promise<ModuleContainerInterface>;
7
+ getModule(module: Type): ModuleContainerInterface | undefined;
8
+ removeModule(token: string): void;
8
9
  }
@@ -0,0 +1,12 @@
1
+ import type { ProviderToken } from "../injection-token.interface";
2
+ import type { Provider } from "../module-types.interface";
3
+ /** What a child container may take from its parent chain. */
4
+ export interface ParentLink {
5
+ canProvide(token: ProviderToken): boolean;
6
+ get<T>(token: ProviderToken<T>): T;
7
+ resolve<T>(token: ProviderToken<T>): Promise<T>;
8
+ }
9
+ export interface CreateChildOptions {
10
+ /** Extra providers appended to the child root module (e.g. per-instance config). */
11
+ providers?: Provider[];
12
+ }
@@ -1,10 +1,53 @@
1
- import type { InjectionToken } from "./injection-token.interface";
2
- import type { GraphError } from "./modules";
1
+ import type { GetOptions, LazyModule } from "@nexus-ioc/shared";
2
+ import type { ModuleRef } from "../core/module-ref";
3
+ import type { DynamicModule } from "./dynamic-module.interface";
4
+ import type { ProviderToken } from "./injection-token.interface";
5
+ import type { CreateChildOptions, GraphError, UnloadResult } from "./modules";
3
6
  import type { ModulePluginInterface } from "./plugins";
7
+ import type { Type } from "./type.interface";
8
+ export interface BootstrapOptions {
9
+ throwOnError?: boolean;
10
+ }
11
+ export type { GetOptions } from "@nexus-ioc/shared";
4
12
  export interface NexusApplicationInterface extends ModulePluginInterface {
5
- bootstrap(): Promise<this>;
6
- get<T>(token: InjectionToken): Promise<T | undefined>;
7
- setParent(parentContainer: NexusApplicationInterface): this;
8
- async(): this;
13
+ bootstrap(options?: BootstrapOptions): Promise<this>;
14
+ close(): Promise<void>;
15
+ /**
16
+ * Returns an already created singleton. `T` is inferred from class and
17
+ * `InjectionToken<T>` tokens; string and symbol tokens give `unknown`
18
+ * unless `<T>` is passed or the expected type supplies it.
19
+ *
20
+ * @param token - The provider token: class, InjectionToken, string or symbol
21
+ */
22
+ get<T>(token: ProviderToken<T>): T;
23
+ get<T>(token: ProviderToken<T>, options: {
24
+ optional: true;
25
+ }): T | undefined;
26
+ get<T>(token: ProviderToken<T>, options: {
27
+ optional?: false;
28
+ }): T;
29
+ get<T>(token: ProviderToken<T>, options: GetOptions): T | undefined;
30
+ /**
31
+ * Resolves a provider, creating it on demand (Transient, lazy
32
+ * mode). `T` is inferred from the token as for `get()`.
33
+ *
34
+ * @param token - The provider token: class, InjectionToken, string or symbol
35
+ */
36
+ resolve<T>(token: ProviderToken<T>): Promise<T>;
37
+ resolve<T>(token: ProviderToken<T>, options: {
38
+ optional: true;
39
+ }): Promise<T | undefined>;
40
+ resolve<T>(token: ProviderToken<T>, options: {
41
+ optional?: false;
42
+ }): Promise<T>;
43
+ resolve<T>(token: ProviderToken<T>, options: GetOptions): Promise<T | undefined>;
44
+ load(lazyModule: LazyModule): Promise<ModuleRef>;
45
+ unload(ref: ModuleRef): Promise<UnloadResult>;
46
+ /**
47
+ * Creates a bootstrapped child application for a module declared in
48
+ * `@Module({ children })` of this application's graph.
49
+ */
50
+ createChild(child: Type | DynamicModule | LazyModule, options?: CreateChildOptions): Promise<NexusApplicationInterface>;
51
+ lazy(): this;
9
52
  errors: GraphError[];
10
53
  }
@@ -0,0 +1,3 @@
1
+ export interface OnModuleDestroy {
2
+ onModuleDestroy(): void | Promise<void>;
3
+ }
@@ -1,5 +1,5 @@
1
1
  import type { ModuleGraphInterface } from "../modules";
2
- export interface ScannerGraphInterface extends Omit<ModuleGraphInterface, "compile" | "nodes" | "edges"> {
2
+ export interface ScannerGraphInterface extends Omit<ModuleGraphInterface, "compile" | "compileSegment" | "unloadSegment" | "nodes" | "edges"> {
3
3
  }
4
4
  export interface ScannerPluginInterface {
5
5
  scan(graph: ScannerGraphInterface): Promise<void>;