From a1913e4b62984542baf91ee396e46e84f601dbea Mon Sep 17 00:00:00 2001
From: Vincenzo Chianese <vincenz.chianese@icloud.com>
Date: Tue, 17 Sep 2019 16:12:03 +0200
Subject: [PATCH] fix: do not remove shared required properties in allOf
 selection (#524)

* fix: do not remove shared required properties

* test: add test
---
 dist/bundle.umd.min.js                        | Bin 222213 -> 222264 bytes
 dist/index.esm.js                             | Bin 49183 -> 49258 bytes
 dist/index.js                                 | Bin 49385 -> 49460 bytes
 dist/index.umd.js                             | Bin 76249 -> 76324 bytes
 dist/index.umd.min.js                         | Bin 28898 -> 28949 bytes
 dist/index.umd.min.js.map                     | Bin 113080 -> 113202 bytes
 src/core/run.js                               |   2 +-
 .../required/do-not-delete-shared-props.json  |  69 ++++++++++++++++++
 8 files changed, 70 insertions(+), 1 deletion(-)
 create mode 100644 tests/schema/core/required/do-not-delete-shared-props.json

diff --git a/dist/bundle.umd.min.js b/dist/bundle.umd.min.js
index 848748539616e0d5c24954896e58387f6a865432..c4d89ff3a7ee3bb434b35695297d2062d700f8f2 100644
GIT binary patch
delta 62
zcmZoY!Mo!GZ$k@X3)2>6_88X8oRZX{=?g=dg(VbA^omjoOEZg7Q}i<Pl5<K^Qj0ZG
SHEX9gE@c$nE*``DjvWBS_ZB<=

delta 25
hcmdmSg17YqZ$k@X3)2>6_L#|yHp1I|W0+sF0|0^{2}J+^

diff --git a/dist/index.esm.js b/dist/index.esm.js
index 35ead862e388d8573bf9e467f13e834703ec3566..8aab5fe752f920ca0742812513a3e717930ea9af 100644
GIT binary patch
delta 95
zcmbQ=!2GI#dBfxN9+^2MsYM!TrFqFEnfZAN8bzsvrI|&kDVhq^3Pq_UrA2uPifNe@
lsVRCe8NJNB<ebu!)MA8MYlYg$2a81}CunkS{=Z&9001o<C3gS-

delta 22
ecmaFWz&yW!dBfxNlV2JMPEOF|-t4tOK>z@IlL?go

diff --git a/dist/index.js b/dist/index.js
index b64016d42e47cf6e4775659ba0e60e93fbed9534..8d05375d63a343539b2121754898e26149998a1a 100644
GIT binary patch
delta 91
zcmaFa$h@VAdBf@r9+^2MsYM!TrFqFEnfZAN8bzsvrI|&kDVhq^3Pq_UrA2uPifNe@
hsVRCe8NJNB<ebu!)MA8MYlYg$YiyM_pWYxR005AsBfkIu

delta 22
ecmdne#Qd_6dBf@rlcyUCPCj7EzgcXfoB#lLbqQwx

diff --git a/dist/index.umd.js b/dist/index.umd.js
index 17023b7c16afeabf1cfdbef77f5a31bb8849dbb8..149b6ef75ff23c141d7f6662e404953cd9e39e99 100644
GIT binary patch
delta 91
zcmcb4nPtfpmWC~ijS`-jIVGt@8fm3@$t9Wjc?udusfDGPMX4#83e^flsU@XFc?ybY
gnH8xidN3Ki%)I2B(v;L<gj#EbTFveC5{yxT0B0~E@c;k-

delta 29
lcmZ2-h2`dDmWC~ijS`bHZwgL+H&1YKzB|YEZxW1pf&k803}*lU

diff --git a/dist/index.umd.min.js b/dist/index.umd.min.js
index bfbb5052724591f8bac839b191f89f7bdb6927c1..ea5aa55bdb7ffe8b9724f3931df524e9d9a0fcec 100644
GIT binary patch
delta 43
zcmaF#ka6lG#tlz0CNmpKNGg`-6{QxIW)`KU=w;?5=ai<T7Hgzx)@m+(l)(W2jqMRD

delta 14
WcmbRGi1E=w#tlz0Hj8KeV+Q~`hzD^1

diff --git a/dist/index.umd.min.js.map b/dist/index.umd.min.js.map
index ffd4bef441cfa98be8a9e9378254f3a4b68aefd7..cd29ca7a5e9c53f9c491b3f1538f9f60bb7d465d 100644
GIT binary patch
delta 1031
zcmdn-nQhY-wuUW?jZ)s3IVGt@8bzsvrI|&kDGIiB3W{l&6{#tDFd@CnyyTqHl+<Fl
zB27)bwEQC1#N-T(w9>rflFa-(1&!>~%E^r$qT3fqG5%6yhichA!-nxziM^?lPP&t$
zqrZuhPN<_}qM5gjtD~c@xwlTRqhqi(gwprc@pg0!ukzCgbaV^^$%Gnt>x4QwTe?nf
z+{jqQQSPqe>*(mKKmGqk#!!w-Cy*K8S<_=SF)D}}gy^_CIvO~Gj8AgZ33ha@a4MNT
zaTDWO4l|Ist^ozp-8M4@@n%Qq_=Al1c61KQn!a>1qlrm+0LY}^tOyY0n;oH(>gbs1
zWbO;%`kVRc<T^RJRyezW^aVSDtO+fPoW5`&qv&*{EsPQz*-<*dj_v`b+nu&BnlZ{)
z_=1!KRygVSJ32>Hf?XM?6YA(1l;J;p%2q}V4sEc>zWURTY-Ln7hwuWcoWR<2+#TH^
zn%qN7BXv9-9evFrbs`-d{WJVP?g=dR0a3n2)8)1?n%9>&gTg7;5FDN$xo}5!OD6-c
zS)L`%I@wN+j*$r2P)GMP7aey;H~&ho5|At19bLUjz=j5v`sjE&x|=#dBt0wKbuyhC
z9m6Z!K~{oH2Su6@NT+iESV}3x*h$CJ(K*Bj>`h-|5asOW2vYB_<LT%fVl@5RHbx_j
zvT#VG`h$W#($TfdsW2R*C=lctM~E}rGn}-i2W)556E+9Mk!t|hm|#$%@Xeh*aXX_5
zW7hO-+ZlCr&75^y9i6?LLE#b!jy3NrNa*M|gCf4%9b{WDh!c=GU0?^JpS`gwC}sF(
zI)g&l(*Wd7M}K1%kQ=;nopt;j-SeFDopih%T^+r_O0s;R@$Ks9oRm3z?hZz&dgDmA
zn0t~@Bv_rkH#lX7R``R=@-0sUrPv%NL$F1mC0-yM{s>8TN9PQuEKs1ihk(<PXBpIh
z3~(w$H^9;pYyenN(h($!X+nn2bpM@<N;26|I^K@X{@yyCjxfWsA^9%2YI^TZMrnc4
PD6pGzoj~Ces#FUA9(OX%

delta 853
zcmdn=g>A=YwuUW?jZ%~O4vA0KlVaqW{y>V6W&2Yp#&3$-pV=^8E8(y5)5&ylbPP1|
z)(LfVPMZFEBV!pysk@G^qoc3o^vX?)p&aQ>I<Ah6;ThAfZDLdqtqjp|cXTvx)(LfV
zOmfr-c66?ADw@u{nQ<+LiMNioqiaCk^aGn2gLpHebo?D119iL|ox?Jw%Wq*ck<<1E
znG~E60it{}BXm+79W$LweL-A*lj((97)2OMrnhZj)Z@sE(g}8S4=~=oXA7elql}p^
z$kxCzCmnxB=ZJE!ivo2*9bJR;{igG6W7OcV0Gr}#Io)m>qp~@K7g*s0)~4g`=nm23
z9%3A+<LT(=YZ9pw>FDUM57re}>;rOwufg;g+ZfFmi>6=L#wf~B3D)dcH2v*1Mrn?6
zFfXudy1;fuQEv#(v&<bFdf^rBApLM-KuVnhz)~TGPCA~B&LIY1C;J+LC}%%MkaB+=
zPe<<%gXsm^8I3eb!gT^cp#=`INJrN)r~Gh`qCgk056VDBx@S09Oh2`qQBT+u6t=Db
zU}J)Hyd52Vv!`?KU{qnum~OCxQCGyoS;y7U*~=N^$4GE!duL29+`%Zpm_EI02cuuT
zp(`l<{4<?Frh8U`T;=F*=mN6QJJ(sq-_bqKIoAmkosQmMB^kb;*bD~Q=$w=ejt$Rr
zP;59t#WFxHbo4ZggsXE;GKd80we;3WcXD(LtpG>AZ)u`VeW;^zj#Cxb_Rtb9kQRT0
zth=LghEo<O+}uMP!6uYIO~?oUxe#OmvH_N!U;_}6m<H&3gVI`HnLj9%hgnR&wv$nm
vF?0Hxos3dC6^S50FN+9}RiPyjp!DGxq~q!6UglIB1rqekbppjss8THeg`oW2

diff --git a/src/core/run.js b/src/core/run.js
index 430f8dc4..23ac43e8 100644
--- a/src/core/run.js
+++ b/src/core/run.js
@@ -169,7 +169,7 @@ function run(refs, schema, container) {
             if (sub.oneOf) {
               mix.forEach(omit => {
                 if (omit !== fixed && omit.required) {
-                  omit.required.forEach(key => {
+                  omit.required.filter(required => !fixed.required.includes(required)).forEach(function (key) {
                     delete copy.properties[key];
                   });
                 }
diff --git a/tests/schema/core/required/do-not-delete-shared-props.json b/tests/schema/core/required/do-not-delete-shared-props.json
new file mode 100644
index 00000000..d9c80973
--- /dev/null
+++ b/tests/schema/core/required/do-not-delete-shared-props.json
@@ -0,0 +1,69 @@
+[
+  {
+    "description": "when allOf is provided and all the schemas are sharing some required properties",
+    "tests": [
+      {
+        "description": "should not remove the shared properties",
+        "schema": {
+          "type": "object",
+          "oneOf": [
+            {
+              "$ref": "#/components/A"
+            },
+            {
+              "$ref": "#/components/B"
+            }
+          ],
+          "components": {
+            "A": {
+              "required": [
+                "name",
+                "resourceType"
+              ],
+              "type": "object",
+              "properties": {
+                "resourceType": {
+                  "type": "string"
+                },
+                "name": {
+                  "type": "string"
+                },
+                "color": {
+                  "type": "string"
+                },
+                "length": {
+                  "type": "integer"
+                }
+              }
+            },
+            "B": {
+              "required": [
+                "name",
+                "resourceType"
+              ],
+              "type": "object",
+              "properties": {
+                "resourceType": {
+                  "type": "string"
+                },
+                "name": {
+                  "type": "string"
+                },
+                "description": {
+                  "type": "string"
+                },
+                "age": {
+                  "type": "integer"
+                }
+              }
+            }
+          }
+        },
+        "hasProps": [
+          "name",
+          "resourceType"
+        ]
+      }
+    ]
+  }
+]
-- 
GitLab