Skip to content

Commit 43b0637

Browse files
committed
feature(core) provide injection of inquirer in transient injectables
1 parent 845c5df commit 43b0637

6 files changed

Lines changed: 47 additions & 4 deletions

File tree

packages/core/injector/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './container';
22
export * from './module-ref';
33
export * from './modules-container';
4+
export * from './inquirer';

packages/core/injector/injector.ts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
PropertyMetadata,
2626
} from './instance-wrapper';
2727
import { Module } from './module';
28+
import { INQUIRER } from './inquirer';
2829

2930
/**
3031
* The type of an injectable dependency
@@ -217,6 +218,7 @@ export class Injector {
217218
callback,
218219
contextId,
219220
wrapper,
221+
inquirer,
220222
);
221223
}
222224

@@ -227,11 +229,17 @@ export class Injector {
227229
callback: (args: any[]) => void,
228230
contextId = STATIC_CONTEXT,
229231
inquirer?: InstanceWrapper,
232+
parentInquirer?: InstanceWrapper,
230233
) {
231234
const inquirerId = this.getInquirerId(inquirer);
232235
const metadata = wrapper.getCtorMetadata();
233236
if (metadata && contextId !== STATIC_CONTEXT) {
234-
const deps = await this.loadCtorMetadata(metadata, contextId, inquirer);
237+
const deps = await this.loadCtorMetadata(
238+
metadata,
239+
contextId,
240+
inquirer,
241+
parentInquirer,
242+
);
235243
return callback(deps);
236244
}
237245
const dependencies = isNil(inject)
@@ -244,6 +252,10 @@ export class Injector {
244252
let isResolved = true;
245253
const resolveParam = async (param, index) => {
246254
try {
255+
if (param === INQUIRER && parentInquirer) {
256+
return parentInquirer.instance;
257+
}
258+
247259
const paramWrapper = await this.resolveSingleParam<T>(
248260
wrapper,
249261
param,
@@ -638,10 +650,16 @@ export class Injector {
638650
metadata: InstanceWrapper<any>[],
639651
contextId: ContextId,
640652
inquirer?: InstanceWrapper,
653+
parentInquirer?: InstanceWrapper,
641654
): Promise<any[]> {
642655
const hosts = await Promise.all(
643656
metadata.map(async item =>
644-
this.resolveComponentHost(item.host, item, contextId, inquirer),
657+
this.resolveScopedComponentHost(
658+
item,
659+
contextId,
660+
inquirer,
661+
parentInquirer,
662+
),
645663
),
646664
);
647665
const inquirerId = this.getInquirerId(inquirer);
@@ -677,4 +695,16 @@ export class Injector {
677695
private getInquirerId(inquirer: InstanceWrapper | undefined): string {
678696
return inquirer && inquirer.id;
679697
}
698+
699+
private resolveScopedComponentHost(
700+
item: InstanceWrapper,
701+
contextId: ContextId,
702+
inquirer?: InstanceWrapper,
703+
parentInquirer?: InstanceWrapper,
704+
) {
705+
if (item.isTransient && item.name === INQUIRER && parentInquirer) {
706+
return parentInquirer;
707+
}
708+
return this.resolveComponentHost(item.host, item, contextId, inquirer);
709+
}
680710
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './inquirer-constants';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const INQUIRER = Symbol('INQUIRER');
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Provider, Scope } from '@nestjs/common';
2+
import { INQUIRER } from './inquirer-constants';
3+
4+
const noop = () => {};
5+
export const inquirerProvider: Provider = {
6+
provide: INQUIRER,
7+
scope: Scope.TRANSIENT,
8+
useFactory: noop,
9+
};

packages/core/injector/internal-core-module.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import { DynamicModule, Global, Module } from '@nestjs/common';
22
import { ValueProvider } from '@nestjs/common/interfaces';
33
import { requestProvider } from './../router/request/request-providers';
44
import { Reflector } from './../services';
5+
import { inquirerProvider } from './inquirer/inquirer-providers';
56

67
@Global()
78
@Module({
8-
providers: [Reflector, requestProvider],
9-
exports: [Reflector, requestProvider],
9+
providers: [Reflector, requestProvider, inquirerProvider],
10+
exports: [Reflector, requestProvider, inquirerProvider],
1011
})
1112
export class InternalCoreModule {
1213
static register(providers: ValueProvider[]): DynamicModule {

0 commit comments

Comments
 (0)