diff --git a/lib/openapi3.js b/lib/openapi3.js index e159ce4f..226ac9e2 100644 --- a/lib/openapi3.js +++ b/lib/openapi3.js @@ -427,40 +427,58 @@ function getResponses(data) { for (let r in data.operation.responses) { if (!r.startsWith('x-')) { let response = data.operation.responses[r]; - let entry = {}; - entry.status = r; - entry.meaning = (r === 'default' ? data.translations.responseDefault : data.translations.responseUnknown); + + let meta = {}; + meta.meaning = (r === 'default' ? data.translations.responseDefault : data.translations.responseUnknown); var url = ''; for (var s in common.statusCodes) { if (common.statusCodes[s].code === r) { - entry.meaning = common.statusCodes[s].phrase; + meta.meaning = common.statusCodes[s].phrase; url = common.statusCodes[s].spec_href; break; } } - if (url) entry.meaning = '[' + entry.meaning + '](' + url + ')'; - entry.description = (typeof response.description === 'string' ? response.description.trim() : undefined); - entry.schema = data.translations.schemaNone; + if (url) meta.meaning = '[' + meta.meaning + '](' + url + ')'; + meta.description = (typeof response.description === 'string' ? response.description.trim() : undefined); + for (let ct in response.content) { + let entry = {...meta}; + entry.status = r; + entry.schema = data.translations.schemaNone; + let contentType = response.content[ct]; - if (contentType.schema) { - entry.type = contentType.schema.type; - entry.schema = data.translations.schemaInline; - } - if (contentType.schema && contentType.schema["x-widdershins-oldRef"] && contentType.schema["x-widdershins-oldRef"].startsWith('#/components/')) { - let schemaName = contentType.schema["x-widdershins-oldRef"].replace('#/components/schemas/', ''); - entry.schema = '[' + schemaName + '](#schema' + schemaName.toLowerCase() + ')'; - entry.$ref = true; - } - else { - if (contentType.schema && contentType.schema.type && (contentType.schema.type !== 'object') && (contentType.schema.type !== 'array')) { - entry.schema = contentType.schema.type; + entry.contentType = ct; + + let ctSchema = contentType.schema; + if (ctSchema) { + entry.type = ctSchema.type; + entry.format = ctSchema.format; + + entry.originalType = ctSchema.type; + entry.safeType = ctSchema.type || common.inferType(ctSchema); + if (ctSchema.format) { + entry.safeType = entry.safeType + '(' + ctSchema.format + ')'; + } + if ((entry.safeType === 'array') && (ctSchema.items)) { + let itemsType = ctSchema.items.type; + if (!itemsType) { + itemsType = common.inferType(ctSchema.items); + } + entry.safeType = 'array[' + itemsType + ']'; + } + if (ctSchema["x-widdershins-oldRef"]) { + let schemaName = ctSchema["x-widdershins-oldRef"].replace('#/components/schemas/', ''); + entry.safeType = '[' + schemaName + '](#schema' + schemaName.toLowerCase() + ')'; + entry.$ref = true; } + } else { + entry.safeType = data.translations.schemaInline; } + + entry.content = response.content; + entry.links = response.links; + responses.push(entry); } - entry.content = response.content; - entry.links = response.links; - responses.push(entry); } } return responses; diff --git a/templates/openapi3/responses.def b/templates/openapi3/responses.def index ac9679ef..28c2c5db 100644 --- a/templates/openapi3/responses.def +++ b/templates/openapi3/responses.def @@ -13,9 +13,9 @@ {{= data.tags.section }}

Responses

-|Status|Meaning|Description|Schema| -|---|---|---|---| -{{~ data.responses :r}}|{{=r.status}}|{{=r.meaning}}|{{=r.description || 'none'}}|{{=r.schema}}| +|Content-Type|Status|Meaning|Description|Schema| +|---|---|---|---|---| +{{~ data.responses :r}}|{{=r.contentType}}|{{=r.status}}|{{=r.meaning}}|{{=r.description || 'none'}}|{{=r.safeType}}| {{~}} {{ data.responseSchemas = false; }}