Skip to content

Instantly share code, notes, and snippets.

@EndyKaufman
Last active June 16, 2024 12:25
Show Gist options
  • Save EndyKaufman/2aec900716e722f1b6c6e8007be01a36 to your computer and use it in GitHub Desktop.
Save EndyKaufman/2aec900716e722f1b6c6e8007be01a36 to your computer and use it in GitHub Desktop.
CustomInjectorModule for NestJS
import { Module } from '@nestjs/common';
import { CustomInjectorService } from './CustomInjectorService';
@Module({
providers: [CustomInjectorService],
exports: [CustomInjectorService],
})
export class CustomInjectorModule {}
import { Injectable, Logger, Scope } from '@nestjs/common';
import { ModulesContainer } from '@nestjs/core';
import { STATIC_CONTEXT } from '@nestjs/core/injector/constants';
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
import { Module } from '@nestjs/core/injector/module';
@Injectable()
export class CustomInjectorService {
constructor(private readonly modulesContainer: ModulesContainer) {
Logger.log('create', 'CustomInjectorService');
}
public getLastComponentByName<T>(token: string): T | undefined {
const values = this.getComponentsByName<T>(token);
if (values.length > 0) {
return values[values.length - 1];
}
return undefined;
}
public getLastComponentsByClass<T>(cls: any): T | undefined {
const objects = this.getComponentsByClass<T>(cls);
if (objects.length > 0) {
return objects[objects.length - 1];
}
return undefined;
}
public getComponentsByName<T>(token: string): T[] {
const modulesMap = [...this.modulesContainer.entries()];
return modulesMap
.map(([key, nestModule]: [string, Module]) => {
const components = [...nestModule.providers.values()];
return components
.filter((component) => component.scope !== Scope.REQUEST && component.name === token)
.map((component) => this.toDiscoveredClass<T>(nestModule, component));
})
.reduce((all, cur) => all.concat(cur), [])
.reverse()
.filter(Boolean);
}
public getComponentsByClass<T>(cls: any): T[] {
const modulesMap = [...this.modulesContainer.entries()];
return modulesMap
.map(([key, nestModule]: [string, Module]) => {
const components = [...nestModule.providers.values()];
return components
.filter((component) => component.scope !== Scope.REQUEST)
.map((component) => this.toDiscoveredClass<T>(nestModule, component))
.filter((obj) => obj instanceof cls);
})
.reduce((all, cur) => all.concat(cur), [])
.reverse()
.filter(Boolean);
}
private toDiscoveredClass<T>(nestModule: Module, wrapper: InstanceWrapper): T {
const instanceHost: {
instance: T;
} = wrapper.getInstanceByContextId(STATIC_CONTEXT, wrapper && wrapper.id ? wrapper.id : undefined);
return instanceHost.instance;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment