awilixify 2.2.1 → 3.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 (119) hide show
  1. package/README.md +15 -6
  2. package/dist/index.d.ts +19 -0
  3. package/dist/index.js +15 -0
  4. package/dist/lib/decorators/decorator-state.d.ts +15 -0
  5. package/dist/lib/decorators/decorator-state.js +72 -0
  6. package/dist/lib/decorators/decorator-state.types.d.ts +35 -0
  7. package/dist/lib/decorators/decorator-state.types.js +1 -0
  8. package/dist/lib/devtools/devtools.types.d.ts +63 -0
  9. package/dist/lib/devtools/devtools.types.js +1 -0
  10. package/dist/lib/devtools/helpers.d.ts +2 -0
  11. package/dist/lib/devtools/helpers.js +18 -0
  12. package/dist/lib/devtools/index.d.ts +4 -0
  13. package/dist/lib/devtools/index.js +3 -0
  14. package/dist/lib/di/common.types.d.ts +6 -0
  15. package/dist/lib/di/common.types.js +1 -0
  16. package/dist/lib/di/contexts/container-context-base.d.ts +63 -0
  17. package/dist/lib/di/contexts/container-context-base.js +232 -0
  18. package/dist/lib/di/contexts/di-context-async.d.ts +14 -0
  19. package/dist/lib/di/contexts/di-context-async.js +118 -0
  20. package/dist/lib/di/contexts/di-context-base.d.ts +19 -0
  21. package/dist/lib/di/contexts/di-context-base.js +33 -0
  22. package/dist/lib/di/contexts/di-context.d.ts +7 -0
  23. package/dist/lib/di/contexts/di-context.js +9 -0
  24. package/dist/lib/di/contexts/module-graph-ensurer.d.ts +32 -0
  25. package/dist/lib/di/contexts/module-graph-ensurer.js +50 -0
  26. package/dist/lib/di/errors.d.ts +69 -0
  27. package/dist/lib/di/errors.js +154 -0
  28. package/dist/lib/di/modules/module-def.types.d.ts +117 -0
  29. package/dist/lib/di/modules/module-def.types.js +1 -0
  30. package/dist/lib/di/modules/module-factories.d.ts +16 -0
  31. package/dist/lib/di/modules/module-factories.js +54 -0
  32. package/dist/lib/di/modules/module-overrides.d.ts +70 -0
  33. package/dist/lib/di/modules/module-overrides.js +3 -0
  34. package/dist/lib/di/modules/module-ref.types.d.ts +13 -0
  35. package/dist/lib/di/modules/module-ref.types.js +1 -0
  36. package/dist/lib/di/modules/module.types.d.ts +178 -0
  37. package/dist/lib/di/modules/module.types.js +1 -0
  38. package/dist/lib/di/modules/runtime-module.types.d.ts +32 -0
  39. package/dist/lib/di/modules/runtime-module.types.js +1 -0
  40. package/dist/lib/di/processors/controller-processor.d.ts +13 -0
  41. package/dist/lib/di/processors/controller-processor.js +76 -0
  42. package/dist/lib/di/processors/handler-processor.d.ts +19 -0
  43. package/dist/lib/di/processors/handler-processor.js +103 -0
  44. package/dist/lib/di/processors/initializer-processor.d.ts +20 -0
  45. package/dist/lib/di/processors/initializer-processor.js +95 -0
  46. package/dist/lib/di/processors/interceptor-processor.d.ts +21 -0
  47. package/dist/lib/di/processors/interceptor-processor.js +117 -0
  48. package/dist/lib/di/processors/keyed-feature-registrar.d.ts +19 -0
  49. package/dist/lib/di/processors/keyed-feature-registrar.js +112 -0
  50. package/dist/lib/di/processors/lifecycle-processor.d.ts +37 -0
  51. package/dist/lib/di/processors/lifecycle-processor.js +175 -0
  52. package/dist/lib/di/processors/overrides-processor.d.ts +24 -0
  53. package/dist/lib/di/processors/overrides-processor.js +69 -0
  54. package/dist/lib/di/providers/provider-dependency-sorter.d.ts +9 -0
  55. package/dist/lib/di/providers/provider-dependency-sorter.js +76 -0
  56. package/dist/lib/di/providers/provider-resolver.d.ts +35 -0
  57. package/dist/lib/di/providers/provider-resolver.js +168 -0
  58. package/dist/lib/di/providers/provider.types.d.ts +1 -0
  59. package/dist/lib/di/providers/provider.types.js +1 -0
  60. package/dist/lib/di/providers/types/controller.types.d.ts +9 -0
  61. package/dist/lib/di/providers/types/controller.types.js +1 -0
  62. package/dist/lib/di/providers/types/decorator-context.types.d.ts +9 -0
  63. package/dist/lib/di/providers/types/decorator-context.types.js +1 -0
  64. package/dist/lib/di/providers/types/handler.types.d.ts +9 -0
  65. package/dist/lib/di/providers/types/handler.types.js +1 -0
  66. package/dist/lib/di/providers/types/index.d.ts +7 -0
  67. package/dist/lib/di/providers/types/index.js +7 -0
  68. package/dist/lib/di/providers/types/initializer.types.d.ts +16 -0
  69. package/dist/lib/di/providers/types/initializer.types.js +3 -0
  70. package/dist/lib/di/providers/types/interceptor.types.d.ts +18 -0
  71. package/dist/lib/di/providers/types/interceptor.types.js +1 -0
  72. package/dist/lib/di/providers/types/middleware.types.d.ts +10 -0
  73. package/dist/lib/di/providers/types/middleware.types.js +1 -0
  74. package/dist/lib/di/providers/types/provider.types.d.ts +26 -0
  75. package/dist/lib/di/providers/types/provider.types.js +1 -0
  76. package/dist/lib/di/request-scope-context.d.ts +5 -0
  77. package/dist/lib/di/request-scope-context.js +28 -0
  78. package/dist/lib/di/type-guards.d.ts +35 -0
  79. package/dist/lib/di/type-guards.js +84 -0
  80. package/dist/lib/http/decorators.d.ts +33 -0
  81. package/dist/lib/http/decorators.js +151 -0
  82. package/dist/lib/http/exceptions.d.ts +58 -0
  83. package/dist/lib/http/exceptions.js +71 -0
  84. package/dist/lib/http/http-verbs.d.ts +12 -0
  85. package/dist/lib/http/http-verbs.js +11 -0
  86. package/dist/lib/http/index.d.ts +3 -0
  87. package/dist/lib/http/index.js +3 -0
  88. package/dist/lib/http/openapi-builder.d.ts +27 -0
  89. package/dist/lib/http/openapi-builder.js +83 -0
  90. package/dist/lib/mediator/contract.types.d.ts +159 -0
  91. package/dist/lib/mediator/contract.types.js +1 -0
  92. package/dist/lib/mediator/errors.d.ts +15 -0
  93. package/dist/lib/mediator/errors.js +33 -0
  94. package/dist/lib/mediator/global-middlewares.types.d.ts +13 -0
  95. package/dist/lib/mediator/global-middlewares.types.js +1 -0
  96. package/dist/lib/mediator/handler.types.d.ts +16 -0
  97. package/dist/lib/mediator/handler.types.js +1 -0
  98. package/dist/lib/mediator/mediator.d.ts +24 -0
  99. package/dist/lib/mediator/mediator.js +134 -0
  100. package/dist/lib/mediator/mediator.types.d.ts +64 -0
  101. package/dist/lib/mediator/mediator.types.js +1 -0
  102. package/dist/lib/mediator/middleware.types.d.ts +41 -0
  103. package/dist/lib/mediator/middleware.types.js +1 -0
  104. package/dist/lib/mediator/result.d.ts +18 -0
  105. package/dist/lib/mediator/result.js +24 -0
  106. package/dist/lib/react/errors.d.ts +12 -0
  107. package/dist/lib/react/errors.js +24 -0
  108. package/dist/lib/react/index.d.ts +4 -0
  109. package/dist/lib/react/index.js +4 -0
  110. package/dist/lib/react/react-component-processor.d.ts +10 -0
  111. package/dist/lib/react/react-component-processor.js +62 -0
  112. package/dist/lib/react/react-di-context.d.ts +16 -0
  113. package/dist/lib/react/react-di-context.js +52 -0
  114. package/dist/lib/react/react-module-factories.d.ts +6 -0
  115. package/dist/lib/react/react-module-factories.js +34 -0
  116. package/dist/lib/react/react-module.types.d.ts +169 -0
  117. package/dist/lib/react/react-module.types.js +1 -0
  118. package/dist/tsconfig.tsbuildinfo +1 -0
  119. package/package.json +33 -3
@@ -0,0 +1,118 @@
1
+ import * as GUARGS from "../type-guards.js";
2
+ import { DIContextBase } from "./di-context-base.js";
3
+ export class AsyncDIContext extends DIContextBase {
4
+ moduleTreePromiseMap = new WeakMap();
5
+ constructor(options) {
6
+ super(options);
7
+ }
8
+ static async create(module, options) {
9
+ return new AsyncDIContext(options ?? {}).bootstrap(module);
10
+ }
11
+ async bootstrap(module) {
12
+ const rootModule = await module;
13
+ await this.initializeGlobalModulesAsync(rootModule);
14
+ const moduleTree = await this.registerModuleWithScopeAsync(rootModule, this.createContainer(rootModule), []);
15
+ this.overridesProcessor.ensureAllModuleOverridesApplied();
16
+ return moduleTree;
17
+ }
18
+ async initializeGlobalModulesAsync(rootModule) {
19
+ const globalModuleImports = (await Promise.all(this.globalModules.map(async (module) => (await this.resolveImportsAsync(module)).map((importedModule) => ({
20
+ module,
21
+ importedModule,
22
+ }))))).flat();
23
+ this.moduleGraphEnsurer.ensureGlobalModulesDoNotImportGlobalModules({
24
+ globalModules: this.globalModules,
25
+ globalModuleImports,
26
+ });
27
+ this.globalModulesWithScope = [];
28
+ this.attachDevtools(rootModule);
29
+ for (const module of this.globalModules) {
30
+ const moduleTree = await this.registerModuleWithScopeAsync(module, this.createContainer(module), []);
31
+ this.globalModulesWithScope.push({
32
+ module,
33
+ moduleScope: moduleTree,
34
+ });
35
+ }
36
+ }
37
+ async registerModuleWithScopeAsync(m, scope, moduleChain) {
38
+ const existingTree = this.moduleTreeMap.get(m);
39
+ if (existingTree) {
40
+ return existingTree;
41
+ }
42
+ const imports = await this.resolveImportsAsync(m);
43
+ const moduleWithOverrides = this.overridesProcessor.applyModuleOverrides(m);
44
+ const moduleId = this.registerModuleInGraph({
45
+ module: moduleWithOverrides,
46
+ scope,
47
+ importedModules: imports,
48
+ });
49
+ this.moduleGraphEnsurer.ensureImportedModulesUniqueness({
50
+ module: moduleWithOverrides,
51
+ resolvedImports: imports,
52
+ globalModules: this.globalModulesWithScope.map((el) => el.module),
53
+ });
54
+ this.moduleGraphEnsurer.ensureNoProviderNameConflicts({
55
+ module: moduleWithOverrides,
56
+ resolvedImports: imports,
57
+ globalModules: this.globalModulesWithScope.map((el) => el.module),
58
+ getExportedProviderKeys: (module) => this.getExportedProviderKeys(module),
59
+ });
60
+ this.markModuleIfImportsUseForwardRef(moduleWithOverrides);
61
+ const isCircular = moduleChain.includes(m);
62
+ if (isCircular) {
63
+ this.moduleGraphEnsurer.ensureCircularDependencyHasForwardRef({
64
+ module: m,
65
+ moduleChain,
66
+ forwardRefModules: this.forwardRefModules,
67
+ });
68
+ return this.createModuleScope(m.name, this.moduleScopeMap.get(m), []);
69
+ }
70
+ const pendingTree = this.moduleTreePromiseMap.get(m);
71
+ if (pendingTree) {
72
+ return pendingTree;
73
+ }
74
+ const moduleTreePromise = this.registerNewModuleWithScopeAsync(m, moduleWithOverrides, moduleId, scope, imports, moduleChain);
75
+ this.moduleTreePromiseMap.set(m, moduleTreePromise);
76
+ return moduleTreePromise;
77
+ }
78
+ async registerNewModuleWithScopeAsync(m, moduleWithOverrides, moduleId, scope, imports, moduleChain) {
79
+ this.moduleScopeMap.set(m, scope);
80
+ const importedModulesWithScope = [
81
+ ...this.globalModulesWithScope,
82
+ ...(await Promise.all(imports.map(async (module) => {
83
+ const moduleTree = await this.registerModuleWithScopeAsync(module, this.createContainer(module), [...moduleChain, m]);
84
+ return {
85
+ module: this.overridesProcessor.getModuleWithOverrides(module),
86
+ moduleScope: moduleTree,
87
+ };
88
+ }))),
89
+ ];
90
+ this.registerExportedProviders(scope, importedModulesWithScope);
91
+ const moduleForSorting = {
92
+ ...moduleWithOverrides,
93
+ imports: importedModulesWithScope.map((el) => el.module),
94
+ };
95
+ this.interceptorProcessor.processInterceptors(moduleWithOverrides, scope, importedModulesWithScope);
96
+ const providers = this.sorter.sortByDependencies(moduleForSorting);
97
+ for (const [key, provider] of Object.entries(providers)) {
98
+ scope.register({
99
+ [key]: await this.providerResolver.resolveProviderAsync({
100
+ key,
101
+ moduleId,
102
+ provider,
103
+ resolutionScope: scope,
104
+ module: moduleWithOverrides,
105
+ }),
106
+ });
107
+ }
108
+ this.lifecycleProcessor.collectEagerProviders(moduleWithOverrides, scope);
109
+ this.afterRegisterProviders(moduleWithOverrides, scope, importedModulesWithScope);
110
+ const moduleTree = this.createModuleScope(m.name, scope, importedModulesWithScope);
111
+ this.moduleTreeMap.set(m, moduleTree);
112
+ this.moduleTreePromiseMap.delete(m);
113
+ return moduleTree;
114
+ }
115
+ async resolveImportsAsync(m) {
116
+ return Promise.all((m.imports || []).map((importItem) => GUARGS.isForwardRef(importItem) ? importItem.resolve() : importItem));
117
+ }
118
+ }
@@ -0,0 +1,19 @@
1
+ import type * as Awilix from "awilix";
2
+ import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
3
+ import { ControllerProcessor } from "../processors/controller-processor.js";
4
+ import { HandlerProcessor } from "../processors/handler-processor.js";
5
+ import { InitializerProcessor } from "../processors/initializer-processor.js";
6
+ import { InterceptorProcessor } from "../processors/interceptor-processor.js";
7
+ import { ContainerContextBase, type ContainerContextOptions, type RegisteredModuleScope } from "./container-context-base.js";
8
+ export interface DiContextOptions extends ContainerContextOptions {
9
+ skipRegisterRoutes?: boolean;
10
+ }
11
+ export declare class DIContextBase extends ContainerContextBase<DiContextOptions> {
12
+ protected readonly controllerProcessor: ControllerProcessor;
13
+ protected readonly handlerProcessor: HandlerProcessor;
14
+ protected readonly interceptorProcessor: InterceptorProcessor;
15
+ protected readonly initializerProcessor: InitializerProcessor;
16
+ protected constructor(options: DiContextOptions);
17
+ protected beforeRegisterProviders(m: M, scope: Awilix.AwilixContainer, importedModulesWithScope: RegisteredModuleScope[]): void;
18
+ protected afterRegisterProviders(m: M, scope: Awilix.AwilixContainer, importedModulesWithScope: RegisteredModuleScope[]): void;
19
+ }
@@ -0,0 +1,33 @@
1
+ import { ControllerProcessor } from "../processors/controller-processor.js";
2
+ import { HandlerProcessor, HandlerType, } from "../processors/handler-processor.js";
3
+ import { InitializerProcessor } from "../processors/initializer-processor.js";
4
+ import { InterceptorProcessor } from "../processors/interceptor-processor.js";
5
+ import { ProviderResolver } from "../providers/provider-resolver.js";
6
+ import { getOrCreateRequestScope, hasRequestScopeContext, resolveFromRequestScope, } from "../request-scope-context.js";
7
+ import { ContainerContextBase, } from "./container-context-base.js";
8
+ export class DIContextBase extends ContainerContextBase {
9
+ controllerProcessor;
10
+ handlerProcessor;
11
+ interceptorProcessor;
12
+ initializerProcessor;
13
+ constructor(options) {
14
+ super(options, {
15
+ hasScopeContext: hasRequestScopeContext,
16
+ resolveFromScope: resolveFromRequestScope,
17
+ });
18
+ this.handlerProcessor = new HandlerProcessor(this.options.providerOptions || {}, this.devtoolsProcessorRef);
19
+ this.interceptorProcessor = new InterceptorProcessor(this.options.providerOptions || {}, this.devtoolsProcessorRef);
20
+ this.initializerProcessor = new InitializerProcessor(this.devtoolsProcessorRef);
21
+ this.controllerProcessor = new ControllerProcessor(this.interceptorProcessor, this.options.providerOptions || {}, this.options.skipRegisterRoutes === true);
22
+ this.providerResolver = new ProviderResolver(this.interceptorProcessor, this.options.providerOptions || {}, this.devtoolsProcessorRef, getOrCreateRequestScope);
23
+ }
24
+ beforeRegisterProviders(m, scope, importedModulesWithScope) {
25
+ this.interceptorProcessor.processInterceptors(m, scope, importedModulesWithScope);
26
+ }
27
+ afterRegisterProviders(m, scope, importedModulesWithScope) {
28
+ this.handlerProcessor.processHandlers(m, scope, importedModulesWithScope, HandlerType.Query);
29
+ this.handlerProcessor.processHandlers(m, scope, importedModulesWithScope, HandlerType.Command);
30
+ const controllers = this.controllerProcessor.processControllers(m, scope);
31
+ this.lifecycleProcessor.addInitializerTask(this.initializerProcessor.collectInitializers(m, scope, importedModulesWithScope, controllers));
32
+ }
33
+ }
@@ -0,0 +1,7 @@
1
+ import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
2
+ import type { DiContextOptions } from "./di-context-base.js";
3
+ import { DIContextBase } from "./di-context-base.js";
4
+ export declare class DIContext extends DIContextBase {
5
+ private constructor();
6
+ static create(module: M, options?: DiContextOptions): import("./container-context-base.js").ModuleScope<import("awilix").AwilixContainer<{}>>;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { DIContextBase } from "./di-context-base.js";
2
+ export class DIContext extends DIContextBase {
3
+ constructor(options) {
4
+ super(options);
5
+ }
6
+ static create(module, options) {
7
+ return new DIContext(options ?? {}).bootstrapModule(module);
8
+ }
9
+ }
@@ -0,0 +1,32 @@
1
+ import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
2
+ type EnsureImportedModulesUniquenessParams = {
3
+ module: M;
4
+ resolvedImports: M[];
5
+ globalModules: M[];
6
+ };
7
+ type EnsureGlobalModulesDoNotImportGlobalModulesParams = {
8
+ globalModules: readonly M[];
9
+ globalModuleImports: readonly {
10
+ module: M;
11
+ importedModule: M;
12
+ }[];
13
+ };
14
+ type EnsureNoProviderNameConflictsParams = {
15
+ module: M;
16
+ resolvedImports: M[];
17
+ globalModules: M[];
18
+ getExportedProviderKeys(module: M): string[];
19
+ };
20
+ type EnsureCircularDependencyHasForwardRefParams = {
21
+ module: M;
22
+ moduleChain: M[];
23
+ forwardRefModules: WeakSet<M>;
24
+ };
25
+ export declare class ModuleGraphEnsurer {
26
+ ensureImportedModulesUniqueness({ module, resolvedImports, globalModules, }: EnsureImportedModulesUniquenessParams): void;
27
+ ensureGlobalModulesDoNotImportGlobalModules({ globalModules, globalModuleImports, }: EnsureGlobalModulesDoNotImportGlobalModulesParams): void;
28
+ ensureNoProviderNameConflicts({ module, resolvedImports, globalModules, getExportedProviderKeys, }: EnsureNoProviderNameConflictsParams): void;
29
+ ensureCircularDependencyHasForwardRef({ module, moduleChain, forwardRefModules, }: EnsureCircularDependencyHasForwardRefParams): void;
30
+ ensureSingleDevtoolsModule(devtoolsModules: M[]): M | undefined;
31
+ }
32
+ export {};
@@ -0,0 +1,50 @@
1
+ import * as ERRORS from "../errors.js";
2
+ export class ModuleGraphEnsurer {
3
+ ensureImportedModulesUniqueness({ module, resolvedImports, globalModules, }) {
4
+ const importedNames = new Set();
5
+ const imports = [...globalModules, ...resolvedImports];
6
+ for (const imported of imports) {
7
+ if (importedNames.has(imported.name)) {
8
+ throw new ERRORS.DuplicateModuleImportError(module.name, imported.name);
9
+ }
10
+ importedNames.add(imported.name);
11
+ }
12
+ }
13
+ ensureGlobalModulesDoNotImportGlobalModules({ globalModules, globalModuleImports, }) {
14
+ const globalModuleNames = new Set();
15
+ for (const globalModule of globalModules) {
16
+ if (globalModuleNames.has(globalModule.name)) {
17
+ throw new ERRORS.DuplicateModuleImportError("globalModules", globalModule.name);
18
+ }
19
+ globalModuleNames.add(globalModule.name);
20
+ }
21
+ for (const { module, importedModule } of globalModuleImports) {
22
+ if (globalModuleNames.has(importedModule.name)) {
23
+ throw new ERRORS.GlobalModuleImportsGlobalModuleError(module.name, importedModule.name);
24
+ }
25
+ }
26
+ }
27
+ ensureNoProviderNameConflicts({ module, resolvedImports, globalModules, getExportedProviderKeys, }) {
28
+ const moduleProviderKeys = Object.keys(module.providers || {});
29
+ const importConflicts = [
30
+ ...globalModules.flatMap((globalModule) => getExportedProviderKeys(globalModule)),
31
+ ...resolvedImports.flatMap((importItem) => getExportedProviderKeys(importItem)),
32
+ ].filter((key) => moduleProviderKeys.includes(key));
33
+ if (importConflicts.length > 0) {
34
+ throw new ERRORS.ProviderNameConflictError(module.name, importConflicts);
35
+ }
36
+ }
37
+ ensureCircularDependencyHasForwardRef({ module, moduleChain, forwardRefModules, }) {
38
+ const hasForwardRefInCycle = forwardRefModules.has(module) ||
39
+ moduleChain.some((chainModule) => forwardRefModules.has(chainModule));
40
+ if (hasForwardRefInCycle)
41
+ return;
42
+ const chainNames = moduleChain.map((chainModule) => chainModule.name);
43
+ throw new ERRORS.CircularModuleDependencyError(module.name, chainNames);
44
+ }
45
+ ensureSingleDevtoolsModule(devtoolsModules) {
46
+ if (devtoolsModules.length <= 1)
47
+ return devtoolsModules[0];
48
+ throw new ERRORS.DuplicateDevtoolsModuleError(devtoolsModules.map((module) => module.name));
49
+ }
50
+ }
@@ -0,0 +1,69 @@
1
+ export declare class DuplicateControllersInModuleError extends Error {
2
+ constructor(moduleName: string);
3
+ }
4
+ export declare class ControllerAlreadyRegisteredError extends Error {
5
+ constructor(controllerName: string, moduleName: string);
6
+ }
7
+ export declare class DependencyNotFoundError extends Error {
8
+ constructor(dependencyKey: string, moduleName: string);
9
+ }
10
+ export declare class CircularDependencyError extends Error {
11
+ constructor(moduleName: string, providerKeys: string[]);
12
+ }
13
+ export declare class DuplicateModuleImportError extends Error {
14
+ constructor(parentModuleName: string, importedModuleName: string);
15
+ }
16
+ export declare class DuplicateDevtoolsModuleError extends Error {
17
+ constructor(moduleNames: string[]);
18
+ }
19
+ export declare class ProviderNameConflictError extends Error {
20
+ constructor(moduleName: string, conflictingKeys: string[]);
21
+ }
22
+ export declare class ModuleFeatureOverrideNotFoundError extends Error {
23
+ constructor(moduleName: string, featureKind: string, featureKey: string);
24
+ }
25
+ export declare class ModuleOverrideTargetNotFoundError extends Error {
26
+ constructor(moduleName: string);
27
+ }
28
+ export declare class CircularModuleDependencyError extends Error {
29
+ constructor(moduleName: string, chain: string[]);
30
+ }
31
+ export declare class GlobalModuleImportsGlobalModuleError extends Error {
32
+ constructor(moduleName: string, importedGlobalModuleName: string);
33
+ }
34
+ export declare class HandlerMissingStaticKeyError extends Error {
35
+ constructor(handlerName: string);
36
+ }
37
+ export declare class FeatureNameConflictError extends Error {
38
+ constructor(moduleName: string, featureName: string, featureKey: string, existingModuleName: string);
39
+ }
40
+ export declare class InvalidProviderDefinitionError extends Error {
41
+ constructor(moduleName: string, providerKey: string);
42
+ }
43
+ export declare class AsyncFactoryRequiresAsyncCreateError extends Error {
44
+ constructor(moduleName: string, providerKey: string);
45
+ }
46
+ export declare class AsyncEagerFactoryRequiresInitError extends Error {
47
+ constructor(moduleName: string, providerKey: string);
48
+ }
49
+ export declare class AsyncFactoryRequiresSingletonLifetimeError extends Error {
50
+ constructor(moduleName: string, providerKey: string);
51
+ }
52
+ export declare class EagerProviderRequiresSingletonLifetimeError extends Error {
53
+ constructor(moduleName: string, providerKey: string);
54
+ }
55
+ export declare class EagerProviderInitDependencyNotFoundError extends Error {
56
+ constructor(moduleName: string, providerKey: string, dependencyKey: string);
57
+ }
58
+ export declare class CircularProviderInitDependencyError extends Error {
59
+ constructor(providerKeys: string[]);
60
+ }
61
+ export declare class AsyncModuleRequiresAsyncCreateError extends Error {
62
+ constructor(moduleName: string);
63
+ }
64
+ export declare class DuplicateInitializerTokenError extends Error {
65
+ constructor(moduleName: string, initializerName: string, existingModuleName: string);
66
+ }
67
+ export declare class MultipleInvokeInitializersPerMethodError extends Error {
68
+ constructor(moduleName: string, controllerName: string, methodName: string, initializerNames: string[]);
69
+ }
@@ -0,0 +1,154 @@
1
+ export class DuplicateControllersInModuleError extends Error {
2
+ constructor(moduleName) {
3
+ super(`Module "${moduleName}" has duplicate controllers in its controllers array.`);
4
+ this.name = "DuplicateControllersInModuleError";
5
+ }
6
+ }
7
+ export class ControllerAlreadyRegisteredError extends Error {
8
+ constructor(controllerName, moduleName) {
9
+ super(`Controller "${controllerName}" is already registered in module "${moduleName}". ` +
10
+ `Controllers must be unique across modules. ` +
11
+ `Exclude controllers from one of the module instances.`);
12
+ this.name = "ControllerAlreadyRegisteredError";
13
+ }
14
+ }
15
+ export class DependencyNotFoundError extends Error {
16
+ constructor(dependencyKey, moduleName) {
17
+ super(`"${dependencyKey}" does not exist in scope of ${moduleName} module`);
18
+ this.name = "DependencyNotFoundError";
19
+ }
20
+ }
21
+ export class CircularDependencyError extends Error {
22
+ constructor(moduleName, providerKeys) {
23
+ super(`Circular dependency detected in module "${moduleName}" for providers: ${providerKeys.join(", ")}`);
24
+ this.name = "CircularDependencyError";
25
+ }
26
+ }
27
+ export class DuplicateModuleImportError extends Error {
28
+ constructor(parentModuleName, importedModuleName) {
29
+ super(`Module "${parentModuleName}" has duplicate import of "${importedModuleName}"`);
30
+ this.name = "DuplicateModuleImportError";
31
+ }
32
+ }
33
+ export class DuplicateDevtoolsModuleError extends Error {
34
+ constructor(moduleNames) {
35
+ super(`Only one devtools module can be registered. Found: ${moduleNames.join(", ")}`);
36
+ this.name = "DuplicateDevtoolsModuleError";
37
+ }
38
+ }
39
+ export class ProviderNameConflictError extends Error {
40
+ constructor(moduleName, conflictingKeys) {
41
+ super(`Module "${moduleName}" has provider name conflicts with imported modules: ${conflictingKeys.join(", ")}`);
42
+ this.name = "ProviderNameConflictError";
43
+ }
44
+ }
45
+ export class ModuleFeatureOverrideNotFoundError extends Error {
46
+ constructor(moduleName, featureKind, featureKey) {
47
+ super(`Cannot override ${featureKind} "${featureKey}" in module "${moduleName}" because it is not declared by that module.`);
48
+ this.name = "ModuleFeatureOverrideNotFoundError";
49
+ }
50
+ }
51
+ export class ModuleOverrideTargetNotFoundError extends Error {
52
+ constructor(moduleName) {
53
+ super(`Module override target "${moduleName}" was not found in the bootstrapped module graph.`);
54
+ this.name = "ModuleOverrideTargetNotFoundError";
55
+ }
56
+ }
57
+ export class CircularModuleDependencyError extends Error {
58
+ constructor(moduleName, chain) {
59
+ super(`Circular module dependency detected: ${chain.join(" -> ")} -> ${moduleName}`);
60
+ this.name = "CircularModuleDependencyError";
61
+ }
62
+ }
63
+ export class GlobalModuleImportsGlobalModuleError extends Error {
64
+ constructor(moduleName, importedGlobalModuleName) {
65
+ super(`Global module "${moduleName}" cannot import global module "${importedGlobalModuleName}". ` +
66
+ `Register both modules in DIContext.globalModules without importing one from another.`);
67
+ this.name = "GlobalModuleImportsGlobalModuleError";
68
+ }
69
+ }
70
+ export class HandlerMissingStaticKeyError extends Error {
71
+ constructor(handlerName) {
72
+ super(`Handler class "${handlerName}" must have a static "key" property of type string. ` +
73
+ `Example: static readonly key = "my-handler" as const;`);
74
+ this.name = "HandlerMissingStaticKeyError";
75
+ }
76
+ }
77
+ export class FeatureNameConflictError extends Error {
78
+ constructor(moduleName, featureName, featureKey, existingModuleName) {
79
+ super(`Module "${moduleName}" has a ${featureName} named "${featureKey}" ` +
80
+ `that conflicts with a ${featureName} already registered from module "${existingModuleName}". ` +
81
+ `${featureName} names must be unique within a module scope.`);
82
+ this.name = "FeatureNameConflictError";
83
+ }
84
+ }
85
+ export class InvalidProviderDefinitionError extends Error {
86
+ constructor(moduleName, providerKey) {
87
+ super(`Module "${moduleName}" has invalid provider definition for key "${providerKey}". ` +
88
+ `Provider value is undefined or unsupported.`);
89
+ this.name = "InvalidProviderDefinitionError";
90
+ }
91
+ }
92
+ export class AsyncFactoryRequiresAsyncCreateError extends Error {
93
+ constructor(moduleName, providerKey) {
94
+ super(`Provider "${providerKey}" in module "${moduleName}" uses async useFactory. ` +
95
+ `Use AsyncDIContext to bootstrap modules with async factory providers.`);
96
+ this.name = "AsyncFactoryRequiresAsyncCreateError";
97
+ }
98
+ }
99
+ export class AsyncEagerFactoryRequiresInitError extends Error {
100
+ constructor(moduleName, providerKey) {
101
+ super(`Provider "${providerKey}" in module "${moduleName}" uses async useFactory with eager initialization. ` +
102
+ `Call app.init() before resolving this provider.`);
103
+ this.name = "AsyncEagerFactoryRequiresInitError";
104
+ }
105
+ }
106
+ export class AsyncFactoryRequiresSingletonLifetimeError extends Error {
107
+ constructor(moduleName, providerKey) {
108
+ super(`Provider "${providerKey}" in module "${moduleName}" uses async useFactory with a non-singleton lifetime. ` +
109
+ `Async factory providers are resolved during AsyncDIContext bootstrap, so they must use SINGLETON lifetime.`);
110
+ this.name = "AsyncFactoryRequiresSingletonLifetimeError";
111
+ }
112
+ }
113
+ export class EagerProviderRequiresSingletonLifetimeError extends Error {
114
+ constructor(moduleName, providerKey) {
115
+ super(`Provider "${providerKey}" in module "${moduleName}" uses eager initialization with a non-singleton lifetime. ` +
116
+ `Eager providers must use SINGLETON lifetime.`);
117
+ this.name = "EagerProviderRequiresSingletonLifetimeError";
118
+ }
119
+ }
120
+ export class EagerProviderInitDependencyNotFoundError extends Error {
121
+ constructor(moduleName, providerKey, dependencyKey) {
122
+ super(`Provider "${providerKey}" in module "${moduleName}" declares initAfter dependency "${dependencyKey}", ` +
123
+ `but that dependency is not an eager provider in the current application lifecycle.`);
124
+ this.name = "EagerProviderInitDependencyNotFoundError";
125
+ }
126
+ }
127
+ export class CircularProviderInitDependencyError extends Error {
128
+ constructor(providerKeys) {
129
+ super(`Circular eager provider init dependency detected: ${providerKeys.join(", ")}`);
130
+ this.name = "CircularProviderInitDependencyError";
131
+ }
132
+ }
133
+ export class AsyncModuleRequiresAsyncCreateError extends Error {
134
+ constructor(moduleName) {
135
+ super(`Module "${moduleName}" imports an async module. ` +
136
+ `Use AsyncDIContext to bootstrap modules with async imports.`);
137
+ this.name = "AsyncModuleRequiresAsyncCreateError";
138
+ }
139
+ }
140
+ export class DuplicateInitializerTokenError extends Error {
141
+ constructor(moduleName, initializerName, existingModuleName) {
142
+ super(`Initializer "${initializerName}" from module "${moduleName}" has a token conflict with an initializer already registered from module "${existingModuleName}". ` +
143
+ `Initializer tokens must be unique within a module scope.`);
144
+ this.name = "DuplicateInitializerTokenError";
145
+ }
146
+ }
147
+ export class MultipleInvokeInitializersPerMethodError extends Error {
148
+ constructor(moduleName, controllerName, methodName, initializerNames) {
149
+ super(`Controller method "${controllerName}.${methodName}" in module "${moduleName}" has multiple initializers that receive invoke: ${initializerNames.join(", ")}. ` +
150
+ `Only one invoke-enabled initializer is allowed per method. ` +
151
+ `Metadata-only initializers should set usesInvoke = false.`);
152
+ this.name = "MultipleInvokeInitializersPerMethodError";
153
+ }
154
+ }
@@ -0,0 +1,117 @@
1
+ import type { Mediator } from "../../mediator/mediator.js";
2
+ import type { EmptyObject } from "../common.types.js";
3
+ import type { ClassHandler, DefInitializerMap, DefInterceptorMap, DefPreHandlerMap, DefProviderMap } from "../providers/provider.types.js";
4
+ import type { ImportModule, ModuleDefinition, ModuleImport } from "./module.types.js";
5
+ export interface GlobalDependencies {
6
+ }
7
+ export type NormalizeGlobalDependencies<T> = [keyof T] extends [never] ? EmptyObject : T extends object ? T : EmptyObject;
8
+ export type InferGlobalDependencies<TModuleDef> = TModuleDef extends {
9
+ exports: infer TExports;
10
+ } ? NormalizeGlobalDependencies<TExports> : EmptyObject;
11
+ type HasDuplicates<T extends readonly unknown[]> = number extends T["length"] ? false : T extends readonly [infer Head, ...infer Tail] ? Head extends Tail[number] ? true : HasDuplicates<Tail> : false;
12
+ type KeysOf<T> = Extract<keyof T, string>;
13
+ type ValidExportKeys<TMap, TKeys> = [TMap] extends [Record<string, unknown>] ? TKeys extends readonly KeysOf<TMap>[] ? HasDuplicates<TKeys> extends true ? never : TKeys : readonly KeysOf<TMap>[] : never;
14
+ export type ModuleDef<D extends {
15
+ providers?: DefProviderMap;
16
+ interceptors?: DefInterceptorMap;
17
+ initializers?: DefInitializerMap;
18
+ imports?: readonly ModuleImport[];
19
+ queryHandlers?: readonly any[];
20
+ commandHandlers?: readonly any[];
21
+ queryPreHandlers?: DefPreHandlerMap;
22
+ commandPreHandlers?: DefPreHandlerMap;
23
+ exportKeys?: ValidExportKeys<D["providers"], D["exportKeys"]>;
24
+ exportQueryPreHandlerKeys?: ValidExportKeys<D["queryPreHandlers"], D["exportQueryPreHandlerKeys"]>;
25
+ exportCommandPreHandlerKeys?: ValidExportKeys<D["commandPreHandlers"], D["exportCommandPreHandlerKeys"]>;
26
+ exportInterceptorKeys?: ValidExportKeys<D["interceptors"], D["exportInterceptorKeys"]>;
27
+ exportInitializerKeys?: ValidExportKeys<D["initializers"], D["exportInitializerKeys"]>;
28
+ }> = {
29
+ providers: ExtractProviders<D["providers"]>;
30
+ exports: ExtractExports<ExtractProviders<D["providers"]>, D["exportKeys"]>;
31
+ queryPreHandlerExports: ExtractPreHandlerExports<ExtractPreHandlers<D["queryPreHandlers"]>, D["exportQueryPreHandlerKeys"]>;
32
+ commandPreHandlerExports: ExtractPreHandlerExports<ExtractPreHandlers<D["commandPreHandlers"]>, D["exportCommandPreHandlerKeys"]>;
33
+ interceptors: ExtractInterceptors<D["interceptors"]>;
34
+ imports: ExtractImports<D["imports"]>;
35
+ deps: ExtractDeps<D>;
36
+ queryHandlers: ExtractHandlers<D["queryHandlers"]>;
37
+ commandHandlers: ExtractHandlers<D["commandHandlers"]>;
38
+ queryPreHandlers: ExtractPreHandlers<D["queryPreHandlers"]>;
39
+ commandPreHandlers: ExtractPreHandlers<D["commandPreHandlers"]>;
40
+ initializers: ExtractInitializers<D["initializers"]>;
41
+ exportKeys: ExtractExportKeys<ExtractProviders<D["providers"]>, D["exportKeys"]>;
42
+ queryPreHandlerExportKeys: ExtractPreHandlerExportKeys<ExtractPreHandlers<D["queryPreHandlers"]>, D["exportQueryPreHandlerKeys"]>;
43
+ commandPreHandlerExportKeys: ExtractPreHandlerExportKeys<ExtractPreHandlers<D["commandPreHandlers"]>, D["exportCommandPreHandlerKeys"]>;
44
+ interceptorExportKeys: ExtractInterceptorExportKeys<ExtractInterceptors<D["interceptors"]>, D["exportInterceptorKeys"]>;
45
+ initializerExportKeys: ExtractInitializerExportKeys<ExtractInitializers<D["initializers"]>, D["exportInitializerKeys"]>;
46
+ };
47
+ type ExtractProviders<TProviders> = TProviders extends DefProviderMap ? TProviders : EmptyObject;
48
+ type ExtractPreHandlerExports<TMap, TKeys> = TMap extends DefPreHandlerMap ? TKeys extends readonly (keyof TMap)[] ? Pick<TMap, TKeys[number]> : EmptyObject : EmptyObject;
49
+ type ExtractPreHandlerExportKeys<TMap, TKeys> = TMap extends DefPreHandlerMap ? TKeys extends readonly (keyof TMap)[] ? TKeys : readonly [] : readonly [];
50
+ type ExtractExports<TProviders, TKeys> = TProviders extends DefProviderMap ? TKeys extends readonly (keyof TProviders)[] ? Pick<TProviders, TKeys[number]> : EmptyObject : EmptyObject;
51
+ type ExtractExportKeys<TProviders, TKeys> = TProviders extends DefProviderMap ? TKeys extends readonly (keyof TProviders)[] ? TKeys : readonly [] : readonly [];
52
+ type ExtractImports<TImports> = TImports extends readonly ModuleImport[] ? TImports : [];
53
+ type ExtractHandlers<THandlers> = THandlers extends readonly any[] ? THandlers : [];
54
+ type ExtractPreHandlers<TPreHandlers> = TPreHandlers extends DefPreHandlerMap ? TPreHandlers : EmptyObject;
55
+ type ExtractInterceptors<TInterceptors> = TInterceptors extends DefInterceptorMap ? TInterceptors : EmptyObject;
56
+ type ExtractInterceptorExportKeys<TInterceptors, TKeys> = TInterceptors extends DefInterceptorMap ? TKeys extends readonly (keyof TInterceptors)[] ? TKeys : readonly [] : readonly [];
57
+ type ExtractInitializers<TInitializers> = TInitializers extends DefInitializerMap ? TInitializers : EmptyObject;
58
+ type ExtractInitializerExportKeys<TInitializers, TKeys> = TInitializers extends DefInitializerMap ? TKeys extends readonly (keyof TInitializers)[] ? TKeys : readonly [] : readonly [];
59
+ type ExtractDeps<D extends {
60
+ providers?: DefProviderMap;
61
+ imports?: readonly ModuleImport[];
62
+ queryHandlers?: readonly any[];
63
+ commandHandlers?: readonly any[];
64
+ }> = ExtractProviders<D["providers"]> & ExtractImportsExports<D> & ExtractQueryMediator<D> & ExtractCommandMediator<D> & NormalizeGlobalDependencies<GlobalDependencies>;
65
+ type ExtractImportsExports<D extends {
66
+ imports?: readonly ModuleImport[];
67
+ }> = D["imports"] extends readonly ModuleImport[] ? ExtractExportsFromImports<D["imports"]> : EmptyObject;
68
+ type ExtractModuleDefFromModule<T> = Awaited<T> extends ImportModule<infer TDef extends ModuleDefinition> ? TDef : Awaited<T> extends {
69
+ exports: infer E;
70
+ } ? {
71
+ exports: E;
72
+ } : never;
73
+ type ExtractExportsFromImports<T extends readonly ModuleImport[]> = T extends readonly [
74
+ infer First,
75
+ ...infer Rest extends readonly ModuleImport[]
76
+ ] ? ExtractModuleDefFromModule<First> extends {
77
+ exports: infer E;
78
+ } ? E & ExtractExportsFromImports<Rest> : ExtractExportsFromImports<Rest> : EmptyObject;
79
+ type MediatorHandlerKey = "queryHandlers" | "commandHandlers";
80
+ type MediatorPreHandlerKey = "queryPreHandlers" | "commandPreHandlers";
81
+ type MediatorKindMap = {
82
+ query: {
83
+ handlerKey: "queryHandlers";
84
+ preHandlerKey: "queryPreHandlers";
85
+ preHandlerExportsKey: "queryPreHandlerExports";
86
+ mediatorKey: "queryMediator";
87
+ };
88
+ command: {
89
+ handlerKey: "commandHandlers";
90
+ preHandlerKey: "commandPreHandlers";
91
+ preHandlerExportsKey: "commandPreHandlerExports";
92
+ mediatorKey: "commandMediator";
93
+ };
94
+ };
95
+ type ExtractQueryMediator<D extends {
96
+ queryHandlers?: readonly any[];
97
+ queryPreHandlers?: DefPreHandlerMap;
98
+ imports?: readonly ModuleImport[];
99
+ }> = ExtractMediator<"query", D>;
100
+ type ExtractCommandMediator<D extends {
101
+ commandHandlers?: readonly any[];
102
+ commandPreHandlers?: DefPreHandlerMap;
103
+ imports?: readonly ModuleImport[];
104
+ }> = ExtractMediator<"command", D>;
105
+ type ExtractMediator<TKind extends keyof MediatorKindMap, D extends Partial<Record<MediatorHandlerKey, readonly any[]>> & Partial<Record<MediatorPreHandlerKey, DefPreHandlerMap>> & {
106
+ imports?: readonly ModuleImport[];
107
+ }> = D[MediatorKindMap[TKind]["handlerKey"]] extends readonly [any, ...any[]] ? {
108
+ [K in MediatorKindMap[TKind]["mediatorKey"]]: Mediator<ExtractContractsFromHandlers<D[MediatorKindMap[TKind]["handlerKey"]]>>;
109
+ } : EmptyObject;
110
+ type ExtractContractsFromHandlers<Handlers extends readonly any[]> = Handlers extends readonly [infer First, ...infer Rest] ? ExtractContractFromHandler<First> | ExtractContractsFromHandlers<Rest> : never;
111
+ type UnwrapClassHandler<H> = H extends ClassHandler ? H["useClass"] : H;
112
+ type ExtractContractFromHandler<H> = UnwrapClassHandler<H> extends new (...args: any[]) => infer I ? I extends {
113
+ contract: infer C;
114
+ } ? C : never : UnwrapClassHandler<H> extends {
115
+ contract: infer C;
116
+ } ? C : never;
117
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { FactoryProvider } from "../providers/provider.types.js";
2
+ import type { AnyModule, Module, ModuleDefinition } from "./module.types.js";
3
+ import type { GlobalDependencies, NormalizeGlobalDependencies } from "./module-def.types.js";
4
+ import type { ForwardRef } from "./module-ref.types.js";
5
+ export type ModuleOptions = {
6
+ hashNameFrom?: unknown;
7
+ hashLength?: number;
8
+ registerControllers?: boolean;
9
+ };
10
+ export declare function forwardRef<T extends AnyModule>(getter: () => T | Promise<T>): ForwardRef<T>;
11
+ type FactoryDeps<T> = (T extends {
12
+ deps: infer Deps;
13
+ } ? Deps : T) & NormalizeGlobalDependencies<GlobalDependencies>;
14
+ export declare function createFactoryProvider<TDeps extends Record<string, any>>(): <T extends object, const Keys extends readonly Extract<keyof FactoryDeps<TDeps>, string>[]>(provider: FactoryProvider<T, FactoryDeps<TDeps>, Keys>) => FactoryProvider<T, FactoryDeps<TDeps>, Keys>;
15
+ export declare function createModule<TDef extends ModuleDefinition>(module: Module<TDef>, options?: ModuleOptions): Module<TDef>;
16
+ export {};