/
githubmirror
/
nest
Обзор
Документация
Войти
/
githubmirror
/
nest
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
packages/testing/testing-injector.ts
120 строк
3 KB
Kamil Myśliwiec
fix(core): fix deeply nested transient providers resolution
12 май 2026, 21:36
Не верифицирован
12 май 2026, 21:36
2e290c6
Код
Авторство
О чём код?
import { NestContainer } from '@nestjs/core'; import { STATIC_CONTEXT } from '@nestjs/core/injector/constants'; import { Injector, InjectorDependencyContext, } from '@nestjs/core/injector/injector'; import { ContextId, InstanceWrapper, } from '@nestjs/core/injector/instance-wrapper'; import { Module } from '@nestjs/core/injector/module'; import { MockFactory } from './interfaces'; interface ResolutionContext { contextId: ContextId; inquirer?: InstanceWrapper; effectiveInquirerId?: string; } /** * @publicApi */ export class TestingInjector extends Injector { protected mocker?: MockFactory; protected container: NestContainer; public setMocker(mocker: MockFactory) { this.mocker = mocker; } public setContainer(container: NestContainer) { this.container = container; } public async resolveComponentWrapper<T>( moduleRef: Module, name: any, dependencyContext: InjectorDependencyContext, wrapper: InstanceWrapper<T>, resolutionContext: ResolutionContext = { contextId: STATIC_CONTEXT }, keyOrIndex?: string | number, ): Promise<InstanceWrapper> { try { const existingProviderWrapper = await super.resolveComponentWrapper( moduleRef, name, dependencyContext, wrapper, resolutionContext, keyOrIndex, ); return existingProviderWrapper; } catch (err) { return this.mockWrapper(err, moduleRef, name, wrapper); } } public async resolveComponentHost<T>( moduleRef: Module, instanceWrapper: InstanceWrapper<T>, resolutionContext: ResolutionContext = { contextId: STATIC_CONTEXT }, ): Promise<InstanceWrapper> { try { const existingProviderWrapper = await super.resolveComponentHost( moduleRef, instanceWrapper, resolutionContext, ); return existingProviderWrapper; } catch (err) { return this.mockWrapper( err, moduleRef, instanceWrapper.name, instanceWrapper, ); } } private async mockWrapper<T>( err: Error, moduleRef: Module, name: any, wrapper: InstanceWrapper<T>, ): Promise<InstanceWrapper> { if (!this.mocker) { throw err; } const mockedInstance = this.mocker(name); if (!mockedInstance) { throw err; } const newWrapper = new InstanceWrapper({ name, isAlias: false, scope: wrapper.scope, instance: mockedInstance, isResolved: true, host: moduleRef, metatype: wrapper.metatype, }); const internalCoreModule = this.container.getInternalCoreModuleRef(); if (!internalCoreModule) { throw new Error( 'Expected to have internal core module reference at this point.', ); } internalCoreModule.addCustomProvider( { provide: name, useValue: mockedInstance, }, internalCoreModule.providers, ); internalCoreModule.addExportedProviderOrModule(name); return newWrapper; } }