@joist/di 4.0.0-next.1 → 4.0.0-next.11

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.
Files changed (66) hide show
  1. package/README.md +52 -34
  2. package/package.json +4 -14
  3. package/src/lib/dom-injector.test.ts +16 -18
  4. package/src/lib/dom-injector.ts +3 -4
  5. package/src/lib/inject.test.ts +33 -56
  6. package/src/lib/inject.ts +4 -6
  7. package/src/lib/injectable-el.test.ts +130 -0
  8. package/src/lib/injectable-el.ts +63 -0
  9. package/src/lib/injectable.test.ts +19 -116
  10. package/src/lib/injectable.ts +21 -57
  11. package/src/lib/injector.test.ts +132 -130
  12. package/src/lib/injector.ts +33 -19
  13. package/src/lib/lifecycle.test.ts +68 -64
  14. package/src/lib/lifecycle.ts +19 -4
  15. package/src/lib/metadata.ts +12 -0
  16. package/src/lib/provider.ts +16 -8
  17. package/src/lib.ts +1 -1
  18. package/target/lib/dom-injector.js +3 -4
  19. package/target/lib/dom-injector.js.map +1 -1
  20. package/target/lib/dom-injector.test.js +16 -18
  21. package/target/lib/dom-injector.test.js.map +1 -1
  22. package/target/lib/inject.js +3 -3
  23. package/target/lib/inject.js.map +1 -1
  24. package/target/lib/inject.test.js +58 -90
  25. package/target/lib/inject.test.js.map +1 -1
  26. package/target/lib/injectable-el.d.ts +334 -0
  27. package/target/lib/injectable-el.js +40 -0
  28. package/target/lib/injectable-el.js.map +1 -0
  29. package/target/lib/injectable-el.test.js +238 -0
  30. package/target/lib/injectable-el.test.js.map +1 -0
  31. package/target/lib/injectable.d.ts +5 -7
  32. package/target/lib/injectable.js +13 -42
  33. package/target/lib/injectable.js.map +1 -1
  34. package/target/lib/injectable.test.js +49 -204
  35. package/target/lib/injectable.test.js.map +1 -1
  36. package/target/lib/injector.d.ts +1 -1
  37. package/target/lib/injector.js +18 -14
  38. package/target/lib/injector.js.map +1 -1
  39. package/target/lib/injector.test.js +215 -216
  40. package/target/lib/injector.test.js.map +1 -1
  41. package/target/lib/lifecycle.d.ts +2 -4
  42. package/target/lib/lifecycle.js +15 -4
  43. package/target/lib/lifecycle.js.map +1 -1
  44. package/target/lib/lifecycle.test.js +142 -123
  45. package/target/lib/lifecycle.test.js.map +1 -1
  46. package/target/lib/metadata.d.ts +6 -0
  47. package/target/lib/metadata.js +5 -0
  48. package/target/lib/metadata.js.map +1 -0
  49. package/target/lib/provider.d.ts +6 -5
  50. package/target/lib/provider.js +10 -4
  51. package/target/lib/provider.js.map +1 -1
  52. package/target/lib.d.ts +1 -1
  53. package/target/lib.js +1 -1
  54. package/target/lib.js.map +1 -1
  55. package/src/lib/injectable-map.test.ts +0 -18
  56. package/src/lib/injectable-map.ts +0 -3
  57. package/src/lib/injector.test-node.ts +0 -187
  58. package/target/lib/injectable-map.d.ts +0 -3
  59. package/target/lib/injectable-map.js +0 -3
  60. package/target/lib/injectable-map.js.map +0 -1
  61. package/target/lib/injectable-map.test.js +0 -15
  62. package/target/lib/injectable-map.test.js.map +0 -1
  63. package/target/lib/injector.test-node.d.ts +0 -1
  64. package/target/lib/injector.test-node.js +0 -231
  65. package/target/lib/injector.test-node.js.map +0 -1
  66. /package/target/lib/{injectable-map.test.d.ts → injectable-el.test.d.ts} +0 -0
@@ -1,49 +1,20 @@
1
- import { Injector } from './injector.js';
2
- import { InjectableMap } from './injectable-map.js';
3
- export const INJECTABLE_MAP = new InjectableMap();
4
- export function injectable(Base, _) {
5
- return class InjectableNode extends Base {
6
- constructor(..._) {
7
- super();
8
- const injector = new Injector(Base.providers);
9
- INJECTABLE_MAP.set(this, injector);
10
- if ('HTMLElement' in globalThis && this instanceof HTMLElement) {
11
- this.addEventListener('finddiroot', (e) => {
12
- const parentInjector = findInjectorRoot(e);
13
- if (parentInjector !== null) {
14
- injector.setParent(parentInjector);
15
- }
16
- });
1
+ Symbol.metadata ??= Symbol('Symbol.metadata');
2
+ import { injectables, Injector } from './injector.js';
3
+ import { injectableEl } from './injectable-el.js';
4
+ export function injectable(opts) {
5
+ return function injectableDecorator(Base, ctx) {
6
+ class Injectable extends Base {
7
+ constructor(..._) {
8
+ super();
9
+ injectables.set(this, new Injector(opts?.providers));
17
10
  }
18
11
  }
19
- connectedCallback() {
20
- if ('HTMLElement' in globalThis && this instanceof HTMLElement) {
21
- this.dispatchEvent(new Event('finddiroot'));
22
- if (super.connectedCallback) {
23
- super.connectedCallback();
24
- }
25
- }
26
- }
27
- disconnectedCallback() {
28
- const injector = INJECTABLE_MAP.get(this);
29
- if (injector) {
30
- injector.setParent(undefined);
31
- }
32
- if (super.disconnectedCallback) {
33
- super.disconnectedCallback();
12
+ if ('HTMLElement' in globalThis) {
13
+ if (HTMLElement.prototype.isPrototypeOf(Base.prototype)) {
14
+ return injectableEl(Injectable, ctx);
34
15
  }
35
16
  }
17
+ return Injectable;
36
18
  };
37
19
  }
38
- function findInjectorRoot(e) {
39
- const path = e.composedPath();
40
- for (let i = 1; i < path.length; i++) {
41
- const part = path[i];
42
- const injector = INJECTABLE_MAP.get(part);
43
- if (injector) {
44
- return injector;
45
- }
46
- }
47
- return null;
48
- }
49
20
  //# sourceMappingURL=injectable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"injectable.js","sourceRoot":"","sources":["../../src/lib/injectable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,aAAa,EAAE,CAAC;AAElD,MAAM,UAAU,UAAU,CAAoC,IAAO,EAAE,CAAW;IAChF,OAAO,MAAM,cAAe,SAAQ,IAAI;QACtC,YAAY,GAAG,CAAQ;YACrB,KAAK,EAAE,CAAC;YAGR,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAInC,IAAI,aAAa,IAAI,UAAU,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;gBAC/D,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;oBACxC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBAE3C,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;wBAC5B,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,iBAAiB;YACf,IAAI,aAAa,IAAI,UAAU,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;gBAC/D,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;gBAE5C,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBAC5B,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,oBAAoB;YAClB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAQ;IAChC,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;IAI9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAErB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,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;AAMlD,MAAM,UAAU,UAAU,CAAC,IAAqB;IAC9C,OAAO,SAAS,mBAAmB,CACjC,IAAO,EACP,GAA0B;QAE1B,MAAM,UAAW,SAAQ,IAAI;YAC3B,YAAY,GAAG,CAAQ;gBACrB,KAAK,EAAE,CAAC;gBAER,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YACvD,CAAC;SACF;QAGD,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;YAChC,IAAI,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxD,OAAO,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
@@ -1,210 +1,55 @@
1
1
  import { __esDecorate, __runInitializers } from "tslib";
2
- import { expect, fixture, html } from '@open-wc/testing';
2
+ import { assert } from 'chai';
3
3
  import { injectable } from './injectable.js';
4
4
  import { inject } from './inject.js';
5
- describe('@injectable()', () => {
6
- it('should allow a custom element to be injected with deps', () => {
7
- class Foo {
8
- }
9
- class Bar {
10
- }
11
- let MyElement = (() => {
12
- let _classDecorators = [injectable];
13
- let _classDescriptor;
14
- let _classExtraInitializers = [];
15
- let _classThis;
16
- let _classSuper = HTMLElement;
17
- var MyElement = class extends _classSuper {
18
- static { _classThis = this; }
19
- static {
20
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
21
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
22
- MyElement = _classThis = _classDescriptor.value;
23
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
24
- __runInitializers(_classThis, _classExtraInitializers);
25
- }
26
- foo = inject(Foo);
27
- bar = inject(Bar);
28
- };
29
- return MyElement = _classThis;
30
- })();
31
- customElements.define('injectable-1', MyElement);
32
- const el = document.createElement('injectable-1');
33
- expect(el.foo()).to.be.instanceOf(Foo);
34
- });
35
- it('should locally override a provider', () => {
36
- class Foo {
37
- }
38
- class Bar extends Foo {
39
- }
40
- const MyElement = injectable(class {
41
- static providers = [{ provide: Foo, use: Bar }];
5
+ import { injectables } from './injector.js';
6
+ it('should locally override a provider', () => {
7
+ class Foo {
8
+ }
9
+ class Bar extends Foo {
10
+ }
11
+ let MyService = (() => {
12
+ let _classDecorators = [injectable({
13
+ providers: [{ provide: Foo, use: Bar }]
14
+ })];
15
+ let _classDescriptor;
16
+ let _classExtraInitializers = [];
17
+ let _classThis;
18
+ var MyService = class {
19
+ static { _classThis = this; }
20
+ static {
21
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
22
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
23
+ MyService = _classThis = _classDescriptor.value;
24
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
25
+ __runInitializers(_classThis, _classExtraInitializers);
26
+ }
42
27
  foo = inject(Foo);
43
- });
44
- const el = new MyElement();
45
- expect(el.foo()).to.be.instanceOf(Bar);
46
- });
47
- it('should handle parent HTML Injectors', async () => {
48
- let A = (() => {
49
- let _classDecorators = [injectable];
50
- let _classDescriptor;
51
- let _classExtraInitializers = [];
52
- let _classThis;
53
- var A = class {
54
- static { _classThis = this; }
55
- static {
56
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
57
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
58
- A = _classThis = _classDescriptor.value;
59
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
60
- __runInitializers(_classThis, _classExtraInitializers);
61
- }
62
- };
63
- return A = _classThis;
64
- })();
65
- const B = injectable(class {
66
- a = inject(A);
67
- });
68
- class AltA {
69
- }
70
- let Parent = (() => {
71
- let _classDecorators = [injectable];
72
- let _classDescriptor;
73
- let _classExtraInitializers = [];
74
- let _classThis;
75
- let _classSuper = HTMLElement;
76
- var Parent = class extends _classSuper {
77
- static { _classThis = this; }
78
- static {
79
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
80
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
81
- Parent = _classThis = _classDescriptor.value;
82
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
83
- }
84
- static providers = [
85
- { provide: B, use: B },
86
- { provide: A, use: AltA }
87
- ];
88
- static {
89
- __runInitializers(_classThis, _classExtraInitializers);
90
- }
91
- };
92
- return Parent = _classThis;
93
- })();
94
- let Child = (() => {
95
- let _classDecorators = [injectable];
96
- let _classDescriptor;
97
- let _classExtraInitializers = [];
98
- let _classThis;
99
- let _classSuper = HTMLElement;
100
- var Child = class extends _classSuper {
101
- static { _classThis = this; }
102
- static {
103
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
104
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
105
- Child = _classThis = _classDescriptor.value;
106
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
107
- __runInitializers(_classThis, _classExtraInitializers);
108
- }
109
- b = inject(B);
110
- };
111
- return Child = _classThis;
112
- })();
113
- customElements.define('injectable-parent-1', Parent);
114
- customElements.define('injectable-child-1', Child);
115
- const el = await fixture(html `
116
- <injectable-parent-1>
117
- <injectable-child-1></injectable-child-1>
118
- </injectable-parent-1>
119
- `);
120
- const child = el.querySelector('injectable-child-1');
121
- expect(child.b().a()).to.be.instanceOf(AltA);
122
- });
123
- it('should handle changing contexts', async () => {
124
- class A {
125
- }
126
- class AltA {
127
- }
128
- let Ctx1 = (() => {
129
- let _classDecorators = [injectable];
130
- let _classDescriptor;
131
- let _classExtraInitializers = [];
132
- let _classThis;
133
- let _classSuper = HTMLElement;
134
- var Ctx1 = class extends _classSuper {
135
- static { _classThis = this; }
136
- static {
137
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
138
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
139
- Ctx1 = _classThis = _classDescriptor.value;
140
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
141
- }
142
- static providers = [{ provide: A, use: A }];
143
- static {
144
- __runInitializers(_classThis, _classExtraInitializers);
145
- }
146
- };
147
- return Ctx1 = _classThis;
148
- })();
149
- let Ctx2 = (() => {
150
- let _classDecorators = [injectable];
151
- let _classDescriptor;
152
- let _classExtraInitializers = [];
153
- let _classThis;
154
- let _classSuper = HTMLElement;
155
- var Ctx2 = class extends _classSuper {
156
- static { _classThis = this; }
157
- static {
158
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
159
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
160
- Ctx2 = _classThis = _classDescriptor.value;
161
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
162
- }
163
- static providers = [{ provide: A, use: AltA }];
164
- static {
165
- __runInitializers(_classThis, _classExtraInitializers);
166
- }
167
- };
168
- return Ctx2 = _classThis;
169
- })();
170
- let Child = (() => {
171
- let _classDecorators = [injectable];
172
- let _classDescriptor;
173
- let _classExtraInitializers = [];
174
- let _classThis;
175
- let _classSuper = HTMLElement;
176
- var Child = class extends _classSuper {
177
- static { _classThis = this; }
178
- static {
179
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
180
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
181
- Child = _classThis = _classDescriptor.value;
182
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
183
- __runInitializers(_classThis, _classExtraInitializers);
184
- }
185
- a = inject(A);
186
- };
187
- return Child = _classThis;
188
- })();
189
- customElements.define('ctx-1', Ctx1);
190
- customElements.define('ctx-2', Ctx2);
191
- customElements.define('ctx-child', Child);
192
- const el = await fixture(html `
193
- <div>
194
- <ctx-1>
195
- <ctx-child></ctx-child>
196
- </ctx-1>
197
-
198
- <ctx-2></ctx-2>
199
- </div>
200
- `);
201
- const ctx2 = el.querySelector('ctx-2');
202
- let child = el.querySelector('ctx-child');
203
- expect(child.a()).to.be.instanceOf(A);
204
- child.remove();
205
- ctx2.append(child);
206
- child = el.querySelector('ctx-child');
207
- expect(child.a()).to.be.instanceOf(AltA);
208
- });
28
+ };
29
+ return MyService = _classThis;
30
+ })();
31
+ const el = new MyService();
32
+ assert.instanceOf(el.foo(), Bar);
33
+ });
34
+ it('should define an injector for a service instance', () => {
35
+ let MyService = (() => {
36
+ let _classDecorators = [injectable()];
37
+ let _classDescriptor;
38
+ let _classExtraInitializers = [];
39
+ let _classThis;
40
+ var MyService = class {
41
+ static { _classThis = this; }
42
+ static {
43
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
44
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
45
+ MyService = _classThis = _classDescriptor.value;
46
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
47
+ __runInitializers(_classThis, _classExtraInitializers);
48
+ }
49
+ };
50
+ return MyService = _classThis;
51
+ })();
52
+ const instance = new MyService();
53
+ assert.ok(injectables.has(instance));
209
54
  });
210
55
  //# sourceMappingURL=injectable.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"injectable.test.js","sourceRoot":"","sources":["../../src/lib/injectable.test.ts"],"names":[],"mappings":"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"}
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,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,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;aACxC,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,6KAAkB;;;gBAAZ,uDAAS;;;;;IAEf,MAAM,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;IAEjC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { InjectionToken, Provider } from './provider.js';
2
+ export declare const injectables: WeakMap<object, Injector>;
2
3
  export declare class Injector {
3
4
  #private;
4
5
  parent: Injector | undefined;
5
6
  providers: Provider<unknown>[];
6
7
  constructor(providers?: Provider<unknown>[], parent?: Injector);
7
8
  inject<T>(token: InjectionToken<T>): T;
8
- get<T>(token: InjectionToken<T>): T;
9
9
  setParent(parent: Injector | undefined): void;
10
10
  clear(): void;
11
11
  }
@@ -1,6 +1,6 @@
1
- import { INJECTABLE_MAP } from './injectable.js';
2
- import { LifeCycle } from './lifecycle.js';
1
+ import { readMetadata } from './metadata.js';
3
2
  import { StaticToken } from './provider.js';
3
+ export const injectables = new WeakMap();
4
4
  export class Injector {
5
5
  #instances = new WeakMap();
6
6
  parent;
@@ -10,12 +10,12 @@ export class Injector {
10
10
  this.providers = providers;
11
11
  }
12
12
  inject(token) {
13
- return this.get(token);
14
- }
15
- get(token) {
16
13
  if (this.#instances.has(token)) {
17
14
  const instance = this.#instances.get(token);
18
- callLifecycle(instance, LifeCycle.onInject);
15
+ const metadata = readMetadata(token);
16
+ if (metadata) {
17
+ callLifecycle(instance, metadata.onInjected);
18
+ }
19
19
  return instance;
20
20
  }
21
21
  const provider = this.#findProvider(token);
@@ -53,12 +53,15 @@ export class Injector {
53
53
  const instance = factory(this);
54
54
  this.#instances.set(token, instance);
55
55
  if (typeof instance === 'object' && instance !== null) {
56
- const injector = INJECTABLE_MAP.get(instance);
56
+ const injector = injectables.get(instance);
57
57
  if (injector) {
58
58
  injector.setParent(this);
59
59
  }
60
- callLifecycle(instance, LifeCycle.onInit);
61
- callLifecycle(instance, LifeCycle.onInject);
60
+ const metadata = readMetadata(token);
61
+ if (metadata) {
62
+ callLifecycle(instance, metadata.onCreated);
63
+ callLifecycle(instance, metadata.onInjected);
64
+ }
62
65
  }
63
66
  return instance;
64
67
  }
@@ -74,11 +77,12 @@ export class Injector {
74
77
  return undefined;
75
78
  }
76
79
  }
77
- function callLifecycle(instance, method) {
78
- if (typeof instance === 'object' && instance !== null) {
79
- const lifecycle = Reflect.get(instance, method);
80
- if (typeof lifecycle === 'function') {
81
- lifecycle.call(instance);
80
+ function callLifecycle(instance, methods) {
81
+ if (Array.isArray(methods)) {
82
+ for (let cb of methods) {
83
+ if (typeof cb === 'function') {
84
+ cb.call(instance);
85
+ }
82
86
  }
83
87
  }
84
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":"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"}