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.
- package/README.md +15 -6
- package/dist/index.d.ts +19 -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/devtools/devtools.types.d.ts +63 -0
- package/dist/lib/devtools/devtools.types.js +1 -0
- package/dist/lib/devtools/helpers.d.ts +2 -0
- package/dist/lib/devtools/helpers.js +18 -0
- package/dist/lib/devtools/index.d.ts +4 -0
- package/dist/lib/devtools/index.js +3 -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 +63 -0
- package/dist/lib/di/contexts/container-context-base.js +232 -0
- package/dist/lib/di/contexts/di-context-async.d.ts +14 -0
- package/dist/lib/di/contexts/di-context-async.js +118 -0
- package/dist/lib/di/contexts/di-context-base.d.ts +19 -0
- package/dist/lib/di/contexts/di-context-base.js +33 -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 +32 -0
- package/dist/lib/di/contexts/module-graph-ensurer.js +50 -0
- package/dist/lib/di/errors.d.ts +69 -0
- package/dist/lib/di/errors.js +154 -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 +54 -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/runtime-module.types.d.ts +32 -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 +19 -0
- package/dist/lib/di/processors/handler-processor.js +103 -0
- package/dist/lib/di/processors/initializer-processor.d.ts +20 -0
- package/dist/lib/di/processors/initializer-processor.js +95 -0
- package/dist/lib/di/processors/interceptor-processor.d.ts +21 -0
- package/dist/lib/di/processors/interceptor-processor.js +117 -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 +37 -0
- package/dist/lib/di/processors/lifecycle-processor.js +175 -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/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 +35 -0
- package/dist/lib/di/providers/provider-resolver.js +168 -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 +24 -0
- package/dist/lib/mediator/mediator.js +134 -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/index.d.ts +4 -0
- package/dist/lib/react/index.js +4 -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 +16 -0
- package/dist/lib/react/react-di-context.js +52 -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 +169 -0
- package/dist/lib/react/react-module.types.js +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +33 -3
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
|
|
2
|
+
export declare class ProviderDependencySorter {
|
|
3
|
+
sortByDependencies(m: M): NonNullable<typeof m.providers>;
|
|
4
|
+
private initializeDepGraph;
|
|
5
|
+
private buildDepGraph;
|
|
6
|
+
private sortTopologically;
|
|
7
|
+
private initializeQueue;
|
|
8
|
+
private ensureNoCyclicDependencies;
|
|
9
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as ERRORS from "../errors.js";
|
|
2
|
+
import { isFactoryProvider, isForwardRef, isPromiseLike, } from "../type-guards.js";
|
|
3
|
+
export class ProviderDependencySorter {
|
|
4
|
+
sortByDependencies(m) {
|
|
5
|
+
const depsGraph = this.buildDepGraph(m, this.initializeDepGraph(m));
|
|
6
|
+
const initialQueue = this.initializeQueue(depsGraph.inDegree);
|
|
7
|
+
const sortedKeys = this.sortTopologically(depsGraph, initialQueue);
|
|
8
|
+
this.ensureNoCyclicDependencies(m, sortedKeys);
|
|
9
|
+
return sortedKeys.reduce((acc, key) => {
|
|
10
|
+
const provider = m.providers?.[key];
|
|
11
|
+
if (provider !== undefined)
|
|
12
|
+
acc[key] = provider;
|
|
13
|
+
return acc;
|
|
14
|
+
}, {});
|
|
15
|
+
}
|
|
16
|
+
initializeDepGraph(m) {
|
|
17
|
+
return Object.keys(m.providers || {}).reduce((acc, curr) => {
|
|
18
|
+
acc.graph.set(curr, []);
|
|
19
|
+
acc.inDegree.set(curr, 0);
|
|
20
|
+
return acc;
|
|
21
|
+
}, {
|
|
22
|
+
graph: new Map(),
|
|
23
|
+
inDegree: new Map(),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
buildDepGraph(m, depsGraph) {
|
|
27
|
+
const importedProviderKeys = new Set((m.imports || []).flatMap((importItem) => {
|
|
28
|
+
const importedModule = isForwardRef(importItem)
|
|
29
|
+
? importItem.resolve()
|
|
30
|
+
: importItem;
|
|
31
|
+
if (isPromiseLike(importedModule)) {
|
|
32
|
+
throw new Error(`Async module import in "${m.name}" was not resolved before provider dependency sorting.`);
|
|
33
|
+
}
|
|
34
|
+
return importedModule.exports ? [...importedModule.exports] : [];
|
|
35
|
+
}));
|
|
36
|
+
return Object.entries(m.providers || {}).reduce((acc, [key, provider]) => {
|
|
37
|
+
if (!isFactoryProvider(provider) || !provider.inject)
|
|
38
|
+
return acc;
|
|
39
|
+
provider.inject.forEach((dep) => {
|
|
40
|
+
const depList = acc.graph.get(dep);
|
|
41
|
+
if (depList) {
|
|
42
|
+
depList.push(key);
|
|
43
|
+
acc.inDegree.set(key, (acc.inDegree.get(key) || 0) + 1);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!depList && !importedProviderKeys.has(dep)) {
|
|
47
|
+
throw new ERRORS.DependencyNotFoundError(dep, m.name);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return acc;
|
|
51
|
+
}, { ...depsGraph });
|
|
52
|
+
}
|
|
53
|
+
sortTopologically(depsGraph, queue, result = []) {
|
|
54
|
+
const [current, ...restQueue] = queue;
|
|
55
|
+
if (!current)
|
|
56
|
+
return result;
|
|
57
|
+
const deps = depsGraph.graph.get(current) || [];
|
|
58
|
+
const inDegree = deps.reduce((acc, curr) => {
|
|
59
|
+
acc.set(curr, (acc.get(curr) || 0) - 1);
|
|
60
|
+
return acc;
|
|
61
|
+
}, new Map(depsGraph.inDegree));
|
|
62
|
+
return this.sortTopologically({ ...depsGraph, inDegree }, [...restQueue, ...deps.filter((dep) => inDegree.get(dep) === 0)], [...result, current]);
|
|
63
|
+
}
|
|
64
|
+
initializeQueue(inDegree) {
|
|
65
|
+
return Array.from(inDegree.entries())
|
|
66
|
+
.filter(([_, degree]) => degree === 0)
|
|
67
|
+
.map(([key]) => key);
|
|
68
|
+
}
|
|
69
|
+
ensureNoCyclicDependencies(m, sortedKeys) {
|
|
70
|
+
const providerKeys = Object.keys(m.providers || {});
|
|
71
|
+
if (sortedKeys.length !== providerKeys.length) {
|
|
72
|
+
const remaining = providerKeys.filter((key) => !sortedKeys.includes(key));
|
|
73
|
+
throw new ERRORS.CircularDependencyError(m.name, remaining);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as Awilix from "awilix";
|
|
2
|
+
import type { DevtoolsProcessorRef } from "../../devtools/devtools.types.js";
|
|
3
|
+
import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
|
|
4
|
+
import type { InterceptorProcessor } from "../processors/interceptor-processor.js";
|
|
5
|
+
import type { AnyProvider } from "./provider.types.js";
|
|
6
|
+
export type RequestScopeResolver = (scope: Awilix.AwilixContainer) => Awilix.AwilixContainer;
|
|
7
|
+
type ResolveProviderParams = {
|
|
8
|
+
key: string;
|
|
9
|
+
moduleId?: string;
|
|
10
|
+
provider: AnyProvider;
|
|
11
|
+
resolutionScope: Awilix.AwilixContainer;
|
|
12
|
+
module: M;
|
|
13
|
+
};
|
|
14
|
+
type ResolveClassProviderParams = {
|
|
15
|
+
provider: unknown;
|
|
16
|
+
resolutionScope: Awilix.AwilixContainer;
|
|
17
|
+
module: M;
|
|
18
|
+
providerOptions?: Partial<Awilix.BuildResolverOptions<any>>;
|
|
19
|
+
wrapForExport?: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare class ProviderResolver {
|
|
22
|
+
private readonly interceptorProcessor;
|
|
23
|
+
private readonly providerOptions;
|
|
24
|
+
private readonly devtoolsProcessorRef;
|
|
25
|
+
private readonly requestScopeResolver?;
|
|
26
|
+
constructor(interceptorProcessor: InterceptorProcessor | undefined, providerOptions: Partial<Awilix.BuildResolverOptions<any>>, devtoolsProcessorRef: DevtoolsProcessorRef, requestScopeResolver?: RequestScopeResolver | undefined);
|
|
27
|
+
static mergeResolverOptions(module: M, providerOptions: Partial<Awilix.BuildResolverOptions<any>>, options?: Partial<Awilix.BuildResolverOptions<any>>): Awilix.BuildResolverOptions<any>;
|
|
28
|
+
resolveClassProvider({ provider, resolutionScope, module, wrapForExport, }: ResolveClassProviderParams): Awilix.Resolver<any>;
|
|
29
|
+
resolveProvider({ key, moduleId, provider, resolutionScope, module, }: ResolveProviderParams): Awilix.Resolver<any>;
|
|
30
|
+
resolveProviderAsync({ key, moduleId, provider, resolutionScope, module, }: ResolveProviderParams): Promise<Awilix.Resolver<any>>;
|
|
31
|
+
private extractResolverOptions;
|
|
32
|
+
private createProxyResolver;
|
|
33
|
+
private get devtoolsTracer();
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import * as Awilix from "awilix";
|
|
2
|
+
import * as ERRORS from "../errors.js";
|
|
3
|
+
import * as GUARGS from "../type-guards.js";
|
|
4
|
+
export class ProviderResolver {
|
|
5
|
+
interceptorProcessor;
|
|
6
|
+
providerOptions;
|
|
7
|
+
devtoolsProcessorRef;
|
|
8
|
+
requestScopeResolver;
|
|
9
|
+
constructor(interceptorProcessor, providerOptions, devtoolsProcessorRef, requestScopeResolver) {
|
|
10
|
+
this.interceptorProcessor = interceptorProcessor;
|
|
11
|
+
this.providerOptions = providerOptions;
|
|
12
|
+
this.devtoolsProcessorRef = devtoolsProcessorRef;
|
|
13
|
+
this.requestScopeResolver = requestScopeResolver;
|
|
14
|
+
}
|
|
15
|
+
static mergeResolverOptions(module, providerOptions, options) {
|
|
16
|
+
return {
|
|
17
|
+
...providerOptions,
|
|
18
|
+
...module.providerOptions,
|
|
19
|
+
...options,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
resolveClassProvider({ provider, resolutionScope, module, wrapForExport, }) {
|
|
23
|
+
const { useClass, ...featureOptions } = GUARGS.hasUseClass(provider)
|
|
24
|
+
? provider
|
|
25
|
+
: { useClass: provider };
|
|
26
|
+
const resolverOptions = {
|
|
27
|
+
...this.providerOptions,
|
|
28
|
+
...module.providerOptions,
|
|
29
|
+
...featureOptions,
|
|
30
|
+
};
|
|
31
|
+
const resolver = Awilix.asClass(useClass, resolverOptions);
|
|
32
|
+
if (!wrapForExport)
|
|
33
|
+
return resolver;
|
|
34
|
+
return Awilix.asFunction(() => resolver.resolve(resolverOptions.lifetime === Awilix.Lifetime.SINGLETON
|
|
35
|
+
? resolutionScope
|
|
36
|
+
: this.requestScopeResolver
|
|
37
|
+
? this.requestScopeResolver(resolutionScope)
|
|
38
|
+
: resolutionScope), resolverOptions);
|
|
39
|
+
}
|
|
40
|
+
resolveProvider({ key, moduleId, provider, resolutionScope, module, }) {
|
|
41
|
+
if (GUARGS.isPrimitive(provider)) {
|
|
42
|
+
return Awilix.asValue(provider);
|
|
43
|
+
}
|
|
44
|
+
if (GUARGS.isPlainFunction(provider) &&
|
|
45
|
+
!GUARGS.isCostructorProvider(provider)) {
|
|
46
|
+
return Awilix.asValue(provider);
|
|
47
|
+
}
|
|
48
|
+
if (typeof provider === "object" &&
|
|
49
|
+
!GUARGS.isCostructorProvider(provider) &&
|
|
50
|
+
!GUARGS.isFactoryProvider(provider) &&
|
|
51
|
+
!GUARGS.hasUseClass(provider)) {
|
|
52
|
+
return Awilix.asValue(provider);
|
|
53
|
+
}
|
|
54
|
+
const resolverOptions = this.extractResolverOptions(module, provider);
|
|
55
|
+
if (GUARGS.isCostructorProvider(provider)) {
|
|
56
|
+
const resolver = !this.interceptorProcessor
|
|
57
|
+
? Awilix.asClass(provider, resolverOptions)
|
|
58
|
+
: this.interceptorProcessor.createInterceptedProviderResolver({
|
|
59
|
+
module,
|
|
60
|
+
useClass: provider,
|
|
61
|
+
options: resolverOptions,
|
|
62
|
+
});
|
|
63
|
+
if (!this.devtoolsTracer)
|
|
64
|
+
return resolver;
|
|
65
|
+
return this.devtoolsTracer.wrapResolver({
|
|
66
|
+
kind: "provider",
|
|
67
|
+
module,
|
|
68
|
+
moduleId,
|
|
69
|
+
options: resolverOptions,
|
|
70
|
+
providerKey: key,
|
|
71
|
+
resolver,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (GUARGS.isFactoryProvider(provider)) {
|
|
75
|
+
if (GUARGS.isAsyncFactoryProvider(provider)) {
|
|
76
|
+
if (GUARGS.isEagerProvider(provider)) {
|
|
77
|
+
return Awilix.asFunction(() => {
|
|
78
|
+
throw new ERRORS.AsyncEagerFactoryRequiresInitError(module.name, key ?? "unknown");
|
|
79
|
+
}, resolverOptions);
|
|
80
|
+
}
|
|
81
|
+
throw new ERRORS.AsyncFactoryRequiresAsyncCreateError(module.name, key ?? "unknown");
|
|
82
|
+
}
|
|
83
|
+
const factoryDeps = (provider.inject || []).map((k) => resolutionScope.registrations[k].resolve(resolutionScope));
|
|
84
|
+
const resolver = Awilix.asFunction(() => provider.useFactory(...factoryDeps), resolverOptions);
|
|
85
|
+
if (!this.devtoolsTracer)
|
|
86
|
+
return resolver;
|
|
87
|
+
return this.devtoolsTracer.wrapResolver({
|
|
88
|
+
kind: "provider",
|
|
89
|
+
module,
|
|
90
|
+
moduleId,
|
|
91
|
+
options: resolverOptions,
|
|
92
|
+
providerKey: key,
|
|
93
|
+
isFactory: true,
|
|
94
|
+
resolver,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const baseResolver = Awilix.asClass(provider.useClass, resolverOptions);
|
|
98
|
+
const classResolver = provider.allowCircular
|
|
99
|
+
? this.createProxyResolver(baseResolver, resolverOptions)
|
|
100
|
+
: baseResolver;
|
|
101
|
+
const resolver = !this.interceptorProcessor
|
|
102
|
+
? classResolver
|
|
103
|
+
: this.interceptorProcessor.createInterceptedProviderResolver({
|
|
104
|
+
module,
|
|
105
|
+
useClass: provider.useClass,
|
|
106
|
+
options: resolverOptions,
|
|
107
|
+
resolver: classResolver,
|
|
108
|
+
});
|
|
109
|
+
if (!this.devtoolsTracer)
|
|
110
|
+
return resolver;
|
|
111
|
+
return this.devtoolsTracer.wrapResolver({
|
|
112
|
+
kind: "provider",
|
|
113
|
+
module,
|
|
114
|
+
moduleId,
|
|
115
|
+
options: resolverOptions,
|
|
116
|
+
providerKey: key,
|
|
117
|
+
resolver,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async resolveProviderAsync({ key, moduleId, provider, resolutionScope, module, }) {
|
|
121
|
+
if (!GUARGS.isFactoryProvider(provider) ||
|
|
122
|
+
!GUARGS.isAsyncFactoryProvider(provider)) {
|
|
123
|
+
return this.resolveProvider({
|
|
124
|
+
provider,
|
|
125
|
+
resolutionScope,
|
|
126
|
+
module,
|
|
127
|
+
key,
|
|
128
|
+
moduleId,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const resolverOptions = this.extractResolverOptions(module, provider);
|
|
132
|
+
if (resolverOptions.lifetime !== Awilix.Lifetime.SINGLETON) {
|
|
133
|
+
throw new ERRORS.AsyncFactoryRequiresSingletonLifetimeError(module.name, key);
|
|
134
|
+
}
|
|
135
|
+
const factoryDeps = (provider.inject || []).map((k) => resolutionScope.registrations[k].resolve(resolutionScope));
|
|
136
|
+
return Awilix.asValue(await provider.useFactory(...factoryDeps));
|
|
137
|
+
}
|
|
138
|
+
extractResolverOptions(module, provider) {
|
|
139
|
+
if (GUARGS.hasUseClass(provider)) {
|
|
140
|
+
const { useClass, allowCircular, eager, initAfter, ...options } = provider;
|
|
141
|
+
return ProviderResolver.mergeResolverOptions(module, this.providerOptions, options);
|
|
142
|
+
}
|
|
143
|
+
if (GUARGS.isFactoryProvider(provider)) {
|
|
144
|
+
const { eager, initAfter, inject, useFactory, ...options } = provider;
|
|
145
|
+
return ProviderResolver.mergeResolverOptions(module, this.providerOptions, options);
|
|
146
|
+
}
|
|
147
|
+
return ProviderResolver.mergeResolverOptions(module, this.providerOptions);
|
|
148
|
+
}
|
|
149
|
+
createProxyResolver(resolver, options) {
|
|
150
|
+
return Awilix.createBuildResolver({
|
|
151
|
+
...options,
|
|
152
|
+
resolve(container) {
|
|
153
|
+
let resolved = null;
|
|
154
|
+
return new Proxy({}, {
|
|
155
|
+
get(_, name) {
|
|
156
|
+
if (!resolved) {
|
|
157
|
+
resolved = resolver.resolve(container);
|
|
158
|
+
}
|
|
159
|
+
return resolved[name];
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
get devtoolsTracer() {
|
|
166
|
+
return this.devtoolsProcessorRef.current?.tracer;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./types/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./types/index.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BuildResolverOptions, Constructor } from "awilix";
|
|
2
|
+
export type ConstructorController = Constructor<Controller>;
|
|
3
|
+
export type ClassController = {
|
|
4
|
+
useClass: ConstructorController | Constructor<any>;
|
|
5
|
+
} & BuildResolverOptions<any>;
|
|
6
|
+
export type AnyController = ConstructorController | ClassController | Constructor<any>;
|
|
7
|
+
export interface Controller {
|
|
8
|
+
registerRoutes: () => void;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DecoratorMethodState, DecoratorState, DecoratorToken, MethodName } from "../../../decorators/decorator-state.types.js";
|
|
2
|
+
export type AnyDecoratorToken = DecoratorToken<DecoratorState<any, any>>;
|
|
3
|
+
export type DecoratorExecutionContext<TToken extends AnyDecoratorToken = AnyDecoratorToken, TTarget extends object = object> = {
|
|
4
|
+
target: TTarget;
|
|
5
|
+
methodName: MethodName;
|
|
6
|
+
moduleName: string;
|
|
7
|
+
metadata: DecoratorMethodState<TToken["state"]>;
|
|
8
|
+
decoratorState: TToken["state"];
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BuildResolverOptions, Constructor } from "awilix";
|
|
2
|
+
import type { AnyContract } from "lib/mediator/contract.types.js";
|
|
3
|
+
import type { Handler } from "lib/mediator/handler.types.js";
|
|
4
|
+
export interface ConstructorHandler<C extends AnyContract = AnyContract> {
|
|
5
|
+
new (...args: any[]): Handler<C>;
|
|
6
|
+
}
|
|
7
|
+
export type ClassHandler<H extends Constructor<any> = Constructor<any>> = {
|
|
8
|
+
useClass: H;
|
|
9
|
+
} & BuildResolverOptions<any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./controller.types.js";
|
|
2
|
+
export * from "./decorator-context.types.js";
|
|
3
|
+
export * from "./handler.types.js";
|
|
4
|
+
export * from "./initializer.types.js";
|
|
5
|
+
export * from "./interceptor.types.js";
|
|
6
|
+
export * from "./middleware.types.js";
|
|
7
|
+
export * from "./provider.types.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./controller.types.js";
|
|
2
|
+
export * from "./decorator-context.types.js";
|
|
3
|
+
export * from "./handler.types.js";
|
|
4
|
+
export * from "./initializer.types.js";
|
|
5
|
+
export * from "./interceptor.types.js";
|
|
6
|
+
export * from "./middleware.types.js";
|
|
7
|
+
export * from "./provider.types.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Constructor } from "awilix";
|
|
2
|
+
import type { AnyDecoratorToken, DecoratorExecutionContext } from "./decorator-context.types.js";
|
|
3
|
+
export type DefInitializerMap = Record<string, ConstructorInitializer>;
|
|
4
|
+
export interface ConstructorInitializer {
|
|
5
|
+
new (...args: any[]): Initializer<any, boolean>;
|
|
6
|
+
}
|
|
7
|
+
export type MetadataInitializerContext<TToken extends AnyDecoratorToken = AnyDecoratorToken> = DecoratorExecutionContext<TToken, Constructor<any>>;
|
|
8
|
+
export type InitializerContext<TToken extends AnyDecoratorToken = AnyDecoratorToken> = MetadataInitializerContext<TToken> & {
|
|
9
|
+
invoke: (...args: unknown[]) => unknown | Promise<unknown>;
|
|
10
|
+
};
|
|
11
|
+
export declare abstract class Initializer<TToken extends AnyDecoratorToken = AnyDecoratorToken, TUsesInvoke extends boolean = true> {
|
|
12
|
+
abstract readonly token: TToken;
|
|
13
|
+
readonly usesInvoke: TUsesInvoke;
|
|
14
|
+
abstract initialize(context: TUsesInvoke extends true ? InitializerContext<TToken> : MetadataInitializerContext<TToken>): void | Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export type AnyInitializer = ConstructorInitializer;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BuildResolverOptions, Constructor } from "awilix";
|
|
2
|
+
import type { AnyDecoratorToken, DecoratorExecutionContext } from "./decorator-context.types.js";
|
|
3
|
+
export type DefInterceptorMap = Record<string, object>;
|
|
4
|
+
export interface ConstructorInterceptor {
|
|
5
|
+
new (...args: any[]): Interceptor;
|
|
6
|
+
}
|
|
7
|
+
export type ClassInterceptor<I extends Constructor<any> = Constructor<any>> = {
|
|
8
|
+
useClass: I;
|
|
9
|
+
} & BuildResolverOptions<any>;
|
|
10
|
+
export type AnyInterceptor = ClassInterceptor | ConstructorInterceptor;
|
|
11
|
+
export type InterceptContext<TToken extends AnyDecoratorToken = AnyDecoratorToken> = DecoratorExecutionContext<TToken> & {
|
|
12
|
+
args: unknown[];
|
|
13
|
+
proceed: () => unknown | Promise<unknown>;
|
|
14
|
+
};
|
|
15
|
+
export interface Interceptor<TToken extends AnyDecoratorToken = AnyDecoratorToken> {
|
|
16
|
+
token: TToken;
|
|
17
|
+
intercept(context: InterceptContext<TToken>): unknown | Promise<unknown>;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BuildResolverOptions, Constructor } from "awilix";
|
|
2
|
+
import type { AnyMiddlewareContract, Middleware } from "lib/mediator/middleware.types.js";
|
|
3
|
+
export type DefPreHandlerMap = Record<string, object>;
|
|
4
|
+
export interface ConstructorMiddleware<C extends AnyMiddlewareContract = AnyMiddlewareContract> {
|
|
5
|
+
new (...args: any[]): Middleware<C>;
|
|
6
|
+
}
|
|
7
|
+
export type ClassMiddleware<M extends Constructor<any> = Constructor<any>> = {
|
|
8
|
+
useClass: M;
|
|
9
|
+
} & BuildResolverOptions<any>;
|
|
10
|
+
export type AnyMiddleware = ClassMiddleware | Constructor<Middleware>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { BuildResolverOptions, Constructor } from "awilix";
|
|
2
|
+
export type DefProviderMap = Record<string, object | string | boolean | number>;
|
|
3
|
+
export type ConstructorProvider<T extends object = object> = Constructor<T>;
|
|
4
|
+
export type PrimitiveProvider = string | number | boolean | symbol | bigint;
|
|
5
|
+
export type FunctionProvider = (...args: any[]) => any;
|
|
6
|
+
export type FactoryProvider<T extends object, DepsMap extends Record<string, unknown>, Keys extends readonly Extract<keyof DepsMap, string>[], Strict extends boolean = true, ResolverOptions extends object = BuildResolverOptions<T>> = {
|
|
7
|
+
inject?: Keys;
|
|
8
|
+
initAfter?: readonly Extract<keyof DepsMap, string>[];
|
|
9
|
+
eager?: boolean;
|
|
10
|
+
useFactory: Strict extends true ? (...args: MapKeysToValues<DepsMap, Keys>) => T | Promise<T> : (...args: any[]) => T | Promise<T>;
|
|
11
|
+
} & ResolverOptions;
|
|
12
|
+
export type ClassProvider<T extends object, DepsMap extends Record<string, unknown> = Record<string, unknown>, ResolverOptions extends object = BuildResolverOptions<T>> = {
|
|
13
|
+
useClass: Constructor<T>;
|
|
14
|
+
allowCircular?: boolean;
|
|
15
|
+
eager?: boolean;
|
|
16
|
+
initAfter?: readonly Extract<keyof DepsMap, string>[];
|
|
17
|
+
} & ResolverOptions;
|
|
18
|
+
export interface ProviderInit {
|
|
19
|
+
init(): void | Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export type Provider<T extends object, DepsMap extends Record<string, unknown> = Record<string, unknown>, ResolverOptions extends object = BuildResolverOptions<T>> = FactoryProvider<T, DepsMap, readonly Extract<keyof DepsMap, string>[], false> | ClassProvider<T, DepsMap, ResolverOptions> | ConstructorProvider<T>;
|
|
22
|
+
export type AnyProvider = FactoryProvider<any, any, readonly string[], false> | ClassProvider<any> | ConstructorProvider<any> | PrimitiveProvider | FunctionProvider | object;
|
|
23
|
+
type MapKeysToValues<DepsMap extends Record<string, unknown>, Keys extends readonly Extract<keyof DepsMap, string>[]> = {
|
|
24
|
+
[K in keyof Keys]: Keys[K] extends keyof DepsMap ? DepsMap[Keys[K]] : never;
|
|
25
|
+
};
|
|
26
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type * as Awilix from "awilix";
|
|
2
|
+
export declare function runInRequestScopeContext<T>(fn: () => T): T;
|
|
3
|
+
export declare function hasRequestScopeContext(): boolean;
|
|
4
|
+
export declare function getOrCreateRequestScope(scope: Awilix.AwilixContainer): Awilix.AwilixContainer;
|
|
5
|
+
export declare function resolveFromRequestScope<T>(scope: Awilix.AwilixContainer, token: string | symbol): T;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
const requestScopeStorage = new AsyncLocalStorage();
|
|
3
|
+
export function runInRequestScopeContext(fn) {
|
|
4
|
+
const existingStore = requestScopeStorage.getStore();
|
|
5
|
+
if (existingStore) {
|
|
6
|
+
return fn();
|
|
7
|
+
}
|
|
8
|
+
return requestScopeStorage.run(new Map(), fn);
|
|
9
|
+
}
|
|
10
|
+
export function hasRequestScopeContext() {
|
|
11
|
+
return !!requestScopeStorage.getStore();
|
|
12
|
+
}
|
|
13
|
+
export function getOrCreateRequestScope(scope) {
|
|
14
|
+
const store = requestScopeStorage.getStore();
|
|
15
|
+
if (!store) {
|
|
16
|
+
return scope.createScope();
|
|
17
|
+
}
|
|
18
|
+
const existingScope = store.get(scope);
|
|
19
|
+
if (existingScope) {
|
|
20
|
+
return existingScope;
|
|
21
|
+
}
|
|
22
|
+
const requestScope = scope.createScope();
|
|
23
|
+
store.set(scope, requestScope);
|
|
24
|
+
return requestScope;
|
|
25
|
+
}
|
|
26
|
+
export function resolveFromRequestScope(scope, token) {
|
|
27
|
+
return getOrCreateRequestScope(scope).resolve(token);
|
|
28
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BuildResolverOptions, Constructor } from "awilix";
|
|
2
|
+
import type { ForwardRef } from "./modules/module-ref.types.js";
|
|
3
|
+
import type { FactoryProvider, FunctionProvider, PrimitiveProvider } from "./providers/provider.types.js";
|
|
4
|
+
export declare function hasUseClass<T extends object = object>(value: unknown): value is {
|
|
5
|
+
useClass: Constructor<T>;
|
|
6
|
+
allowCircular?: boolean;
|
|
7
|
+
eager?: boolean;
|
|
8
|
+
initAfter?: readonly string[];
|
|
9
|
+
} & Partial<BuildResolverOptions<any>>;
|
|
10
|
+
export declare function isFactoryProvider<T extends object>(provider: unknown): provider is FactoryProvider<T, any, readonly string[], false>;
|
|
11
|
+
export declare function isAsyncFactoryProvider(provider: unknown): boolean;
|
|
12
|
+
export declare function isCostructorProvider<T extends object>(provider: unknown): provider is Constructor<T>;
|
|
13
|
+
export declare function isPrimitive(provider: unknown): provider is PrimitiveProvider;
|
|
14
|
+
export declare function isPlainFunction(provider: unknown): provider is FunctionProvider;
|
|
15
|
+
export declare function isForwardRef(value: unknown): value is ForwardRef;
|
|
16
|
+
export declare function isPromiseLike<T = unknown>(value: unknown): value is Promise<T>;
|
|
17
|
+
export declare function isEagerProvider(provider: unknown): provider is {
|
|
18
|
+
eager: true;
|
|
19
|
+
};
|
|
20
|
+
export declare function hasProviderInit(value: unknown): value is {
|
|
21
|
+
init: () => void | Promise<void>;
|
|
22
|
+
};
|
|
23
|
+
export declare function hasProviderPostInit(value: unknown): value is {
|
|
24
|
+
postInit: () => void | Promise<void>;
|
|
25
|
+
};
|
|
26
|
+
export declare function hasInitAfter(provider: unknown): provider is {
|
|
27
|
+
initAfter: readonly string[];
|
|
28
|
+
};
|
|
29
|
+
export declare function isResultLike(value: unknown): value is {
|
|
30
|
+
ok: true;
|
|
31
|
+
value: unknown;
|
|
32
|
+
} | {
|
|
33
|
+
ok: false;
|
|
34
|
+
error: unknown;
|
|
35
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export function hasUseClass(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && "useClass" in value;
|
|
3
|
+
}
|
|
4
|
+
export function isFactoryProvider(provider) {
|
|
5
|
+
return (typeof provider === "object" &&
|
|
6
|
+
provider !== null &&
|
|
7
|
+
"useFactory" in provider);
|
|
8
|
+
}
|
|
9
|
+
export function isAsyncFactoryProvider(provider) {
|
|
10
|
+
return (isFactoryProvider(provider) &&
|
|
11
|
+
provider.useFactory.constructor.name === "AsyncFunction");
|
|
12
|
+
}
|
|
13
|
+
export function isCostructorProvider(provider) {
|
|
14
|
+
if (typeof provider !== "function")
|
|
15
|
+
return false;
|
|
16
|
+
if (!("prototype" in provider))
|
|
17
|
+
return false;
|
|
18
|
+
const proto = provider.prototype;
|
|
19
|
+
if (!proto || typeof proto !== "object")
|
|
20
|
+
return false;
|
|
21
|
+
const protoKeys = Object.getOwnPropertyNames(proto);
|
|
22
|
+
if (protoKeys.length === 0 ||
|
|
23
|
+
(protoKeys.length === 1 && protoKeys[0] === "constructor")) {
|
|
24
|
+
return provider.toString().trim().startsWith("class");
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
export function isPrimitive(provider) {
|
|
29
|
+
return (typeof provider === "string" ||
|
|
30
|
+
typeof provider === "number" ||
|
|
31
|
+
typeof provider === "boolean" ||
|
|
32
|
+
typeof provider === "symbol" ||
|
|
33
|
+
typeof provider === "bigint");
|
|
34
|
+
}
|
|
35
|
+
export function isPlainFunction(provider) {
|
|
36
|
+
return (typeof provider === "function" &&
|
|
37
|
+
(!provider.prototype || Object.keys(provider.prototype).length === 0));
|
|
38
|
+
}
|
|
39
|
+
export function isForwardRef(value) {
|
|
40
|
+
return (typeof value === "object" &&
|
|
41
|
+
value !== null &&
|
|
42
|
+
"__forward_ref__" in value &&
|
|
43
|
+
value.__forward_ref__ === true &&
|
|
44
|
+
"resolve" in value &&
|
|
45
|
+
typeof value.resolve === "function");
|
|
46
|
+
}
|
|
47
|
+
export function isPromiseLike(value) {
|
|
48
|
+
return (typeof value === "object" &&
|
|
49
|
+
value !== null &&
|
|
50
|
+
"then" in value &&
|
|
51
|
+
typeof value.then === "function");
|
|
52
|
+
}
|
|
53
|
+
export function isEagerProvider(provider) {
|
|
54
|
+
return (typeof provider === "object" &&
|
|
55
|
+
provider !== null &&
|
|
56
|
+
"eager" in provider &&
|
|
57
|
+
provider.eager === true);
|
|
58
|
+
}
|
|
59
|
+
export function hasProviderInit(value) {
|
|
60
|
+
return (typeof value === "object" &&
|
|
61
|
+
value !== null &&
|
|
62
|
+
"init" in value &&
|
|
63
|
+
typeof value.init === "function");
|
|
64
|
+
}
|
|
65
|
+
export function hasProviderPostInit(value) {
|
|
66
|
+
return (typeof value === "object" &&
|
|
67
|
+
value !== null &&
|
|
68
|
+
"postInit" in value &&
|
|
69
|
+
typeof value.postInit === "function");
|
|
70
|
+
}
|
|
71
|
+
export function hasInitAfter(provider) {
|
|
72
|
+
return (typeof provider === "object" &&
|
|
73
|
+
provider !== null &&
|
|
74
|
+
"initAfter" in provider &&
|
|
75
|
+
Array.isArray(provider.initAfter));
|
|
76
|
+
}
|
|
77
|
+
export function isResultLike(value) {
|
|
78
|
+
return (typeof value === "object" &&
|
|
79
|
+
value !== null &&
|
|
80
|
+
"ok" in value &&
|
|
81
|
+
(value.ok === true
|
|
82
|
+
? "value" in value
|
|
83
|
+
: value.ok === false && "error" in value));
|
|
84
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DecoratorState, DecoratorToken } from "../decorators/decorator-state.types.js";
|
|
2
|
+
import { type HttpVerb } from "./http-verbs.js";
|
|
3
|
+
import type { RouteSchema } from "./openapi-builder.js";
|
|
4
|
+
type MiddlewareParameter = any[] | any;
|
|
5
|
+
type ControllerOptions = string | string[] | {
|
|
6
|
+
path: string | string[];
|
|
7
|
+
};
|
|
8
|
+
interface RootState {
|
|
9
|
+
paths: string[];
|
|
10
|
+
beforeMiddleware: any[];
|
|
11
|
+
afterMiddleware: any[];
|
|
12
|
+
}
|
|
13
|
+
interface MethodState {
|
|
14
|
+
paths: string[];
|
|
15
|
+
beforeMiddleware: any[];
|
|
16
|
+
afterMiddleware: any[];
|
|
17
|
+
verbs: HttpVerb[];
|
|
18
|
+
schema: RouteSchema;
|
|
19
|
+
}
|
|
20
|
+
export interface HttpDecoratorState extends DecoratorState<MethodState, RootState> {
|
|
21
|
+
}
|
|
22
|
+
export declare const HTTP_DECORATOR_STATE_TOKEN: DecoratorToken<HttpDecoratorState>;
|
|
23
|
+
export declare const GET: (path?: string) => (target: any, context: ClassMethodDecoratorContext) => any;
|
|
24
|
+
export declare const POST: (path?: string) => (target: any, context: ClassMethodDecoratorContext) => any;
|
|
25
|
+
export declare const PUT: (path?: string) => (target: any, context: ClassMethodDecoratorContext) => any;
|
|
26
|
+
export declare const DELETE: (path?: string) => (target: any, context: ClassMethodDecoratorContext) => any;
|
|
27
|
+
export declare const PATCH: (path?: string) => (target: any, context: ClassMethodDecoratorContext) => any;
|
|
28
|
+
export declare function controller(options?: ControllerOptions): (target: any, context: ClassDecoratorContext) => any;
|
|
29
|
+
export declare function before(middleware: MiddlewareParameter): (target: any, context: ClassMethodDecoratorContext | ClassDecoratorContext) => any;
|
|
30
|
+
export declare function after(middleware: MiddlewareParameter): (target: any, context: ClassMethodDecoratorContext | ClassDecoratorContext) => any;
|
|
31
|
+
export declare function schema(schema: RouteSchema): (target: any, context: ClassMethodDecoratorContext) => any;
|
|
32
|
+
export declare function rollUpHttpDecoratorState(root: RootState, method: MethodState): MethodState;
|
|
33
|
+
export {};
|