UNPKG

@joist/di

Version:

Dependency Injection for Vanilla JS classes

130 lines • 6.26 kB
import { __esDecorate, __runInitializers } from "tslib"; import { assert } from "chai"; import { inject } from "./inject.js"; import { injectable } from "./injectable.js"; import { Injector } from "./injector.js"; import { readInjector } from "./metadata.js"; import { StaticToken } from "./provider.js"; it("should locally override a provider", () => { class Foo { } class Bar extends Foo { } let MyService = (() => { let _classDecorators = [injectable({ providers: [[Foo, { use: Bar }]], })]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var MyService = 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); MyService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } foo = inject(Foo); }; return MyService = _classThis; })(); const el = new MyService(); assert.instanceOf(el.foo(), Bar); }); it("should define an injector for a service instance", () => { let MyService = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var MyService = 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); MyService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } arg; constructor(arg = "a") { this.arg = arg; } }; return MyService = _classThis; })(); const instance = new MyService("b"); assert.ok(readInjector(instance)); assert.ok(instance.arg === "b"); }); it("should inject the current service injectable instance", () => { let MyService = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var MyService = 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); MyService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } injector = inject(Injector); }; return MyService = _classThis; })(); const app = new Injector(); const service = app.inject(MyService); assert.equal(service.injector(), readInjector(service)); }); it("should not override the name of the original class", () => { let MyService = (() => { let _classDecorators = [injectable()]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var MyService = 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); MyService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } }; return MyService = _classThis; })(); assert.equal(MyService.name, "MyService"); }); it("should provide itself for spefified tokens", () => { const TOKEN = new StaticToken("MY_TOKEN"); let MyService = (() => { let _classDecorators = [injectable({ provideSelfAs: [TOKEN], })]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; var MyService = 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); MyService = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } value = inject(TOKEN); }; return MyService = _classThis; })(); const service = new MyService(); assert.equal(service.value(), service); }); //# sourceMappingURL=injectable.test.js.map