UNPKG

nestjs-tencent-sms

Version:
79 lines (72 loc) 2.55 kB
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'; @Module({ 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, }; } }