@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.
@@ -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, useService, createScope, } from "../decorators";
5
- // ── Injectable ────────────────────────────────────────────────────────────────
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
- const instance = useService(MyService);
16
- expect(instance).toBeInstanceOf(MyService);
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
- const a = useService(TmpService);
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 initializers = [];
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
- initializers.forEach((fn) => {
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 initializers = [];
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
- initializers.forEach((fn) => {
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 initializers = [];
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
- initializers.forEach((fn) => {
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 instance", () => {
99
- const initializers = [];
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
- initializers.forEach((fn) => {
110
- fn.call(instance);
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
- // ── useService ────────────────────────────────────────────────────────────────
116
- describe("useService", () => {
117
- it("resolves by Token", () => {
118
- const VERSION = token("VERSION");
119
- const c = createScope((sc) => sc.registerValue(VERSION, "1.0.0"));
120
- // useService uses global container — test via token on a fresh child
121
- expect(c.resolve(VERSION)).toBe("1.0.0");
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
- // ── createScope ───────────────────────────────────────────────────────────────
125
- describe("createScope", () => {
126
- it("creates a child container without configure fn", () => {
127
- const child = createScope();
128
- expect(child).toBeInstanceOf(Container);
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("applies the configure callback", () => {
131
- const DB = token("DB");
132
- const child = createScope((c) => c.registerValue(DB, "postgres://localhost"));
133
- expect(child.resolve(DB)).toBe("postgres://localhost");
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
- // ── Inject — Token in error message ──────────────────────────────────────────
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
- const instance = new Consumer();
151
- initializers.forEach((fn) => { fn.call(instance); });
152
- expect(() => instance.svc).toThrow("MY_SERVICE");
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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"}
@@ -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: unknown[]) => T;
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
  }
@@ -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;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAErE,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,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IA0BhD,OAAO,CAAC,WAAW;IAoBnB,WAAW,IAAI,SAAS;CAGzB;AAED,eAAO,MAAM,SAAS,WAAkB,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,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 entry = this.services.get(target);
36
- if (target instanceof Token) {
37
- if (entry !== undefined)
38
- return entry;
39
- if (this.parent)
40
- return this.parent.resolve(target);
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
- if (!entry) {
44
- if (this.parent)
45
- return this.parent.resolve(target);
46
- throw new Error(`[DI] Service not registered: ${target.name}`);
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
- const descriptor = entry;
49
- if (descriptor.scope === "singleton") {
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
- const instance = new target(...resolvedDeps);
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
  }