@noego/ioc 0.0.5 → 0.0.7

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 (116) hide show
  1. package/dist/cjs/framework/decorators/Component.d.ts +10 -0
  2. package/dist/cjs/framework/decorators/Component.js +25 -0
  3. package/dist/cjs/framework/decorators/Component.js.map +1 -0
  4. package/dist/cjs/framework/decorators/Inject.d.ts +7 -0
  5. package/dist/cjs/framework/decorators/Inject.js +22 -0
  6. package/dist/cjs/framework/decorators/Inject.js.map +1 -0
  7. package/dist/cjs/framework/decorators/index.d.ts +3 -0
  8. package/dist/cjs/framework/decorators/index.js +24 -0
  9. package/dist/cjs/framework/decorators/index.js.map +1 -0
  10. package/dist/cjs/framework/decorators/metadataKeys.d.ts +3 -0
  11. package/dist/cjs/framework/decorators/metadataKeys.js +8 -0
  12. package/dist/cjs/framework/decorators/metadataKeys.js.map +1 -0
  13. package/dist/cjs/framework/errors/ContainerErrors.d.ts +33 -0
  14. package/dist/cjs/framework/errors/ContainerErrors.js +52 -0
  15. package/dist/cjs/framework/errors/ContainerErrors.js.map +1 -0
  16. package/dist/cjs/framework/implementation/Container.d.ts +31 -0
  17. package/dist/cjs/framework/implementation/Container.js +448 -0
  18. package/dist/cjs/framework/implementation/Container.js.map +1 -0
  19. package/dist/cjs/framework/implementation/Container.test.d.ts +1 -0
  20. package/dist/cjs/framework/implementation/Container.test.js +184 -0
  21. package/dist/cjs/framework/implementation/Container.test.js.map +1 -0
  22. package/dist/cjs/framework/implementation/ContainerAsync.test.d.ts +1 -0
  23. package/dist/cjs/framework/implementation/ContainerAsync.test.js +178 -0
  24. package/dist/cjs/framework/implementation/ContainerAsync.test.js.map +1 -0
  25. package/dist/cjs/framework/implementation/ContainerBasic.test.d.ts +1 -0
  26. package/dist/cjs/framework/implementation/ContainerBasic.test.js +101 -0
  27. package/dist/cjs/framework/implementation/ContainerBasic.test.js.map +1 -0
  28. package/dist/cjs/framework/implementation/ContainerDecorators.test.d.ts +1 -0
  29. package/dist/cjs/framework/implementation/ContainerDecorators.test.js +517 -0
  30. package/dist/cjs/framework/implementation/ContainerDecorators.test.js.map +1 -0
  31. package/dist/cjs/framework/implementation/ContainerExtension.test.d.ts +1 -0
  32. package/dist/cjs/framework/implementation/ContainerExtension.test.js +169 -0
  33. package/dist/cjs/framework/implementation/ContainerExtension.test.js.map +1 -0
  34. package/dist/cjs/framework/implementation/ContainerLifetimes.test.d.ts +1 -0
  35. package/dist/cjs/framework/implementation/ContainerLifetimes.test.js +154 -0
  36. package/dist/cjs/framework/implementation/ContainerLifetimes.test.js.map +1 -0
  37. package/dist/cjs/framework/implementation/DecoratorSupport.d.ts +31 -0
  38. package/dist/cjs/framework/implementation/DecoratorSupport.js +96 -0
  39. package/dist/cjs/framework/implementation/DecoratorSupport.js.map +1 -0
  40. package/dist/cjs/framework/implementation/LoadAs.d.ts +5 -0
  41. package/dist/cjs/framework/implementation/LoadAs.js +10 -0
  42. package/dist/cjs/framework/implementation/LoadAs.js.map +1 -0
  43. package/dist/cjs/framework/implementation/Parameter.d.ts +33 -0
  44. package/dist/cjs/framework/implementation/Parameter.js +87 -0
  45. package/dist/cjs/framework/implementation/Parameter.js.map +1 -0
  46. package/dist/cjs/framework/implementation/Parameter.test.d.ts +1 -0
  47. package/dist/cjs/framework/implementation/Parameter.test.js +19 -0
  48. package/dist/cjs/framework/implementation/Parameter.test.js.map +1 -0
  49. package/dist/cjs/framework/implementation/SimpleDecoratorTest.test.d.ts +1 -0
  50. package/dist/cjs/framework/implementation/SimpleDecoratorTest.test.js +78 -0
  51. package/dist/cjs/framework/implementation/SimpleDecoratorTest.test.js.map +1 -0
  52. package/dist/cjs/framework/implementation/SingletonTest.test.d.ts +1 -0
  53. package/dist/cjs/framework/implementation/SingletonTest.test.js +85 -0
  54. package/dist/cjs/framework/implementation/SingletonTest.test.js.map +1 -0
  55. package/dist/cjs/framework/interface/Container.d.ts +22 -0
  56. package/dist/cjs/framework/interface/Container.js +3 -0
  57. package/dist/cjs/framework/interface/Container.js.map +1 -0
  58. package/dist/esm/framework/decorators/Component.d.ts +10 -0
  59. package/dist/esm/framework/decorators/Component.js +21 -0
  60. package/dist/esm/framework/decorators/Component.js.map +1 -0
  61. package/dist/esm/framework/decorators/Inject.d.ts +7 -0
  62. package/dist/esm/framework/decorators/Inject.js +19 -0
  63. package/dist/esm/framework/decorators/Inject.js.map +1 -0
  64. package/dist/esm/framework/decorators/index.d.ts +3 -0
  65. package/dist/esm/framework/decorators/index.js +5 -0
  66. package/dist/esm/framework/decorators/index.js.map +1 -0
  67. package/dist/esm/framework/decorators/metadataKeys.d.ts +3 -0
  68. package/dist/esm/framework/decorators/metadataKeys.js +5 -0
  69. package/dist/esm/framework/decorators/metadataKeys.js.map +1 -0
  70. package/dist/esm/framework/errors/ContainerErrors.d.ts +33 -0
  71. package/dist/esm/framework/errors/ContainerErrors.js +44 -0
  72. package/dist/esm/framework/errors/ContainerErrors.js.map +1 -0
  73. package/dist/esm/framework/implementation/Container.d.ts +31 -0
  74. package/dist/esm/framework/implementation/Container.js +432 -0
  75. package/dist/esm/framework/implementation/Container.js.map +1 -0
  76. package/dist/esm/framework/implementation/Container.test.d.ts +1 -0
  77. package/dist/esm/framework/implementation/Container.test.js +173 -0
  78. package/dist/esm/framework/implementation/Container.test.js.map +1 -0
  79. package/dist/esm/framework/implementation/ContainerAsync.test.d.ts +1 -0
  80. package/dist/esm/framework/implementation/ContainerAsync.test.js +151 -0
  81. package/dist/esm/framework/implementation/ContainerAsync.test.js.map +1 -0
  82. package/dist/esm/framework/implementation/ContainerBasic.test.d.ts +1 -0
  83. package/dist/esm/framework/implementation/ContainerBasic.test.js +90 -0
  84. package/dist/esm/framework/implementation/ContainerBasic.test.js.map +1 -0
  85. package/dist/esm/framework/implementation/ContainerDecorators.test.d.ts +1 -0
  86. package/dist/esm/framework/implementation/ContainerDecorators.test.js +498 -0
  87. package/dist/esm/framework/implementation/ContainerDecorators.test.js.map +1 -0
  88. package/dist/esm/framework/implementation/ContainerExtension.test.d.ts +1 -0
  89. package/dist/esm/framework/implementation/ContainerExtension.test.js +158 -0
  90. package/dist/esm/framework/implementation/ContainerExtension.test.js.map +1 -0
  91. package/dist/esm/framework/implementation/ContainerLifetimes.test.d.ts +1 -0
  92. package/dist/esm/framework/implementation/ContainerLifetimes.test.js +143 -0
  93. package/dist/esm/framework/implementation/ContainerLifetimes.test.js.map +1 -0
  94. package/dist/esm/framework/implementation/DecoratorSupport.d.ts +31 -0
  95. package/dist/esm/framework/implementation/DecoratorSupport.js +87 -0
  96. package/dist/esm/framework/implementation/DecoratorSupport.js.map +1 -0
  97. package/dist/esm/framework/implementation/LoadAs.d.ts +5 -0
  98. package/dist/esm/framework/implementation/LoadAs.js +7 -0
  99. package/dist/esm/framework/implementation/LoadAs.js.map +1 -0
  100. package/dist/esm/framework/implementation/Parameter.d.ts +33 -0
  101. package/dist/esm/framework/implementation/Parameter.js +49 -0
  102. package/dist/esm/framework/implementation/Parameter.js.map +1 -0
  103. package/dist/esm/framework/implementation/Parameter.test.d.ts +1 -0
  104. package/dist/esm/framework/implementation/Parameter.test.js +17 -0
  105. package/dist/esm/framework/implementation/Parameter.test.js.map +1 -0
  106. package/dist/esm/framework/implementation/SimpleDecoratorTest.test.d.ts +1 -0
  107. package/dist/esm/framework/implementation/SimpleDecoratorTest.test.js +67 -0
  108. package/dist/esm/framework/implementation/SimpleDecoratorTest.test.js.map +1 -0
  109. package/dist/esm/framework/implementation/SingletonTest.test.d.ts +1 -0
  110. package/dist/esm/framework/implementation/SingletonTest.test.js +74 -0
  111. package/dist/esm/framework/implementation/SingletonTest.test.js.map +1 -0
  112. package/dist/esm/framework/interface/Container.d.ts +22 -0
  113. package/dist/esm/framework/interface/Container.js +2 -0
  114. package/dist/esm/framework/interface/Container.js.map +1 -0
  115. package/package.json +11 -1
  116. package/readme.md +9 -0
@@ -0,0 +1,432 @@
1
+ import 'reflect-metadata'; // Ensure polyfill is loaded conceptually
2
+ import { LoadAs } from "./LoadAs";
3
+ import { Parameter } from "./Parameter";
4
+ import { NotAClassDefinitionError, ParameterNotFoundError, DependencyNotFoundError, InstanceNotCreatedError, CircularDependencyError } from "../errors/ContainerErrors";
5
+ import { getScope, getComponentOptions, // Use helper
6
+ getResolvedDependencies // Use helper
7
+ } from './DecoratorSupport'; // Assume helpers exist or create them
8
+ var ContainerRouting;
9
+ (function (ContainerRouting) {
10
+ ContainerRouting["FUNCTIONAL"] = "FUNCTIONAL";
11
+ ContainerRouting["CLASS"] = "CLASS";
12
+ // No need for COMPONENT route, just check metadata if CLASS/FUNCTIONAL fails
13
+ })(ContainerRouting || (ContainerRouting = {}));
14
+ export class Container {
15
+ constructor() {
16
+ // Routing and definition maps
17
+ this._routing = new Map();
18
+ this._functionDefinition = new Map();
19
+ this._classDefinition = new Map();
20
+ // Storage maps
21
+ this._functionStorageSingleton = new Map();
22
+ this._functionStorageScoped = new Map();
23
+ this._classStorageSingleton = new Map();
24
+ this._classStorageScoped = new Map();
25
+ }
26
+ // Registration methods
27
+ registerClass(classDefinition, options) {
28
+ // Basic validation
29
+ if (typeof classDefinition !== 'function' || !classDefinition.prototype) {
30
+ console.warn(`[IOC] Attempted to register non-class: ${String(classDefinition)}`);
31
+ // Optional: throw error instead?
32
+ // throw new NotAClassDefinitionError(`Attempted to register non-class: ${String(classDefinition)}`);
33
+ return; // Don't proceed if not a class constructor
34
+ }
35
+ // Always clear previous definitions for this exact class constructor
36
+ this.clearDefinitions(classDefinition);
37
+ // Always set the routing type so 'isClassDefinition' works
38
+ this._routing.set(classDefinition, ContainerRouting.CLASS);
39
+ // Store manual options *only if they are actually provided and have content*
40
+ if (options && Object.keys(options).length > 0) {
41
+ this._classDefinition.set(classDefinition, options);
42
+ // console.log(`[IOC RegClass] Manually registered ${classDefinition.name} with options:`, options);
43
+ }
44
+ else {
45
+ // console.log(`[IOC RegClass] Manually registered ${classDefinition.name} with no specific options (will use decorators if present).`);
46
+ // If no options are provided, we don't store anything in _classDefinition,
47
+ // effectively clearing any previous manual config and letting decorators take over if present.
48
+ }
49
+ }
50
+ registerFunction(label, func, options = {}) {
51
+ this.clearDefinitions(label);
52
+ this._routing.set(label, ContainerRouting.FUNCTIONAL);
53
+ this._functionDefinition.set(label, { function: func, options });
54
+ // console.log(`[IOC RegFunc] Registered function with label ${String(label)} and options:`, options);
55
+ }
56
+ // Instance resolution methods - Simplify to just call loadInstance
57
+ instance(classDefinition, params = []) {
58
+ // Basic check upfront
59
+ if (typeof classDefinition !== 'function' || !classDefinition.prototype) {
60
+ throw new NotAClassDefinitionError(`Cannot resolve instance for non-class: ${String(classDefinition)}`);
61
+ }
62
+ return this.loadInstance(classDefinition, params);
63
+ }
64
+ get(label, param = []) {
65
+ // Just delegate to loadInstance, which handles routing and auto-registration
66
+ return this.loadInstance(label, param);
67
+ }
68
+ extend() {
69
+ const childContainer = createContainer();
70
+ // Copy routing and definition maps (share the registration knowledge)
71
+ childContainer._routing = new Map(this._routing);
72
+ childContainer._functionDefinition = new Map(this._functionDefinition);
73
+ childContainer._classDefinition = new Map(this._classDefinition);
74
+ // Share singleton storage (singletons are shared across all containers)
75
+ childContainer._functionStorageSingleton = this._functionStorageSingleton;
76
+ childContainer._classStorageSingleton = this._classStorageSingleton;
77
+ // Do NOT share scoped storage (new container = new scope)
78
+ // Child gets its own empty scoped storage
79
+ // console.log('[IOC Extend] Created child container.');
80
+ return childContainer;
81
+ }
82
+ // Private helper methods
83
+ clearDefinitions(label) {
84
+ this._routing.delete(label);
85
+ this._functionDefinition.delete(label);
86
+ // Only delete from classDefinition if the label is actually a function constructor
87
+ if (typeof label === 'function') {
88
+ this._classDefinition.delete(label);
89
+ }
90
+ }
91
+ // Checks if the label is *currently* registered as a class
92
+ isRegisteredAsClass(label) {
93
+ return this._routing.get(label) === ContainerRouting.CLASS;
94
+ }
95
+ // Checks if the label is *currently* registered as a function
96
+ isRegisteredAsFunction(label) {
97
+ return this._routing.get(label) === ContainerRouting.FUNCTIONAL;
98
+ }
99
+ hasInstance(label) {
100
+ const storageType = this.getStorageType(label); // This checks decorators if needed
101
+ if (!storageType) {
102
+ // Transient instances are never stored
103
+ return false;
104
+ }
105
+ // Determine if it's treated as a class (registered or decorated) *after* getting type
106
+ const isClass = this.isClassType(label); // Use a helper that checks routing OR decorator
107
+ if (isClass) {
108
+ return storageType === 'singleton'
109
+ ? this._classStorageSingleton.has(label)
110
+ : this._classStorageScoped.has(label);
111
+ }
112
+ else { // Must be a function if not a class
113
+ return storageType === 'singleton'
114
+ ? this._functionStorageSingleton.has(label)
115
+ : this._functionStorageScoped.has(label);
116
+ }
117
+ }
118
+ // Helper to determine if something should be treated as a class (registered or decorated)
119
+ isClassType(label) {
120
+ if (this.isRegisteredAsClass(label)) {
121
+ return true;
122
+ }
123
+ // If not explicitly registered as a class, check if it's a function with @Component
124
+ if (typeof label === 'function' && label.prototype && !this.isRegisteredAsFunction(label)) {
125
+ return getComponentOptions(label) !== null;
126
+ }
127
+ return false;
128
+ }
129
+ getInstance(label) {
130
+ const storageType = this.getStorageType(label); // Checks decorators if needed
131
+ if (!storageType) {
132
+ // This should ideally not be reached if called after hasInstance check
133
+ console.error(`[IOC GetInstance] Attempted to get instance for non-stored type: ${String(label)}`);
134
+ throw new InstanceNotCreatedError();
135
+ }
136
+ const isClass = this.isClassType(label); // Check routing OR decorator
137
+ if (isClass) {
138
+ return storageType === 'singleton'
139
+ ? this._classStorageSingleton.get(label)
140
+ : this._classStorageScoped.get(label);
141
+ }
142
+ else { // Must be a function
143
+ return storageType === 'singleton'
144
+ ? this._functionStorageSingleton.get(label)
145
+ : this._functionStorageScoped.get(label);
146
+ }
147
+ }
148
+ setInstance(label, instance, storageType) {
149
+ const isClass = this.isClassType(label); // Determine type based on routing OR decorator
150
+ if (isClass) {
151
+ if (storageType === 'singleton') {
152
+ this._classStorageSingleton.set(label, instance);
153
+ }
154
+ else if (storageType == 'scoped') { // storageType === 'scoped'
155
+ this._classStorageScoped.set(label, instance);
156
+ }
157
+ }
158
+ else { // Must be a function
159
+ if (storageType === 'singleton') {
160
+ this._functionStorageSingleton.set(label, instance);
161
+ }
162
+ else if (storageType === "scoped") { // storageType === 'scoped'
163
+ this._functionStorageScoped.set(label, instance);
164
+ }
165
+ }
166
+ }
167
+ getStorageType(label) {
168
+ let manualLoadAs;
169
+ let decoratorScope;
170
+ const isPotentialClass = typeof label === 'function' && label.prototype;
171
+ // Get manual registration options if available
172
+ if (this.isRegisteredAsClass(label)) { // Use helper
173
+ manualLoadAs = this._classDefinition.get(label)?.loadAs;
174
+ }
175
+ else if (this.isRegisteredAsFunction(label)) { // Use helper
176
+ manualLoadAs = this._functionDefinition.get(label)?.options?.loadAs;
177
+ }
178
+ // Get decorator scope only if it's potentially a class *and not explicitly registered as a function*
179
+ if (isPotentialClass && !this.isRegisteredAsFunction(label)) {
180
+ decoratorScope = getScope(label); // Uses getComponentOptions internally
181
+ }
182
+ // Determine final scope: Manual > Decorator > Default (Transient)
183
+ const finalScope = manualLoadAs ?? decoratorScope ?? LoadAs.Transient;
184
+ if (finalScope === LoadAs.Singleton) {
185
+ return 'singleton';
186
+ }
187
+ else if (finalScope === LoadAs.Scoped) {
188
+ return 'scoped';
189
+ }
190
+ else {
191
+ return 'transient'; // Transient
192
+ }
193
+ }
194
+ // Central resolution logic
195
+ async loadInstance(label, params = [], resolutionChain = [] // Track resolution path
196
+ ) {
197
+ // --- Circular Dependency Check ---
198
+ const currentLabelStr = (typeof label === 'function' && label.name) ? label.name : String(label);
199
+ if (resolutionChain.includes(currentLabelStr)) {
200
+ console.error(`[IOC LoadInstance] Circular dependency detected: ${[...resolutionChain, currentLabelStr].join(' -> ')}`);
201
+ throw new CircularDependencyError([...resolutionChain, currentLabelStr]);
202
+ }
203
+ const nextResolutionChain = [...resolutionChain, currentLabelStr];
204
+ // --- End Circular Dependency Check ---
205
+ // --- Handle Parameters ---
206
+ if (label instanceof Parameter) {
207
+ try {
208
+ // Pass a *copy* of params to avoid side effects in resolveParameterValue
209
+ return Promise.resolve(this.resolveParameterValue(label, [...params]));
210
+ }
211
+ catch (e) {
212
+ // console.error(`[IOC LoadInstance] Error resolving parameter ${param.toString()}:`, e);
213
+ return Promise.reject(e);
214
+ }
215
+ }
216
+ // --- End Handle Parameters ---
217
+ // --- Check Explicit Registrations ---
218
+ if (this.isRegisteredAsClass(label)) {
219
+ // console.log(`[IOC LoadInstance] Resolving explicitly registered class: ${currentLabelStr}`);
220
+ return this.loadClassInstance(label, params, nextResolutionChain);
221
+ }
222
+ if (this.isRegisteredAsFunction(label)) {
223
+ // console.log(`[IOC LoadInstance] Resolving explicitly registered function: ${currentLabelStr}`);
224
+ return this.loadFunctionInstance(label, params, nextResolutionChain);
225
+ }
226
+ // --- End Check Explicit Registrations ---
227
+ // --- Attempt Auto-Registration/Resolution for Decorated Classes ---
228
+ if (typeof label === 'function' && label.prototype) {
229
+ const componentOptions = getComponentOptions(label); // Check for @Component
230
+ if (componentOptions !== null) {
231
+ // console.log(`[IOC LoadInstance] Auto-resolving @Component class: ${currentLabelStr}`);
232
+ // Set routing *now* so subsequent internal checks work correctly
233
+ if (!this._routing.has(label)) { // Only set if not already set
234
+ this._routing.set(label, ContainerRouting.CLASS);
235
+ // console.log(`[IOC LoadInstance] Set routing for auto-resolved class: ${currentLabelStr}`);
236
+ }
237
+ // Proceed to load it as a class
238
+ return this.loadClassInstance(label, params, nextResolutionChain);
239
+ }
240
+ }
241
+ // --- End Auto-Registration ---
242
+ // --- Dependency Not Found ---
243
+ console.error(`[IOC LoadInstance] Dependency not found and cannot be resolved: ${currentLabelStr}`);
244
+ throw new DependencyNotFoundError(currentLabelStr);
245
+ }
246
+ resolveParameterValue(param, params) {
247
+ // Find the *last* provided value for the parameter
248
+ const valueContainer = [...params].reverse().find((p) => p.belongsTo(param));
249
+ if (!valueContainer) {
250
+ // console.error(`[IOC ResolveParam] Parameter not found: ${param.toString()}`);
251
+ throw new ParameterNotFoundError(param.toString());
252
+ }
253
+ // console.log(`[IOC ResolveParam] Resolved parameter ${param.toString()}`);
254
+ return valueContainer.value;
255
+ }
256
+ loadClassInstance(classDefinition, // Should be a class constructor here
257
+ params, resolutionChain) {
258
+ const storageType = this.getStorageType(classDefinition);
259
+ const className = classDefinition.name || '[Anonymous Class]';
260
+ // Check storage first (handle stored promises)
261
+ if (storageType && this.hasInstance(classDefinition)) {
262
+ const instance = this.getInstance(classDefinition);
263
+ // console.log(`[IOC LoadClass] Found existing ${storageType} instance for ${className}. IsPromise: ${isPromise(instance)}`);
264
+ return instance;
265
+ }
266
+ // console.log(`[IOC LoadClass] Creating new ${storageType || 'transient'} instance for ${className}`);
267
+ // --- Determine Dependencies ---
268
+ const manualOptions = this._classDefinition.get(classDefinition);
269
+ let dependenciesToResolve;
270
+ if (manualOptions?.param && Array.isArray(manualOptions.param)) {
271
+ dependenciesToResolve = manualOptions.param;
272
+ // console.log(`[IOC LoadClass] Using manual dependencies for ${className}`);
273
+ }
274
+ else {
275
+ // Use decorator-derived dependencies
276
+ dependenciesToResolve = getResolvedDependencies(classDefinition);
277
+ // console.log(`[IOC LoadClass] Using decorator/reflected dependencies for ${className}:`, dependenciesToResolve.map(d => typeof d === 'function' ? d.name : String(d)));
278
+ }
279
+ // --- End Determine Dependencies ---
280
+ // --- Resolve Dependencies ---
281
+ // Create a *copy* of params to pass down for dependency resolution
282
+ const paramsCopy = [...params];
283
+ const resolutionPromises = dependenciesToResolve.map(dependencyIdentifier => this.loadInstance(dependencyIdentifier, paramsCopy, resolutionChain) // Recursive call handles auto-registration
284
+ );
285
+ let finalInstance = Promise.all(resolutionPromises)
286
+ .catch((error) => {
287
+ console.error(`[IOC LoadClass] Failed to resolve one or more dependencies for ${className}:`, error);
288
+ // Clean up potential partially stored promise if this was going to be singleton/scoped
289
+ if (storageType && this.isRegisteredAsClass(classDefinition)) { // Check if it was actually *being* stored
290
+ if (storageType === 'singleton')
291
+ this._classStorageSingleton.delete(classDefinition);
292
+ if (storageType === 'scoped')
293
+ this._classStorageScoped.delete(classDefinition);
294
+ }
295
+ throw error; // Re-throw dependency resolution error
296
+ }).then(async (resolvedDependencies) => {
297
+ // --- Instantiate Class ---
298
+ // Store the promise *before* starting instantiation for concurrent requests
299
+ let instancePromise;
300
+ if (storageType && !this.hasInstance(classDefinition)) { // Check again in case of race condition?
301
+ // Create the promise wrapper immediately
302
+ instancePromise = (async () => {
303
+ try {
304
+ // console.log(`[IOC LoadClass] Instantiating ${className} with ${resolvedDependencies.length} args.`);
305
+ const instance = new classDefinition(...resolvedDependencies);
306
+ // Overwrite the stored promise with the actual instance *after* it's created
307
+ this.setInstance(classDefinition, instance, storageType); // Use the correct storageType
308
+ // console.log(`[IOC LoadClass] Stored actual ${storageType} instance for ${className}`);
309
+ return instance;
310
+ }
311
+ catch (err) {
312
+ console.error(`[IOC LoadClass] Error during instantiation of ${className}: ${err.message}`, err.stack);
313
+ // Clean up the stored promise on failure
314
+ if (storageType === 'singleton')
315
+ this._classStorageSingleton.delete(classDefinition);
316
+ if (storageType === 'scoped')
317
+ this._classStorageScoped.delete(classDefinition);
318
+ throw err; // Re-throw instantiation error
319
+ }
320
+ })();
321
+ // console.log(`[IOC LoadClass] Storing promise for concurrent requests (${storageType}) for ${className}`);
322
+ this.setInstance(classDefinition, instancePromise, storageType);
323
+ }
324
+ else {
325
+ // If already has instance (from storage check) or is transient, just instantiate directly
326
+ instancePromise = (async () => {
327
+ try {
328
+ // console.log(`[IOC LoadClass] Instantiating transient ${className} with ${resolvedDependencies.length} args.`);
329
+ const instance = new classDefinition(...resolvedDependencies);
330
+ // No storing for transient
331
+ return instance;
332
+ }
333
+ catch (err) {
334
+ console.error(`[IOC LoadClass] Error during instantiation of transient ${className}: ${err.message}`, err.stack);
335
+ throw err; // Re-throw instantiation error
336
+ }
337
+ })();
338
+ }
339
+ // --- End Instantiate Class ---
340
+ // Await and return the final instance (either newly created or from the stored promise)
341
+ return await instancePromise;
342
+ });
343
+ if (storageType && storageType !== 'transient') {
344
+ this.setInstance(classDefinition, finalInstance, storageType); // Store the promise
345
+ }
346
+ return finalInstance;
347
+ }
348
+ loadFunctionInstance(funcLabel, params, resolutionChain) {
349
+ const functionConfig = this._functionDefinition.get(funcLabel); // Assumed to exist by caller
350
+ const storageType = this.getStorageType(funcLabel); // Only uses manual options for functions
351
+ const labelStr = String(funcLabel);
352
+ // Check storage first
353
+ if (storageType && this.hasInstance(funcLabel)) {
354
+ const instance = this.getInstance(funcLabel);
355
+ // console.log(`[IOC LoadFunc] Found existing ${storageType} instance for ${labelStr}. IsPromise: ${isPromise(instance)}`);
356
+ return instance;
357
+ }
358
+ // console.log(`[IOC LoadFunc] Creating new ${storageType || 'transient'} instance for ${labelStr}`);
359
+ const ioc_func = functionConfig.function;
360
+ const options = functionConfig.options;
361
+ const dependenciesToResolve = options?.param || [];
362
+ // --- Resolve Dependencies ---
363
+ const paramsCopy = [...params]; // Create a copy
364
+ const resolutionPromises = dependenciesToResolve.map(dependencyIdentifier => this.loadInstance(dependencyIdentifier, paramsCopy, resolutionChain));
365
+ let finalInstance = Promise.all(resolutionPromises).catch((error) => {
366
+ console.error(`[IOC LoadFunc] Failed to resolve dependencies for function ${labelStr}:`, error);
367
+ // Clean up potential partial storage
368
+ if (storageType && this.isRegisteredAsFunction(funcLabel)) {
369
+ if (storageType === 'singleton')
370
+ this._functionStorageSingleton.delete(funcLabel);
371
+ if (storageType === 'scoped')
372
+ this._functionStorageScoped.delete(funcLabel);
373
+ }
374
+ throw error;
375
+ }).then(async (resolvedArgs) => {
376
+ let instancePromise;
377
+ if (storageType && !this.hasInstance(funcLabel)) {
378
+ instancePromise = (async () => {
379
+ try {
380
+ // console.log(`[IOC LoadFunc] Invoking ${labelStr} with ${resolvedArgs.length} args.`);
381
+ const result = await ioc_func.apply(null, resolvedArgs); // Await in case function is async
382
+ // Overwrite stored promise with actual result
383
+ this.setInstance(funcLabel, result, storageType);
384
+ // console.log(`[IOC LoadFunc] Stored actual ${storageType} instance for ${labelStr}`);
385
+ return result;
386
+ }
387
+ catch (err) {
388
+ console.error(`[IOC LoadFunc] Error executing function ${labelStr}: ${err.message}`, err.stack);
389
+ // Clean up stored promise on failure
390
+ if (storageType === 'singleton')
391
+ this._functionStorageSingleton.delete(funcLabel);
392
+ if (storageType === 'scoped')
393
+ this._functionStorageScoped.delete(funcLabel);
394
+ throw err;
395
+ }
396
+ })();
397
+ // console.log(`[IOC LoadFunc] Storing promise for concurrent requests (${storageType}) for ${labelStr}`);
398
+ this.setInstance(funcLabel, instancePromise, storageType);
399
+ }
400
+ else {
401
+ // Transient or already resolved from storage check
402
+ instancePromise = (async () => {
403
+ try {
404
+ // console.log(`[IOC LoadFunc] Invoking transient ${labelStr} with ${resolvedArgs.length} args.`);
405
+ const result = await ioc_func.apply(null, resolvedArgs); // Await in case function is async
406
+ // No storing for transient
407
+ return result;
408
+ }
409
+ catch (err) {
410
+ console.error(`[IOC LoadFunc] Error executing transient function ${labelStr}: ${err.message}`, err.stack);
411
+ throw err;
412
+ }
413
+ })();
414
+ }
415
+ // --- End Invoke Function ---
416
+ return await instancePromise; // Return the final (awaited) result
417
+ });
418
+ if (storageType && storageType !== 'transient') {
419
+ this.setInstance(funcLabel, finalInstance, storageType); // Store the promise
420
+ }
421
+ return finalInstance;
422
+ }
423
+ }
424
+ // Helper functions
425
+ export function isPromise(obj) {
426
+ // Simplified check - more robust check might be needed depending on environment
427
+ return !!obj && typeof obj.then === 'function';
428
+ }
429
+ export function createContainer() {
430
+ return new Container();
431
+ }
432
+ //# sourceMappingURL=Container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../../framework/implementation/Container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import { describe } from "node:test";
2
+ import { createContainer } from "./Container";
3
+ import { Parameter } from "./Parameter";
4
+ import { LoadAs } from "./LoadAs";
5
+ describe('Container', () => {
6
+ describe('Transient', () => {
7
+ describe('registerClass', () => {
8
+ const container = createContainer();
9
+ class Test {
10
+ }
11
+ class Test2 {
12
+ constructor(test) {
13
+ this.test = test;
14
+ }
15
+ }
16
+ beforeAll(() => {
17
+ container.registerClass(Test);
18
+ container.registerClass(Test2, { param: [Test] });
19
+ });
20
+ it('should be able to register a class', async () => {
21
+ const instance = await container.instance(Test);
22
+ expect(instance).toBeInstanceOf(Test);
23
+ });
24
+ it('should be able to register a class with dependencies', async () => {
25
+ const instance = await container.instance(Test2);
26
+ expect(instance).toBeInstanceOf(Test2);
27
+ expect(instance.test).toBeInstanceOf(Test);
28
+ });
29
+ });
30
+ describe('registerFunction', () => {
31
+ const container = createContainer();
32
+ function loadTest() {
33
+ return {};
34
+ }
35
+ function loadTest2() {
36
+ return { "test2": true };
37
+ }
38
+ beforeAll(() => {
39
+ container.registerFunction('test', loadTest);
40
+ container.registerFunction('test2', loadTest2);
41
+ });
42
+ it('should be able to register a function', async () => {
43
+ const instance = await container.get('test');
44
+ expect(instance).toEqual({});
45
+ });
46
+ it('should load different instances', async () => {
47
+ const instance = await container.get('test');
48
+ const instance2 = await container.get('test');
49
+ expect(instance).not.toBe(instance2);
50
+ });
51
+ it('should be able to register a function', async () => {
52
+ const instance = await container.get('test2');
53
+ expect(instance).toEqual({ "test2": true });
54
+ });
55
+ it('should load different instances', async () => {
56
+ const instance = await container.get('test2');
57
+ const instance2 = await container.get('test2');
58
+ expect(instance).not.toBe(instance2);
59
+ });
60
+ it('should check that test and test2 are not equal', async () => {
61
+ const instance1 = await container.get('test');
62
+ const instance2 = await container.get('test2');
63
+ expect(instance1).toBeTruthy();
64
+ expect(instance2).toBeTruthy();
65
+ expect(instance1).not.toBe(instance2);
66
+ });
67
+ });
68
+ describe('instantiate a class object using parameters', async () => {
69
+ const container = createContainer();
70
+ class User {
71
+ constructor(id) {
72
+ this.id = id;
73
+ }
74
+ }
75
+ const USER_ID = Parameter.create();
76
+ beforeAll(() => {
77
+ container.registerClass(User, { param: [USER_ID] });
78
+ });
79
+ it("should be able to instantiate an object using parameters", async () => {
80
+ const user = await container.instance(User, [USER_ID.value(1)]);
81
+ expect(user).toBeInstanceOf(User);
82
+ expect(user.id).toBe(1);
83
+ });
84
+ });
85
+ describe('instantiate a function using parameters', async () => {
86
+ const container = createContainer();
87
+ function loadUser(id) {
88
+ return { id };
89
+ }
90
+ const USER_ID = Parameter.create();
91
+ beforeAll(() => {
92
+ container.registerFunction('user', loadUser, { param: [USER_ID] });
93
+ });
94
+ it("should be able to instantiate an object using parameters", async () => {
95
+ const user = await container.get('user', [USER_ID.value(1)]);
96
+ expect(user).toEqual({ id: 1 });
97
+ });
98
+ });
99
+ describe('a class should be able to be overridden with a function setup', () => {
100
+ const container = createContainer();
101
+ class Test {
102
+ }
103
+ beforeAll(() => {
104
+ container.registerClass(Test);
105
+ container.registerFunction(Test, () => ({}));
106
+ });
107
+ it('should be able to override a class with a function and get as instance', async () => {
108
+ const instance = await container.instance(Test);
109
+ expect(instance).toEqual({});
110
+ });
111
+ it('should be able to override a class with a function', async () => {
112
+ const instance = await container.get(Test);
113
+ expect(instance).toEqual({});
114
+ });
115
+ });
116
+ });
117
+ describe('Singleton', () => {
118
+ describe('registerClass', () => {
119
+ const container = createContainer();
120
+ class Test {
121
+ }
122
+ beforeAll(() => {
123
+ container.registerClass(Test, { loadAs: LoadAs.Singleton });
124
+ });
125
+ it('should be able to register a class', async () => {
126
+ const instance = await container.instance(Test);
127
+ expect(instance).toBeInstanceOf(Test);
128
+ const instance2 = await container.instance(Test);
129
+ expect(instance).toBe(instance2);
130
+ });
131
+ });
132
+ describe("registerNestedClass", () => {
133
+ it('should be able to register a nested class', async () => {
134
+ const container = createContainer();
135
+ class Parent {
136
+ constructor(test) {
137
+ this.test = test;
138
+ }
139
+ }
140
+ class Child {
141
+ constructor() {
142
+ }
143
+ }
144
+ container.registerClass(Parent, { param: [Child] });
145
+ container.registerClass(Child, { loadAs: LoadAs.Singleton });
146
+ const parent1 = await container.instance(Parent);
147
+ const parent2 = await container.instance(Parent);
148
+ expect(parent1).not.toBe(parent2);
149
+ const equal = parent1.test === parent2.test;
150
+ expect(equal).toBeTruthy();
151
+ });
152
+ });
153
+ });
154
+ describe('Scoped', () => {
155
+ describe('registerClass', () => {
156
+ const container = createContainer();
157
+ class Test {
158
+ }
159
+ beforeAll(() => {
160
+ container.registerClass(Test, { loadAs: LoadAs.Scoped });
161
+ });
162
+ it('should be able extend a container and all scoped instances are created new', async () => {
163
+ const instance = await container.instance(Test);
164
+ const newContainer = container.extend();
165
+ const instance2 = await newContainer.instance(Test);
166
+ const instance3 = await container.instance(Test);
167
+ expect(instance).not.toBe(instance2);
168
+ expect(instance).toBe(instance3);
169
+ });
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=Container.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Container.test.js","sourceRoot":"","sources":["../../../../framework/implementation/Container.test.ts"],"names":[],"mappings":"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"}