@joist/di 3.0.6 → 3.0.8-next.0

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
@@ -7,7 +7,7 @@ Allows you to inject services into other class instances (including custom eleme
7
7
  #### Installation:
8
8
 
9
9
  ```BASH
10
- npm i @joist/di@rc
10
+ npm i @joist/di
11
11
  ```
12
12
 
13
13
  #### Example:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joist/di",
3
- "version": "3.0.6",
3
+ "version": "3.0.8-next.0",
4
4
  "type": "module",
5
5
  "main": "./target/lib.js",
6
6
  "module": "./target/lib.js",
@@ -13,6 +13,7 @@
13
13
  }
14
14
  },
15
15
  "files": [
16
+ "src",
16
17
  "target"
17
18
  ],
18
19
  "sideEffects": false,
@@ -62,6 +63,5 @@
62
63
  "build"
63
64
  ]
64
65
  }
65
- },
66
- "gitHead": "e6e36105708633b45a0585b066a89f07a7ac78cb"
66
+ }
67
67
  }
@@ -0,0 +1,30 @@
1
+ import { expect, fixture, html } from '@open-wc/testing';
2
+
3
+ import { Injector } from './injector.js';
4
+ import { environment, clearEnvironment } from './environment.js';
5
+ import { injectable } from './injectable.js';
6
+ import { inject } from './inject.js';
7
+
8
+ describe('environment', () => {
9
+ afterEach(clearEnvironment);
10
+
11
+ it('should create a global Injector instance', () => {
12
+ expect(environment()).to.be.instanceOf(Injector);
13
+ });
14
+
15
+ it('should use the root injector when creating services', async () => {
16
+ @injectable
17
+ class MyService { }
18
+
19
+ @injectable
20
+ class MyElement extends HTMLElement {
21
+ my = inject(MyService);
22
+ }
23
+
24
+ customElements.define('env-1', MyElement);
25
+
26
+ const el = await fixture<MyElement>(html`<env-1></env-1>`);
27
+
28
+ expect(el.my()).to.equal(environment().get(MyService));
29
+ });
30
+ });
@@ -0,0 +1,21 @@
1
+ import { Injector } from './injector.js';
2
+ import { Provider } from './provider.js';
3
+
4
+ let rootInjector: Injector;
5
+
6
+ export function environment(): Injector {
7
+ if (!rootInjector) {
8
+ rootInjector = new Injector();
9
+ }
10
+
11
+ return rootInjector;
12
+ }
13
+
14
+ export function defineEnvironment(providers: Provider<any>[]) {
15
+ environment().providers = providers;
16
+ }
17
+
18
+ export function clearEnvironment(): void {
19
+ rootInjector.providers = [];
20
+ rootInjector.clear();
21
+ }
@@ -0,0 +1,71 @@
1
+ import { expect } from '@open-wc/testing';
2
+
3
+ import { inject } from './inject.js';
4
+ import { injectable } from './injectable.js';
5
+ import { Injector } from './injector.js';
6
+
7
+ describe('inject', () => {
8
+ it('should work', () => {
9
+ class HelloService { }
10
+
11
+ @injectable
12
+ class HelloWorld extends HTMLElement {
13
+ hello = inject(HelloService);
14
+ }
15
+
16
+ customElements.define('inject-1', HelloWorld);
17
+
18
+ expect(new HelloWorld().hello()).to.be.instanceOf(HelloService);
19
+ });
20
+
21
+ it('should throw error if called in constructor', () => {
22
+ class FooService {
23
+ value = '1';
24
+ }
25
+
26
+ @injectable
27
+ class BarService {
28
+ foo = inject(FooService);
29
+
30
+ constructor() {
31
+ this.foo();
32
+ }
33
+ }
34
+
35
+ const parent = new Injector();
36
+
37
+ try {
38
+ parent.get(BarService);
39
+
40
+ throw new Error('Should not succeed');
41
+ } catch (err) {
42
+ const error = err as Error;
43
+
44
+ expect(error.message).to.equal(
45
+ `BarService is either not injectable or a service is being called in the constructor. \n Either add the @injectable to your class or use the onInject callback method.`
46
+ );
47
+ }
48
+ });
49
+
50
+ it('should use the calling injector as parent', () => {
51
+ class FooService {
52
+ value = '1';
53
+ }
54
+
55
+ @injectable
56
+ class BarService {
57
+ foo = inject(FooService);
58
+ }
59
+
60
+ const parent = new Injector([
61
+ {
62
+ provide: FooService,
63
+ use: class extends FooService {
64
+ value = '100';
65
+ },
66
+ },
67
+ ]);
68
+
69
+ expect(parent.get(BarService).foo().value).to.equal('100');
70
+ });
71
+ });
@@ -0,0 +1,23 @@
1
+ import { ProviderToken } from './provider.js';
2
+ import { Injectable } from './injector.js';
3
+ import { INJECTABLES } from './injectable.js';
4
+
5
+ export type Injected<T> = () => T;
6
+
7
+ export function inject<This extends Injectable, T extends object>(
8
+ token: ProviderToken<T>
9
+ ): Injected<T> {
10
+ return function (this: This) {
11
+ const injector = INJECTABLES.get(this);
12
+
13
+ if (injector === undefined) {
14
+ const name = Object.getPrototypeOf(this.constructor).name;
15
+
16
+ throw new Error(
17
+ `${name} is either not injectable or a service is being called in the constructor. \n Either add the @injectable to your class or use the onInject callback method.`
18
+ );
19
+ }
20
+
21
+ return injector.get(token);
22
+ };
23
+ }
@@ -0,0 +1,144 @@
1
+ import { expect, fixture, html } from '@open-wc/testing';
2
+
3
+ import { injectable } from './injectable.js';
4
+ import { inject } from './inject.js';
5
+ import { Injector } from './injector.js';
6
+
7
+ describe('@injectable()', () => {
8
+ it('should allow a custom element to be injected with deps', () => {
9
+ class Foo {}
10
+ class Bar {}
11
+
12
+ @injectable
13
+ class MyElement extends HTMLElement {
14
+ foo = inject(Foo);
15
+ bar = inject(Bar);
16
+ }
17
+
18
+ customElements.define('injectable-1', MyElement);
19
+
20
+ const el = document.createElement('injectable-1') as MyElement;
21
+
22
+ expect(el.foo()).to.be.instanceOf(Foo);
23
+ });
24
+
25
+ it('should locally override a provider', () => {
26
+ class Foo {}
27
+
28
+ class Bar extends Foo {}
29
+
30
+ const MyElement = injectable(
31
+ class {
32
+ static providers = [{ provide: Foo, use: Bar }];
33
+
34
+ foo = inject(Foo);
35
+ }
36
+ );
37
+
38
+ const el = new MyElement();
39
+
40
+ expect(el.foo()).to.be.instanceOf(Bar);
41
+ });
42
+
43
+ it('should call the onInject lifecycle hook', () => {
44
+ class A {}
45
+
46
+ @injectable
47
+ class B {
48
+ a = inject(A);
49
+
50
+ onInject() {
51
+ expect(this.a()).to.be.instanceOf(A);
52
+ }
53
+ }
54
+
55
+ new Injector().get(B);
56
+ });
57
+
58
+ it('should handle parent HTML Injectors', async () => {
59
+ @injectable
60
+ class A {}
61
+
62
+ const B = injectable(
63
+ class {
64
+ a = inject(A);
65
+ }
66
+ );
67
+
68
+ class AltA implements A {}
69
+
70
+ @injectable
71
+ class Parent extends HTMLElement {
72
+ static providers = [
73
+ { provide: B, use: B },
74
+ { provide: A, use: AltA },
75
+ ];
76
+ }
77
+
78
+ @injectable
79
+ class Child extends HTMLElement {
80
+ b = inject(B);
81
+ }
82
+
83
+ customElements.define('injectable-parent-1', Parent);
84
+ customElements.define('injectable-child-1', Child);
85
+
86
+ const el = await fixture(html`
87
+ <injectable-parent-1>
88
+ <injectable-child-1></injectable-child-1>
89
+ </injectable-parent-1>
90
+ `);
91
+
92
+ const child = el.querySelector<Child>('injectable-child-1')!;
93
+
94
+ expect(child.b().a()).to.be.instanceOf(AltA);
95
+ });
96
+
97
+ it('should handle changing contexts', async () => {
98
+ class A {}
99
+ class AltA implements A {}
100
+
101
+ @injectable
102
+ class Ctx1 extends HTMLElement {
103
+ static providers = [{ provide: A, use: A }];
104
+ }
105
+
106
+ @injectable
107
+ class Ctx2 extends HTMLElement {
108
+ static providers = [{ provide: A, use: AltA }];
109
+ }
110
+
111
+ @injectable
112
+ class Child extends HTMLElement {
113
+ a = inject(A);
114
+ }
115
+
116
+ customElements.define('ctx-1', Ctx1);
117
+ customElements.define('ctx-2', Ctx2);
118
+ customElements.define('ctx-child', Child);
119
+
120
+ const el = await fixture(html`
121
+ <div>
122
+ <ctx-1>
123
+ <ctx-child></ctx-child>
124
+ </ctx-1>
125
+
126
+ <ctx-2></ctx-2>
127
+ </div>
128
+ `);
129
+
130
+ const ctx2 = el.querySelector('ctx-2')!;
131
+
132
+ let child = el.querySelector<Child>('ctx-child')!;
133
+
134
+ expect(child.a()).to.be.instanceOf(A);
135
+
136
+ child.remove();
137
+
138
+ ctx2.append(child);
139
+
140
+ child = el.querySelector<Child>('ctx-child')!;
141
+
142
+ expect(child.a()).to.be.instanceOf(AltA);
143
+ });
144
+ });
@@ -0,0 +1,79 @@
1
+ import { ProviderToken } from './provider.js';
2
+ import { Injector } from './injector.js';
3
+ import { environment } from './environment.js';
4
+
5
+ export const INJECTABLES = new WeakMap<object, Injector>();
6
+
7
+ export function injectable<T extends ProviderToken<any>>(Base: T, _?: unknown) {
8
+ return class InjectableNode extends Base {
9
+ constructor(..._: any[]) {
10
+ super();
11
+
12
+ const injector = new Injector(Base.providers);
13
+
14
+ INJECTABLES.set(this, injector);
15
+
16
+ try {
17
+ if (this instanceof HTMLElement) {
18
+ this.addEventListener('finddiroot', (e) => {
19
+ const parentInjector = findInjectorRoot(e);
20
+
21
+ if (parentInjector !== null) {
22
+ injector.setParent(parentInjector);
23
+ } else {
24
+ injector.setParent(environment());
25
+ }
26
+ });
27
+ }
28
+ } catch {}
29
+ }
30
+
31
+ onInject() {
32
+ if (super.onInject) {
33
+ super.onInject();
34
+ }
35
+ }
36
+
37
+ connectedCallback() {
38
+ try {
39
+ if (this instanceof HTMLElement) {
40
+ this.dispatchEvent(new Event('finddiroot'));
41
+
42
+ if (super.connectedCallback) {
43
+ super.connectedCallback();
44
+ }
45
+ }
46
+ } catch {}
47
+ }
48
+
49
+ disconnectedCallback() {
50
+ const injector = INJECTABLES.get(this);
51
+
52
+ if (injector) {
53
+ injector.setParent(undefined);
54
+ }
55
+
56
+ if (super.disconnectedCallback) {
57
+ super.disconnectedCallback();
58
+ }
59
+ }
60
+ };
61
+ }
62
+
63
+ function findInjectorRoot(e: Event): Injector | null {
64
+ const path = e.composedPath();
65
+
66
+ // find firt parent
67
+ // skips the first item which is the target
68
+ for (let i = 1; i < path.length; i++) {
69
+ const part = path[i];
70
+
71
+ const injector = INJECTABLES.get(part);
72
+
73
+ if (injector) {
74
+ return injector;
75
+ }
76
+ }
77
+
78
+ return null;
79
+ }
@@ -0,0 +1,86 @@
1
+ import { expect } from '@open-wc/testing';
2
+
3
+ import { Injector } from './injector.js';
4
+ import { inject } from './inject.js';
5
+ import { injectable } from './injectable.js';
6
+
7
+ describe('Injector', () => {
8
+ it('should create a new instance of a single provider', () => {
9
+ class A { }
10
+
11
+ const app = new Injector();
12
+
13
+ expect(app.get(A)).to.be.instanceOf(A);
14
+ expect(app.get(A)).to.equal(app.get(A));
15
+ });
16
+
17
+ it('should inject providers in the correct order', () => {
18
+ class A { }
19
+ class B { }
20
+
21
+ @injectable
22
+ class MyService {
23
+ a = inject(A);
24
+ b = inject(B);
25
+ }
26
+
27
+ const app = new Injector();
28
+ const instance = app.get(MyService);
29
+
30
+ expect(instance.a()).to.be.instanceOf(A);
31
+ expect(instance.b()).to.be.instanceOf(B);
32
+ });
33
+
34
+ it('should create a new instance of a provider that has a full dep tree', () => {
35
+ class A { }
36
+
37
+ @injectable
38
+ class B {
39
+ a = inject(A);
40
+ }
41
+
42
+ @injectable
43
+ class C {
44
+ b = inject(B);
45
+ }
46
+
47
+ @injectable
48
+ class D {
49
+ c = inject(C);
50
+ }
51
+
52
+ @injectable
53
+ class E {
54
+ d = inject(D);
55
+ }
56
+
57
+ const app = new Injector();
58
+ const instance = app.get(E);
59
+
60
+ expect(instance.d().c().b().a()).to.be.instanceOf(A);
61
+ });
62
+
63
+ it('should override a provider if explicitly instructed', () => {
64
+ class A { }
65
+
66
+ @injectable
67
+ class B {
68
+ a = inject(A);
69
+ }
70
+
71
+ class AltA extends A { }
72
+ const app = new Injector([{ provide: A, use: AltA }]);
73
+
74
+ expect(app.get(B).a()).to.be.instanceOf(AltA);
75
+ });
76
+
77
+ it('should return an existing instance from a parent injector', () => {
78
+ class A { }
79
+
80
+ const parent = new Injector();
81
+
82
+ const app = new Injector([], parent);
83
+
84
+ expect(parent.get(A)).to.equal(app.get(A));
85
+ });
86
+ });
@@ -0,0 +1,107 @@
1
+ import { INJECTABLES } from './injectable.js';
2
+ import { ProviderToken, Provider } from './provider.js';
3
+
4
+ // defines available properties that will be on a class instance that can use the inject function
5
+ export type Injectable = object & {
6
+ onInject?(): void;
7
+ };
8
+
9
+ /**
10
+ * Injectors create and store instances of services.
11
+ * A service is any constructable class.
12
+ * When calling Injector.get, the injector will resolve as following.
13
+ *
14
+ * 1. Do I have a cached instance locally?
15
+ * 2. Do I have a local provider definition for the token?
16
+ * 3. Do I have a parent? Check parent for 1 and 2
17
+ * 5. All clear, go ahead and construct and cache the requested service
18
+ *
19
+ * RootInjector |--> InjectorA |--> InjectorB
20
+ * |--> InjectorC
21
+ * |--> InjectorD |--> InjectorE
22
+ *
23
+ * in the above tree, if InjectorE requests a service, it will navigate up to the RootInjector and cache.
24
+ * If Inject B then requests the same token, it will recieve the same cached instance from RootInjector.
25
+ */
26
+ export class Injector {
27
+ // ke track of isntances. One Token can have one instance
28
+ #instances = new WeakMap<ProviderToken<any>, any>();
29
+
30
+ #parent: Injector | undefined = undefined;
31
+
32
+ constructor(public providers: Provider<any>[] = [], parent?: Injector) {
33
+ this.setParent(parent);
34
+ }
35
+
36
+ // resolves and retuns and instance of the requested service
37
+ get<T extends Injectable>(token: ProviderToken<T>): T {
38
+ // check for a local instance
39
+ if (this.#instances.has(token)) {
40
+ return this.#instances.get(token)!;
41
+ }
42
+
43
+ const provider = this.#findProvider(token);
44
+
45
+ // check for a provider definition
46
+ if (provider) {
47
+ return this.#createAndCache<T>(provider.use);
48
+ }
49
+
50
+ // check for a parent and attempt to get there
51
+ if (this.#parent) {
52
+ return this.#parent.get(token);
53
+ }
54
+
55
+ return this.#createAndCache(token);
56
+ }
57
+
58
+ setParent(parent: Injector | undefined) {
59
+ this.#parent = parent;
60
+ }
61
+
62
+ clear() {
63
+ this.#instances = new WeakMap();
64
+ }
65
+
66
+ #createAndCache<T extends Injectable>(token: ProviderToken<T>): T {
67
+ const instance = new token();
68
+
69
+ this.#instances.set(token, instance);
70
+
71
+ const injector = INJECTABLES.get(instance);
72
+
73
+ if (injector) {
74
+ /**
75
+ * set the this injector instance as a parent.
76
+ * this means that each calling injector will be the parent of what it creates.
77
+ * this allows the created service to navigate up it's chain to find a root
78
+ */
79
+ injector.setParent(this);
80
+
81
+ /**
82
+ * the on inject lifecycle hook should be called after the parent is defined.
83
+ * this ensures that services are initialized when the chain is settled
84
+ * this is required since the parent is set after the instance is constructed
85
+ */
86
+ if (instance.onInject) {
87
+ instance.onInject();
88
+ }
89
+ }
90
+
91
+ return instance;
92
+ }
93
+
94
+ #findProvider(token: ProviderToken<any>): Provider<any> | undefined {
95
+ if (!this.providers) {
96
+ return undefined;
97
+ }
98
+
99
+ for (let i = 0; i < this.providers.length; i++) {
100
+ if (this.providers[i].provide === token) {
101
+ return this.providers[i];
102
+ }
103
+ }
104
+
105
+ return undefined;
106
+ }
107
+ }
@@ -0,0 +1,10 @@
1
+ export type ProviderToken<T> = {
2
+ providers?: Provider<any>[];
3
+
4
+ new(...args: any[]): T;
5
+ };
6
+
7
+ export interface Provider<T> {
8
+ provide: ProviderToken<T>;
9
+ use: ProviderToken<T>;
10
+ }
package/src/lib.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { Injector, Injectable } from './lib/injector.js';
2
+ export { Provider, ProviderToken } from './lib/provider.js';
3
+ export { injectable } from './lib/injectable.js';
4
+ export { inject, Injected } from './lib/inject.js';
5
+ export { defineEnvironment, clearEnvironment } from './lib/environment.js';
@@ -1,3 +1,5 @@
1
1
  import { Injector } from './injector.js';
2
+ import { Provider } from './provider.js';
2
3
  export declare function environment(): Injector;
4
+ export declare function defineEnvironment(providers: Provider<any>[]): void;
3
5
  export declare function clearEnvironment(): void;
@@ -1,8 +1,14 @@
1
1
  import { Injector } from './injector.js';
2
- const rootInjector = new Injector();
2
+ let rootInjector;
3
3
  export function environment() {
4
+ if (!rootInjector) {
5
+ rootInjector = new Injector();
6
+ }
4
7
  return rootInjector;
5
8
  }
9
+ export function defineEnvironment(providers) {
10
+ environment().providers = providers;
11
+ }
6
12
  export function clearEnvironment() {
7
13
  rootInjector.providers = [];
8
14
  rootInjector.clear();
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/lib/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,YAAY,GAAG,IAAI,QAAQ,EAAE,CAAC;AAEpC,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC;IAC5B,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/lib/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,IAAI,YAAsB,CAAC;AAE3B,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA0B;IAC1D,WAAW,EAAE,CAAC,SAAS,GAAG,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC;IAC5B,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
@@ -1,10 +1,12 @@
1
+ import { INJECTABLES } from './injectable.js';
1
2
  export function inject(token) {
2
3
  return function () {
3
- if (this.injector$$ === undefined) {
4
+ const injector = INJECTABLES.get(this);
5
+ if (injector === undefined) {
4
6
  const name = Object.getPrototypeOf(this.constructor).name;
5
7
  throw new Error(`${name} is either not injectable or a service is being called in the constructor. \n Either add the @injectable to your class or use the onInject callback method.`);
6
8
  }
7
- return this.injector$$.get(token);
9
+ return injector.get(token);
8
10
  };
9
11
  }
10
12
  //# sourceMappingURL=inject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/lib/inject.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,MAAM,CACpB,KAAuB;IAEvB,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;YAE1D,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,6JAA6J,CACrK,CAAC;SACH;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/lib/inject.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,MAAM,UAAU,MAAM,CACpB,KAAuB;IAEvB,OAAO;QACL,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;YAE1D,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,6JAA6J,CACrK,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"inject.test.js","sourceRoot":"","sources":["../../src/lib/inject.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACrB,MAAM,YAAY;SAAI;YAGhB,UAAU;oCADf,UAAU;;;;8BACc,WAAW;kCAAnB,SAAQ,WAAW;;;;oBAApC,6KAEC;;;oBAFK,uDAAU;;gBACd,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;;;;QAG/B,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE9C,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,UAAU;YACd,KAAK,GAAG,GAAG,CAAC;SACb;YAGK,UAAU;oCADf,UAAU;;;;;;;;oBACX,6KAMC;;;oBANK,uDAAU;;gBACd,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;gBAEzB;oBACE,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,CAAC;;;;QAGH,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE9B,IAAI;YACF,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAEvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACvC;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,KAAK,GAAG,GAAY,CAAC;YAE3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAC5B,uKAAuK,CACxK,CAAC;SACH;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,UAAU;YACd,KAAK,GAAG,GAAG,CAAC;SACb;YAGK,UAAU;oCADf,UAAU;;;;;;;;oBACX,6KAEC;;;oBAFK,uDAAU;;gBACd,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;;;;QAG3B,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;YAC1B;gBACE,OAAO,EAAE,UAAU;gBACnB,GAAG,EAAE,KAAM,SAAQ,UAAU;oBAC3B,KAAK,GAAG,KAAK,CAAC;iBACf;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"inject.test.js","sourceRoot":"","sources":["../../src/lib/inject.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACrB,MAAM,YAAY;SAAI;YAGhB,UAAU;oCADf,UAAU;;;;8BACc,WAAW;kCAAnB,SAAQ,WAAW;;;;oBAApC,6KAEC;;;oBAFK,uDAAU;;gBACd,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;;;;QAG/B,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE9C,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,UAAU;YACd,KAAK,GAAG,GAAG,CAAC;SACb;YAGK,UAAU;oCADf,UAAU;;;;;;;;oBACX,6KAMC;;;oBANK,uDAAU;;gBACd,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;gBAEzB;oBACE,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,CAAC;;;;QAGH,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAEvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAY,CAAC;YAE3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAC5B,uKAAuK,CACxK,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,UAAU;YACd,KAAK,GAAG,GAAG,CAAC;SACb;YAGK,UAAU;oCADf,UAAU;;;;;;;;oBACX,6KAEC;;;oBAFK,uDAAU;;gBACd,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;;;;QAG3B,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;YAC1B;gBACE,OAAO,EAAE,UAAU;gBACnB,GAAG,EAAE,KAAM,SAAQ,UAAU;oBAC3B,KAAK,GAAG,KAAK,CAAC;iBACf;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { ProviderToken } from './provider.js';
2
2
  import { Injector } from './injector.js';
3
+ export declare const INJECTABLES: WeakMap<object, Injector>;
3
4
  export declare function injectable<T extends ProviderToken<any>>(Base: T, _?: unknown): {
4
5
  new (..._: any[]): {
5
6
  [x: string]: any;
6
- injector$$: Injector;
7
7
  onInject(): void;
8
8
  connectedCallback(): void;
9
9
  disconnectedCallback(): void;
@@ -1,19 +1,21 @@
1
1
  import { Injector } from './injector.js';
2
2
  import { environment } from './environment.js';
3
+ export const INJECTABLES = new WeakMap();
3
4
  export function injectable(Base, _) {
4
5
  return class InjectableNode extends Base {
5
- injector$$ = new Injector(Base.providers);
6
6
  constructor(..._) {
7
7
  super();
8
+ const injector = new Injector(Base.providers);
9
+ INJECTABLES.set(this, injector);
8
10
  try {
9
11
  if (this instanceof HTMLElement) {
10
12
  this.addEventListener('finddiroot', (e) => {
11
13
  const parentInjector = findInjectorRoot(e);
12
14
  if (parentInjector !== null) {
13
- this.injector$$.setParent(parentInjector);
15
+ injector.setParent(parentInjector);
14
16
  }
15
17
  else {
16
- this.injector$$.setParent(environment());
18
+ injector.setParent(environment());
17
19
  }
18
20
  });
19
21
  }
@@ -37,7 +39,10 @@ export function injectable(Base, _) {
37
39
  catch { }
38
40
  }
39
41
  disconnectedCallback() {
40
- this.injector$$.setParent(undefined);
42
+ const injector = INJECTABLES.get(this);
43
+ if (injector) {
44
+ injector.setParent(undefined);
45
+ }
41
46
  if (super.disconnectedCallback) {
42
47
  super.disconnectedCallback();
43
48
  }
@@ -48,8 +53,9 @@ function findInjectorRoot(e) {
48
53
  const path = e.composedPath();
49
54
  for (let i = 1; i < path.length; i++) {
50
55
  const part = path[i];
51
- if ('injector$$' in part && part.injector$$ instanceof Injector) {
52
- return part.injector$$;
56
+ const injector = INJECTABLES.get(part);
57
+ if (injector) {
58
+ return injector;
53
59
  }
54
60
  }
55
61
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"injectable.js","sourceRoot":"","sources":["../../src/lib/injectable.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,UAAU,CAA+B,IAAO,EAAE,CAAW;IAC3E,OAAO,MAAM,cAAe,SAAQ,IAAI;QACtC,UAAU,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,YAAY,GAAG,CAAQ;YACrB,KAAK,EAAE,CAAC;YAER,IAAI;gBACF,IAAI,IAAI,YAAY,WAAW,EAAE;oBAC/B,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;wBACxC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;wBAE3C,IAAI,cAAc,KAAK,IAAI,EAAE;4BAC3B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;yBAC3C;6BAAM;4BACL,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;yBAC1C;oBACH,CAAC,CAAC,CAAC;iBACJ;aACF;YAAC,MAAM,GAAE;QACZ,CAAC;QAED,QAAQ;YACN,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,EAAE,CAAC;aAClB;QACH,CAAC;QAED,iBAAiB;YACf,IAAI;gBACF,IAAI,IAAI,YAAY,WAAW,EAAE;oBAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;oBAE5C,IAAI,KAAK,CAAC,iBAAiB,EAAE;wBAC3B,KAAK,CAAC,iBAAiB,EAAE,CAAC;qBAC3B;iBACF;aACF;YAAC,MAAM,GAAE;QACZ,CAAC;QAED,oBAAoB;YAClB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAErC,IAAI,KAAK,CAAC,oBAAoB,EAAE;gBAC9B,KAAK,CAAC,oBAAoB,EAAE,CAAC;aAC9B;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;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAErB,IAAI,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,YAAY,QAAQ,EAAE;YAC/D,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
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,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAoB,CAAC;AAE3D,MAAM,UAAU,UAAU,CAA+B,IAAO,EAAE,CAAW;IAC3E,OAAO,MAAM,cAAe,SAAQ,IAAI;QACtC,YAAY,GAAG,CAAQ;YACrB,KAAK,EAAE,CAAC;YAER,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE9C,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAEhC,IAAI,CAAC;gBACH,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;oBAChC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;wBACxC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;wBAE3C,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;4BAC5B,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;wBACrC,CAAC;6BAAM,CAAC;4BACN,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;wBACpC,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,QAAQ;YACN,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,iBAAiB;YACf,IAAI,CAAC;gBACH,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;oBAChC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;oBAE5C,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;wBAC5B,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,oBAAoB;YAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEvC,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,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { ProviderToken, Provider } from './provider.js';
2
2
  export type Injectable = object & {
3
- injector$$?: Injector;
4
3
  onInject?(): void;
5
4
  };
6
5
  export declare class Injector {
@@ -1,4 +1,4 @@
1
- var _a;
1
+ import { INJECTABLES } from './injectable.js';
2
2
  export class Injector {
3
3
  providers;
4
4
  #instances = new WeakMap();
@@ -29,8 +29,9 @@ export class Injector {
29
29
  #createAndCache(token) {
30
30
  const instance = new token();
31
31
  this.#instances.set(token, instance);
32
- if (instance.injector$$ instanceof _a) {
33
- instance.injector$$.setParent(this);
32
+ const injector = INJECTABLES.get(instance);
33
+ if (injector) {
34
+ injector.setParent(this);
34
35
  if (instance.onInject) {
35
36
  instance.onInject();
36
37
  }
@@ -49,5 +50,4 @@ export class Injector {
49
50
  return undefined;
50
51
  }
51
52
  }
52
- _a = Injector;
53
53
  //# sourceMappingURL=injector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":";AAyBA,MAAM,OAAO,QAAQ;IAMA;IAJnB,UAAU,GAAG,IAAI,OAAO,EAA2B,CAAC;IAEpD,OAAO,GAAyB,SAAS,CAAC;IAE1C,YAAmB,YAA6B,EAAE,EAAE,MAAiB;QAAlD,cAAS,GAAT,SAAS,CAAsB;QAChD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAGD,GAAG,CAAuB,KAAuB;QAE/C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;SACpC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAG3C,IAAI,QAAQ,EAAE;YACZ,OAAO,IAAI,CAAC,eAAe,CAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;SAC9C;QAGD,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAChC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,MAA4B;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,eAAe,CAAuB,KAAuB;QAC3D,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;QAE7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAErC,IAAI,QAAQ,CAAC,UAAU,YAAY,EAAQ,EAAE;YAM3C,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAOpC,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBACrB,QAAQ,CAAC,QAAQ,EAAE,CAAC;aACrB;SACF;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,aAAa,CAAC,KAAyB;QACrC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO,SAAS,CAAC;SAClB;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE;gBACvC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aAC1B;SACF;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAyB9C,MAAM,OAAO,QAAQ;IAMA;IAJnB,UAAU,GAAG,IAAI,OAAO,EAA2B,CAAC;IAEpD,OAAO,GAAyB,SAAS,CAAC;IAE1C,YAAmB,YAA6B,EAAE,EAAE,MAAiB;QAAlD,cAAS,GAAT,SAAS,CAAsB;QAChD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAGD,GAAG,CAAuB,KAAuB;QAE/C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QACrC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAG3C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,eAAe,CAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;QAGD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,MAA4B;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,eAAe,CAAuB,KAAuB;QAC3D,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;QAE7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,QAAQ,EAAE,CAAC;YAMb,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAOzB,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,aAAa,CAAC,KAAyB;QACrC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
package/target/lib.d.ts CHANGED
@@ -2,3 +2,4 @@ export { Injector, Injectable } from './lib/injector.js';
2
2
  export { Provider, ProviderToken } from './lib/provider.js';
3
3
  export { injectable } from './lib/injectable.js';
4
4
  export { inject, Injected } from './lib/inject.js';
5
+ export { defineEnvironment, clearEnvironment } from './lib/environment.js';
package/target/lib.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { Injector } from './lib/injector.js';
2
2
  export { injectable } from './lib/injectable.js';
3
3
  export { inject } from './lib/inject.js';
4
+ export { defineEnvironment, clearEnvironment } from './lib/environment.js';
4
5
  //# sourceMappingURL=lib.js.map
package/target/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAY,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAY,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}