Amp up your NestJS and `class-transformer` stack with dependency injection!
npm install nestjs-inject-transformer --save
import { InjectTransformModule } from 'nestjs-inject-transformer';
@Module({
imports: [InjectTransformModule]
})
export class ApplicationModule {}This package provides the InjectTransform and InjectType decorators
which support all options of their class-transformer respective counterparts Transform and Type.
To inject a dependencies pass an array of injection tokens to the inject option. They will be passed
as additional arguments to your transform function, in the order they were given:
import { InjectTransform } from 'nestjs-inject-transformer';
export class MyDTO {
@InjectTransform(
(params, myService: MyService) => myService.parse(params.value),
{inject: [MyService]}
)
myAttr: number;
}[!WARN]
class-transformeroperates strictly synchronously. Promises can not be awaited!
Alternatively, you can pass an InjectTransformer to tidy up more extensive use cases:
import {InjectTransform, InjectTransformer} from 'nestjs-inject-transformer';
import {TransformFnParams} from "class-transformer";
@Injectable()
export class MyTransformer implements InjectTransformer {
constructor(
private readonly dep1: Dependency1,
private readonly dep2: Dependency2,
private readonly dep3: Dependency3
) {}
transform(params: TransformFnParams): any {
return this.dep1.parse(this.dep2.format(this.dep3.trim(params.value)));
}
}
export class MyDTO {
@InjectTransform(MyTransformer)
myAttr: number;
}A TypeInjector lets you inject types similar to the Type decorator. Its inject function is
called with the same arguments as the Type function would have been and should return the type
to be used.
The following example illustrates how you could return different DTO types (and thereby different
validation schemes when used with class-validator), based on a supposed client's
configuration:
@Injectable()
class AccountDtoInjector implements TypeInjector {
constructor(
private readonly service: ClientConfigurationService
) {}
inject(type?: TypeHelpOptions) {
const client = type.object['client'] ?? 'default';
const clientConfig = this.service.getClientConfiguration(client);
if (clientConfig.accountType === 'named') {
return NamedAccountDTO;
} else if (clientConfig.accountType === 'numbered') {
return NumberedAccountDTO;
}
return AccountDTO;
}
}
class AccountDTO {
@IsString()
name: string;
}
class NamedAccountDTO extends AccountDTO {
@IsString()
id: string
}
class NumberedAccountDTO extends AccountDTO {
@IsNumber()
id: number
}
class CreateAccountDTO {
@IsString()
client: string;
@ValidateNested()
@InjectType(AccountDtoInjector)
accountInfo: NamedAccountDTO | NumberedAccountDTO;
}nestjs-inject-transformer is MIT licensed.