Skip to content

Commit f82eb53

Browse files
shelbysRomanHotsiygileswells
authored
Added support for showExtensions and $ref for Responses (#1406)
* Corrected responses to support $ref * Add showExtentions for Responses * Add showExtentions support for Responses * Update src/services/__tests__/models/Response.test.ts Co-authored-by: Giles Wells <[email protected]> Co-authored-by: Roman Hotsiy <[email protected]> Co-authored-by: Giles Wells <[email protected]>
1 parent af13863 commit f82eb53

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

src/components/Responses/Response.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ export class ResponseView extends React.Component<{ response: ResponseModel }> {
1212
};
1313

1414
render() {
15-
const { headers, type, summary, description, code, expanded, content } = this.props.response;
15+
const { extensions, headers, type, summary, description, code, expanded, content } = this.props.response;
1616
const mimes =
1717
content === undefined ? [] : content.mediaTypes.filter(mime => mime.schema !== undefined);
1818

19-
const empty = headers.length === 0 && mimes.length === 0 && !description;
19+
const empty = (!extensions || Object.keys(extensions).length === 0) &&
20+
headers.length === 0 && mimes.length === 0 && !description;
2021

2122
return (
2223
<div>

src/components/Responses/ResponseDetails.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ import { DropdownOrLabel } from '../DropdownOrLabel/DropdownOrLabel';
77
import { MediaTypesSwitch } from '../MediaTypeSwitch/MediaTypesSwitch';
88
import { Schema } from '../Schema';
99

10+
import { Extensions } from '../Fields/Extensions';
1011
import { Markdown } from '../Markdown/Markdown';
1112
import { ResponseHeaders } from './ResponseHeaders';
1213

1314
export class ResponseDetails extends React.PureComponent<{ response: ResponseModel }> {
1415
render() {
15-
const { description, headers, content } = this.props.response;
16+
const { description, extensions, headers, content } = this.props.response;
1617
return (
1718
<>
1819
{description && <Markdown source={description} />}
20+
<Extensions extensions={extensions} />
1921
<ResponseHeaders headers={headers} />
2022
<MediaTypesSwitch content={content} renderDropdown={this.renderDropdown}>
2123
{({ schema }) => {

src/services/__tests__/models/Response.test.ts

+7
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,12 @@ describe('Models', () => {
3939
const resp = new ResponseModel({ ...props, code: 'default', defaultAsError: true });
4040
expect(resp.type).toEqual('error');
4141
});
42+
43+
test('ensure extensions are shown if showExtensions is true', () => {
44+
const options = new RedocNormalizedOptions({ showExtensions: true });
45+
const resp = new ResponseModel(parser, 'default', true, { 'x-example': {a: 1} } as any, options);
46+
expect(Object.keys(resp.extensions).length).toEqual(1);
47+
expect(resp.extensions['x-example']).toEqual({a: 1});
48+
});
4249
});
4350
});

src/services/models/Response.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import { action, observable, makeObservable } from 'mobx';
22

33
import { OpenAPIResponse, Referenced } from '../../types';
44

5-
import { getStatusCodeType } from '../../utils';
5+
import {
6+
getStatusCodeType,
7+
extractExtensions
8+
} from '../../utils';
69
import { OpenAPIParser } from '../OpenAPIParser';
710
import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
811
import { FieldModel } from './Field';
@@ -27,6 +30,7 @@ export class ResponseModel {
2730
description: string;
2831
type: string;
2932
headers: FieldModel[] = [];
33+
extensions: Record<string, any>;
3034

3135
constructor(props: ResponseProps) {
3236
const { parser, code, defaultAsError, infoOrRef, options, isEvent } = props;
@@ -59,6 +63,10 @@ export class ResponseModel {
5963
return new FieldModel(parser, { ...header, name }, '', options);
6064
});
6165
}
66+
67+
if (options.showExtensions) {
68+
this.extensions = extractExtensions(info, options.showExtensions);
69+
}
6270
}
6371

6472
@action

src/types/open-api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export interface OpenAPIRequestBody {
192192
}
193193

194194
export interface OpenAPIResponses {
195-
[code: string]: OpenAPIResponse;
195+
[code: string]: Referenced<OpenAPIResponse>;
196196
}
197197

198198
export interface OpenAPIResponse

0 commit comments

Comments
 (0)