diff --git a/README.md b/README.md index 98d1c39a..c2a810c4 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ **OpenAPI/Swagger-generated API Reference Documentation** - [![Build Status](https://travis-ci.org/Rebilly/ReDoc.svg?branch=master)](https://travis-ci.org/Rebilly/ReDoc) [![Coverage Status](https://coveralls.io/repos/Rebilly/ReDoc/badge.svg?branch=master&service=github)](https://coveralls.io/github/Rebilly/ReDoc?branch=master) [![dependencies Status](https://david-dm.org/Rebilly/ReDoc/status.svg)](https://david-dm.org/Rebilly/ReDoc) [![devDependencies Status](https://david-dm.org/Rebilly/ReDoc/dev-status.svg)](https://david-dm.org/Rebilly/ReDoc#info=devDependencies) [![npm](http://img.shields.io/npm/v/redoc.svg)](https://www.npmjs.com/package/redoc) [![License](https://img.shields.io/npm/l/redoc.svg)](https://github.com/Rebilly/ReDoc/blob/master/LICENSE) + [![Build Status](https://travis-ci.org/Rebilly/ReDoc.svg?branch=master)](https://travis-ci.org/Rebilly/ReDoc) [![Coverage Status](https://coveralls.io/repos/Rebilly/ReDoc/badge.svg?branch=master&service=github)](https://coveralls.io/github/Rebilly/ReDoc?branch=master) [![dependencies Status](https://david-dm.org/Rebilly/ReDoc/status.svg)](https://david-dm.org/Rebilly/ReDoc) [![devDependencies Status](https://david-dm.org/Rebilly/ReDoc/dev-status.svg)](https://david-dm.org/Rebilly/ReDoc#info=devDependencies) [![npm](http://img.shields.io/npm/v/redoc.svg)](https://www.npmjs.com/package/redoc) [![License](https://img.shields.io/npm/l/redoc.svg)](https://github.com/Rebilly/ReDoc/blob/master/LICENSE) - [![bundle size](http://img.badgesize.io/https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js?compression=gzip&max=300000)](https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js) [![npm](https://img.shields.io/npm/dm/redoc.svg)](https://www.npmjs.com/package/redoc) [![](https://data.jsdelivr.com/v1/package/npm/redoc/badge)](https://www.jsdelivr.com/package/npm/redoc) + [![bundle size](http://img.badgesize.io/https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js?compression=gzip&max=300000)](https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js) [![npm](https://img.shields.io/npm/dm/redoc.svg)](https://www.npmjs.com/package/redoc) [![](https://data.jsdelivr.com/v1/package/npm/redoc/badge)](https://www.jsdelivr.com/package/npm/redoc) @@ -215,6 +215,7 @@ You can use all of the following options with standalone version on tag * `hideHostname` - if set, the protocol and hostname is not shown in the operation definition. * `expandResponses` - specify which responses to expand by default by response codes. Values should be passed as comma-separated list without spaces e.g. `expandResponses="200,201"`. Special value `"all"` expands all responses by default. Be careful: this option can slow-down documentation rendering time. * `requiredPropsFirst` - show required properties first ordered in the same order as in `required` array. +* `showExtensions` - show vendor extensions ("x-" fields). Extensions used by ReDoc are ignored. * `noAutoAuth` - do not inject Authentication section automatically * `pathInMiddlePanel` - show path link and HTTP verb in the middle panel instead of the right one * `hideLoading` - do not show loading animation. Useful for small docs @@ -242,4 +243,4 @@ Redoc.init('http://petstore.swagger.io/v2/swagger.json', { ----------- ## Development -see [CONTRIBUTING.md](.github/CONTRIBUTING.md) \ No newline at end of file +see [CONTRIBUTING.md](.github/CONTRIBUTING.md) diff --git a/src/components/Fields/Extensions.tsx b/src/components/Fields/Extensions.tsx new file mode 100644 index 00000000..0aae28a9 --- /dev/null +++ b/src/components/Fields/Extensions.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; + +import { OptionsContext } from '../OptionsProvider'; + +import { SchemaModel } from '../../services/models'; +import { FieldDetail } from './FieldDetail'; + +export interface ExtensionsProps { + schema: SchemaModel; +} + +export class Extensions extends React.PureComponent { + redocExtensions = [ + 'x-circular-ref', + 'x-code-samples', + 'x-displayName', + 'x-examples', + 'x-ignoredHeaderParameters', + 'x-logo', + 'x-nullable', + 'x-servers', + 'x-tagGroups', + 'x-traitTag', + ]; + + render() { + const { schema } = this.props; + const fullSchema = schema.schema; + const extensionList = Object.keys(fullSchema).filter( + key => key.startsWith('x-') && !this.redocExtensions.includes(key), + ); + + return ( + + {options => ( + <> + {options.showExtensions && + extensionList.map(key => ( + + ))} + + )} + + ); + } +} diff --git a/src/components/Fields/FieldDetails.tsx b/src/components/Fields/FieldDetails.tsx index 838351ec..60ac95ab 100644 --- a/src/components/Fields/FieldDetails.tsx +++ b/src/components/Fields/FieldDetails.tsx @@ -12,6 +12,7 @@ import { import { ExternalDocumentation } from '../ExternalDocumentation/ExternalDocumentation'; import { Markdown } from '../Markdown/Markdown'; import { EnumValues } from './EnumValues'; +import { Extensions } from './Extensions'; import { FieldProps } from './Field'; import { ConstraintsView } from './FieldContstraints'; import { FieldDetail } from './FieldDetail'; @@ -51,6 +52,7 @@ export class FieldDetails extends React.PureComponent { {!renderDiscriminatorSwitch && }{' '} {showExamples && } + {}
diff --git a/src/services/RedocNormalizedOptions.ts b/src/services/RedocNormalizedOptions.ts index 851d4b1b..69f6072c 100644 --- a/src/services/RedocNormalizedOptions.ts +++ b/src/services/RedocNormalizedOptions.ts @@ -17,6 +17,7 @@ export interface RedocRawOptions { hideLoading?: boolean | string; hideDownloadButton?: boolean | string; disableSearch?: boolean | string; + showExtensions?: boolean | string; unstable_ignoreMimeParameters?: boolean; @@ -99,6 +100,7 @@ export class RedocNormalizedOptions { untrustedSpec: boolean; hideDownloadButton: boolean; disableSearch: boolean; + showExtensions: boolean; /* tslint:disable-next-line */ unstable_ignoreMimeParameters: boolean; @@ -124,6 +126,7 @@ export class RedocNormalizedOptions { this.untrustedSpec = argValueToBoolean(raw.untrustedSpec); this.hideDownloadButton = argValueToBoolean(raw.hideDownloadButton); this.disableSearch = argValueToBoolean(raw.disableSearch); + this.showExtensions = argValueToBoolean(raw.showExtensions); this.unstable_ignoreMimeParameters = argValueToBoolean(raw.unstable_ignoreMimeParameters);