diff --git a/bin/configs/typescript-nestjs-reserved-param-names.yaml b/bin/configs/typescript-nestjs-reserved-param-names.yaml new file mode 100644 index 000000000000..c80064785d3e --- /dev/null +++ b/bin/configs/typescript-nestjs-reserved-param-names.yaml @@ -0,0 +1,6 @@ +generatorName: typescript-nestjs +outputDir: samples/client/petstore/typescript-nestjs/builds/reservedParamNames +inputSpec: modules/openapi-generator/src/test/resources/3_0/typescript-nestjs/reserved-param-names.yaml +templateDir: modules/openapi-generator/src/main/resources/typescript-nestjs +additionalProperties: + "useSingleRequestParameter" : true diff --git a/docs/generators/typescript-nestjs.md b/docs/generators/typescript-nestjs.md index 2055133b6b89..47037f98f6b0 100644 --- a/docs/generators/typescript-nestjs.md +++ b/docs/generators/typescript-nestjs.md @@ -116,9 +116,11 @@ These options may be applied as additional-properties (cli) or configOptions (pl
  • float
  • for
  • formParams
  • +
  • from
  • function
  • goto
  • headerParams
  • +
  • headers
  • if
  • implements
  • import
  • diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNestjsClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNestjsClientCodegen.java index 520d69e2d62d..e12e8b2f030f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNestjsClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNestjsClientCodegen.java @@ -88,6 +88,8 @@ public TypeScriptNestjsClientCodegen() { apiPackage = "api"; modelPackage = "model"; + reservedWords.addAll(Arrays.asList("from", "headers")); + this.cliOptions.add(new CliOption(NPM_REPOSITORY, "Use this property to set an url your private npmRepo in the package.json")); this.cliOptions.add(CliOption.newBoolean(WITH_INTERFACES, @@ -327,6 +329,10 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap operations, L // Overwrite path to TypeScript template string, after applying everything we just did. op.path = pathBuffer.toString(); + + for (CodegenParameter param : op.allParams) { + param.vendorExtensions.putIfAbsent("x-param-has-sanitized-name", !param.baseName.equals(param.paramName)); + } } operations.put("hasSomeFormParams", hasSomeFormParams); diff --git a/modules/openapi-generator/src/main/resources/typescript-nestjs/api.service.mustache b/modules/openapi-generator/src/main/resources/typescript-nestjs/api.service.mustache index d33a206803f7..12bf8d238860 100644 --- a/modules/openapi-generator/src/main/resources/typescript-nestjs/api.service.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-nestjs/api.service.mustache @@ -35,7 +35,7 @@ export interface {{classname}}{{operationIdCamelCase}}Request { * @type {{=<% %>=}}{<%&dataType%>}<%={{ }}=%> * @memberof {{classname}}{{operationIdCamelCase}} */ - readonly {{paramName}}{{^required}}?{{/required}}: {{{dataType}}} + readonly {{#vendorExtensions.x-param-has-sanitized-name}}'{{{baseName}}}'{{/vendorExtensions.x-param-has-sanitized-name}}{{^vendorExtensions.x-param-has-sanitized-name}}{{{paramName}}}{{/vendorExtensions.x-param-has-sanitized-name}}{{^required}}?{{/required}}: {{{dataType}}} {{^-last}} {{/-last}} @@ -106,7 +106,7 @@ export class {{classname}} { {{#useSingleRequestParameter}} const { {{#allParams}} - {{paramName}}, + {{#vendorExtensions.x-param-has-sanitized-name}}'{{{baseName}}}': {{/vendorExtensions.x-param-has-sanitized-name}}{{paramName}}, {{/allParams}} } = requestParameters; diff --git a/modules/openapi-generator/src/main/resources/typescript-nestjs/modelGeneric.mustache b/modules/openapi-generator/src/main/resources/typescript-nestjs/modelGeneric.mustache index 43207b65e305..720aac912881 100644 --- a/modules/openapi-generator/src/main/resources/typescript-nestjs/modelGeneric.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-nestjs/modelGeneric.mustache @@ -5,6 +5,6 @@ export interface {{classname}}{{#allParents}}{{#-first}} extends {{/-first}}{{{. * {{{.}}} */ {{/description}} - {{#isReadOnly}}readonly {{/isReadOnly}}{{{name}}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}} | null{{/isNullable}}; + {{#isReadOnly}}readonly {{/isReadOnly}}{{#hasSanitizedName}}'{{{baseName}}}'{{/hasSanitizedName}}{{^hasSanitizedName}}{{{name}}}{{/hasSanitizedName}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}} | null{{/isNullable}}; {{/vars}} }{{>modelGenericEnums}} diff --git a/modules/openapi-generator/src/main/resources/typescript-nestjs/modelTaggedUnion.mustache b/modules/openapi-generator/src/main/resources/typescript-nestjs/modelTaggedUnion.mustache index 24a9c0f0b60f..754c1db278ba 100644 --- a/modules/openapi-generator/src/main/resources/typescript-nestjs/modelTaggedUnion.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-nestjs/modelTaggedUnion.mustache @@ -10,7 +10,7 @@ export interface {{classname}} { {{>modelGenericAdditionalProperties}} * {{{.}}} */ {{/description}} - {{name}}{{^required}}?{{/required}}: {{#discriminatorValue}}'{{.}}'{{/discriminatorValue}}{{^discriminatorValue}}{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{/discriminatorValue}}{{#isNullable}} | null{{/isNullable}}; + {{#hasSanitizedName}}'{{{baseName}}}'{{/hasSanitizedName}}{{^hasSanitizedName}}{{{name}}}{{/hasSanitizedName}}{{^required}}?{{/required}}: {{#discriminatorValue}}'{{.}}'{{/discriminatorValue}}{{^discriminatorValue}}{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{/discriminatorValue}}{{#isNullable}} | null{{/isNullable}}; {{/allVars}} } {{>modelGenericEnums}} @@ -18,4 +18,4 @@ export interface {{classname}} { {{>modelGenericAdditionalProperties}} {{^parent}} {{>modelGeneric}} {{/parent}} -{{/discriminator}} \ No newline at end of file +{{/discriminator}} diff --git a/modules/openapi-generator/src/test/resources/3_0/typescript-nestjs/reserved-param-names.yaml b/modules/openapi-generator/src/test/resources/3_0/typescript-nestjs/reserved-param-names.yaml new file mode 100644 index 000000000000..ab02beffe8c6 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/typescript-nestjs/reserved-param-names.yaml @@ -0,0 +1,43 @@ +openapi: 3.0.0 +info: + description: Test reserved param names + version: 1.0.0 + title: Reserved param names +paths: + /test: + post: + security: + - bearerAuth: [] + summary: Test reserved param names + description: '' + operationId: testReservedParamNames + parameters: + - name: notReserved + in: query + description: Should not be treated as a reserved param name + required: true + schema: + type: string + - name: from + in: query + description: Might conflict with rxjs import + required: true + schema: + type: string + - name: headers + in: header + description: Might conflict with headers const + required: true + schema: + type: string + responses: + '200': + description: successful operation + '405': + description: Invalid input +components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.gitignore b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.gitignore new file mode 100644 index 000000000000..149b57654723 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.gitignore @@ -0,0 +1,4 @@ +wwwroot/*.js +node_modules +typings +dist diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator-ignore b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator/FILES b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator/FILES new file mode 100644 index 000000000000..229c09ab6277 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator/FILES @@ -0,0 +1,10 @@ +.gitignore +README.md +api.module.ts +api/api.ts +api/default.service.ts +configuration.ts +git_push.sh +index.ts +model/models.ts +variables.ts diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator/VERSION b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator/VERSION new file mode 100644 index 000000000000..884119126398 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.11.0-SNAPSHOT diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/README.md b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/README.md new file mode 100644 index 000000000000..0cc526067ed1 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/README.md @@ -0,0 +1,162 @@ +## @ + +### Building + +To install the required dependencies and to build the typescript sources run: +``` +npm install +npm run build +``` + +#### General usage + +In your Nestjs project: + + +``` +// without configuring providers +import { ApiModule } from ''; +import { HttpModule } from '@nestjs/axios'; + +@Module({ + imports: [ + ApiModule, + HttpModule + ], + providers: [] +}) +export class AppModule {} +``` + +``` +// configuring providers +import { ApiModule, Configuration, ConfigurationParameters } from ''; + +export function apiConfigFactory (): Configuration => { + const params: ConfigurationParameters = { + // set configuration parameters here. + } + return new Configuration(params); +} + +@Module({ + imports: [ ApiModule.forRoot(apiConfigFactory) ], + declarations: [ AppComponent ], + providers: [], + bootstrap: [ AppComponent ] +}) +export class AppModule {} +``` + +``` +import { DefaultApi } from ''; + +export class AppComponent { + constructor(private apiGateway: DefaultApi) { } +} +``` + +Note: The ApiModule a dynamic module and instantiated once app wide. +This is to ensure that all services are treated as singletons. + +#### Using multiple swagger files / APIs / ApiModules +In order to use multiple `ApiModules` generated from different swagger files, +you can create an alias name when importing the modules +in order to avoid naming conflicts: +``` +import { ApiModule } from 'my-api-path'; +import { ApiModule as OtherApiModule } from 'my-other-api-path'; +import { HttpModule } from '@nestjs/axios'; + +@Module({ + imports: [ + ApiModule, + OtherApiModule, + HttpModule + ] +}) +export class AppModule { + +} +``` + + +### Set service base path +If different than the generated base path, during app bootstrap, you can provide the base path to your service. + +``` +import { BASE_PATH } from ''; + +bootstrap(AppComponent, [ + { provide: BASE_PATH, useValue: 'https://your-web-service.com' }, +]); +``` +or + +``` +import { BASE_PATH } from ''; + +@Module({ + imports: [], + declarations: [ AppComponent ], + providers: [ provide: BASE_PATH, useValue: 'https://your-web-service.com' ], + bootstrap: [ AppComponent ] +}) +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: + +``` +export const environment = { + production: false, + API_BASE_PATH: 'http://127.0.0.1:8080' +}; +``` + +In the src/app/app.module.ts: +``` +import { BASE_PATH } from ''; +import { environment } from '../environments/environment'; + +@Module({ + declarations: [ + AppComponent + ], + imports: [ ], + providers: [ + { + provide: 'BASE_PATH', + useValue: environment.API_BASE_PATH + } + ] +}) +export class AppModule { } +``` diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api.module.ts b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api.module.ts new file mode 100644 index 000000000000..5743870b91c1 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api.module.ts @@ -0,0 +1,70 @@ +import { DynamicModule, Module, Global, Provider } from '@nestjs/common'; +import { HttpModule, HttpService } from '@nestjs/axios'; +import { AsyncConfiguration, Configuration, ConfigurationFactory } from './configuration'; + +import { DefaultService } from './api/default.service'; + +@Global() +@Module({ + imports: [ HttpModule ], + exports: [ + DefaultService + ], + providers: [ + DefaultService + ] +}) +export class ApiModule { + public static forRoot(configurationFactory: () => Configuration): DynamicModule { + return { + module: ApiModule, + providers: [ { provide: Configuration, useFactory: configurationFactory } ] + }; + } + + /** + * 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.useClass) { + return [ + this.createAsyncConfigurationProvider(options), + { + provide: options.useClass, + useClass: options.useClass, + }, + ]; + } + return [this.createAsyncConfigurationProvider(options)]; + } + + 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.useExisting]) || (options.useClass && [options.useClass]) || [], + }; + } + + constructor( httpService: HttpService) { } +} diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api/api.ts b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api/api.ts new file mode 100644 index 000000000000..8e76619647f4 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api/api.ts @@ -0,0 +1,3 @@ +export * from './default.service'; +import { DefaultService } from './default.service'; +export const APIS = [DefaultService]; diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api/default.service.ts b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api/default.service.ts new file mode 100644 index 000000000000..c41aa37ec06b --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/api/default.service.ts @@ -0,0 +1,147 @@ +/** + * Reserved param names + * Test reserved param names + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +/* tslint:disable:no-unused-variable member-ordering */ + +import { Injectable, Optional } from '@nestjs/common'; +import { HttpService } from '@nestjs/axios'; +import { AxiosResponse } from 'axios'; +import { Observable, from, of, switchMap } from 'rxjs'; +import { Configuration } from '../configuration'; +import { COLLECTION_FORMATS } from '../variables'; + +/** + * Request parameters for testReservedParamNames operation in DefaultService. + * @export + * @interface DefaultServiceTestReservedParamNamesRequest + */ +export interface DefaultServiceTestReservedParamNamesRequest { + /** + * Should not be treated as a reserved param name + * @type {string} + * @memberof DefaultServiceTestReservedParamNames + */ + readonly notReserved: string + + /** + * Might conflict with rxjs import + * @type {string} + * @memberof DefaultServiceTestReservedParamNames + */ + readonly 'from': string + + /** + * Might conflict with headers const + * @type {string} + * @memberof DefaultServiceTestReservedParamNames + */ + readonly 'headers': string +} + + +@Injectable() +export class DefaultService { + + protected basePath = 'http://localhost'; + public defaultHeaders: Record = {}; + public configuration = new Configuration(); + protected httpClient: HttpService; + + constructor(httpClient: HttpService, @Optional() configuration: Configuration) { + this.configuration = configuration || this.configuration; + this.basePath = configuration?.basePath || this.basePath; + this.httpClient = configuration?.httpClient || httpClient; + } + + /** + * @param consumes string[] mime-types + * @return true: consumes contains 'multipart/form-data', false: otherwise + */ + private canConsumeForm(consumes: string[]): boolean { + const form = 'multipart/form-data'; + return consumes.includes(form); + } + + /** + * Test reserved param names + * + * @param {DefaultServiceTestReservedParamNamesRequest} requestParameters Request parameters. + */ + public testReservedParamNames(requestParameters: DefaultServiceTestReservedParamNamesRequest, ): Observable>; + public testReservedParamNames(requestParameters: DefaultServiceTestReservedParamNamesRequest, ): Observable { + const { + notReserved, + 'from': _from, + 'headers': _headers, + } = requestParameters; + + if (notReserved === null || notReserved === undefined) { + throw new Error('Required parameter notReserved was null or undefined when calling testReservedParamNames.'); + } + + if (_from === null || _from === undefined) { + throw new Error('Required parameter _from was null or undefined when calling testReservedParamNames.'); + } + + if (_headers === null || _headers === undefined) { + throw new Error('Required parameter _headers was null or undefined when calling testReservedParamNames.'); + } + + let queryParameters = new URLSearchParams(); + if (notReserved !== undefined && notReserved !== null) { + queryParameters.append('notReserved', notReserved); + } + if (_from !== undefined && _from !== null) { + queryParameters.append('from', _from); + } + + let headers = {...this.defaultHeaders}; + if (_headers !== undefined && _headers !== null) { + headers['headers'] = String(_headers); + } + + let accessTokenObservable: Observable = of(null); + + // authentication (bearerAuth) required + if (typeof this.configuration.accessToken === 'function') { + accessTokenObservable = from(Promise.resolve(this.configuration.accessToken())); + } else if (this.configuration.accessToken) { + accessTokenObservable = from(Promise.resolve(this.configuration.accessToken)); + } + // to determine the Accept header + let httpHeaderAccepts: string[] = [ + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers['Accept'] = httpHeaderAcceptSelected; + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + return accessTokenObservable.pipe( + switchMap((accessToken) => { + if (accessToken) { + headers['Authorization'] = `Bearer ${accessToken}`; + } + + return this.httpClient.post(`${this.basePath}/test`, + null, + { + params: queryParameters, + withCredentials: this.configuration.withCredentials, + headers: headers + } + ); + }) + ); + } +} diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/configuration.ts b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/configuration.ts new file mode 100644 index 000000000000..5db77aed7255 --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/configuration.ts @@ -0,0 +1,109 @@ +import type { HttpService } from '@nestjs/axios'; +import { ModuleMetadata, Type } from '@nestjs/common/interfaces'; + +export interface ConfigurationParameters { + apiKeys?: {[ key: string ]: string}; + username?: string; + password?: string; + accessToken?: string | Promise | (() => string | Promise); + basePath?: string; + withCredentials?: boolean; + httpClient?: HttpService; +} + +export class Configuration { + apiKeys?: {[ key: string ]: string}; + username?: string; + password?: string; + accessToken?: string | Promise | (() => string | Promise); + basePath?: string; + withCredentials?: boolean; + httpClient?: HttpService; + + constructor(configurationParameters: ConfigurationParameters = {}) { + this.apiKeys = configurationParameters.apiKeys; + this.username = configurationParameters.username; + this.password = configurationParameters.password; + this.accessToken = configurationParameters.accessToken; + this.basePath = configurationParameters.basePath; + this.withCredentials = configurationParameters.withCredentials; + this.httpClient = configurationParameters.httpClient; + } + + /** + * Select the correct content-type to use for a request. + * Uses {@link Configuration#isJsonMime} to determine the correct content-type. + * If no content type is found return the first found type if the contentTypes is not empty + * @param contentTypes - the array of content types that are available for selection + * @returns the selected content-type or undefined if no selection could be made. + */ + public selectHeaderContentType (contentTypes: string[]): string | undefined { + if (contentTypes.length == 0) { + return undefined; + } + + let type = contentTypes.find(x => this.isJsonMime(x)); + if (type === undefined) { + return contentTypes[0]; + } + return type; + } + + /** + * Select the correct accept content-type to use for a request. + * Uses {@link Configuration#isJsonMime} to determine the correct accept content-type. + * If no content type is found return the first found type if the contentTypes is not empty + * @param accepts - the array of content types that are available for selection. + * @returns the selected content-type or undefined if no selection could be made. + */ + public selectHeaderAccept(accepts: string[]): string | undefined { + if (accepts.length == 0) { + return undefined; + } + + let type = accepts.find(x => this.isJsonMime(x)); + if (type === undefined) { + return accepts[0]; + } + return type; + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + public isJsonMime(mime: string): boolean { + const jsonMime: RegExp = new RegExp('^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', 'i'); + 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/builds/reservedParamNames/git_push.sh b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/git_push.sh new file mode 100644 index 000000000000..f53a75d4fabe --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/git_push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=$(git remote) +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/index.ts b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/index.ts new file mode 100644 index 000000000000..d20921b6d5de --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/index.ts @@ -0,0 +1,4 @@ +export * from './api/api'; +export * from './variables'; +export * from './configuration'; +export * from './api.module'; \ No newline at end of file diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/model/models.ts b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/model/models.ts new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/variables.ts b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/variables.ts new file mode 100644 index 000000000000..d52a33f70e5b --- /dev/null +++ b/samples/client/petstore/typescript-nestjs/builds/reservedParamNames/variables.ts @@ -0,0 +1,7 @@ + +export const COLLECTION_FORMATS = { + 'csv': ',', + 'tsv': ' ', + 'ssv': ' ', + 'pipes': '|' +}