From 6cdc1b5b8b7907b1e599c28fda126834e49dde47 Mon Sep 17 00:00:00 2001 From: Jan Marten Date: Thu, 2 Apr 2026 16:30:11 +0200 Subject: [PATCH 1/2] fix(typescript-angular): handle Set in query parameter serialization (#23434) --- .../api.base.service.mustache | 11 +++--- .../test/resources/3_0/query-param-form.yaml | 22 ++++++++++++ .../query-param-form/api.base.service.ts | 11 +++--- .../query-param-form/api/default.service.ts | 36 ++++++++++++++----- .../app/src/api.query_param_form.spec.ts | 25 +++++++++++++ 5 files changed, 87 insertions(+), 18 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/typescript-angular/api.base.service.mustache b/modules/openapi-generator/src/main/resources/typescript-angular/api.base.service.mustache index 0b5e7c8bcf2f..ed7a92be8bd2 100644 --- a/modules/openapi-generator/src/main/resources/typescript-angular/api.base.service.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-angular/api.base.service.mustache @@ -54,15 +54,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/modules/openapi-generator/src/test/resources/3_0/query-param-form.yaml b/modules/openapi-generator/src/test/resources/3_0/query-param-form.yaml index 4e1f69453b12..876d3bf7d94b 100644 --- a/modules/openapi-generator/src/test/resources/3_0/query-param-form.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/query-param-form.yaml @@ -33,6 +33,17 @@ paths: required: false schema: type: string + - in: query + name: tags + style: form + explode: true + description: Tags + required: false + schema: + type: array + items: + type: string + uniqueItems: true responses: '200': description: Ok @@ -71,6 +82,17 @@ paths: required: false schema: type: string + - in: query + name: tags + style: form + explode: false + description: Tags + required: false + schema: + type: array + items: + type: string + uniqueItems: true responses: '200': diff --git a/samples/client/others/typescript-angular-v20/builds/query-param-form/api.base.service.ts b/samples/client/others/typescript-angular-v20/builds/query-param-form/api.base.service.ts index 9ff18001be21..7801405134b7 100644 --- a/samples/client/others/typescript-angular-v20/builds/query-param-form/api.base.service.ts +++ b/samples/client/others/typescript-angular-v20/builds/query-param-form/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/others/typescript-angular-v20/builds/query-param-form/api/default.service.ts b/samples/client/others/typescript-angular-v20/builds/query-param-form/api/default.service.ts index 39e91beb7642..7359f92de421 100644 --- a/samples/client/others/typescript-angular-v20/builds/query-param-form/api/default.service.ts +++ b/samples/client/others/typescript-angular-v20/builds/query-param-form/api/default.service.ts @@ -42,14 +42,15 @@ export class DefaultService extends BaseService { * @param ids Ids * @param filter Filter * @param country Filter + * @param tags Tags * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. * @param options additional options */ - public searchExplode(ids?: Array, filter?: Filter, country?: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; - public searchExplode(ids?: Array, filter?: Filter, country?: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public searchExplode(ids?: Array, filter?: Filter, country?: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public searchExplode(ids?: Array, filter?: Filter, country?: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + public searchExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public searchExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public searchExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public searchExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { let localVarQueryParameters = new OpenApiHttpParams(this.encoder); @@ -80,6 +81,15 @@ export class DefaultService extends BaseService { ); + localVarQueryParameters = this.addToHttpParams( + localVarQueryParameters, + 'tags', + tags, + QueryParamStyle.Form, + true, + ); + + let localVarHeaders = this.defaultHeaders; const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([ @@ -126,14 +136,15 @@ export class DefaultService extends BaseService { * @param ids Ids * @param filter Filter * @param country Filter + * @param tags Tags * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. * @param options additional options */ - public searchNotExplode(ids?: Array, filter?: Filter, country?: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; - public searchNotExplode(ids?: Array, filter?: Filter, country?: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public searchNotExplode(ids?: Array, filter?: Filter, country?: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; - public searchNotExplode(ids?: Array, filter?: Filter, country?: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { + public searchNotExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable; + public searchNotExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public searchNotExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable>; + public searchNotExplode(ids?: Array, filter?: Filter, country?: string, tags?: Set, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable { let localVarQueryParameters = new OpenApiHttpParams(this.encoder); @@ -164,6 +175,15 @@ export class DefaultService extends BaseService { ); + localVarQueryParameters = this.addToHttpParams( + localVarQueryParameters, + 'tags', + tags, + QueryParamStyle.Form, + false, + ); + + let localVarHeaders = this.defaultHeaders; const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([ diff --git a/samples/client/others/typescript-angular-v20/projects/app/src/api.query_param_form.spec.ts b/samples/client/others/typescript-angular-v20/projects/app/src/api.query_param_form.spec.ts index 1ad044f71b55..d0994e2a8822 100644 --- a/samples/client/others/typescript-angular-v20/projects/app/src/api.query_param_form.spec.ts +++ b/samples/client/others/typescript-angular-v20/projects/app/src/api.query_param_form.spec.ts @@ -8,6 +8,7 @@ const ids: number[] = [4, 5]; const filter: Filter = {name: 'John', age: 37, nicknames: ['Joe', 'Joey']}; const filterWithSpecialCharacters: Filter = {name: 'Éléonore &,|+', age: 42, nicknames: ['Elé', 'Ellie']}; const country: string = "Belgium"; +const tags: Set = new Set(['a', 'b']); describe('Form Query Param testing', () => { let httpTesting: HttpTestingController; @@ -80,6 +81,18 @@ describe('Form Query Param testing', () => { expect(req.request.method).toEqual('GET'); }); + it('should separate the query parameter with ampersands (set only)', async () => { + service.searchExplode(undefined, undefined, undefined, tags).subscribe(); + const req = httpTesting.expectOne('http://localhost/search_explode?tags=a&tags=b'); + expect(req.request.method).toEqual('GET'); + }); + + it('should separate the query parameter with ampersands (all set including tags)', async () => { + service.searchExplode(ids, filter, country, tags).subscribe(); + const req = httpTesting.expectOne('http://localhost/search_explode?ids=4&ids=5&name=John&age=37&nicknames=Joe&nicknames=Joey&country=Belgium&tags=a&tags=b'); + expect(req.request.method).toEqual('GET'); + }); + it('should separate the query parameter with comma (all set)', async () => { service.searchNotExplode(ids, filter, country).subscribe(); const req = httpTesting.expectOne('http://localhost/search_not_explode?ids=4,5&filter=name,John,age,37,nicknames,Joe,Joey&country=Belgium'); @@ -126,4 +139,16 @@ describe('Form Query Param testing', () => { expect(req.request.method).toEqual('GET'); }); + it('should separate the query parameter with comma (set only)', async () => { + service.searchNotExplode(undefined, undefined, undefined, tags).subscribe(); + const req = httpTesting.expectOne('http://localhost/search_not_explode?tags=a,b'); + expect(req.request.method).toEqual('GET'); + }); + + it('should separate the query parameter with comma (all set including tags)', async () => { + service.searchNotExplode(ids, filter, country, tags).subscribe(); + const req = httpTesting.expectOne('http://localhost/search_not_explode?ids=4,5&filter=name,John,age,37,nicknames,Joe,Joey&country=Belgium&tags=a,b'); + expect(req.request.method).toEqual('GET'); + }); + }); From efab0a870c94d3e5611e2f7b2a1e5f423ca4a711 Mon Sep 17 00:00:00 2001 From: Jan Marten Date: Wed, 8 Apr 2026 07:31:24 +0200 Subject: [PATCH 2/2] Update sample files --- .../query-param-deep-object/api.base.service.ts | 11 ++++++----- .../builds/query-param-json/api.base.service.ts | 11 ++++++----- .../api.base.service.ts | 11 ++++++----- .../builds/composed-schemas/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- .../builds/default/api.base.service.ts | 11 ++++++----- 14 files changed, 84 insertions(+), 70 deletions(-) diff --git a/samples/client/others/typescript-angular-v20/builds/query-param-deep-object/api.base.service.ts b/samples/client/others/typescript-angular-v20/builds/query-param-deep-object/api.base.service.ts index 8158930d1326..1b63f4457d9c 100644 --- a/samples/client/others/typescript-angular-v20/builds/query-param-deep-object/api.base.service.ts +++ b/samples/client/others/typescript-angular-v20/builds/query-param-deep-object/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/others/typescript-angular-v20/builds/query-param-json/api.base.service.ts b/samples/client/others/typescript-angular-v20/builds/query-param-json/api.base.service.ts index 70c3d4896bac..56df5e8f84b6 100644 --- a/samples/client/others/typescript-angular-v20/builds/query-param-json/api.base.service.ts +++ b/samples/client/others/typescript-angular-v20/builds/query-param-json/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/others/typescript-angular/builds/composed-schemas-tagged-unions/api.base.service.ts b/samples/client/others/typescript-angular/builds/composed-schemas-tagged-unions/api.base.service.ts index 2cb82afac792..da9512f79726 100644 --- a/samples/client/others/typescript-angular/builds/composed-schemas-tagged-unions/api.base.service.ts +++ b/samples/client/others/typescript-angular/builds/composed-schemas-tagged-unions/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/others/typescript-angular/builds/composed-schemas/api.base.service.ts b/samples/client/others/typescript-angular/builds/composed-schemas/api.base.service.ts index 2cb82afac792..da9512f79726 100644 --- a/samples/client/others/typescript-angular/builds/composed-schemas/api.base.service.ts +++ b/samples/client/others/typescript-angular/builds/composed-schemas/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v16-provided-in-root/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v16-provided-in-root/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v16-provided-in-root/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v16-provided-in-root/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v17-provided-in-root/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v17-provided-in-root/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v17-provided-in-root/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v17-provided-in-root/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v18-provided-in-root/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v18-provided-in-root/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v18-provided-in-root/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v18-provided-in-root/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v19-provided-in-root/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v19-provided-in-root/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v19-provided-in-root/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v19-provided-in-root/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v19-with-angular-dependency-params/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v19-with-angular-dependency-params/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v19-with-angular-dependency-params/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v19-with-angular-dependency-params/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v19/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v19/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v19/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v19/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v20-provided-in-root/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v20-provided-in-root/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v20-provided-in-root/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v20-provided-in-root/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v20/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v20/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v20/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v20/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v21-provided-in-root/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v21-provided-in-root/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v21-provided-in-root/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v21-provided-in-root/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field. diff --git a/samples/client/petstore/typescript-angular-v21/builds/default/api.base.service.ts b/samples/client/petstore/typescript-angular-v21/builds/default/api.base.service.ts index 225e5863dcf2..8a8b8bc6b6f5 100644 --- a/samples/client/petstore/typescript-angular-v21/builds/default/api.base.service.ts +++ b/samples/client/petstore/typescript-angular-v21/builds/default/api.base.service.ts @@ -62,15 +62,16 @@ export class BaseService { return httpParams.append(key, value.toString()); } else if (value instanceof Date) { return httpParams.append(key, value.toISOString()); - } else if (Array.isArray(value)) { - // Otherwise, if it's an array, add each element. + } else if (Array.isArray(value) || value instanceof Set) { + // Otherwise, if it's an array or set, add each element. + const array = Array.isArray(value) ? value : Array.from(value); if (paramStyle === QueryParamStyle.Form) { - return httpParams.set(key, value, {explode: explode, delimiter: ','}); + return httpParams.set(key, array, {explode: explode, delimiter: ','}); } else if (paramStyle === QueryParamStyle.SpaceDelimited) { - return httpParams.set(key, value, {explode: explode, delimiter: ' '}); + return httpParams.set(key, array, {explode: explode, delimiter: ' '}); } else { // PipeDelimited - return httpParams.set(key, value, {explode: explode, delimiter: '|'}); + return httpParams.set(key, array, {explode: explode, delimiter: '|'}); } } else { // Otherwise, if it's an object, add each field.