@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.
- package/dist/cjs/framework/decorators/Component.d.ts +10 -0
- package/dist/cjs/framework/decorators/Component.js +25 -0
- package/dist/cjs/framework/decorators/Component.js.map +1 -0
- package/dist/cjs/framework/decorators/Inject.d.ts +7 -0
- package/dist/cjs/framework/decorators/Inject.js +22 -0
- package/dist/cjs/framework/decorators/Inject.js.map +1 -0
- package/dist/cjs/framework/decorators/index.d.ts +3 -0
- package/dist/cjs/framework/decorators/index.js +24 -0
- package/dist/cjs/framework/decorators/index.js.map +1 -0
- package/dist/cjs/framework/decorators/metadataKeys.d.ts +3 -0
- package/dist/cjs/framework/decorators/metadataKeys.js +8 -0
- package/dist/cjs/framework/decorators/metadataKeys.js.map +1 -0
- package/dist/cjs/framework/errors/ContainerErrors.d.ts +33 -0
- package/dist/cjs/framework/errors/ContainerErrors.js +52 -0
- package/dist/cjs/framework/errors/ContainerErrors.js.map +1 -0
- package/dist/cjs/framework/implementation/Container.d.ts +31 -0
- package/dist/cjs/framework/implementation/Container.js +448 -0
- package/dist/cjs/framework/implementation/Container.js.map +1 -0
- package/dist/cjs/framework/implementation/Container.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/Container.test.js +184 -0
- package/dist/cjs/framework/implementation/Container.test.js.map +1 -0
- package/dist/cjs/framework/implementation/ContainerAsync.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/ContainerAsync.test.js +178 -0
- package/dist/cjs/framework/implementation/ContainerAsync.test.js.map +1 -0
- package/dist/cjs/framework/implementation/ContainerBasic.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/ContainerBasic.test.js +101 -0
- package/dist/cjs/framework/implementation/ContainerBasic.test.js.map +1 -0
- package/dist/cjs/framework/implementation/ContainerDecorators.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/ContainerDecorators.test.js +517 -0
- package/dist/cjs/framework/implementation/ContainerDecorators.test.js.map +1 -0
- package/dist/cjs/framework/implementation/ContainerExtension.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/ContainerExtension.test.js +169 -0
- package/dist/cjs/framework/implementation/ContainerExtension.test.js.map +1 -0
- package/dist/cjs/framework/implementation/ContainerLifetimes.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/ContainerLifetimes.test.js +154 -0
- package/dist/cjs/framework/implementation/ContainerLifetimes.test.js.map +1 -0
- package/dist/cjs/framework/implementation/DecoratorSupport.d.ts +31 -0
- package/dist/cjs/framework/implementation/DecoratorSupport.js +96 -0
- package/dist/cjs/framework/implementation/DecoratorSupport.js.map +1 -0
- package/dist/cjs/framework/implementation/LoadAs.d.ts +5 -0
- package/dist/cjs/framework/implementation/LoadAs.js +10 -0
- package/dist/cjs/framework/implementation/LoadAs.js.map +1 -0
- package/dist/cjs/framework/implementation/Parameter.d.ts +33 -0
- package/dist/cjs/framework/implementation/Parameter.js +87 -0
- package/dist/cjs/framework/implementation/Parameter.js.map +1 -0
- package/dist/cjs/framework/implementation/Parameter.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/Parameter.test.js +19 -0
- package/dist/cjs/framework/implementation/Parameter.test.js.map +1 -0
- package/dist/cjs/framework/implementation/SimpleDecoratorTest.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/SimpleDecoratorTest.test.js +78 -0
- package/dist/cjs/framework/implementation/SimpleDecoratorTest.test.js.map +1 -0
- package/dist/cjs/framework/implementation/SingletonTest.test.d.ts +1 -0
- package/dist/cjs/framework/implementation/SingletonTest.test.js +85 -0
- package/dist/cjs/framework/implementation/SingletonTest.test.js.map +1 -0
- package/dist/cjs/framework/interface/Container.d.ts +22 -0
- package/dist/cjs/framework/interface/Container.js +3 -0
- package/dist/cjs/framework/interface/Container.js.map +1 -0
- package/dist/esm/framework/decorators/Component.d.ts +10 -0
- package/dist/esm/framework/decorators/Component.js +21 -0
- package/dist/esm/framework/decorators/Component.js.map +1 -0
- package/dist/esm/framework/decorators/Inject.d.ts +7 -0
- package/dist/esm/framework/decorators/Inject.js +19 -0
- package/dist/esm/framework/decorators/Inject.js.map +1 -0
- package/dist/esm/framework/decorators/index.d.ts +3 -0
- package/dist/esm/framework/decorators/index.js +5 -0
- package/dist/esm/framework/decorators/index.js.map +1 -0
- package/dist/esm/framework/decorators/metadataKeys.d.ts +3 -0
- package/dist/esm/framework/decorators/metadataKeys.js +5 -0
- package/dist/esm/framework/decorators/metadataKeys.js.map +1 -0
- package/dist/esm/framework/errors/ContainerErrors.d.ts +33 -0
- package/dist/esm/framework/errors/ContainerErrors.js +44 -0
- package/dist/esm/framework/errors/ContainerErrors.js.map +1 -0
- package/dist/esm/framework/implementation/Container.d.ts +31 -0
- package/dist/esm/framework/implementation/Container.js +432 -0
- package/dist/esm/framework/implementation/Container.js.map +1 -0
- package/dist/esm/framework/implementation/Container.test.d.ts +1 -0
- package/dist/esm/framework/implementation/Container.test.js +173 -0
- package/dist/esm/framework/implementation/Container.test.js.map +1 -0
- package/dist/esm/framework/implementation/ContainerAsync.test.d.ts +1 -0
- package/dist/esm/framework/implementation/ContainerAsync.test.js +151 -0
- package/dist/esm/framework/implementation/ContainerAsync.test.js.map +1 -0
- package/dist/esm/framework/implementation/ContainerBasic.test.d.ts +1 -0
- package/dist/esm/framework/implementation/ContainerBasic.test.js +90 -0
- package/dist/esm/framework/implementation/ContainerBasic.test.js.map +1 -0
- package/dist/esm/framework/implementation/ContainerDecorators.test.d.ts +1 -0
- package/dist/esm/framework/implementation/ContainerDecorators.test.js +498 -0
- package/dist/esm/framework/implementation/ContainerDecorators.test.js.map +1 -0
- package/dist/esm/framework/implementation/ContainerExtension.test.d.ts +1 -0
- package/dist/esm/framework/implementation/ContainerExtension.test.js +158 -0
- package/dist/esm/framework/implementation/ContainerExtension.test.js.map +1 -0
- package/dist/esm/framework/implementation/ContainerLifetimes.test.d.ts +1 -0
- package/dist/esm/framework/implementation/ContainerLifetimes.test.js +143 -0
- package/dist/esm/framework/implementation/ContainerLifetimes.test.js.map +1 -0
- package/dist/esm/framework/implementation/DecoratorSupport.d.ts +31 -0
- package/dist/esm/framework/implementation/DecoratorSupport.js +87 -0
- package/dist/esm/framework/implementation/DecoratorSupport.js.map +1 -0
- package/dist/esm/framework/implementation/LoadAs.d.ts +5 -0
- package/dist/esm/framework/implementation/LoadAs.js +7 -0
- package/dist/esm/framework/implementation/LoadAs.js.map +1 -0
- package/dist/esm/framework/implementation/Parameter.d.ts +33 -0
- package/dist/esm/framework/implementation/Parameter.js +49 -0
- package/dist/esm/framework/implementation/Parameter.js.map +1 -0
- package/dist/esm/framework/implementation/Parameter.test.d.ts +1 -0
- package/dist/esm/framework/implementation/Parameter.test.js +17 -0
- package/dist/esm/framework/implementation/Parameter.test.js.map +1 -0
- package/dist/esm/framework/implementation/SimpleDecoratorTest.test.d.ts +1 -0
- package/dist/esm/framework/implementation/SimpleDecoratorTest.test.js +67 -0
- package/dist/esm/framework/implementation/SimpleDecoratorTest.test.js.map +1 -0
- package/dist/esm/framework/implementation/SingletonTest.test.d.ts +1 -0
- package/dist/esm/framework/implementation/SingletonTest.test.js +74 -0
- package/dist/esm/framework/implementation/SingletonTest.test.js.map +1 -0
- package/dist/esm/framework/interface/Container.d.ts +22 -0
- package/dist/esm/framework/interface/Container.js +2 -0
- package/dist/esm/framework/interface/Container.js.map +1 -0
- package/package.json +12 -2
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { describe } from "node:test";
|
|
2
|
+
import { createContainer } from "./Container";
|
|
3
|
+
import { LoadAs } from "./LoadAs";
|
|
4
|
+
describe('Container Async Support', () => {
|
|
5
|
+
describe('Async Class Dependencies', () => {
|
|
6
|
+
it('should resolve class dependencies that return promises', async () => {
|
|
7
|
+
const container = createContainer();
|
|
8
|
+
class AsyncDep {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.value = '';
|
|
11
|
+
}
|
|
12
|
+
async initialize() {
|
|
13
|
+
// Simulate async initialization
|
|
14
|
+
return new Promise(resolve => {
|
|
15
|
+
setTimeout(() => {
|
|
16
|
+
this.value = 'initialized';
|
|
17
|
+
resolve();
|
|
18
|
+
}, 10);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
class AsyncService {
|
|
23
|
+
constructor(dep) {
|
|
24
|
+
this.dep = dep;
|
|
25
|
+
}
|
|
26
|
+
async getValue() {
|
|
27
|
+
await this.dep.initialize();
|
|
28
|
+
return this.dep.value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
container.registerClass(AsyncDep);
|
|
32
|
+
container.registerClass(AsyncService, { param: [AsyncDep] });
|
|
33
|
+
const service = await container.instance(AsyncService);
|
|
34
|
+
const value = await service.getValue();
|
|
35
|
+
expect(value).toBe('initialized');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('Resolving Async Functions', () => {
|
|
39
|
+
it('should resolve functions that return promises', async () => {
|
|
40
|
+
const container = createContainer();
|
|
41
|
+
const asyncFunction = async () => {
|
|
42
|
+
// Simulate async operation
|
|
43
|
+
return new Promise(resolve => {
|
|
44
|
+
setTimeout(() => {
|
|
45
|
+
resolve('async result');
|
|
46
|
+
}, 10);
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
container.registerFunction('asyncFunc', asyncFunction);
|
|
50
|
+
const result = await container.get('asyncFunc');
|
|
51
|
+
expect(await result).toBe('async result');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('Chain of Async Dependencies', () => {
|
|
55
|
+
it('should resolve a chain of async dependencies', async () => {
|
|
56
|
+
const container = createContainer();
|
|
57
|
+
// Setup a chain of async dependencies
|
|
58
|
+
class Level3 {
|
|
59
|
+
async getValue() {
|
|
60
|
+
return new Promise(resolve => {
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
resolve('level3');
|
|
63
|
+
}, 10);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
class Level2 {
|
|
68
|
+
constructor(level3) {
|
|
69
|
+
this.level3 = level3;
|
|
70
|
+
}
|
|
71
|
+
async getValue() {
|
|
72
|
+
const l3Value = await this.level3.getValue();
|
|
73
|
+
return `level2-${l3Value}`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
class Level1 {
|
|
77
|
+
constructor(level2) {
|
|
78
|
+
this.level2 = level2;
|
|
79
|
+
}
|
|
80
|
+
async getValue() {
|
|
81
|
+
const l2Value = await this.level2.getValue();
|
|
82
|
+
return `level1-${l2Value}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
container.registerClass(Level3);
|
|
86
|
+
container.registerClass(Level2, { param: [Level3] });
|
|
87
|
+
container.registerClass(Level1, { param: [Level2] });
|
|
88
|
+
const level1 = await container.instance(Level1);
|
|
89
|
+
const value = await level1.getValue();
|
|
90
|
+
expect(value).toBe('level1-level2-level3');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('Error Handling in Async Dependencies', () => {
|
|
94
|
+
it('should handle errors in async dependencies', async () => {
|
|
95
|
+
const container = createContainer();
|
|
96
|
+
class FailingDep {
|
|
97
|
+
async initialize() {
|
|
98
|
+
throw new Error('Async dependency failed');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
class AsyncService {
|
|
102
|
+
constructor(dep) {
|
|
103
|
+
this.dep = dep;
|
|
104
|
+
}
|
|
105
|
+
async getValue() {
|
|
106
|
+
await this.dep.initialize();
|
|
107
|
+
return 'success';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
container.registerClass(FailingDep);
|
|
111
|
+
container.registerClass(AsyncService, { param: [FailingDep] });
|
|
112
|
+
const service = await container.instance(AsyncService);
|
|
113
|
+
await expect(service.getValue()).rejects.toThrow('Async dependency failed');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('Promise Handling in Singleton Registration', () => {
|
|
117
|
+
it('should handle promises correctly when registering singletons', async () => {
|
|
118
|
+
const container = createContainer();
|
|
119
|
+
class AsyncSingleton {
|
|
120
|
+
constructor() {
|
|
121
|
+
this.initialized = false;
|
|
122
|
+
// We'll initialize this after construction
|
|
123
|
+
}
|
|
124
|
+
async initialize() {
|
|
125
|
+
// Simulate async initialization
|
|
126
|
+
return new Promise(resolve => {
|
|
127
|
+
setTimeout(() => {
|
|
128
|
+
this.initialized = true;
|
|
129
|
+
resolve();
|
|
130
|
+
}, 10);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Register as singleton
|
|
135
|
+
container.registerClass(AsyncSingleton, { loadAs: LoadAs.Singleton });
|
|
136
|
+
// Get the instance multiple times concurrently
|
|
137
|
+
const [instance1Promise, instance2Promise] = await Promise.all([
|
|
138
|
+
container.instance(AsyncSingleton),
|
|
139
|
+
container.instance(AsyncSingleton)
|
|
140
|
+
]);
|
|
141
|
+
const instance1 = await instance1Promise;
|
|
142
|
+
const instance2 = await instance2Promise;
|
|
143
|
+
// Initialize the singleton
|
|
144
|
+
await instance1.initialize();
|
|
145
|
+
// Both references should point to the same instance
|
|
146
|
+
expect(instance1).toBe(instance2);
|
|
147
|
+
expect(instance2.initialized).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=ContainerAsync.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContainerAsync.test.js","sourceRoot":"","sources":["../../../../framework/implementation/ContainerAsync.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { describe } from "node:test";
|
|
2
|
+
import { createContainer } from "./Container";
|
|
3
|
+
import { Parameter } from "./Parameter";
|
|
4
|
+
describe('Container Creation and Basic Behavior', () => {
|
|
5
|
+
// Test creating a container with createContainer()
|
|
6
|
+
describe('createContainer', () => {
|
|
7
|
+
it('should create a container that implements both IContainerClient and IContainerSetup', () => {
|
|
8
|
+
const container = createContainer();
|
|
9
|
+
expect(container).toBeDefined();
|
|
10
|
+
// Verify it implements IContainerClient
|
|
11
|
+
expect(typeof container.instance).toBe('function');
|
|
12
|
+
expect(typeof container.get).toBe('function');
|
|
13
|
+
expect(typeof container.extend).toBe('function');
|
|
14
|
+
// Verify it implements IContainerSetup
|
|
15
|
+
expect(typeof container.registerClass).toBe('function');
|
|
16
|
+
expect(typeof container.registerFunction).toBe('function');
|
|
17
|
+
});
|
|
18
|
+
it('should create a container that has empty storage maps', async () => {
|
|
19
|
+
const container = createContainer();
|
|
20
|
+
// Check that internal maps are initialized and empty
|
|
21
|
+
expect(container._functionDefinition.size).toBe(0);
|
|
22
|
+
expect(container._classDefinition.size).toBe(0);
|
|
23
|
+
expect(container._functionStorageSingleton.size).toBe(0);
|
|
24
|
+
expect(container._functionStorageScoped.size).toBe(0);
|
|
25
|
+
expect(container._classStorageSingleton.size).toBe(0);
|
|
26
|
+
expect(container._classStorageScoped.size).toBe(0);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
// Test resolving a non-registered class
|
|
30
|
+
describe('Resolving Non-Registered Classes', () => {
|
|
31
|
+
it('should throw an appropriate error when resolving a non-registered class', async () => {
|
|
32
|
+
const container = createContainer();
|
|
33
|
+
class NonRegistered {
|
|
34
|
+
}
|
|
35
|
+
// Attempt to resolve a class that wasn't registered
|
|
36
|
+
let error;
|
|
37
|
+
try {
|
|
38
|
+
await container.instance(NonRegistered);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
error = e;
|
|
42
|
+
}
|
|
43
|
+
expect(error).toBeDefined();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
// Test resolving with missing parameter values
|
|
47
|
+
describe('Missing Parameter Values', () => {
|
|
48
|
+
it('should throw an appropriate error when resolving with missing parameter values', async () => {
|
|
49
|
+
const container = createContainer();
|
|
50
|
+
class User {
|
|
51
|
+
constructor(id) {
|
|
52
|
+
this.id = id;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const USER_ID = Parameter.create();
|
|
56
|
+
container.registerClass(User, { param: [USER_ID] });
|
|
57
|
+
// Attempt to resolve without providing the required parameter
|
|
58
|
+
let error;
|
|
59
|
+
try {
|
|
60
|
+
await container.instance(User);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
error = e;
|
|
64
|
+
}
|
|
65
|
+
expect(error).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// Test resolving with extra parameter values
|
|
69
|
+
describe('Extra Parameter Values', () => {
|
|
70
|
+
it('should ignore extra parameter values', async () => {
|
|
71
|
+
const container = createContainer();
|
|
72
|
+
class User {
|
|
73
|
+
constructor(id) {
|
|
74
|
+
this.id = id;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const USER_ID = Parameter.create();
|
|
78
|
+
const EXTRA_PARAM = Parameter.create();
|
|
79
|
+
container.registerClass(User, { param: [USER_ID] });
|
|
80
|
+
// Provide an extra parameter that isn't used
|
|
81
|
+
const user = await container.instance(User, [
|
|
82
|
+
USER_ID.value(1),
|
|
83
|
+
EXTRA_PARAM.value('extra')
|
|
84
|
+
]);
|
|
85
|
+
expect(user).toBeInstanceOf(User);
|
|
86
|
+
expect(user.id).toBe(1);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=ContainerBasic.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContainerBasic.test.js","sourceRoot":"","sources":["../../../../framework/implementation/ContainerBasic.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'reflect-metadata';
|