@praxisjs/di 1.2.0 → 1.2.2
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/CHANGELOG.md +14 -0
- package/dist/__tests__/container.test.js +27 -39
- package/dist/__tests__/container.test.js.map +1 -1
- package/dist/__tests__/decorators.test.js +145 -33
- package/dist/__tests__/decorators.test.js.map +1 -1
- package/dist/container.d.ts +0 -2
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +4 -25
- package/dist/container.js.map +1 -1
- package/dist/decorators.d.ts +0 -13
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +28 -16
- package/dist/decorators.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/container.test.ts +27 -40
- package/src/__tests__/decorators.test.ts +8 -8
- package/src/container.ts +4 -57
- package/src/decorators.ts +33 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @praxisjs/di
|
|
2
2
|
|
|
3
|
+
## 1.2.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [5a10864]
|
|
8
|
+
- @praxisjs/core@1.3.0
|
|
9
|
+
- @praxisjs/decorators@0.7.3
|
|
10
|
+
|
|
11
|
+
## 1.2.1
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 7e90df6: Refactor `@Injectable` and `@Scope` to use `ClassBehavior` / `createClassDecorator` from `@praxisjs/decorators`. Simplify `Container.instantiate` to plain `new target()`, removing the internal TC39 metadata maps (`constructorDepsMap`, `propDepsMap`) and the associated `setConstructorDeps` / `setPropDep` helpers.
|
|
16
|
+
|
|
3
17
|
## 1.2.0
|
|
4
18
|
|
|
5
19
|
### Minor Changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { Container, Token, token
|
|
2
|
+
import { Container, Token, token } from "../container";
|
|
3
3
|
describe("Token", () => {
|
|
4
4
|
it("stores description", () => {
|
|
5
5
|
const t = new Token("MY_SERVICE");
|
|
@@ -85,17 +85,15 @@ describe("Container", () => {
|
|
|
85
85
|
const c = new Container();
|
|
86
86
|
expect(c.register(A).register(B)).toBe(c);
|
|
87
87
|
});
|
|
88
|
-
it("
|
|
89
|
-
class
|
|
90
|
-
}
|
|
91
|
-
class Service {
|
|
88
|
+
it("parent singleton is reused when resolved from child container", () => {
|
|
89
|
+
class SharedService {
|
|
92
90
|
}
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const
|
|
98
|
-
expect(
|
|
91
|
+
const parent = new Container();
|
|
92
|
+
parent.register(SharedService, { scope: "singleton" });
|
|
93
|
+
const child = parent.createChild();
|
|
94
|
+
const fromChild = child.resolve(SharedService);
|
|
95
|
+
const fromParent = parent.resolve(SharedService);
|
|
96
|
+
expect(fromChild).toBe(fromParent);
|
|
99
97
|
});
|
|
100
98
|
it("child container falls back to parent for unregistered service", () => {
|
|
101
99
|
class MyDep {
|
|
@@ -113,21 +111,17 @@ describe("Container", () => {
|
|
|
113
111
|
const grandchild = child.createChild();
|
|
114
112
|
expect(grandchild.resolve(URL_TOKEN)).toBe("https://grandparent.com");
|
|
115
113
|
});
|
|
116
|
-
it("
|
|
117
|
-
class
|
|
118
|
-
}
|
|
119
|
-
class Car {
|
|
120
|
-
constructor(engine) {
|
|
121
|
-
this.engine = engine;
|
|
122
|
-
}
|
|
114
|
+
it("registerFactory can resolve other services from the container", () => {
|
|
115
|
+
class Logger {
|
|
123
116
|
}
|
|
117
|
+
const LOG_WRAP = token("LOG_WRAP");
|
|
124
118
|
const c = new Container();
|
|
125
|
-
c.register(
|
|
126
|
-
c.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
expect(
|
|
119
|
+
c.register(Logger);
|
|
120
|
+
c.registerFactory(LOG_WRAP, (container) => ({
|
|
121
|
+
logger: container.resolve(Logger),
|
|
122
|
+
}));
|
|
123
|
+
const result = c.resolve(LOG_WRAP);
|
|
124
|
+
expect(result.logger).toBeInstanceOf(Logger);
|
|
131
125
|
});
|
|
132
126
|
it("registering the same class twice replaces the previous registration", () => {
|
|
133
127
|
class Counter {
|
|
@@ -145,23 +139,17 @@ describe("Container", () => {
|
|
|
145
139
|
expect(second).toBeInstanceOf(Counter);
|
|
146
140
|
expect(second).not.toBe(first);
|
|
147
141
|
});
|
|
148
|
-
it("
|
|
149
|
-
class
|
|
150
|
-
constructor(b) {
|
|
151
|
-
this.b = b;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
class B {
|
|
155
|
-
constructor(a) {
|
|
156
|
-
this.a = a;
|
|
157
|
-
}
|
|
142
|
+
it("re-registering with different scope switches scope correctly", () => {
|
|
143
|
+
class Svc {
|
|
158
144
|
}
|
|
159
145
|
const c = new Container();
|
|
160
|
-
c.register(
|
|
161
|
-
c.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
146
|
+
c.register(Svc, { scope: "singleton" });
|
|
147
|
+
c.resolve(Svc); // warm up singleton
|
|
148
|
+
c.register(Svc, { scope: "transient" });
|
|
149
|
+
const a = c.resolve(Svc);
|
|
150
|
+
const b = c.resolve(Svc);
|
|
151
|
+
expect(a).toBeInstanceOf(Svc);
|
|
152
|
+
expect(a).not.toBe(b);
|
|
165
153
|
});
|
|
166
154
|
it("factory function that throws — error message includes which service failed", () => {
|
|
167
155
|
class Broken {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,39 +55,95 @@ function makeFieldCtx(name) {
|
|
|
55
55
|
// ── @Injectable ───────────────────────────────────────────────────────────────
|
|
56
56
|
describe("Injectable", () => {
|
|
57
57
|
it("with no arguments — defaults to singleton scope", () => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
let SingletonByDefault = (() => {
|
|
59
|
+
let _classDecorators = [Injectable()];
|
|
60
|
+
let _classDescriptor;
|
|
61
|
+
let _classExtraInitializers = [];
|
|
62
|
+
let _classThis;
|
|
63
|
+
var SingletonByDefault = class {
|
|
64
|
+
static { _classThis = this; }
|
|
65
|
+
static {
|
|
66
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
67
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
68
|
+
SingletonByDefault = _classThis = _classDescriptor.value;
|
|
69
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
70
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
return SingletonByDefault = _classThis;
|
|
74
|
+
})();
|
|
61
75
|
const a = container.resolve(SingletonByDefault);
|
|
62
76
|
const b = container.resolve(SingletonByDefault);
|
|
63
77
|
expect(a).toBe(b);
|
|
64
78
|
});
|
|
65
79
|
it("registers the class in the global container", () => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
let MyService = (() => {
|
|
81
|
+
let _classDecorators = [Injectable()];
|
|
82
|
+
let _classDescriptor;
|
|
83
|
+
let _classExtraInitializers = [];
|
|
84
|
+
let _classThis;
|
|
85
|
+
var MyService = class {
|
|
86
|
+
static { _classThis = this; }
|
|
87
|
+
static {
|
|
88
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
89
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
90
|
+
MyService = _classThis = _classDescriptor.value;
|
|
91
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
92
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
93
|
+
}
|
|
94
|
+
greet() {
|
|
95
|
+
return "hello";
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
return MyService = _classThis;
|
|
99
|
+
})();
|
|
72
100
|
expect(container.resolve(MyService)).toBeInstanceOf(MyService);
|
|
73
101
|
expect(container.resolve(MyService).greet()).toBe("hello");
|
|
74
102
|
});
|
|
75
103
|
it("registers with transient scope — each resolve returns a new instance", () => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
104
|
+
let TmpService = (() => {
|
|
105
|
+
let _classDecorators = [Injectable({ scope: "transient" })];
|
|
106
|
+
let _classDescriptor;
|
|
107
|
+
let _classExtraInitializers = [];
|
|
108
|
+
let _classThis;
|
|
109
|
+
var TmpService = class {
|
|
110
|
+
static { _classThis = this; }
|
|
111
|
+
static {
|
|
112
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
113
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
114
|
+
TmpService = _classThis = _classDescriptor.value;
|
|
115
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
116
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return TmpService = _classThis;
|
|
120
|
+
})();
|
|
79
121
|
expect(container.resolve(TmpService)).not.toBe(container.resolve(TmpService));
|
|
80
122
|
});
|
|
81
123
|
});
|
|
82
124
|
// ── @Inject ───────────────────────────────────────────────────────────────────
|
|
83
125
|
describe("Inject", () => {
|
|
84
126
|
it("injects a registered service via property", () => {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
127
|
+
let Logger = (() => {
|
|
128
|
+
let _classDecorators = [Injectable()];
|
|
129
|
+
let _classDescriptor;
|
|
130
|
+
let _classExtraInitializers = [];
|
|
131
|
+
let _classThis;
|
|
132
|
+
var Logger = class {
|
|
133
|
+
static { _classThis = this; }
|
|
134
|
+
static {
|
|
135
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
136
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
137
|
+
Logger = _classThis = _classDescriptor.value;
|
|
138
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
139
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
140
|
+
}
|
|
141
|
+
log(msg) {
|
|
142
|
+
return msg;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
return Logger = _classThis;
|
|
146
|
+
})();
|
|
91
147
|
const { ctx, run } = makeFieldCtx("logger");
|
|
92
148
|
Inject(Logger)(undefined, ctx);
|
|
93
149
|
const instance = {};
|
|
@@ -108,9 +164,23 @@ describe("Inject", () => {
|
|
|
108
164
|
expect(() => instance.dep).toThrow("[Inject]");
|
|
109
165
|
});
|
|
110
166
|
it("warns on direct assignment in non-production", () => {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
167
|
+
let Dep2 = (() => {
|
|
168
|
+
let _classDecorators = [Injectable()];
|
|
169
|
+
let _classDescriptor;
|
|
170
|
+
let _classExtraInitializers = [];
|
|
171
|
+
let _classThis;
|
|
172
|
+
var Dep2 = class {
|
|
173
|
+
static { _classThis = this; }
|
|
174
|
+
static {
|
|
175
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
176
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
177
|
+
Dep2 = _classThis = _classDescriptor.value;
|
|
178
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
179
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
return Dep2 = _classThis;
|
|
183
|
+
})();
|
|
114
184
|
const { ctx, run } = makeFieldCtx("dep2");
|
|
115
185
|
Inject(Dep2)(undefined, ctx);
|
|
116
186
|
const instance = {};
|
|
@@ -121,12 +191,26 @@ describe("Inject", () => {
|
|
|
121
191
|
spy.mockRestore();
|
|
122
192
|
});
|
|
123
193
|
it("returns cached value on second access (cache hit)", () => {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
194
|
+
let CachedService = (() => {
|
|
195
|
+
let _classDecorators = [Injectable()];
|
|
196
|
+
let _classDescriptor;
|
|
197
|
+
let _classExtraInitializers = [];
|
|
198
|
+
let _classThis;
|
|
199
|
+
var CachedService = class {
|
|
200
|
+
static { _classThis = this; }
|
|
201
|
+
constructor() {
|
|
202
|
+
this.id = Math.random();
|
|
203
|
+
}
|
|
204
|
+
static {
|
|
205
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
206
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
207
|
+
CachedService = _classThis = _classDescriptor.value;
|
|
208
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
209
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
return CachedService = _classThis;
|
|
213
|
+
})();
|
|
130
214
|
const { ctx, run } = makeFieldCtx("svc");
|
|
131
215
|
Inject(CachedService)(undefined, ctx);
|
|
132
216
|
const instance = {};
|
|
@@ -136,9 +220,23 @@ describe("Inject", () => {
|
|
|
136
220
|
expect(first).toBe(second); // same cached instance
|
|
137
221
|
});
|
|
138
222
|
it("does not warn on direct assignment in production mode", () => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
223
|
+
let ProdDep = (() => {
|
|
224
|
+
let _classDecorators = [Injectable()];
|
|
225
|
+
let _classDescriptor;
|
|
226
|
+
let _classExtraInitializers = [];
|
|
227
|
+
let _classThis;
|
|
228
|
+
var ProdDep = class {
|
|
229
|
+
static { _classThis = this; }
|
|
230
|
+
static {
|
|
231
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
232
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
233
|
+
ProdDep = _classThis = _classDescriptor.value;
|
|
234
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
235
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
return ProdDep = _classThis;
|
|
239
|
+
})();
|
|
142
240
|
const { ctx, run } = makeFieldCtx("dep");
|
|
143
241
|
Inject(ProdDep)(undefined, ctx);
|
|
144
242
|
const instance = {};
|
|
@@ -310,9 +408,23 @@ describe("Scope", () => {
|
|
|
310
408
|
expect(instance.container).not.toBe(container);
|
|
311
409
|
});
|
|
312
410
|
it("child container inherits registrations from the parent", () => {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
411
|
+
let GlobalService = (() => {
|
|
412
|
+
let _classDecorators = [Injectable()];
|
|
413
|
+
let _classDescriptor;
|
|
414
|
+
let _classExtraInitializers = [];
|
|
415
|
+
let _classThis;
|
|
416
|
+
var GlobalService = class {
|
|
417
|
+
static { _classThis = this; }
|
|
418
|
+
static {
|
|
419
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
420
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
421
|
+
GlobalService = _classThis = _classDescriptor.value;
|
|
422
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
423
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
return GlobalService = _classThis;
|
|
427
|
+
})();
|
|
316
428
|
let Child = (() => {
|
|
317
429
|
let _classDecorators = [Scope()];
|
|
318
430
|
let _classDescriptor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.test.js","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"decorators.test.js","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":"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"}
|
package/dist/container.d.ts
CHANGED
|
@@ -8,8 +8,6 @@ export interface ServiceDescriptor {
|
|
|
8
8
|
instance?: unknown;
|
|
9
9
|
}
|
|
10
10
|
export type Constructor<T = unknown> = new (...args: any[]) => T;
|
|
11
|
-
export declare function setConstructorDeps(target: Constructor, deps: Array<Constructor | Token<unknown>>): void;
|
|
12
|
-
export declare function setPropDep(prototype: object, prop: string, dep: Constructor | Token<unknown>): void;
|
|
13
11
|
export declare class Token<_T> {
|
|
14
12
|
readonly description: string;
|
|
15
13
|
constructor(description: string);
|
package/dist/container.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAGD,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAGD,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEjE,qBAAa,KAAK,CAAC,EAAE;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBACjB,WAAW,EAAE,MAAM;IAG/B,QAAQ;CAGT;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAEtD;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY;gBAExB,MAAM,CAAC,EAAE,SAAS;IAI9B,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI;IAQ1E,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKjD,eAAe,CAAC,CAAC,EACf,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,CAAC,GACnC,IAAI;IAKP,OAAO,CAAC,CAAC,EACP,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EACjC,eAAe,6CAA0C,GACxD,CAAC;IAwCJ,OAAO,CAAC,WAAW;IAWnB,WAAW,IAAI,SAAS;CAGzB;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
package/dist/container.js
CHANGED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
// TC39-compatible metadata storage
|
|
2
|
-
const constructorDepsMap = new WeakMap();
|
|
3
|
-
const propDepsMap = new WeakMap();
|
|
4
|
-
export function setConstructorDeps(target, deps) {
|
|
5
|
-
constructorDepsMap.set(target, deps);
|
|
6
|
-
}
|
|
7
|
-
export function setPropDep(prototype, prop, dep) {
|
|
8
|
-
if (!propDepsMap.has(prototype)) {
|
|
9
|
-
propDepsMap.set(prototype, new Map());
|
|
10
|
-
}
|
|
11
|
-
propDepsMap.get(prototype)?.set(prop, dep);
|
|
12
|
-
}
|
|
13
1
|
export class Token {
|
|
14
2
|
constructor(description) {
|
|
15
3
|
this.description = description;
|
|
@@ -66,33 +54,24 @@ export class Container {
|
|
|
66
54
|
}
|
|
67
55
|
const descriptor = entry;
|
|
68
56
|
if (descriptor.scope === "singleton") {
|
|
69
|
-
descriptor.instance ??= this.instantiate(descriptor.target
|
|
57
|
+
descriptor.instance ??= this.instantiate(descriptor.target);
|
|
70
58
|
return descriptor.instance;
|
|
71
59
|
}
|
|
72
|
-
return this.instantiate(descriptor.target
|
|
60
|
+
return this.instantiate(descriptor.target);
|
|
73
61
|
}
|
|
74
62
|
finally {
|
|
75
63
|
resolutionStack.delete(key);
|
|
76
64
|
}
|
|
77
65
|
}
|
|
78
|
-
instantiate(target
|
|
79
|
-
const deps = constructorDepsMap.get(target) ?? [];
|
|
80
|
-
const resolvedDeps = deps.map((dep) => this.resolve(dep, resolutionStack));
|
|
81
|
-
let instance;
|
|
66
|
+
instantiate(target) {
|
|
82
67
|
try {
|
|
83
|
-
|
|
68
|
+
return new target();
|
|
84
69
|
}
|
|
85
70
|
catch (err) {
|
|
86
71
|
if (err instanceof Error && err.message.startsWith("[DI]"))
|
|
87
72
|
throw err;
|
|
88
73
|
throw new Error(`[DI] Failed to instantiate "${target.name}": ${err.message}`);
|
|
89
74
|
}
|
|
90
|
-
const propInjections = propDepsMap.get(target.prototype) ??
|
|
91
|
-
new Map();
|
|
92
|
-
for (const [prop, dep] of propInjections) {
|
|
93
|
-
instance[prop] = this.resolve(dep, resolutionStack);
|
|
94
|
-
}
|
|
95
|
-
return instance;
|
|
96
75
|
}
|
|
97
76
|
createChild() {
|
|
98
77
|
return new Container(this);
|
package/dist/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAeA,
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,KAAK;IAEhB,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IACD,QAAQ;QACN,OAAO,SAAS,IAAI,CAAC,WAAW,GAAG,CAAC;IACtC,CAAC;CACF;AAED,MAAM,UAAU,KAAK,CAAI,WAAmB;IAC1C,OAAO,IAAI,KAAK,CAAI,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,OAAO,SAAS;IAIpB,YAAY,MAAkB;QAHb,aAAQ,GAAG,IAAI,GAAG,EAAyC,CAAC;QAI3E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ,CAAI,MAAsB,EAAE,UAA6B,EAAE;QACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;YACxB,MAAM;YACN,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,WAAW;SACR,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAI,KAAe,EAAE,KAAQ;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CACb,KAAe,EACf,OAAoC;QAEpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,MAAiC,EACjC,kBAAkB,IAAI,GAAG,EAAgC;QAEzD,MAAM,GAAG,GAAG,MAAsC,CAAC;QAEnD,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,CAAC;iBACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACxD,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAErC,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;gBAC5B,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,KAAU,CAAC;gBAC3C,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpD,MAAM,IAAI,KAAK,CACb,gCAAiC,MAAsB,CAAC,IAAI,EAAE,CAC/D,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,KAA0B,CAAC;YAE9C,IAAI,UAAU,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;gBACrC,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC5D,OAAO,UAAU,CAAC,QAAa,CAAC;YAClC,CAAC;YAED,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAM,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,WAAW,CAAI,MAAsB;QAC3C,IAAI,CAAC;YACH,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,MAAM,GAAG,CAAC;YACtE,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,IAAI,MAAO,GAAa,CAAC,OAAO,EAAE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
|
package/dist/decorators.d.ts
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
import { type Container, Token, type Constructor, type InjectableOptions } from "./container";
|
|
2
2
|
export declare function Injectable(options?: InjectableOptions): (value: Constructor, _context: ClassDecoratorContext) => void;
|
|
3
|
-
/**
|
|
4
|
-
* Creates a child DI container scoped to each instance of the decorated class.
|
|
5
|
-
* Services registered in the configure callback are available within the scope,
|
|
6
|
-
* and @Inject / @InjectContainer will resolve from it automatically.
|
|
7
|
-
*
|
|
8
|
-
* @Scope((c) => {
|
|
9
|
-
* c.register(UserRepository);
|
|
10
|
-
* c.registerValue(AuthToken, 'abc');
|
|
11
|
-
* })
|
|
12
|
-
* class UserModule extends StatefulComponent {
|
|
13
|
-
* @Inject(UserRepository) repo!: UserRepository;
|
|
14
|
-
* }
|
|
15
|
-
*/
|
|
16
3
|
export declare function Scope(configure?: (c: Container) => void): (cls: new (...args: any[]) => any, _ctx: ClassDecoratorContext) => any;
|
|
17
4
|
export declare function Inject<T>(dep: Constructor<T> | Token<T>): (_value: undefined, context: ClassFieldDecoratorContext<any>) => void;
|
|
18
5
|
export declare function InjectContainer(): (_value: undefined, context: ClassFieldDecoratorContext<any>) => void;
|
package/dist/decorators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA0BzG,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAEmB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,qBAAqB,KAAK,IAAI,CACzI;AA8BD,wBAAgB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,GAEkB,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,EAAE,qBAAqB,KAAK,GAAG,CAC/I;AAID,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAsCrC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,CAAC,GAAG,CAAC,KAAK,IAAI,CACvF;AAID,wBAAgB,eAAe,IAkBZ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,CAAC,GAAG,CAAC,KAAK,IAAI,CACvF"}
|
package/dist/decorators.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createFieldDecorator } from "@praxisjs/decorators";
|
|
1
|
+
import { createFieldDecorator, createClassDecorator, ClassBehavior } from "@praxisjs/decorators";
|
|
2
2
|
import { container, Token } from "./container";
|
|
3
3
|
// Maps instances to their scoped child containers (set by @Scope).
|
|
4
4
|
const scopedContainers = new WeakMap();
|
|
@@ -6,10 +6,21 @@ function resolveFrom(instance) {
|
|
|
6
6
|
return scopedContainers.get(instance) ?? container;
|
|
7
7
|
}
|
|
8
8
|
// ── @Injectable ───────────────────────────────────────────────────────────────
|
|
9
|
+
class InjectableBehavior extends ClassBehavior {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
super();
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
create(_instance) {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
initialize(Enhanced, _original) {
|
|
19
|
+
container.register(Enhanced, this.options);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
9
22
|
export function Injectable(options = {}) {
|
|
10
|
-
return
|
|
11
|
-
container.register(value, options);
|
|
12
|
-
};
|
|
23
|
+
return createClassDecorator(new InjectableBehavior(options));
|
|
13
24
|
}
|
|
14
25
|
// ── @Scope ────────────────────────────────────────────────────────────────────
|
|
15
26
|
/**
|
|
@@ -25,20 +36,21 @@ export function Injectable(options = {}) {
|
|
|
25
36
|
* @Inject(UserRepository) repo!: UserRepository;
|
|
26
37
|
* }
|
|
27
38
|
*/
|
|
39
|
+
class ScopeBehavior extends ClassBehavior {
|
|
40
|
+
constructor(configure) {
|
|
41
|
+
super();
|
|
42
|
+
this.configure = configure;
|
|
43
|
+
}
|
|
44
|
+
create(instance) {
|
|
45
|
+
const child = container.createChild();
|
|
46
|
+
this.configure?.(child);
|
|
47
|
+
scopedContainers.set(instance, child);
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
28
51
|
export function Scope(configure) {
|
|
29
52
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
-
return
|
|
31
|
-
return class extends cls {
|
|
32
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
-
constructor(...args) {
|
|
34
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
35
|
-
super(...args);
|
|
36
|
-
const child = container.createChild();
|
|
37
|
-
configure?.(child);
|
|
38
|
-
scopedContainers.set(this, child);
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
};
|
|
53
|
+
return createClassDecorator(new ScopeBehavior(configure));
|
|
42
54
|
}
|
|
43
55
|
// ── @Inject ───────────────────────────────────────────────────────────────────
|
|
44
56
|
export function Inject(dep) {
|
package/dist/decorators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisjs/di",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@praxisjs/core": "1.
|
|
15
|
-
"@praxisjs/decorators": "0.7.
|
|
14
|
+
"@praxisjs/core": "1.3.0",
|
|
15
|
+
"@praxisjs/decorators": "0.7.3"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@types/node": "^25.5.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
2
|
|
|
3
|
-
import { Container, Token, token,
|
|
3
|
+
import { Container, Token, token, type Constructor } from "../container";
|
|
4
4
|
|
|
5
5
|
describe("Token", () => {
|
|
6
6
|
it("stores description", () => {
|
|
@@ -93,20 +93,15 @@ describe("Container", () => {
|
|
|
93
93
|
expect(c.register(A).register(B)).toBe(c);
|
|
94
94
|
});
|
|
95
95
|
|
|
96
|
-
it("
|
|
97
|
-
class
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const c = new Container();
|
|
103
|
-
c.register(Logger);
|
|
104
|
-
c.register(Service);
|
|
105
|
-
|
|
106
|
-
setPropDep(Service.prototype, "logger", Logger);
|
|
96
|
+
it("parent singleton is reused when resolved from child container", () => {
|
|
97
|
+
class SharedService {}
|
|
98
|
+
const parent = new Container();
|
|
99
|
+
parent.register(SharedService, { scope: "singleton" });
|
|
100
|
+
const child = parent.createChild();
|
|
107
101
|
|
|
108
|
-
const
|
|
109
|
-
|
|
102
|
+
const fromChild = child.resolve(SharedService);
|
|
103
|
+
const fromParent = parent.resolve(SharedService);
|
|
104
|
+
expect(fromChild).toBe(fromParent);
|
|
110
105
|
});
|
|
111
106
|
|
|
112
107
|
it("child container falls back to parent for unregistered service", () => {
|
|
@@ -126,21 +121,16 @@ describe("Container", () => {
|
|
|
126
121
|
expect(grandchild.resolve(URL_TOKEN)).toBe("https://grandparent.com");
|
|
127
122
|
});
|
|
128
123
|
|
|
129
|
-
it("
|
|
130
|
-
class
|
|
131
|
-
|
|
132
|
-
constructor(public engine: Engine) {}
|
|
133
|
-
}
|
|
134
|
-
|
|
124
|
+
it("registerFactory can resolve other services from the container", () => {
|
|
125
|
+
class Logger {}
|
|
126
|
+
const LOG_WRAP = token<{ logger: Logger }>("LOG_WRAP");
|
|
135
127
|
const c = new Container();
|
|
136
|
-
c.register(
|
|
137
|
-
c.
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
expect(car).toBeInstanceOf(Car);
|
|
143
|
-
expect(car.engine).toBeInstanceOf(Engine);
|
|
128
|
+
c.register(Logger);
|
|
129
|
+
c.registerFactory(LOG_WRAP, (container) => ({
|
|
130
|
+
logger: container.resolve(Logger),
|
|
131
|
+
}));
|
|
132
|
+
const result = c.resolve(LOG_WRAP);
|
|
133
|
+
expect(result.logger).toBeInstanceOf(Logger);
|
|
144
134
|
});
|
|
145
135
|
|
|
146
136
|
it("registering the same class twice replaces the previous registration", () => {
|
|
@@ -160,20 +150,17 @@ describe("Container", () => {
|
|
|
160
150
|
expect(second).not.toBe(first);
|
|
161
151
|
});
|
|
162
152
|
|
|
163
|
-
it("
|
|
164
|
-
class
|
|
165
|
-
constructor(public b: unknown) {}
|
|
166
|
-
}
|
|
167
|
-
class B {
|
|
168
|
-
constructor(public a: unknown) {}
|
|
169
|
-
}
|
|
153
|
+
it("re-registering with different scope switches scope correctly", () => {
|
|
154
|
+
class Svc {}
|
|
170
155
|
const c = new Container();
|
|
171
|
-
c.register(
|
|
172
|
-
c.
|
|
173
|
-
setConstructorDeps(A, [B]);
|
|
174
|
-
setConstructorDeps(B, [A]);
|
|
156
|
+
c.register(Svc, { scope: "singleton" });
|
|
157
|
+
c.resolve(Svc); // warm up singleton
|
|
175
158
|
|
|
176
|
-
|
|
159
|
+
c.register(Svc, { scope: "transient" });
|
|
160
|
+
const a = c.resolve(Svc);
|
|
161
|
+
const b = c.resolve(Svc);
|
|
162
|
+
expect(a).toBeInstanceOf(Svc);
|
|
163
|
+
expect(a).not.toBe(b);
|
|
177
164
|
});
|
|
178
165
|
|
|
179
166
|
it("factory function that throws — error message includes which service failed", () => {
|
|
@@ -25,27 +25,27 @@ function makeFieldCtx(name: string) {
|
|
|
25
25
|
|
|
26
26
|
describe("Injectable", () => {
|
|
27
27
|
it("with no arguments — defaults to singleton scope", () => {
|
|
28
|
+
@Injectable()
|
|
28
29
|
class SingletonByDefault {}
|
|
29
|
-
Injectable()(SingletonByDefault, {} as ClassDecoratorContext);
|
|
30
30
|
const a = container.resolve(SingletonByDefault);
|
|
31
31
|
const b = container.resolve(SingletonByDefault);
|
|
32
32
|
expect(a).toBe(b);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
it("registers the class in the global container", () => {
|
|
36
|
+
@Injectable()
|
|
36
37
|
class MyService {
|
|
37
38
|
greet() {
|
|
38
39
|
return "hello";
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
|
-
Injectable()(MyService, {} as ClassDecoratorContext);
|
|
42
42
|
expect(container.resolve(MyService)).toBeInstanceOf(MyService);
|
|
43
43
|
expect(container.resolve(MyService).greet()).toBe("hello");
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
it("registers with transient scope — each resolve returns a new instance", () => {
|
|
47
|
+
@Injectable({ scope: "transient" })
|
|
47
48
|
class TmpService {}
|
|
48
|
-
Injectable({ scope: "transient" })(TmpService, {} as ClassDecoratorContext);
|
|
49
49
|
expect(container.resolve(TmpService)).not.toBe(
|
|
50
50
|
container.resolve(TmpService),
|
|
51
51
|
);
|
|
@@ -56,12 +56,12 @@ describe("Injectable", () => {
|
|
|
56
56
|
|
|
57
57
|
describe("Inject", () => {
|
|
58
58
|
it("injects a registered service via property", () => {
|
|
59
|
+
@Injectable()
|
|
59
60
|
class Logger {
|
|
60
61
|
log(msg: string) {
|
|
61
62
|
return msg;
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
|
-
Injectable()(Logger, {} as ClassDecoratorContext);
|
|
65
65
|
|
|
66
66
|
const { ctx, run } = makeFieldCtx("logger");
|
|
67
67
|
Inject(Logger)(undefined, ctx);
|
|
@@ -83,8 +83,8 @@ describe("Inject", () => {
|
|
|
83
83
|
});
|
|
84
84
|
|
|
85
85
|
it("warns on direct assignment in non-production", () => {
|
|
86
|
+
@Injectable()
|
|
86
87
|
class Dep2 {}
|
|
87
|
-
Injectable()(Dep2, {} as ClassDecoratorContext);
|
|
88
88
|
const { ctx, run } = makeFieldCtx("dep2");
|
|
89
89
|
Inject(Dep2)(undefined, ctx);
|
|
90
90
|
const instance: Record<string, unknown> = {};
|
|
@@ -96,10 +96,10 @@ describe("Inject", () => {
|
|
|
96
96
|
});
|
|
97
97
|
|
|
98
98
|
it("returns cached value on second access (cache hit)", () => {
|
|
99
|
+
@Injectable()
|
|
99
100
|
class CachedService {
|
|
100
101
|
id = Math.random();
|
|
101
102
|
}
|
|
102
|
-
Injectable()(CachedService, {} as ClassDecoratorContext);
|
|
103
103
|
|
|
104
104
|
const { ctx, run } = makeFieldCtx("svc");
|
|
105
105
|
Inject(CachedService)(undefined, ctx);
|
|
@@ -112,8 +112,8 @@ describe("Inject", () => {
|
|
|
112
112
|
});
|
|
113
113
|
|
|
114
114
|
it("does not warn on direct assignment in production mode", () => {
|
|
115
|
+
@Injectable()
|
|
115
116
|
class ProdDep {}
|
|
116
|
-
Injectable()(ProdDep, {} as ClassDecoratorContext);
|
|
117
117
|
const { ctx, run } = makeFieldCtx("dep");
|
|
118
118
|
Inject(ProdDep)(undefined, ctx);
|
|
119
119
|
const instance: Record<string, unknown> = {};
|
|
@@ -249,8 +249,8 @@ describe("Scope", () => {
|
|
|
249
249
|
});
|
|
250
250
|
|
|
251
251
|
it("child container inherits registrations from the parent", () => {
|
|
252
|
+
@Injectable()
|
|
252
253
|
class GlobalService {}
|
|
253
|
-
Injectable()(GlobalService, {} as ClassDecoratorContext);
|
|
254
254
|
|
|
255
255
|
@Scope()
|
|
256
256
|
class Child {}
|
package/src/container.ts
CHANGED
|
@@ -13,34 +13,6 @@ export interface ServiceDescriptor {
|
|
|
13
13
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
14
|
export type Constructor<T = unknown> = new (...args: any[]) => T;
|
|
15
15
|
|
|
16
|
-
// TC39-compatible metadata storage
|
|
17
|
-
const constructorDepsMap = new WeakMap<
|
|
18
|
-
Constructor,
|
|
19
|
-
Array<Constructor | Token<unknown>>
|
|
20
|
-
>();
|
|
21
|
-
const propDepsMap = new WeakMap<
|
|
22
|
-
object,
|
|
23
|
-
Map<string, Constructor | Token<unknown>>
|
|
24
|
-
>();
|
|
25
|
-
|
|
26
|
-
export function setConstructorDeps(
|
|
27
|
-
target: Constructor,
|
|
28
|
-
deps: Array<Constructor | Token<unknown>>,
|
|
29
|
-
): void {
|
|
30
|
-
constructorDepsMap.set(target, deps);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function setPropDep(
|
|
34
|
-
prototype: object,
|
|
35
|
-
prop: string,
|
|
36
|
-
dep: Constructor | Token<unknown>,
|
|
37
|
-
): void {
|
|
38
|
-
if (!propDepsMap.has(prototype)) {
|
|
39
|
-
propDepsMap.set(prototype, new Map());
|
|
40
|
-
}
|
|
41
|
-
propDepsMap.get(prototype)?.set(prop, dep);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
16
|
export class Token<_T> {
|
|
45
17
|
readonly description: string;
|
|
46
18
|
constructor(description: string) {
|
|
@@ -117,50 +89,25 @@ export class Container {
|
|
|
117
89
|
const descriptor = entry as ServiceDescriptor;
|
|
118
90
|
|
|
119
91
|
if (descriptor.scope === "singleton") {
|
|
120
|
-
descriptor.instance ??= this.instantiate(
|
|
121
|
-
descriptor.target,
|
|
122
|
-
resolutionStack,
|
|
123
|
-
);
|
|
92
|
+
descriptor.instance ??= this.instantiate(descriptor.target);
|
|
124
93
|
return descriptor.instance as T;
|
|
125
94
|
}
|
|
126
95
|
|
|
127
|
-
return this.instantiate(descriptor.target
|
|
96
|
+
return this.instantiate(descriptor.target) as T;
|
|
128
97
|
} finally {
|
|
129
98
|
resolutionStack.delete(key);
|
|
130
99
|
}
|
|
131
100
|
}
|
|
132
101
|
|
|
133
|
-
private instantiate<T>(
|
|
134
|
-
target: Constructor<T>,
|
|
135
|
-
resolutionStack = new Set<Constructor | Token<unknown>>(),
|
|
136
|
-
): T {
|
|
137
|
-
const deps = constructorDepsMap.get(target as Constructor) ?? [];
|
|
138
|
-
|
|
139
|
-
const resolvedDeps = deps.map((dep) =>
|
|
140
|
-
this.resolve(dep as Constructor, resolutionStack),
|
|
141
|
-
);
|
|
142
|
-
let instance: T;
|
|
102
|
+
private instantiate<T>(target: Constructor<T>): T {
|
|
143
103
|
try {
|
|
144
|
-
|
|
104
|
+
return new target();
|
|
145
105
|
} catch (err) {
|
|
146
106
|
if (err instanceof Error && err.message.startsWith("[DI]")) throw err;
|
|
147
107
|
throw new Error(
|
|
148
108
|
`[DI] Failed to instantiate "${target.name}": ${(err as Error).message}`,
|
|
149
109
|
);
|
|
150
110
|
}
|
|
151
|
-
|
|
152
|
-
const propInjections =
|
|
153
|
-
propDepsMap.get(target.prototype as object) ??
|
|
154
|
-
new Map<string, Constructor | Token<unknown>>();
|
|
155
|
-
|
|
156
|
-
for (const [prop, dep] of propInjections) {
|
|
157
|
-
(instance as Record<string, unknown>)[prop] = this.resolve(
|
|
158
|
-
dep as Constructor,
|
|
159
|
-
resolutionStack,
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return instance;
|
|
164
111
|
}
|
|
165
112
|
|
|
166
113
|
createChild(): Container {
|
package/src/decorators.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { RootComponent } from "@praxisjs/core/internal";
|
|
2
|
+
import { createFieldDecorator, createClassDecorator, ClassBehavior, type FieldBinding, type ClassEnhancement } from "@praxisjs/decorators";
|
|
2
3
|
|
|
3
4
|
import { container, type Container, Token, type Constructor, type InjectableOptions } from "./container";
|
|
4
5
|
|
|
@@ -11,10 +12,24 @@ function resolveFrom(instance: object) {
|
|
|
11
12
|
|
|
12
13
|
// ── @Injectable ───────────────────────────────────────────────────────────────
|
|
13
14
|
|
|
15
|
+
class InjectableBehavior extends ClassBehavior {
|
|
16
|
+
constructor(private readonly options: InjectableOptions) {
|
|
17
|
+
super();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
create(_instance: RootComponent): ClassEnhancement {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
initialize(Enhanced: new (...args: any[]) => unknown, _original: new (...args: any[]) => unknown): void {
|
|
26
|
+
container.register(Enhanced as Constructor, this.options);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
14
30
|
export function Injectable(options: InjectableOptions = {}) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
31
|
+
|
|
32
|
+
return createClassDecorator(new InjectableBehavior(options)) as unknown as (value: Constructor, _context: ClassDecoratorContext) => void;
|
|
18
33
|
}
|
|
19
34
|
|
|
20
35
|
// ── @Scope ────────────────────────────────────────────────────────────────────
|
|
@@ -32,21 +47,22 @@ export function Injectable(options: InjectableOptions = {}) {
|
|
|
32
47
|
* @Inject(UserRepository) repo!: UserRepository;
|
|
33
48
|
* }
|
|
34
49
|
*/
|
|
50
|
+
class ScopeBehavior extends ClassBehavior {
|
|
51
|
+
constructor(private readonly configure?: (c: Container) => void) {
|
|
52
|
+
super();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
create(instance: RootComponent): ClassEnhancement {
|
|
56
|
+
const child = container.createChild();
|
|
57
|
+
this.configure?.(child);
|
|
58
|
+
scopedContainers.set(instance as object, child);
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
35
63
|
export function Scope(configure?: (c: Container) => void) {
|
|
36
64
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
-
return
|
|
38
|
-
|
|
39
|
-
return class extends cls {
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
41
|
-
constructor(...args: any[]) {
|
|
42
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
43
|
-
super(...args);
|
|
44
|
-
const child = container.createChild();
|
|
45
|
-
configure?.(child);
|
|
46
|
-
scopedContainers.set(this as object, child);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
};
|
|
65
|
+
return createClassDecorator(new ScopeBehavior(configure)) as unknown as (cls: new (...args: any[]) => any, _ctx: ClassDecoratorContext) => any;
|
|
50
66
|
}
|
|
51
67
|
|
|
52
68
|
// ── @Inject ───────────────────────────────────────────────────────────────────
|