UNPKG

@joist/di

Version:

Dependency Injection for Vanilla JS classes

160 lines • 7.22 kB
import { __esDecorate, __runInitializers } from "tslib"; import { assert } from "chai"; import { inject, injectAll } from "./inject.js"; import { injectable } from "./injectable.js"; import { Injector } from "./injector.js"; import { StaticToken } from "./provider.js"; it("should throw error if called in constructor", () => { assert.throws(() => { class FooService { value = "1"; } let BarService = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var BarService = class { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); BarService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } foo = inject(FooService); constructor() { this.foo(); } }; return BarService = _classThis; })(); const parent = new Injector(); parent.inject(BarService); }, "BarService is either not injectable or a service is being called in the constructor."); }); it("should throw error if static token is unavailable", () => { assert.throws(() => { const TOKEN = new StaticToken("test"); const parent = new Injector(); parent.inject(TOKEN); }, 'Provider not found for "test"'); }); it("should use the calling injector as parent", () => { class FooService { value = "1"; } let BarService = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var BarService = class { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); BarService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } foo = inject(FooService); }; return BarService = _classThis; })(); const parent = new Injector({ providers: [ [ FooService, { use: class extends FooService { value = "100"; }, }, ], ], }); assert.strictEqual(parent.inject(BarService).foo().value, "100"); }); it("should inject a static token", () => { const TOKEN = new StaticToken("test", () => "Hello World"); let HelloWorld = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var HelloWorld = class { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); HelloWorld = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } hello = inject(TOKEN); }; return HelloWorld = _classThis; })(); assert.strictEqual(new HelloWorld().hello(), "Hello World"); }); it("should use the calling injector as parent", () => { class FooService { value = "1"; } let BarService = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var BarService = class { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); BarService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } foo = inject(FooService); }; return BarService = _classThis; })(); const parent = new Injector({ providers: [ [ FooService, { use: class extends FooService { value = "100"; }, }, ], ], }); assert.strictEqual(parent.inject(BarService).foo().value, "100"); }); it("should all you to inject all", () => { const TOKEN = new StaticToken("test", () => "Hello World"); let HelloWorld = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var HelloWorld = class { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); HelloWorld = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } hello = injectAll(TOKEN); }; return HelloWorld = _classThis; })(); assert.deepEqual(new HelloWorld().hello(), ["Hello World"]); }); //# sourceMappingURL=inject.test.js.map