From ac6b3b088df4f94885c23b216dd63caf1e3a9a80 Mon Sep 17 00:00:00 2001 From: Christian Wendt <54559756+cwendtxealth@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:41:34 -0800 Subject: [PATCH] fix: #3961 resolve all recurse list for object properties (#3981) * fix: resolve all recurse list for object properties * update test * simplfy logic * revert * update change log --- CHANGELOG.md | 5 +++++ packages/core/test/Form.test.jsx | 6 +++--- packages/utils/src/schema/retrieveSchema.ts | 9 ++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d79018b7..dd6d4a7436 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,12 @@ should change the heading of the (upcoming) version to include a major version b --> # 5.14.4 +## @rjsf/utils + +- Updated `resolveAllReferences()` to use own recurse list for each object properties, fixing [#3961](https://github.com/rjsf-team/react-jsonschema-form/issues/3961) + ## Dev + - add missing typescript project reference for `utils` in `validator-ajv6` and `validator-ajv8` packages tsconfigs # 5.14.3 diff --git a/packages/core/test/Form.test.jsx b/packages/core/test/Form.test.jsx index 6659e109e2..3038224e36 100644 --- a/packages/core/test/Form.test.jsx +++ b/packages/core/test/Form.test.jsx @@ -1354,7 +1354,7 @@ describeRepeated('Form common', (createFormComponent) => { name: 'required', params: { missingProperty: 'street_address' }, property: '.shipping_address.street_address', - schemaPath: '#/definitions/address/required', + schemaPath: '#/properties/shipping_address/required', stack: "must have required property 'street_address'", }, { @@ -1362,7 +1362,7 @@ describeRepeated('Form common', (createFormComponent) => { name: 'required', params: { missingProperty: 'city' }, property: '.shipping_address.city', - schemaPath: '#/definitions/address/required', + schemaPath: '#/properties/shipping_address/required', stack: "must have required property 'city'", }, { @@ -1370,7 +1370,7 @@ describeRepeated('Form common', (createFormComponent) => { name: 'required', params: { missingProperty: 'state' }, property: '.shipping_address.state', - schemaPath: '#/definitions/address/required', + schemaPath: '#/properties/shipping_address/required', stack: "must have required property 'state'", }, ]); diff --git a/packages/utils/src/schema/retrieveSchema.ts b/packages/utils/src/schema/retrieveSchema.ts index 9463f84000..0f46632f1c 100644 --- a/packages/utils/src/schema/retrieveSchema.ts +++ b/packages/utils/src/schema/retrieveSchema.ts @@ -3,6 +3,9 @@ import isEqual from 'lodash/isEqual'; import set from 'lodash/set'; import times from 'lodash/times'; import transform from 'lodash/transform'; +import merge from 'lodash/merge'; +import flattenDeep from 'lodash/flattenDeep'; +import uniq from 'lodash/uniq'; import mergeAllOf, { Options } from 'json-schema-merge-allof'; import { @@ -265,13 +268,17 @@ export function resolveAllReferences( } if (PROPERTIES_KEY in resolvedSchema) { + const childrenLists: string[][] = []; const updatedProps = transform( resolvedSchema[PROPERTIES_KEY]!, (result, value, key: string) => { - result[key] = resolveAllReferences(value as S, rootSchema, recurseList); + const childList: string[] = [...recurseList]; + result[key] = resolveAllReferences(value as S, rootSchema, childList); + childrenLists.push(childList); }, {} as RJSFSchema ); + merge(recurseList, uniq(flattenDeep(childrenLists))); resolvedSchema = { ...resolvedSchema, [PROPERTIES_KEY]: updatedProps }; }