@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 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('/api/v1/users')
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('should return json', async () => {
115
+ test("should return json", async () => {
115
116
  class MockHttpService extends HttpService {
116
117
  async fetch() {
117
- return Response.json({ fname: 'Danny', lname: 'Blue' });
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, 'Danny');
129
- assert.equals(res.lname, 'Blue');
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('debug')) {
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>('app_url');
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: () => '/my-app-url/'
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('app_url', () => '/default-url/');
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('app_url', async () => '/default-url/');
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('HTTP_SERVICE', () => {
256
- return import('./http.service.js').then((m) => new m.HttpService());
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('https://hacker-news.firebaseio.com/v0/beststories.json');
266
- url.searchParams.set('limitToFirst', count.toString());
267
- url.searchParams.set('orderBy', '"$key"');
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 = 'red';
335
- secondary = 'green';
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('my-element', MyElement);
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: 'color-ctx',
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('color-ctx', ColorCtx);
389
- customElements.define('my-element', MyElement);
424
+ customElements.define("color-ctx", ColorCtx);
425
+ customElements.define("my-element", MyElement);
390
426
  ```
391
427
 
392
428
  ```html
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joist/di",
3
- "version": "4.2.3-next.1",
3
+ "version": "4.2.3-next.10",
4
4
  "type": "module",
5
5
  "main": "./target/lib.js",
6
6
  "module": "./target/lib.js",
@@ -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
+ });
@@ -1,36 +1,53 @@
1
1
  import type { Injector } from "./injector.js";
2
- import type { InjectableMetadata, LifecycleCallback } from "./metadata.js";
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(val);
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(val);
30
+ metadata.onCreated.push({
31
+ callback: val,
32
+ condition,
33
+ });
23
34
  };
24
35
  }
25
36
 
26
- export function callLifecycle(
27
- instance: object,
37
+ export function callLifecycle<T extends object>(
38
+ instance: T,
28
39
  i: Injector,
29
- methods?: LifecycleCallback[],
40
+ methods?: LifecycleMethod<T>[],
30
41
  ): void {
31
42
  if (methods) {
32
- for (const cb of methods) {
33
- cb.call(instance, i);
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
  }
@@ -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?: LifecycleCallback[];
10
- onInjected?: LifecycleCallback[];
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: object, i: Injector, methods?: LifecycleCallback[]): void;
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;
@@ -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(val);
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(val);
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 cb of methods) {
18
- cb.call(instance, i);
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":"AAGA,MAAM,UAAU,QAAQ;IACtB,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,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,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,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,CAAW,EACX,OAA6B;IAE7B,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC"}
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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"}
@@ -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?: LifecycleCallback[];
6
- onInjected?: LifecycleCallback[];
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;AAUxD,MAAM,UAAU,YAAY,CAC1B,MAAyB;IAEzB,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"}
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"}