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,54 @@
1
+ import { createHash } from "node:crypto";
2
+ export function forwardRef(getter) {
3
+ return {
4
+ __forward_ref__: true,
5
+ resolve: getter,
6
+ };
7
+ }
8
+ export function createFactoryProvider() {
9
+ return (provider) => {
10
+ return provider;
11
+ };
12
+ }
13
+ export function createModule(module, options) {
14
+ const withOptions = {
15
+ ...module,
16
+ registerControllers: options?.registerControllers ?? true,
17
+ };
18
+ if (options?.hashNameFrom === undefined) {
19
+ return withOptions;
20
+ }
21
+ const hashSource = stableStringify(options.hashNameFrom);
22
+ const hash = createHash("sha256")
23
+ .update(hashSource)
24
+ .digest("hex")
25
+ .slice(0, Math.max(4, options.hashLength ?? 8));
26
+ return {
27
+ ...withOptions,
28
+ name: `${withOptions.name}_${hash}`,
29
+ __devtools: {
30
+ baseName: withOptions.name,
31
+ dynamic: {
32
+ hash,
33
+ paramsPreview: hashSource,
34
+ },
35
+ },
36
+ };
37
+ }
38
+ function stableStringify(value) {
39
+ return JSON.stringify(sortRecursively(value));
40
+ }
41
+ function sortRecursively(value) {
42
+ if (Array.isArray(value)) {
43
+ return value.map(sortRecursively);
44
+ }
45
+ if (value && typeof value === "object") {
46
+ return Object.keys(value)
47
+ .sort()
48
+ .reduce((acc, key) => {
49
+ acc[key] = sortRecursively(value[key]);
50
+ return acc;
51
+ }, {});
52
+ }
53
+ return value;
54
+ }
@@ -0,0 +1,70 @@
1
+ import type { BuildResolverOptions, Constructor } from "awilix";
2
+ import type { EmptyObject } from "../common.types.js";
3
+ import type { AnyInitializer, AnyInterceptor, DefInitializerMap, DefInterceptorMap, DefPreHandlerMap, DefProviderMap, Provider } from "../providers/provider.types.js";
4
+ import type { RawValueObject } from "./module.types.js";
5
+ import type { InternalModuleLike } from "./runtime-module.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,3 @@
1
+ export function overrideModule(module, overrides) {
2
+ return { module, overrides };
3
+ }
@@ -0,0 +1,13 @@
1
+ export type ForwardRef<T = any> = {
2
+ __forward_ref__: true;
3
+ resolve: () => T | Promise<T>;
4
+ };
5
+ declare const moduleRefMarker: unique symbol;
6
+ export type ModuleRef<T> = {
7
+ [moduleRefMarker]: true;
8
+ exports: T extends {
9
+ exports: infer E;
10
+ } ? E : never;
11
+ };
12
+ export type AnyModuleRef = ModuleRef<any>;
13
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,178 @@
1
+ import type { BuildResolverOptions, Constructor, ContainerOptions } from "awilix";
2
+ import type { EmptyObject } from "../common.types.js";
3
+ import type { AnyController, AnyInterceptor, ClassHandler, ClassMiddleware, DefInitializerMap, DefInterceptorMap, DefPreHandlerMap, DefProviderMap, Provider } from "../providers/provider.types.js";
4
+ import type { ForwardRef, ModuleRef } from "./module-ref.types.js";
5
+ import type { InternalModuleLike } from "./runtime-module.types.js";
6
+ declare const importModuleDefMarker: unique symbol;
7
+ export type ImportModule<TDef extends ModuleDefinition = ModuleDefinition> = {
8
+ name: string;
9
+ imports?: readonly unknown[];
10
+ exports?: readonly string[];
11
+ [importModuleDefMarker]?: TDef;
12
+ };
13
+ export type AnyModule = InternalModuleLike & ImportModule<any>;
14
+ export type ModuleImport = AnyModule | Promise<AnyModule> | ModuleRef<any>;
15
+ export type ModuleDefinition = {
16
+ providers?: DefProviderMap;
17
+ exports?: DefProviderMap;
18
+ imports?: ModuleImport[];
19
+ queryHandlers?: readonly any[];
20
+ commandHandlers?: readonly any[];
21
+ queryPreHandlers?: DefPreHandlerMap;
22
+ commandPreHandlers?: DefPreHandlerMap;
23
+ interceptors?: DefInterceptorMap;
24
+ initializers?: DefInitializerMap;
25
+ exportKeys?: readonly string[];
26
+ queryPreHandlerExportKeys?: readonly string[];
27
+ commandPreHandlerExportKeys?: readonly string[];
28
+ interceptorExportKeys?: readonly string[];
29
+ initializerExportKeys?: readonly string[];
30
+ };
31
+ type NormalizeModuleDef<Def extends ModuleDefinition> = {
32
+ deps: Def extends {
33
+ deps: infer D extends Record<string, unknown>;
34
+ } ? D : Record<string, unknown>;
35
+ providers: Def["providers"] extends DefProviderMap ? Def["providers"] : EmptyObject;
36
+ exports: Def["exports"] extends DefProviderMap ? Def["exports"] : EmptyObject;
37
+ imports: Def["imports"] extends readonly unknown[] ? Def["imports"] : readonly [];
38
+ queryHandlers: Def["queryHandlers"] extends readonly any[] ? Def["queryHandlers"] : readonly [];
39
+ commandHandlers: Def["commandHandlers"] extends readonly any[] ? Def["commandHandlers"] : readonly [];
40
+ queryPreHandlers: Def["queryPreHandlers"] extends DefPreHandlerMap ? Def["queryPreHandlers"] : EmptyObject;
41
+ commandPreHandlers: Def["commandPreHandlers"] extends DefPreHandlerMap ? Def["commandPreHandlers"] : EmptyObject;
42
+ initializers: Def["initializers"] extends DefInitializerMap ? Def["initializers"] : EmptyObject;
43
+ interceptors: Def["interceptors"] extends DefInterceptorMap ? Def["interceptors"] : EmptyObject;
44
+ exportKeys: Def["exportKeys"] extends readonly string[] ? Def["exportKeys"] : readonly [];
45
+ queryPreHandlerExportKeys: Def["queryPreHandlerExportKeys"] extends readonly string[] ? Def["queryPreHandlerExportKeys"] : readonly [];
46
+ commandPreHandlerExportKeys: Def["commandPreHandlerExportKeys"] extends readonly string[] ? Def["commandPreHandlerExportKeys"] : readonly [];
47
+ initializerExportKeys: Def["initializerExportKeys"] extends readonly string[] ? Def["initializerExportKeys"] : readonly [];
48
+ interceptorExportKeys: Def["interceptorExportKeys"] extends readonly string[] ? Def["interceptorExportKeys"] : readonly [];
49
+ };
50
+ export type Module<Def extends ModuleDefinition> = {
51
+ name: string;
52
+ controllers?: AnyController[];
53
+ containerOptions?: ContainerOptions;
54
+ providerOptions?: Partial<BuildResolverOptions<any>>;
55
+ [importModuleDefMarker]?: Def;
56
+ } & ModuleFromNormalized<NormalizeModuleDef<Def>>;
57
+ type ModuleFromNormalized<Def extends {
58
+ deps: Record<string, unknown>;
59
+ providers: DefProviderMap | EmptyObject;
60
+ exports: DefProviderMap | EmptyObject;
61
+ imports: readonly unknown[];
62
+ queryHandlers: readonly any[];
63
+ commandHandlers: readonly any[];
64
+ interceptors: DefInterceptorMap | EmptyObject;
65
+ initializers: DefInitializerMap | EmptyObject;
66
+ queryPreHandlers: DefPreHandlerMap | EmptyObject;
67
+ commandPreHandlers: DefPreHandlerMap | EmptyObject;
68
+ exportKeys: readonly string[];
69
+ queryPreHandlerExportKeys: readonly string[];
70
+ commandPreHandlerExportKeys: readonly string[];
71
+ initializerExportKeys: readonly string[];
72
+ interceptorExportKeys: readonly string[];
73
+ }> = WithProviders<Def["providers"], Def["deps"]> & WithImports<Def["imports"]> & WithQueryHandlers<Def["queryHandlers"]> & WithCommandHandlers<Def["commandHandlers"]> & WithQueryPreHandlers<Def["queryPreHandlers"]> & WithCommandPreHandlers<Def["commandPreHandlers"]> & WithInitializers<Def["initializers"]> & WithInterceptors<Def["interceptors"]> & WithExports<Def["exportKeys"]> & WithQueryPreHandlerExports<Def["queryPreHandlerExportKeys"]> & WithCommandPreHandlerExports<Def["commandPreHandlerExportKeys"]> & WithInitializerExports<Def["initializerExportKeys"]> & WithInterceptorExports<Def["interceptorExportKeys"]>;
74
+ type WithProviders<TProviders extends DefProviderMap | EmptyObject, TDeps extends Record<string, unknown>> = TProviders extends EmptyObject ? {
75
+ providers?: EmptyObject;
76
+ } : {
77
+ providers: ToModuleProviderMap<TProviders, TDeps>;
78
+ };
79
+ type WithExports<TKeys extends readonly string[]> = TKeys extends readonly [] ? {
80
+ exports?: readonly [];
81
+ } : {
82
+ exports: TKeys;
83
+ };
84
+ type ToModuleProviderMap<T extends DefProviderMap, DepsMap extends Record<string, unknown> = Record<string, unknown>> = [keyof T] extends [never] ? EmptyObject : {
85
+ [K in keyof T]: T[K] extends object ? (Provider<T[K], DepsMap> & {
86
+ initAfter?: readonly Extract<keyof DepsMap, string>[];
87
+ }) | RawValueObject<T[K]> : T[K];
88
+ };
89
+ export type RawValueObject<T> = T & {
90
+ useClass?: never;
91
+ useFactory?: never;
92
+ lifetime?: never;
93
+ allowCircular?: never;
94
+ eager?: never;
95
+ initAfter?: never;
96
+ };
97
+ type WithQueryHandlers<THandlers extends readonly any[]> = THandlers extends readonly [] ? {
98
+ queryHandlers?: readonly [];
99
+ } : {
100
+ queryHandlers: ToModuleHandlerArray<THandlers>;
101
+ };
102
+ type WithCommandHandlers<THandlers extends readonly any[]> = THandlers extends readonly [] ? {
103
+ commandHandlers?: readonly [];
104
+ } : {
105
+ commandHandlers: ToModuleHandlerArray<THandlers>;
106
+ };
107
+ type ToModuleHandlerArray<T extends readonly any[]> = T extends readonly [] ? readonly [] : {
108
+ readonly [K in keyof T]: Constructor<T[K]> | ClassHandler<Constructor<T[K]>>;
109
+ };
110
+ type ToModulePreHandlerMap<T extends DefPreHandlerMap> = [keyof T] extends [
111
+ never
112
+ ] ? EmptyObject : {
113
+ [K in keyof T]: Constructor<T[K]> | ClassMiddleware<Constructor<T[K]>>;
114
+ };
115
+ type WithQueryPreHandlers<TPreHandlers extends DefPreHandlerMap | EmptyObject> = TPreHandlers extends EmptyObject ? {
116
+ queryPreHandlers?: EmptyObject;
117
+ } : {
118
+ queryPreHandlers: ToModulePreHandlerMap<TPreHandlers>;
119
+ };
120
+ type WithCommandPreHandlers<TPreHandlers extends DefPreHandlerMap | EmptyObject> = TPreHandlers extends EmptyObject ? {
121
+ commandPreHandlers?: EmptyObject;
122
+ } : {
123
+ commandPreHandlers: ToModulePreHandlerMap<TPreHandlers>;
124
+ };
125
+ type WithQueryPreHandlerExports<TKeys extends readonly string[]> = TKeys extends readonly [] ? {
126
+ queryPreHandlerExports?: readonly [];
127
+ } : {
128
+ queryPreHandlerExports: TKeys;
129
+ };
130
+ type WithCommandPreHandlerExports<TKeys extends readonly string[]> = TKeys extends readonly [] ? {
131
+ commandPreHandlerExports?: readonly [];
132
+ } : {
133
+ commandPreHandlerExports: TKeys;
134
+ };
135
+ type WithInitializers<TInitializers extends DefInitializerMap | EmptyObject> = TInitializers extends EmptyObject ? {
136
+ initializers?: EmptyObject;
137
+ } : {
138
+ initializers: TInitializers;
139
+ };
140
+ type WithInitializerExports<TKeys extends readonly string[]> = TKeys extends readonly [] ? {
141
+ initializerExports?: readonly [];
142
+ } : {
143
+ initializerExports: TKeys;
144
+ };
145
+ type ToModuleInterceptorMap<T extends DefInterceptorMap> = [keyof T] extends [
146
+ never
147
+ ] ? EmptyObject : {
148
+ [K in keyof T]: AnyInterceptor;
149
+ };
150
+ type WithInterceptors<TInterceptors extends DefInterceptorMap | EmptyObject> = TInterceptors extends EmptyObject ? {
151
+ interceptors?: EmptyObject;
152
+ } : {
153
+ interceptors: ToModuleInterceptorMap<TInterceptors>;
154
+ };
155
+ type WithInterceptorExports<TKeys extends readonly string[]> = TKeys extends readonly [] ? {
156
+ interceptorExports?: readonly [];
157
+ } : {
158
+ interceptorExports: TKeys;
159
+ };
160
+ type WithImports<TImports extends readonly unknown[]> = 0 extends 1 & TImports ? {
161
+ imports?: (AnyModule | Promise<AnyModule> | ForwardRef)[];
162
+ } : TImports extends readonly [] ? {
163
+ imports?: [];
164
+ } : {
165
+ imports: WithForwardRefImports<TImports>;
166
+ };
167
+ type WithForwardRefImports<T extends readonly unknown[]> = {
168
+ [K in keyof T]: T[K] extends ModuleRef<infer MDef> ? ForwardRef<ForwardRefModule<MDef>> : Awaited<T[K]> extends ImportModule<any> ? T[K] : T[K];
169
+ };
170
+ type ForwardRefModule<MDef> = MDef extends {
171
+ exports: infer E extends DefProviderMap;
172
+ providers: infer P extends DefProviderMap;
173
+ } ? {
174
+ name: string;
175
+ exports: readonly Extract<keyof E, string>[];
176
+ providers: ToModuleProviderMap<P, any>;
177
+ } : AnyModule;
178
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
1
+ import type { BuildResolverOptions, ContainerOptions } from "awilix";
2
+ import type { AnyController, AnyInitializer, AnyInterceptor, AnyMiddleware, AnyProvider } from "../providers/provider.types.js";
3
+ import type { ForwardRef } from "./module-ref.types.js";
4
+ export interface InternalModuleLike {
5
+ name: string;
6
+ __devtools?: {
7
+ baseName?: string;
8
+ dynamic?: {
9
+ hash: string;
10
+ paramsPreview: string;
11
+ };
12
+ };
13
+ imports?: readonly (InternalModuleLike | Promise<InternalModuleLike> | ForwardRef<InternalModuleLike>)[];
14
+ providers?: Record<string, AnyProvider>;
15
+ exports?: readonly string[];
16
+ components?: Record<string, (...args: any[]) => unknown>;
17
+ componentExports?: readonly string[];
18
+ controllers?: AnyController[];
19
+ registerControllers?: boolean;
20
+ containerOptions?: ContainerOptions;
21
+ providerOptions?: Partial<BuildResolverOptions<any>>;
22
+ queryHandlers?: readonly any[];
23
+ commandHandlers?: readonly any[];
24
+ queryPreHandlers?: Record<string, AnyMiddleware>;
25
+ commandPreHandlers?: Record<string, AnyMiddleware>;
26
+ queryPreHandlerExports?: readonly string[];
27
+ commandPreHandlerExports?: readonly string[];
28
+ interceptors?: Record<string, AnyInterceptor>;
29
+ interceptorExports?: readonly string[];
30
+ initializers?: Record<string, AnyInitializer>;
31
+ initializerExports?: readonly string[];
32
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import * as Awilix from "awilix";
2
+ import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
3
+ import type { ControllerRuntimeEntry } from "./initializer-processor.js";
4
+ import type { InterceptorProcessor } from "./interceptor-processor.js";
5
+ export declare class ControllerProcessor {
6
+ private readonly interceptorProcessor;
7
+ private readonly providerOptions;
8
+ private readonly skipRegisterRoutes;
9
+ private readonly registeredControllers;
10
+ constructor(interceptorProcessor: InterceptorProcessor, providerOptions: Partial<Awilix.BuildResolverOptions<any>>, skipRegisterRoutes: boolean);
11
+ processControllers(m: M, diScope: Awilix.AwilixContainer): ControllerRuntimeEntry[];
12
+ private resolveBySymbol;
13
+ }
@@ -0,0 +1,76 @@
1
+ import * as Awilix from "awilix";
2
+ import * as ERRORS from "../errors.js";
3
+ import { resolveFromRequestScope } from "../request-scope-context.js";
4
+ import { hasUseClass } from "../type-guards.js";
5
+ export class ControllerProcessor {
6
+ interceptorProcessor;
7
+ providerOptions;
8
+ skipRegisterRoutes;
9
+ registeredControllers = new WeakMap();
10
+ constructor(interceptorProcessor, providerOptions, skipRegisterRoutes) {
11
+ this.interceptorProcessor = interceptorProcessor;
12
+ this.providerOptions = providerOptions;
13
+ this.skipRegisterRoutes = skipRegisterRoutes;
14
+ }
15
+ processControllers(m, diScope) {
16
+ if (!m.controllers?.length)
17
+ return [];
18
+ if (m.registerControllers === false)
19
+ return [];
20
+ const runtimeEntries = [];
21
+ if (new Set(m.controllers).size !== m.controllers.length) {
22
+ throw new ERRORS.DuplicateControllersInModuleError(m.name);
23
+ }
24
+ for (const c of m.controllers) {
25
+ const { useClass, ...awilixOptions } = hasUseClass(c)
26
+ ? c
27
+ : { useClass: c };
28
+ const existingModule = this.registeredControllers.get(useClass);
29
+ if (!existingModule) {
30
+ this.registeredControllers.set(useClass, m);
31
+ const controllerSymbol = Symbol(`controller_${useClass.name}`);
32
+ const options = {
33
+ ...this.providerOptions,
34
+ ...m.providerOptions,
35
+ ...awilixOptions,
36
+ };
37
+ const isWithNewScope = options.lifetime !== Awilix.Lifetime.SINGLETON;
38
+ const baseResolver = Awilix.asClass(useClass, {
39
+ ...options,
40
+ ...(isWithNewScope && {
41
+ injector: () => ({
42
+ resolveSelf: () => this.resolveBySymbol(controllerSymbol, diScope, isWithNewScope),
43
+ }),
44
+ }),
45
+ });
46
+ diScope.register({
47
+ [controllerSymbol]: this.interceptorProcessor.createInterceptedProviderResolver({
48
+ module: m,
49
+ useClass,
50
+ options,
51
+ resolver: baseResolver,
52
+ }),
53
+ });
54
+ if (!this.skipRegisterRoutes &&
55
+ typeof useClass.prototype.registerRoutes === "function") {
56
+ baseResolver.resolve(diScope).registerRoutes();
57
+ }
58
+ runtimeEntries.push({
59
+ controllerClass: useClass,
60
+ resolve: () => this.resolveBySymbol(controllerSymbol, diScope, isWithNewScope),
61
+ });
62
+ continue;
63
+ }
64
+ if (existingModule === m) {
65
+ continue;
66
+ }
67
+ throw new ERRORS.ControllerAlreadyRegisteredError(useClass.name, existingModule.name);
68
+ }
69
+ return runtimeEntries;
70
+ }
71
+ resolveBySymbol(symbol, scope, withNewScope) {
72
+ if (withNewScope)
73
+ return resolveFromRequestScope(scope, symbol);
74
+ return scope.resolve(symbol);
75
+ }
76
+ }
@@ -0,0 +1,19 @@
1
+ import * as Awilix from "awilix";
2
+ import type { DevtoolsProcessorRef } from "../../devtools/devtools.types.js";
3
+ import type { RegisteredModuleScope } from "../contexts/container-context-base.js";
4
+ import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
5
+ export declare const HandlerType: {
6
+ readonly Query: "query";
7
+ readonly Command: "command";
8
+ };
9
+ export type HandlerType = (typeof HandlerType)[keyof typeof HandlerType];
10
+ export declare class HandlerProcessor {
11
+ private readonly providerOptions;
12
+ private readonly devtoolsProcessorRef;
13
+ private readonly keyedFeatureRegistrar;
14
+ private static readonly handlerConfig;
15
+ constructor(providerOptions: Partial<Awilix.BuildResolverOptions<any>>, devtoolsProcessorRef: DevtoolsProcessorRef);
16
+ processHandlers(m: M, scope: Awilix.AwilixContainer, importedModulesWithScope: RegisteredModuleScope[], handlerType: HandlerType): void;
17
+ private createTracedHandlerResolver;
18
+ private get devtoolsTracer();
19
+ }
@@ -0,0 +1,103 @@
1
+ import * as Awilix from "awilix";
2
+ import { Mediator } from "../../mediator/mediator.js";
3
+ import * as ERRORS from "../errors.js";
4
+ import { ProviderResolver } from "../providers/provider-resolver.js";
5
+ import { getOrCreateRequestScope } from "../request-scope-context.js";
6
+ import { hasUseClass } from "../type-guards.js";
7
+ import { KeyedFeatureRegistrar } from "./keyed-feature-registrar.js";
8
+ export const HandlerType = {
9
+ Query: "query",
10
+ Command: "command",
11
+ };
12
+ export class HandlerProcessor {
13
+ providerOptions;
14
+ devtoolsProcessorRef;
15
+ keyedFeatureRegistrar;
16
+ static handlerConfig = {
17
+ query: {
18
+ handlersKey: "queryHandlers",
19
+ preHandlersKey: "queryPreHandlers",
20
+ mediatorKey: "queryMediator",
21
+ },
22
+ command: {
23
+ handlersKey: "commandHandlers",
24
+ preHandlersKey: "commandPreHandlers",
25
+ mediatorKey: "commandMediator",
26
+ },
27
+ };
28
+ constructor(providerOptions, devtoolsProcessorRef) {
29
+ this.providerOptions = providerOptions;
30
+ this.devtoolsProcessorRef = devtoolsProcessorRef;
31
+ this.keyedFeatureRegistrar = new KeyedFeatureRegistrar(providerOptions);
32
+ }
33
+ processHandlers(m, scope, importedModulesWithScope, handlerType) {
34
+ const { handlersKey, mediatorKey, preHandlersKey } = HandlerProcessor.handlerConfig[handlerType];
35
+ const middlewareResolvers = this.keyedFeatureRegistrar.register({
36
+ featureKind: preHandlersKey,
37
+ module: m,
38
+ scope,
39
+ importedModulesWithScope,
40
+ });
41
+ const handlers = m[handlersKey];
42
+ if (!handlers?.length)
43
+ return;
44
+ const mediator = new Mediator(middlewareResolvers, m.name, handlerType, this.devtoolsProcessorRef);
45
+ for (const h of handlers) {
46
+ const { useClass: HandlerClass, ...handlerOptions } = hasUseClass(h)
47
+ ? h
48
+ : { useClass: h };
49
+ const handlerKey = HandlerClass.key;
50
+ if (typeof handlerKey !== "string" || !handlerKey.length) {
51
+ throw new ERRORS.HandlerMissingStaticKeyError(HandlerClass.name);
52
+ }
53
+ const options = ProviderResolver.mergeResolverOptions(m, this.providerOptions, handlerOptions);
54
+ const handlerSymbol = Symbol(`${handlerKey}_${HandlerClass.name}`);
55
+ const handlerResolver = Awilix.asClass(HandlerClass, options);
56
+ scope.register({
57
+ [handlerSymbol]: this.createTracedHandlerResolver({
58
+ handlerClassName: HandlerClass.name,
59
+ module: m,
60
+ options,
61
+ resolver: handlerResolver,
62
+ }),
63
+ });
64
+ mediator.register(handlerKey, async (payload, context) => {
65
+ const requestScope = options.lifetime === Awilix.Lifetime.SINGLETON
66
+ ? scope
67
+ : getOrCreateRequestScope(scope);
68
+ if (!this.devtoolsTracer) {
69
+ return requestScope
70
+ .resolve(handlerSymbol)
71
+ .executor(payload, context);
72
+ }
73
+ return this.devtoolsTracer.recordSpan({
74
+ kind: "handler",
75
+ moduleName: m.name,
76
+ providerKey: `${handlerType}:${handlerKey}`,
77
+ methodName: "executor",
78
+ args: [payload, context],
79
+ callback: () => requestScope
80
+ .resolve(handlerSymbol)
81
+ .executor(payload, context),
82
+ });
83
+ });
84
+ }
85
+ scope.register({
86
+ [mediatorKey]: Awilix.asValue(mediator),
87
+ });
88
+ }
89
+ createTracedHandlerResolver({ handlerClassName, module, options, resolver, }) {
90
+ if (!this.devtoolsTracer)
91
+ return resolver;
92
+ return this.devtoolsTracer.wrapResolver({
93
+ kind: "handler",
94
+ module,
95
+ options,
96
+ providerKey: handlerClassName,
97
+ resolver,
98
+ });
99
+ }
100
+ get devtoolsTracer() {
101
+ return this.devtoolsProcessorRef.current?.tracer;
102
+ }
103
+ }
@@ -0,0 +1,20 @@
1
+ import type * as Awilix from "awilix";
2
+ import type { DevtoolsProcessorRef } from "../../devtools/devtools.types.js";
3
+ import type { RegisteredModuleScope } from "../contexts/container-context-base.js";
4
+ import type { InternalModuleLike as M } from "../modules/runtime-module.types.js";
5
+ import type { ConstructorController } from "../providers/provider.types.js";
6
+ import type { ModuleInitOptions } from "./lifecycle-processor.js";
7
+ export type ControllerRuntimeEntry = {
8
+ controllerClass: ConstructorController;
9
+ resolve: () => any;
10
+ };
11
+ export type InitializerTask = (options?: ModuleInitOptions) => Promise<void>;
12
+ export declare class InitializerProcessor {
13
+ private readonly devtoolsProcessorRef;
14
+ private readonly keyedFeatureRegistrar;
15
+ private readonly resolversByModule;
16
+ constructor(devtoolsProcessorRef: DevtoolsProcessorRef);
17
+ collectInitializers(m: M, scope: Awilix.AwilixContainer, importedModulesWithScope: RegisteredModuleScope[], controllers: ControllerRuntimeEntry[]): InitializerTask | null;
18
+ private ensureNoMultiInvokableInitializersPerMethod;
19
+ private filterActiveInitializers;
20
+ }