@praxisjs/di 0.2.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/dist/__tests__/container.test.js +108 -3
- package/dist/__tests__/container.test.js.map +1 -1
- package/dist/__tests__/decorators.test.js +322 -100
- package/dist/__tests__/decorators.test.js.map +1 -1
- package/dist/container.d.ts +2 -2
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +43 -24
- package/dist/container.js.map +1 -1
- package/dist/decorators.d.ts +16 -4
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +83 -45
- package/dist/decorators.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/__tests__/container.test.ts +106 -1
- package/src/__tests__/decorators.test.ts +204 -114
- package/src/container.ts +59 -25
- package/src/decorators.ts +99 -55
- package/src/index.ts +2 -3
|
@@ -1,155 +1,377 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
1
35
|
import "reflect-metadata";
|
|
2
36
|
import { describe, it, expect, vi } from "vitest";
|
|
3
|
-
import { Container, token } from "../container";
|
|
4
|
-
import { Injectable, Inject, InjectContainer,
|
|
5
|
-
|
|
37
|
+
import { Container, container, token } from "../container";
|
|
38
|
+
import { Injectable, Inject, InjectContainer, Scope, } from "../decorators";
|
|
39
|
+
function makeFieldCtx(name) {
|
|
40
|
+
const initializers = [];
|
|
41
|
+
return {
|
|
42
|
+
ctx: {
|
|
43
|
+
name,
|
|
44
|
+
kind: "field",
|
|
45
|
+
addInitializer(fn) { initializers.push(fn); },
|
|
46
|
+
},
|
|
47
|
+
run(instance) { initializers.forEach((fn) => { fn.call(instance); }); },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// ── @Injectable ───────────────────────────────────────────────────────────────
|
|
6
51
|
describe("Injectable", () => {
|
|
52
|
+
it("with no arguments — defaults to singleton scope", () => {
|
|
53
|
+
class SingletonByDefault {
|
|
54
|
+
}
|
|
55
|
+
Injectable()(SingletonByDefault, {});
|
|
56
|
+
const a = container.resolve(SingletonByDefault);
|
|
57
|
+
const b = container.resolve(SingletonByDefault);
|
|
58
|
+
expect(a).toBe(b);
|
|
59
|
+
});
|
|
7
60
|
it("registers the class in the global container", () => {
|
|
8
|
-
// We test via useService resolving without throwing
|
|
9
61
|
class MyService {
|
|
10
|
-
greet() {
|
|
11
|
-
return "hello";
|
|
12
|
-
}
|
|
62
|
+
greet() { return "hello"; }
|
|
13
63
|
}
|
|
14
64
|
Injectable()(MyService, {});
|
|
15
|
-
|
|
16
|
-
expect(
|
|
17
|
-
expect(instance.greet()).toBe("hello");
|
|
65
|
+
expect(container.resolve(MyService)).toBeInstanceOf(MyService);
|
|
66
|
+
expect(container.resolve(MyService).greet()).toBe("hello");
|
|
18
67
|
});
|
|
19
|
-
it("registers with transient scope", () => {
|
|
68
|
+
it("registers with transient scope — each resolve returns a new instance", () => {
|
|
20
69
|
class TmpService {
|
|
21
70
|
}
|
|
22
71
|
Injectable({ scope: "transient" })(TmpService, {});
|
|
23
|
-
|
|
24
|
-
const b = useService(TmpService);
|
|
25
|
-
expect(a).not.toBe(b);
|
|
72
|
+
expect(container.resolve(TmpService)).not.toBe(container.resolve(TmpService));
|
|
26
73
|
});
|
|
27
74
|
});
|
|
28
|
-
// ── Inject
|
|
75
|
+
// ── @Inject ───────────────────────────────────────────────────────────────────
|
|
29
76
|
describe("Inject", () => {
|
|
30
77
|
it("injects a registered service via property", () => {
|
|
31
78
|
class Logger {
|
|
32
|
-
log(msg) {
|
|
33
|
-
return msg;
|
|
34
|
-
}
|
|
79
|
+
log(msg) { return msg; }
|
|
35
80
|
}
|
|
36
81
|
Injectable()(Logger, {});
|
|
37
|
-
const
|
|
38
|
-
const ctx = {
|
|
39
|
-
name: "logger",
|
|
40
|
-
kind: "field",
|
|
41
|
-
addInitializer(fn) {
|
|
42
|
-
initializers.push(fn);
|
|
43
|
-
},
|
|
44
|
-
};
|
|
82
|
+
const { ctx, run } = makeFieldCtx("logger");
|
|
45
83
|
Inject(Logger)(undefined, ctx);
|
|
46
84
|
const instance = {};
|
|
47
|
-
|
|
48
|
-
fn.call(instance);
|
|
49
|
-
});
|
|
85
|
+
run(instance);
|
|
50
86
|
expect(instance.logger).toBeInstanceOf(Logger);
|
|
87
|
+
// second access covers the cache-hit branch (line 62: !cache.has(this) === false)
|
|
88
|
+
expect(instance.logger).toBe(instance.logger);
|
|
51
89
|
});
|
|
52
90
|
it("throws a descriptive error when dep is not registered", () => {
|
|
53
91
|
class UnknownDep {
|
|
54
92
|
}
|
|
55
|
-
const
|
|
56
|
-
const ctx = {
|
|
57
|
-
name: "dep",
|
|
58
|
-
kind: "field",
|
|
59
|
-
addInitializer(fn) {
|
|
60
|
-
initializers.push(fn);
|
|
61
|
-
},
|
|
62
|
-
};
|
|
93
|
+
const { ctx, run } = makeFieldCtx("dep");
|
|
63
94
|
Inject(UnknownDep)(undefined, ctx);
|
|
64
95
|
class MyClass {
|
|
65
|
-
constructor() { }
|
|
66
96
|
}
|
|
67
97
|
const instance = new MyClass();
|
|
68
|
-
|
|
69
|
-
fn.call(instance);
|
|
70
|
-
});
|
|
98
|
+
run(instance);
|
|
71
99
|
expect(() => instance.dep).toThrow("[Inject]");
|
|
72
100
|
});
|
|
73
101
|
it("warns on direct assignment in non-production", () => {
|
|
74
102
|
class Dep2 {
|
|
75
103
|
}
|
|
76
104
|
Injectable()(Dep2, {});
|
|
77
|
-
const
|
|
78
|
-
const ctx = {
|
|
79
|
-
name: "dep2",
|
|
80
|
-
kind: "field",
|
|
81
|
-
addInitializer(fn) {
|
|
82
|
-
initializers.push(fn);
|
|
83
|
-
},
|
|
84
|
-
};
|
|
105
|
+
const { ctx, run } = makeFieldCtx("dep2");
|
|
85
106
|
Inject(Dep2)(undefined, ctx);
|
|
86
107
|
const instance = {};
|
|
87
|
-
|
|
88
|
-
fn.call(instance);
|
|
89
|
-
});
|
|
108
|
+
run(instance);
|
|
90
109
|
const spy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
91
110
|
instance.dep2 = "override";
|
|
92
111
|
expect(spy).toHaveBeenCalledWith(expect.stringContaining("[Inject]"));
|
|
93
112
|
spy.mockRestore();
|
|
94
113
|
});
|
|
114
|
+
it("returns cached value on second access (cache hit)", () => {
|
|
115
|
+
class CachedService {
|
|
116
|
+
constructor() {
|
|
117
|
+
this.id = Math.random();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
Injectable()(CachedService, {});
|
|
121
|
+
const { ctx, run } = makeFieldCtx("svc");
|
|
122
|
+
Inject(CachedService)(undefined, ctx);
|
|
123
|
+
const instance = {};
|
|
124
|
+
run(instance);
|
|
125
|
+
const first = instance.svc;
|
|
126
|
+
const second = instance.svc;
|
|
127
|
+
expect(first).toBe(second); // same cached instance
|
|
128
|
+
});
|
|
129
|
+
it("does not warn on direct assignment in production mode", () => {
|
|
130
|
+
class ProdDep {
|
|
131
|
+
}
|
|
132
|
+
Injectable()(ProdDep, {});
|
|
133
|
+
const { ctx, run } = makeFieldCtx("dep");
|
|
134
|
+
Inject(ProdDep)(undefined, ctx);
|
|
135
|
+
const instance = {};
|
|
136
|
+
run(instance);
|
|
137
|
+
const spy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
138
|
+
vi.stubEnv("NODE_ENV", "production");
|
|
139
|
+
instance.dep = "override";
|
|
140
|
+
expect(spy).not.toHaveBeenCalled();
|
|
141
|
+
vi.unstubAllEnvs();
|
|
142
|
+
spy.mockRestore();
|
|
143
|
+
});
|
|
144
|
+
it("includes the Token description in the error when resolution fails", () => {
|
|
145
|
+
const MY_TOKEN = token("MY_SERVICE");
|
|
146
|
+
const { ctx, run } = makeFieldCtx("svc");
|
|
147
|
+
Inject(MY_TOKEN)(undefined, ctx);
|
|
148
|
+
class Consumer {
|
|
149
|
+
}
|
|
150
|
+
const instance = new Consumer();
|
|
151
|
+
run(instance);
|
|
152
|
+
expect(() => instance.svc).toThrow("MY_SERVICE");
|
|
153
|
+
});
|
|
154
|
+
it("@Inject on an anonymous class — error message uses token description instead of empty class name", () => {
|
|
155
|
+
const ANON_TOKEN = token("ANON_TOKEN");
|
|
156
|
+
const { ctx, run } = makeFieldCtx("val");
|
|
157
|
+
Inject(ANON_TOKEN)(undefined, ctx);
|
|
158
|
+
const instance = {};
|
|
159
|
+
run(instance);
|
|
160
|
+
expect(() => instance.val).toThrow("ANON_TOKEN");
|
|
161
|
+
});
|
|
95
162
|
});
|
|
96
|
-
// ── InjectContainer
|
|
163
|
+
// ── @InjectContainer ──────────────────────────────────────────────────────────
|
|
97
164
|
describe("InjectContainer", () => {
|
|
98
|
-
it("injects the global container
|
|
99
|
-
const
|
|
100
|
-
const ctx = {
|
|
101
|
-
name: "container",
|
|
102
|
-
kind: "field",
|
|
103
|
-
addInitializer(fn) {
|
|
104
|
-
initializers.push(fn);
|
|
105
|
-
},
|
|
106
|
-
};
|
|
165
|
+
it("injects the global container on an unscoped class", () => {
|
|
166
|
+
const { ctx, run } = makeFieldCtx("c");
|
|
107
167
|
InjectContainer()(undefined, ctx);
|
|
108
168
|
const instance = {};
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
expect(instance.container).toBeInstanceOf(Container);
|
|
169
|
+
run(instance);
|
|
170
|
+
expect(instance.c).toBeInstanceOf(Container);
|
|
171
|
+
expect(instance.c).toBe(container);
|
|
113
172
|
});
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
expect(
|
|
173
|
+
it("called multiple times on same instance — returns same container instance (cached)", () => {
|
|
174
|
+
const { ctx, run } = makeFieldCtx("c");
|
|
175
|
+
InjectContainer()(undefined, ctx);
|
|
176
|
+
const instance = {};
|
|
177
|
+
run(instance);
|
|
178
|
+
const first = instance.c;
|
|
179
|
+
const second = instance.c;
|
|
180
|
+
expect(first).toBe(second);
|
|
122
181
|
});
|
|
123
182
|
});
|
|
124
|
-
// ──
|
|
125
|
-
describe("
|
|
126
|
-
it("creates a child container
|
|
127
|
-
|
|
128
|
-
|
|
183
|
+
// ── @Scope ────────────────────────────────────────────────────────────────────
|
|
184
|
+
describe("Scope", () => {
|
|
185
|
+
it("creates a child container per instance", () => {
|
|
186
|
+
let Widget = (() => {
|
|
187
|
+
let _classDecorators = [Scope()];
|
|
188
|
+
let _classDescriptor;
|
|
189
|
+
let _classExtraInitializers = [];
|
|
190
|
+
let _classThis;
|
|
191
|
+
var Widget = class {
|
|
192
|
+
static { _classThis = this; }
|
|
193
|
+
static {
|
|
194
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
195
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
196
|
+
Widget = _classThis = _classDescriptor.value;
|
|
197
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
198
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
return Widget = _classThis;
|
|
202
|
+
})();
|
|
203
|
+
const { ctx, run } = makeFieldCtx("c");
|
|
204
|
+
InjectContainer()(undefined, ctx);
|
|
205
|
+
const a = new Widget();
|
|
206
|
+
run(a);
|
|
207
|
+
const b = new Widget();
|
|
208
|
+
run(b);
|
|
209
|
+
expect(a.c).toBeInstanceOf(Container);
|
|
210
|
+
expect(b.c).toBeInstanceOf(Container);
|
|
211
|
+
expect(a.c).not.toBe(b.c); // each instance gets its own scope
|
|
212
|
+
expect(a.c).not.toBe(container); // it's a child, not the root
|
|
129
213
|
});
|
|
130
|
-
it("
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
214
|
+
it("services registered in configure are resolvable within the scope", () => {
|
|
215
|
+
const DB_URL = token("DB_URL");
|
|
216
|
+
let DataModule = (() => {
|
|
217
|
+
let _classDecorators = [Scope((c) => { c.registerValue(DB_URL, "postgres://localhost"); })];
|
|
218
|
+
let _classDescriptor;
|
|
219
|
+
let _classExtraInitializers = [];
|
|
220
|
+
let _classThis;
|
|
221
|
+
var DataModule = class {
|
|
222
|
+
static { _classThis = this; }
|
|
223
|
+
static {
|
|
224
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
225
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
226
|
+
DataModule = _classThis = _classDescriptor.value;
|
|
227
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
228
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
return DataModule = _classThis;
|
|
232
|
+
})();
|
|
233
|
+
const { ctx, run } = makeFieldCtx("db");
|
|
234
|
+
Inject(DB_URL)(undefined, ctx);
|
|
235
|
+
const instance = new DataModule();
|
|
236
|
+
run(instance);
|
|
237
|
+
expect(instance.db).toBe("postgres://localhost");
|
|
134
238
|
});
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
describe("Inject — Token error display", () => {
|
|
138
|
-
it("includes the Token description in the error message when resolution fails", () => {
|
|
139
|
-
const MY_TOKEN = token("MY_SERVICE");
|
|
140
|
-
const initializers = [];
|
|
141
|
-
const ctx = {
|
|
142
|
-
name: "svc",
|
|
143
|
-
kind: "field",
|
|
144
|
-
addInitializer(fn) { initializers.push(fn); },
|
|
145
|
-
};
|
|
146
|
-
Inject(MY_TOKEN)(undefined, ctx);
|
|
147
|
-
class Consumer {
|
|
148
|
-
constructor() { }
|
|
239
|
+
it("@Inject resolves from the scoped container, not the global one", () => {
|
|
240
|
+
class ScopedRepo {
|
|
149
241
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
242
|
+
// NOT registered in global container
|
|
243
|
+
const VERSION = token("VERSION");
|
|
244
|
+
let App = (() => {
|
|
245
|
+
let _classDecorators = [Scope((c) => {
|
|
246
|
+
c.register(ScopedRepo);
|
|
247
|
+
c.registerValue(VERSION, "2.0");
|
|
248
|
+
})];
|
|
249
|
+
let _classDescriptor;
|
|
250
|
+
let _classExtraInitializers = [];
|
|
251
|
+
let _classThis;
|
|
252
|
+
var App = class {
|
|
253
|
+
static { _classThis = this; }
|
|
254
|
+
static {
|
|
255
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
256
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
257
|
+
App = _classThis = _classDescriptor.value;
|
|
258
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
259
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
return App = _classThis;
|
|
263
|
+
})();
|
|
264
|
+
const { ctx: repoCtx, run: runRepo } = makeFieldCtx("repo");
|
|
265
|
+
Inject(ScopedRepo)(undefined, repoCtx);
|
|
266
|
+
const { ctx: verCtx, run: runVer } = makeFieldCtx("version");
|
|
267
|
+
Inject(VERSION)(undefined, verCtx);
|
|
268
|
+
const instance = new App();
|
|
269
|
+
runRepo(instance);
|
|
270
|
+
runVer(instance);
|
|
271
|
+
expect(instance.repo).toBeInstanceOf(ScopedRepo);
|
|
272
|
+
expect(instance.version).toBe("2.0");
|
|
273
|
+
});
|
|
274
|
+
it("@InjectContainer returns the scoped child container", () => {
|
|
275
|
+
let Service = (() => {
|
|
276
|
+
let _classDecorators = [Scope((c) => { c.registerValue(token("X"), 42); })];
|
|
277
|
+
let _classDescriptor;
|
|
278
|
+
let _classExtraInitializers = [];
|
|
279
|
+
let _classThis;
|
|
280
|
+
var Service = class {
|
|
281
|
+
static { _classThis = this; }
|
|
282
|
+
static {
|
|
283
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
284
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
285
|
+
Service = _classThis = _classDescriptor.value;
|
|
286
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
287
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
return Service = _classThis;
|
|
291
|
+
})();
|
|
292
|
+
const { ctx, run } = makeFieldCtx("container");
|
|
293
|
+
InjectContainer()(undefined, ctx);
|
|
294
|
+
const instance = new Service();
|
|
295
|
+
run(instance);
|
|
296
|
+
expect(instance.container).toBeInstanceOf(Container);
|
|
297
|
+
expect(instance.container).not.toBe(container);
|
|
298
|
+
});
|
|
299
|
+
it("child container inherits registrations from the parent", () => {
|
|
300
|
+
class GlobalService {
|
|
301
|
+
}
|
|
302
|
+
Injectable()(GlobalService, {});
|
|
303
|
+
let Child = (() => {
|
|
304
|
+
let _classDecorators = [Scope()];
|
|
305
|
+
let _classDescriptor;
|
|
306
|
+
let _classExtraInitializers = [];
|
|
307
|
+
let _classThis;
|
|
308
|
+
var Child = class {
|
|
309
|
+
static { _classThis = this; }
|
|
310
|
+
static {
|
|
311
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
312
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
313
|
+
Child = _classThis = _classDescriptor.value;
|
|
314
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
315
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
return Child = _classThis;
|
|
319
|
+
})();
|
|
320
|
+
const { ctx, run } = makeFieldCtx("svc");
|
|
321
|
+
Inject(GlobalService)(undefined, ctx);
|
|
322
|
+
const instance = new Child();
|
|
323
|
+
run(instance);
|
|
324
|
+
expect(instance.svc).toBeInstanceOf(GlobalService);
|
|
325
|
+
});
|
|
326
|
+
it("@Scope on child class that inherits from @Scope parent — child gets own container", () => {
|
|
327
|
+
const PARENT_TOKEN = token("PARENT_VAL");
|
|
328
|
+
const CHILD_TOKEN = token("CHILD_VAL");
|
|
329
|
+
let Parent = (() => {
|
|
330
|
+
let _classDecorators = [Scope((c) => { c.registerValue(PARENT_TOKEN, "parent"); })];
|
|
331
|
+
let _classDescriptor;
|
|
332
|
+
let _classExtraInitializers = [];
|
|
333
|
+
let _classThis;
|
|
334
|
+
var Parent = class {
|
|
335
|
+
static { _classThis = this; }
|
|
336
|
+
static {
|
|
337
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
338
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
339
|
+
Parent = _classThis = _classDescriptor.value;
|
|
340
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
341
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
return Parent = _classThis;
|
|
345
|
+
})();
|
|
346
|
+
let Child = (() => {
|
|
347
|
+
let _classDecorators = [Scope((c) => { c.registerValue(CHILD_TOKEN, "child"); })];
|
|
348
|
+
let _classDescriptor;
|
|
349
|
+
let _classExtraInitializers = [];
|
|
350
|
+
let _classThis;
|
|
351
|
+
let _classSuper = Parent;
|
|
352
|
+
var Child = class extends _classSuper {
|
|
353
|
+
static { _classThis = this; }
|
|
354
|
+
static {
|
|
355
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
356
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
357
|
+
Child = _classThis = _classDescriptor.value;
|
|
358
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
359
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
return Child = _classThis;
|
|
363
|
+
})();
|
|
364
|
+
const { ctx: ctxC, run: runC } = makeFieldCtx("c");
|
|
365
|
+
InjectContainer()(undefined, ctxC);
|
|
366
|
+
const parentInstance = new Parent();
|
|
367
|
+
runC(parentInstance);
|
|
368
|
+
const childInstance = new Child();
|
|
369
|
+
runC(childInstance);
|
|
370
|
+
expect(parentInstance.c).toBeInstanceOf(Container);
|
|
371
|
+
expect(childInstance.c).toBeInstanceOf(Container);
|
|
372
|
+
// child has its own scoped container, different from the parent's
|
|
373
|
+
expect(childInstance.c).not.toBe(parentInstance.c);
|
|
374
|
+
expect(childInstance.c).not.toBe(container);
|
|
153
375
|
});
|
|
154
376
|
});
|
|
155
377
|
//# sourceMappingURL=decorators.test.js.map
|
|
@@ -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
|
@@ -7,7 +7,7 @@ export interface ServiceDescriptor {
|
|
|
7
7
|
scope: Scope;
|
|
8
8
|
instance?: unknown;
|
|
9
9
|
}
|
|
10
|
-
export type Constructor<T = unknown> = new (...args:
|
|
10
|
+
export type Constructor<T = unknown> = new (...args: any[]) => T;
|
|
11
11
|
export declare class Token<_T> {
|
|
12
12
|
readonly description: string;
|
|
13
13
|
constructor(description: string);
|
|
@@ -21,7 +21,7 @@ export declare class Container {
|
|
|
21
21
|
register<T>(target: Constructor<T>, options?: InjectableOptions): this;
|
|
22
22
|
registerValue<T>(token: Token<T>, value: T): this;
|
|
23
23
|
registerFactory<T>(token: Token<T>, factory: (container: Container) => T): this;
|
|
24
|
-
resolve<T>(target: Constructor<T> | Token<T>): T;
|
|
24
|
+
resolve<T>(target: Constructor<T> | Token<T>, resolutionStack?: Set<Constructor<unknown> | Token<unknown>>): T;
|
|
25
25
|
private instantiate;
|
|
26
26
|
createChild(): Container;
|
|
27
27
|
}
|
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;
|
|
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,CAGrB;IACJ,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;IA0CJ,OAAO,CAAC,WAAW;IAkCnB,WAAW,IAAI,SAAS;CAGzB;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
package/dist/container.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export class Token {
|
|
2
|
-
description;
|
|
3
2
|
constructor(description) {
|
|
4
3
|
this.description = description;
|
|
5
4
|
}
|
|
@@ -11,9 +10,8 @@ export function token(description) {
|
|
|
11
10
|
return new Token(description);
|
|
12
11
|
}
|
|
13
12
|
export class Container {
|
|
14
|
-
services = new Map();
|
|
15
|
-
parent;
|
|
16
13
|
constructor(parent) {
|
|
14
|
+
this.services = new Map();
|
|
17
15
|
this.parent = parent;
|
|
18
16
|
}
|
|
19
17
|
register(target, options = {}) {
|
|
@@ -31,35 +29,56 @@ export class Container {
|
|
|
31
29
|
this.services.set(token, factory(this));
|
|
32
30
|
return this;
|
|
33
31
|
}
|
|
34
|
-
resolve(target) {
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
throw new Error(`[DI] Token not registered: ${target.toString()}`);
|
|
32
|
+
resolve(target, resolutionStack = new Set()) {
|
|
33
|
+
const key = target;
|
|
34
|
+
if (resolutionStack.has(key)) {
|
|
35
|
+
const chain = [...resolutionStack, key]
|
|
36
|
+
.map((k) => k instanceof Token ? k.toString() : (k).name)
|
|
37
|
+
.join(" → ");
|
|
38
|
+
throw new Error(`[DI] Circular dependency detected: ${chain}`);
|
|
42
39
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
resolutionStack.add(key);
|
|
41
|
+
try {
|
|
42
|
+
const entry = this.services.get(key);
|
|
43
|
+
if (target instanceof Token) {
|
|
44
|
+
if (entry !== undefined)
|
|
45
|
+
return entry;
|
|
46
|
+
if (this.parent)
|
|
47
|
+
return this.parent.resolve(target);
|
|
48
|
+
throw new Error(`[DI] Token not registered: ${target.toString()}`);
|
|
49
|
+
}
|
|
50
|
+
if (!entry) {
|
|
51
|
+
if (this.parent)
|
|
52
|
+
return this.parent.resolve(target);
|
|
53
|
+
throw new Error(`[DI] Service not registered: ${target.name}`);
|
|
54
|
+
}
|
|
55
|
+
const descriptor = entry;
|
|
56
|
+
if (descriptor.scope === "singleton") {
|
|
57
|
+
descriptor.instance ??= this.instantiate(descriptor.target, resolutionStack);
|
|
58
|
+
return descriptor.instance;
|
|
59
|
+
}
|
|
60
|
+
return this.instantiate(descriptor.target, resolutionStack);
|
|
47
61
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
descriptor.instance ??= this.instantiate(descriptor.target);
|
|
51
|
-
return descriptor.instance;
|
|
62
|
+
finally {
|
|
63
|
+
resolutionStack.delete(key);
|
|
52
64
|
}
|
|
53
|
-
return this.instantiate(descriptor.target);
|
|
54
65
|
}
|
|
55
|
-
instantiate(target) {
|
|
66
|
+
instantiate(target, resolutionStack = new Set()) {
|
|
56
67
|
const deps = Reflect.getMetadata("di:inject", target) ?? [];
|
|
57
|
-
const resolvedDeps = deps.map((dep) => this.resolve(dep));
|
|
58
|
-
|
|
68
|
+
const resolvedDeps = deps.map((dep) => this.resolve(dep, resolutionStack));
|
|
69
|
+
let instance;
|
|
70
|
+
try {
|
|
71
|
+
instance = new target(...resolvedDeps);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (err instanceof Error && err.message.startsWith("[DI]"))
|
|
75
|
+
throw err;
|
|
76
|
+
throw new Error(`[DI] Failed to instantiate "${target.name}": ${err.message}`);
|
|
77
|
+
}
|
|
59
78
|
const rawPropInjections = Reflect.getMetadata("di:props", target.prototype);
|
|
60
79
|
const propInjections = rawPropInjections ?? new Map();
|
|
61
80
|
for (const [prop, dep] of propInjections) {
|
|
62
|
-
instance[prop] = this.resolve(dep);
|
|
81
|
+
instance[prop] = this.resolve(dep, resolutionStack);
|
|
63
82
|
}
|
|
64
83
|
return instance;
|
|
65
84
|
}
|