diff --git a/src/client/interfaces/Enum.d.ts b/src/client/interfaces/Enum.d.ts index fd41e95aa..35df23765 100644 --- a/src/client/interfaces/Enum.d.ts +++ b/src/client/interfaces/Enum.d.ts @@ -1,6 +1,8 @@ export interface Enum { name: string; value: string; + enumValue: 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/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..ce1c68dfd 100644 --- a/src/openApi/v2/parser/extendEnum.ts +++ b/src/openApi/v2/parser/extendEnum.ts @@ -9,13 +9,17 @@ 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, + 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..f2dbadeb8 100644 --- a/src/openApi/v2/parser/getEnum.ts +++ b/src/openApi/v2/parser/getEnum.ts @@ -12,8 +12,9 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { .map(value => { if (typeof value === 'number') { return { - name: `'_${value}'`, + 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/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, 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..ce1c68dfd 100644 --- a/src/openApi/v3/parser/extendEnum.ts +++ b/src/openApi/v3/parser/extendEnum.ts @@ -9,13 +9,17 @@ 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, + 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..f2dbadeb8 100644 --- a/src/openApi/v3/parser/getEnum.ts +++ b/src/openApi/v3/parser/getEnum.ts @@ -12,8 +12,9 @@ export const getEnum = (values?: (string | number)[]): Enum[] => { .map(value => { if (typeof value === 'number') { return { - name: `'_${value}'`, + 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/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/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(); } diff --git a/src/templates/exportSchema.hbs b/src/templates/exportSchema.hbs index f54c25fd9..d5aa2d847 100644 --- a/src/templates/exportSchema.hbs +++ b/src/templates/exportSchema.hbs @@ -1,3 +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/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..d66f9e1f2 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,19 @@ {{#if isNullable}} isNullable: {{{isNullable}}}, {{/if}} + items: [ +{{#each enum}} + { +{{#if @root.useUnionTypes}} + key: {{{value}}}, +{{else}} + key: {{{../name}}}.{{{name}}}, +{{/if}} + name: '{{{name}}}', + value: {{{enumValue}}}, + 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}}