From 855a1851ae67c37df442df66c99abd50c6526aac Mon Sep 17 00:00:00 2001 From: "Marcus S. Abildskov" <8391194+marcus-sa@users.noreply.github.com> Date: Sun, 1 Oct 2023 18:59:23 +0200 Subject: [PATCH] feat(app): allow normalized providers to be exported in modules (#425) Currently, it's only possible to export interface providers using `this.addExport(provider)` in modules, where `provider` refers to an interface provider. This aims to try to solve that by allowing `NormalizedProvider`s to be exported. --- packages/app/src/module.ts | 4 ++-- packages/app/tests/module.spec.ts | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/app/src/module.ts b/packages/app/src/module.ts index 257aaeb74..bbae0480a 100644 --- a/packages/app/src/module.ts +++ b/packages/app/src/module.ts @@ -8,7 +8,7 @@ * You should have received a copy of the MIT License along with this program. */ -import { InjectorModule, ProviderWithScope, Token } from '@deepkit/injector'; +import { InjectorModule, ProviderWithScope, Token, NormalizedProvider } from '@deepkit/injector'; import { AbstractClassType, ClassType, CustomError, ExtractClassType, isClass } from '@deepkit/core'; import { EventListener, EventToken } from '@deepkit/event'; import { WorkflowDefinition } from '@deepkit/workflow'; @@ -23,7 +23,7 @@ export interface MiddlewareConfig { export type MiddlewareFactory = () => MiddlewareConfig; -export type ExportType = AbstractClassType | string | AppModule | Type; +export type ExportType = AbstractClassType | string | AppModule | Type | NormalizedProvider; /** * @reflection never diff --git a/packages/app/tests/module.spec.ts b/packages/app/tests/module.spec.ts index d37c65660..f801eed39 100644 --- a/packages/app/tests/module.spec.ts +++ b/packages/app/tests/module.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@jest/globals'; import { Minimum, MinLength } from '@deepkit/type'; -import { injectorReference } from '@deepkit/injector'; +import { injectorReference, provide } from '@deepkit/injector'; import { ServiceContainer } from '../src/service-container.js'; import { ClassType } from '@deepkit/core'; import { AppModule, createModule } from '../src/module.js'; @@ -248,6 +248,22 @@ test('same module loaded twice', () => { } }); +test('interface provider can be exported', () => { + interface Test {} + + const TEST = {}; + + const Test = provide({ useValue: TEST }); + + const test = new AppModule({ providers: [Test], exports: [Test] }); + + const app = new AppModule({ imports: [test] }); + + const serviceContainer = new ServiceContainer(app); + + serviceContainer.getInjector(app).get().toBe(TEST); +}); + test('non-exported providers can not be overwritten', () => { class SubClass { }