@praxisjs/di 1.3.13 → 1.3.15
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 +40 -0
- package/dist/container.d.ts +1 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +28 -21
- package/dist/container.js.map +1 -1
- package/dist/decorators.d.ts +4 -2
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +60 -69
- package/dist/decorators.js.map +1 -1
- package/package.json +14 -5
- package/src/container.ts +28 -23
- package/src/decorators.ts +72 -81
- package/dist/__tests__/container.test.d.ts +0 -2
- package/dist/__tests__/container.test.d.ts.map +0 -1
- package/dist/__tests__/container.test.js +0 -224
- package/dist/__tests__/container.test.js.map +0 -1
- package/dist/__tests__/decorators.test.d.ts +0 -2
- package/dist/__tests__/decorators.test.d.ts.map +0 -1
- package/dist/__tests__/decorators.test.js +0 -604
- package/dist/__tests__/decorators.test.js.map +0 -1
- package/src/__tests__/container.test.ts +0 -247
- package/src/__tests__/decorators.test.ts +0 -343
- package/tsconfig.json +0 -9
package/src/decorators.ts
CHANGED
|
@@ -1,35 +1,27 @@
|
|
|
1
1
|
import type { RootComponent } from "@praxisjs/core/internal";
|
|
2
|
-
import {
|
|
2
|
+
import { createClassDecorator, ClassBehavior, type ClassEnhancement, addClaimableInitializer, assertFieldContext } from "@praxisjs/decorators";
|
|
3
3
|
|
|
4
4
|
import { container, type Container, Token, type Constructor, type InjectableOptions } from "./container";
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
const scopedContainers = new WeakMap<object, Container>();
|
|
6
|
+
type Slots = Record<symbol, unknown>;
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// ── @Injectable ───────────────────────────────────────────────────────────────
|
|
14
|
-
|
|
15
|
-
class InjectableBehavior extends ClassBehavior {
|
|
16
|
-
constructor(private readonly options: InjectableOptions) {
|
|
17
|
-
super();
|
|
18
|
-
}
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
type DIFieldDecorator = (_value: undefined, context: ClassFieldDecoratorContext<any>) => void;
|
|
19
10
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
11
|
+
// The child container @Scope creates for an instance.
|
|
12
|
+
const SCOPE = Symbol("praxis.di.scope");
|
|
23
13
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
container.register(Enhanced as Constructor, this.options);
|
|
27
|
-
}
|
|
14
|
+
function resolveFrom(instance: object): Container {
|
|
15
|
+
return ((instance as Slots)[SCOPE] as Container | undefined) ?? container;
|
|
28
16
|
}
|
|
29
17
|
|
|
18
|
+
// ── @Injectable ───────────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
// Registration is all it does, so the class itself is registered rather than a per-instance subclass.
|
|
30
21
|
export function Injectable(options: InjectableOptions = {}) {
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
return function (value: Constructor, _context: ClassDecoratorContext): void {
|
|
23
|
+
container.register(value, options);
|
|
24
|
+
};
|
|
33
25
|
}
|
|
34
26
|
|
|
35
27
|
// ── @Scope ────────────────────────────────────────────────────────────────────
|
|
@@ -55,7 +47,7 @@ class ScopeBehavior extends ClassBehavior {
|
|
|
55
47
|
create(instance: RootComponent): ClassEnhancement {
|
|
56
48
|
const child = container.createChild();
|
|
57
49
|
this.configure?.(child);
|
|
58
|
-
|
|
50
|
+
(instance as unknown as Slots)[SCOPE] = child;
|
|
59
51
|
return {};
|
|
60
52
|
}
|
|
61
53
|
}
|
|
@@ -67,45 +59,47 @@ export function Scope(configure?: (c: Container) => void) {
|
|
|
67
59
|
|
|
68
60
|
// ── @Inject ───────────────────────────────────────────────────────────────────
|
|
69
61
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
62
|
+
function depName(dep: Constructor | Token<unknown>): string {
|
|
63
|
+
return dep instanceof Token ? dep.toString() : dep.name;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function Inject<T>(dep: Constructor<T> | Token<T>): DIFieldDecorator {
|
|
67
|
+
return function (_value, context) {
|
|
68
|
+
assertFieldContext(context);
|
|
69
|
+
const name = String(context.name);
|
|
70
|
+
// The resolved service lives on the instance under this symbol; the accessor is shared.
|
|
71
|
+
const slot = Symbol(`praxis.inject.${name}`);
|
|
72
|
+
const descriptor: PropertyDescriptor = {
|
|
73
|
+
get(this: Slots): T {
|
|
74
|
+
const cached = this[slot];
|
|
75
|
+
if (cached !== undefined) return cached as T;
|
|
76
|
+
let resolved: T;
|
|
77
|
+
try {
|
|
78
|
+
resolved = resolveFrom(this).resolve(dep);
|
|
79
|
+
} catch (err) {
|
|
80
|
+
throw new Error(
|
|
81
|
+
`[Inject] Failed to resolve "${depName(dep as Constructor | Token<unknown>)}" in "${(this as { constructor: { name: string } }).constructor.name}.${name}": ${(err as Error).message}`,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
this[slot] = resolved;
|
|
85
|
+
return resolved;
|
|
86
|
+
},
|
|
87
|
+
set(_value: unknown): void {
|
|
88
|
+
if (process.env.NODE_ENV !== "production") {
|
|
89
|
+
console.warn(
|
|
90
|
+
`[Inject] "${name}" is managed by the DI container and cannot be assigned directly.`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
enumerable: true,
|
|
95
|
+
configurable: true,
|
|
96
|
+
};
|
|
97
|
+
addClaimableInitializer(context, function () {
|
|
98
|
+
// Reserving the slot up front keeps every instance of the class on the same shape.
|
|
99
|
+
(this as Slots)[slot] = undefined;
|
|
100
|
+
Object.defineProperty(this, context.name, descriptor);
|
|
101
|
+
});
|
|
102
|
+
};
|
|
109
103
|
}
|
|
110
104
|
|
|
111
105
|
// ── inject() ──────────────────────────────────────────────────────────────────
|
|
@@ -116,23 +110,20 @@ export function inject<T>(dep: Constructor<T> | Token<T>): T {
|
|
|
116
110
|
|
|
117
111
|
// ── @InjectContainer ──────────────────────────────────────────────────────────
|
|
118
112
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// DI decorators work on any class, not just StatefulComponent
|
|
136
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
137
|
-
}) as unknown as (_value: undefined, context: ClassFieldDecoratorContext<any>) => void;
|
|
113
|
+
const containerDescriptor: PropertyDescriptor = {
|
|
114
|
+
get(this: object): Container {
|
|
115
|
+
return resolveFrom(this);
|
|
116
|
+
},
|
|
117
|
+
enumerable: true,
|
|
118
|
+
configurable: true,
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export function InjectContainer(): DIFieldDecorator {
|
|
122
|
+
return function (_value, context) {
|
|
123
|
+
assertFieldContext(context);
|
|
124
|
+
const name = context.name;
|
|
125
|
+
addClaimableInitializer(context, function () {
|
|
126
|
+
Object.defineProperty(this, name, containerDescriptor);
|
|
127
|
+
});
|
|
128
|
+
};
|
|
138
129
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"container.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { Container, Token, token } from "../container";
|
|
3
|
-
describe("Token", () => {
|
|
4
|
-
it("stores description", () => {
|
|
5
|
-
const t = new Token("MY_SERVICE");
|
|
6
|
-
expect(t.description).toBe("MY_SERVICE");
|
|
7
|
-
});
|
|
8
|
-
it("toString includes description", () => {
|
|
9
|
-
const t = new Token("FOO");
|
|
10
|
-
expect(t.toString()).toBe("Token(FOO)");
|
|
11
|
-
});
|
|
12
|
-
it("token() factory creates a Token", () => {
|
|
13
|
-
const t = token("DB_URL");
|
|
14
|
-
expect(t).toBeInstanceOf(Token);
|
|
15
|
-
expect(t.description).toBe("DB_URL");
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
describe("Container", () => {
|
|
19
|
-
it("registers and resolves a singleton service", () => {
|
|
20
|
-
class MyService {
|
|
21
|
-
}
|
|
22
|
-
const c = new Container();
|
|
23
|
-
c.register(MyService);
|
|
24
|
-
const a = c.resolve(MyService);
|
|
25
|
-
const b = c.resolve(MyService);
|
|
26
|
-
expect(a).toBeInstanceOf(MyService);
|
|
27
|
-
expect(a).toBe(b); // singleton
|
|
28
|
-
});
|
|
29
|
-
it("creates new instance for transient scope", () => {
|
|
30
|
-
class Counter {
|
|
31
|
-
value = Math.random();
|
|
32
|
-
}
|
|
33
|
-
const c = new Container();
|
|
34
|
-
c.register(Counter, { scope: "transient" });
|
|
35
|
-
const a = c.resolve(Counter);
|
|
36
|
-
const b = c.resolve(Counter);
|
|
37
|
-
expect(a).not.toBe(b);
|
|
38
|
-
});
|
|
39
|
-
it("throws when resolving unregistered service", () => {
|
|
40
|
-
class Unknown {
|
|
41
|
-
}
|
|
42
|
-
const c = new Container();
|
|
43
|
-
expect(() => c.resolve(Unknown)).toThrow("[DI] Service not registered");
|
|
44
|
-
});
|
|
45
|
-
it("registerValue stores a value by token", () => {
|
|
46
|
-
const DB_URL = token("DB_URL");
|
|
47
|
-
const c = new Container();
|
|
48
|
-
c.registerValue(DB_URL, "postgres://localhost/db");
|
|
49
|
-
expect(c.resolve(DB_URL)).toBe("postgres://localhost/db");
|
|
50
|
-
});
|
|
51
|
-
it("registerFactory computes value via factory", () => {
|
|
52
|
-
const MAX = token("MAX");
|
|
53
|
-
const c = new Container();
|
|
54
|
-
c.registerFactory(MAX, () => 100);
|
|
55
|
-
expect(c.resolve(MAX)).toBe(100);
|
|
56
|
-
});
|
|
57
|
-
it("throws for unregistered token", () => {
|
|
58
|
-
const t = token("MISSING");
|
|
59
|
-
const c = new Container();
|
|
60
|
-
expect(() => c.resolve(t)).toThrow("[DI] Token not registered");
|
|
61
|
-
});
|
|
62
|
-
it("child container resolves from parent", () => {
|
|
63
|
-
const URL_TOKEN = token("URL");
|
|
64
|
-
const parent = new Container();
|
|
65
|
-
parent.registerValue(URL_TOKEN, "https://example.com");
|
|
66
|
-
const child = parent.createChild();
|
|
67
|
-
expect(child.resolve(URL_TOKEN)).toBe("https://example.com");
|
|
68
|
-
});
|
|
69
|
-
it("child container can override parent registration", () => {
|
|
70
|
-
const URL_TOKEN = token("URL");
|
|
71
|
-
const parent = new Container();
|
|
72
|
-
parent.registerValue(URL_TOKEN, "https://parent.com");
|
|
73
|
-
const child = parent.createChild();
|
|
74
|
-
child.registerValue(URL_TOKEN, "https://child.com");
|
|
75
|
-
expect(child.resolve(URL_TOKEN)).toBe("https://child.com");
|
|
76
|
-
expect(parent.resolve(URL_TOKEN)).toBe("https://parent.com");
|
|
77
|
-
});
|
|
78
|
-
it("register() is chainable", () => {
|
|
79
|
-
class A {
|
|
80
|
-
}
|
|
81
|
-
class B {
|
|
82
|
-
}
|
|
83
|
-
const c = new Container();
|
|
84
|
-
expect(c.register(A).register(B)).toBe(c);
|
|
85
|
-
});
|
|
86
|
-
it("parent singleton is reused when resolved from child container", () => {
|
|
87
|
-
class SharedService {
|
|
88
|
-
}
|
|
89
|
-
const parent = new Container();
|
|
90
|
-
parent.register(SharedService, { scope: "singleton" });
|
|
91
|
-
const child = parent.createChild();
|
|
92
|
-
const fromChild = child.resolve(SharedService);
|
|
93
|
-
const fromParent = parent.resolve(SharedService);
|
|
94
|
-
expect(fromChild).toBe(fromParent);
|
|
95
|
-
});
|
|
96
|
-
it("child container falls back to parent for unregistered service", () => {
|
|
97
|
-
class MyDep {
|
|
98
|
-
}
|
|
99
|
-
const parent = new Container();
|
|
100
|
-
parent.register(MyDep);
|
|
101
|
-
const child = parent.createChild();
|
|
102
|
-
expect(child.resolve(MyDep)).toBeInstanceOf(MyDep);
|
|
103
|
-
});
|
|
104
|
-
it("grandchild resolves from grandparent (three-level chain)", () => {
|
|
105
|
-
const URL_TOKEN = token("GRANDPARENT_URL");
|
|
106
|
-
const grandparent = new Container();
|
|
107
|
-
grandparent.registerValue(URL_TOKEN, "https://grandparent.com");
|
|
108
|
-
const child = grandparent.createChild();
|
|
109
|
-
const grandchild = child.createChild();
|
|
110
|
-
expect(grandchild.resolve(URL_TOKEN)).toBe("https://grandparent.com");
|
|
111
|
-
});
|
|
112
|
-
it("registerFactory can resolve other services from the container", () => {
|
|
113
|
-
class Logger {
|
|
114
|
-
}
|
|
115
|
-
const LOG_WRAP = token("LOG_WRAP");
|
|
116
|
-
const c = new Container();
|
|
117
|
-
c.register(Logger);
|
|
118
|
-
c.registerFactory(LOG_WRAP, (container) => ({
|
|
119
|
-
logger: container.resolve(Logger),
|
|
120
|
-
}));
|
|
121
|
-
const result = c.resolve(LOG_WRAP);
|
|
122
|
-
expect(result.logger).toBeInstanceOf(Logger);
|
|
123
|
-
});
|
|
124
|
-
it("registering the same class twice replaces the previous registration", () => {
|
|
125
|
-
class Counter {
|
|
126
|
-
value = Math.random();
|
|
127
|
-
}
|
|
128
|
-
const c = new Container();
|
|
129
|
-
c.register(Counter, { scope: "singleton" });
|
|
130
|
-
const first = c.resolve(Counter);
|
|
131
|
-
// Re-register resets the descriptor (no cached instance)
|
|
132
|
-
c.register(Counter, { scope: "singleton" });
|
|
133
|
-
const second = c.resolve(Counter);
|
|
134
|
-
// After re-registration, a new singleton is created
|
|
135
|
-
expect(second).toBeInstanceOf(Counter);
|
|
136
|
-
expect(second).not.toBe(first);
|
|
137
|
-
});
|
|
138
|
-
it("re-registering with different scope switches scope correctly", () => {
|
|
139
|
-
class Svc {
|
|
140
|
-
}
|
|
141
|
-
const c = new Container();
|
|
142
|
-
c.register(Svc, { scope: "singleton" });
|
|
143
|
-
c.resolve(Svc); // warm up singleton
|
|
144
|
-
c.register(Svc, { scope: "transient" });
|
|
145
|
-
const a = c.resolve(Svc);
|
|
146
|
-
const b = c.resolve(Svc);
|
|
147
|
-
expect(a).toBeInstanceOf(Svc);
|
|
148
|
-
expect(a).not.toBe(b);
|
|
149
|
-
});
|
|
150
|
-
it("factory function that throws — error message includes which service failed", () => {
|
|
151
|
-
class Broken {
|
|
152
|
-
constructor() {
|
|
153
|
-
throw new Error("boom");
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
const c = new Container();
|
|
157
|
-
c.register(Broken);
|
|
158
|
-
expect(() => c.resolve(Broken)).toThrow("Broken");
|
|
159
|
-
expect(() => c.resolve(Broken)).toThrow("[DI] Failed to instantiate");
|
|
160
|
-
});
|
|
161
|
-
it("resolve() called concurrently on the same uninitialized singleton — returns same instance or does not crash", async () => {
|
|
162
|
-
class SlowService {
|
|
163
|
-
}
|
|
164
|
-
const c = new Container();
|
|
165
|
-
c.register(SlowService, { scope: "singleton" });
|
|
166
|
-
const [a, b] = await Promise.all([
|
|
167
|
-
Promise.resolve(c.resolve(SlowService)),
|
|
168
|
-
Promise.resolve(c.resolve(SlowService)),
|
|
169
|
-
]);
|
|
170
|
-
expect(a).toBeInstanceOf(SlowService);
|
|
171
|
-
expect(a).toBe(b);
|
|
172
|
-
});
|
|
173
|
-
it("re-registering a service clears the previous singleton instance", () => {
|
|
174
|
-
class Svc {
|
|
175
|
-
id = Math.random();
|
|
176
|
-
}
|
|
177
|
-
const c = new Container();
|
|
178
|
-
c.register(Svc, { scope: "singleton" });
|
|
179
|
-
const first = c.resolve(Svc);
|
|
180
|
-
c.register(Svc, { scope: "singleton" });
|
|
181
|
-
const second = c.resolve(Svc);
|
|
182
|
-
expect(second).not.toBe(first);
|
|
183
|
-
});
|
|
184
|
-
it("circular dependency chain including a Token shows the Token name in the error", () => {
|
|
185
|
-
const MY_TOKEN = token("MyToken");
|
|
186
|
-
const c = new Container();
|
|
187
|
-
c.registerValue(MY_TOKEN, "value");
|
|
188
|
-
// Pre-populate the stack as if we are already in the middle of resolving MY_TOKEN
|
|
189
|
-
const stack = new Set([MY_TOKEN]);
|
|
190
|
-
expect(() => c.resolve(MY_TOKEN, stack)).toThrow("Token(MyToken)");
|
|
191
|
-
});
|
|
192
|
-
it("circular dependency chain with a Constructor shows the class name (k.name branch)", () => {
|
|
193
|
-
class ServiceA {
|
|
194
|
-
}
|
|
195
|
-
const c = new Container();
|
|
196
|
-
c.register(ServiceA);
|
|
197
|
-
// Pre-populate the stack as if ServiceA is already being resolved
|
|
198
|
-
const stack = new Set([ServiceA]);
|
|
199
|
-
expect(() => c.resolve(ServiceA, stack)).toThrow("ServiceA");
|
|
200
|
-
});
|
|
201
|
-
it("instantiate rethrows DI errors thrown inside a constructor without wrapping", () => {
|
|
202
|
-
const c = new Container();
|
|
203
|
-
class Unregistered {
|
|
204
|
-
}
|
|
205
|
-
class Outer {
|
|
206
|
-
constructor() {
|
|
207
|
-
// Manually triggers a [DI] error inside the constructor body
|
|
208
|
-
c.resolve(Unregistered);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
c.register(Outer);
|
|
212
|
-
const err = (() => {
|
|
213
|
-
try {
|
|
214
|
-
c.resolve(Outer);
|
|
215
|
-
}
|
|
216
|
-
catch (e) {
|
|
217
|
-
return e;
|
|
218
|
-
}
|
|
219
|
-
})();
|
|
220
|
-
expect(err.message).toMatch(/\[DI\] Service not registered/);
|
|
221
|
-
expect(err.message).not.toMatch(/Failed to instantiate/);
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
//# sourceMappingURL=container.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":""}
|