@joist/di 4.2.3-next.1 → 4.2.3-next.10
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/README.md +70 -34
- package/package.json +1 -1
- package/src/lib/lifecycle.test.ts +136 -0
- package/src/lib/lifecycle.ts +27 -10
- package/src/lib/metadata.ts +10 -5
- package/target/lib/lifecycle.d.ts +4 -4
- package/target/lib/lifecycle.js +18 -6
- package/target/lib/lifecycle.js.map +1 -1
- package/target/lib/lifecycle.test.js +201 -0
- package/target/lib/lifecycle.test.js.map +1 -1
- package/target/lib/metadata.d.ts +9 -2
- package/target/lib/metadata.js.map +1 -1
package/README.md
CHANGED
|
@@ -38,6 +38,7 @@ npm i @joist/di
|
|
|
38
38
|
## Injectors
|
|
39
39
|
|
|
40
40
|
Injectors are the core of the dependency injection system. They:
|
|
41
|
+
|
|
41
42
|
- Create and manage service instances
|
|
42
43
|
- Handle dependency resolution
|
|
43
44
|
- Maintain a hierarchy of injectors
|
|
@@ -103,7 +104,7 @@ class ApiService {
|
|
|
103
104
|
|
|
104
105
|
getData() {
|
|
105
106
|
return this.#http()
|
|
106
|
-
.fetch(
|
|
107
|
+
.fetch("/api/v1/users")
|
|
107
108
|
.then((res) => res.json());
|
|
108
109
|
}
|
|
109
110
|
}
|
|
@@ -111,22 +112,22 @@ class ApiService {
|
|
|
111
112
|
|
|
112
113
|
```ts
|
|
113
114
|
// services.test.ts
|
|
114
|
-
test(
|
|
115
|
+
test("should return json", async () => {
|
|
115
116
|
class MockHttpService extends HttpService {
|
|
116
117
|
async fetch() {
|
|
117
|
-
return Response.json({ fname:
|
|
118
|
+
return Response.json({ fname: "Danny", lname: "Blue" });
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
const app = new Injector({
|
|
122
|
-
providers: [[HttpService, { use: MockHttpService }]]
|
|
123
|
+
providers: [[HttpService, { use: MockHttpService }]],
|
|
123
124
|
});
|
|
124
125
|
const api = app.inject(ApiService);
|
|
125
126
|
|
|
126
127
|
const res = await api.getData();
|
|
127
128
|
|
|
128
|
-
assert.equals(res.fname,
|
|
129
|
-
assert.equals(res.lname,
|
|
129
|
+
assert.equals(res.fname, "Danny");
|
|
130
|
+
assert.equals(res.lname, "Blue");
|
|
130
131
|
});
|
|
131
132
|
```
|
|
132
133
|
|
|
@@ -148,7 +149,7 @@ class ConsoleLogger implements Logger {
|
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
@injectable({
|
|
151
|
-
providers: [[Logger, { use: ConsoleLogger }]]
|
|
152
|
+
providers: [[Logger, { use: ConsoleLogger }]],
|
|
152
153
|
})
|
|
153
154
|
class MyService {}
|
|
154
155
|
```
|
|
@@ -168,13 +169,13 @@ const app = new Injector([
|
|
|
168
169
|
factory() {
|
|
169
170
|
const params = new URLSearchParams(window.location.search);
|
|
170
171
|
|
|
171
|
-
if (params.has(
|
|
172
|
+
if (params.has("debug")) {
|
|
172
173
|
return console;
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
return new Logger(); // noop logger
|
|
176
|
-
}
|
|
177
|
-
}
|
|
177
|
+
},
|
|
178
|
+
},
|
|
178
179
|
]);
|
|
179
180
|
```
|
|
180
181
|
|
|
@@ -204,9 +205,9 @@ const app = new Injector([
|
|
|
204
205
|
factory(i) {
|
|
205
206
|
const logger = i.inject(Logger);
|
|
206
207
|
return new Feature(logger);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
]
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
],
|
|
210
211
|
]);
|
|
211
212
|
```
|
|
212
213
|
|
|
@@ -216,15 +217,15 @@ In most cases, a token is any constructable class. There are cases where you mig
|
|
|
216
217
|
|
|
217
218
|
```ts
|
|
218
219
|
// Token that resolves to a string
|
|
219
|
-
const URL_TOKEN = new StaticToken<string>(
|
|
220
|
+
const URL_TOKEN = new StaticToken<string>("app_url");
|
|
220
221
|
|
|
221
222
|
const app = new Injector([
|
|
222
223
|
[
|
|
223
224
|
URL_TOKEN,
|
|
224
225
|
{
|
|
225
|
-
factory: () =>
|
|
226
|
-
}
|
|
227
|
-
]
|
|
226
|
+
factory: () => "/my-app-url/",
|
|
227
|
+
},
|
|
228
|
+
],
|
|
228
229
|
]);
|
|
229
230
|
```
|
|
230
231
|
|
|
@@ -233,7 +234,7 @@ const app = new Injector([
|
|
|
233
234
|
A static token can be provided a default factory function to use on creation.
|
|
234
235
|
|
|
235
236
|
```ts
|
|
236
|
-
const URL_TOKEN = new StaticToken(
|
|
237
|
+
const URL_TOKEN = new StaticToken("app_url", () => "/default-url/");
|
|
237
238
|
```
|
|
238
239
|
|
|
239
240
|
### Async Values
|
|
@@ -242,7 +243,7 @@ Static tokens can also leverage promises for cases when you need to asynchronous
|
|
|
242
243
|
|
|
243
244
|
```ts
|
|
244
245
|
// StaticToken<Promise<string>>
|
|
245
|
-
const URL_TOKEN = new StaticToken(
|
|
246
|
+
const URL_TOKEN = new StaticToken("app_url", async () => "/default-url/");
|
|
246
247
|
|
|
247
248
|
const app = new Injector();
|
|
248
249
|
|
|
@@ -252,8 +253,8 @@ const url: string = await app.inject(URL_TOKEN);
|
|
|
252
253
|
This allows you to dynamically import services:
|
|
253
254
|
|
|
254
255
|
```ts
|
|
255
|
-
const HttpService = new StaticToken(
|
|
256
|
-
return import(
|
|
256
|
+
const HttpService = new StaticToken("HTTP_SERVICE", () => {
|
|
257
|
+
return import("./http.service.js").then((m) => new m.HttpService());
|
|
257
258
|
});
|
|
258
259
|
|
|
259
260
|
class HackerNewsService {
|
|
@@ -262,9 +263,9 @@ class HackerNewsService {
|
|
|
262
263
|
async getData() {
|
|
263
264
|
const http = await this.#http();
|
|
264
265
|
|
|
265
|
-
const url = new URL(
|
|
266
|
-
url.searchParams.set(
|
|
267
|
-
url.searchParams.set(
|
|
266
|
+
const url = new URL("https://hacker-news.firebaseio.com/v0/beststories.json");
|
|
267
|
+
url.searchParams.set("limitToFirst", count.toString());
|
|
268
|
+
url.searchParams.set("orderBy", '"$key"');
|
|
268
269
|
|
|
269
270
|
return http.fetchJson<string[]>(url);
|
|
270
271
|
}
|
|
@@ -289,6 +290,41 @@ class MyService {
|
|
|
289
290
|
}
|
|
290
291
|
```
|
|
291
292
|
|
|
293
|
+
### Conditional Lifecycle Hooks
|
|
294
|
+
|
|
295
|
+
You can control when lifecycle callbacks are executed by providing a condition function:
|
|
296
|
+
|
|
297
|
+
```ts
|
|
298
|
+
class MyService {
|
|
299
|
+
@created(() => ({ enabled: true }))
|
|
300
|
+
onCreated() {
|
|
301
|
+
// This will execute because enabled is true
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@injected(() => {
|
|
305
|
+
return {
|
|
306
|
+
enabled: process.env.NODE_ENV === "development",
|
|
307
|
+
};
|
|
308
|
+
})
|
|
309
|
+
onInjected() {
|
|
310
|
+
// will only execute when NODE_ENV is development
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
The condition function can return an object with an `enabled` property that determines whether the callback should execute:
|
|
316
|
+
|
|
317
|
+
- `{ enabled: true }` - The callback will execute
|
|
318
|
+
- `{ enabled: false }` - The callback will not execute
|
|
319
|
+
- `{}` - The callback will execute (default behavior)
|
|
320
|
+
|
|
321
|
+
Lifecycle conditions are useful when you need to:
|
|
322
|
+
|
|
323
|
+
- Execute callbacks only in specific environments
|
|
324
|
+
- Control callback execution based on instance state
|
|
325
|
+
- Implement feature flags for lifecycle hooks
|
|
326
|
+
- Conditionally initialize services based on configuration
|
|
327
|
+
|
|
292
328
|
## Hierarchical Injectors
|
|
293
329
|
|
|
294
330
|
Injectors can be defined with a parent. The top-most parent will (by default) be where services are constructed and cached. Only if manually defined providers are found earlier in the chain will services be constructed lower. The injector resolution algorithm behaves as follows:
|
|
@@ -331,8 +367,8 @@ const app = new DOMInjector();
|
|
|
331
367
|
app.attach(document.body); // Anything rendered in the body will have access to this injector.
|
|
332
368
|
|
|
333
369
|
class Colors {
|
|
334
|
-
primary =
|
|
335
|
-
secondary =
|
|
370
|
+
primary = "red";
|
|
371
|
+
secondary = "green";
|
|
336
372
|
}
|
|
337
373
|
|
|
338
374
|
@injectable()
|
|
@@ -345,12 +381,12 @@ class MyElement extends HTMLElement {
|
|
|
345
381
|
}
|
|
346
382
|
}
|
|
347
383
|
|
|
348
|
-
customElements.define(
|
|
384
|
+
customElements.define("my-element", MyElement);
|
|
349
385
|
```
|
|
350
386
|
|
|
351
387
|
### Context Elements
|
|
352
388
|
|
|
353
|
-
Context elements are where Hierarchical Injectors can really shine as they allow you to define React/Preact-esque "context" elements.
|
|
389
|
+
Context elements are where Hierarchical Injectors can really shine as they allow you to define React/Preact-esque "context" elements.
|
|
354
390
|
Since custom elements are treated the same as any other class, they can define providers for their local scope. The `provideSelfAs` property will provide the current class for the tokens given.
|
|
355
391
|
This also makes it easy to use attributes to define values for the service.
|
|
356
392
|
|
|
@@ -361,16 +397,16 @@ class ColorCtx {
|
|
|
361
397
|
}
|
|
362
398
|
|
|
363
399
|
@injectable({
|
|
364
|
-
name:
|
|
365
|
-
provideSelfAs: [ColorCtx]
|
|
400
|
+
name: "color-ctx",
|
|
401
|
+
provideSelfAs: [ColorCtx],
|
|
366
402
|
})
|
|
367
403
|
class ColorCtx extends HTMLElement implements ColorCtx {
|
|
368
404
|
get primary() {
|
|
369
|
-
return this.getAttribute("primary") ?? "red"
|
|
405
|
+
return this.getAttribute("primary") ?? "red";
|
|
370
406
|
}
|
|
371
407
|
|
|
372
408
|
get secondary() {
|
|
373
|
-
return this.getAttribute("secondary") ?? "green"
|
|
409
|
+
return this.getAttribute("secondary") ?? "green";
|
|
374
410
|
}
|
|
375
411
|
}
|
|
376
412
|
|
|
@@ -385,8 +421,8 @@ class MyElement extends HTMLElement {
|
|
|
385
421
|
}
|
|
386
422
|
|
|
387
423
|
// Note: To use parent providers, the parent elements need to be defined first!
|
|
388
|
-
customElements.define(
|
|
389
|
-
customElements.define(
|
|
424
|
+
customElements.define("color-ctx", ColorCtx);
|
|
425
|
+
customElements.define("my-element", MyElement);
|
|
390
426
|
```
|
|
391
427
|
|
|
392
428
|
```html
|
package/package.json
CHANGED
|
@@ -128,3 +128,139 @@ it("should call onInject and on init when injected from another service", () =>
|
|
|
128
128
|
onInjected: 2,
|
|
129
129
|
});
|
|
130
130
|
});
|
|
131
|
+
|
|
132
|
+
it("should respect enabled=false condition in lifecycle callbacks", () => {
|
|
133
|
+
const i = new Injector();
|
|
134
|
+
|
|
135
|
+
@injectable()
|
|
136
|
+
class MyService {
|
|
137
|
+
res = {
|
|
138
|
+
onCreated: 0,
|
|
139
|
+
onInjected: 0,
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
@created(() => ({ enabled: false }))
|
|
143
|
+
onCreated() {
|
|
144
|
+
this.res.onCreated++;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@injected(() => ({ enabled: false }))
|
|
148
|
+
onInjected() {
|
|
149
|
+
this.res.onInjected++;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const service = i.inject(MyService);
|
|
154
|
+
|
|
155
|
+
assert.deepEqual(service.res, {
|
|
156
|
+
onCreated: 0,
|
|
157
|
+
onInjected: 0,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("should respect enabled=true condition in lifecycle callbacks", () => {
|
|
162
|
+
const i = new Injector();
|
|
163
|
+
|
|
164
|
+
@injectable()
|
|
165
|
+
class MyService {
|
|
166
|
+
res = {
|
|
167
|
+
onCreated: 0,
|
|
168
|
+
onInjected: 0,
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
@created(() => ({ enabled: true }))
|
|
172
|
+
onCreated() {
|
|
173
|
+
this.res.onCreated++;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
@injected(() => ({ enabled: true }))
|
|
177
|
+
onInjected() {
|
|
178
|
+
this.res.onInjected++;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const service = i.inject(MyService);
|
|
183
|
+
|
|
184
|
+
assert.deepEqual(service.res, {
|
|
185
|
+
onCreated: 1,
|
|
186
|
+
onInjected: 1,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("should execute callbacks when condition returns undefined enabled", () => {
|
|
191
|
+
const i = new Injector();
|
|
192
|
+
|
|
193
|
+
@injectable()
|
|
194
|
+
class MyService {
|
|
195
|
+
res = {
|
|
196
|
+
onCreated: 0,
|
|
197
|
+
onInjected: 0,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
@created(() => ({ enabled: undefined }))
|
|
201
|
+
onCreated() {
|
|
202
|
+
this.res.onCreated++;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
@injected(() => ({ enabled: undefined }))
|
|
206
|
+
onInjected() {
|
|
207
|
+
this.res.onInjected++;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const service = i.inject(MyService);
|
|
212
|
+
|
|
213
|
+
assert.deepEqual(service.res, {
|
|
214
|
+
onCreated: 1,
|
|
215
|
+
onInjected: 1,
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("should execute callbacks when condition returns empty object", () => {
|
|
220
|
+
const i = new Injector();
|
|
221
|
+
|
|
222
|
+
@injectable()
|
|
223
|
+
class MyService {
|
|
224
|
+
res = {
|
|
225
|
+
onCreated: 0,
|
|
226
|
+
onInjected: 0,
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
@created(() => ({}))
|
|
230
|
+
onCreated() {
|
|
231
|
+
this.res.onCreated++;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
@injected(() => ({}))
|
|
235
|
+
onInjected() {
|
|
236
|
+
this.res.onInjected++;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const service = i.inject(MyService);
|
|
241
|
+
|
|
242
|
+
assert.deepEqual(service.res, {
|
|
243
|
+
onCreated: 1,
|
|
244
|
+
onInjected: 1,
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it("should provide type safety for instance properties", () => {
|
|
249
|
+
const i = new Injector();
|
|
250
|
+
|
|
251
|
+
@injectable()
|
|
252
|
+
class MyService {
|
|
253
|
+
count = 0;
|
|
254
|
+
name = "test";
|
|
255
|
+
|
|
256
|
+
@created<MyService>((instance) => {
|
|
257
|
+
return { enabled: instance.count > 0 && instance.name === "test" };
|
|
258
|
+
})
|
|
259
|
+
onCreated() {
|
|
260
|
+
this.count++;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const service = i.inject(MyService);
|
|
265
|
+
assert.equal(service.count, 0); // Not called because count is 0
|
|
266
|
+
});
|
package/src/lib/lifecycle.ts
CHANGED
|
@@ -1,36 +1,53 @@
|
|
|
1
1
|
import type { Injector } from "./injector.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
InjectableMetadata,
|
|
4
|
+
LifecycleCallback,
|
|
5
|
+
LifecycleCondition,
|
|
6
|
+
LifecycleMethod,
|
|
7
|
+
} from "./metadata.js";
|
|
3
8
|
|
|
4
|
-
export function injected() {
|
|
9
|
+
export function injected<T extends object>(condition?: LifecycleCondition<T>) {
|
|
5
10
|
return function onInjectDecorator(
|
|
6
11
|
val: LifecycleCallback,
|
|
7
12
|
ctx: ClassMethodDecoratorContext,
|
|
8
13
|
): void {
|
|
9
14
|
const metadata: InjectableMetadata = ctx.metadata;
|
|
10
15
|
metadata.onInjected ??= [];
|
|
11
|
-
metadata.onInjected.push(
|
|
16
|
+
metadata.onInjected.push({
|
|
17
|
+
callback: val,
|
|
18
|
+
condition,
|
|
19
|
+
});
|
|
12
20
|
};
|
|
13
21
|
}
|
|
14
22
|
|
|
15
|
-
export function created() {
|
|
23
|
+
export function created<T extends object>(condition?: LifecycleCondition<T>) {
|
|
16
24
|
return function onInjectDecorator(
|
|
17
25
|
val: LifecycleCallback,
|
|
18
26
|
ctx: ClassMethodDecoratorContext,
|
|
19
27
|
): void {
|
|
20
28
|
const metadata: InjectableMetadata = ctx.metadata;
|
|
21
29
|
metadata.onCreated ??= [];
|
|
22
|
-
metadata.onCreated.push(
|
|
30
|
+
metadata.onCreated.push({
|
|
31
|
+
callback: val,
|
|
32
|
+
condition,
|
|
33
|
+
});
|
|
23
34
|
};
|
|
24
35
|
}
|
|
25
36
|
|
|
26
|
-
export function callLifecycle(
|
|
27
|
-
instance:
|
|
37
|
+
export function callLifecycle<T extends object>(
|
|
38
|
+
instance: T,
|
|
28
39
|
i: Injector,
|
|
29
|
-
methods?:
|
|
40
|
+
methods?: LifecycleMethod<T>[],
|
|
30
41
|
): void {
|
|
31
42
|
if (methods) {
|
|
32
|
-
for (const
|
|
33
|
-
|
|
43
|
+
for (const { callback, condition } of methods) {
|
|
44
|
+
if (condition) {
|
|
45
|
+
const result = condition(instance);
|
|
46
|
+
if (result.enabled === false) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
callback.call(instance, i);
|
|
34
51
|
}
|
|
35
52
|
}
|
|
36
53
|
}
|
package/src/lib/metadata.ts
CHANGED
|
@@ -5,14 +5,19 @@ import type { InjectionToken } from "./provider.js";
|
|
|
5
5
|
|
|
6
6
|
export type LifecycleCallback = (i: Injector) => void;
|
|
7
7
|
|
|
8
|
+
export type LifecycleCondition<T extends object> = (instance: T) => { enabled?: boolean };
|
|
9
|
+
|
|
10
|
+
export interface LifecycleMethod<T extends object> {
|
|
11
|
+
callback: LifecycleCallback;
|
|
12
|
+
condition?: LifecycleCondition<T>;
|
|
13
|
+
}
|
|
14
|
+
|
|
8
15
|
export interface InjectableMetadata {
|
|
9
|
-
onCreated?:
|
|
10
|
-
onInjected?:
|
|
16
|
+
onCreated?: LifecycleMethod<any>[];
|
|
17
|
+
onInjected?: LifecycleMethod<any>[];
|
|
11
18
|
}
|
|
12
19
|
|
|
13
|
-
export function readMetadata<T>(
|
|
14
|
-
target: InjectionToken<T>,
|
|
15
|
-
): InjectableMetadata | null {
|
|
20
|
+
export function readMetadata<T>(target: InjectionToken<T>): InjectableMetadata | null {
|
|
16
21
|
const metadata: InjectableMetadata | null = target[Symbol.metadata];
|
|
17
22
|
|
|
18
23
|
return metadata;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Injector } from "./injector.js";
|
|
2
|
-
import type { LifecycleCallback } from "./metadata.js";
|
|
3
|
-
export declare function injected(): (val: LifecycleCallback, ctx: ClassMethodDecoratorContext) => void;
|
|
4
|
-
export declare function created(): (val: LifecycleCallback, ctx: ClassMethodDecoratorContext) => void;
|
|
5
|
-
export declare function callLifecycle(instance:
|
|
2
|
+
import type { LifecycleCallback, LifecycleCondition, LifecycleMethod } from "./metadata.js";
|
|
3
|
+
export declare function injected<T extends object>(condition?: LifecycleCondition<T>): (val: LifecycleCallback, ctx: ClassMethodDecoratorContext) => void;
|
|
4
|
+
export declare function created<T extends object>(condition?: LifecycleCondition<T>): (val: LifecycleCallback, ctx: ClassMethodDecoratorContext) => void;
|
|
5
|
+
export declare function callLifecycle<T extends object>(instance: T, i: Injector, methods?: LifecycleMethod<T>[]): void;
|
package/target/lib/lifecycle.js
CHANGED
|
@@ -1,21 +1,33 @@
|
|
|
1
|
-
export function injected() {
|
|
1
|
+
export function injected(condition) {
|
|
2
2
|
return function onInjectDecorator(val, ctx) {
|
|
3
3
|
const metadata = ctx.metadata;
|
|
4
4
|
metadata.onInjected ??= [];
|
|
5
|
-
metadata.onInjected.push(
|
|
5
|
+
metadata.onInjected.push({
|
|
6
|
+
callback: val,
|
|
7
|
+
condition,
|
|
8
|
+
});
|
|
6
9
|
};
|
|
7
10
|
}
|
|
8
|
-
export function created() {
|
|
11
|
+
export function created(condition) {
|
|
9
12
|
return function onInjectDecorator(val, ctx) {
|
|
10
13
|
const metadata = ctx.metadata;
|
|
11
14
|
metadata.onCreated ??= [];
|
|
12
|
-
metadata.onCreated.push(
|
|
15
|
+
metadata.onCreated.push({
|
|
16
|
+
callback: val,
|
|
17
|
+
condition,
|
|
18
|
+
});
|
|
13
19
|
};
|
|
14
20
|
}
|
|
15
21
|
export function callLifecycle(instance, i, methods) {
|
|
16
22
|
if (methods) {
|
|
17
|
-
for (const
|
|
18
|
-
|
|
23
|
+
for (const { callback, condition } of methods) {
|
|
24
|
+
if (condition) {
|
|
25
|
+
const result = condition(instance);
|
|
26
|
+
if (result.enabled === false) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
callback.call(instance, i);
|
|
19
31
|
}
|
|
20
32
|
}
|
|
21
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/lib/lifecycle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/lib/lifecycle.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,QAAQ,CAAmB,SAAiC;IAC1E,OAAO,SAAS,iBAAiB,CAC/B,GAAsB,EACtB,GAAgC;QAEhC,MAAM,QAAQ,GAAuB,GAAG,CAAC,QAAQ,CAAC;QAClD,QAAQ,CAAC,UAAU,KAAK,EAAE,CAAC;QAC3B,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;YACvB,QAAQ,EAAE,GAAG;YACb,SAAS;SACV,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAmB,SAAiC;IACzE,OAAO,SAAS,iBAAiB,CAC/B,GAAsB,EACtB,GAAgC;QAEhC,MAAM,QAAQ,GAAuB,GAAG,CAAC,QAAQ,CAAC;QAClD,QAAQ,CAAC,SAAS,KAAK,EAAE,CAAC;QAC1B,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,QAAQ,EAAE,GAAG;YACb,SAAS;SACV,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAW,EACX,CAAW,EACX,OAA8B;IAE9B,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,OAAO,EAAE,CAAC;YAC9C,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC7B,SAAS;gBACX,CAAC;YACH,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -193,4 +193,205 @@ it("should call onInject and on init when injected from another service", () =>
|
|
|
193
193
|
onInjected: 2,
|
|
194
194
|
});
|
|
195
195
|
});
|
|
196
|
+
it("should respect enabled=false condition in lifecycle callbacks", () => {
|
|
197
|
+
const i = new Injector();
|
|
198
|
+
let MyService = (() => {
|
|
199
|
+
let _classDecorators = [injectable()];
|
|
200
|
+
let _classDescriptor;
|
|
201
|
+
let _classExtraInitializers = [];
|
|
202
|
+
let _classThis;
|
|
203
|
+
let _instanceExtraInitializers = [];
|
|
204
|
+
let _onCreated_decorators;
|
|
205
|
+
let _onInjected_decorators;
|
|
206
|
+
var MyService = class {
|
|
207
|
+
static { _classThis = this; }
|
|
208
|
+
static {
|
|
209
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
210
|
+
_onCreated_decorators = [created(() => ({ enabled: false }))];
|
|
211
|
+
_onInjected_decorators = [injected(() => ({ enabled: false }))];
|
|
212
|
+
__esDecorate(this, null, _onCreated_decorators, { kind: "method", name: "onCreated", static: false, private: false, access: { has: obj => "onCreated" in obj, get: obj => obj.onCreated }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
213
|
+
__esDecorate(this, null, _onInjected_decorators, { kind: "method", name: "onInjected", static: false, private: false, access: { has: obj => "onInjected" in obj, get: obj => obj.onInjected }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
214
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
215
|
+
MyService = _classThis = _classDescriptor.value;
|
|
216
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
217
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
218
|
+
}
|
|
219
|
+
res = (__runInitializers(this, _instanceExtraInitializers), {
|
|
220
|
+
onCreated: 0,
|
|
221
|
+
onInjected: 0,
|
|
222
|
+
});
|
|
223
|
+
onCreated() {
|
|
224
|
+
this.res.onCreated++;
|
|
225
|
+
}
|
|
226
|
+
onInjected() {
|
|
227
|
+
this.res.onInjected++;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
return MyService = _classThis;
|
|
231
|
+
})();
|
|
232
|
+
const service = i.inject(MyService);
|
|
233
|
+
assert.deepEqual(service.res, {
|
|
234
|
+
onCreated: 0,
|
|
235
|
+
onInjected: 0,
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
it("should respect enabled=true condition in lifecycle callbacks", () => {
|
|
239
|
+
const i = new Injector();
|
|
240
|
+
let MyService = (() => {
|
|
241
|
+
let _classDecorators = [injectable()];
|
|
242
|
+
let _classDescriptor;
|
|
243
|
+
let _classExtraInitializers = [];
|
|
244
|
+
let _classThis;
|
|
245
|
+
let _instanceExtraInitializers = [];
|
|
246
|
+
let _onCreated_decorators;
|
|
247
|
+
let _onInjected_decorators;
|
|
248
|
+
var MyService = class {
|
|
249
|
+
static { _classThis = this; }
|
|
250
|
+
static {
|
|
251
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
252
|
+
_onCreated_decorators = [created(() => ({ enabled: true }))];
|
|
253
|
+
_onInjected_decorators = [injected(() => ({ enabled: true }))];
|
|
254
|
+
__esDecorate(this, null, _onCreated_decorators, { kind: "method", name: "onCreated", static: false, private: false, access: { has: obj => "onCreated" in obj, get: obj => obj.onCreated }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
255
|
+
__esDecorate(this, null, _onInjected_decorators, { kind: "method", name: "onInjected", static: false, private: false, access: { has: obj => "onInjected" in obj, get: obj => obj.onInjected }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
256
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
257
|
+
MyService = _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
|
+
res = (__runInitializers(this, _instanceExtraInitializers), {
|
|
262
|
+
onCreated: 0,
|
|
263
|
+
onInjected: 0,
|
|
264
|
+
});
|
|
265
|
+
onCreated() {
|
|
266
|
+
this.res.onCreated++;
|
|
267
|
+
}
|
|
268
|
+
onInjected() {
|
|
269
|
+
this.res.onInjected++;
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
return MyService = _classThis;
|
|
273
|
+
})();
|
|
274
|
+
const service = i.inject(MyService);
|
|
275
|
+
assert.deepEqual(service.res, {
|
|
276
|
+
onCreated: 1,
|
|
277
|
+
onInjected: 1,
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
it("should execute callbacks when condition returns undefined enabled", () => {
|
|
281
|
+
const i = new Injector();
|
|
282
|
+
let MyService = (() => {
|
|
283
|
+
let _classDecorators = [injectable()];
|
|
284
|
+
let _classDescriptor;
|
|
285
|
+
let _classExtraInitializers = [];
|
|
286
|
+
let _classThis;
|
|
287
|
+
let _instanceExtraInitializers = [];
|
|
288
|
+
let _onCreated_decorators;
|
|
289
|
+
let _onInjected_decorators;
|
|
290
|
+
var MyService = class {
|
|
291
|
+
static { _classThis = this; }
|
|
292
|
+
static {
|
|
293
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
294
|
+
_onCreated_decorators = [created(() => ({ enabled: undefined }))];
|
|
295
|
+
_onInjected_decorators = [injected(() => ({ enabled: undefined }))];
|
|
296
|
+
__esDecorate(this, null, _onCreated_decorators, { kind: "method", name: "onCreated", static: false, private: false, access: { has: obj => "onCreated" in obj, get: obj => obj.onCreated }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
297
|
+
__esDecorate(this, null, _onInjected_decorators, { kind: "method", name: "onInjected", static: false, private: false, access: { has: obj => "onInjected" in obj, get: obj => obj.onInjected }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
298
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
299
|
+
MyService = _classThis = _classDescriptor.value;
|
|
300
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
301
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
302
|
+
}
|
|
303
|
+
res = (__runInitializers(this, _instanceExtraInitializers), {
|
|
304
|
+
onCreated: 0,
|
|
305
|
+
onInjected: 0,
|
|
306
|
+
});
|
|
307
|
+
onCreated() {
|
|
308
|
+
this.res.onCreated++;
|
|
309
|
+
}
|
|
310
|
+
onInjected() {
|
|
311
|
+
this.res.onInjected++;
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
return MyService = _classThis;
|
|
315
|
+
})();
|
|
316
|
+
const service = i.inject(MyService);
|
|
317
|
+
assert.deepEqual(service.res, {
|
|
318
|
+
onCreated: 1,
|
|
319
|
+
onInjected: 1,
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
it("should execute callbacks when condition returns empty object", () => {
|
|
323
|
+
const i = new Injector();
|
|
324
|
+
let MyService = (() => {
|
|
325
|
+
let _classDecorators = [injectable()];
|
|
326
|
+
let _classDescriptor;
|
|
327
|
+
let _classExtraInitializers = [];
|
|
328
|
+
let _classThis;
|
|
329
|
+
let _instanceExtraInitializers = [];
|
|
330
|
+
let _onCreated_decorators;
|
|
331
|
+
let _onInjected_decorators;
|
|
332
|
+
var MyService = class {
|
|
333
|
+
static { _classThis = this; }
|
|
334
|
+
static {
|
|
335
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
336
|
+
_onCreated_decorators = [created(() => ({}))];
|
|
337
|
+
_onInjected_decorators = [injected(() => ({}))];
|
|
338
|
+
__esDecorate(this, null, _onCreated_decorators, { kind: "method", name: "onCreated", static: false, private: false, access: { has: obj => "onCreated" in obj, get: obj => obj.onCreated }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
339
|
+
__esDecorate(this, null, _onInjected_decorators, { kind: "method", name: "onInjected", static: false, private: false, access: { has: obj => "onInjected" in obj, get: obj => obj.onInjected }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
340
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
341
|
+
MyService = _classThis = _classDescriptor.value;
|
|
342
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
343
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
344
|
+
}
|
|
345
|
+
res = (__runInitializers(this, _instanceExtraInitializers), {
|
|
346
|
+
onCreated: 0,
|
|
347
|
+
onInjected: 0,
|
|
348
|
+
});
|
|
349
|
+
onCreated() {
|
|
350
|
+
this.res.onCreated++;
|
|
351
|
+
}
|
|
352
|
+
onInjected() {
|
|
353
|
+
this.res.onInjected++;
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
return MyService = _classThis;
|
|
357
|
+
})();
|
|
358
|
+
const service = i.inject(MyService);
|
|
359
|
+
assert.deepEqual(service.res, {
|
|
360
|
+
onCreated: 1,
|
|
361
|
+
onInjected: 1,
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
it("should provide type safety for instance properties", () => {
|
|
365
|
+
const i = new Injector();
|
|
366
|
+
let MyService = (() => {
|
|
367
|
+
let _classDecorators = [injectable()];
|
|
368
|
+
let _classDescriptor;
|
|
369
|
+
let _classExtraInitializers = [];
|
|
370
|
+
let _classThis;
|
|
371
|
+
let _instanceExtraInitializers = [];
|
|
372
|
+
let _onCreated_decorators;
|
|
373
|
+
var MyService = class {
|
|
374
|
+
static { _classThis = this; }
|
|
375
|
+
static {
|
|
376
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
377
|
+
_onCreated_decorators = [created((instance) => {
|
|
378
|
+
return { enabled: instance.count > 0 && instance.name === "test" };
|
|
379
|
+
})];
|
|
380
|
+
__esDecorate(this, null, _onCreated_decorators, { kind: "method", name: "onCreated", static: false, private: false, access: { has: obj => "onCreated" in obj, get: obj => obj.onCreated }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
381
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
382
|
+
MyService = _classThis = _classDescriptor.value;
|
|
383
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
384
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
385
|
+
}
|
|
386
|
+
count = (__runInitializers(this, _instanceExtraInitializers), 0);
|
|
387
|
+
name = "test";
|
|
388
|
+
onCreated() {
|
|
389
|
+
this.count++;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
return MyService = _classThis;
|
|
393
|
+
})();
|
|
394
|
+
const service = i.inject(MyService);
|
|
395
|
+
assert.equal(service.count, 0);
|
|
396
|
+
});
|
|
196
397
|
//# sourceMappingURL=lifecycle.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../../src/lib/lifecycle.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../../src/lib/lifecycle.test.ts"],"names":[],"mappings":"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"}
|
package/target/lib/metadata.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { type Injector } from "./injector.js";
|
|
2
2
|
import type { InjectionToken } from "./provider.js";
|
|
3
3
|
export type LifecycleCallback = (i: Injector) => void;
|
|
4
|
+
export type LifecycleCondition<T extends object> = (instance: T) => {
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export interface LifecycleMethod<T extends object> {
|
|
8
|
+
callback: LifecycleCallback;
|
|
9
|
+
condition?: LifecycleCondition<T>;
|
|
10
|
+
}
|
|
4
11
|
export interface InjectableMetadata {
|
|
5
|
-
onCreated?:
|
|
6
|
-
onInjected?:
|
|
12
|
+
onCreated?: LifecycleMethod<any>[];
|
|
13
|
+
onInjected?: LifecycleMethod<any>[];
|
|
7
14
|
}
|
|
8
15
|
export declare function readMetadata<T>(target: InjectionToken<T>): InjectableMetadata | null;
|
|
9
16
|
export declare function readInjector<T>(target: T): Injector | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAiB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAiB,MAAM,eAAe,CAAC;AAiBxD,MAAM,UAAU,YAAY,CAAI,MAAyB;IACvD,MAAM,QAAQ,GAA8B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,MAAS;IACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,QAAQ,CAAa,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|