mirror of
https://github.com/Redocly/redoc.git
synced 2025-02-07 21:40:32 +03:00
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 <giles@mediagearhead.com> Co-authored-by: Roman Hotsiy <gotsijroman@gmail.com> Co-authored-by: Giles Wells <giles@mediagearhead.com>
This commit is contained in:
parent
af138639ca
commit
f82eb53ccf
|
@ -12,11 +12,12 @@ export class ResponseView extends React.Component<{ response: ResponseModel }> {
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
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 =
|
const mimes =
|
||||||
content === undefined ? [] : content.mediaTypes.filter(mime => mime.schema !== undefined);
|
content === undefined ? [] : content.mediaTypes.filter(mime => mime.schema !== undefined);
|
||||||
|
|
||||||
const empty = headers.length === 0 && mimes.length === 0 && !description;
|
const empty = (!extensions || Object.keys(extensions).length === 0) &&
|
||||||
|
headers.length === 0 && mimes.length === 0 && !description;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -7,15 +7,17 @@ import { DropdownOrLabel } from '../DropdownOrLabel/DropdownOrLabel';
|
||||||
import { MediaTypesSwitch } from '../MediaTypeSwitch/MediaTypesSwitch';
|
import { MediaTypesSwitch } from '../MediaTypeSwitch/MediaTypesSwitch';
|
||||||
import { Schema } from '../Schema';
|
import { Schema } from '../Schema';
|
||||||
|
|
||||||
|
import { Extensions } from '../Fields/Extensions';
|
||||||
import { Markdown } from '../Markdown/Markdown';
|
import { Markdown } from '../Markdown/Markdown';
|
||||||
import { ResponseHeaders } from './ResponseHeaders';
|
import { ResponseHeaders } from './ResponseHeaders';
|
||||||
|
|
||||||
export class ResponseDetails extends React.PureComponent<{ response: ResponseModel }> {
|
export class ResponseDetails extends React.PureComponent<{ response: ResponseModel }> {
|
||||||
render() {
|
render() {
|
||||||
const { description, headers, content } = this.props.response;
|
const { description, extensions, headers, content } = this.props.response;
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{description && <Markdown source={description} />}
|
{description && <Markdown source={description} />}
|
||||||
|
<Extensions extensions={extensions} />
|
||||||
<ResponseHeaders headers={headers} />
|
<ResponseHeaders headers={headers} />
|
||||||
<MediaTypesSwitch content={content} renderDropdown={this.renderDropdown}>
|
<MediaTypesSwitch content={content} renderDropdown={this.renderDropdown}>
|
||||||
{({ schema }) => {
|
{({ schema }) => {
|
||||||
|
|
|
@ -39,5 +39,12 @@ describe('Models', () => {
|
||||||
const resp = new ResponseModel({ ...props, code: 'default', defaultAsError: true });
|
const resp = new ResponseModel({ ...props, code: 'default', defaultAsError: true });
|
||||||
expect(resp.type).toEqual('error');
|
expect(resp.type).toEqual('error');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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);
|
||||||
|
expect(resp.extensions['x-example']).toEqual({a: 1});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,7 +2,10 @@ import { action, observable, makeObservable } from 'mobx';
|
||||||
|
|
||||||
import { OpenAPIResponse, Referenced } from '../../types';
|
import { OpenAPIResponse, Referenced } from '../../types';
|
||||||
|
|
||||||
import { getStatusCodeType } from '../../utils';
|
import {
|
||||||
|
getStatusCodeType,
|
||||||
|
extractExtensions
|
||||||
|
} from '../../utils';
|
||||||
import { OpenAPIParser } from '../OpenAPIParser';
|
import { OpenAPIParser } from '../OpenAPIParser';
|
||||||
import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
|
import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
|
||||||
import { FieldModel } from './Field';
|
import { FieldModel } from './Field';
|
||||||
|
@ -27,6 +30,7 @@ export class ResponseModel {
|
||||||
description: string;
|
description: string;
|
||||||
type: string;
|
type: string;
|
||||||
headers: FieldModel[] = [];
|
headers: FieldModel[] = [];
|
||||||
|
extensions: Record<string, any>;
|
||||||
|
|
||||||
constructor(props: ResponseProps) {
|
constructor(props: ResponseProps) {
|
||||||
const { parser, code, defaultAsError, infoOrRef, options, isEvent } = props;
|
const { parser, code, defaultAsError, infoOrRef, options, isEvent } = props;
|
||||||
|
@ -59,6 +63,10 @@ export class ResponseModel {
|
||||||
return new FieldModel(parser, { ...header, name }, '', options);
|
return new FieldModel(parser, { ...header, name }, '', options);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.showExtensions) {
|
||||||
|
this.extensions = extractExtensions(info, options.showExtensions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
|
|
@ -192,7 +192,7 @@ export interface OpenAPIRequestBody {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface OpenAPIResponses {
|
export interface OpenAPIResponses {
|
||||||
[code: string]: OpenAPIResponse;
|
[code: string]: Referenced<OpenAPIResponse>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface OpenAPIResponse
|
export interface OpenAPIResponse
|
||||||
|
|
Loading…
Reference in New Issue
Block a user