diff --git a/packages/di/jest.config.js b/packages/di/jest.config.js index 9f4237c4d92..256b156e67f 100644 --- a/packages/di/jest.config.js +++ b/packages/di/jest.config.js @@ -6,7 +6,7 @@ module.exports = { coverageThreshold: { global: { statements: 98.81, - branches: 96.71, + branches: 96.54, lines: 98.81, functions: 98.32 } diff --git a/packages/di/src/common/decorators/inject.spec.ts b/packages/di/src/common/decorators/inject.spec.ts index 396b4634927..9e7039d1717 100644 --- a/packages/di/src/common/decorators/inject.spec.ts +++ b/packages/di/src/common/decorators/inject.spec.ts @@ -67,7 +67,7 @@ describe("@Inject()", () => { class MyService1 implements InterfaceGroup { readonly type: string = "service1"; - constructor(@Inject(InjectorService) readonly injector: InjectorService) {} + constructor(@Inject(InjectorService) readonly injector: any) {} } @Injectable({ @@ -76,7 +76,7 @@ describe("@Inject()", () => { class MyService2 implements InterfaceGroup { readonly type: string = "service2"; - constructor(@Inject(InjectorService) readonly injector: InjectorService) {} + constructor(@Inject(InjectorService) readonly injector: any) {} } const TokenAsync = Symbol.for("MyService2"); diff --git a/packages/di/src/common/decorators/inject.ts b/packages/di/src/common/decorators/inject.ts index 6e6e8b3ee19..6b625ffb46d 100644 --- a/packages/di/src/common/decorators/inject.ts +++ b/packages/di/src/common/decorators/inject.ts @@ -3,6 +3,7 @@ import {DI_PARAM_OPTIONS, INJECTABLE_PROP} from "../constants/constants"; import {InvalidPropertyTokenError} from "../errors/InvalidPropertyTokenError"; import type {InjectablePropertyOptions} from "../interfaces/InjectableProperties"; import {TokenProvider} from "../interfaces/TokenProvider"; +import {getConstructorDependencies, setConstructorDependencies} from "../utils/getConstructorDependencies"; export function injectProperty(target: any, propertyKey: string, options: Partial) { Store.from(target).merge(INJECTABLE_PROP, { @@ -39,18 +40,17 @@ export function Inject(token?: TokenProvider | (() => TokenProvider), onGet = (b switch (bindingType) { case DecoratorTypes.PARAM_CTOR: if (token) { - const paramTypes = Metadata.getParamTypes(target, propertyKey); + const paramTypes = getConstructorDependencies(target); const type = paramTypes[descriptor as number]; paramTypes[descriptor as number] = type === Array ? [token] : token; - Metadata.setParamTypes(target, propertyKey!, paramTypes); + setConstructorDependencies(target, paramTypes); } break; case DecoratorTypes.PROP: const useType = token || Metadata.getType(target, propertyKey); - const originalType = Metadata.getType(target, propertyKey); if (useType === Object) { throw new InvalidPropertyTokenError(target, String(propertyKey)); diff --git a/packages/di/src/common/domain/Provider.ts b/packages/di/src/common/domain/Provider.ts index 2299d998a75..d894ad8f7a2 100644 --- a/packages/di/src/common/domain/Provider.ts +++ b/packages/di/src/common/domain/Provider.ts @@ -1,4 +1,4 @@ -import {classOf, getClassOrSymbol, isClass, methodsOf, nameOf, Store, Type} from "@tsed/core"; +import {classOf, getClassOrSymbol, isClass, Metadata, methodsOf, nameOf, Store, Type} from "@tsed/core"; import {ProviderOpts} from "../interfaces/ProviderOpts"; import {TokenProvider} from "../interfaces/TokenProvider"; import {ProviderScope} from "./ProviderScope"; diff --git a/packages/di/src/common/index.ts b/packages/di/src/common/index.ts index d692b68f060..08a31e4d7d7 100644 --- a/packages/di/src/common/index.ts +++ b/packages/di/src/common/index.ts @@ -51,4 +51,5 @@ export * from "./services/InjectorService"; export * from "./utils/colors"; export * from "./utils/createContainer"; export * from "./utils/getConfiguration"; +export * from "./utils/getConstructorDependencies"; export * from "./utils/resolveControllers"; diff --git a/packages/di/src/common/services/InjectorService.ts b/packages/di/src/common/services/InjectorService.ts index 09a577d9e1a..7112fe4f00b 100644 --- a/packages/di/src/common/services/InjectorService.ts +++ b/packages/di/src/common/services/InjectorService.ts @@ -33,6 +33,7 @@ import {ResolvedInvokeOptions} from "../interfaces/ResolvedInvokeOptions"; import {TokenProvider} from "../interfaces/TokenProvider"; import {GlobalProviders} from "../registries/GlobalProviders"; import {createContainer} from "../utils/createContainer"; +import {getConstructorDependencies} from "../utils/getConstructorDependencies"; import {resolveControllers} from "../utils/resolveControllers"; import {DIConfiguration} from "./DIConfiguration"; @@ -701,7 +702,7 @@ export class InjectorService extends Container { }; } else { // useClass - deps = deps || Metadata.getParamTypes(provider.useClass); + deps = deps || getConstructorDependencies(provider.useClass); construct = (deps: TokenProvider[]) => new provider.useClass(...deps); } diff --git a/packages/di/src/common/utils/getConstructorDependencies.ts b/packages/di/src/common/utils/getConstructorDependencies.ts new file mode 100644 index 00000000000..3b905800dec --- /dev/null +++ b/packages/di/src/common/utils/getConstructorDependencies.ts @@ -0,0 +1,9 @@ +import {Metadata} from "@tsed/core"; + +export function getConstructorDependencies(target: any) { + return [...(Metadata.get("override:ctor:design:paramtypes", target, undefined) || Metadata.getParamTypes(target) || [])]; +} + +export function setConstructorDependencies(target: any, deps: any[]) { + Metadata.set("override:ctor:design:paramtypes", deps, target); +}