diff --git a/docs/generators/typescript-rxjs.md b/docs/generators/typescript-rxjs.md index 3d8bf8a3318..0516372fef8 100644 --- a/docs/generators/typescript-rxjs.md +++ b/docs/generators/typescript-rxjs.md @@ -67,10 +67,8 @@ sidebar_label: typescript-rxjs
  • HttpMethod
  • HttpQuery
  • Middleware
  • -
  • ModelPropertyNaming
  • RequestArgs
  • RequestOpts
  • -
  • RequiredError
  • ResponseArgs
  • abstract
  • await
  • @@ -90,7 +88,6 @@ sidebar_label: typescript-rxjs
  • double
  • else
  • enum
  • -
  • exists
  • export
  • extends
  • false
  • diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptRxjsClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptRxjsClientCodegen.java index 7510a25f09d..373a1e33a8e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptRxjsClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptRxjsClientCodegen.java @@ -23,19 +23,20 @@ import io.swagger.v3.parser.util.SchemaTypeUtil; import org.openapitools.codegen.*; import org.openapitools.codegen.meta.features.DocumentationFeature; import org.openapitools.codegen.utils.ModelUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; -import java.util.TreeSet; -import java.util.List; -import java.util.ArrayList; -import java.util.Map; +import java.util.*; public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen { + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractTypeScriptClientCodegen.class); public static final String NPM_REPOSITORY = "npmRepository"; public static final String WITH_INTERFACES = "withInterfaces"; protected String npmRepository = null; + protected Set reservedParamNames = new HashSet<>(); public TypeScriptRxjsClientCodegen() { super(); @@ -58,6 +59,11 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen this.cliOptions.add(new CliOption(NPM_REPOSITORY, "Use this property to set an url your private npmRepo in the package.json")); this.cliOptions.add(new CliOption(WITH_INTERFACES, "Setting this property to true will generate interfaces next to the default class implementations.", SchemaTypeUtil.BOOLEAN_TYPE).defaultValue(Boolean.FALSE.toString())); + + // these are used in the api template for more efficient destructuring + this.reservedParamNames.add("headers"); + this.reservedParamNames.add("query"); + this.reservedParamNames.add("formData"); } @Override @@ -252,12 +258,18 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen operations.put("hasEnums", hasEnums); } + private void setParamNameAlternative(CodegenParameter param, String paramName, String paramNameAlternative) { + if (param.paramName.equals(paramName)) { + param.vendorExtensions.put("paramNameAlternative", paramNameAlternative); + } + } + private void addConditionalImportInformation(Map operations) { // This method will determine if there are required parameters and if there are list containers Map _operations = (Map) operations.get("operations"); List operationList = (List) _operations.get("operation"); - boolean hasRequiredParameters = false; + boolean hasRequiredParams = false; boolean hasListContainers = false; boolean hasHttpHeaders = false; boolean hasQueryParams = false; @@ -265,25 +277,46 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen for (ExtendedCodegenOperation op : operationList) { if (op.getHasRequiredParams()) { - hasRequiredParameters = true; + hasRequiredParams = true; } - - for (CodegenParameter param : op.headerParams) { - if (param.isListContainer) { - hasListContainers = true; - break; + + for (CodegenParameter p: op.allParams) { + String paramNameAlternative = null; + + if(this.reservedParamNames.contains(p.paramName)){ + paramNameAlternative = p.paramName + "Alias"; + LOGGER.info("param: "+p.paramName+" isReserved ––> "+paramNameAlternative); } - } - for (CodegenParameter param : op.queryParams) { - if (param.isListContainer && !param.isCollectionFormatMulti) { - hasListContainers = true; - break; + setParamNameAlternative(p, p.paramName, paramNameAlternative); + + for (CodegenParameter param : op.headerParams) { + if (param.isListContainer) { + hasListContainers = true; + } + setParamNameAlternative(param, p.paramName, paramNameAlternative); } - } - for (CodegenParameter param : op.formParams) { - if (param.isListContainer && !param.isCollectionFormatMulti) { - hasListContainers = true; - break; + + for (CodegenParameter param : op.queryParams) { + if (param.isListContainer && !param.isCollectionFormatMulti) { + hasListContainers = true; + } + if (param.required) { + op.hasRequiredQueryParams = true; + } else { + op.hasOptionalQueryParams = true; + } + setParamNameAlternative(param, p.paramName, paramNameAlternative); + } + + for (CodegenParameter param : op.formParams) { + if (param.isListContainer && !param.isCollectionFormatMulti) { + hasListContainers = true; + } + setParamNameAlternative(param, p.paramName, paramNameAlternative); + } + + for (CodegenParameter param : op.pathParams) { + setParamNameAlternative(param, p.paramName, paramNameAlternative); } } @@ -296,13 +329,9 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen if (op.getHasPathParams()) { hasPathParams = true; } - - if(hasRequiredParameters && hasListContainers && hasHttpHeaders && hasQueryParams && hasPathParams){ - break; - } } - operations.put("hasRequiredParameters", hasRequiredParameters); + operations.put("hasRequiredParams", hasRequiredParams); operations.put("hasListContainers", hasListContainers); operations.put("hasHttpHeaders", hasHttpHeaders); operations.put("hasQueryParams", hasQueryParams); @@ -312,7 +341,6 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen private void addExtraReservedWords() { this.reservedWords.add("BASE_PATH"); this.reservedWords.add("BaseAPI"); - this.reservedWords.add("RequiredError"); this.reservedWords.add("COLLECTION_FORMATS"); this.reservedWords.add("ConfigurationParameters"); this.reservedWords.add("Configuration"); @@ -320,11 +348,9 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen this.reservedWords.add("HttpHeaders"); this.reservedWords.add("HttpQuery"); this.reservedWords.add("HttpBody"); - this.reservedWords.add("ModelPropertyNaming"); this.reservedWords.add("RequestArgs"); this.reservedWords.add("RequestOpts"); this.reservedWords.add("ResponseArgs"); - this.reservedWords.add("exists"); this.reservedWords.add("Middleware"); this.reservedWords.add("AjaxRequest"); this.reservedWords.add("AjaxResponse"); @@ -332,6 +358,8 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen class ExtendedCodegenOperation extends CodegenOperation { public boolean hasHttpHeaders; + public boolean hasRequiredQueryParams; + public boolean hasOptionalQueryParams; public ExtendedCodegenOperation(CodegenOperation o) { super(); @@ -405,6 +433,8 @@ public class TypeScriptRxjsClientCodegen extends AbstractTypeScriptClientCodegen // new fields this.hasHttpHeaders = o.getHasHeaderParams() || o.getHasBodyParam() || o.hasAuthMethods; + this.hasRequiredQueryParams = false; // will be updated within addConditionalImportInformation + this.hasOptionalQueryParams = false; // will be updated within addConditionalImportInformation } } } diff --git a/modules/openapi-generator/src/main/resources/typescript-rxjs/apis.mustache b/modules/openapi-generator/src/main/resources/typescript-rxjs/apis.mustache index 1528c0dcbb6..78ef140df22 100644 --- a/modules/openapi-generator/src/main/resources/typescript-rxjs/apis.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-rxjs/apis.mustache @@ -1,7 +1,7 @@ // tslint:disable {{>licenseInfo}} import { Observable } from 'rxjs'; -import { BaseAPI{{#hasHttpHeaders}}, HttpHeaders{{/hasHttpHeaders}}{{#hasQueryParams}}, HttpQuery{{/hasQueryParams}}{{#hasRequiredParameters}}, throwIfRequired{{/hasRequiredParameters}}{{#hasPathParams}}, encodeURI{{/hasPathParams}}{{#hasListContainers}}, COLLECTION_FORMATS{{/hasListContainers}} } from '../runtime'; +import { BaseAPI{{#hasHttpHeaders}}, HttpHeaders{{/hasHttpHeaders}}{{#hasQueryParams}}, HttpQuery{{/hasQueryParams}}{{#hasRequiredParams}}, throwIfNullOrUndefined{{/hasRequiredParams}}{{#hasPathParams}}, encodeURI{{/hasPathParams}}{{#hasListContainers}}, COLLECTION_FORMATS{{/hasListContainers}} } from '../runtime'; {{#imports.0}} import { {{#imports}} @@ -37,11 +37,11 @@ export class {{classname}} extends BaseAPI { * {{&summary}} {{/summary}} */ - {{nickname}} = ({{#allParams.0}}requestParameters: {{operationIdCamelCase}}Request{{/allParams.0}}): Observable<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> => { + {{nickname}} = ({{#allParams.0}}{ {{#allParams}}{{paramName}}{{#vendorExtensions.paramNameAlternative}}: {{vendorExtensions.paramNameAlternative}}{{/vendorExtensions.paramNameAlternative}}{{^-last}}, {{/-last}}{{/allParams}} }: {{operationIdCamelCase}}Request{{/allParams.0}}): Observable<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> => { {{#hasParams}} {{#allParams}} {{#required}} - throwIfRequired(requestParameters, '{{paramName}}', '{{nickname}}'); + throwIfNullOrUndefined({{> paramNamePartial}}, '{{nickname}}'); {{/required}} {{/allParams}} @@ -58,15 +58,15 @@ export class {{classname}} extends BaseAPI { {{/bodyParam}} {{#headerParams}} {{#isListContainer}} - ...(requestParameters.{{paramName}} && { '{{baseName}}': requestParameters.{{paramName}}.join(COLLECTION_FORMATS['{{collectionFormat}}'])) }), + ...({{> paramNamePartial}} != null ? { '{{baseName}}': {{> paramNamePartial}}.join(COLLECTION_FORMATS['{{collectionFormat}}'])) } : undefined), {{/isListContainer}} {{^isListContainer}} - ...(requestParameters.{{paramName}} && { '{{baseName}}': String(requestParameters.{{paramName}}) }), + ...({{> paramNamePartial}} != null ? { '{{baseName}}': String({{> paramNamePartial}}) } : undefined), {{/isListContainer}} {{/headerParams}} {{#authMethods}} {{#isBasic}} - ...(this.configuration.username && this.configuration.password && { Authorization: `Basic ${btoa(this.configuration.username + ':' + this.configuration.password)}` }), + ...(this.configuration.username != null && this.configuration.password != null ? { Authorization: `Basic ${btoa(this.configuration.username + ':' + this.configuration.password)}` } : undefined), {{/isBasic}} {{#isApiKey}} {{#isKeyInHeader}} @@ -75,77 +75,109 @@ export class {{classname}} extends BaseAPI { {{/isApiKey}} {{#isOAuth}} // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('{{name}}', [{{#scopes}}'{{{scope}}}'{{^-last}}, {{/-last}}{{/scopes}}]) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), {{/isOAuth}} {{/authMethods}} }; {{/hasHttpHeaders}} {{#hasQueryParams}} - const query: HttpQuery = { + {{^hasRequiredQueryParams}} + const query: HttpQuery = {}; + {{/hasRequiredQueryParams}} + {{#hasRequiredQueryParams}} + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined {{#queryParams}} + {{#required}} {{#isListContainer}} {{#isCollectionFormatMulti}} - ...(requestParameters.{{paramName}} && { '{{baseName}}': requestParameters.{{paramName}} }), + '{{baseName}}': {{> paramNamePartial}}, {{/isCollectionFormatMulti}} {{^isCollectionFormatMulti}} - ...(requestParameters.{{paramName}} && { '{{baseName}}': requestParameters.{{paramName}}.join(COLLECTION_FORMATS['{{collectionFormat}}']) }), + '{{baseName}}': {{> paramNamePartial}}.join(COLLECTION_FORMATS['{{collectionFormat}}']), {{/isCollectionFormatMulti}} {{/isListContainer}} {{^isListContainer}} {{#isDateTime}} - ...(requestParameters.{{paramName}} && { '{{baseName}}': (requestParameters.{{paramName}} as any).toISOString() }), + '{{baseName}}': ({{> paramNamePartial}} as any).toISOString(), {{/isDateTime}} {{^isDateTime}} {{#isDate}} - ...(requestParameters.{{paramName}} && { '{{baseName}}': (requestParameters.{{paramName}} as any).toISOString() }), + '{{baseName}}': ({{> paramNamePartial}} as any).toISOString(), {{/isDate}} {{^isDate}} - ...(requestParameters.{{paramName}} && { '{{baseName}}': requestParameters.{{paramName}} }), + '{{baseName}}': {{> paramNamePartial}}, {{/isDate}} {{/isDateTime}} {{/isListContainer}} + {{/required}} {{/queryParams}} - {{#authMethods}} - {{#isApiKey}} - {{#isKeyInQuery}} - ...(this.configuration.apiKey && { '{{keyParamName}}': this.configuration.apiKey && this.configuration.apiKey('{{keyParamName}}') }), // {{name}} authentication - {{/isKeyInQuery}} - {{/isApiKey}} - {{/authMethods}} }; + {{/hasRequiredQueryParams}} + {{#hasOptionalQueryParams}} + + {{#queryParams}} + {{^required}} + {{#isListContainer}} + {{#isCollectionFormatMulti}} + if ({{> paramNamePartial}} != null) { query['{{baseName}}'] = {{> paramNamePartial}}; } + {{/isCollectionFormatMulti}} + {{^isCollectionFormatMulti}} + if ({{> paramNamePartial}} != null) { query['{{baseName}}'] = {{> paramNamePartial}}.join(COLLECTION_FORMATS['{{collectionFormat}}']); } + {{/isCollectionFormatMulti}} + {{/isListContainer}} + {{^isListContainer}} + {{#isDateTime}} + if ({{> paramNamePartial}} != null) { query['{{baseName}}'] = ({{> paramNamePartial}} as any).toISOString(); } + {{/isDateTime}} + {{^isDateTime}} + {{#isDate}} + if ({{> paramNamePartial}} != null) { query['{{baseName}}'] = ({{> paramNamePartial}} as any).toISOString(); } + {{/isDate}} + {{^isDate}} + if ({{> paramNamePartial}} != null) { query['{{baseName}}'] = {{> paramNamePartial}}; } + {{/isDate}} + {{/isDateTime}} + {{/isListContainer}} + {{/required}} + {{/queryParams}} + {{/hasOptionalQueryParams}} + {{#authMethods}} + {{#isApiKey}} + {{#isKeyInQuery}} + if (this.configuration.apiKey != null) { query['{{keyParamName}}'] = this.configuration.apiKey('{{keyParamName}}'); } // {{name}} authentication + {{/isKeyInQuery}} + {{/isApiKey}} + {{/authMethods}} {{/hasQueryParams}} {{#hasFormParams}} const formData = new FormData(); - {{/hasFormParams}} {{#formParams}} {{#isListContainer}} - if (requestParameters.{{paramName}}) { + if ({{> paramNamePartial}} !== undefined) { {{#isCollectionFormatMulti}} - requestParameters.{{paramName}}.forEach((element) => { - formData.append('{{baseName}}', element as any); - }) + {{> paramNamePartial}}.forEach((element) => formData.append('{{baseName}}', element as any)) {{/isCollectionFormatMulti}} {{^isCollectionFormatMulti}} - formData.append('{{baseName}}', requestParameters.{{paramName}}.join(COLLECTION_FORMATS['{{collectionFormat}}'])); + formData.append('{{baseName}}', {{> paramNamePartial}}.join(COLLECTION_FORMATS['{{collectionFormat}}'])); {{/isCollectionFormatMulti}} } {{/isListContainer}} {{^isListContainer}} - if (requestParameters.{{paramName}} !== undefined) { - formData.append('{{baseName}}', requestParameters.{{paramName}} as any); - } - + if ({{> paramNamePartial}} !== undefined) { formData.append('{{baseName}}', {{> paramNamePartial}} as any); } {{/isListContainer}} {{/formParams}} + + {{/hasFormParams}} return this.request<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>({ - path: '{{{path}}}'{{#pathParams}}.replace({{=<% %>=}}'{<%baseName%>}'<%={{ }}=%>, encodeURI(requestParameters.{{paramName}})){{/pathParams}}, + path: '{{{path}}}'{{#pathParams}}.replace({{=<% %>=}}'{<%baseName%>}'<%={{ }}=%>, encodeURI({{> paramNamePartial}})){{/pathParams}}, method: '{{httpMethod}}', {{#hasHttpHeaders}} headers, @@ -156,14 +188,14 @@ export class {{classname}} extends BaseAPI { {{#hasBodyParam}} {{#bodyParam}} {{#isContainer}} - body: requestParameters.{{paramName}}, + body: {{paramName}}, {{/isContainer}} {{^isContainer}} {{^isPrimitiveType}} - body: requestParameters.{{paramName}}, + body: {{paramName}}, {{/isPrimitiveType}} {{#isPrimitiveType}} - body: requestParameters.{{paramName}} as any, + body: {{paramName}} as any, {{/isPrimitiveType}} {{/isContainer}} {{/bodyParam}} diff --git a/modules/openapi-generator/src/main/resources/typescript-rxjs/paramNamePartial.mustache b/modules/openapi-generator/src/main/resources/typescript-rxjs/paramNamePartial.mustache new file mode 100644 index 00000000000..d406033c593 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/typescript-rxjs/paramNamePartial.mustache @@ -0,0 +1,2 @@ +{{! helper to output the alias of a parameter if provided and to not clutter the main template }} +{{#vendorExtensions.paramNameAlternative}}{{vendorExtensions.paramNameAlternative}}{{/vendorExtensions.paramNameAlternative}}{{^vendorExtensions.paramNameAlternative}}{{paramName}}{{/vendorExtensions.paramNameAlternative}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/typescript-rxjs/runtime.mustache b/modules/openapi-generator/src/main/resources/typescript-rxjs/runtime.mustache index 7c58be70a52..a978bd7d2cc 100644 --- a/modules/openapi-generator/src/main/resources/typescript-rxjs/runtime.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-rxjs/runtime.mustache @@ -36,18 +36,12 @@ export class Configuration { get apiKey(): ((name: string) => string) | undefined { const apiKey = this.configuration.apiKey; - if (apiKey) { - return typeof apiKey === 'function' ? apiKey : () => apiKey; - } - return undefined; + return apiKey && (typeof apiKey === 'function' ? apiKey : () => apiKey); } get accessToken(): ((name: string, scopes?: string[]) => string) | undefined { const accessToken = this.configuration.accessToken; - if (accessToken) { - return typeof accessToken === 'function' ? accessToken : () => accessToken; - } - return undefined; + return accessToken && (typeof accessToken === 'function' ? accessToken : () => accessToken); } } @@ -61,17 +55,17 @@ export class BaseAPI { this.middleware = configuration.middleware; } - withMiddleware = (middlewares: Middleware[]) => { - const next = this.clone(); + withMiddleware = (middlewares: Middleware[]) => { + const next = this.clone(); next.middleware = next.middleware.concat(middlewares); return next; }; - withPreMiddleware = (preMiddlewares: Array) => - this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); + withPreMiddleware = (preMiddlewares: Array) => + this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); - withPostMiddleware = (postMiddlewares: Array) => - this.withMiddleware(postMiddlewares.map((post) => ({ post }))); + withPostMiddleware = (postMiddlewares: Array) => + this.withMiddleware(postMiddlewares.map((post) => ({ post }))); protected request = (requestOpts: RequestOpts): Observable => this.rxjsRequest(this.createRequestArgs(requestOpts)).pipe( @@ -121,11 +115,14 @@ export class BaseAPI { * Create a shallow clone of `this` by constructing a new instance * and then shallow cloning data members. */ - private clone = (): T => + private clone = (): BaseAPI => Object.assign(Object.create(Object.getPrototypeOf(this)), this); } -// export for not being a breaking change +/** + * @deprecated + * export for not being a breaking change + */ export class RequiredError extends Error { name: 'RequiredError' = 'RequiredError'; } @@ -142,7 +139,6 @@ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' export type HttpHeaders = { [key: string]: string }; export type HttpQuery = Partial<{ [key: string]: string | number | null | boolean | Array }>; // partial is needed for strict mode export type HttpBody = Json | FormData; -export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original'; export interface RequestOpts { path: string; @@ -167,12 +163,21 @@ const queryString = (params: HttpQuery): string => Object.keys(params) // alias fallback for not being a breaking change export const querystring = queryString; +/** + * @deprecated + */ export const throwIfRequired = (params: {[key: string]: any}, key: string, nickname: string) => { - if (!params || params[key] === null || params[key] === undefined) { + if (!params || params[key] == null) { throw new RequiredError(`Required parameter ${key} was null or undefined when calling ${nickname}.`); } }; +export const throwIfNullOrUndefined = (value: any, nickname?: string) => { + if (value == null) { + throw new Error(`Parameter "${value}" was null or undefined when calling "${nickname}".`); + } +}; + // alias for easier importing export interface RequestArgs extends AjaxRequest {} export interface ResponseArgs extends AjaxResponse {} diff --git a/samples/client/petstore/typescript-rxjs/builds/default/apis/PetApi.ts b/samples/client/petstore/typescript-rxjs/builds/default/apis/PetApi.ts index a5328a8c728..3b3232c44db 100644 --- a/samples/client/petstore/typescript-rxjs/builds/default/apis/PetApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/default/apis/PetApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI, COLLECTION_FORMATS } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI, COLLECTION_FORMATS } from '../runtime'; import { ApiResponse, Pet, @@ -63,45 +63,47 @@ export class PetApi extends BaseAPI { /** * Add a new pet to the store */ - addPet = (requestParameters: AddPetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'addPet'); + addPet = ({ body }: AddPetRequest): Observable => { + throwIfNullOrUndefined(body, 'addPet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Deletes a pet */ - deletePet = (requestParameters: DeletePetRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'deletePet'); + deletePet = ({ petId, apiKey }: DeletePetRequest): Observable => { + throwIfNullOrUndefined(petId, 'deletePet'); const headers: HttpHeaders = { - ...(requestParameters.apiKey && { 'api_key': String(requestParameters.apiKey) }), + ...(apiKey != null ? { 'api_key': String(apiKey) } : undefined), // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'DELETE', headers, }); @@ -111,20 +113,21 @@ export class PetApi extends BaseAPI { * Multiple status values can be provided with comma separated strings * Finds Pets by status */ - findPetsByStatus = (requestParameters: FindPetsByStatusRequest): Observable> => { - throwIfRequired(requestParameters, 'status', 'findPetsByStatus'); + findPetsByStatus = ({ status }: FindPetsByStatusRequest): Observable> => { + throwIfNullOrUndefined(status, 'findPetsByStatus'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.status && { 'status': requestParameters.status.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'status': status.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -139,20 +142,21 @@ export class PetApi extends BaseAPI { * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. * Finds Pets by tags */ - findPetsByTags = (requestParameters: FindPetsByTagsRequest): Observable> => { - throwIfRequired(requestParameters, 'tags', 'findPetsByTags'); + findPetsByTags = ({ tags }: FindPetsByTagsRequest): Observable> => { + throwIfNullOrUndefined(tags, 'findPetsByTags'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.tags && { 'tags': requestParameters.tags.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'tags': tags.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -167,15 +171,15 @@ export class PetApi extends BaseAPI { * Returns a single pet * Find pet by ID */ - getPetById = (requestParameters: GetPetByIdRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'getPetById'); + getPetById = ({ petId }: GetPetByIdRequest): Observable => { + throwIfNullOrUndefined(petId, 'getPetById'); const headers: HttpHeaders = { ...(this.configuration.apiKey && { 'api_key': this.configuration.apiKey('api_key') }), // api_key authentication }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'GET', headers, }); @@ -184,53 +188,50 @@ export class PetApi extends BaseAPI { /** * Update an existing pet */ - updatePet = (requestParameters: UpdatePetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'updatePet'); + updatePet = ({ body }: UpdatePetRequest): Observable => { + throwIfNullOrUndefined(body, 'updatePet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; /** * Updates a pet in the store with form data */ - updatePetWithForm = (requestParameters: UpdatePetWithFormRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'updatePetWithForm'); + updatePetWithForm = ({ petId, name, status }: UpdatePetWithFormRequest): Observable => { + throwIfNullOrUndefined(petId, 'updatePetWithForm'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.name !== undefined) { - formData.append('name', requestParameters.name as any); - } - - if (requestParameters.status !== undefined) { - formData.append('status', requestParameters.status as any); - } + if (name !== undefined) { formData.append('name', name as any); } + if (status !== undefined) { formData.append('status', status as any); } return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, @@ -240,29 +241,25 @@ export class PetApi extends BaseAPI { /** * uploads an image */ - uploadFile = (requestParameters: UploadFileRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'uploadFile'); + uploadFile = ({ petId, additionalMetadata, file }: UploadFileRequest): Observable => { + throwIfNullOrUndefined(petId, 'uploadFile'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.additionalMetadata !== undefined) { - formData.append('additionalMetadata', requestParameters.additionalMetadata as any); - } - - if (requestParameters.file !== undefined) { - formData.append('file', requestParameters.file as any); - } + if (additionalMetadata !== undefined) { formData.append('additionalMetadata', additionalMetadata as any); } + if (file !== undefined) { formData.append('file', file as any); } return this.request({ - path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, diff --git a/samples/client/petstore/typescript-rxjs/builds/default/apis/StoreApi.ts b/samples/client/petstore/typescript-rxjs/builds/default/apis/StoreApi.ts index 623b48bdede..aac36206d60 100644 --- a/samples/client/petstore/typescript-rxjs/builds/default/apis/StoreApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/default/apis/StoreApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { Order, } from '../models'; @@ -38,11 +38,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * Delete purchase order by ID */ - deleteOrder = (requestParameters: DeleteOrderRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'deleteOrder'); + deleteOrder = ({ orderId }: DeleteOrderRequest): Observable => { + throwIfNullOrUndefined(orderId, 'deleteOrder'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'DELETE', }); }; @@ -67,11 +67,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * Find purchase order by ID */ - getOrderById = (requestParameters: GetOrderByIdRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'getOrderById'); + getOrderById = ({ orderId }: GetOrderByIdRequest): Observable => { + throwIfNullOrUndefined(orderId, 'getOrderById'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'GET', }); }; @@ -79,8 +79,8 @@ export class StoreApi extends BaseAPI { /** * Place an order for a pet */ - placeOrder = (requestParameters: PlaceOrderRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'placeOrder'); + placeOrder = ({ body }: PlaceOrderRequest): Observable => { + throwIfNullOrUndefined(body, 'placeOrder'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -90,7 +90,7 @@ export class StoreApi extends BaseAPI { path: '/store/order', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/default/apis/UserApi.ts b/samples/client/petstore/typescript-rxjs/builds/default/apis/UserApi.ts index 2194fdfe9f6..1b3c07eea4f 100644 --- a/samples/client/petstore/typescript-rxjs/builds/default/apis/UserApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/default/apis/UserApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { User, } from '../models'; @@ -56,8 +56,8 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Create user */ - createUser = (requestParameters: CreateUserRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUser'); + createUser = ({ body }: CreateUserRequest): Observable => { + throwIfNullOrUndefined(body, 'createUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -67,15 +67,15 @@ export class UserApi extends BaseAPI { path: '/user', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithArrayInput = (requestParameters: CreateUsersWithArrayInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithArrayInput'); + createUsersWithArrayInput = ({ body }: CreateUsersWithArrayInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithArrayInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -85,15 +85,15 @@ export class UserApi extends BaseAPI { path: '/user/createWithArray', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithListInput = (requestParameters: CreateUsersWithListInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithListInput'); + createUsersWithListInput = ({ body }: CreateUsersWithListInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithListInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -103,7 +103,7 @@ export class UserApi extends BaseAPI { path: '/user/createWithList', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; @@ -111,11 +111,11 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Delete user */ - deleteUser = (requestParameters: DeleteUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'deleteUser'); + deleteUser = ({ username }: DeleteUserRequest): Observable => { + throwIfNullOrUndefined(username, 'deleteUser'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'DELETE', }); }; @@ -123,11 +123,11 @@ export class UserApi extends BaseAPI { /** * Get user by user name */ - getUserByName = (requestParameters: GetUserByNameRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'getUserByName'); + getUserByName = ({ username }: GetUserByNameRequest): Observable => { + throwIfNullOrUndefined(username, 'getUserByName'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'GET', }); }; @@ -135,13 +135,13 @@ export class UserApi extends BaseAPI { /** * Logs user into the system */ - loginUser = (requestParameters: LoginUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'loginUser'); - throwIfRequired(requestParameters, 'password', 'loginUser'); + loginUser = ({ username, password }: LoginUserRequest): Observable => { + throwIfNullOrUndefined(username, 'loginUser'); + throwIfNullOrUndefined(password, 'loginUser'); - const query: HttpQuery = { - ...(requestParameters.username && { 'username': requestParameters.username }), - ...(requestParameters.password && { 'password': requestParameters.password }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'username': username, + 'password': password, }; return this.request({ @@ -165,19 +165,19 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Updated user */ - updateUser = (requestParameters: UpdateUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'updateUser'); - throwIfRequired(requestParameters, 'body', 'updateUser'); + updateUser = ({ username, body }: UpdateUserRequest): Observable => { + throwIfNullOrUndefined(username, 'updateUser'); + throwIfNullOrUndefined(body, 'updateUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', }; return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/default/runtime.ts b/samples/client/petstore/typescript-rxjs/builds/default/runtime.ts index e71a012b04b..40d2e7b3947 100644 --- a/samples/client/petstore/typescript-rxjs/builds/default/runtime.ts +++ b/samples/client/petstore/typescript-rxjs/builds/default/runtime.ts @@ -47,18 +47,12 @@ export class Configuration { get apiKey(): ((name: string) => string) | undefined { const apiKey = this.configuration.apiKey; - if (apiKey) { - return typeof apiKey === 'function' ? apiKey : () => apiKey; - } - return undefined; + return apiKey && (typeof apiKey === 'function' ? apiKey : () => apiKey); } get accessToken(): ((name: string, scopes?: string[]) => string) | undefined { const accessToken = this.configuration.accessToken; - if (accessToken) { - return typeof accessToken === 'function' ? accessToken : () => accessToken; - } - return undefined; + return accessToken && (typeof accessToken === 'function' ? accessToken : () => accessToken); } } @@ -72,17 +66,17 @@ export class BaseAPI { this.middleware = configuration.middleware; } - withMiddleware = (middlewares: Middleware[]) => { - const next = this.clone(); + withMiddleware = (middlewares: Middleware[]) => { + const next = this.clone(); next.middleware = next.middleware.concat(middlewares); return next; }; - withPreMiddleware = (preMiddlewares: Array) => - this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); + withPreMiddleware = (preMiddlewares: Array) => + this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); - withPostMiddleware = (postMiddlewares: Array) => - this.withMiddleware(postMiddlewares.map((post) => ({ post }))); + withPostMiddleware = (postMiddlewares: Array) => + this.withMiddleware(postMiddlewares.map((post) => ({ post }))); protected request = (requestOpts: RequestOpts): Observable => this.rxjsRequest(this.createRequestArgs(requestOpts)).pipe( @@ -132,11 +126,14 @@ export class BaseAPI { * Create a shallow clone of `this` by constructing a new instance * and then shallow cloning data members. */ - private clone = (): T => + private clone = (): BaseAPI => Object.assign(Object.create(Object.getPrototypeOf(this)), this); } -// export for not being a breaking change +/** + * @deprecated + * export for not being a breaking change + */ export class RequiredError extends Error { name: 'RequiredError' = 'RequiredError'; } @@ -153,7 +150,6 @@ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' export type HttpHeaders = { [key: string]: string }; export type HttpQuery = Partial<{ [key: string]: string | number | null | boolean | Array }>; // partial is needed for strict mode export type HttpBody = Json | FormData; -export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original'; export interface RequestOpts { path: string; @@ -178,12 +174,21 @@ const queryString = (params: HttpQuery): string => Object.keys(params) // alias fallback for not being a breaking change export const querystring = queryString; +/** + * @deprecated + */ export const throwIfRequired = (params: {[key: string]: any}, key: string, nickname: string) => { - if (!params || params[key] === null || params[key] === undefined) { + if (!params || params[key] == null) { throw new RequiredError(`Required parameter ${key} was null or undefined when calling ${nickname}.`); } }; +export const throwIfNullOrUndefined = (value: any, nickname?: string) => { + if (value == null) { + throw new Error(`Parameter "${value}" was null or undefined when calling "${nickname}".`); + } +}; + // alias for easier importing export interface RequestArgs extends AjaxRequest {} export interface ResponseArgs extends AjaxResponse {} diff --git a/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/PetApi.ts b/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/PetApi.ts index a5328a8c728..3b3232c44db 100644 --- a/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/PetApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/PetApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI, COLLECTION_FORMATS } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI, COLLECTION_FORMATS } from '../runtime'; import { ApiResponse, Pet, @@ -63,45 +63,47 @@ export class PetApi extends BaseAPI { /** * Add a new pet to the store */ - addPet = (requestParameters: AddPetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'addPet'); + addPet = ({ body }: AddPetRequest): Observable => { + throwIfNullOrUndefined(body, 'addPet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Deletes a pet */ - deletePet = (requestParameters: DeletePetRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'deletePet'); + deletePet = ({ petId, apiKey }: DeletePetRequest): Observable => { + throwIfNullOrUndefined(petId, 'deletePet'); const headers: HttpHeaders = { - ...(requestParameters.apiKey && { 'api_key': String(requestParameters.apiKey) }), + ...(apiKey != null ? { 'api_key': String(apiKey) } : undefined), // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'DELETE', headers, }); @@ -111,20 +113,21 @@ export class PetApi extends BaseAPI { * Multiple status values can be provided with comma separated strings * Finds Pets by status */ - findPetsByStatus = (requestParameters: FindPetsByStatusRequest): Observable> => { - throwIfRequired(requestParameters, 'status', 'findPetsByStatus'); + findPetsByStatus = ({ status }: FindPetsByStatusRequest): Observable> => { + throwIfNullOrUndefined(status, 'findPetsByStatus'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.status && { 'status': requestParameters.status.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'status': status.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -139,20 +142,21 @@ export class PetApi extends BaseAPI { * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. * Finds Pets by tags */ - findPetsByTags = (requestParameters: FindPetsByTagsRequest): Observable> => { - throwIfRequired(requestParameters, 'tags', 'findPetsByTags'); + findPetsByTags = ({ tags }: FindPetsByTagsRequest): Observable> => { + throwIfNullOrUndefined(tags, 'findPetsByTags'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.tags && { 'tags': requestParameters.tags.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'tags': tags.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -167,15 +171,15 @@ export class PetApi extends BaseAPI { * Returns a single pet * Find pet by ID */ - getPetById = (requestParameters: GetPetByIdRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'getPetById'); + getPetById = ({ petId }: GetPetByIdRequest): Observable => { + throwIfNullOrUndefined(petId, 'getPetById'); const headers: HttpHeaders = { ...(this.configuration.apiKey && { 'api_key': this.configuration.apiKey('api_key') }), // api_key authentication }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'GET', headers, }); @@ -184,53 +188,50 @@ export class PetApi extends BaseAPI { /** * Update an existing pet */ - updatePet = (requestParameters: UpdatePetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'updatePet'); + updatePet = ({ body }: UpdatePetRequest): Observable => { + throwIfNullOrUndefined(body, 'updatePet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; /** * Updates a pet in the store with form data */ - updatePetWithForm = (requestParameters: UpdatePetWithFormRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'updatePetWithForm'); + updatePetWithForm = ({ petId, name, status }: UpdatePetWithFormRequest): Observable => { + throwIfNullOrUndefined(petId, 'updatePetWithForm'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.name !== undefined) { - formData.append('name', requestParameters.name as any); - } - - if (requestParameters.status !== undefined) { - formData.append('status', requestParameters.status as any); - } + if (name !== undefined) { formData.append('name', name as any); } + if (status !== undefined) { formData.append('status', status as any); } return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, @@ -240,29 +241,25 @@ export class PetApi extends BaseAPI { /** * uploads an image */ - uploadFile = (requestParameters: UploadFileRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'uploadFile'); + uploadFile = ({ petId, additionalMetadata, file }: UploadFileRequest): Observable => { + throwIfNullOrUndefined(petId, 'uploadFile'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.additionalMetadata !== undefined) { - formData.append('additionalMetadata', requestParameters.additionalMetadata as any); - } - - if (requestParameters.file !== undefined) { - formData.append('file', requestParameters.file as any); - } + if (additionalMetadata !== undefined) { formData.append('additionalMetadata', additionalMetadata as any); } + if (file !== undefined) { formData.append('file', file as any); } return this.request({ - path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, diff --git a/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/StoreApi.ts b/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/StoreApi.ts index 623b48bdede..aac36206d60 100644 --- a/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/StoreApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/StoreApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { Order, } from '../models'; @@ -38,11 +38,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * Delete purchase order by ID */ - deleteOrder = (requestParameters: DeleteOrderRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'deleteOrder'); + deleteOrder = ({ orderId }: DeleteOrderRequest): Observable => { + throwIfNullOrUndefined(orderId, 'deleteOrder'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'DELETE', }); }; @@ -67,11 +67,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * Find purchase order by ID */ - getOrderById = (requestParameters: GetOrderByIdRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'getOrderById'); + getOrderById = ({ orderId }: GetOrderByIdRequest): Observable => { + throwIfNullOrUndefined(orderId, 'getOrderById'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'GET', }); }; @@ -79,8 +79,8 @@ export class StoreApi extends BaseAPI { /** * Place an order for a pet */ - placeOrder = (requestParameters: PlaceOrderRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'placeOrder'); + placeOrder = ({ body }: PlaceOrderRequest): Observable => { + throwIfNullOrUndefined(body, 'placeOrder'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -90,7 +90,7 @@ export class StoreApi extends BaseAPI { path: '/store/order', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/UserApi.ts b/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/UserApi.ts index 2194fdfe9f6..1b3c07eea4f 100644 --- a/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/UserApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/es6-target/apis/UserApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { User, } from '../models'; @@ -56,8 +56,8 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Create user */ - createUser = (requestParameters: CreateUserRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUser'); + createUser = ({ body }: CreateUserRequest): Observable => { + throwIfNullOrUndefined(body, 'createUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -67,15 +67,15 @@ export class UserApi extends BaseAPI { path: '/user', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithArrayInput = (requestParameters: CreateUsersWithArrayInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithArrayInput'); + createUsersWithArrayInput = ({ body }: CreateUsersWithArrayInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithArrayInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -85,15 +85,15 @@ export class UserApi extends BaseAPI { path: '/user/createWithArray', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithListInput = (requestParameters: CreateUsersWithListInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithListInput'); + createUsersWithListInput = ({ body }: CreateUsersWithListInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithListInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -103,7 +103,7 @@ export class UserApi extends BaseAPI { path: '/user/createWithList', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; @@ -111,11 +111,11 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Delete user */ - deleteUser = (requestParameters: DeleteUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'deleteUser'); + deleteUser = ({ username }: DeleteUserRequest): Observable => { + throwIfNullOrUndefined(username, 'deleteUser'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'DELETE', }); }; @@ -123,11 +123,11 @@ export class UserApi extends BaseAPI { /** * Get user by user name */ - getUserByName = (requestParameters: GetUserByNameRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'getUserByName'); + getUserByName = ({ username }: GetUserByNameRequest): Observable => { + throwIfNullOrUndefined(username, 'getUserByName'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'GET', }); }; @@ -135,13 +135,13 @@ export class UserApi extends BaseAPI { /** * Logs user into the system */ - loginUser = (requestParameters: LoginUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'loginUser'); - throwIfRequired(requestParameters, 'password', 'loginUser'); + loginUser = ({ username, password }: LoginUserRequest): Observable => { + throwIfNullOrUndefined(username, 'loginUser'); + throwIfNullOrUndefined(password, 'loginUser'); - const query: HttpQuery = { - ...(requestParameters.username && { 'username': requestParameters.username }), - ...(requestParameters.password && { 'password': requestParameters.password }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'username': username, + 'password': password, }; return this.request({ @@ -165,19 +165,19 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Updated user */ - updateUser = (requestParameters: UpdateUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'updateUser'); - throwIfRequired(requestParameters, 'body', 'updateUser'); + updateUser = ({ username, body }: UpdateUserRequest): Observable => { + throwIfNullOrUndefined(username, 'updateUser'); + throwIfNullOrUndefined(body, 'updateUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', }; return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/es6-target/runtime.ts b/samples/client/petstore/typescript-rxjs/builds/es6-target/runtime.ts index e71a012b04b..40d2e7b3947 100644 --- a/samples/client/petstore/typescript-rxjs/builds/es6-target/runtime.ts +++ b/samples/client/petstore/typescript-rxjs/builds/es6-target/runtime.ts @@ -47,18 +47,12 @@ export class Configuration { get apiKey(): ((name: string) => string) | undefined { const apiKey = this.configuration.apiKey; - if (apiKey) { - return typeof apiKey === 'function' ? apiKey : () => apiKey; - } - return undefined; + return apiKey && (typeof apiKey === 'function' ? apiKey : () => apiKey); } get accessToken(): ((name: string, scopes?: string[]) => string) | undefined { const accessToken = this.configuration.accessToken; - if (accessToken) { - return typeof accessToken === 'function' ? accessToken : () => accessToken; - } - return undefined; + return accessToken && (typeof accessToken === 'function' ? accessToken : () => accessToken); } } @@ -72,17 +66,17 @@ export class BaseAPI { this.middleware = configuration.middleware; } - withMiddleware = (middlewares: Middleware[]) => { - const next = this.clone(); + withMiddleware = (middlewares: Middleware[]) => { + const next = this.clone(); next.middleware = next.middleware.concat(middlewares); return next; }; - withPreMiddleware = (preMiddlewares: Array) => - this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); + withPreMiddleware = (preMiddlewares: Array) => + this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); - withPostMiddleware = (postMiddlewares: Array) => - this.withMiddleware(postMiddlewares.map((post) => ({ post }))); + withPostMiddleware = (postMiddlewares: Array) => + this.withMiddleware(postMiddlewares.map((post) => ({ post }))); protected request = (requestOpts: RequestOpts): Observable => this.rxjsRequest(this.createRequestArgs(requestOpts)).pipe( @@ -132,11 +126,14 @@ export class BaseAPI { * Create a shallow clone of `this` by constructing a new instance * and then shallow cloning data members. */ - private clone = (): T => + private clone = (): BaseAPI => Object.assign(Object.create(Object.getPrototypeOf(this)), this); } -// export for not being a breaking change +/** + * @deprecated + * export for not being a breaking change + */ export class RequiredError extends Error { name: 'RequiredError' = 'RequiredError'; } @@ -153,7 +150,6 @@ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' export type HttpHeaders = { [key: string]: string }; export type HttpQuery = Partial<{ [key: string]: string | number | null | boolean | Array }>; // partial is needed for strict mode export type HttpBody = Json | FormData; -export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original'; export interface RequestOpts { path: string; @@ -178,12 +174,21 @@ const queryString = (params: HttpQuery): string => Object.keys(params) // alias fallback for not being a breaking change export const querystring = queryString; +/** + * @deprecated + */ export const throwIfRequired = (params: {[key: string]: any}, key: string, nickname: string) => { - if (!params || params[key] === null || params[key] === undefined) { + if (!params || params[key] == null) { throw new RequiredError(`Required parameter ${key} was null or undefined when calling ${nickname}.`); } }; +export const throwIfNullOrUndefined = (value: any, nickname?: string) => { + if (value == null) { + throw new Error(`Parameter "${value}" was null or undefined when calling "${nickname}".`); + } +}; + // alias for easier importing export interface RequestArgs extends AjaxRequest {} export interface ResponseArgs extends AjaxResponse {} diff --git a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/PetApi.ts b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/PetApi.ts index a5328a8c728..3b3232c44db 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/PetApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/PetApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI, COLLECTION_FORMATS } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI, COLLECTION_FORMATS } from '../runtime'; import { ApiResponse, Pet, @@ -63,45 +63,47 @@ export class PetApi extends BaseAPI { /** * Add a new pet to the store */ - addPet = (requestParameters: AddPetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'addPet'); + addPet = ({ body }: AddPetRequest): Observable => { + throwIfNullOrUndefined(body, 'addPet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Deletes a pet */ - deletePet = (requestParameters: DeletePetRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'deletePet'); + deletePet = ({ petId, apiKey }: DeletePetRequest): Observable => { + throwIfNullOrUndefined(petId, 'deletePet'); const headers: HttpHeaders = { - ...(requestParameters.apiKey && { 'api_key': String(requestParameters.apiKey) }), + ...(apiKey != null ? { 'api_key': String(apiKey) } : undefined), // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'DELETE', headers, }); @@ -111,20 +113,21 @@ export class PetApi extends BaseAPI { * Multiple status values can be provided with comma separated strings * Finds Pets by status */ - findPetsByStatus = (requestParameters: FindPetsByStatusRequest): Observable> => { - throwIfRequired(requestParameters, 'status', 'findPetsByStatus'); + findPetsByStatus = ({ status }: FindPetsByStatusRequest): Observable> => { + throwIfNullOrUndefined(status, 'findPetsByStatus'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.status && { 'status': requestParameters.status.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'status': status.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -139,20 +142,21 @@ export class PetApi extends BaseAPI { * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. * Finds Pets by tags */ - findPetsByTags = (requestParameters: FindPetsByTagsRequest): Observable> => { - throwIfRequired(requestParameters, 'tags', 'findPetsByTags'); + findPetsByTags = ({ tags }: FindPetsByTagsRequest): Observable> => { + throwIfNullOrUndefined(tags, 'findPetsByTags'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.tags && { 'tags': requestParameters.tags.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'tags': tags.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -167,15 +171,15 @@ export class PetApi extends BaseAPI { * Returns a single pet * Find pet by ID */ - getPetById = (requestParameters: GetPetByIdRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'getPetById'); + getPetById = ({ petId }: GetPetByIdRequest): Observable => { + throwIfNullOrUndefined(petId, 'getPetById'); const headers: HttpHeaders = { ...(this.configuration.apiKey && { 'api_key': this.configuration.apiKey('api_key') }), // api_key authentication }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'GET', headers, }); @@ -184,53 +188,50 @@ export class PetApi extends BaseAPI { /** * Update an existing pet */ - updatePet = (requestParameters: UpdatePetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'updatePet'); + updatePet = ({ body }: UpdatePetRequest): Observable => { + throwIfNullOrUndefined(body, 'updatePet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; /** * Updates a pet in the store with form data */ - updatePetWithForm = (requestParameters: UpdatePetWithFormRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'updatePetWithForm'); + updatePetWithForm = ({ petId, name, status }: UpdatePetWithFormRequest): Observable => { + throwIfNullOrUndefined(petId, 'updatePetWithForm'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.name !== undefined) { - formData.append('name', requestParameters.name as any); - } - - if (requestParameters.status !== undefined) { - formData.append('status', requestParameters.status as any); - } + if (name !== undefined) { formData.append('name', name as any); } + if (status !== undefined) { formData.append('status', status as any); } return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, @@ -240,29 +241,25 @@ export class PetApi extends BaseAPI { /** * uploads an image */ - uploadFile = (requestParameters: UploadFileRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'uploadFile'); + uploadFile = ({ petId, additionalMetadata, file }: UploadFileRequest): Observable => { + throwIfNullOrUndefined(petId, 'uploadFile'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.additionalMetadata !== undefined) { - formData.append('additionalMetadata', requestParameters.additionalMetadata as any); - } - - if (requestParameters.file !== undefined) { - formData.append('file', requestParameters.file as any); - } + if (additionalMetadata !== undefined) { formData.append('additionalMetadata', additionalMetadata as any); } + if (file !== undefined) { formData.append('file', file as any); } return this.request({ - path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, diff --git a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/StoreApi.ts b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/StoreApi.ts index 623b48bdede..aac36206d60 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/StoreApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/StoreApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { Order, } from '../models'; @@ -38,11 +38,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * Delete purchase order by ID */ - deleteOrder = (requestParameters: DeleteOrderRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'deleteOrder'); + deleteOrder = ({ orderId }: DeleteOrderRequest): Observable => { + throwIfNullOrUndefined(orderId, 'deleteOrder'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'DELETE', }); }; @@ -67,11 +67,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * Find purchase order by ID */ - getOrderById = (requestParameters: GetOrderByIdRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'getOrderById'); + getOrderById = ({ orderId }: GetOrderByIdRequest): Observable => { + throwIfNullOrUndefined(orderId, 'getOrderById'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'GET', }); }; @@ -79,8 +79,8 @@ export class StoreApi extends BaseAPI { /** * Place an order for a pet */ - placeOrder = (requestParameters: PlaceOrderRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'placeOrder'); + placeOrder = ({ body }: PlaceOrderRequest): Observable => { + throwIfNullOrUndefined(body, 'placeOrder'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -90,7 +90,7 @@ export class StoreApi extends BaseAPI { path: '/store/order', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/UserApi.ts b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/UserApi.ts index 2194fdfe9f6..1b3c07eea4f 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/UserApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/apis/UserApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { User, } from '../models'; @@ -56,8 +56,8 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Create user */ - createUser = (requestParameters: CreateUserRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUser'); + createUser = ({ body }: CreateUserRequest): Observable => { + throwIfNullOrUndefined(body, 'createUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -67,15 +67,15 @@ export class UserApi extends BaseAPI { path: '/user', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithArrayInput = (requestParameters: CreateUsersWithArrayInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithArrayInput'); + createUsersWithArrayInput = ({ body }: CreateUsersWithArrayInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithArrayInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -85,15 +85,15 @@ export class UserApi extends BaseAPI { path: '/user/createWithArray', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithListInput = (requestParameters: CreateUsersWithListInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithListInput'); + createUsersWithListInput = ({ body }: CreateUsersWithListInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithListInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -103,7 +103,7 @@ export class UserApi extends BaseAPI { path: '/user/createWithList', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; @@ -111,11 +111,11 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Delete user */ - deleteUser = (requestParameters: DeleteUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'deleteUser'); + deleteUser = ({ username }: DeleteUserRequest): Observable => { + throwIfNullOrUndefined(username, 'deleteUser'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'DELETE', }); }; @@ -123,11 +123,11 @@ export class UserApi extends BaseAPI { /** * Get user by user name */ - getUserByName = (requestParameters: GetUserByNameRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'getUserByName'); + getUserByName = ({ username }: GetUserByNameRequest): Observable => { + throwIfNullOrUndefined(username, 'getUserByName'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'GET', }); }; @@ -135,13 +135,13 @@ export class UserApi extends BaseAPI { /** * Logs user into the system */ - loginUser = (requestParameters: LoginUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'loginUser'); - throwIfRequired(requestParameters, 'password', 'loginUser'); + loginUser = ({ username, password }: LoginUserRequest): Observable => { + throwIfNullOrUndefined(username, 'loginUser'); + throwIfNullOrUndefined(password, 'loginUser'); - const query: HttpQuery = { - ...(requestParameters.username && { 'username': requestParameters.username }), - ...(requestParameters.password && { 'password': requestParameters.password }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'username': username, + 'password': password, }; return this.request({ @@ -165,19 +165,19 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Updated user */ - updateUser = (requestParameters: UpdateUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'updateUser'); - throwIfRequired(requestParameters, 'body', 'updateUser'); + updateUser = ({ username, body }: UpdateUserRequest): Observable => { + throwIfNullOrUndefined(username, 'updateUser'); + throwIfNullOrUndefined(body, 'updateUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', }; return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/runtime.ts b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/runtime.ts index e71a012b04b..40d2e7b3947 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-interfaces/runtime.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-interfaces/runtime.ts @@ -47,18 +47,12 @@ export class Configuration { get apiKey(): ((name: string) => string) | undefined { const apiKey = this.configuration.apiKey; - if (apiKey) { - return typeof apiKey === 'function' ? apiKey : () => apiKey; - } - return undefined; + return apiKey && (typeof apiKey === 'function' ? apiKey : () => apiKey); } get accessToken(): ((name: string, scopes?: string[]) => string) | undefined { const accessToken = this.configuration.accessToken; - if (accessToken) { - return typeof accessToken === 'function' ? accessToken : () => accessToken; - } - return undefined; + return accessToken && (typeof accessToken === 'function' ? accessToken : () => accessToken); } } @@ -72,17 +66,17 @@ export class BaseAPI { this.middleware = configuration.middleware; } - withMiddleware = (middlewares: Middleware[]) => { - const next = this.clone(); + withMiddleware = (middlewares: Middleware[]) => { + const next = this.clone(); next.middleware = next.middleware.concat(middlewares); return next; }; - withPreMiddleware = (preMiddlewares: Array) => - this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); + withPreMiddleware = (preMiddlewares: Array) => + this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); - withPostMiddleware = (postMiddlewares: Array) => - this.withMiddleware(postMiddlewares.map((post) => ({ post }))); + withPostMiddleware = (postMiddlewares: Array) => + this.withMiddleware(postMiddlewares.map((post) => ({ post }))); protected request = (requestOpts: RequestOpts): Observable => this.rxjsRequest(this.createRequestArgs(requestOpts)).pipe( @@ -132,11 +126,14 @@ export class BaseAPI { * Create a shallow clone of `this` by constructing a new instance * and then shallow cloning data members. */ - private clone = (): T => + private clone = (): BaseAPI => Object.assign(Object.create(Object.getPrototypeOf(this)), this); } -// export for not being a breaking change +/** + * @deprecated + * export for not being a breaking change + */ export class RequiredError extends Error { name: 'RequiredError' = 'RequiredError'; } @@ -153,7 +150,6 @@ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' export type HttpHeaders = { [key: string]: string }; export type HttpQuery = Partial<{ [key: string]: string | number | null | boolean | Array }>; // partial is needed for strict mode export type HttpBody = Json | FormData; -export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original'; export interface RequestOpts { path: string; @@ -178,12 +174,21 @@ const queryString = (params: HttpQuery): string => Object.keys(params) // alias fallback for not being a breaking change export const querystring = queryString; +/** + * @deprecated + */ export const throwIfRequired = (params: {[key: string]: any}, key: string, nickname: string) => { - if (!params || params[key] === null || params[key] === undefined) { + if (!params || params[key] == null) { throw new RequiredError(`Required parameter ${key} was null or undefined when calling ${nickname}.`); } }; +export const throwIfNullOrUndefined = (value: any, nickname?: string) => { + if (value == null) { + throw new Error(`Parameter "${value}" was null or undefined when calling "${nickname}".`); + } +}; + // alias for easier importing export interface RequestArgs extends AjaxRequest {} export interface ResponseArgs extends AjaxResponse {} diff --git a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/PetApi.ts b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/PetApi.ts index a5328a8c728..3b3232c44db 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/PetApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/PetApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI, COLLECTION_FORMATS } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI, COLLECTION_FORMATS } from '../runtime'; import { ApiResponse, Pet, @@ -63,45 +63,47 @@ export class PetApi extends BaseAPI { /** * Add a new pet to the store */ - addPet = (requestParameters: AddPetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'addPet'); + addPet = ({ body }: AddPetRequest): Observable => { + throwIfNullOrUndefined(body, 'addPet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Deletes a pet */ - deletePet = (requestParameters: DeletePetRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'deletePet'); + deletePet = ({ petId, apiKey }: DeletePetRequest): Observable => { + throwIfNullOrUndefined(petId, 'deletePet'); const headers: HttpHeaders = { - ...(requestParameters.apiKey && { 'api_key': String(requestParameters.apiKey) }), + ...(apiKey != null ? { 'api_key': String(apiKey) } : undefined), // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'DELETE', headers, }); @@ -111,20 +113,21 @@ export class PetApi extends BaseAPI { * Multiple status values can be provided with comma separated strings * Finds Pets by status */ - findPetsByStatus = (requestParameters: FindPetsByStatusRequest): Observable> => { - throwIfRequired(requestParameters, 'status', 'findPetsByStatus'); + findPetsByStatus = ({ status }: FindPetsByStatusRequest): Observable> => { + throwIfNullOrUndefined(status, 'findPetsByStatus'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.status && { 'status': requestParameters.status.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'status': status.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -139,20 +142,21 @@ export class PetApi extends BaseAPI { * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. * Finds Pets by tags */ - findPetsByTags = (requestParameters: FindPetsByTagsRequest): Observable> => { - throwIfRequired(requestParameters, 'tags', 'findPetsByTags'); + findPetsByTags = ({ tags }: FindPetsByTagsRequest): Observable> => { + throwIfNullOrUndefined(tags, 'findPetsByTags'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; - const query: HttpQuery = { - ...(requestParameters.tags && { 'tags': requestParameters.tags.join(COLLECTION_FORMATS['csv']) }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'tags': tags.join(COLLECTION_FORMATS['csv']), }; return this.request>({ @@ -167,15 +171,15 @@ export class PetApi extends BaseAPI { * Returns a single pet * Find pet by ID */ - getPetById = (requestParameters: GetPetByIdRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'getPetById'); + getPetById = ({ petId }: GetPetByIdRequest): Observable => { + throwIfNullOrUndefined(petId, 'getPetById'); const headers: HttpHeaders = { ...(this.configuration.apiKey && { 'api_key': this.configuration.apiKey('api_key') }), // api_key authentication }; return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'GET', headers, }); @@ -184,53 +188,50 @@ export class PetApi extends BaseAPI { /** * Update an existing pet */ - updatePet = (requestParameters: UpdatePetRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'updatePet'); + updatePet = ({ body }: UpdatePetRequest): Observable => { + throwIfNullOrUndefined(body, 'updatePet'); const headers: HttpHeaders = { 'Content-Type': 'application/json', // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; return this.request({ path: '/pet', method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; /** * Updates a pet in the store with form data */ - updatePetWithForm = (requestParameters: UpdatePetWithFormRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'updatePetWithForm'); + updatePetWithForm = ({ petId, name, status }: UpdatePetWithFormRequest): Observable => { + throwIfNullOrUndefined(petId, 'updatePetWithForm'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.name !== undefined) { - formData.append('name', requestParameters.name as any); - } - - if (requestParameters.status !== undefined) { - formData.append('status', requestParameters.status as any); - } + if (name !== undefined) { formData.append('name', name as any); } + if (status !== undefined) { formData.append('status', status as any); } return this.request({ - path: '/pet/{petId}'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, @@ -240,29 +241,25 @@ export class PetApi extends BaseAPI { /** * uploads an image */ - uploadFile = (requestParameters: UploadFileRequest): Observable => { - throwIfRequired(requestParameters, 'petId', 'uploadFile'); + uploadFile = ({ petId, additionalMetadata, file }: UploadFileRequest): Observable => { + throwIfNullOrUndefined(petId, 'uploadFile'); const headers: HttpHeaders = { // oauth required - ...(this.configuration.accessToken && { - Authorization: this.configuration.accessToken && (typeof this.configuration.accessToken === 'function' + ...(this.configuration.accessToken != null + ? { Authorization: typeof this.configuration.accessToken === 'function' ? this.configuration.accessToken('petstore_auth', ['write:pets', 'read:pets']) - : this.configuration.accessToken) - }), + : this.configuration.accessToken } + : undefined + ), }; const formData = new FormData(); - if (requestParameters.additionalMetadata !== undefined) { - formData.append('additionalMetadata', requestParameters.additionalMetadata as any); - } - - if (requestParameters.file !== undefined) { - formData.append('file', requestParameters.file as any); - } + if (additionalMetadata !== undefined) { formData.append('additionalMetadata', additionalMetadata as any); } + if (file !== undefined) { formData.append('file', file as any); } return this.request({ - path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(requestParameters.petId)), + path: '/pet/{petId}/uploadImage'.replace('{petId}', encodeURI(petId)), method: 'POST', headers, body: formData, diff --git a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/StoreApi.ts b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/StoreApi.ts index 623b48bdede..aac36206d60 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/StoreApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/StoreApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { Order, } from '../models'; @@ -38,11 +38,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * Delete purchase order by ID */ - deleteOrder = (requestParameters: DeleteOrderRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'deleteOrder'); + deleteOrder = ({ orderId }: DeleteOrderRequest): Observable => { + throwIfNullOrUndefined(orderId, 'deleteOrder'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'DELETE', }); }; @@ -67,11 +67,11 @@ export class StoreApi extends BaseAPI { * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * Find purchase order by ID */ - getOrderById = (requestParameters: GetOrderByIdRequest): Observable => { - throwIfRequired(requestParameters, 'orderId', 'getOrderById'); + getOrderById = ({ orderId }: GetOrderByIdRequest): Observable => { + throwIfNullOrUndefined(orderId, 'getOrderById'); return this.request({ - path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(requestParameters.orderId)), + path: '/store/order/{orderId}'.replace('{orderId}', encodeURI(orderId)), method: 'GET', }); }; @@ -79,8 +79,8 @@ export class StoreApi extends BaseAPI { /** * Place an order for a pet */ - placeOrder = (requestParameters: PlaceOrderRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'placeOrder'); + placeOrder = ({ body }: PlaceOrderRequest): Observable => { + throwIfNullOrUndefined(body, 'placeOrder'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -90,7 +90,7 @@ export class StoreApi extends BaseAPI { path: '/store/order', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/UserApi.ts b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/UserApi.ts index 2194fdfe9f6..1b3c07eea4f 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/UserApi.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/apis/UserApi.ts @@ -12,7 +12,7 @@ */ import { Observable } from 'rxjs'; -import { BaseAPI, HttpHeaders, HttpQuery, throwIfRequired, encodeURI } from '../runtime'; +import { BaseAPI, HttpHeaders, HttpQuery, throwIfNullOrUndefined, encodeURI } from '../runtime'; import { User, } from '../models'; @@ -56,8 +56,8 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Create user */ - createUser = (requestParameters: CreateUserRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUser'); + createUser = ({ body }: CreateUserRequest): Observable => { + throwIfNullOrUndefined(body, 'createUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -67,15 +67,15 @@ export class UserApi extends BaseAPI { path: '/user', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithArrayInput = (requestParameters: CreateUsersWithArrayInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithArrayInput'); + createUsersWithArrayInput = ({ body }: CreateUsersWithArrayInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithArrayInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -85,15 +85,15 @@ export class UserApi extends BaseAPI { path: '/user/createWithArray', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; /** * Creates list of users with given input array */ - createUsersWithListInput = (requestParameters: CreateUsersWithListInputRequest): Observable => { - throwIfRequired(requestParameters, 'body', 'createUsersWithListInput'); + createUsersWithListInput = ({ body }: CreateUsersWithListInputRequest): Observable => { + throwIfNullOrUndefined(body, 'createUsersWithListInput'); const headers: HttpHeaders = { 'Content-Type': 'application/json', @@ -103,7 +103,7 @@ export class UserApi extends BaseAPI { path: '/user/createWithList', method: 'POST', headers, - body: requestParameters.body, + body: body, }); }; @@ -111,11 +111,11 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Delete user */ - deleteUser = (requestParameters: DeleteUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'deleteUser'); + deleteUser = ({ username }: DeleteUserRequest): Observable => { + throwIfNullOrUndefined(username, 'deleteUser'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'DELETE', }); }; @@ -123,11 +123,11 @@ export class UserApi extends BaseAPI { /** * Get user by user name */ - getUserByName = (requestParameters: GetUserByNameRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'getUserByName'); + getUserByName = ({ username }: GetUserByNameRequest): Observable => { + throwIfNullOrUndefined(username, 'getUserByName'); return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'GET', }); }; @@ -135,13 +135,13 @@ export class UserApi extends BaseAPI { /** * Logs user into the system */ - loginUser = (requestParameters: LoginUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'loginUser'); - throwIfRequired(requestParameters, 'password', 'loginUser'); + loginUser = ({ username, password }: LoginUserRequest): Observable => { + throwIfNullOrUndefined(username, 'loginUser'); + throwIfNullOrUndefined(password, 'loginUser'); - const query: HttpQuery = { - ...(requestParameters.username && { 'username': requestParameters.username }), - ...(requestParameters.password && { 'password': requestParameters.password }), + const query: HttpQuery = { // required parameters are used directly since they are already checked by throwIfNullOrUndefined + 'username': username, + 'password': password, }; return this.request({ @@ -165,19 +165,19 @@ export class UserApi extends BaseAPI { * This can only be done by the logged in user. * Updated user */ - updateUser = (requestParameters: UpdateUserRequest): Observable => { - throwIfRequired(requestParameters, 'username', 'updateUser'); - throwIfRequired(requestParameters, 'body', 'updateUser'); + updateUser = ({ username, body }: UpdateUserRequest): Observable => { + throwIfNullOrUndefined(username, 'updateUser'); + throwIfNullOrUndefined(body, 'updateUser'); const headers: HttpHeaders = { 'Content-Type': 'application/json', }; return this.request({ - path: '/user/{username}'.replace('{username}', encodeURI(requestParameters.username)), + path: '/user/{username}'.replace('{username}', encodeURI(username)), method: 'PUT', headers, - body: requestParameters.body, + body: body, }); }; diff --git a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/runtime.ts b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/runtime.ts index e71a012b04b..40d2e7b3947 100644 --- a/samples/client/petstore/typescript-rxjs/builds/with-npm-version/runtime.ts +++ b/samples/client/petstore/typescript-rxjs/builds/with-npm-version/runtime.ts @@ -47,18 +47,12 @@ export class Configuration { get apiKey(): ((name: string) => string) | undefined { const apiKey = this.configuration.apiKey; - if (apiKey) { - return typeof apiKey === 'function' ? apiKey : () => apiKey; - } - return undefined; + return apiKey && (typeof apiKey === 'function' ? apiKey : () => apiKey); } get accessToken(): ((name: string, scopes?: string[]) => string) | undefined { const accessToken = this.configuration.accessToken; - if (accessToken) { - return typeof accessToken === 'function' ? accessToken : () => accessToken; - } - return undefined; + return accessToken && (typeof accessToken === 'function' ? accessToken : () => accessToken); } } @@ -72,17 +66,17 @@ export class BaseAPI { this.middleware = configuration.middleware; } - withMiddleware = (middlewares: Middleware[]) => { - const next = this.clone(); + withMiddleware = (middlewares: Middleware[]) => { + const next = this.clone(); next.middleware = next.middleware.concat(middlewares); return next; }; - withPreMiddleware = (preMiddlewares: Array) => - this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); + withPreMiddleware = (preMiddlewares: Array) => + this.withMiddleware(preMiddlewares.map((pre) => ({ pre }))); - withPostMiddleware = (postMiddlewares: Array) => - this.withMiddleware(postMiddlewares.map((post) => ({ post }))); + withPostMiddleware = (postMiddlewares: Array) => + this.withMiddleware(postMiddlewares.map((post) => ({ post }))); protected request = (requestOpts: RequestOpts): Observable => this.rxjsRequest(this.createRequestArgs(requestOpts)).pipe( @@ -132,11 +126,14 @@ export class BaseAPI { * Create a shallow clone of `this` by constructing a new instance * and then shallow cloning data members. */ - private clone = (): T => + private clone = (): BaseAPI => Object.assign(Object.create(Object.getPrototypeOf(this)), this); } -// export for not being a breaking change +/** + * @deprecated + * export for not being a breaking change + */ export class RequiredError extends Error { name: 'RequiredError' = 'RequiredError'; } @@ -153,7 +150,6 @@ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' export type HttpHeaders = { [key: string]: string }; export type HttpQuery = Partial<{ [key: string]: string | number | null | boolean | Array }>; // partial is needed for strict mode export type HttpBody = Json | FormData; -export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original'; export interface RequestOpts { path: string; @@ -178,12 +174,21 @@ const queryString = (params: HttpQuery): string => Object.keys(params) // alias fallback for not being a breaking change export const querystring = queryString; +/** + * @deprecated + */ export const throwIfRequired = (params: {[key: string]: any}, key: string, nickname: string) => { - if (!params || params[key] === null || params[key] === undefined) { + if (!params || params[key] == null) { throw new RequiredError(`Required parameter ${key} was null or undefined when calling ${nickname}.`); } }; +export const throwIfNullOrUndefined = (value: any, nickname?: string) => { + if (value == null) { + throw new Error(`Parameter "${value}" was null or undefined when calling "${nickname}".`); + } +}; + // alias for easier importing export interface RequestArgs extends AjaxRequest {} export interface ResponseArgs extends AjaxResponse {}