@noego/ioc 0.0.4 → 0.0.6

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 (115) 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 +12 -2
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const node_test_1 = require("node:test");
13
+ const Container_1 = require("./Container");
14
+ const Parameter_1 = require("./Parameter");
15
+ (0, node_test_1.describe)('Container Extension', () => {
16
+ (0, node_test_1.describe)('Extended Container Inheritance', () => {
17
+ it('should inherit registrations from parent container', () => __awaiter(void 0, void 0, void 0, function* () {
18
+ const container = (0, Container_1.createContainer)();
19
+ class BaseService {
20
+ }
21
+ container.registerClass(BaseService);
22
+ // Create an extended container
23
+ const extendedContainer = container.extend();
24
+ // Should be able to resolve the class from the extended container
25
+ const instance = yield extendedContainer.instance(BaseService);
26
+ expect(instance).toBeInstanceOf(BaseService);
27
+ }));
28
+ it('should inherit function registrations from parent container', () => __awaiter(void 0, void 0, void 0, function* () {
29
+ const container = (0, Container_1.createContainer)();
30
+ const serviceFunc = () => ({ name: 'service' });
31
+ container.registerFunction('service', serviceFunc);
32
+ // Create an extended container
33
+ const extendedContainer = container.extend();
34
+ // Should be able to resolve the function from the extended container
35
+ const instance = yield extendedContainer.get('service');
36
+ expect(instance).toEqual({ name: 'service' });
37
+ }));
38
+ });
39
+ (0, node_test_1.describe)('Override Registrations', () => {
40
+ it('should allow the extended container to override class registrations from the parent', () => __awaiter(void 0, void 0, void 0, function* () {
41
+ const container = (0, Container_1.createContainer)();
42
+ class BaseService {
43
+ getName() { return 'base'; }
44
+ }
45
+ class OverrideService {
46
+ getName() { return 'override'; }
47
+ }
48
+ container.registerClass(BaseService);
49
+ // Create an extended container and override the registration
50
+ const extendedContainer = container.extend();
51
+ extendedContainer.registerClass(BaseService, { param: [] }); // Overriding with the same class
52
+ // Different instances between parent and child
53
+ const parentInstance = yield container.instance(BaseService);
54
+ const childInstance = yield extendedContainer.instance(BaseService);
55
+ expect(parentInstance).not.toBe(childInstance);
56
+ // Now override with a completely different class
57
+ extendedContainer.registerFunction(BaseService, () => new OverrideService());
58
+ const overrideInstance = yield extendedContainer.instance(BaseService);
59
+ expect(overrideInstance).toBeInstanceOf(OverrideService);
60
+ expect(overrideInstance.getName()).toBe('override');
61
+ }));
62
+ it('should allow the extended container to override function registrations from the parent', () => __awaiter(void 0, void 0, void 0, function* () {
63
+ const container = (0, Container_1.createContainer)();
64
+ const baseFunc = () => ({ name: 'base' });
65
+ const overrideFunc = () => ({ name: 'override' });
66
+ container.registerFunction('service', baseFunc);
67
+ // Create an extended container and override the registration
68
+ const extendedContainer = container.extend();
69
+ extendedContainer.registerFunction('service', overrideFunc);
70
+ // Check that the parent registration is unchanged
71
+ const parentResult = yield container.get('service');
72
+ expect(parentResult).toEqual({ name: 'base' });
73
+ // Check that the child registration is overridden
74
+ const childResult = yield extendedContainer.get('service');
75
+ expect(childResult).toEqual({ name: 'override' });
76
+ }));
77
+ });
78
+ (0, node_test_1.describe)('Isolation of Changes', () => {
79
+ it('should ensure that changes in the extended container do not affect the parent', () => __awaiter(void 0, void 0, void 0, function* () {
80
+ const container = (0, Container_1.createContainer)();
81
+ class BaseService {
82
+ }
83
+ container.registerClass(BaseService);
84
+ // Create an extended container
85
+ const extendedContainer = container.extend();
86
+ // Add a new registration to the extended container
87
+ class ChildOnlyService {
88
+ }
89
+ extendedContainer.registerClass(ChildOnlyService);
90
+ // Parent container should not have access to the new registration
91
+ expect(() => __awaiter(void 0, void 0, void 0, function* () {
92
+ yield container.instance(ChildOnlyService);
93
+ })).rejects.toThrow();
94
+ // Child container should have access to both registrations
95
+ const baseInstance = yield extendedContainer.instance(BaseService);
96
+ const childInstance = yield extendedContainer.instance(ChildOnlyService);
97
+ expect(baseInstance).toBeInstanceOf(BaseService);
98
+ expect(childInstance).toBeInstanceOf(ChildOnlyService);
99
+ }));
100
+ });
101
+ (0, node_test_1.describe)('Parameter Handling in Extended Containers', () => {
102
+ it('should pass parameters correctly in extended containers', () => __awaiter(void 0, void 0, void 0, function* () {
103
+ const container = (0, Container_1.createContainer)();
104
+ class ConfigService {
105
+ constructor(value) {
106
+ this.value = value;
107
+ }
108
+ }
109
+ const CONFIG_VALUE = Parameter_1.Parameter.create();
110
+ container.registerClass(ConfigService, { param: [CONFIG_VALUE] });
111
+ // Create an extended container
112
+ const extendedContainer = container.extend();
113
+ // Should be able to resolve with parameters in both containers
114
+ const parentInstance = yield container.instance(ConfigService, [CONFIG_VALUE.value('parent')]);
115
+ const childInstance = yield extendedContainer.instance(ConfigService, [CONFIG_VALUE.value('child')]);
116
+ expect(parentInstance.value).toBe('parent');
117
+ expect(childInstance.value).toBe('child');
118
+ }));
119
+ });
120
+ (0, node_test_1.describe)('Multi-Level Extension', () => {
121
+ it('should support multiple levels of container extension', () => __awaiter(void 0, void 0, void 0, function* () {
122
+ const root = (0, Container_1.createContainer)();
123
+ class RootService {
124
+ getLevel() { return 'root'; }
125
+ }
126
+ root.registerClass(RootService);
127
+ // Level 1 extension
128
+ const level1 = root.extend();
129
+ class Level1Service {
130
+ getLevel() { return 'level1'; }
131
+ }
132
+ level1.registerClass(Level1Service);
133
+ level1.registerFunction(RootService, () => {
134
+ const service = new RootService();
135
+ return {
136
+ getLevel: () => `level1-override-${service.getLevel()}`
137
+ };
138
+ });
139
+ // Level 2 extension
140
+ const level2 = level1.extend();
141
+ class Level2Service {
142
+ getLevel() { return 'level2'; }
143
+ }
144
+ level2.registerClass(Level2Service);
145
+ // Each level has access to its own registrations and parent registrations
146
+ const rootFromRoot = yield root.instance(RootService);
147
+ const rootFromLevel1 = yield level1.instance(RootService);
148
+ const rootFromLevel2 = yield level2.instance(RootService);
149
+ expect(rootFromRoot.getLevel()).toBe('root');
150
+ expect(rootFromLevel1.getLevel()).toBe('level1-override-root');
151
+ expect(rootFromLevel2.getLevel()).toBe('level1-override-root');
152
+ // Lower levels can't access higher level registrations
153
+ yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
154
+ yield root.instance(Level1Service);
155
+ })).rejects.toThrow();
156
+ yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
157
+ yield level1.instance(Level2Service);
158
+ })).rejects.toThrow();
159
+ // But higher levels can access their own registrations
160
+ const level1FromLevel1 = yield level1.instance(Level1Service);
161
+ const level1FromLevel2 = yield level2.instance(Level1Service);
162
+ const level2FromLevel2 = yield level2.instance(Level2Service);
163
+ expect(level1FromLevel1.getLevel()).toBe('level1');
164
+ expect(level1FromLevel2.getLevel()).toBe('level1');
165
+ expect(level2FromLevel2.getLevel()).toBe('level2');
166
+ }));
167
+ });
168
+ });
169
+ //# sourceMappingURL=ContainerExtension.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContainerExtension.test.js","sourceRoot":"","sources":["../../../../framework/implementation/ContainerExtension.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const node_test_1 = require("node:test");
13
+ const Container_1 = require("./Container");
14
+ const LoadAs_1 = require("./LoadAs");
15
+ (0, node_test_1.describe)('Container Lifetime Scopes', () => {
16
+ // Test Transient lifetime (default)
17
+ (0, node_test_1.describe)('Transient Lifetime', () => {
18
+ it('should always create new instances for transient lifetime', () => __awaiter(void 0, void 0, void 0, function* () {
19
+ const container = (0, Container_1.createContainer)();
20
+ class TestTransient {
21
+ }
22
+ container.registerClass(TestTransient); // Default is Transient
23
+ const instance1 = yield container.instance(TestTransient);
24
+ const instance2 = yield container.instance(TestTransient);
25
+ expect(instance1).toBeInstanceOf(TestTransient);
26
+ expect(instance2).toBeInstanceOf(TestTransient);
27
+ expect(instance1).not.toBe(instance2); // Different instances
28
+ }));
29
+ });
30
+ // Test Singleton lifetime
31
+ (0, node_test_1.describe)('Singleton Lifetime', () => {
32
+ it('should reuse the same instance across the container for singleton lifetime', () => __awaiter(void 0, void 0, void 0, function* () {
33
+ const container = (0, Container_1.createContainer)();
34
+ class TestSingleton {
35
+ }
36
+ container.registerClass(TestSingleton, { loadAs: LoadAs_1.LoadAs.Singleton });
37
+ const instance1 = yield container.instance(TestSingleton);
38
+ const instance2 = yield container.instance(TestSingleton);
39
+ expect(instance1).toBeInstanceOf(TestSingleton);
40
+ expect(instance2).toBeInstanceOf(TestSingleton);
41
+ expect(instance1).toBe(instance2); // Same instance
42
+ }));
43
+ it('should reuse the same singleton instance across extended containers', () => __awaiter(void 0, void 0, void 0, function* () {
44
+ const container = (0, Container_1.createContainer)();
45
+ class TestSingleton {
46
+ }
47
+ container.registerClass(TestSingleton, { loadAs: LoadAs_1.LoadAs.Singleton });
48
+ const instance1 = yield container.instance(TestSingleton);
49
+ // Create an extended container
50
+ const extendedContainer = container.extend();
51
+ const instance2 = yield extendedContainer.instance(TestSingleton);
52
+ expect(instance1).toBe(instance2); // Same instance even in extended container
53
+ }));
54
+ });
55
+ // Test Scoped lifetime
56
+ (0, node_test_1.describe)('Scoped Lifetime', () => {
57
+ it('should reuse the same instance within a container for scoped lifetime', () => __awaiter(void 0, void 0, void 0, function* () {
58
+ const container = (0, Container_1.createContainer)();
59
+ class TestScoped {
60
+ }
61
+ container.registerClass(TestScoped, { loadAs: LoadAs_1.LoadAs.Scoped });
62
+ const instance1 = yield container.instance(TestScoped);
63
+ const instance2 = yield container.instance(TestScoped);
64
+ expect(instance1).toBeInstanceOf(TestScoped);
65
+ expect(instance2).toBeInstanceOf(TestScoped);
66
+ expect(instance1).toBe(instance2); // Same instance within the same container
67
+ }));
68
+ it('should create new instances for scoped lifetime in extended containers', () => __awaiter(void 0, void 0, void 0, function* () {
69
+ const container = (0, Container_1.createContainer)();
70
+ class TestScoped {
71
+ }
72
+ container.registerClass(TestScoped, { loadAs: LoadAs_1.LoadAs.Scoped });
73
+ const instance1 = yield container.instance(TestScoped);
74
+ // Create an extended container
75
+ const extendedContainer = container.extend();
76
+ const instance2 = yield extendedContainer.instance(TestScoped);
77
+ expect(instance1).not.toBe(instance2); // Different instances in different containers
78
+ }));
79
+ });
80
+ // Test different lifetime combinations with nested dependencies
81
+ (0, node_test_1.describe)('Mixed Lifetime Dependencies', () => {
82
+ it('should handle a transient class with a singleton dependency', () => __awaiter(void 0, void 0, void 0, function* () {
83
+ const container = (0, Container_1.createContainer)();
84
+ class SingletonDep {
85
+ }
86
+ class TransientWithSingletonDep {
87
+ constructor(dep) {
88
+ this.dep = dep;
89
+ }
90
+ }
91
+ container.registerClass(SingletonDep, { loadAs: LoadAs_1.LoadAs.Singleton });
92
+ container.registerClass(TransientWithSingletonDep, { param: [SingletonDep] });
93
+ const instance1 = yield container.instance(TransientWithSingletonDep);
94
+ const instance2 = yield container.instance(TransientWithSingletonDep);
95
+ expect(instance1).not.toBe(instance2); // Different transient parent instances
96
+ expect(instance1.dep).toBe(instance2.dep); // Same singleton dependency
97
+ }));
98
+ it('should handle a singleton class with a transient dependency', () => __awaiter(void 0, void 0, void 0, function* () {
99
+ const container = (0, Container_1.createContainer)();
100
+ class TransientDep {
101
+ }
102
+ class SingletonWithTransientDep {
103
+ constructor(dep) {
104
+ this.dep = dep;
105
+ }
106
+ }
107
+ container.registerClass(TransientDep);
108
+ container.registerClass(SingletonWithTransientDep, {
109
+ param: [TransientDep],
110
+ loadAs: LoadAs_1.LoadAs.Singleton
111
+ });
112
+ const instance1 = yield container.instance(SingletonWithTransientDep);
113
+ const instance2 = yield container.instance(SingletonWithTransientDep);
114
+ expect(instance1).toBe(instance2); // Same singleton parent instance
115
+ // The transient dependency is instantiated only once when the singleton is created
116
+ expect(instance1.dep).toBe(instance2.dep);
117
+ }));
118
+ it('should handle multi-level dependencies with different lifetimes', () => __awaiter(void 0, void 0, void 0, function* () {
119
+ const container = (0, Container_1.createContainer)();
120
+ class SingletonLeaf {
121
+ }
122
+ class ScopedMiddle {
123
+ constructor(leaf) {
124
+ this.leaf = leaf;
125
+ }
126
+ }
127
+ class TransientRoot {
128
+ constructor(middle) {
129
+ this.middle = middle;
130
+ }
131
+ }
132
+ container.registerClass(SingletonLeaf, { loadAs: LoadAs_1.LoadAs.Singleton });
133
+ container.registerClass(ScopedMiddle, {
134
+ param: [SingletonLeaf],
135
+ loadAs: LoadAs_1.LoadAs.Scoped
136
+ });
137
+ container.registerClass(TransientRoot, {
138
+ param: [ScopedMiddle]
139
+ });
140
+ const instance1 = yield container.instance(TransientRoot);
141
+ const instance2 = yield container.instance(TransientRoot);
142
+ expect(instance1).not.toBe(instance2); // Different transient root instances
143
+ expect(instance1.middle).toBe(instance2.middle); // Same scoped middle instance
144
+ expect(instance1.middle.leaf).toBe(instance2.middle.leaf); // Same singleton leaf instance
145
+ // Create an extended container
146
+ const extendedContainer = container.extend();
147
+ const instance3 = yield extendedContainer.instance(TransientRoot);
148
+ expect(instance1).not.toBe(instance3); // Different transient root instances
149
+ expect(instance1.middle).not.toBe(instance3.middle); // Different scoped middle instances
150
+ expect(instance1.middle.leaf).toBe(instance3.middle.leaf); // Same singleton leaf instance
151
+ }));
152
+ });
153
+ });
154
+ //# sourceMappingURL=ContainerLifetimes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContainerLifetimes.test.js","sourceRoot":"","sources":["../../../../framework/implementation/ContainerLifetimes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import 'reflect-metadata';
2
+ import { ComponentOptions } from '../decorators/Component';
3
+ import { LoadAs } from './LoadAs';
4
+ /**
5
+ * Gets component options from a class decorated with @Component.
6
+ * Checks both Symbol and string keys for compatibility/debugging.
7
+ */
8
+ export declare function getComponentOptions(target: any): ComponentOptions | null;
9
+ /**
10
+ * Gets the scope from a class decorated with @Component.
11
+ */
12
+ export declare function getScope(target: any): LoadAs;
13
+ /**
14
+ * Gets the parameter types for a class constructor using TypeScript metadata.
15
+ */
16
+ export declare function getParameterTypes(target: any): any[];
17
+ /**
18
+ * Gets the explicitly injected tokens for a class constructor using @Inject.
19
+ */
20
+ export declare function getInjectTokens(target: any): Map<number, any>;
21
+ /**
22
+ * Gets the final list of dependencies to resolve for a constructor,
23
+ * prioritizing @Inject tokens over reflected types.
24
+ */
25
+ export declare function getResolvedDependencies(target: any): any[];
26
+ export interface ClassMetadata {
27
+ hasComponent: boolean;
28
+ scope: LoadAs;
29
+ dependencies: any[];
30
+ }
31
+ export declare function getClassMetadata(target: any): ClassMetadata;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getComponentOptions = getComponentOptions;
4
+ exports.getScope = getScope;
5
+ exports.getParameterTypes = getParameterTypes;
6
+ exports.getInjectTokens = getInjectTokens;
7
+ exports.getResolvedDependencies = getResolvedDependencies;
8
+ exports.getClassMetadata = getClassMetadata;
9
+ // framework/implementation/DecoratorSupport.ts
10
+ require("reflect-metadata");
11
+ const metadataKeys_1 = require("../decorators/metadataKeys");
12
+ const LoadAs_1 = require("./LoadAs");
13
+ /**
14
+ * Gets component options from a class decorated with @Component.
15
+ * Checks both Symbol and string keys for compatibility/debugging.
16
+ */
17
+ function getComponentOptions(target) {
18
+ if (!target || typeof target !== 'function')
19
+ return null;
20
+ // Prioritize the Symbol key
21
+ let options = Reflect.getMetadata(metadataKeys_1.COMPONENT_OPTIONS_METADATA_KEY, target);
22
+ // Fallback to the string key if Symbol key didn't return anything
23
+ if (options === undefined || options === null) { // Check explicitly for undefined/null
24
+ options = Reflect.getMetadata('ComponentOptions', target);
25
+ }
26
+ // console.log(`[DecoratorSupport getComponentOptions] for ${target.name}:`, options);
27
+ return options || null; // Return null if no options found with either key
28
+ }
29
+ /**
30
+ * Gets the scope from a class decorated with @Component.
31
+ */
32
+ function getScope(target) {
33
+ var _a;
34
+ const options = getComponentOptions(target);
35
+ // Default to Transient if no options or no scope specified
36
+ const scope = (_a = options === null || options === void 0 ? void 0 : options.scope) !== null && _a !== void 0 ? _a : LoadAs_1.LoadAs.Transient;
37
+ // console.log(`[DecoratorSupport getScope] for ${target.name}:`, scope);
38
+ return scope;
39
+ }
40
+ /**
41
+ * Gets the parameter types for a class constructor using TypeScript metadata.
42
+ */
43
+ function getParameterTypes(target) {
44
+ if (!target || typeof target !== 'function')
45
+ return [];
46
+ const types = Reflect.getMetadata(metadataKeys_1.PARAM_TYPES_METADATA_KEY, target) || [];
47
+ // console.log(`[DecoratorSupport getParameterTypes] for ${target.name}:`, types);
48
+ return types;
49
+ }
50
+ /**
51
+ * Gets the explicitly injected tokens for a class constructor using @Inject.
52
+ */
53
+ function getInjectTokens(target) {
54
+ if (!target || typeof target !== 'function')
55
+ return new Map();
56
+ const tokens = Reflect.getOwnMetadata(metadataKeys_1.INJECT_TOKEN_METADATA_KEY, target) || new Map();
57
+ // console.log(`[DecoratorSupport getInjectTokens] for ${target.name}:`, tokens);
58
+ return tokens;
59
+ }
60
+ /**
61
+ * Gets the final list of dependencies to resolve for a constructor,
62
+ * prioritizing @Inject tokens over reflected types.
63
+ */
64
+ function getResolvedDependencies(target) {
65
+ if (!target || typeof target !== 'function')
66
+ return [];
67
+ const paramTypes = getParameterTypes(target);
68
+ const injectTokens = getInjectTokens(target);
69
+ const size = Math.max(paramTypes.length, injectTokens.size);
70
+ Array.from({ length: size });
71
+ const dependencies = Array.from({ length: size }).map((_, index) => {
72
+ // If an @Inject token exists for this parameter index, use it.
73
+ if (injectTokens.has(index)) {
74
+ return injectTokens.get(index);
75
+ }
76
+ let type = paramTypes.length > index ? paramTypes[index] : undefined;
77
+ // Otherwise, use the reflected type.
78
+ // Handle potential 'undefined' types from reflection if interfaces are used without @Inject
79
+ if (type === undefined) {
80
+ console.warn(`[IOC DecoratorSupport] Reflected parameter type at index ${index} for ${target.name} is undefined. This might indicate an interface used without @Inject.`);
81
+ // Depending on strictness, could throw or return a special marker. Returning undefined for now.
82
+ }
83
+ return type;
84
+ });
85
+ // console.log(`[DecoratorSupport getResolvedDependencies] for ${target.name}:`, dependencies);
86
+ return dependencies;
87
+ }
88
+ function getClassMetadata(target) {
89
+ const options = getComponentOptions(target);
90
+ return {
91
+ hasComponent: !!options,
92
+ scope: getScope(target), // Uses getComponentOptions internally
93
+ dependencies: getResolvedDependencies(target) // Uses helpers internally
94
+ };
95
+ }
96
+ //# sourceMappingURL=DecoratorSupport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecoratorSupport.js","sourceRoot":"","sources":["../../../../framework/implementation/DecoratorSupport.ts"],"names":[],"mappings":";;AAUA,kDAaC;AAMD,4BAMC;AAKD,8CAKC;AAKD,0CAKC;AAMD,0DA2BC;AASD,4CAOC;AAxGD,+CAA+C;AAC/C,4BAA0B;AAE1B,6DAAiI;AACjI,qCAAkC;AAElC;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAAW;IAC3C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAEzD,4BAA4B;IAC5B,IAAI,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,6CAA8B,EAAE,MAAM,CAAC,CAAC;IAE1E,kEAAkE;IAClE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC,sCAAsC;QACnF,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,sFAAsF;IACtF,OAAO,OAAO,IAAI,IAAI,CAAC,CAAC,kDAAkD;AAC9E,CAAC;AAGD;;GAEG;AACH,SAAgB,QAAQ,CAAC,MAAW;;IAChC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,2DAA2D;IAC3D,MAAM,KAAK,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,eAAM,CAAC,SAAS,CAAC;IACjD,yEAAyE;IACzE,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,MAAW;IACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,uCAAwB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1E,kFAAkF;IAClF,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,MAAW;IACvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,wCAAyB,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;IACrF,iFAAiF;IAClF,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAW;IAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IAEvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAE5D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAE5B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QAC/D,+DAA+D;QAC/D,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,qCAAqC;QACrC,4FAA4F;QAC5F,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,4DAA4D,KAAK,QAAQ,MAAM,CAAC,IAAI,uEAAuE,CAAC,CAAC;YAC1K,gGAAgG;QACrG,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,+FAA+F;IAC/F,OAAO,YAAY,CAAC;AACxB,CAAC;AASD,SAAgB,gBAAgB,CAAC,MAAW;IACxC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO;QACH,YAAY,EAAE,CAAC,CAAC,OAAO;QACvB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,sCAAsC;QAC/D,YAAY,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC,0BAA0B;KAC3E,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare enum LoadAs {
2
+ Singleton = 0,
3
+ Scoped = 1,
4
+ Transient = 2
5
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoadAs = void 0;
4
+ var LoadAs;
5
+ (function (LoadAs) {
6
+ LoadAs[LoadAs["Singleton"] = 0] = "Singleton";
7
+ LoadAs[LoadAs["Scoped"] = 1] = "Scoped";
8
+ LoadAs[LoadAs["Transient"] = 2] = "Transient";
9
+ })(LoadAs || (exports.LoadAs = LoadAs = {}));
10
+ //# sourceMappingURL=LoadAs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadAs.js","sourceRoot":"","sources":["../../../../framework/implementation/LoadAs.ts"],"names":[],"mappings":";;;AAKA,IAAY,MAIX;AAJD,WAAY,MAAM;IACd,6CAAS,CAAA;IACT,uCAAM,CAAA;IACN,6CAAS,CAAA;AACb,CAAC,EAJW,MAAM,sBAAN,MAAM,QAIjB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Parameter class for dependency injection
3
+ */
4
+ export declare class Parameter {
5
+ private id;
6
+ private name?;
7
+ private constructor();
8
+ /**
9
+ * Create a new Parameter instance
10
+ * @param name Optional name for the parameter for better error messages
11
+ */
12
+ static create(name?: string): Parameter;
13
+ /**
14
+ * Create a ParameterValue with the specified value
15
+ */
16
+ value<T>(value: T): ParameterValue<T>;
17
+ /**
18
+ * String representation for debugging and error messages
19
+ */
20
+ toString(): string;
21
+ }
22
+ /**
23
+ * Holds a value for a specific Parameter
24
+ */
25
+ export declare class ParameterValue<T> {
26
+ private param;
27
+ value: T;
28
+ constructor(param: Parameter, value: T);
29
+ /**
30
+ * Check if this value belongs to the given parameter
31
+ */
32
+ belongsTo(param: Parameter): boolean;
33
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ParameterValue = exports.Parameter = void 0;
37
+ const randomstring = __importStar(require("randomstring"));
38
+ /**
39
+ * Parameter class for dependency injection
40
+ */
41
+ class Parameter {
42
+ constructor(id) {
43
+ this.id = id;
44
+ }
45
+ /**
46
+ * Create a new Parameter instance
47
+ * @param name Optional name for the parameter for better error messages
48
+ */
49
+ static create(name) {
50
+ const id = randomstring.generate(32);
51
+ const param = new Parameter(id);
52
+ if (name) {
53
+ param.name = name;
54
+ }
55
+ return param;
56
+ }
57
+ /**
58
+ * Create a ParameterValue with the specified value
59
+ */
60
+ value(value) {
61
+ return new ParameterValue(this, value);
62
+ }
63
+ /**
64
+ * String representation for debugging and error messages
65
+ */
66
+ toString() {
67
+ return this.name || `Parameter_${this.id.substring(0, 8)}`;
68
+ }
69
+ }
70
+ exports.Parameter = Parameter;
71
+ /**
72
+ * Holds a value for a specific Parameter
73
+ */
74
+ class ParameterValue {
75
+ constructor(param, value) {
76
+ this.param = param;
77
+ this.value = value;
78
+ }
79
+ /**
80
+ * Check if this value belongs to the given parameter
81
+ */
82
+ belongsTo(param) {
83
+ return this.param === param;
84
+ }
85
+ }
86
+ exports.ParameterValue = ParameterValue;
87
+ //# sourceMappingURL=Parameter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Parameter.js","sourceRoot":"","sources":["../../../../framework/implementation/Parameter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAA6C;AAE7C;;GAEG;AACH,MAAa,SAAS;IAGlB,YAA4B,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IACtC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,IAAa;QACvB,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAI,KAAQ;QACb,OAAO,IAAI,cAAc,CAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,IAAI,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC;CACJ;AAhCD,8BAgCC;AAED;;GAEG;AACH,MAAa,cAAc;IACvB,YAAoB,KAAgB,EAAS,KAAQ;QAAjC,UAAK,GAAL,KAAK,CAAW;QAAS,UAAK,GAAL,KAAK,CAAG;IACrD,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAgB;QACtB,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;IAChC,CAAC;CACJ;AAVD,wCAUC"}