From 10bca66dcedeb24e6b240b280d9c0a5130a4e110 Mon Sep 17 00:00:00 2001
From: TATSUNO Yasuhiro <tatsuno_yasuhiro@kurusugawa.jp>
Date: Fri, 5 Oct 2018 22:14:41 +0900
Subject: [PATCH] feat: New option onlyRequiredInSamples (#646)

* Add onlyRequiredInSamples option that let user to show only required fields in Request samples.
---
 README.md                              |  1 +
 src/services/RedocNormalizedOptions.ts |  3 +++
 src/services/models/MediaType.ts       | 11 +++++++++--
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 08e80d9c..2b866a7b 100644
--- a/README.md
+++ b/README.md
@@ -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)
 * `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
+* `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)
 
 ## Advanced usage of standalone version
diff --git a/src/services/RedocNormalizedOptions.ts b/src/services/RedocNormalizedOptions.ts
index d472ae5d..18623976 100644
--- a/src/services/RedocNormalizedOptions.ts
+++ b/src/services/RedocNormalizedOptions.ts
@@ -18,6 +18,7 @@ export interface RedocRawOptions {
   hideLoading?: boolean | string;
   hideDownloadButton?: boolean | string;
   disableSearch?: boolean | string;
+  onlyRequiredInSamples?: boolean | string;
   showExtensions?: boolean | string | string[];
 
   unstable_ignoreMimeParameters?: boolean;
@@ -117,6 +118,7 @@ export class RedocNormalizedOptions {
   untrustedSpec: boolean;
   hideDownloadButton: boolean;
   disableSearch: boolean;
+  onlyRequiredInSamples: boolean;
   showExtensions: boolean | string[];
 
   /* tslint:disable-next-line */
@@ -144,6 +146,7 @@ export class RedocNormalizedOptions {
     this.untrustedSpec = argValueToBoolean(raw.untrustedSpec);
     this.hideDownloadButton = argValueToBoolean(raw.hideDownloadButton);
     this.disableSearch = argValueToBoolean(raw.disableSearch);
+    this.onlyRequiredInSamples = argValueToBoolean(raw.onlyRequiredInSamples);
     this.showExtensions = RedocNormalizedOptions.normalizeShowExtensions(raw.showExtensions);
 
     this.unstable_ignoreMimeParameters = argValueToBoolean(raw.unstable_ignoreMimeParameters);
diff --git a/src/services/models/MediaType.ts b/src/services/models/MediaType.ts
index ff471e27..941a35fb 100644
--- a/src/services/models/MediaType.ts
+++ b/src/services/models/MediaType.ts
@@ -13,6 +13,7 @@ export class MediaTypeModel {
   schema?: SchemaModel;
   name: string;
   isRequestType: boolean;
+  onlyRequiredInSamples: boolean;
 
   /**
    * @param isRequestType needed to know if skipe RO/RW fields in objects
@@ -27,6 +28,7 @@ export class MediaTypeModel {
     this.name = name;
     this.isRequestType = isRequestType;
     this.schema = info.schema && new SchemaModel(parser, info.schema, '', options);
+    this.onlyRequiredInSamples = options.onlyRequiredInSamples;
     if (info.examples !== undefined) {
       this.examples = mapValues(info.examples, example => new ExampleModel(parser, example));
     } else if (info.example !== undefined) {
@@ -39,12 +41,17 @@ export class MediaTypeModel {
   }
 
   generateExample(parser: OpenAPIParser, info: OpenAPIMediaType) {
+    const samplerOptions = {
+      skipReadOnly: this.isRequestType,
+      skipNonRequired: this.isRequestType && this.onlyRequiredInSamples,
+      skipWriteOnly: !this.isRequestType,
+    };
     if (this.schema && this.schema.oneOf) {
       this.examples = {};
       for (const subSchema of this.schema.oneOf) {
         const sample = Sampler.sample(
           subSchema.rawSchema,
-          { skipReadOnly: this.isRequestType, skipWriteOnly: !this.isRequestType },
+          samplerOptions,
           parser.spec,
         );
 
@@ -61,7 +68,7 @@ export class MediaTypeModel {
         default: new ExampleModel(parser, {
           value: Sampler.sample(
             info.schema,
-            { skipReadOnly: this.isRequestType, skipWriteOnly: !this.isRequestType },
+            samplerOptions,
             parser.spec,
           ),
         }),