From 531a85246e11bdf52221e05be785b022389ba1af Mon Sep 17 00:00:00 2001 From: Stefan Forstenlechner Date: Sat, 13 Feb 2021 11:16:57 +0100 Subject: [PATCH 1/2] [typescript-fetch] handle uniqueItems correctly in model and api uniqueItems produces Set instead of Array as type, but the corresponding code did not treat Set correctly use `Array.from` and `new Set` to convert from Set to Array and vice versa, if uniqueItems is true. related to https://github.com/OpenAPITools/openapi-generator/issues/8258, but only fixes typescript-fetch --- .../src/main/resources/typescript-fetch/apis.mustache | 8 ++++---- .../resources/typescript-fetch/modelGeneric.mustache | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/typescript-fetch/apis.mustache b/modules/openapi-generator/src/main/resources/typescript-fetch/apis.mustache index 58bd1d6080b5..8466deb2853e 100644 --- a/modules/openapi-generator/src/main/resources/typescript-fetch/apis.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-fetch/apis.mustache @@ -109,7 +109,7 @@ export class {{classname}} extends runtime.BaseAPI { queryParameters['{{baseName}}'] = requestParameters.{{paramName}}; {{/isCollectionFormatMulti}} {{^isCollectionFormatMulti}} - queryParameters['{{baseName}}'] = requestParameters.{{paramName}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"]); + queryParameters['{{baseName}}'] = {{#uniqueItems}}Array.from({{/uniqueItems}}requestParameters.{{paramName}}{{#uniqueItems}}){{/uniqueItems}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"]); {{/isCollectionFormatMulti}} } @@ -146,7 +146,7 @@ export class {{classname}} extends runtime.BaseAPI { {{#headerParams}} {{#isArray}} if (requestParameters.{{paramName}}) { - headerParameters['{{baseName}}'] = requestParameters.{{paramName}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"]); + headerParameters['{{baseName}}'] = {{#uniqueItems}}Array.from({{/uniqueItems}}requestParameters.{{paramName}}{{#uniqueItems}}){{/uniqueItems}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"]); } {{/isArray}} @@ -233,7 +233,7 @@ export class {{classname}} extends runtime.BaseAPI { }) {{/isCollectionFormatMulti}} {{^isCollectionFormatMulti}} - formParams.append('{{baseName}}', requestParameters.{{paramName}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"])); + formParams.append('{{baseName}}', {{#uniqueItems}}Array.from({{/uniqueItems}}requestParameters.{{paramName}}{{#uniqueItems}}){{/uniqueItems}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"])); {{/isCollectionFormatMulti}} } @@ -308,7 +308,7 @@ export class {{classname}} extends runtime.BaseAPI { {{/returnTypeIsPrimitive}} {{^returnTypeIsPrimitive}} {{#isArray}} - return new runtime.JSONApiResponse(response{{^withoutRuntimeChecks}}, (jsonValue) => jsonValue.map({{returnBaseType}}FromJSON){{/withoutRuntimeChecks}}); + return new runtime.JSONApiResponse(response{{^withoutRuntimeChecks}}, (jsonValue) => {{#uniqueItems}}new Set({{/uniqueItems}}jsonValue.map({{returnBaseType}}FromJSON){{/withoutRuntimeChecks}}){{#uniqueItems}}){{/uniqueItems}}; {{/isArray}} {{^isArray}} {{#isMap}} diff --git a/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache b/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache index eec8a9022c73..00d4e010fa0d 100644 --- a/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache @@ -59,7 +59,12 @@ export function {{classname}}FromJSONTyped(json: any, ignoreDiscriminator: boole {{/isPrimitiveType}} {{^isPrimitiveType}} {{#isArray}} + {{#uniqueItems}} + '{{name}}': {{^required}}!exists(json, '{{baseName}}') ? undefined : {{/required}}({{#isNullable}}json['{{baseName}}'] === null ? null : {{/isNullable}}new Set((json['{{baseName}}'] as Array).map({{#items}}{{datatype}}{{/items}}FromJSON))), + {{/uniqueItems}} + {{^uniqueItems}} '{{name}}': {{^required}}!exists(json, '{{baseName}}') ? undefined : {{/required}}({{#isNullable}}json['{{baseName}}'] === null ? null : {{/isNullable}}(json['{{baseName}}'] as Array).map({{#items}}{{datatype}}{{/items}}FromJSON)), + {{/uniqueItems}} {{/isArray}} {{#isMap}} '{{name}}': {{^required}}!exists(json, '{{baseName}}') ? undefined : {{/required}}({{#isNullable}}json['{{baseName}}'] === null ? null : {{/isNullable}}mapValues(json['{{baseName}}'], {{#items}}{{datatype}}{{/items}}FromJSON)), @@ -103,7 +108,12 @@ export function {{classname}}ToJSON(value?: {{classname}} | null): any { {{/isPrimitiveType}} {{^isPrimitiveType}} {{#isArray}} + {{#uniqueItems}} + '{{baseName}}': {{^required}}value.{{name}} === undefined ? undefined : {{/required}}({{#isNullable}}value.{{name}} === null ? null : {{/isNullable}}Array.from((value.{{name}} as Set).map({{#items}}{{datatype}}{{/items}}ToJSON))), + {{/uniqueItems}} + {{^uniqueItems}} '{{baseName}}': {{^required}}value.{{name}} === undefined ? undefined : {{/required}}({{#isNullable}}value.{{name}} === null ? null : {{/isNullable}}(value.{{name}} as Array).map({{#items}}{{datatype}}{{/items}}ToJSON)), + {{/uniqueItems}} {{/isArray}} {{#isMap}} '{{baseName}}': {{^required}}value.{{name}} === undefined ? undefined : {{/required}}({{#isNullable}}value.{{name}} === null ? null : {{/isNullable}}mapValues(value.{{name}}, {{#items}}{{datatype}}{{/items}}ToJSON)), From 9871bd85664a498fe7b242c705f19eac39aac003 Mon Sep 17 00:00:00 2001 From: Stefan Forstenlechner Date: Sat, 13 Feb 2021 17:31:31 +0100 Subject: [PATCH 2/2] [typescript-fetch] update samples --- .../typescript-fetch/builds/default-v3.0/apis/PetApi.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/client/petstore/typescript-fetch/builds/default-v3.0/apis/PetApi.ts b/samples/client/petstore/typescript-fetch/builds/default-v3.0/apis/PetApi.ts index 4b5e5912374d..854c14d7dcd3 100644 --- a/samples/client/petstore/typescript-fetch/builds/default-v3.0/apis/PetApi.ts +++ b/samples/client/petstore/typescript-fetch/builds/default-v3.0/apis/PetApi.ts @@ -211,7 +211,7 @@ export class PetApi extends runtime.BaseAPI { const queryParameters: any = {}; if (requestParameters.tags) { - queryParameters['tags'] = requestParameters.tags.join(runtime.COLLECTION_FORMATS["csv"]); + queryParameters['tags'] = Array.from(requestParameters.tags).join(runtime.COLLECTION_FORMATS["csv"]); } const headerParameters: runtime.HTTPHeaders = {}; @@ -232,7 +232,7 @@ export class PetApi extends runtime.BaseAPI { query: queryParameters, }); - return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(PetFromJSON)); + return new runtime.JSONApiResponse(response, (jsonValue) => new Set(jsonValue.map(PetFromJSON))); } /**