awilixify 2.2.1 → 3.0.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.
- package/README.md +12 -6
- package/dist/index.d.ts +18 -0
- package/dist/index.js +15 -0
- package/dist/lib/decorators/decorator-state.d.ts +15 -0
- package/dist/lib/decorators/decorator-state.js +72 -0
- package/dist/lib/decorators/decorator-state.types.d.ts +35 -0
- package/dist/lib/decorators/decorator-state.types.js +1 -0
- package/dist/lib/di/common.types.d.ts +6 -0
- package/dist/lib/di/common.types.js +1 -0
- package/dist/lib/di/contexts/container-context-base.d.ts +53 -0
- package/dist/lib/di/contexts/container-context-base.js +194 -0
- package/dist/lib/di/contexts/context-overrides.d.ts +22 -0
- package/dist/lib/di/contexts/context-overrides.js +93 -0
- package/dist/lib/di/contexts/di-context-async.d.ts +14 -0
- package/dist/lib/di/contexts/di-context-async.js +112 -0
- package/dist/lib/di/contexts/di-context-base.d.ts +19 -0
- package/dist/lib/di/contexts/di-context-base.js +32 -0
- package/dist/lib/di/contexts/di-context.d.ts +7 -0
- package/dist/lib/di/contexts/di-context.js +9 -0
- package/dist/lib/di/contexts/module-graph-ensurer.d.ts +31 -0
- package/dist/lib/di/contexts/module-graph-ensurer.js +45 -0
- package/dist/lib/di/contexts/module-overrides.d.ts +70 -0
- package/dist/lib/di/contexts/module-overrides.js +3 -0
- package/dist/lib/di/contexts/override-value.types.d.ts +6 -0
- package/dist/lib/di/contexts/override-value.types.js +1 -0
- package/dist/lib/di/contexts/overrides-processor.d.ts +22 -0
- package/dist/lib/di/contexts/overrides-processor.js +93 -0
- package/dist/lib/di/contexts/provider-overrides.types.d.ts +19 -0
- package/dist/lib/di/contexts/provider-overrides.types.js +1 -0
- package/dist/lib/di/errors.d.ts +66 -0
- package/dist/lib/di/errors.js +148 -0
- package/dist/lib/di/modules/module-def.types.d.ts +117 -0
- package/dist/lib/di/modules/module-def.types.js +1 -0
- package/dist/lib/di/modules/module-factories.d.ts +16 -0
- package/dist/lib/di/modules/module-factories.js +46 -0
- package/dist/lib/di/modules/module-overrides.d.ts +70 -0
- package/dist/lib/di/modules/module-overrides.js +3 -0
- package/dist/lib/di/modules/module-ref.types.d.ts +13 -0
- package/dist/lib/di/modules/module-ref.types.js +1 -0
- package/dist/lib/di/modules/module.types.d.ts +178 -0
- package/dist/lib/di/modules/module.types.js +1 -0
- package/dist/lib/di/modules/provider-overrides.types.d.ts +19 -0
- package/dist/lib/di/modules/provider-overrides.types.js +1 -0
- package/dist/lib/di/modules/runtime-module.types.d.ts +25 -0
- package/dist/lib/di/modules/runtime-module.types.js +1 -0
- package/dist/lib/di/processors/controller-processor.d.ts +13 -0
- package/dist/lib/di/processors/controller-processor.js +76 -0
- package/dist/lib/di/processors/handler-processor.d.ts +15 -0
- package/dist/lib/di/processors/handler-processor.js +69 -0
- package/dist/lib/di/processors/initializer-processor.d.ts +19 -0
- package/dist/lib/di/processors/initializer-processor.js +91 -0
- package/dist/lib/di/processors/interceptor-processor.d.ts +18 -0
- package/dist/lib/di/processors/interceptor-processor.js +101 -0
- package/dist/lib/di/processors/keyed-feature-registrar.d.ts +19 -0
- package/dist/lib/di/processors/keyed-feature-registrar.js +112 -0
- package/dist/lib/di/processors/lifecycle-processor.d.ts +38 -0
- package/dist/lib/di/processors/lifecycle-processor.js +178 -0
- package/dist/lib/di/processors/overrides-processor.d.ts +24 -0
- package/dist/lib/di/processors/overrides-processor.js +69 -0
- package/dist/lib/di/providers/basic-provider-resolver.d.ts +35 -0
- package/dist/lib/di/providers/basic-provider-resolver.js +88 -0
- package/dist/lib/di/providers/provider-dependency-sorter.d.ts +9 -0
- package/dist/lib/di/providers/provider-dependency-sorter.js +76 -0
- package/dist/lib/di/providers/provider-resolver.d.ts +31 -0
- package/dist/lib/di/providers/provider-resolver.js +128 -0
- package/dist/lib/di/providers/provider.types.d.ts +1 -0
- package/dist/lib/di/providers/provider.types.js +1 -0
- package/dist/lib/di/providers/types/controller.types.d.ts +9 -0
- package/dist/lib/di/providers/types/controller.types.js +1 -0
- package/dist/lib/di/providers/types/decorator-context.types.d.ts +9 -0
- package/dist/lib/di/providers/types/decorator-context.types.js +1 -0
- package/dist/lib/di/providers/types/handler.types.d.ts +9 -0
- package/dist/lib/di/providers/types/handler.types.js +1 -0
- package/dist/lib/di/providers/types/index.d.ts +7 -0
- package/dist/lib/di/providers/types/index.js +7 -0
- package/dist/lib/di/providers/types/initializer.types.d.ts +16 -0
- package/dist/lib/di/providers/types/initializer.types.js +3 -0
- package/dist/lib/di/providers/types/interceptor.types.d.ts +18 -0
- package/dist/lib/di/providers/types/interceptor.types.js +1 -0
- package/dist/lib/di/providers/types/middleware.types.d.ts +10 -0
- package/dist/lib/di/providers/types/middleware.types.js +1 -0
- package/dist/lib/di/providers/types/provider.types.d.ts +26 -0
- package/dist/lib/di/providers/types/provider.types.js +1 -0
- package/dist/lib/di/request-scope-context.d.ts +5 -0
- package/dist/lib/di/request-scope-context.js +28 -0
- package/dist/lib/di/type-guards.d.ts +35 -0
- package/dist/lib/di/type-guards.js +84 -0
- package/dist/lib/http/decorators.d.ts +33 -0
- package/dist/lib/http/decorators.js +151 -0
- package/dist/lib/http/exceptions.d.ts +58 -0
- package/dist/lib/http/exceptions.js +71 -0
- package/dist/lib/http/http-verbs.d.ts +12 -0
- package/dist/lib/http/http-verbs.js +11 -0
- package/dist/lib/http/index.d.ts +3 -0
- package/dist/lib/http/index.js +3 -0
- package/dist/lib/http/openapi-builder.d.ts +27 -0
- package/dist/lib/http/openapi-builder.js +83 -0
- package/dist/lib/mediator/contract.types.d.ts +159 -0
- package/dist/lib/mediator/contract.types.js +1 -0
- package/dist/lib/mediator/errors.d.ts +15 -0
- package/dist/lib/mediator/errors.js +33 -0
- package/dist/lib/mediator/global-middlewares.types.d.ts +13 -0
- package/dist/lib/mediator/global-middlewares.types.js +1 -0
- package/dist/lib/mediator/handler.types.d.ts +16 -0
- package/dist/lib/mediator/handler.types.js +1 -0
- package/dist/lib/mediator/mediator.d.ts +21 -0
- package/dist/lib/mediator/mediator.js +123 -0
- package/dist/lib/mediator/mediator.types.d.ts +64 -0
- package/dist/lib/mediator/mediator.types.js +1 -0
- package/dist/lib/mediator/middleware.types.d.ts +41 -0
- package/dist/lib/mediator/middleware.types.js +1 -0
- package/dist/lib/mediator/result.d.ts +18 -0
- package/dist/lib/mediator/result.js +24 -0
- package/dist/lib/react/errors.d.ts +12 -0
- package/dist/lib/react/errors.js +24 -0
- package/dist/lib/react/react-component-processor.d.ts +10 -0
- package/dist/lib/react/react-component-processor.js +62 -0
- package/dist/lib/react/react-di-context.d.ts +21 -0
- package/dist/lib/react/react-di-context.js +55 -0
- package/dist/lib/react/react-module-factories.d.ts +6 -0
- package/dist/lib/react/react-module-factories.js +34 -0
- package/dist/lib/react/react-module.types.d.ts +183 -0
- package/dist/lib/react/react-module.types.js +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.js +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +29 -3
|
@@ -0,0 +1,112 @@
|
|
|
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();
|
|
14
|
+
const moduleTree = await this.registerModuleWithScopeAsync(rootModule, this.createContainer(rootModule), []);
|
|
15
|
+
this.overridesProcessor.ensureAllModuleOverridesApplied();
|
|
16
|
+
return moduleTree;
|
|
17
|
+
}
|
|
18
|
+
async initializeGlobalModulesAsync() {
|
|
19
|
+
const globalModules = this.options.globalModules || [];
|
|
20
|
+
const globalModuleImports = (await Promise.all(globalModules.map(async (module) => (await this.resolveImportsAsync(module)).map((importedModule) => ({
|
|
21
|
+
module,
|
|
22
|
+
importedModule,
|
|
23
|
+
}))))).flat();
|
|
24
|
+
this.moduleGraphEnsurer.ensureGlobalModulesDoNotImportGlobalModules({
|
|
25
|
+
globalModules,
|
|
26
|
+
globalModuleImports,
|
|
27
|
+
});
|
|
28
|
+
this.globalModulesWithScope = [];
|
|
29
|
+
for (const module of globalModules) {
|
|
30
|
+
const moduleTree = await this.registerModuleWithScopeAsync(module, this.createContainer(module), []);
|
|
31
|
+
this.globalModulesWithScope.push({
|
|
32
|
+
module: this.overridesProcessor.getModuleWithOverrides(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
|
+
this.moduleGraphEnsurer.ensureImportedModulesUniqueness({
|
|
45
|
+
module: moduleWithOverrides,
|
|
46
|
+
resolvedImports: imports,
|
|
47
|
+
globalModules: this.globalModulesWithScope.map((el) => el.module),
|
|
48
|
+
});
|
|
49
|
+
this.moduleGraphEnsurer.ensureNoProviderNameConflicts({
|
|
50
|
+
module: moduleWithOverrides,
|
|
51
|
+
resolvedImports: imports,
|
|
52
|
+
globalModules: this.globalModulesWithScope.map((el) => el.module),
|
|
53
|
+
getExportedProviderKeys: (module) => this.getExportedProviderKeys(module),
|
|
54
|
+
});
|
|
55
|
+
this.markModuleIfImportsUseForwardRef(moduleWithOverrides);
|
|
56
|
+
const isCircular = moduleChain.includes(m);
|
|
57
|
+
if (isCircular) {
|
|
58
|
+
this.moduleGraphEnsurer.ensureCircularDependencyHasForwardRef({
|
|
59
|
+
module: m,
|
|
60
|
+
moduleChain,
|
|
61
|
+
forwardRefModules: this.forwardRefModules,
|
|
62
|
+
});
|
|
63
|
+
return this.createModuleScope(m.name, this.moduleScopeMap.get(m), []);
|
|
64
|
+
}
|
|
65
|
+
const pendingTree = this.moduleTreePromiseMap.get(m);
|
|
66
|
+
if (pendingTree) {
|
|
67
|
+
return pendingTree;
|
|
68
|
+
}
|
|
69
|
+
const moduleTreePromise = this.registerNewModuleWithScopeAsync(m, moduleWithOverrides, scope, imports, moduleChain);
|
|
70
|
+
this.moduleTreePromiseMap.set(m, moduleTreePromise);
|
|
71
|
+
return moduleTreePromise;
|
|
72
|
+
}
|
|
73
|
+
async registerNewModuleWithScopeAsync(m, moduleWithOverrides, scope, imports, moduleChain) {
|
|
74
|
+
this.moduleScopeMap.set(m, scope);
|
|
75
|
+
const importedModulesWithScope = [
|
|
76
|
+
...this.globalModulesWithScope,
|
|
77
|
+
...(await Promise.all(imports.map(async (module) => {
|
|
78
|
+
const moduleTree = await this.registerModuleWithScopeAsync(module, this.createContainer(module), [...moduleChain, m]);
|
|
79
|
+
return {
|
|
80
|
+
module: this.overridesProcessor.getModuleWithOverrides(module),
|
|
81
|
+
moduleScope: moduleTree,
|
|
82
|
+
};
|
|
83
|
+
}))),
|
|
84
|
+
];
|
|
85
|
+
this.registerExportedProviders(scope, importedModulesWithScope);
|
|
86
|
+
const moduleForSorting = {
|
|
87
|
+
...moduleWithOverrides,
|
|
88
|
+
imports: importedModulesWithScope.map((el) => el.module),
|
|
89
|
+
};
|
|
90
|
+
this.interceptorProcessor.processInterceptors(moduleWithOverrides, scope, importedModulesWithScope);
|
|
91
|
+
const providers = this.sorter.sortByDependencies(moduleForSorting);
|
|
92
|
+
for (const [key, provider] of Object.entries(providers)) {
|
|
93
|
+
scope.register({
|
|
94
|
+
[key]: await this.providerResolver.resolveProviderAsync({
|
|
95
|
+
key,
|
|
96
|
+
provider,
|
|
97
|
+
resolutionScope: scope,
|
|
98
|
+
module: moduleWithOverrides,
|
|
99
|
+
}),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
this.lifecycleProcessor.collectEagerProviders(moduleWithOverrides, scope);
|
|
103
|
+
this.afterRegisterProviders(moduleWithOverrides, scope, importedModulesWithScope);
|
|
104
|
+
const moduleTree = this.createModuleScope(m.name, scope, importedModulesWithScope);
|
|
105
|
+
this.moduleTreeMap.set(m, moduleTree);
|
|
106
|
+
this.moduleTreePromiseMap.delete(m);
|
|
107
|
+
return moduleTree;
|
|
108
|
+
}
|
|
109
|
+
async resolveImportsAsync(m) {
|
|
110
|
+
return Promise.all((m.imports || []).map((importItem) => GUARGS.isForwardRef(importItem) ? importItem.resolve() : importItem));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -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,32 @@
|
|
|
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 = new InitializerProcessor();
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(options, {
|
|
15
|
+
hasScopeContext: hasRequestScopeContext,
|
|
16
|
+
resolveFromScope: resolveFromRequestScope,
|
|
17
|
+
});
|
|
18
|
+
this.handlerProcessor = new HandlerProcessor(this.options.providerOptions || {});
|
|
19
|
+
this.interceptorProcessor = new InterceptorProcessor(this.options.providerOptions || {});
|
|
20
|
+
this.controllerProcessor = new ControllerProcessor(this.interceptorProcessor, this.options.providerOptions || {}, this.options.skipRegisterRoutes === true);
|
|
21
|
+
this.providerResolver = new ProviderResolver(this.interceptorProcessor, this.options.providerOptions || {}, getOrCreateRequestScope);
|
|
22
|
+
}
|
|
23
|
+
beforeRegisterProviders(m, scope, importedModulesWithScope) {
|
|
24
|
+
this.interceptorProcessor.processInterceptors(m, scope, importedModulesWithScope);
|
|
25
|
+
}
|
|
26
|
+
afterRegisterProviders(m, scope, importedModulesWithScope) {
|
|
27
|
+
this.handlerProcessor.processHandlers(m, scope, importedModulesWithScope, HandlerType.Query);
|
|
28
|
+
this.handlerProcessor.processHandlers(m, scope, importedModulesWithScope, HandlerType.Command);
|
|
29
|
+
const controllers = this.controllerProcessor.processControllers(m, scope);
|
|
30
|
+
this.lifecycleProcessor.addInitializerTask(this.initializerProcessor.collectInitializers(m, scope, importedModulesWithScope, controllers));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -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,31 @@
|
|
|
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
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { BuildResolverOptions, Constructor } from "awilix";
|
|
2
|
+
import type { EmptyObject } from "../common.types.js";
|
|
3
|
+
import type { RawValueObject } from "../modules/module.types.js";
|
|
4
|
+
import type { InternalModuleLike } from "../modules/runtime-module.types.js";
|
|
5
|
+
import type { AnyInitializer, AnyInterceptor, DefInitializerMap, DefInterceptorMap, DefPreHandlerMap, DefProviderMap, Provider } from "../providers/provider.types.js";
|
|
6
|
+
type OwnProviderMap<TModule> = TModule extends {
|
|
7
|
+
providers: infer TProviders extends DefProviderMap;
|
|
8
|
+
} ? TProviders : EmptyObject;
|
|
9
|
+
type OwnQueryPreHandlerMap<TModule> = TModule extends {
|
|
10
|
+
queryPreHandlers: infer TPreHandlers extends DefPreHandlerMap;
|
|
11
|
+
} ? TPreHandlers : EmptyObject;
|
|
12
|
+
type OwnCommandPreHandlerMap<TModule> = TModule extends {
|
|
13
|
+
commandPreHandlers: infer TPreHandlers extends DefPreHandlerMap;
|
|
14
|
+
} ? TPreHandlers : EmptyObject;
|
|
15
|
+
type OwnInterceptorMap<TModule> = TModule extends {
|
|
16
|
+
interceptors: infer TInterceptors extends DefInterceptorMap;
|
|
17
|
+
} ? TInterceptors : EmptyObject;
|
|
18
|
+
type OwnInitializerMap<TModule> = TModule extends {
|
|
19
|
+
initializers: infer TInitializers extends DefInitializerMap;
|
|
20
|
+
} ? TInitializers : EmptyObject;
|
|
21
|
+
type ModuleDeps<TModule> = TModule extends {
|
|
22
|
+
deps: infer TDeps extends Record<string, unknown>;
|
|
23
|
+
} ? TDeps : Record<string, unknown>;
|
|
24
|
+
type RuntimeProviderValue<T> = T extends {
|
|
25
|
+
useFactory: (...args: any[]) => infer R;
|
|
26
|
+
} ? Awaited<R> : T extends {
|
|
27
|
+
useClass: infer C extends new (...args: any[]) => any;
|
|
28
|
+
} ? InstanceType<C> : T extends new (...args: any[]) => infer I ? I : T;
|
|
29
|
+
type PublicShape<T> = Pick<T, keyof T>;
|
|
30
|
+
type ProviderOverride<TValue, TDeps extends Record<string, unknown>> = RuntimeProviderValue<TValue> extends object ? (Provider<PublicShape<RuntimeProviderValue<TValue>>, TDeps> & {
|
|
31
|
+
initAfter?: readonly Extract<keyof TDeps, string>[];
|
|
32
|
+
}) | RawValueObject<PublicShape<RuntimeProviderValue<TValue>>> : RuntimeProviderValue<TValue>;
|
|
33
|
+
type ProviderOverridesFor<TModule> = {
|
|
34
|
+
[K in Extract<keyof OwnProviderMap<TModule>, string>]?: ProviderOverride<OwnProviderMap<TModule>[K], ModuleDeps<TModule>>;
|
|
35
|
+
};
|
|
36
|
+
type MiddlewareOverride<TValue> = TValue extends object ? Constructor<PublicShape<RuntimeProviderValue<TValue>>> | ({
|
|
37
|
+
useClass: Constructor<PublicShape<RuntimeProviderValue<TValue>>>;
|
|
38
|
+
} & BuildResolverOptions<any>) : RuntimeProviderValue<TValue> extends object ? never : RuntimeProviderValue<TValue>;
|
|
39
|
+
type PreHandlerOverridesFor<TMap> = {
|
|
40
|
+
[K in Extract<keyof TMap, string>]?: MiddlewareOverride<TMap[K]>;
|
|
41
|
+
};
|
|
42
|
+
type InterceptorOverridesFor<TModule> = {
|
|
43
|
+
[K in Extract<keyof OwnInterceptorMap<TModule>, string>]?: AnyInterceptor;
|
|
44
|
+
};
|
|
45
|
+
type InitializerOverridesFor<TModule> = {
|
|
46
|
+
[K in Extract<keyof OwnInitializerMap<TModule>, string>]?: AnyInitializer;
|
|
47
|
+
};
|
|
48
|
+
export type ModuleFeatureOverridesFor<TModule> = {
|
|
49
|
+
providers?: ProviderOverridesFor<TModule>;
|
|
50
|
+
queryPreHandlers?: PreHandlerOverridesFor<OwnQueryPreHandlerMap<TModule>>;
|
|
51
|
+
commandPreHandlers?: PreHandlerOverridesFor<OwnCommandPreHandlerMap<TModule>>;
|
|
52
|
+
interceptors?: InterceptorOverridesFor<TModule>;
|
|
53
|
+
initializers?: InitializerOverridesFor<TModule>;
|
|
54
|
+
};
|
|
55
|
+
export type ModuleOverride<TModule extends InternalModuleLike = InternalModuleLike> = {
|
|
56
|
+
module: TModule;
|
|
57
|
+
overrides: ModuleFeatureOverridesFor<TModule>;
|
|
58
|
+
};
|
|
59
|
+
export type AnyModuleOverride = {
|
|
60
|
+
module: InternalModuleLike;
|
|
61
|
+
overrides: {
|
|
62
|
+
providers?: Record<string, unknown>;
|
|
63
|
+
queryPreHandlers?: Record<string, unknown>;
|
|
64
|
+
commandPreHandlers?: Record<string, unknown>;
|
|
65
|
+
interceptors?: Record<string, unknown>;
|
|
66
|
+
initializers?: Record<string, unknown>;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
export declare function overrideModule<TModule extends InternalModuleLike>(module: TModule, overrides: ModuleFeatureOverridesFor<TModule>): ModuleOverride<TModule>;
|
|
70
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type PublicShape<T> = [keyof T] extends [never] ? T : Pick<T, keyof T>;
|
|
2
|
+
export type RuntimeProviderValue<T> = T extends {
|
|
3
|
+
useFactory: (...args: any[]) => infer R;
|
|
4
|
+
} ? Awaited<R> : T extends {
|
|
5
|
+
useClass: infer C extends new (...args: any[]) => any;
|
|
6
|
+
} ? InstanceType<C> : T extends new (...args: any[]) => infer I ? I : T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { InternalModuleLike } from "../modules/runtime-module.types.js";
|
|
2
|
+
import type { AnyModuleOverride } from "./module-overrides.js";
|
|
3
|
+
import type { AnyProviderOverrides } from "./provider-overrides.types.js";
|
|
4
|
+
type OverrideOptions = {
|
|
5
|
+
providerOverrides?: AnyProviderOverrides;
|
|
6
|
+
moduleOverrides?: readonly AnyModuleOverride[];
|
|
7
|
+
};
|
|
8
|
+
export declare class OverridesProcessor<M extends InternalModuleLike> {
|
|
9
|
+
private readonly options;
|
|
10
|
+
private readonly effectiveModuleMap;
|
|
11
|
+
private readonly appliedModuleOverrides;
|
|
12
|
+
private rootModule?;
|
|
13
|
+
constructor(options: OverrideOptions);
|
|
14
|
+
setRootModule(module: M): void;
|
|
15
|
+
applyModuleOverrides(module: M): M;
|
|
16
|
+
getEffectiveModule(module: M): M;
|
|
17
|
+
ensureAllModuleOverridesApplied(): void;
|
|
18
|
+
applyRootProviderOverrides(module: M, moduleForSorting: M): M;
|
|
19
|
+
private ensureModuleOverrideKeysExist;
|
|
20
|
+
private ensureFeatureOverrideKeysExist;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as ERRORS from "../errors.js";
|
|
2
|
+
export class OverridesProcessor {
|
|
3
|
+
options;
|
|
4
|
+
effectiveModuleMap = new WeakMap();
|
|
5
|
+
appliedModuleOverrides = new WeakSet();
|
|
6
|
+
rootModule;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
setRootModule(module) {
|
|
11
|
+
this.rootModule = module;
|
|
12
|
+
}
|
|
13
|
+
applyModuleOverrides(module) {
|
|
14
|
+
const moduleOverride = this.options.moduleOverrides?.find((override) => override.module === module);
|
|
15
|
+
if (!moduleOverride) {
|
|
16
|
+
this.effectiveModuleMap.set(module, module);
|
|
17
|
+
return module;
|
|
18
|
+
}
|
|
19
|
+
this.ensureModuleOverrideKeysExist(module, moduleOverride);
|
|
20
|
+
this.appliedModuleOverrides.add(module);
|
|
21
|
+
const effectiveModule = {
|
|
22
|
+
...module,
|
|
23
|
+
providers: {
|
|
24
|
+
...module.providers,
|
|
25
|
+
...moduleOverride.overrides.providers,
|
|
26
|
+
},
|
|
27
|
+
queryPreHandlers: {
|
|
28
|
+
...module.queryPreHandlers,
|
|
29
|
+
...moduleOverride.overrides.queryPreHandlers,
|
|
30
|
+
},
|
|
31
|
+
commandPreHandlers: {
|
|
32
|
+
...module.commandPreHandlers,
|
|
33
|
+
...moduleOverride.overrides.commandPreHandlers,
|
|
34
|
+
},
|
|
35
|
+
interceptors: {
|
|
36
|
+
...module.interceptors,
|
|
37
|
+
...moduleOverride.overrides.interceptors,
|
|
38
|
+
},
|
|
39
|
+
initializers: {
|
|
40
|
+
...module.initializers,
|
|
41
|
+
...moduleOverride.overrides.initializers,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
this.effectiveModuleMap.set(module, effectiveModule);
|
|
45
|
+
return effectiveModule;
|
|
46
|
+
}
|
|
47
|
+
getEffectiveModule(module) {
|
|
48
|
+
return this.effectiveModuleMap.get(module) ?? module;
|
|
49
|
+
}
|
|
50
|
+
ensureAllModuleOverridesApplied() {
|
|
51
|
+
for (const override of this.options.moduleOverrides ?? []) {
|
|
52
|
+
if (!this.appliedModuleOverrides.has(override.module)) {
|
|
53
|
+
throw new ERRORS.ModuleOverrideTargetNotFoundError(override.module.name);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
applyRootProviderOverrides(module, moduleForSorting) {
|
|
58
|
+
const overrides = this.options.providerOverrides;
|
|
59
|
+
if (module !== this.rootModule || !overrides) {
|
|
60
|
+
return moduleForSorting;
|
|
61
|
+
}
|
|
62
|
+
const providerKeys = new Set(Object.keys(module.providers || {}));
|
|
63
|
+
for (const key of Object.keys(overrides)) {
|
|
64
|
+
if (!providerKeys.has(key)) {
|
|
65
|
+
throw new ERRORS.ProviderOverrideNotFoundError(module.name, key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
...moduleForSorting,
|
|
70
|
+
providers: {
|
|
71
|
+
...moduleForSorting.providers,
|
|
72
|
+
...overrides,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
ensureModuleOverrideKeysExist(module, moduleOverride) {
|
|
77
|
+
this.ensureFeatureOverrideKeysExist(module, "providers", moduleOverride.overrides.providers);
|
|
78
|
+
this.ensureFeatureOverrideKeysExist(module, "queryPreHandlers", moduleOverride.overrides.queryPreHandlers);
|
|
79
|
+
this.ensureFeatureOverrideKeysExist(module, "commandPreHandlers", moduleOverride.overrides.commandPreHandlers);
|
|
80
|
+
this.ensureFeatureOverrideKeysExist(module, "interceptors", moduleOverride.overrides.interceptors);
|
|
81
|
+
this.ensureFeatureOverrideKeysExist(module, "initializers", moduleOverride.overrides.initializers);
|
|
82
|
+
}
|
|
83
|
+
ensureFeatureOverrideKeysExist(module, featureKind, overrides) {
|
|
84
|
+
if (!overrides)
|
|
85
|
+
return;
|
|
86
|
+
const featureKeys = new Set(Object.keys(module[featureKind] || {}));
|
|
87
|
+
for (const key of Object.keys(overrides)) {
|
|
88
|
+
if (!featureKeys.has(key)) {
|
|
89
|
+
throw new ERRORS.ModuleFeatureOverrideNotFoundError(module.name, featureKind, key);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EmptyObject } from "../common.types.js";
|
|
2
|
+
import type { Module, ModuleDefinition, RawValueObject } from "../modules/module.types.js";
|
|
3
|
+
import type { AnyProvider, DefProviderMap, Provider } from "../providers/provider.types.js";
|
|
4
|
+
type ModuleDefFrom<TModule> = TModule extends Module<infer TDef extends ModuleDefinition> ? TDef : never;
|
|
5
|
+
type OwnProviderMap<TModule> = ModuleDefFrom<TModule> extends {
|
|
6
|
+
providers: infer TProviders extends DefProviderMap;
|
|
7
|
+
} ? TProviders : EmptyObject;
|
|
8
|
+
type ModuleDeps<TModule> = ModuleDefFrom<TModule> extends {
|
|
9
|
+
deps: infer TDeps extends Record<string, unknown>;
|
|
10
|
+
} ? TDeps : Record<string, unknown>;
|
|
11
|
+
type PublicShape<T> = Pick<T, keyof T>;
|
|
12
|
+
type ProviderOverride<TValue, TDeps extends Record<string, unknown>> = TValue extends object ? (Provider<PublicShape<TValue>, TDeps> & {
|
|
13
|
+
initAfter?: readonly Extract<keyof TDeps, string>[];
|
|
14
|
+
}) | RawValueObject<PublicShape<TValue>> : TValue;
|
|
15
|
+
export type ProviderOverridesFor<TModule> = {
|
|
16
|
+
[K in Extract<keyof OwnProviderMap<TModule>, string>]?: ProviderOverride<OwnProviderMap<TModule>[K], ModuleDeps<TModule>>;
|
|
17
|
+
};
|
|
18
|
+
export type AnyProviderOverrides = Record<string, AnyProvider>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
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 ProviderNameConflictError extends Error {
|
|
17
|
+
constructor(moduleName: string, conflictingKeys: string[]);
|
|
18
|
+
}
|
|
19
|
+
export declare class ModuleFeatureOverrideNotFoundError extends Error {
|
|
20
|
+
constructor(moduleName: string, featureKind: string, featureKey: string);
|
|
21
|
+
}
|
|
22
|
+
export declare class ModuleOverrideTargetNotFoundError extends Error {
|
|
23
|
+
constructor(moduleName: string);
|
|
24
|
+
}
|
|
25
|
+
export declare class CircularModuleDependencyError extends Error {
|
|
26
|
+
constructor(moduleName: string, chain: string[]);
|
|
27
|
+
}
|
|
28
|
+
export declare class GlobalModuleImportsGlobalModuleError extends Error {
|
|
29
|
+
constructor(moduleName: string, importedGlobalModuleName: string);
|
|
30
|
+
}
|
|
31
|
+
export declare class HandlerMissingStaticKeyError extends Error {
|
|
32
|
+
constructor(handlerName: string);
|
|
33
|
+
}
|
|
34
|
+
export declare class FeatureNameConflictError extends Error {
|
|
35
|
+
constructor(moduleName: string, featureName: string, featureKey: string, existingModuleName: string);
|
|
36
|
+
}
|
|
37
|
+
export declare class InvalidProviderDefinitionError extends Error {
|
|
38
|
+
constructor(moduleName: string, providerKey: string);
|
|
39
|
+
}
|
|
40
|
+
export declare class AsyncFactoryRequiresAsyncCreateError extends Error {
|
|
41
|
+
constructor(moduleName: string, providerKey: string);
|
|
42
|
+
}
|
|
43
|
+
export declare class AsyncEagerFactoryRequiresInitError extends Error {
|
|
44
|
+
constructor(moduleName: string, providerKey: string);
|
|
45
|
+
}
|
|
46
|
+
export declare class AsyncFactoryRequiresSingletonLifetimeError extends Error {
|
|
47
|
+
constructor(moduleName: string, providerKey: string);
|
|
48
|
+
}
|
|
49
|
+
export declare class EagerProviderRequiresSingletonLifetimeError extends Error {
|
|
50
|
+
constructor(moduleName: string, providerKey: string);
|
|
51
|
+
}
|
|
52
|
+
export declare class EagerProviderInitDependencyNotFoundError extends Error {
|
|
53
|
+
constructor(moduleName: string, providerKey: string, dependencyKey: string);
|
|
54
|
+
}
|
|
55
|
+
export declare class CircularProviderInitDependencyError extends Error {
|
|
56
|
+
constructor(providerKeys: string[]);
|
|
57
|
+
}
|
|
58
|
+
export declare class AsyncModuleRequiresAsyncCreateError extends Error {
|
|
59
|
+
constructor(moduleName: string);
|
|
60
|
+
}
|
|
61
|
+
export declare class DuplicateInitializerTokenError extends Error {
|
|
62
|
+
constructor(moduleName: string, initializerName: string, existingModuleName: string);
|
|
63
|
+
}
|
|
64
|
+
export declare class MultipleInvokeInitializersPerMethodError extends Error {
|
|
65
|
+
constructor(moduleName: string, controllerName: string, methodName: string, initializerNames: string[]);
|
|
66
|
+
}
|