From 0a560874eb075c93779eb09e5fc2edb4b8cc9cb9 Mon Sep 17 00:00:00 2001 From: Yoshikuni Nonaka Date: Fri, 19 Jan 2024 17:07:37 +0900 Subject: [PATCH 1/6] Add blob support to getResponseBody method --- src/templates/core/fetch/getResponseBody.hbs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 1011380ee..81f9c68eb 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -5,8 +5,26 @@ export const getResponseBody = async (response: Response): Promise => { if (contentType) { const jsonTypes = ['application/json', 'application/problem+json'] const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); + const isBlob = contentType.toLowerCase().startsWith('image/') + || contentType.toLowerCase().startsWith('application/pdf') + || contentType.toLowerCase().startsWith('application/zip') + || contentType.toLowerCase().startsWith('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') + || contentType.toLowerCase().startsWith('application/octet-stream'); + if (isJSON) { return await response.json(); + } else if (isBlob) { + const blob = await response.blob(); + const disposition = response.headers.get('Content-Disposition'); + if (disposition && disposition.indexOf('attachment') !== -1) { + const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; + const matches = filenameRegex.exec(disposition); + if (matches !== null && matches[1]) { + const filename = decodeURIComponent(matches[1].replace(/['"]/g, '')); + return new File([blob],filename,{ type: contentType }) + } + } + return blob; } else { return await response.text(); } From a22b40deb5a8f94392899d3a47ce31fcfec778e1 Mon Sep 17 00:00:00 2001 From: Yoshikuni Nonaka Date: Fri, 19 Jan 2024 17:15:56 +0900 Subject: [PATCH 2/6] Add support to generate varnames, titles, and descriptions for enums --- src/client/interfaces/Enum.d.ts | 1 + src/client/interfaces/Model.d.ts | 1 + src/client/interfaces/Operation.d.ts | 1 + .../interfaces/Extensions/WithEnumExtension.d.ts | 2 ++ src/openApi/v3/parser/extendEnum.ts | 5 ++++- src/openApi/v3/parser/getModel.ts | 1 + src/openApi/v3/parser/getModelProperties.ts | 1 + src/templates/exportSchema.hbs | 4 ++++ src/templates/partials/schemaArray.hbs | 6 ++++++ src/templates/partials/schemaComposition.hbs | 5 ++++- src/templates/partials/schemaDictionary.hbs | 12 ++++++++++++ src/templates/partials/schemaEnum.hbs | 16 ++++++++++++++++ src/templates/partials/schemaGeneric.hbs | 7 +++++-- src/templates/partials/schemaInterface.hbs | 3 +++ 14 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/client/interfaces/Enum.d.ts b/src/client/interfaces/Enum.d.ts index fd41e95aa..e55775ca4 100644 --- a/src/client/interfaces/Enum.d.ts +++ b/src/client/interfaces/Enum.d.ts @@ -2,5 +2,6 @@ export interface Enum { name: string; value: string; type: string; + title?: string | null; description: string | null; } diff --git a/src/client/interfaces/Model.d.ts b/src/client/interfaces/Model.d.ts index 5f0318942..191893eb6 100644 --- a/src/client/interfaces/Model.d.ts +++ b/src/client/interfaces/Model.d.ts @@ -9,6 +9,7 @@ export interface Model extends Schema { template: string | null; link: Model | null; description: string | null; + title?: string | null; deprecated?: boolean; default?: string; imports: string[]; diff --git a/src/client/interfaces/Operation.d.ts b/src/client/interfaces/Operation.d.ts index 779144325..30852d2f5 100644 --- a/src/client/interfaces/Operation.d.ts +++ b/src/client/interfaces/Operation.d.ts @@ -7,6 +7,7 @@ export interface Operation extends OperationParameters { name: string; summary: string | null; description: string | null; + title?: string; deprecated: boolean; method: string; path: string; diff --git a/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts b/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts index 0d6ead780..7591a186e 100644 --- a/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts +++ b/src/openApi/v3/interfaces/Extensions/WithEnumExtension.d.ts @@ -1,4 +1,6 @@ export interface WithEnumExtension { + 'x-enum-values'?: string[]; 'x-enum-varnames'?: string[]; + 'x-enum-titles'?: string[]; 'x-enum-descriptions'?: string[]; } diff --git a/src/openApi/v3/parser/extendEnum.ts b/src/openApi/v3/parser/extendEnum.ts index a7fa865cb..a197d9d6d 100644 --- a/src/openApi/v3/parser/extendEnum.ts +++ b/src/openApi/v3/parser/extendEnum.ts @@ -9,13 +9,16 @@ import type { WithEnumExtension } from '../interfaces/Extensions/WithEnumExtensi * @param definition */ export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): Enum[] => { + const values = definition['x-enum-values']; const names = definition['x-enum-varnames']?.filter(isString); + const titles = definition['x-enum-titles']?.filter(isString); const descriptions = definition['x-enum-descriptions']?.filter(isString); return enumerators.map((enumerator, index) => ({ name: names?.[index] || enumerator.name, description: descriptions?.[index] || enumerator.description, - value: enumerator.value, + value: values?.[index] || enumerator.value, + title: titles?.[index] || enumerator.title, type: enumerator.type, })); }; diff --git a/src/openApi/v3/parser/getModel.ts b/src/openApi/v3/parser/getModel.ts index 9e9c60a98..eb294a86e 100644 --- a/src/openApi/v3/parser/getModel.ts +++ b/src/openApi/v3/parser/getModel.ts @@ -23,6 +23,7 @@ export const getModel = ( template: null, link: null, description: definition.description || null, + title: definition.title, deprecated: definition.deprecated === true, isDefinition, isReadOnly: definition.readOnly === true, diff --git a/src/openApi/v3/parser/getModelProperties.ts b/src/openApi/v3/parser/getModelProperties.ts index 6e25ca833..7796b4905 100644 --- a/src/openApi/v3/parser/getModelProperties.ts +++ b/src/openApi/v3/parser/getModelProperties.ts @@ -37,6 +37,7 @@ export const getModelProperties = ( > = { name: escapeName(propertyName), description: property.description || null, + title: property.title, deprecated: property.deprecated === true, isDefinition: false, isReadOnly: property.readOnly === true, diff --git a/src/templates/exportSchema.hbs b/src/templates/exportSchema.hbs index f54c25fd9..4ec0fbdce 100644 --- a/src/templates/exportSchema.hbs +++ b/src/templates/exportSchema.hbs @@ -1,3 +1,7 @@ {{>header}} +{{#equals export 'enum'}} +import { {{name}} } from '../models/{{{name}}}' +{{/equals}} + export const ${{{name}}} = {{>schema}} as const; diff --git a/src/templates/partials/schemaArray.hbs b/src/templates/partials/schemaArray.hbs index 44871265b..fa6f0f8b2 100644 --- a/src/templates/partials/schemaArray.hbs +++ b/src/templates/partials/schemaArray.hbs @@ -1,4 +1,10 @@ { +{{#if title}} + title: '{{{title}}}', +{{/if}} +{{#if description}} + description: `{{{escapeDescription description}}}`, +{{/if}} type: 'array', {{#if link}} contains: {{>schema link}}, diff --git a/src/templates/partials/schemaComposition.hbs b/src/templates/partials/schemaComposition.hbs index 050f6696d..5128f82f4 100644 --- a/src/templates/partials/schemaComposition.hbs +++ b/src/templates/partials/schemaComposition.hbs @@ -1,8 +1,11 @@ { - type: '{{export}}', +{{#if title}} + title: '{{{title}}}', +{{/if}} {{#if description}} description: `{{{escapeDescription description}}}`, {{/if}} + type: '{{export}}', contains: [{{#each properties}}{{>schema}}{{#unless @last}}, {{/unless}}{{/each}}], {{#if isReadOnly}} isReadOnly: {{{isReadOnly}}}, diff --git a/src/templates/partials/schemaDictionary.hbs b/src/templates/partials/schemaDictionary.hbs index 1e755f7af..757849015 100644 --- a/src/templates/partials/schemaDictionary.hbs +++ b/src/templates/partials/schemaDictionary.hbs @@ -1,5 +1,17 @@ { +{{#if title}} + title: '{{{title}}}', +{{/if}} +{{#if description}} + description: `{{{escapeDescription description}}}`, +{{/if}} type: 'dictionary', +{{#if title}} + title: '{{{title}}}', +{{/if}} +{{#if description}} + description: '{{{description}}}', +{{/if}} {{#if link}} contains: {{>schema link}}, {{else}} diff --git a/src/templates/partials/schemaEnum.hbs b/src/templates/partials/schemaEnum.hbs index eaba3fc5f..11d37fac4 100644 --- a/src/templates/partials/schemaEnum.hbs +++ b/src/templates/partials/schemaEnum.hbs @@ -1,4 +1,10 @@ { +{{#if title}} + title: '{{{title}}}', +{{/if}} +{{#if description}} + description: `{{{escapeDescription description}}}`, +{{/if}} type: 'Enum', {{#if isReadOnly}} isReadOnly: {{{isReadOnly}}}, @@ -9,4 +15,14 @@ {{#if isNullable}} isNullable: {{{isNullable}}}, {{/if}} + items: [ +{{#each enum}} + { + value: {{{../name}}}.{{{name}}}, + varname: "{{{name}}}", + title: "{{{title}}}", + description: "{{{description}}}", + }, +{{/each}} + ], } diff --git a/src/templates/partials/schemaGeneric.hbs b/src/templates/partials/schemaGeneric.hbs index 23580a673..df4bb290b 100644 --- a/src/templates/partials/schemaGeneric.hbs +++ b/src/templates/partials/schemaGeneric.hbs @@ -1,10 +1,13 @@ { -{{#if type}} - type: '{{{type}}}', +{{#if title}} + title: '{{{title}}}', {{/if}} {{#if description}} description: `{{{escapeDescription description}}}`, {{/if}} +{{#if type}} + type: '{{{type}}}', +{{/if}} {{#if isReadOnly}} isReadOnly: {{{isReadOnly}}}, {{/if}} diff --git a/src/templates/partials/schemaInterface.hbs b/src/templates/partials/schemaInterface.hbs index 3417c5fb9..bdc45a855 100644 --- a/src/templates/partials/schemaInterface.hbs +++ b/src/templates/partials/schemaInterface.hbs @@ -1,4 +1,7 @@ { +{{#if title}} + title: '{{{title}}}', +{{/if}} {{#if description}} description: `{{{escapeDescription description}}}`, {{/if}} From 2eb49a296d43a4effe5c7ce56026330e0d17a46d Mon Sep 17 00:00:00 2001 From: Yoshikuni Nonaka Date: Thu, 25 Jan 2024 14:13:14 +0900 Subject: [PATCH 3/6] Add support to generate varnames, titles, and descriptions for enums --- src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts | 2 ++ src/openApi/v2/parser/extendEnum.ts | 5 ++++- src/openApi/v2/parser/getModel.ts | 1 + src/openApi/v2/parser/getModelProperties.ts | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts b/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts index 0d6ead780..7591a186e 100644 --- a/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts +++ b/src/openApi/v2/interfaces/Extensions/WithEnumExtension.d.ts @@ -1,4 +1,6 @@ export interface WithEnumExtension { + 'x-enum-values'?: string[]; 'x-enum-varnames'?: string[]; + 'x-enum-titles'?: string[]; 'x-enum-descriptions'?: string[]; } diff --git a/src/openApi/v2/parser/extendEnum.ts b/src/openApi/v2/parser/extendEnum.ts index a7fa865cb..a197d9d6d 100644 --- a/src/openApi/v2/parser/extendEnum.ts +++ b/src/openApi/v2/parser/extendEnum.ts @@ -9,13 +9,16 @@ import type { WithEnumExtension } from '../interfaces/Extensions/WithEnumExtensi * @param definition */ export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): Enum[] => { + const values = definition['x-enum-values']; const names = definition['x-enum-varnames']?.filter(isString); + const titles = definition['x-enum-titles']?.filter(isString); const descriptions = definition['x-enum-descriptions']?.filter(isString); return enumerators.map((enumerator, index) => ({ name: names?.[index] || enumerator.name, description: descriptions?.[index] || enumerator.description, - value: enumerator.value, + value: values?.[index] || enumerator.value, + title: titles?.[index] || enumerator.title, type: enumerator.type, })); }; diff --git a/src/openApi/v2/parser/getModel.ts b/src/openApi/v2/parser/getModel.ts index 22f3528aa..4886be30a 100644 --- a/src/openApi/v2/parser/getModel.ts +++ b/src/openApi/v2/parser/getModel.ts @@ -22,6 +22,7 @@ export const getModel = ( template: null, link: null, description: definition.description || null, + title: definition.title, isDefinition, isReadOnly: definition.readOnly === true, isNullable: definition['x-nullable'] === true, diff --git a/src/openApi/v2/parser/getModelProperties.ts b/src/openApi/v2/parser/getModelProperties.ts index 7560be765..8f51bc175 100644 --- a/src/openApi/v2/parser/getModelProperties.ts +++ b/src/openApi/v2/parser/getModelProperties.ts @@ -25,6 +25,7 @@ export const getModelProperties = (openApi: OpenApi, definition: OpenApiSchema, template: model.template, link: null, description: property.description || null, + title: property.title, isDefinition: false, isReadOnly: property.readOnly === true, isRequired: propertyRequired, @@ -58,6 +59,7 @@ export const getModelProperties = (openApi: OpenApi, definition: OpenApiSchema, template: model.template, link: model.link, description: property.description || null, + title: property.title, isDefinition: false, isReadOnly: property.readOnly === true, isRequired: propertyRequired, From 02d5f8c713878a5f338331e233e4de761ce0afdb Mon Sep 17 00:00:00 2001 From: Yoshikuni Nonaka Date: Tue, 12 Mar 2024 13:34:17 +0900 Subject: [PATCH 4/6] Update support for enum schemas --- src/client/interfaces/Enum.d.ts | 1 + src/openApi/v2/parser/extendEnum.ts | 3 ++- src/openApi/v2/parser/getEnum.ts | 2 ++ src/openApi/v3/parser/extendEnum.ts | 3 ++- src/openApi/v3/parser/getEnum.ts | 2 ++ src/templates/exportSchema.hbs | 2 ++ src/templates/partials/schemaEnum.hbs | 11 ++++++++--- 7 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/client/interfaces/Enum.d.ts b/src/client/interfaces/Enum.d.ts index e55775ca4..35df23765 100644 --- a/src/client/interfaces/Enum.d.ts +++ b/src/client/interfaces/Enum.d.ts @@ -1,6 +1,7 @@ export interface Enum { name: string; value: string; + enumValue: string; type: string; title?: string | null; description: string | null; diff --git a/src/openApi/v2/parser/extendEnum.ts b/src/openApi/v2/parser/extendEnum.ts index a197d9d6d..ce1c68dfd 100644 --- a/src/openApi/v2/parser/extendEnum.ts +++ b/src/openApi/v2/parser/extendEnum.ts @@ -17,7 +17,8 @@ export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): return enumerators.map((enumerator, index) => ({ name: names?.[index] || enumerator.name, description: descriptions?.[index] || enumerator.description, - value: values?.[index] || enumerator.value, + value: enumerator.value, + enumValue: values?.[index] || enumerator.value, title: titles?.[index] || enumerator.title, type: enumerator.type, })); diff --git a/src/openApi/v2/parser/getEnum.ts b/src/openApi/v2/parser/getEnum.ts index 64c7ca8b5..869feb926 100644 --- a/src/openApi/v2/parser/getEnum.ts +++ b/src/openApi/v2/parser/getEnum.ts @@ -14,6 +14,7 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { return { name: `'_${value}'`, value: String(value), + enumValue: '', type: 'number', description: null, }; @@ -25,6 +26,7 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { .replace(/([a-z])([A-Z]+)/g, '$1_$2') .toUpperCase(), value: `'${value.replace(/'/g, "\\'")}'`, + enumValue: '', type: 'string', description: null, }; diff --git a/src/openApi/v3/parser/extendEnum.ts b/src/openApi/v3/parser/extendEnum.ts index a197d9d6d..ce1c68dfd 100644 --- a/src/openApi/v3/parser/extendEnum.ts +++ b/src/openApi/v3/parser/extendEnum.ts @@ -17,7 +17,8 @@ export const extendEnum = (enumerators: Enum[], definition: WithEnumExtension): return enumerators.map((enumerator, index) => ({ name: names?.[index] || enumerator.name, description: descriptions?.[index] || enumerator.description, - value: values?.[index] || enumerator.value, + value: enumerator.value, + enumValue: values?.[index] || enumerator.value, title: titles?.[index] || enumerator.title, type: enumerator.type, })); diff --git a/src/openApi/v3/parser/getEnum.ts b/src/openApi/v3/parser/getEnum.ts index 64c7ca8b5..869feb926 100644 --- a/src/openApi/v3/parser/getEnum.ts +++ b/src/openApi/v3/parser/getEnum.ts @@ -14,6 +14,7 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { return { name: `'_${value}'`, value: String(value), + enumValue: '', type: 'number', description: null, }; @@ -25,6 +26,7 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { .replace(/([a-z])([A-Z]+)/g, '$1_$2') .toUpperCase(), value: `'${value.replace(/'/g, "\\'")}'`, + enumValue: '', type: 'string', description: null, }; diff --git a/src/templates/exportSchema.hbs b/src/templates/exportSchema.hbs index 4ec0fbdce..d5aa2d847 100644 --- a/src/templates/exportSchema.hbs +++ b/src/templates/exportSchema.hbs @@ -1,7 +1,9 @@ {{>header}} {{#equals export 'enum'}} +{{#unless @root.useUnionTypes}} import { {{name}} } from '../models/{{{name}}}' +{{/unless}} {{/equals}} export const ${{{name}}} = {{>schema}} as const; diff --git a/src/templates/partials/schemaEnum.hbs b/src/templates/partials/schemaEnum.hbs index 11d37fac4..f5aa19766 100644 --- a/src/templates/partials/schemaEnum.hbs +++ b/src/templates/partials/schemaEnum.hbs @@ -18,10 +18,15 @@ items: [ {{#each enum}} { +{{#if @root.useUnionTypes}} + value: {{{value}}}, +{{else}} value: {{{../name}}}.{{{name}}}, - varname: "{{{name}}}", - title: "{{{title}}}", - description: "{{{description}}}", +{{/if}} + varname: '{{{name}}}', + enumValue: {{{enumValue}}}, + title: '{{{title}}}', + description: '{{{description}}}', }, {{/each}} ], From 86e0e61b3f0315501cc5c5a6c1d6ea2710629344 Mon Sep 17 00:00:00 2001 From: Takashi Kawae <77476170+tkawae@users.noreply.github.com> Date: Thu, 4 Jul 2024 22:26:43 +0900 Subject: [PATCH 5/6] Refine item property names in Enum Schema of schemaEnum.hbs --- src/templates/partials/schemaEnum.hbs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/templates/partials/schemaEnum.hbs b/src/templates/partials/schemaEnum.hbs index f5aa19766..d66f9e1f2 100644 --- a/src/templates/partials/schemaEnum.hbs +++ b/src/templates/partials/schemaEnum.hbs @@ -19,12 +19,12 @@ {{#each enum}} { {{#if @root.useUnionTypes}} - value: {{{value}}}, + key: {{{value}}}, {{else}} - value: {{{../name}}}.{{{name}}}, + key: {{{../name}}}.{{{name}}}, {{/if}} - varname: '{{{name}}}', - enumValue: {{{enumValue}}}, + name: '{{{name}}}', + value: {{{enumValue}}}, title: '{{{title}}}', description: '{{{description}}}', }, From 7683f0477eeb781219bb6a9b2491cc894356b26f Mon Sep 17 00:00:00 2001 From: Yoshikuni Nonaka Date: Tue, 29 Oct 2024 14:22:50 +0900 Subject: [PATCH 6/6] Fix bug when parsing number typed enum --- src/openApi/v2/parser/getEnum.ts | 2 +- src/openApi/v3/parser/getEnum.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openApi/v2/parser/getEnum.ts b/src/openApi/v2/parser/getEnum.ts index 869feb926..f2dbadeb8 100644 --- a/src/openApi/v2/parser/getEnum.ts +++ b/src/openApi/v2/parser/getEnum.ts @@ -12,7 +12,7 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { .map(value => { if (typeof value === 'number') { return { - name: `'_${value}'`, + name: `_${value}`, value: String(value), enumValue: '', type: 'number', diff --git a/src/openApi/v3/parser/getEnum.ts b/src/openApi/v3/parser/getEnum.ts index 869feb926..f2dbadeb8 100644 --- a/src/openApi/v3/parser/getEnum.ts +++ b/src/openApi/v3/parser/getEnum.ts @@ -12,7 +12,7 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { .map(value => { if (typeof value === 'number') { return { - name: `'_${value}'`, + name: `_${value}`, value: String(value), enumValue: '', type: 'number',