feat: New option onlyRequiredInSamples (#646)

* Add onlyRequiredInSamples option that let user to show only required fields in Request samples.
This commit is contained in:
TATSUNO Yasuhiro 2018-10-05 22:14:41 +09:00 committed by Roman Hotsiy
parent fbcec82275
commit 10bca66dce
3 changed files with 13 additions and 2 deletions

View File

@ -227,6 +227,7 @@ You can use all of the following options with standalone version on <redoc> tag
* `nativeScrollbars` - use native scrollbar for sidemenu instead of perfect-scroll (scrolling performance optimization for big specs) * `nativeScrollbars` - use native scrollbar for sidemenu instead of perfect-scroll (scrolling performance optimization for big specs)
* `hideDownloadButton` - do not show "Download" spec button. **THIS DOESN'T MAKE YOUR SPEC PRIVATE**, it just hides the button. * `hideDownloadButton` - do not show "Download" spec button. **THIS DOESN'T MAKE YOUR SPEC PRIVATE**, it just hides the button.
* `disableSearch` - disable search indexing and search box * `disableSearch` - disable search indexing and search box
* `onlyRequiredInSamples` - shows only required fields in request samples.
* `theme` - ReDoc theme. Not documented yet. For details check source code: [theme.ts](https://github.com/Rebilly/ReDoc/blob/master/src/theme.ts) * `theme` - ReDoc theme. Not documented yet. For details check source code: [theme.ts](https://github.com/Rebilly/ReDoc/blob/master/src/theme.ts)
## Advanced usage of standalone version ## Advanced usage of standalone version

View File

@ -18,6 +18,7 @@ export interface RedocRawOptions {
hideLoading?: boolean | string; hideLoading?: boolean | string;
hideDownloadButton?: boolean | string; hideDownloadButton?: boolean | string;
disableSearch?: boolean | string; disableSearch?: boolean | string;
onlyRequiredInSamples?: boolean | string;
showExtensions?: boolean | string | string[]; showExtensions?: boolean | string | string[];
unstable_ignoreMimeParameters?: boolean; unstable_ignoreMimeParameters?: boolean;
@ -117,6 +118,7 @@ export class RedocNormalizedOptions {
untrustedSpec: boolean; untrustedSpec: boolean;
hideDownloadButton: boolean; hideDownloadButton: boolean;
disableSearch: boolean; disableSearch: boolean;
onlyRequiredInSamples: boolean;
showExtensions: boolean | string[]; showExtensions: boolean | string[];
/* tslint:disable-next-line */ /* tslint:disable-next-line */
@ -144,6 +146,7 @@ export class RedocNormalizedOptions {
this.untrustedSpec = argValueToBoolean(raw.untrustedSpec); this.untrustedSpec = argValueToBoolean(raw.untrustedSpec);
this.hideDownloadButton = argValueToBoolean(raw.hideDownloadButton); this.hideDownloadButton = argValueToBoolean(raw.hideDownloadButton);
this.disableSearch = argValueToBoolean(raw.disableSearch); this.disableSearch = argValueToBoolean(raw.disableSearch);
this.onlyRequiredInSamples = argValueToBoolean(raw.onlyRequiredInSamples);
this.showExtensions = RedocNormalizedOptions.normalizeShowExtensions(raw.showExtensions); this.showExtensions = RedocNormalizedOptions.normalizeShowExtensions(raw.showExtensions);
this.unstable_ignoreMimeParameters = argValueToBoolean(raw.unstable_ignoreMimeParameters); this.unstable_ignoreMimeParameters = argValueToBoolean(raw.unstable_ignoreMimeParameters);

View File

@ -13,6 +13,7 @@ export class MediaTypeModel {
schema?: SchemaModel; schema?: SchemaModel;
name: string; name: string;
isRequestType: boolean; isRequestType: boolean;
onlyRequiredInSamples: boolean;
/** /**
* @param isRequestType needed to know if skipe RO/RW fields in objects * @param isRequestType needed to know if skipe RO/RW fields in objects
@ -27,6 +28,7 @@ export class MediaTypeModel {
this.name = name; this.name = name;
this.isRequestType = isRequestType; this.isRequestType = isRequestType;
this.schema = info.schema && new SchemaModel(parser, info.schema, '', options); this.schema = info.schema && new SchemaModel(parser, info.schema, '', options);
this.onlyRequiredInSamples = options.onlyRequiredInSamples;
if (info.examples !== undefined) { if (info.examples !== undefined) {
this.examples = mapValues(info.examples, example => new ExampleModel(parser, example)); this.examples = mapValues(info.examples, example => new ExampleModel(parser, example));
} else if (info.example !== undefined) { } else if (info.example !== undefined) {
@ -39,12 +41,17 @@ export class MediaTypeModel {
} }
generateExample(parser: OpenAPIParser, info: OpenAPIMediaType) { generateExample(parser: OpenAPIParser, info: OpenAPIMediaType) {
const samplerOptions = {
skipReadOnly: this.isRequestType,
skipNonRequired: this.isRequestType && this.onlyRequiredInSamples,
skipWriteOnly: !this.isRequestType,
};
if (this.schema && this.schema.oneOf) { if (this.schema && this.schema.oneOf) {
this.examples = {}; this.examples = {};
for (const subSchema of this.schema.oneOf) { for (const subSchema of this.schema.oneOf) {
const sample = Sampler.sample( const sample = Sampler.sample(
subSchema.rawSchema, subSchema.rawSchema,
{ skipReadOnly: this.isRequestType, skipWriteOnly: !this.isRequestType }, samplerOptions,
parser.spec, parser.spec,
); );
@ -61,7 +68,7 @@ export class MediaTypeModel {
default: new ExampleModel(parser, { default: new ExampleModel(parser, {
value: Sampler.sample( value: Sampler.sample(
info.schema, info.schema,
{ skipReadOnly: this.isRequestType, skipWriteOnly: !this.isRequestType }, samplerOptions,
parser.spec, parser.spec,
), ),
}), }),