@praxisjs/di 0.2.2 → 1.0.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 +56 -0
- package/dist/__tests__/container.test.js +70 -1
- package/dist/__tests__/container.test.js.map +1 -1
- package/dist/__tests__/decorators.test.js +247 -85
- package/dist/__tests__/decorators.test.js.map +1 -1
- package/dist/container.d.ts +1 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +1 -3
- 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 +79 -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 +76 -0
- package/src/__tests__/decorators.test.ts +157 -102
- package/src/container.ts +2 -1
- package/src/decorators.ts +94 -55
- package/src/index.ts +2 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,61 @@
|
|
|
1
1
|
# @praxisjs/di
|
|
2
2
|
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 3372878: Migrate all packages from functional APIs to a decorator-first design.
|
|
8
|
+
|
|
9
|
+
**`@praxisjs/core`**
|
|
10
|
+
|
|
11
|
+
- Added `Composable` abstract base class for building class-based composables
|
|
12
|
+
- Removed `resource`, `createResource`, `Resource`, `ResourceStatus`, `ResourceOptions` from public exports — use `@Resource` from `@praxisjs/decorators` instead
|
|
13
|
+
|
|
14
|
+
**`@praxisjs/motion`**
|
|
15
|
+
|
|
16
|
+
- Replaced `useMotion`, `tween`, `spring`, `createTransition`, `Animate`, `easings`, `resolveEasing` with `@Tween` and `@Spring` decorators
|
|
17
|
+
|
|
18
|
+
**`@praxisjs/di`**
|
|
19
|
+
|
|
20
|
+
- Replaced `useService` and `createScope` with a `@Scope` decorator
|
|
21
|
+
- Renamed exported type `Scope` to `ScopeType` to free the name for the new decorator
|
|
22
|
+
|
|
23
|
+
**`@praxisjs/fsm`**
|
|
24
|
+
|
|
25
|
+
- Removed `createMachine` — use the `@StateMachine` and `@Transition` decorators directly
|
|
26
|
+
|
|
27
|
+
**`@praxisjs/router`**
|
|
28
|
+
|
|
29
|
+
- Removed `createRouter`, `lazy`, `useRouter`, `useParams`, `useQuery`, `useLocation`
|
|
30
|
+
- Added `@RouterConfig`, `@Lazy`, `@InjectRouter`, `@Params`, `@Query`, `@Location` decorators
|
|
31
|
+
|
|
32
|
+
**`@praxisjs/store`**
|
|
33
|
+
|
|
34
|
+
- Removed `createStore` — use the `@Store` and `@UseStore` decorators directly
|
|
35
|
+
|
|
36
|
+
**`@praxisjs/composables`**
|
|
37
|
+
|
|
38
|
+
- Replaced all `use*` composable functions with class-based composables extending `Composable`:
|
|
39
|
+
`WindowSize`, `ScrollPosition`, `ElementSize`, `Intersection`, `Focus`, `MediaQuery`, `ColorScheme`, `Mouse`, `KeyCombo`, `Idle`, `Clipboard`, `Geolocation`, `TimeAgo`, `Pagination`
|
|
40
|
+
|
|
41
|
+
**`@praxisjs/concurrent`**
|
|
42
|
+
|
|
43
|
+
- Removed `task`, `queue`, `pool` and their instance types — use `@Task`, `@Queue`, `@Pool` decorators instead
|
|
44
|
+
|
|
45
|
+
### Patch Changes
|
|
46
|
+
|
|
47
|
+
- Updated dependencies [3372878]
|
|
48
|
+
- Updated dependencies [feaa478]
|
|
49
|
+
- @praxisjs/core@1.0.0
|
|
50
|
+
- @praxisjs/decorators@0.5.0
|
|
51
|
+
|
|
52
|
+
## 0.2.3
|
|
53
|
+
|
|
54
|
+
### Patch Changes
|
|
55
|
+
|
|
56
|
+
- Updated dependencies [d11a10a]
|
|
57
|
+
- @praxisjs/core@0.4.2
|
|
58
|
+
|
|
3
59
|
## 0.2.2
|
|
4
60
|
|
|
5
61
|
### Patch Changes
|
|
@@ -29,7 +29,9 @@ describe("Container", () => {
|
|
|
29
29
|
});
|
|
30
30
|
it("creates new instance for transient scope", () => {
|
|
31
31
|
class Counter {
|
|
32
|
-
|
|
32
|
+
constructor() {
|
|
33
|
+
this.value = Math.random();
|
|
34
|
+
}
|
|
33
35
|
}
|
|
34
36
|
const c = new Container();
|
|
35
37
|
c.register(Counter, { scope: "transient" });
|
|
@@ -84,5 +86,72 @@ describe("Container", () => {
|
|
|
84
86
|
const c = new Container();
|
|
85
87
|
expect(c.register(A).register(B)).toBe(c);
|
|
86
88
|
});
|
|
89
|
+
it("resolves prop injections from di:props metadata", () => {
|
|
90
|
+
class Logger {
|
|
91
|
+
}
|
|
92
|
+
class Service {
|
|
93
|
+
}
|
|
94
|
+
const c = new Container();
|
|
95
|
+
c.register(Logger);
|
|
96
|
+
c.register(Service);
|
|
97
|
+
// Simulate what the @Inject decorator does — set di:props metadata
|
|
98
|
+
const propsMap = new Map();
|
|
99
|
+
propsMap.set("logger", Logger);
|
|
100
|
+
Reflect.defineMetadata("di:props", propsMap, Service.prototype);
|
|
101
|
+
const instance = c.resolve(Service);
|
|
102
|
+
expect(instance.logger).toBeInstanceOf(Logger);
|
|
103
|
+
// Cleanup
|
|
104
|
+
Reflect.deleteMetadata("di:props", Service.prototype);
|
|
105
|
+
});
|
|
106
|
+
it("child container falls back to parent for unregistered service", () => {
|
|
107
|
+
class MyDep {
|
|
108
|
+
}
|
|
109
|
+
const parent = new Container();
|
|
110
|
+
parent.register(MyDep);
|
|
111
|
+
const child = parent.createChild();
|
|
112
|
+
expect(child.resolve(MyDep)).toBeInstanceOf(MyDep);
|
|
113
|
+
});
|
|
114
|
+
it("grandchild resolves from grandparent (three-level chain)", () => {
|
|
115
|
+
const URL_TOKEN = token("GRANDPARENT_URL");
|
|
116
|
+
const grandparent = new Container();
|
|
117
|
+
grandparent.registerValue(URL_TOKEN, "https://grandparent.com");
|
|
118
|
+
const child = grandparent.createChild();
|
|
119
|
+
const grandchild = child.createChild();
|
|
120
|
+
expect(grandchild.resolve(URL_TOKEN)).toBe("https://grandparent.com");
|
|
121
|
+
});
|
|
122
|
+
it("resolves constructor injection from di:inject metadata", () => {
|
|
123
|
+
class Engine {
|
|
124
|
+
}
|
|
125
|
+
class Car {
|
|
126
|
+
constructor(engine) {
|
|
127
|
+
this.engine = engine;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const c = new Container();
|
|
131
|
+
c.register(Engine);
|
|
132
|
+
c.register(Car);
|
|
133
|
+
// Simulate what a @Inject constructor param decorator would set
|
|
134
|
+
Reflect.defineMetadata("di:inject", [Engine], Car);
|
|
135
|
+
const car = c.resolve(Car);
|
|
136
|
+
expect(car).toBeInstanceOf(Car);
|
|
137
|
+
expect(car.engine).toBeInstanceOf(Engine);
|
|
138
|
+
Reflect.deleteMetadata("di:inject", Car);
|
|
139
|
+
});
|
|
140
|
+
it("registering the same class twice replaces the previous registration", () => {
|
|
141
|
+
class Counter {
|
|
142
|
+
constructor() {
|
|
143
|
+
this.value = Math.random();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const c = new Container();
|
|
147
|
+
c.register(Counter, { scope: "singleton" });
|
|
148
|
+
const first = c.resolve(Counter);
|
|
149
|
+
// Re-register resets the descriptor (no cached instance)
|
|
150
|
+
c.register(Counter, { scope: "singleton" });
|
|
151
|
+
const second = c.resolve(Counter);
|
|
152
|
+
// After re-registration, a new singleton is created
|
|
153
|
+
expect(second).toBeInstanceOf(Counter);
|
|
154
|
+
expect(second).not.toBe(first);
|
|
155
|
+
});
|
|
87
156
|
});
|
|
88
157
|
//# sourceMappingURL=container.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,KAAK,CAAS,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,SAAS;SAAG;QAClB,MAAM,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;QAC1B,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO;
|
|
1
|
+
{"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../src/__tests__/container.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,140 +1,302 @@
|
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
return
|
|
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
|
+
};
|
|
8
49
|
}
|
|
9
|
-
// ── Injectable
|
|
50
|
+
// ── @Injectable ───────────────────────────────────────────────────────────────
|
|
10
51
|
describe("Injectable", () => {
|
|
11
52
|
it("registers the class in the global container", () => {
|
|
12
|
-
// We test via useService resolving without throwing
|
|
13
53
|
class MyService {
|
|
14
|
-
greet() {
|
|
15
|
-
return "hello";
|
|
16
|
-
}
|
|
54
|
+
greet() { return "hello"; }
|
|
17
55
|
}
|
|
18
56
|
Injectable()(MyService, {});
|
|
19
|
-
|
|
20
|
-
expect(
|
|
21
|
-
expect(instance.greet()).toBe("hello");
|
|
57
|
+
expect(container.resolve(MyService)).toBeInstanceOf(MyService);
|
|
58
|
+
expect(container.resolve(MyService).greet()).toBe("hello");
|
|
22
59
|
});
|
|
23
|
-
it("registers with transient scope", () => {
|
|
60
|
+
it("registers with transient scope — each resolve returns a new instance", () => {
|
|
24
61
|
class TmpService {
|
|
25
62
|
}
|
|
26
63
|
Injectable({ scope: "transient" })(TmpService, {});
|
|
27
|
-
|
|
28
|
-
const b = useService(TmpService);
|
|
29
|
-
expect(a).not.toBe(b);
|
|
64
|
+
expect(container.resolve(TmpService)).not.toBe(container.resolve(TmpService));
|
|
30
65
|
});
|
|
31
66
|
});
|
|
32
|
-
// ── Inject
|
|
67
|
+
// ── @Inject ───────────────────────────────────────────────────────────────────
|
|
33
68
|
describe("Inject", () => {
|
|
34
69
|
it("injects a registered service via property", () => {
|
|
35
70
|
class Logger {
|
|
36
|
-
log(msg) {
|
|
37
|
-
return msg;
|
|
38
|
-
}
|
|
71
|
+
log(msg) { return msg; }
|
|
39
72
|
}
|
|
40
73
|
Injectable()(Logger, {});
|
|
41
|
-
const
|
|
42
|
-
const ctx = {
|
|
43
|
-
name: "logger",
|
|
44
|
-
kind: "field",
|
|
45
|
-
addInitializer(fn) {
|
|
46
|
-
initializers.push(fn);
|
|
47
|
-
},
|
|
48
|
-
};
|
|
74
|
+
const { ctx, run } = makeFieldCtx("logger");
|
|
49
75
|
Inject(Logger)(undefined, ctx);
|
|
50
76
|
const instance = {};
|
|
51
|
-
|
|
52
|
-
fn.call(instance);
|
|
53
|
-
});
|
|
77
|
+
run(instance);
|
|
54
78
|
expect(instance.logger).toBeInstanceOf(Logger);
|
|
79
|
+
// second access covers the cache-hit branch (line 62: !cache.has(this) === false)
|
|
80
|
+
expect(instance.logger).toBe(instance.logger);
|
|
55
81
|
});
|
|
56
82
|
it("throws a descriptive error when dep is not registered", () => {
|
|
57
83
|
class UnknownDep {
|
|
58
84
|
}
|
|
59
|
-
const
|
|
60
|
-
const ctx = {
|
|
61
|
-
name: "dep",
|
|
62
|
-
kind: "field",
|
|
63
|
-
addInitializer(fn) {
|
|
64
|
-
initializers.push(fn);
|
|
65
|
-
},
|
|
66
|
-
};
|
|
85
|
+
const { ctx, run } = makeFieldCtx("dep");
|
|
67
86
|
Inject(UnknownDep)(undefined, ctx);
|
|
68
87
|
class MyClass {
|
|
69
|
-
constructor() { }
|
|
70
88
|
}
|
|
71
89
|
const instance = new MyClass();
|
|
72
|
-
|
|
73
|
-
fn.call(instance);
|
|
74
|
-
});
|
|
90
|
+
run(instance);
|
|
75
91
|
expect(() => instance.dep).toThrow("[Inject]");
|
|
76
92
|
});
|
|
77
93
|
it("warns on direct assignment in non-production", () => {
|
|
78
94
|
class Dep2 {
|
|
79
95
|
}
|
|
80
96
|
Injectable()(Dep2, {});
|
|
81
|
-
const
|
|
82
|
-
const ctx = {
|
|
83
|
-
name: "dep2",
|
|
84
|
-
kind: "field",
|
|
85
|
-
addInitializer(fn) {
|
|
86
|
-
initializers.push(fn);
|
|
87
|
-
},
|
|
88
|
-
};
|
|
97
|
+
const { ctx, run } = makeFieldCtx("dep2");
|
|
89
98
|
Inject(Dep2)(undefined, ctx);
|
|
90
99
|
const instance = {};
|
|
91
|
-
|
|
92
|
-
fn.call(instance);
|
|
93
|
-
});
|
|
100
|
+
run(instance);
|
|
94
101
|
const spy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
95
102
|
instance.dep2 = "override";
|
|
96
103
|
expect(spy).toHaveBeenCalledWith(expect.stringContaining("[Inject]"));
|
|
97
104
|
spy.mockRestore();
|
|
98
105
|
});
|
|
106
|
+
it("returns cached value on second access (cache hit)", () => {
|
|
107
|
+
class CachedService {
|
|
108
|
+
constructor() {
|
|
109
|
+
this.id = Math.random();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
Injectable()(CachedService, {});
|
|
113
|
+
const { ctx, run } = makeFieldCtx("svc");
|
|
114
|
+
Inject(CachedService)(undefined, ctx);
|
|
115
|
+
const instance = {};
|
|
116
|
+
run(instance);
|
|
117
|
+
const first = instance.svc;
|
|
118
|
+
const second = instance.svc;
|
|
119
|
+
expect(first).toBe(second); // same cached instance
|
|
120
|
+
});
|
|
121
|
+
it("does not warn on direct assignment in production mode", () => {
|
|
122
|
+
class ProdDep {
|
|
123
|
+
}
|
|
124
|
+
Injectable()(ProdDep, {});
|
|
125
|
+
const { ctx, run } = makeFieldCtx("dep");
|
|
126
|
+
Inject(ProdDep)(undefined, ctx);
|
|
127
|
+
const instance = {};
|
|
128
|
+
run(instance);
|
|
129
|
+
const spy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
130
|
+
vi.stubEnv("NODE_ENV", "production");
|
|
131
|
+
instance.dep = "override";
|
|
132
|
+
expect(spy).not.toHaveBeenCalled();
|
|
133
|
+
vi.unstubAllEnvs();
|
|
134
|
+
spy.mockRestore();
|
|
135
|
+
});
|
|
136
|
+
it("includes the Token description in the error when resolution fails", () => {
|
|
137
|
+
const MY_TOKEN = token("MY_SERVICE");
|
|
138
|
+
const { ctx, run } = makeFieldCtx("svc");
|
|
139
|
+
Inject(MY_TOKEN)(undefined, ctx);
|
|
140
|
+
class Consumer {
|
|
141
|
+
}
|
|
142
|
+
const instance = new Consumer();
|
|
143
|
+
run(instance);
|
|
144
|
+
expect(() => instance.svc).toThrow("MY_SERVICE");
|
|
145
|
+
});
|
|
99
146
|
});
|
|
100
|
-
// ── InjectContainer
|
|
147
|
+
// ── @InjectContainer ──────────────────────────────────────────────────────────
|
|
101
148
|
describe("InjectContainer", () => {
|
|
102
|
-
it("injects the global container
|
|
103
|
-
const
|
|
104
|
-
const ctx = {
|
|
105
|
-
name: "container",
|
|
106
|
-
kind: "field",
|
|
107
|
-
addInitializer(fn) {
|
|
108
|
-
initializers.push(fn);
|
|
109
|
-
},
|
|
110
|
-
};
|
|
149
|
+
it("injects the global container on an unscoped class", () => {
|
|
150
|
+
const { ctx, run } = makeFieldCtx("c");
|
|
111
151
|
InjectContainer()(undefined, ctx);
|
|
112
152
|
const instance = {};
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
expect(instance.container).toBeInstanceOf(Container);
|
|
153
|
+
run(instance);
|
|
154
|
+
expect(instance.c).toBeInstanceOf(Container);
|
|
155
|
+
expect(instance.c).toBe(container);
|
|
117
156
|
});
|
|
118
157
|
});
|
|
119
|
-
// ──
|
|
120
|
-
describe("
|
|
121
|
-
it("
|
|
158
|
+
// ── @Scope ────────────────────────────────────────────────────────────────────
|
|
159
|
+
describe("Scope", () => {
|
|
160
|
+
it("creates a child container per instance", () => {
|
|
161
|
+
let Widget = (() => {
|
|
162
|
+
let _classDecorators = [Scope()];
|
|
163
|
+
let _classDescriptor;
|
|
164
|
+
let _classExtraInitializers = [];
|
|
165
|
+
let _classThis;
|
|
166
|
+
var Widget = class {
|
|
167
|
+
static { _classThis = this; }
|
|
168
|
+
static {
|
|
169
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
170
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
171
|
+
Widget = _classThis = _classDescriptor.value;
|
|
172
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
173
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
return Widget = _classThis;
|
|
177
|
+
})();
|
|
178
|
+
const { ctx, run } = makeFieldCtx("c");
|
|
179
|
+
InjectContainer()(undefined, ctx);
|
|
180
|
+
const a = new Widget();
|
|
181
|
+
run(a);
|
|
182
|
+
const b = new Widget();
|
|
183
|
+
run(b);
|
|
184
|
+
expect(a.c).toBeInstanceOf(Container);
|
|
185
|
+
expect(b.c).toBeInstanceOf(Container);
|
|
186
|
+
expect(a.c).not.toBe(b.c); // each instance gets its own scope
|
|
187
|
+
expect(a.c).not.toBe(container); // it's a child, not the root
|
|
188
|
+
});
|
|
189
|
+
it("services registered in configure are resolvable within the scope", () => {
|
|
190
|
+
const DB_URL = token("DB_URL");
|
|
191
|
+
let DataModule = (() => {
|
|
192
|
+
let _classDecorators = [Scope((c) => { c.registerValue(DB_URL, "postgres://localhost"); })];
|
|
193
|
+
let _classDescriptor;
|
|
194
|
+
let _classExtraInitializers = [];
|
|
195
|
+
let _classThis;
|
|
196
|
+
var DataModule = class {
|
|
197
|
+
static { _classThis = this; }
|
|
198
|
+
static {
|
|
199
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
200
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
201
|
+
DataModule = _classThis = _classDescriptor.value;
|
|
202
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
203
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
return DataModule = _classThis;
|
|
207
|
+
})();
|
|
208
|
+
const { ctx, run } = makeFieldCtx("db");
|
|
209
|
+
Inject(DB_URL)(undefined, ctx);
|
|
210
|
+
const instance = new DataModule();
|
|
211
|
+
run(instance);
|
|
212
|
+
expect(instance.db).toBe("postgres://localhost");
|
|
213
|
+
});
|
|
214
|
+
it("@Inject resolves from the scoped container, not the global one", () => {
|
|
215
|
+
class ScopedRepo {
|
|
216
|
+
}
|
|
217
|
+
// NOT registered in global container
|
|
122
218
|
const VERSION = token("VERSION");
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
219
|
+
let App = (() => {
|
|
220
|
+
let _classDecorators = [Scope((c) => {
|
|
221
|
+
c.register(ScopedRepo);
|
|
222
|
+
c.registerValue(VERSION, "2.0");
|
|
223
|
+
})];
|
|
224
|
+
let _classDescriptor;
|
|
225
|
+
let _classExtraInitializers = [];
|
|
226
|
+
let _classThis;
|
|
227
|
+
var App = class {
|
|
228
|
+
static { _classThis = this; }
|
|
229
|
+
static {
|
|
230
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
231
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
232
|
+
App = _classThis = _classDescriptor.value;
|
|
233
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
234
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
return App = _classThis;
|
|
238
|
+
})();
|
|
239
|
+
const { ctx: repoCtx, run: runRepo } = makeFieldCtx("repo");
|
|
240
|
+
Inject(ScopedRepo)(undefined, repoCtx);
|
|
241
|
+
const { ctx: verCtx, run: runVer } = makeFieldCtx("version");
|
|
242
|
+
Inject(VERSION)(undefined, verCtx);
|
|
243
|
+
const instance = new App();
|
|
244
|
+
runRepo(instance);
|
|
245
|
+
runVer(instance);
|
|
246
|
+
expect(instance.repo).toBeInstanceOf(ScopedRepo);
|
|
247
|
+
expect(instance.version).toBe("2.0");
|
|
126
248
|
});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
249
|
+
it("@InjectContainer returns the scoped child container", () => {
|
|
250
|
+
let Service = (() => {
|
|
251
|
+
let _classDecorators = [Scope((c) => { c.registerValue(token("X"), 42); })];
|
|
252
|
+
let _classDescriptor;
|
|
253
|
+
let _classExtraInitializers = [];
|
|
254
|
+
let _classThis;
|
|
255
|
+
var Service = class {
|
|
256
|
+
static { _classThis = this; }
|
|
257
|
+
static {
|
|
258
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
259
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
260
|
+
Service = _classThis = _classDescriptor.value;
|
|
261
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
262
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
return Service = _classThis;
|
|
266
|
+
})();
|
|
267
|
+
const { ctx, run } = makeFieldCtx("container");
|
|
268
|
+
InjectContainer()(undefined, ctx);
|
|
269
|
+
const instance = new Service();
|
|
270
|
+
run(instance);
|
|
271
|
+
expect(instance.container).toBeInstanceOf(Container);
|
|
272
|
+
expect(instance.container).not.toBe(container);
|
|
133
273
|
});
|
|
134
|
-
it("
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
274
|
+
it("child container inherits registrations from the parent", () => {
|
|
275
|
+
class GlobalService {
|
|
276
|
+
}
|
|
277
|
+
Injectable()(GlobalService, {});
|
|
278
|
+
let Child = (() => {
|
|
279
|
+
let _classDecorators = [Scope()];
|
|
280
|
+
let _classDescriptor;
|
|
281
|
+
let _classExtraInitializers = [];
|
|
282
|
+
let _classThis;
|
|
283
|
+
var Child = class {
|
|
284
|
+
static { _classThis = this; }
|
|
285
|
+
static {
|
|
286
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
287
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
288
|
+
Child = _classThis = _classDescriptor.value;
|
|
289
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
290
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
return Child = _classThis;
|
|
294
|
+
})();
|
|
295
|
+
const { ctx, run } = makeFieldCtx("svc");
|
|
296
|
+
Inject(GlobalService)(undefined, ctx);
|
|
297
|
+
const instance = new Child();
|
|
298
|
+
run(instance);
|
|
299
|
+
expect(instance.svc).toBeInstanceOf(GlobalService);
|
|
138
300
|
});
|
|
139
301
|
});
|
|
140
302
|
//# sourceMappingURL=decorators.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.test.js","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
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);
|
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,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"}
|
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 = {}) {
|