@joist/di 3.9.1-next.0 → 3.9.1

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
@@ -272,43 +272,9 @@ This behavior allows for services to be "scoped" within a certain branch of the
272
272
 
273
273
  ## Custom Elements:
274
274
 
275
- Joist is built to work with custom elements. Since the document is a tree we can search up that tree for providers.
276
-
277
- Setting your web page to work is very similar to any other JavaScript environment. There is a special `DOMInjector` class that will allow you to attach an injector to any location in the dom, in most cases this will be document.body.
275
+ Joist is built to work with custom elements. Since the document is a tree we can search up that tree for providers. This is where Hierarchical Injectors can really shine as they allow you to defined React/Preact esq "context" elements.
278
276
 
279
277
  ```TS
280
- const app = new DOMInjector();
281
-
282
- app.attach(document.body); // anything rendered in the body will have access to this injector.
283
-
284
- class Colors {
285
- primary = 'red';
286
- secodnary = 'green';
287
- }
288
-
289
- @injectable
290
- class MyElement extends HTMLElement {
291
- #colors = inject(Colors);
292
-
293
- connectedCallback() {
294
- const { primary } = this.#colors();
295
-
296
- this.style.background = primary;
297
- }
298
- }
299
-
300
- customElements.define('my-element', MyElement);
301
- ```
302
-
303
- ### Context Elements:
304
-
305
- 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.
306
-
307
- ```TS
308
- const app = new DOMInjector();
309
-
310
- app.attach(document.body);
311
-
312
278
  class Colors {
313
279
  primary = 'red';
314
280
  secodnary = 'green';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joist/di",
3
- "version": "3.9.1-next.0",
3
+ "version": "3.9.1",
4
4
  "type": "module",
5
5
  "main": "./target/lib.js",
6
6
  "module": "./target/lib.js",
@@ -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().inject(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
+ }
package/src/lib/inject.ts CHANGED
@@ -1,11 +1,9 @@
1
+ import { INJECTABLE_MAP } from './injector.js';
1
2
  import { InjectionToken } from './provider.js';
2
- import { INJECTABLE_MAP } from './injectable.js';
3
3
 
4
4
  export type Injected<T> = () => T;
5
5
 
6
- export function inject<This extends object, T>(
7
- token: InjectionToken<T>
8
- ): Injected<T> {
6
+ export function inject<This extends object, T>(token: InjectionToken<T>): Injected<T> {
9
7
  return function (this: This) {
10
8
  const injector = INJECTABLE_MAP.get(this);
11
9
 
@@ -1,3 +1,13 @@
1
1
  import { Injector } from './injector.js';
2
2
 
3
- export class InjectableMap extends WeakMap<object, Injector> {}
3
+ export class InjectableMap {
4
+ #injectables = new WeakMap<object, Injector>();
5
+
6
+ get(key: object) {
7
+ return this.#injectables.get(key);
8
+ }
9
+
10
+ set(key: object, injector: Injector) {
11
+ return this.#injectables.set(key, injector);
12
+ }
13
+ }
@@ -1,8 +1,6 @@
1
1
  import { ConstructableToken } from './provider.js';
2
- import { Injector } from './injector.js';
3
- import { InjectableMap } from './injectable-map.js';
4
-
5
- export const INJECTABLE_MAP = new InjectableMap();
2
+ import { INJECTABLE_MAP, Injector } from './injector.js';
3
+ import { environment } from './environment.js';
6
4
 
7
5
  export function injectable<T extends ConstructableToken<any>>(Base: T, _?: unknown) {
8
6
  return class InjectableNode extends Base {
@@ -21,6 +19,8 @@ export function injectable<T extends ConstructableToken<any>>(Base: T, _?: unkno
21
19
 
22
20
  if (parentInjector !== null) {
23
21
  injector.setParent(parentInjector);
22
+ } else {
23
+ injector.setParent(environment());
24
24
  }
25
25
  });
26
26
  }
@@ -1,7 +1,9 @@
1
- import { INJECTABLE_MAP } from './injectable.js';
1
+ import { InjectableMap } from './injectable-map.js';
2
2
  import { LifeCycle } from './lifecycle.js';
3
3
  import { InjectionToken, Provider, StaticToken } from './provider.js';
4
4
 
5
+ export const INJECTABLE_MAP = new InjectableMap();
6
+
5
7
  /**
6
8
  * Injectors create and store instances of services.
7
9
  * A service is any constructable class.
package/src/lib.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { Injector } from './lib/injector.js';
1
+ export { Injector, INJECTABLE_MAP } from './lib/injector.js';
2
2
  export { Provider, ConstructableToken, StaticToken } 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';
5
6
  export { LifeCycle } from './lib/lifecycle.js';
6
- export { DOMInjector } from './lib/dom-injector.js';
@@ -0,0 +1,5 @@
1
+ import { Injector } from './injector.js';
2
+ import { Provider } from './provider.js';
3
+ export declare function environment(): Injector;
4
+ export declare function defineEnvironment(providers: Provider<any>[]): void;
5
+ export declare function clearEnvironment(): void;
@@ -0,0 +1,16 @@
1
+ import { Injector } from './injector.js';
2
+ let rootInjector;
3
+ export function environment() {
4
+ if (!rootInjector) {
5
+ rootInjector = new Injector();
6
+ }
7
+ return rootInjector;
8
+ }
9
+ export function defineEnvironment(providers) {
10
+ environment().providers = providers;
11
+ }
12
+ export function clearEnvironment() {
13
+ rootInjector.providers = [];
14
+ rootInjector.clear();
15
+ }
16
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,54 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { expect, fixture, html } from '@open-wc/testing';
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
+ describe('environment', () => {
8
+ afterEach(clearEnvironment);
9
+ it('should create a global Injector instance', () => {
10
+ expect(environment()).to.be.instanceOf(Injector);
11
+ });
12
+ it('should use the root injector when creating services', async () => {
13
+ let MyService = (() => {
14
+ let _classDecorators = [injectable];
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
+ }
27
+ };
28
+ return MyService = _classThis;
29
+ })();
30
+ let MyElement = (() => {
31
+ let _classDecorators = [injectable];
32
+ let _classDescriptor;
33
+ let _classExtraInitializers = [];
34
+ let _classThis;
35
+ let _classSuper = HTMLElement;
36
+ var MyElement = class extends _classSuper {
37
+ static { _classThis = this; }
38
+ static {
39
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
40
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
41
+ MyElement = _classThis = _classDescriptor.value;
42
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
43
+ __runInitializers(_classThis, _classExtraInitializers);
44
+ }
45
+ my = inject(MyService);
46
+ };
47
+ return MyElement = _classThis;
48
+ })();
49
+ customElements.define('env-1', MyElement);
50
+ const el = await fixture(html `<env-1></env-1>`);
51
+ expect(el.my()).to.equal(environment().inject(MyService));
52
+ });
53
+ });
54
+ //# sourceMappingURL=environment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.test.js","sourceRoot":"","sources":["../../src/lib/environment.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE5B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YAE7D,SAAS;oCADd,UAAU;;;;;;;;oBACX,6KAAkB;;;oBAAZ,uDAAS;;;;;YAGT,SAAS;oCADd,UAAU;;;;8BACa,WAAW;iCAAnB,SAAQ,WAAW;;;;oBAAnC,6KAEC;;;oBAFK,uDAAS;;gBACb,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;;;;QAGzB,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE1C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAY,IAAI,CAAA,iBAAiB,CAAC,CAAC;QAE3D,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { INJECTABLE_MAP } from './injectable.js';
1
+ import { INJECTABLE_MAP } from './injector.js';
2
2
  export function inject(token) {
3
3
  return function () {
4
4
  const injector = INJECTABLE_MAP.get(this);
@@ -1 +1 @@
1
- {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/lib/inject.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,UAAU,MAAM,CACpB,KAAwB;IAExB,OAAO;QACL,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE1C,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,yKAAyK,CACjL,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/lib/inject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAK/C,MAAM,UAAU,MAAM,CAAyB,KAAwB;IACrE,OAAO;QACL,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE1C,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,yKAAyK,CACjL,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC"}
@@ -1,3 +1,6 @@
1
1
  import { Injector } from './injector.js';
2
- export declare class InjectableMap extends WeakMap<object, Injector> {
2
+ export declare class InjectableMap {
3
+ #private;
4
+ get(key: object): Injector | undefined;
5
+ set(key: object, injector: Injector): WeakMap<object, Injector>;
3
6
  }
@@ -1,3 +1,10 @@
1
- export class InjectableMap extends WeakMap {
1
+ export class InjectableMap {
2
+ #injectables = new WeakMap();
3
+ get(key) {
4
+ return this.#injectables.get(key);
5
+ }
6
+ set(key, injector) {
7
+ return this.#injectables.set(key, injector);
8
+ }
2
9
  }
3
10
  //# sourceMappingURL=injectable-map.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"injectable-map.js","sourceRoot":"","sources":["../../src/lib/injectable-map.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAc,SAAQ,OAAyB;CAAG"}
1
+ {"version":3,"file":"injectable-map.js","sourceRoot":"","sources":["../../src/lib/injectable-map.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACxB,YAAY,GAAG,IAAI,OAAO,EAAoB,CAAC;IAE/C,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,QAAkB;QACjC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,6 +1,4 @@
1
1
  import { ConstructableToken } from './provider.js';
2
- import { InjectableMap } from './injectable-map.js';
3
- export declare const INJECTABLE_MAP: InjectableMap;
4
2
  export declare function injectable<T extends ConstructableToken<any>>(Base: T, _?: unknown): {
5
3
  new (..._: any[]): {
6
4
  [x: string]: any;
@@ -1,6 +1,5 @@
1
- import { Injector } from './injector.js';
2
- import { InjectableMap } from './injectable-map.js';
3
- export const INJECTABLE_MAP = new InjectableMap();
1
+ import { INJECTABLE_MAP, Injector } from './injector.js';
2
+ import { environment } from './environment.js';
4
3
  export function injectable(Base, _) {
5
4
  return class InjectableNode extends Base {
6
5
  constructor(..._) {
@@ -13,6 +12,9 @@ export function injectable(Base, _) {
13
12
  if (parentInjector !== null) {
14
13
  injector.setParent(parentInjector);
15
14
  }
15
+ else {
16
+ injector.setParent(environment());
17
+ }
16
18
  });
17
19
  }
18
20
  }
@@ -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":"AACA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,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;yBAAM,CAAC;wBACN,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;oBACpC,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,4 +1,6 @@
1
+ import { InjectableMap } from './injectable-map.js';
1
2
  import { InjectionToken, Provider } from './provider.js';
3
+ export declare const INJECTABLE_MAP: InjectableMap;
2
4
  export declare class Injector {
3
5
  #private;
4
6
  parent: Injector | undefined;
@@ -1,6 +1,7 @@
1
- import { INJECTABLE_MAP } from './injectable.js';
1
+ import { InjectableMap } from './injectable-map.js';
2
2
  import { LifeCycle } from './lifecycle.js';
3
3
  import { StaticToken } from './provider.js';
4
+ export const INJECTABLE_MAP = new InjectableMap();
4
5
  export class Injector {
5
6
  #instances = new WeakMap();
6
7
  parent;
@@ -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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"}
package/target/lib.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { Injector } from './lib/injector.js';
1
+ export { Injector, INJECTABLE_MAP } from './lib/injector.js';
2
2
  export { Provider, ConstructableToken, StaticToken } 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';
5
6
  export { LifeCycle } from './lib/lifecycle.js';
6
- export { DOMInjector } from './lib/dom-injector.js';
package/target/lib.js CHANGED
@@ -1,7 +1,7 @@
1
- export { Injector } from './lib/injector.js';
1
+ export { Injector, INJECTABLE_MAP } from './lib/injector.js';
2
2
  export { StaticToken } from './lib/provider.js';
3
3
  export { injectable } from './lib/injectable.js';
4
4
  export { inject } from './lib/inject.js';
5
+ export { defineEnvironment, clearEnvironment } from './lib/environment.js';
5
6
  export { LifeCycle } from './lib/lifecycle.js';
6
- export { DOMInjector } from './lib/dom-injector.js';
7
7
  //# 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,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAgC,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAY,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAgC,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9E,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;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,30 +0,0 @@
1
- import { expect } from '@open-wc/testing';
2
-
3
- import { DOMInjector } from './dom-injector.js';
4
- import { INJECTABLE_MAP } from './injectable.js';
5
-
6
- describe('DOMInjector', () => {
7
- it('should attach an injector to a dom element', () => {
8
- const root = document.createElement('div');
9
- const app = new DOMInjector();
10
-
11
- app.attach(root);
12
-
13
- const injector = INJECTABLE_MAP.get(root);
14
-
15
- expect(injector).to.equal(app);
16
- });
17
-
18
- it('should remove an injector associated with a dom element', () => {
19
- const root = document.createElement('div');
20
- const app = new DOMInjector();
21
-
22
- app.attach(root);
23
-
24
- expect(INJECTABLE_MAP.get(root)).to.equal(app);
25
-
26
- app.detach(root);
27
-
28
- expect(INJECTABLE_MAP.get(root)).to.equal(undefined);
29
- });
30
- });
@@ -1,12 +0,0 @@
1
- import { INJECTABLE_MAP } from './injectable.js';
2
- import { Injector } from './injector.js';
3
-
4
- export class DOMInjector extends Injector {
5
- attach(root: HTMLElement) {
6
- INJECTABLE_MAP.set(root, this);
7
- }
8
-
9
- detach(root: HTMLElement) {
10
- INJECTABLE_MAP.delete(root);
11
- }
12
- }
@@ -1,5 +0,0 @@
1
- import { Injector } from './injector.js';
2
- export declare class DOMInjector extends Injector {
3
- attach(root: HTMLElement): void;
4
- detach(root: HTMLElement): void;
5
- }
@@ -1,11 +0,0 @@
1
- import { INJECTABLE_MAP } from './injectable.js';
2
- import { Injector } from './injector.js';
3
- export class DOMInjector extends Injector {
4
- attach(root) {
5
- INJECTABLE_MAP.set(root, this);
6
- }
7
- detach(root) {
8
- INJECTABLE_MAP.delete(root);
9
- }
10
- }
11
- //# sourceMappingURL=dom-injector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom-injector.js","sourceRoot":"","sources":["../../src/lib/dom-injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,MAAM,CAAC,IAAiB;QACtB,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,IAAiB;QACtB,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF"}
@@ -1,21 +0,0 @@
1
- import { expect } from '@open-wc/testing';
2
- import { DOMInjector } from './dom-injector.js';
3
- import { INJECTABLE_MAP } from './injectable.js';
4
- describe('DOMInjector', () => {
5
- it('should attach an injector to a dom element', () => {
6
- const root = document.createElement('div');
7
- const app = new DOMInjector();
8
- app.attach(root);
9
- const injector = INJECTABLE_MAP.get(root);
10
- expect(injector).to.equal(app);
11
- });
12
- it('should remove an injector associated with a dom element', () => {
13
- const root = document.createElement('div');
14
- const app = new DOMInjector();
15
- app.attach(root);
16
- expect(INJECTABLE_MAP.get(root)).to.equal(app);
17
- app.detach(root);
18
- expect(INJECTABLE_MAP.get(root)).to.equal(undefined);
19
- });
20
- });
21
- //# sourceMappingURL=dom-injector.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom-injector.test.js","sourceRoot":"","sources":["../../src/lib/dom-injector.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QAE9B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QAE9B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjB,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjB,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}