@joist/di 4.0.0-next.40 → 4.0.0-next.42

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
@@ -338,34 +338,38 @@ customElements.define('my-element', MyElement);
338
338
 
339
339
  ### Context Elements:
340
340
 
341
- Context elements are where Hierarchical Injectors can really shine as they allow you to defined React/Preact esq "context" elements. Since custom elements are treated the same as any other class they can define providers for their local scope.
341
+ Context elements are where Hierarchical Injectors can really shine as they allow you to defined React/Preact esq "context" elements.
342
+ 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.
343
+ This also makes it easy to attributes to define values for the service.
342
344
 
343
345
  ```TS
344
346
  const app = new DOMInjector();
345
347
 
346
348
  app.attach(document.body);
347
349
 
348
- class Colors {
349
- primary = 'red';
350
- secodnary = 'green';
350
+ interface ColorCtx {
351
+ primary: string;
352
+ secondary: string;
351
353
  }
352
354
 
355
+ const COLOR_CTX = new StaticToken<ColorCtx>('COLOR_CTX')
356
+
353
357
  @injectable({
354
- providers: [
355
- {
356
- provide: Colors,
357
- use: class implements Colors {
358
- primary = 'orange';
359
- secondary = 'purple';
360
- }
361
- }
362
- ]
358
+ provideSelfAs: [COLOR_CTX]
363
359
  })
364
- class ColorCtx extends HTMLElement {}
360
+ class ColorCtx extends HTMLElement implements ColorCtx {
361
+ get primary() {
362
+ return this.getAttribute("primary") ?? "red"
363
+ }
364
+
365
+ get secondary() {
366
+ return this.getAttribute("secondary") ?? "green"
367
+ }
368
+ }
365
369
 
366
370
  @injectable()
367
371
  class MyElement extends HTMLElement {
368
- #colors = inject(Colors);
372
+ #colors = inject(COLOR_CTX);
369
373
 
370
374
  connectedCallback() {
371
375
  const { primary } = this.#colors();
@@ -374,17 +378,17 @@ class MyElement extends HTMLElement {
374
378
  }
375
379
  }
376
380
 
377
- // Note: To use parent providers, the parent elements need to be defined first in correct order!
381
+ // Note: To use parent providers, the parent elements need to be defined first!
378
382
  customElements.define('color-ctx', ColorCtx);
379
383
  customElements.define('my-element', MyElement);
380
384
  ```
381
385
 
382
386
  ```HTML
383
- <!-- Default Colors -->
387
+ <!-- Error: No colors provided -->
384
388
  <my-element></my-element>
385
389
 
386
- <!-- Special color ctx -->
387
- <color-ctx>
390
+ <!-- colors come from ctx -->
391
+ <color-ctx primary="orange" secondard="blue">
388
392
  <my-element></my-element>
389
393
  </color-ctx>
390
394
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joist/di",
3
- "version": "4.0.0-next.40",
3
+ "version": "4.0.0-next.42",
4
4
  "type": "module",
5
5
  "main": "./target/lib.js",
6
6
  "module": "./target/lib.js",
@@ -1,24 +1,28 @@
1
- import { ContextRequestEvent } from './context/protocol.js';
1
+ import { ContextRequestEvent, UnknownContext } from './context/protocol.js';
2
2
  import { INJECTOR_CTX } from './context/injector.js';
3
3
  import { Injector } from './injector.js';
4
4
 
5
5
  export class DOMInjector extends Injector {
6
- #contextCallback = (e: ContextRequestEvent<{ __context__: unknown }>) => {
7
- if (e.context === INJECTOR_CTX) {
8
- if (e.target !== this.#element) {
9
- e.stopPropagation();
10
-
11
- e.callback(this);
12
- }
13
- }
14
- };
15
-
16
6
  #element: HTMLElement | null = null;
7
+ #controller: AbortController | null = null;
17
8
 
18
9
  attach(element: HTMLElement): void {
19
10
  this.#element = element;
11
+ this.#controller = new AbortController();
20
12
 
21
- this.#element.addEventListener('context-request', this.#contextCallback);
13
+ this.#element.addEventListener(
14
+ 'context-request',
15
+ (e: ContextRequestEvent<UnknownContext>) => {
16
+ if (e.context === INJECTOR_CTX) {
17
+ if (e.target !== this.#element) {
18
+ e.stopPropagation();
19
+
20
+ e.callback(this);
21
+ }
22
+ }
23
+ },
24
+ { signal: this.#controller.signal }
25
+ );
22
26
 
23
27
  this.#element.dispatchEvent(
24
28
  new ContextRequestEvent(INJECTOR_CTX, (parent) => {
@@ -28,8 +32,8 @@ export class DOMInjector extends Injector {
28
32
  }
29
33
 
30
34
  detach(): void {
31
- if (this.#element) {
32
- this.#element.removeEventListener('context-request', this.#contextCallback);
35
+ if (this.#controller) {
36
+ this.#controller.abort();
33
37
  }
34
38
  }
35
39
  }
@@ -36,15 +36,13 @@ export function injectableEl<T extends ConstructableToken<HTMLElement>>(
36
36
  connectedCallback() {
37
37
  const injector = injectables.get(this);
38
38
 
39
- this.dispatchEvent(
40
- new ContextRequestEvent(INJECTOR_CTX, (parent) => {
41
- if (injector) {
42
- injector.setParent(parent);
43
- }
44
- })
45
- );
46
-
47
39
  if (injector) {
40
+ this.dispatchEvent(
41
+ new ContextRequestEvent(INJECTOR_CTX, (ctx) => {
42
+ injector.setParent(ctx);
43
+ })
44
+ );
45
+
48
46
  callLifecycle(this, injector, metadata?.onInjected);
49
47
  }
50
48
 
@@ -3,6 +3,7 @@ import { assert } from 'chai';
3
3
  import { injectable } from './injectable.js';
4
4
  import { inject } from './inject.js';
5
5
  import { injectables, Injector } from './injector.js';
6
+ import { StaticToken } from './provider.js';
6
7
 
7
8
  it('should locally override a provider', () => {
8
9
  class Foo {}
@@ -51,3 +52,18 @@ it('should not override the name of the original class', () => {
51
52
 
52
53
  assert.equal(MyService.name, 'MyService');
53
54
  });
55
+
56
+ it('should provide itself for spefified tokens', () => {
57
+ const TOKEN = new StaticToken('MY_TOKEN');
58
+
59
+ @injectable({
60
+ provideSelfAs: [TOKEN]
61
+ })
62
+ class MyService {
63
+ value = inject(TOKEN);
64
+ }
65
+
66
+ const service = new MyService();
67
+
68
+ assert.equal(service.value(), service);
69
+ });
@@ -1,12 +1,13 @@
1
1
  (Symbol as any).metadata ??= Symbol('Symbol.metadata');
2
2
 
3
- import { ConstructableToken, Provider } from './provider.js';
3
+ import { ConstructableToken, InjectionToken, Provider } from './provider.js';
4
4
  import { injectables, Injector } from './injector.js';
5
5
  import { injectableEl } from './injectable-el.js';
6
6
 
7
7
  export interface InjectableOpts {
8
8
  name?: string;
9
9
  providers?: Iterable<Provider<any>>;
10
+ provideSelfAs?: InjectionToken<any>[];
10
11
  }
11
12
 
12
13
  export function injectable(opts?: InjectableOpts) {
@@ -25,6 +26,14 @@ export function injectable(opts?: InjectableOpts) {
25
26
  factory: () => injector
26
27
  });
27
28
 
29
+ if (opts?.provideSelfAs) {
30
+ for (const token of opts.provideSelfAs) {
31
+ injector.providers.set(token, {
32
+ factory: () => this
33
+ });
34
+ }
35
+ }
36
+
28
37
  injectables.set(this, injector);
29
38
  }
30
39
  }
@@ -2,25 +2,26 @@ import { ContextRequestEvent } from './context/protocol.js';
2
2
  import { INJECTOR_CTX } from './context/injector.js';
3
3
  import { Injector } from './injector.js';
4
4
  export class DOMInjector extends Injector {
5
- #contextCallback = (e) => {
6
- if (e.context === INJECTOR_CTX) {
7
- if (e.target !== this.#element) {
8
- e.stopPropagation();
9
- e.callback(this);
10
- }
11
- }
12
- };
13
5
  #element = null;
6
+ #controller = null;
14
7
  attach(element) {
15
8
  this.#element = element;
16
- this.#element.addEventListener('context-request', this.#contextCallback);
9
+ this.#controller = new AbortController();
10
+ this.#element.addEventListener('context-request', (e) => {
11
+ if (e.context === INJECTOR_CTX) {
12
+ if (e.target !== this.#element) {
13
+ e.stopPropagation();
14
+ e.callback(this);
15
+ }
16
+ }
17
+ }, { signal: this.#controller.signal });
17
18
  this.#element.dispatchEvent(new ContextRequestEvent(INJECTOR_CTX, (parent) => {
18
19
  this.setParent(parent);
19
20
  }));
20
21
  }
21
22
  detach() {
22
- if (this.#element) {
23
- this.#element.removeEventListener('context-request', this.#contextCallback);
23
+ if (this.#controller) {
24
+ this.#controller.abort();
24
25
  }
25
26
  }
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dom-injector.js","sourceRoot":"","sources":["../../src/lib/dom-injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,gBAAgB,GAAG,CAAC,CAAgD,EAAE,EAAE;QACtE,IAAI,CAAC,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC/B,CAAC,CAAC,eAAe,EAAE,CAAC;gBAEpB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,GAAuB,IAAI,CAAC;IAEpC,MAAM,CAAC,OAAoB;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEzE,IAAI,CAAC,QAAQ,CAAC,aAAa,CACzB,IAAI,mBAAmB,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"dom-injector.js","sourceRoot":"","sources":["../../src/lib/dom-injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAkB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,QAAQ,GAAuB,IAAI,CAAC;IACpC,WAAW,GAA2B,IAAI,CAAC;IAE3C,MAAM,CAAC,OAAoB;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAC5B,iBAAiB,EACjB,CAAC,CAAsC,EAAE,EAAE;YACzC,IAAI,CAAC,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC/B,CAAC,CAAC,eAAe,EAAE,CAAC;oBAEpB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC,EACD,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CACpC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,aAAa,CACzB,IAAI,mBAAmB,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;CACF"}
@@ -23,12 +23,10 @@ export function injectableEl(Base, ctx) {
23
23
  }
24
24
  connectedCallback() {
25
25
  const injector = injectables.get(this);
26
- this.dispatchEvent(new ContextRequestEvent(INJECTOR_CTX, (parent) => {
27
- if (injector) {
28
- injector.setParent(parent);
29
- }
30
- }));
31
26
  if (injector) {
27
+ this.dispatchEvent(new ContextRequestEvent(INJECTOR_CTX, (ctx) => {
28
+ injector.setParent(ctx);
29
+ }));
32
30
  callLifecycle(this, injector, metadata?.onInjected);
33
31
  }
34
32
  if (super.connectedCallback) {
@@ -1 +1 @@
1
- {"version":3,"file":"injectable-el.js","sourceRoot":"","sources":["../../src/lib/injectable-el.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI/C,MAAM,UAAU,YAAY,CAC1B,IAAO,EACP,GAA0B;IAE1B,MAAM,QAAQ,GAAuB,GAAG,CAAC,QAAQ,CAAC;IAElD,MAAM,GAAG,GAAG;QACV,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAM,SAAQ,IAAI;YAC7B,YAAY,GAAG,CAAQ;gBACrB,KAAK,EAAE,CAAC;gBAER,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE;oBAC7C,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;wBACpD,CAAC,CAAC,eAAe,EAAE,CAAC;wBAEpB,IAAI,QAAQ,EAAE,CAAC;4BACb,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBACvB,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,QAAQ,EAAE,CAAC;oBACb,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YAED,iBAAiB;gBACf,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,CAAC,aAAa,CAChB,IAAI,mBAAmB,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;oBAC/C,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC,CAAC,CACH,CAAC;gBAEF,IAAI,QAAQ,EAAE,CAAC;oBACb,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACtD,CAAC;gBAED,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBAC5B,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,oBAAoB;gBAClB,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;gBAE5C,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;oBAC/B,KAAK,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,CAAC;YACH,CAAC;SACF;KACF,CAAC;IAEF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"injectable-el.js","sourceRoot":"","sources":["../../src/lib/injectable-el.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI/C,MAAM,UAAU,YAAY,CAC1B,IAAO,EACP,GAA0B;IAE1B,MAAM,QAAQ,GAAuB,GAAG,CAAC,QAAQ,CAAC;IAElD,MAAM,GAAG,GAAG;QACV,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAM,SAAQ,IAAI;YAC7B,YAAY,GAAG,CAAQ;gBACrB,KAAK,EAAE,CAAC;gBAER,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE;oBAC7C,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;wBACpD,CAAC,CAAC,eAAe,EAAE,CAAC;wBAEpB,IAAI,QAAQ,EAAE,CAAC;4BACb,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBACvB,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,QAAQ,EAAE,CAAC;oBACb,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YAED,iBAAiB;gBACf,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,aAAa,CAChB,IAAI,mBAAmB,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;wBAC5C,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC1B,CAAC,CAAC,CACH,CAAC;oBAEF,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACtD,CAAC;gBAED,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBAC5B,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,oBAAoB;gBAClB,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;gBAE5C,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;oBAC/B,KAAK,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,CAAC;YACH,CAAC;SACF;KACF,CAAC;IAEF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -1,6 +1,7 @@
1
- import { ConstructableToken, Provider } from './provider.js';
1
+ import { ConstructableToken, InjectionToken, Provider } from './provider.js';
2
2
  export interface InjectableOpts {
3
3
  name?: string;
4
4
  providers?: Iterable<Provider<any>>;
5
+ provideSelfAs?: InjectionToken<any>[];
5
6
  }
6
7
  export declare function injectable(opts?: InjectableOpts): <T extends ConstructableToken<any>>(Base: T, ctx: ClassDecoratorContext) => T;
@@ -11,6 +11,13 @@ export function injectable(opts) {
11
11
  injector.providers.set(Injector, {
12
12
  factory: () => injector
13
13
  });
14
+ if (opts?.provideSelfAs) {
15
+ for (const token of opts.provideSelfAs) {
16
+ injector.providers.set(token, {
17
+ factory: () => this
18
+ });
19
+ }
20
+ }
14
21
  injectables.set(this, injector);
15
22
  }
16
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"injectable.js","sourceRoot":"","sources":["../../src/lib/injectable.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOlD,MAAM,UAAU,UAAU,CAAC,IAAqB;IAC9C,OAAO,SAAS,mBAAmB,CACjC,IAAO,EACP,GAA0B;QAE1B,MAAM,GAAG,GAAG;YACV,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAM,SAAQ,IAAI;gBAC7B,YAAY,GAAG,IAAW;oBACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;oBAEf,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAEpC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE;wBAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ;qBACxB,CAAC,CAAC;oBAEH,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAClC,CAAC;aACF;SACF,CAAC;QAGF,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;YAChC,IAAI,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxD,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"injectable.js","sourceRoot":"","sources":["../../src/lib/injectable.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,UAAU,UAAU,CAAC,IAAqB;IAC9C,OAAO,SAAS,mBAAmB,CACjC,IAAO,EACP,GAA0B;QAE1B,MAAM,GAAG,GAAG;YACV,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAM,SAAQ,IAAI;gBAC7B,YAAY,GAAG,IAAW;oBACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;oBAEf,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAEpC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE;wBAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ;qBACxB,CAAC,CAAC;oBAEH,IAAI,IAAI,EAAE,aAAa,EAAE,CAAC;wBACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;4BACvC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE;gCAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;6BACpB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAClC,CAAC;aACF;SACF,CAAC;QAGF,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;YAChC,IAAI,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxD,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC"}
@@ -3,6 +3,7 @@ import { assert } from 'chai';
3
3
  import { injectable } from './injectable.js';
4
4
  import { inject } from './inject.js';
5
5
  import { injectables, Injector } from './injector.js';
6
+ import { StaticToken } from './provider.js';
6
7
  it('should locally override a provider', () => {
7
8
  class Foo {
8
9
  }
@@ -100,4 +101,29 @@ it('should not override the name of the original class', () => {
100
101
  })();
101
102
  assert.equal(MyService.name, 'MyService');
102
103
  });
104
+ it('should provide itself for spefified tokens', () => {
105
+ const TOKEN = new StaticToken('MY_TOKEN');
106
+ let MyService = (() => {
107
+ let _classDecorators = [injectable({
108
+ provideSelfAs: [TOKEN]
109
+ })];
110
+ let _classDescriptor;
111
+ let _classExtraInitializers = [];
112
+ let _classThis;
113
+ var MyService = class {
114
+ static { _classThis = this; }
115
+ static {
116
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
117
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
118
+ MyService = _classThis = _classDescriptor.value;
119
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
120
+ __runInitializers(_classThis, _classExtraInitializers);
121
+ }
122
+ value = inject(TOKEN);
123
+ };
124
+ return MyService = _classThis;
125
+ })();
126
+ const service = new MyService();
127
+ assert.equal(service.value(), service);
128
+ });
103
129
  //# sourceMappingURL=injectable.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"injectable.test.js","sourceRoot":"","sources":["../../src/lib/injectable.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEtD,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAC5C,MAAM,GAAG;KAAG;IAEZ,MAAM,GAAI,SAAQ,GAAG;KAAG;QAKlB,SAAS;gCAHd,UAAU,CAAC;gBACV,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;aACjC,CAAC;;;;;;;;gBACF,6KAEC;;;gBAFK,uDAAS;;YACb,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;;;;IAGpB,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;IAE3B,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAEpD,SAAS;gCADd,UAAU,EAAE;;;;;;;;gBACb,6KAEC;;;gBAFK,uDAAS;;YACM,GAAG;YAAtB,YAAmB,GAAG,GAAG,GAAG;gBAAT,QAAG,GAAH,GAAG,CAAM;YAAG,CAAC;;;;IAGlC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IAEpC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAEzD,SAAS;gCADd,UAAU,EAAE;;;;;;;;gBACb,6KAEC;;;gBAFK,uDAAS;;YACb,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;;;;IAG9B,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAEtD,SAAS;gCADd,UAAU,EAAE;;;;;;;;gBACb,6KAAkB;;;gBAAZ,uDAAS;;;;;IAEf,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"injectable.test.js","sourceRoot":"","sources":["../../src/lib/injectable.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAC5C,MAAM,GAAG;KAAG;IAEZ,MAAM,GAAI,SAAQ,GAAG;KAAG;QAKlB,SAAS;gCAHd,UAAU,CAAC;gBACV,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;aACjC,CAAC;;;;;;;;gBACF,6KAEC;;;gBAFK,uDAAS;;YACb,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;;;;IAGpB,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;IAE3B,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAEpD,SAAS;gCADd,UAAU,EAAE;;;;;;;;gBACb,6KAEC;;;gBAFK,uDAAS;;YACM,GAAG;YAAtB,YAAmB,GAAG,GAAG,GAAG;gBAAT,QAAG,GAAH,GAAG,CAAM;YAAG,CAAC;;;;IAGlC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IAEpC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAEzD,SAAS;gCADd,UAAU,EAAE;;;;;;;;gBACb,6KAEC;;;gBAFK,uDAAS;;YACb,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;;;;IAG9B,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAEtD,SAAS;gCADd,UAAU,EAAE;;;;;;;;gBACb,6KAAkB;;;gBAAZ,uDAAS;;;;;IAEf,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACpD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;QAKpC,SAAS;gCAHd,UAAU,CAAC;gBACV,aAAa,EAAE,CAAC,KAAK,CAAC;aACvB,CAAC;;;;;;;;gBACF,6KAEC;;;gBAFK,uDAAS;;YACb,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;;;;IAGxB,MAAM,OAAO,GAAG,IAAI,SAAS,EAAE,CAAC;IAEhC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}