@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 +23 -19
- package/package.json +1 -1
- package/src/lib/dom-injector.ts +18 -14
- package/src/lib/injectable-el.ts +6 -8
- package/src/lib/injectable.test.ts +16 -0
- package/src/lib/injectable.ts +10 -1
- package/target/lib/dom-injector.js +12 -11
- package/target/lib/dom-injector.js.map +1 -1
- package/target/lib/injectable-el.js +3 -5
- package/target/lib/injectable-el.js.map +1 -1
- package/target/lib/injectable.d.ts +2 -1
- package/target/lib/injectable.js +7 -0
- package/target/lib/injectable.js.map +1 -1
- package/target/lib/injectable.test.js +26 -0
- package/target/lib/injectable.test.js.map +1 -1
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.
|
|
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
|
-
|
|
349
|
-
primary
|
|
350
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
-
<!--
|
|
387
|
+
<!-- Error: No colors provided -->
|
|
384
388
|
<my-element></my-element>
|
|
385
389
|
|
|
386
|
-
<!--
|
|
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
package/src/lib/dom-injector.ts
CHANGED
|
@@ -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(
|
|
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.#
|
|
32
|
-
this.#
|
|
35
|
+
if (this.#controller) {
|
|
36
|
+
this.#controller.abort();
|
|
33
37
|
}
|
|
34
38
|
}
|
|
35
39
|
}
|
package/src/lib/injectable-el.ts
CHANGED
|
@@ -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
|
+
});
|
package/src/lib/injectable.ts
CHANGED
|
@@ -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.#
|
|
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.#
|
|
23
|
-
this.#
|
|
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,
|
|
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,
|
|
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;
|
package/target/lib/injectable.js
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|