From f19894f82b3d3363734ad05831a28961cd9e30e8 Mon Sep 17 00:00:00 2001 From: Shelby Sanders Date: Thu, 8 Oct 2020 13:44:00 -0700 Subject: [PATCH 1/4] Corrected responses to support $ref --- src/types/open-api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/open-api.ts b/src/types/open-api.ts index 622c5163e7..7038aa7ab6 100644 --- a/src/types/open-api.ts +++ b/src/types/open-api.ts @@ -192,7 +192,7 @@ export interface OpenAPIRequestBody { } export interface OpenAPIResponses { - [code: string]: OpenAPIResponse; + [code: string]: Referenced; } export interface OpenAPIResponse From f4769a56126c884637ca14d2115fea2822d52631 Mon Sep 17 00:00:00 2001 From: Shelby Sanders Date: Thu, 8 Oct 2020 13:44:56 -0700 Subject: [PATCH 2/4] Add showExtentions for Responses --- src/components/Responses/Response.tsx | 4 ++-- src/components/Responses/ResponseDetails.tsx | 4 +++- src/services/models/Response.ts | 10 +++++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/components/Responses/Response.tsx b/src/components/Responses/Response.tsx index 58e0ae32e2..6d1e1a28c4 100644 --- a/src/components/Responses/Response.tsx +++ b/src/components/Responses/Response.tsx @@ -12,11 +12,11 @@ export class ResponseView extends React.Component<{ response: ResponseModel }> { }; render() { - const { headers, type, summary, description, code, expanded, content } = this.props.response; + const { extensions, headers, type, summary, description, code, expanded, content } = this.props.response; const mimes = content === undefined ? [] : content.mediaTypes.filter(mime => mime.schema !== undefined); - const empty = headers.length === 0 && mimes.length === 0 && !description; + const empty = Object.keys(extensions).length === 0 && headers.length === 0 && mimes.length === 0 && !description; return (
diff --git a/src/components/Responses/ResponseDetails.tsx b/src/components/Responses/ResponseDetails.tsx index 821fc2da99..3794eba1da 100644 --- a/src/components/Responses/ResponseDetails.tsx +++ b/src/components/Responses/ResponseDetails.tsx @@ -7,15 +7,17 @@ import { DropdownOrLabel } from '../DropdownOrLabel/DropdownOrLabel'; import { MediaTypesSwitch } from '../MediaTypeSwitch/MediaTypesSwitch'; import { Schema } from '../Schema'; +import { Extensions } from '../Fields/Extensions'; import { Markdown } from '../Markdown/Markdown'; import { ResponseHeaders } from './ResponseHeaders'; export class ResponseDetails extends React.PureComponent<{ response: ResponseModel }> { render() { - const { description, headers, content } = this.props.response; + const { description, extensions, headers, content } = this.props.response; return ( <> {description && } + {({ schema }) => { diff --git a/src/services/models/Response.ts b/src/services/models/Response.ts index 0a26413291..a0878093ed 100644 --- a/src/services/models/Response.ts +++ b/src/services/models/Response.ts @@ -2,7 +2,10 @@ import { action, observable, makeObservable } from 'mobx'; import { OpenAPIResponse, Referenced } from '../../types'; -import { getStatusCodeType } from '../../utils'; +import { + getStatusCodeType, + extractExtensions +} from '../../utils'; import { OpenAPIParser } from '../OpenAPIParser'; import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; import { FieldModel } from './Field'; @@ -27,6 +30,7 @@ export class ResponseModel { description: string; type: string; headers: FieldModel[] = []; + extensions: Record; constructor(props: ResponseProps) { const { parser, code, defaultAsError, infoOrRef, options, isEvent } = props; @@ -59,6 +63,10 @@ export class ResponseModel { return new FieldModel(parser, { ...header, name }, '', options); }); } + + if (options.showExtensions) { + this.extensions = extractExtensions(info, options.showExtensions); + } } @action From 64ff8852b1d12e6b5bbdd623219409a8307a151f Mon Sep 17 00:00:00 2001 From: Shelby Sanders Date: Thu, 8 Oct 2020 18:39:29 -0700 Subject: [PATCH 3/4] Add showExtentions support for Responses --- src/components/Responses/Response.tsx | 3 ++- src/services/__tests__/models/Response.test.ts | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/Responses/Response.tsx b/src/components/Responses/Response.tsx index 6d1e1a28c4..bc6ece8bd4 100644 --- a/src/components/Responses/Response.tsx +++ b/src/components/Responses/Response.tsx @@ -16,7 +16,8 @@ export class ResponseView extends React.Component<{ response: ResponseModel }> { const mimes = content === undefined ? [] : content.mediaTypes.filter(mime => mime.schema !== undefined); - const empty = Object.keys(extensions).length === 0 && headers.length === 0 && mimes.length === 0 && !description; + const empty = (!extensions || Object.keys(extensions).length === 0) && + headers.length === 0 && mimes.length === 0 && !description; return (
diff --git a/src/services/__tests__/models/Response.test.ts b/src/services/__tests__/models/Response.test.ts index ebb836c03a..7902293c56 100644 --- a/src/services/__tests__/models/Response.test.ts +++ b/src/services/__tests__/models/Response.test.ts @@ -39,5 +39,12 @@ describe('Models', () => { const resp = new ResponseModel({ ...props, code: 'default', defaultAsError: true }); expect(resp.type).toEqual('error'); }); + + test('should be error if showExtensions is true', () => { + const options = new RedocNormalizedOptions({ showExtensions: true }); + const resp = new ResponseModel(parser, 'default', true, { 'x-example': {a: 1} } as any, options); + expect(Object.keys(resp.extensions).length).toEqual(1); + expect(resp.extensions['x-example']).toEqual({a: 1}); + }); }); }); From b079c81d4e4ec668f99aa384d4b515247484b9b3 Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Tue, 13 Oct 2020 17:10:21 +0300 Subject: [PATCH 4/4] Update src/services/__tests__/models/Response.test.ts Co-authored-by: Giles Wells --- src/services/__tests__/models/Response.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/__tests__/models/Response.test.ts b/src/services/__tests__/models/Response.test.ts index 7902293c56..4863361954 100644 --- a/src/services/__tests__/models/Response.test.ts +++ b/src/services/__tests__/models/Response.test.ts @@ -40,7 +40,7 @@ describe('Models', () => { expect(resp.type).toEqual('error'); }); - test('should be error if showExtensions is true', () => { + test('ensure extensions are shown if showExtensions is true', () => { const options = new RedocNormalizedOptions({ showExtensions: true }); const resp = new ResponseModel(parser, 'default', true, { 'x-example': {a: 1} } as any, options); expect(Object.keys(resp.extensions).length).toEqual(1);