nestjs-tencent-sms
Version:
A nestjs Tencent Sms Service
79 lines (72 loc) • 2.55 kB
text/typescript
import { DynamicModule, Module, Provider, Type } from '@nestjs/common';
import { TencentSmsFactory, TencentSmsModuleAsyncOptions, TencentSmsModuleOptions } from './interfaces';
import { TENCENT_SMS_MODULE_OPTIONS } from './constant';
import { TencentSmsService } from './tencent-sms.service';
({
providers: [TencentSmsService],
exports: [TencentSmsService],
})
export class TencentSmsModule {
static forRoot(options: TencentSmsModuleOptions): DynamicModule;
static forRoot(options: TencentSmsModuleOptions): DynamicModule {
const provider: Provider = {
provide: TENCENT_SMS_MODULE_OPTIONS,
useValue: options,
};
return {
global: true,
module: TencentSmsModule,
providers: [provider],
exports: [provider],
};
}
static forRootAsync(options: TencentSmsModuleAsyncOptions): DynamicModule;
static forRootAsync(options: TencentSmsModuleAsyncOptions): DynamicModule {
const imports = this.getUniqImports([options]);
const providers = this.createTencentSmsConfigurations(options);
return {
global: true,
module: TencentSmsModule,
imports,
providers,
exports: providers,
};
}
private static createTencentSmsConfigurations(options: TencentSmsModuleAsyncOptions): Provider[] {
if (options.useExisting || options.useFactory) {
return [this.createTencentSmsConfiguration(options)];
}
const useClass = options.useClass as Type<TencentSmsFactory>;
return [
this.createTencentSmsConfiguration(options),
{
provide: useClass,
useClass,
},
];
}
private static getUniqImports(options: Array<TencentSmsModuleAsyncOptions>) {
return (
options
.map((option) => option.imports)
.reduce((acc, i) => acc.concat(i || []), [])
.filter((v, i, a) => a.indexOf(v) === i) || []
);
}
private static createTencentSmsConfiguration(options: TencentSmsModuleAsyncOptions): Provider {
if (options.useFactory) {
return {
provide: TENCENT_SMS_MODULE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
}
// `as Type<SharedBullConfigurationFactory>` is a workaround for microsoft/TypeScript#31603
const inject = [(options.useClass || options.useExisting) as Type<TencentSmsFactory>];
return {
provide: TENCENT_SMS_MODULE_OPTIONS,
useFactory: async (optionsFactory: TencentSmsFactory) => optionsFactory.createTencentSmsConfiguration(),
inject,
};
}
}