diff --git a/modules/openapi-generator/src/main/resources/typescript-nestjs/README.mustache b/modules/openapi-generator/src/main/resources/typescript-nestjs/README.mustache index 735f9890335..e8e864d7eb5 100644 --- a/modules/openapi-generator/src/main/resources/typescript-nestjs/README.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-nestjs/README.mustache @@ -105,6 +105,31 @@ import { BASE_PATH } from '{{npmName}}'; export class AppModule {} ``` +### Configuring the module with `forRootAsync` + +You can also use the Nestjs Config Module/Service to configure your app with `forRootAsync`. + +``` +@Module({ + imports: [ + ApiModule.forRootAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (config: ConfigService): Configuration => { + const params: ConfigurationParameters = { + // set configuration parameters here. + basePath: config.get('API_URL'), + }; + return new Configuration(params); + }, + }) + ], + declarations: [ AppComponent ], + providers: [], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` #### Using @nestjs/cli First extend your `src/environments/*.ts` files by adding the corresponding base path: diff --git a/modules/openapi-generator/src/main/resources/typescript-nestjs/api.module.mustache b/modules/openapi-generator/src/main/resources/typescript-nestjs/api.module.mustache index 9cfdc25aec5..fe1fbe707ea 100644 --- a/modules/openapi-generator/src/main/resources/typescript-nestjs/api.module.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-nestjs/api.module.mustache @@ -5,7 +5,7 @@ import { HttpModule, HttpService } from '@nestjs/axios'; {{^useAxiosHttpModule}} import { DynamicModule, HttpService, HttpModule, Module, Global } from '@nestjs/common'; {{/useAxiosHttpModule}} -import { Configuration } from './configuration'; +import { AsyncConfiguration, Configuration, ConfigurationFactory } from './configuration'; {{#apiInfo}} {{#apis}} @@ -33,5 +33,49 @@ export class ApiModule { }; } + /** + * Register the module asynchronously. + */ + static forRootAsync(options: AsyncConfiguration): DynamicModule { + const providers = [...this.createAsyncProviders(options)]; + return { + module: ApiModule, + imports: options.imports || [], + providers, + exports: providers, + }; + } + + private static createAsyncProviders(options: AsyncConfiguration): Provider[] { + if (options.useExisting || options.useFactory) { + return [this.createAsyncConfigurationProvider(options)]; + } + return [ + this.createAsyncConfigurationProvider(options), + { + provide: options.useClass, + useClass: options.useClass, + }, + ]; + } + + private static createAsyncConfigurationProvider( + options: AsyncConfiguration, + ): Provider { + if (options.useFactory) { + return { + provide: Configuration, + useFactory: options.useFactory, + inject: options.inject || [], + }; + } + return { + provide: Configuration, + useFactory: async (optionsFactory: ConfigurationFactory) => + await optionsFactory.createConfiguration(), + inject: [options.useExisting || options.useClass], + }; + } + constructor( httpService: HttpService) { } } diff --git a/modules/openapi-generator/src/main/resources/typescript-nestjs/configuration.mustache b/modules/openapi-generator/src/main/resources/typescript-nestjs/configuration.mustache index 82e8458f39e..39cf69ee612 100644 --- a/modules/openapi-generator/src/main/resources/typescript-nestjs/configuration.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-nestjs/configuration.mustache @@ -1,3 +1,5 @@ +import { ModuleMetadata, Type } from '@nestjs/common/interfaces'; + export interface ConfigurationParameters { apiKeys?: {[ key: string ]: string}; username?: string; @@ -77,3 +79,27 @@ export class Configuration { return mime != null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json'); } } + +export interface ConfigurationFactory { + createConfiguration(): Promise | Configuration; +} + +export interface AsyncConfiguration extends Pick { + /** + * The `useExisting` syntax allows you to create aliases for existing providers. + */ + useExisting?: Type; + /** + * The `useClass` syntax allows you to dynamically determine a class + * that a token should resolve to. + */ + useClass?: Type; + /** + * The `useFactory` syntax allows for creating providers dynamically. + */ + useFactory?: (...args: any[]) => Promise | Configuration; + /** + * Optional list of providers to be injected into the context of the Factory function. + */ + inject?: any[]; +} diff --git a/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/README.md b/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/README.md index 87ba2bd0f07..e66562af4a5 100644 --- a/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/README.md +++ b/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/README.md @@ -105,6 +105,31 @@ import { BASE_PATH } from '@openapitools/typescript-nestjs-petstore'; export class AppModule {} ``` +### Configuring the module with `forRootAsync` + +You can also use the Nestjs Config Module/Service to configure your app with `forRootAsync`. + +``` +@Module({ + imports: [ + ApiModule.forRootAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (config: ConfigService): Configuration => { + const params: ConfigurationParameters = { + // set configuration parameters here. + basePath: config.get('API_URL'), + }; + return new Configuration(params); + }, + }) + ], + declarations: [ AppComponent ], + providers: [], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` #### Using @nestjs/cli First extend your `src/environments/*.ts` files by adding the corresponding base path: diff --git a/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/api.module.ts b/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/api.module.ts index 29ceb1d0f80..514febba9d7 100644 --- a/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/api.module.ts +++ b/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/api.module.ts @@ -1,5 +1,5 @@ import { DynamicModule, HttpService, HttpModule, Module, Global } from '@nestjs/common'; -import { Configuration } from './configuration'; +import { AsyncConfiguration, Configuration, ConfigurationFactory } from './configuration'; import { PetService } from './api/pet.service'; import { StoreService } from './api/store.service'; @@ -27,5 +27,49 @@ export class ApiModule { }; } + /** + * Register the module asynchronously. + */ + static forRootAsync(options: AsyncConfiguration): DynamicModule { + const providers = [...this.createAsyncProviders(options)]; + return { + module: ApiModule, + imports: options.imports || [], + providers, + exports: providers, + }; + } + + private static createAsyncProviders(options: AsyncConfiguration): Provider[] { + if (options.useExisting || options.useFactory) { + return [this.createAsyncConfigurationProvider(options)]; + } + return [ + this.createAsyncConfigurationProvider(options), + { + provide: options.useClass, + useClass: options.useClass, + }, + ]; + } + + private static createAsyncConfigurationProvider( + options: AsyncConfiguration, + ): Provider { + if (options.useFactory) { + return { + provide: Configuration, + useFactory: options.useFactory, + inject: options.inject || [], + }; + } + return { + provide: Configuration, + useFactory: async (optionsFactory: ConfigurationFactory) => + await optionsFactory.createConfiguration(), + inject: [options.useExisting || options.useClass], + }; + } + constructor( httpService: HttpService) { } } diff --git a/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/configuration.ts b/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/configuration.ts index 82e8458f39e..39cf69ee612 100644 --- a/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/configuration.ts +++ b/samples/client/petstore/typescript-nestjs-v6-provided-in-root/builds/default/configuration.ts @@ -1,3 +1,5 @@ +import { ModuleMetadata, Type } from '@nestjs/common/interfaces'; + export interface ConfigurationParameters { apiKeys?: {[ key: string ]: string}; username?: string; @@ -77,3 +79,27 @@ export class Configuration { return mime != null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json'); } } + +export interface ConfigurationFactory { + createConfiguration(): Promise | Configuration; +} + +export interface AsyncConfiguration extends Pick { + /** + * The `useExisting` syntax allows you to create aliases for existing providers. + */ + useExisting?: Type; + /** + * The `useClass` syntax allows you to dynamically determine a class + * that a token should resolve to. + */ + useClass?: Type; + /** + * The `useFactory` syntax allows for creating providers dynamically. + */ + useFactory?: (...args: any[]) => Promise | Configuration; + /** + * Optional list of providers to be injected into the context of the Factory function. + */ + inject?: any[]; +} diff --git a/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/README.md b/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/README.md index fc0ff642c3d..d12fe0a63a9 100644 --- a/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/README.md +++ b/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/README.md @@ -105,6 +105,31 @@ import { BASE_PATH } from '@openapitools/typescript-nestjs-petstore'; export class AppModule {} ``` +### Configuring the module with `forRootAsync` + +You can also use the Nestjs Config Module/Service to configure your app with `forRootAsync`. + +``` +@Module({ + imports: [ + ApiModule.forRootAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (config: ConfigService): Configuration => { + const params: ConfigurationParameters = { + // set configuration parameters here. + basePath: config.get('API_URL'), + }; + return new Configuration(params); + }, + }) + ], + declarations: [ AppComponent ], + providers: [], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` #### Using @nestjs/cli First extend your `src/environments/*.ts` files by adding the corresponding base path: diff --git a/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/api.module.ts b/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/api.module.ts index 394d158b29c..db4bae9b9f8 100644 --- a/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/api.module.ts +++ b/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/api.module.ts @@ -1,6 +1,6 @@ import { DynamicModule, Module, Global } from '@nestjs/common'; import { HttpModule, HttpService } from '@nestjs/axios'; -import { Configuration } from './configuration'; +import { AsyncConfiguration, Configuration, ConfigurationFactory } from './configuration'; import { PetService } from './api/pet.service'; import { StoreService } from './api/store.service'; @@ -28,5 +28,49 @@ export class ApiModule { }; } + /** + * Register the module asynchronously. + */ + static forRootAsync(options: AsyncConfiguration): DynamicModule { + const providers = [...this.createAsyncProviders(options)]; + return { + module: ApiModule, + imports: options.imports || [], + providers, + exports: providers, + }; + } + + private static createAsyncProviders(options: AsyncConfiguration): Provider[] { + if (options.useExisting || options.useFactory) { + return [this.createAsyncConfigurationProvider(options)]; + } + return [ + this.createAsyncConfigurationProvider(options), + { + provide: options.useClass, + useClass: options.useClass, + }, + ]; + } + + private static createAsyncConfigurationProvider( + options: AsyncConfiguration, + ): Provider { + if (options.useFactory) { + return { + provide: Configuration, + useFactory: options.useFactory, + inject: options.inject || [], + }; + } + return { + provide: Configuration, + useFactory: async (optionsFactory: ConfigurationFactory) => + await optionsFactory.createConfiguration(), + inject: [options.useExisting || options.useClass], + }; + } + constructor( httpService: HttpService) { } } diff --git a/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/configuration.ts b/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/configuration.ts index 82e8458f39e..39cf69ee612 100644 --- a/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/configuration.ts +++ b/samples/client/petstore/typescript-nestjs-v8-provided-in-root/builds/default/configuration.ts @@ -1,3 +1,5 @@ +import { ModuleMetadata, Type } from '@nestjs/common/interfaces'; + export interface ConfigurationParameters { apiKeys?: {[ key: string ]: string}; username?: string; @@ -77,3 +79,27 @@ export class Configuration { return mime != null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json'); } } + +export interface ConfigurationFactory { + createConfiguration(): Promise | Configuration; +} + +export interface AsyncConfiguration extends Pick { + /** + * The `useExisting` syntax allows you to create aliases for existing providers. + */ + useExisting?: Type; + /** + * The `useClass` syntax allows you to dynamically determine a class + * that a token should resolve to. + */ + useClass?: Type; + /** + * The `useFactory` syntax allows for creating providers dynamically. + */ + useFactory?: (...args: any[]) => Promise | Configuration; + /** + * Optional list of providers to be injected into the context of the Factory function. + */ + inject?: any[]; +}