@rjsf/utils 6.6.2 → 6.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +0 -4
  3. package/dist/index.cjs +246 -112
  4. package/dist/index.cjs.map +4 -4
  5. package/dist/utils.esm.js +246 -112
  6. package/dist/utils.esm.js.map +4 -4
  7. package/dist/utils.umd.js +277 -140
  8. package/lib/SelectedOptionDescription.d.ts +4 -0
  9. package/lib/SelectedOptionDescription.js +24 -0
  10. package/lib/SelectedOptionDescription.js.map +1 -0
  11. package/lib/asNumber.d.ts +6 -5
  12. package/lib/asNumber.js +14 -9
  13. package/lib/asNumber.js.map +1 -1
  14. package/lib/constants.d.ts +8 -5
  15. package/lib/constants.js +10 -7
  16. package/lib/constants.js.map +1 -1
  17. package/lib/createSchemaUtils.js +1 -1
  18. package/lib/createSchemaUtils.js.map +1 -1
  19. package/lib/enums.d.ts +4 -0
  20. package/lib/enums.js +4 -0
  21. package/lib/enums.js.map +1 -1
  22. package/lib/getDecimalSeparator.d.ts +8 -0
  23. package/lib/getDecimalSeparator.js +23 -0
  24. package/lib/getDecimalSeparator.js.map +1 -0
  25. package/lib/getSubmitButtonOptions.js +1 -1
  26. package/lib/getSubmitButtonOptions.js.map +1 -1
  27. package/lib/getWidget.js +2 -1
  28. package/lib/getWidget.js.map +1 -1
  29. package/lib/hashForSchema.d.ts +2 -0
  30. package/lib/hashForSchema.js +3 -1
  31. package/lib/hashForSchema.js.map +1 -1
  32. package/lib/index.d.ts +6 -2
  33. package/lib/index.js +5 -2
  34. package/lib/index.js.map +1 -1
  35. package/lib/isFixedItems.d.ts +2 -2
  36. package/lib/isFixedItems.js +3 -3
  37. package/lib/isFixedItems.js.map +1 -1
  38. package/lib/isRootSchema.js +2 -3
  39. package/lib/isRootSchema.js.map +1 -1
  40. package/lib/logUnsupportedDefaultForEnum.d.ts +9 -0
  41. package/lib/logUnsupportedDefaultForEnum.js +18 -0
  42. package/lib/logUnsupportedDefaultForEnum.js.map +1 -0
  43. package/lib/mergeSchemas.js +8 -1
  44. package/lib/mergeSchemas.js.map +1 -1
  45. package/lib/optionsList.js +22 -21
  46. package/lib/optionsList.js.map +1 -1
  47. package/lib/resolveUiSchema.js.map +1 -1
  48. package/lib/schema/getDefaultFormState.d.ts +1 -1
  49. package/lib/schema/getDefaultFormState.js +53 -17
  50. package/lib/schema/getDefaultFormState.js.map +1 -1
  51. package/lib/schema/getDisplayLabel.js +2 -3
  52. package/lib/schema/getDisplayLabel.js.map +1 -1
  53. package/lib/schema/omitExtraData.js +11 -0
  54. package/lib/schema/omitExtraData.js.map +1 -1
  55. package/lib/schema/retrieveSchema.d.ts +5 -1
  56. package/lib/schema/retrieveSchema.js +49 -14
  57. package/lib/schema/retrieveSchema.js.map +1 -1
  58. package/lib/schemaRequiresTrueValue.js +4 -3
  59. package/lib/schemaRequiresTrueValue.js.map +1 -1
  60. package/lib/tsconfig.tsbuildinfo +1 -1
  61. package/lib/types.d.ts +24 -0
  62. package/lib/useAltDateWidgetProps.d.ts +1 -1
  63. package/lib/useFileWidgetProps.js +2 -2
  64. package/lib/useFileWidgetProps.js.map +1 -1
  65. package/package.json +19 -19
  66. package/src/SelectedOptionDescription.tsx +48 -0
  67. package/src/asNumber.ts +18 -9
  68. package/src/constants.ts +10 -7
  69. package/src/createSchemaUtils.ts +1 -1
  70. package/src/enums.ts +4 -0
  71. package/src/getDecimalSeparator.ts +20 -0
  72. package/src/getSubmitButtonOptions.ts +1 -1
  73. package/src/getWidget.tsx +1 -1
  74. package/src/hashForSchema.ts +3 -1
  75. package/src/index.ts +8 -0
  76. package/src/isFixedItems.ts +3 -3
  77. package/src/isRootSchema.ts +2 -4
  78. package/src/logUnsupportedDefaultForEnum.ts +28 -0
  79. package/src/mergeSchemas.ts +9 -2
  80. package/src/optionsList.ts +20 -22
  81. package/src/resolveUiSchema.ts +12 -4
  82. package/src/schema/getDefaultFormState.ts +79 -22
  83. package/src/schema/getDisplayLabel.ts +3 -4
  84. package/src/schema/omitExtraData.ts +11 -0
  85. package/src/schema/retrieveSchema.ts +59 -13
  86. package/src/schemaRequiresTrueValue.ts +3 -3
  87. package/src/types.ts +31 -0
  88. package/src/useFileWidgetProps.ts +2 -2
package/dist/index.cjs CHANGED
@@ -61,10 +61,13 @@ __export(index_exports, {
61
61
  REF_KEY: () => REF_KEY,
62
62
  REQUIRED_KEY: () => REQUIRED_KEY,
63
63
  RJSF_ADDITIONAL_PROPERTIES_FLAG: () => RJSF_ADDITIONAL_PROPERTIES_FLAG,
64
+ RJSF_PREFIX_KEY: () => RJSF_PREFIX_KEY,
65
+ RJSF_REF_CYCLE_KEY: () => RJSF_REF_CYCLE_KEY,
64
66
  RJSF_REF_KEY: () => RJSF_REF_KEY,
65
67
  ROOT_SCHEMA_PREFIX: () => ROOT_SCHEMA_PREFIX,
66
68
  SCHEMA_KEY: () => SCHEMA_KEY,
67
69
  SUBMIT_BTN_OPTIONS_KEY: () => SUBMIT_BTN_OPTIONS_KEY,
70
+ SelectedOptionDescription: () => SelectedOptionDescription,
68
71
  TranslatableString: () => TranslatableString,
69
72
  UI_DEFINITIONS_KEY: () => UI_DEFINITIONS_KEY,
70
73
  UI_FIELD_KEY: () => UI_FIELD_KEY,
@@ -101,6 +104,7 @@ __export(index_exports, {
101
104
  getChangedFields: () => getChangedFields,
102
105
  getClosestMatchingOption: () => getClosestMatchingOption,
103
106
  getDateElementProps: () => getDateElementProps,
107
+ getDecimalSeparator: () => getDecimalSeparator,
104
108
  getDefaultFormState: () => getDefaultFormState,
105
109
  getDiscriminatorFieldFromSchema: () => getDiscriminatorFieldFromSchema,
106
110
  getDisplayLabel: () => getDisplayLabel,
@@ -135,6 +139,7 @@ __export(index_exports, {
135
139
  isValueEmpty: () => isValueEmpty,
136
140
  labelValue: () => labelValue,
137
141
  localToUTC: () => localToUTC,
142
+ logUnsupportedDefaultForEnum: () => logUnsupportedDefaultForEnum,
138
143
  lookupFromFormContext: () => lookupFromFormContext,
139
144
  mergeDefaultsWithFormData: () => mergeDefaultsWithFormData,
140
145
  mergeObjects: () => mergeObjects,
@@ -198,6 +203,20 @@ function allowAdditionalItems(schema) {
198
203
  return isObject(schema.additionalItems);
199
204
  }
200
205
 
206
+ // src/getDecimalSeparator.ts
207
+ function getDecimalSeparator(languages) {
208
+ const locales = languages || (typeof navigator !== "undefined" ? navigator.languages : void 0);
209
+ if (locales) {
210
+ try {
211
+ const formatter = new Intl.NumberFormat(locales);
212
+ const parts = formatter.formatToParts(1.1);
213
+ return parts.find((part) => part.type === "decimal")?.value || ".";
214
+ } catch (e) {
215
+ }
216
+ }
217
+ return ".";
218
+ }
219
+
201
220
  // src/asNumber.ts
202
221
  function asNumber(value) {
203
222
  if (value === "") {
@@ -206,22 +225,24 @@ function asNumber(value) {
206
225
  if (value === null) {
207
226
  return null;
208
227
  }
209
- if (/\.$/.test(value)) {
228
+ const separator = getDecimalSeparator();
229
+ const standardValue = typeof value === "string" && separator !== "." ? value.replace(separator, ".") : value;
230
+ if (/\.$/.test(standardValue)) {
210
231
  return value;
211
232
  }
212
- if (/\.0$/.test(value)) {
233
+ if (/\.0$/.test(standardValue)) {
213
234
  return value;
214
235
  }
215
- if (/\.\d*0$/.test(value)) {
236
+ if (/\.\d*0$/.test(standardValue)) {
216
237
  return value;
217
238
  }
218
- const n = Number(value);
239
+ const n = Number(standardValue);
219
240
  const valid = typeof n === "number" && !Number.isNaN(n);
220
241
  return valid ? n : value;
221
242
  }
222
243
 
223
244
  // src/constants.ts
224
- var ADDITIONAL_PROPERTY_FLAG = "__additional_property";
245
+ var ADDITIONAL_PROPERTY_FLAG = /* @__PURE__ */ Symbol("__additional_property");
225
246
  var ADDITIONAL_PROPERTIES_KEY = "additionalProperties";
226
247
  var ALL_OF_KEY = "allOf";
227
248
  var ANY_OF_KEY = "anyOf";
@@ -243,15 +264,17 @@ var READONLY_KEY = "readonly";
243
264
  var REQUIRED_KEY = "required";
244
265
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
245
266
  var REF_KEY = "$ref";
246
- var RJSF_REF_KEY = "__rjsf_ref";
267
+ var RJSF_REF_KEY = /* @__PURE__ */ Symbol("__rjsf_ref");
268
+ var RJSF_REF_CYCLE_KEY = /* @__PURE__ */ Symbol("__rjsf_ref_cycle");
247
269
  var SCHEMA_KEY = "$schema";
248
270
  var DEFAULT_ID_PREFIX = "root";
249
271
  var DEFAULT_ID_SEPARATOR = "_";
250
272
  var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
251
273
  var FORM_CONTEXT_NAME = "formContext";
252
274
  var LOOKUP_MAP_NAME = "layoutGridLookupMap";
253
- var RJSF_ADDITIONAL_PROPERTIES_FLAG = "__rjsf_additionalProperties";
254
- var ROOT_SCHEMA_PREFIX = "__rjsf_rootSchema";
275
+ var RJSF_PREFIX_KEY = "__rjsf";
276
+ var RJSF_ADDITIONAL_PROPERTIES_FLAG = `${RJSF_PREFIX_KEY}_additionalProperties`;
277
+ var ROOT_SCHEMA_PREFIX = `${RJSF_PREFIX_KEY}_rootSchema`;
255
278
  var UI_FIELD_KEY = "ui:field";
256
279
  var UI_WIDGET_KEY = "ui:widget";
257
280
  var UI_OPTIONS_KEY = "ui:options";
@@ -322,7 +345,7 @@ function createErrorHandler(formData) {
322
345
  }
323
346
 
324
347
  // src/createSchemaUtils.ts
325
- var import_get17 = __toESM(require("lodash/get"), 1);
348
+ var import_get16 = __toESM(require("lodash/get"), 1);
326
349
 
327
350
  // src/deepEquals.ts
328
351
  var import_fast_equals = require("fast-equals");
@@ -526,7 +549,7 @@ function getSchemaType(schema) {
526
549
  // src/mergeSchemas.ts
527
550
  function mergeSchemas(obj1, obj2) {
528
551
  const acc = { ...obj1 };
529
- return Object.keys(obj2).reduce((accumulator, key) => {
552
+ const result = Object.keys(obj2).reduce((accumulator, key) => {
530
553
  const left = obj1 ? obj1[key] : {}, right = obj2[key];
531
554
  if (obj1 && key in obj1 && isObject(right)) {
532
555
  accumulator[key] = mergeSchemas(left, right);
@@ -537,6 +560,10 @@ function mergeSchemas(obj1, obj2) {
537
560
  }
538
561
  return accumulator;
539
562
  }, acc);
563
+ for (const sym of Object.getOwnPropertySymbols(obj2)) {
564
+ result[sym] = obj2[sym];
565
+ }
566
+ return result;
540
567
  }
541
568
 
542
569
  // src/schema/getFirstMatchingOption.ts
@@ -638,6 +665,12 @@ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experim
638
665
  resolveAnyOfOrOneOfRefs
639
666
  )[0];
640
667
  }
668
+ function normalizeBooleanSchema(schema) {
669
+ if (typeof schema !== "boolean") {
670
+ return schema;
671
+ }
672
+ return schema ? {} : { not: {} };
673
+ }
641
674
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
642
675
  const { if: expression, then, else: otherwise, ...resolvedSchemaLessConditional } = schema;
643
676
  const conditionValue = validator.isValid(expression, formData || {}, rootSchema);
@@ -645,10 +678,11 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
645
678
  let schemas = [];
646
679
  if (expandAllBranches) {
647
680
  if (then && typeof then !== "boolean") {
681
+ const thenSchema = then;
648
682
  schemas = schemas.concat(
649
683
  retrieveSchemaInternal(
650
684
  validator,
651
- then,
685
+ thenSchema,
652
686
  rootSchema,
653
687
  formData,
654
688
  expandAllBranches,
@@ -658,10 +692,11 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
658
692
  );
659
693
  }
660
694
  if (otherwise && typeof otherwise !== "boolean") {
695
+ const otherwiseSchema = otherwise;
661
696
  schemas = schemas.concat(
662
697
  retrieveSchemaInternal(
663
698
  validator,
664
- otherwise,
699
+ otherwiseSchema,
665
700
  rootSchema,
666
701
  formData,
667
702
  expandAllBranches,
@@ -671,8 +706,9 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
671
706
  );
672
707
  }
673
708
  } else {
674
- const conditionalSchema = conditionValue ? then : otherwise;
675
- if (conditionalSchema && typeof conditionalSchema !== "boolean") {
709
+ const conditionalBranch = conditionValue ? then : otherwise;
710
+ if (conditionalBranch !== void 0) {
711
+ const conditionalSchema = normalizeBooleanSchema(conditionalBranch);
676
712
  schemas = schemas.concat(
677
713
  retrieveSchemaInternal(
678
714
  validator,
@@ -796,7 +832,7 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
796
832
  }
797
833
  return [schema];
798
834
  }
799
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
835
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs, markCycleOnDetection = false) {
800
836
  if (!isObject(schema)) {
801
837
  return schema;
802
838
  }
@@ -805,7 +841,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveA
805
841
  if (REF_KEY in resolvedSchema) {
806
842
  const { $ref, ...localSchema } = resolvedSchema;
807
843
  if (recurseList.includes($ref)) {
808
- return resolvedSchema;
844
+ return markCycleOnDetection ? { ...resolvedSchema, [RJSF_REF_CYCLE_KEY]: true } : resolvedSchema;
809
845
  }
810
846
  recurseList.push($ref);
811
847
  const refSchema = findSchemaDefinition($ref, rootSchema, currentBaseURI);
@@ -820,7 +856,14 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveA
820
856
  resolvedSchema[PROPERTIES_KEY],
821
857
  (acc, value, key) => {
822
858
  const childList = [...recurseList];
823
- acc[key] = resolveAllReferences(value, rootSchema, childList, currentBaseURI, resolveAnyOfOrOneOfRefs);
859
+ acc[key] = resolveAllReferences(
860
+ value,
861
+ rootSchema,
862
+ childList,
863
+ currentBaseURI,
864
+ resolveAnyOfOrOneOfRefs,
865
+ !resolveAnyOfOrOneOfRefs
866
+ );
824
867
  childrenLists.push(childList);
825
868
  },
826
869
  {}
@@ -831,6 +874,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveA
831
874
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
832
875
  resolvedSchema = {
833
876
  ...resolvedSchema,
877
+ // Array items are only rendered when data exists, so a $ref cycle here does NOT cause an infinite render.
834
878
  items: resolveAllReferences(
835
879
  resolvedSchema.items,
836
880
  rootSchema,
@@ -881,7 +925,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
881
925
  (0, import_get5.default)(formData, [key]),
882
926
  experimental_customMergeAllOf
883
927
  );
884
- (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
928
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
885
929
  return;
886
930
  }
887
931
  }
@@ -893,7 +937,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
893
937
  validator,
894
938
  { [REF_KEY]: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
895
939
  rootSchema,
896
- formData,
940
+ (0, import_get5.default)(formData, [key]),
897
941
  experimental_customMergeAllOf
898
942
  );
899
943
  } else if ("type" in schema.additionalProperties) {
@@ -910,10 +954,10 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
910
954
  additionalProperties = { type: guessType((0, import_get5.default)(formData, [key])) };
911
955
  }
912
956
  schema.properties[key] = additionalProperties;
913
- (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
957
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
914
958
  } else {
915
959
  schema.properties[key] = { type: "null" };
916
- (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
960
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
917
961
  }
918
962
  });
919
963
  return schema;
@@ -956,17 +1000,26 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
956
1000
  try {
957
1001
  const withContainsSchemas = [];
958
1002
  const withoutContainsSchemas = [];
1003
+ const allOfSymbols = {};
959
1004
  resolvedSchema.allOf?.forEach((allOfItem) => {
960
1005
  if (typeof allOfItem === "object" && allOfItem.contains) {
961
1006
  withContainsSchemas.push(allOfItem);
962
1007
  } else {
963
1008
  withoutContainsSchemas.push(allOfItem);
1009
+ for (const sym of Object.getOwnPropertySymbols(allOfItem)) {
1010
+ if (!(sym in allOfSymbols)) {
1011
+ allOfSymbols[sym] = allOfItem[sym];
1012
+ }
1013
+ }
964
1014
  }
965
1015
  });
966
1016
  if (withContainsSchemas.length) {
967
1017
  resolvedSchema = { ...resolvedSchema, allOf: withoutContainsSchemas };
968
1018
  }
969
1019
  resolvedSchema = experimental_customMergeAllOf ? experimental_customMergeAllOf(resolvedSchema) : mergeAllOf(resolvedSchema);
1020
+ for (const sym of Object.getOwnPropertySymbols(allOfSymbols)) {
1021
+ resolvedSchema[sym] = allOfSymbols[sym];
1022
+ }
970
1023
  if (withContainsSchemas.length) {
971
1024
  resolvedSchema.allOf = withContainsSchemas;
972
1025
  }
@@ -1035,7 +1088,7 @@ function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranch
1035
1088
  function relaxOptionsForScoring(options, resolveRefs = false, rootSchema) {
1036
1089
  return options.map((d) => {
1037
1090
  if (!isObject(d)) {
1038
- return d ? {} : { not: {} };
1091
+ return normalizeBooleanSchema(d);
1039
1092
  }
1040
1093
  const schema = resolveRefs && rootSchema ? resolveAllReferences(d, rootSchema, []) : d;
1041
1094
  return schema.additionalProperties === false ? { ...schema, additionalProperties: true } : schema;
@@ -1149,7 +1202,7 @@ function withDependentSchema(validator, schema, rootSchema, dependencyKey, depen
1149
1202
  }
1150
1203
  function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, oneOf, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
1151
1204
  const validSubschemas = oneOf.filter((subschema) => {
1152
- if (typeof subschema === "boolean" || !subschema || !subschema.properties) {
1205
+ if (typeof subschema === "boolean" || !subschema?.properties) {
1153
1206
  return false;
1154
1207
  }
1155
1208
  const { [dependencyKey]: conditionPropertySchema } = subschema.properties;
@@ -1470,7 +1523,7 @@ function isConstant(schema) {
1470
1523
 
1471
1524
  // src/isFixedItems.ts
1472
1525
  function isFixedItems(schema) {
1473
- return Array.isArray(schema.items) && schema.items.length > 0 && schema.items.every((item) => isObject(item));
1526
+ return Array.isArray(schema.items) && schema.items.every((item) => isObject(item));
1474
1527
  }
1475
1528
 
1476
1529
  // src/mergeDefaultsWithFormData.ts
@@ -1619,7 +1672,7 @@ function optionsList(schema, uiSchema) {
1619
1672
  const { optionsSchemaSelector = selectorField } = getUiOptions(uiSchema);
1620
1673
  selectorField = optionsSchemaSelector;
1621
1674
  }
1622
- return altSchemas && altSchemas.map((aSchemaDef, index) => {
1675
+ return altSchemas?.map((aSchemaDef, index) => {
1623
1676
  const { title } = getUiOptions(altUiSchemas?.[index]);
1624
1677
  const aSchema = aSchemaDef;
1625
1678
  let value;
@@ -1627,10 +1680,10 @@ function optionsList(schema, uiSchema) {
1627
1680
  if (selectorField) {
1628
1681
  const innerSchema = (0, import_get11.default)(aSchema, [PROPERTIES_KEY, selectorField], {});
1629
1682
  value = (0, import_get11.default)(innerSchema, DEFAULT_KEY, (0, import_get11.default)(innerSchema, CONST_KEY));
1630
- label = label || innerSchema?.title || aSchema.title || String(value);
1683
+ label = label ?? innerSchema?.title ?? aSchema.title ?? String(value);
1631
1684
  } else {
1632
1685
  value = toConstant(aSchema);
1633
- label = label || aSchema.title || String(value);
1686
+ label = label ?? aSchema.title ?? String(value);
1634
1687
  }
1635
1688
  return {
1636
1689
  schema: aSchema,
@@ -1720,8 +1773,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1720
1773
  rootSchema = {},
1721
1774
  includeUndefinedValues = false,
1722
1775
  _recurseList = [],
1723
- experimental_defaultFormStateBehavior = void 0,
1724
- experimental_customMergeAllOf = void 0,
1776
+ experimental_defaultFormStateBehavior,
1777
+ experimental_customMergeAllOf,
1725
1778
  required,
1726
1779
  shouldMergeDefaultsIntoFormData = false,
1727
1780
  initialDefaultsGenerated
@@ -1729,14 +1782,19 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1729
1782
  let formData = isObject(rawFormData) ? rawFormData : {};
1730
1783
  const schema = isObject(rawSchema) ? rawSchema : {};
1731
1784
  let defaults = parentDefaults;
1785
+ const preferParentDefaults = defaults && experimental_defaultFormStateBehavior?.nestedDefaultsPrecedence === "ancestorWins";
1732
1786
  let schemaToCompute = null;
1733
1787
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1734
1788
  let updatedRecurseList = _recurseList;
1735
1789
  if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1736
1790
  defaults = schema[CONST_KEY];
1737
1791
  } else if (isObject(defaults) && isObject(schema.default) && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1738
- defaults = mergeObjects(defaults, schema.default);
1739
- } else if (DEFAULT_KEY in schema && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1792
+ if (preferParentDefaults) {
1793
+ defaults = mergeObjects(schema.default, defaults);
1794
+ } else {
1795
+ defaults = mergeObjects(defaults, schema.default);
1796
+ }
1797
+ } else if (DEFAULT_KEY in schema && !preferParentDefaults && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1740
1798
  defaults = schema.default;
1741
1799
  } else if (REF_KEY in schema) {
1742
1800
  const refName = schema[REF_KEY];
@@ -1766,7 +1824,7 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1766
1824
  experimental_customMergeAllOf
1767
1825
  );
1768
1826
  [schemaToCompute] = resolvedSchema;
1769
- } else if (isFixedItems(schema)) {
1827
+ } else if (isFixedItems(schema) && !preferParentDefaults) {
1770
1828
  defaults = schema.items.map(
1771
1829
  (itemSchema, idx) => computeDefaults(validator, itemSchema, {
1772
1830
  rootSchema,
@@ -1862,16 +1920,36 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1862
1920
  return defaultsWithFormData;
1863
1921
  }
1864
1922
  function ensureFormDataMatchingSchema(validator, schema, rootSchema, formData, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
1865
- const isSelectField = !isConstant(schema) && isSelect(validator, schema, rootSchema, experimental_customMergeAllOf);
1923
+ const shouldRetrieveAllOf = experimental_defaultFormStateBehavior?.allOf === "populateDefaults" && ALL_OF_KEY in schema;
1924
+ const schemaToMatch = shouldRetrieveAllOf ? retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf) : schema;
1925
+ const isSelectField = !isConstant(schemaToMatch) && isSelect(validator, schemaToMatch, rootSchema, experimental_customMergeAllOf);
1866
1926
  let validFormData = formData;
1867
1927
  if (isSelectField) {
1868
- const getOptionsList = optionsList(schema);
1928
+ const getOptionsList = optionsList(schemaToMatch);
1869
1929
  const isValid = getOptionsList?.some((option) => deepEquals_default(option.value, formData));
1870
1930
  validFormData = isValid ? formData : void 0;
1871
1931
  }
1872
- const constTakesPrecedence = schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults === "always";
1932
+ const constTakesPrecedence = schemaToMatch[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults === "always";
1873
1933
  if (constTakesPrecedence) {
1874
- validFormData = schema.const;
1934
+ validFormData = schemaToMatch.const;
1935
+ } else if (isObject(validFormData) && isObject(schemaToMatch.properties)) {
1936
+ validFormData = Object.keys(schemaToMatch.properties).reduce(
1937
+ (acc, key) => {
1938
+ const propertySchema = (0, import_get12.default)(schemaToMatch, [PROPERTIES_KEY, key], {});
1939
+ if (key in acc && (shouldRetrieveAllOf || isObject(propertySchema) && ALL_OF_KEY in propertySchema)) {
1940
+ acc[key] = ensureFormDataMatchingSchema(
1941
+ validator,
1942
+ propertySchema,
1943
+ rootSchema,
1944
+ (0, import_get12.default)(acc, key),
1945
+ experimental_defaultFormStateBehavior,
1946
+ experimental_customMergeAllOf
1947
+ );
1948
+ }
1949
+ return acc;
1950
+ },
1951
+ { ...validFormData }
1952
+ );
1875
1953
  }
1876
1954
  return validFormData;
1877
1955
  }
@@ -1880,8 +1958,8 @@ function getObjectDefaults(validator, rawSchema, {
1880
1958
  rootSchema = {},
1881
1959
  includeUndefinedValues = false,
1882
1960
  _recurseList = [],
1883
- experimental_defaultFormStateBehavior = void 0,
1884
- experimental_customMergeAllOf = void 0,
1961
+ experimental_defaultFormStateBehavior,
1962
+ experimental_customMergeAllOf,
1885
1963
  required,
1886
1964
  shouldMergeDefaultsIntoFormData,
1887
1965
  initialDefaultsGenerated
@@ -1965,8 +2043,8 @@ function getArrayDefaults(validator, rawSchema, {
1965
2043
  rawFormData,
1966
2044
  rootSchema = {},
1967
2045
  _recurseList = [],
1968
- experimental_defaultFormStateBehavior = void 0,
1969
- experimental_customMergeAllOf = void 0,
2046
+ experimental_defaultFormStateBehavior,
2047
+ experimental_customMergeAllOf,
1970
2048
  required,
1971
2049
  requiredAsRoot = false,
1972
2050
  shouldMergeDefaultsIntoFormData,
@@ -2021,14 +2099,17 @@ function getArrayDefaults(validator, rawSchema, {
2021
2099
  defaults = mergeDefaultsWithFormData(defaults, itemDefaults, mergeExtraDefaults);
2022
2100
  }
2023
2101
  }
2102
+ const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
2024
2103
  if (neverPopulate) {
2104
+ if (shouldMergeDefaultsIntoFormData && !required) {
2105
+ return defaults;
2106
+ }
2025
2107
  return defaults ?? emptyDefault;
2026
2108
  }
2027
2109
  if (ignoreMinItemsFlagSet && !required) {
2028
2110
  return defaults || void 0;
2029
2111
  }
2030
2112
  let arrayDefault;
2031
- const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
2032
2113
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
2033
2114
  arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
2034
2115
  } else {
@@ -2088,9 +2169,17 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
2088
2169
  if (isObject(formData) || Array.isArray(formData)) {
2089
2170
  const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
2090
2171
  const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
2172
+ const matchingFormData = ensureFormDataMatchingSchema(
2173
+ validator,
2174
+ schema,
2175
+ rootSchema ?? schema,
2176
+ formData,
2177
+ experimental_defaultFormStateBehavior,
2178
+ experimental_customMergeAllOf
2179
+ );
2091
2180
  const result = mergeDefaultsWithFormData(
2092
2181
  defaults,
2093
- formData,
2182
+ matchingFormData,
2094
2183
  true,
2095
2184
  // set to true to add any additional default array entries.
2096
2185
  defaultSupercedesUndefined,
@@ -2102,9 +2191,6 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
2102
2191
  return defaults;
2103
2192
  }
2104
2193
 
2105
- // src/schema/getDisplayLabel.ts
2106
- var import_get13 = __toESM(require("lodash/get"), 1);
2107
-
2108
2194
  // src/isCustomWidget.ts
2109
2195
  function isCustomWidget(uiSchema = {}) {
2110
2196
  return (
@@ -2139,7 +2225,7 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
2139
2225
  let displayLabel = Boolean(label);
2140
2226
  if (displayLabel) {
2141
2227
  const schemaType = getSchemaType(schema);
2142
- const addedByAdditionalProperty = (0, import_get13.default)(schema, ADDITIONAL_PROPERTY_FLAG, false);
2228
+ const addedByAdditionalProperty = Boolean(schema[ADDITIONAL_PROPERTY_FLAG]);
2143
2229
  if (schemaType === "array") {
2144
2230
  displayLabel = addedByAdditionalProperty || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || isFilesArray(validator, schema, uiSchema, rootSchema, experimental_customMergeAllOf) || isCustomWidget(uiSchema);
2145
2231
  }
@@ -2149,7 +2235,7 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
2149
2235
  if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
2150
2236
  displayLabel = false;
2151
2237
  }
2152
- if (uiSchema && uiSchema[UI_FIELD_KEY]) {
2238
+ if (uiSchema?.[UI_FIELD_KEY]) {
2153
2239
  displayLabel = false;
2154
2240
  }
2155
2241
  }
@@ -2157,7 +2243,7 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
2157
2243
  }
2158
2244
 
2159
2245
  // src/schema/omitExtraData.ts
2160
- var import_get14 = __toESM(require("lodash/get"), 1);
2246
+ var import_get13 = __toESM(require("lodash/get"), 1);
2161
2247
  var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
2162
2248
  var import_isNil2 = __toESM(require("lodash/isNil"), 1);
2163
2249
  var import_pick = __toESM(require("lodash/pick"), 1);
@@ -2186,7 +2272,7 @@ function getFieldNames(pathSchema, formData) {
2186
2272
  }
2187
2273
  } else if (key === NAME_KEY && data !== "") {
2188
2274
  paths.forEach((path) => {
2189
- const formValue = (0, import_get14.default)(formData, path);
2275
+ const formValue = (0, import_get13.default)(formData, path);
2190
2276
  const isLeaf = objKeys.length === 1;
2191
2277
  if (formValueHasData(formValue, isLeaf) || Array.isArray(formValue) && formValue.every((val) => formValueHasData(val, isLeaf))) {
2192
2278
  acc.push(path);
@@ -2224,7 +2310,7 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2224
2310
  const { properties, additionalProperties, patternProperties, propertyNames } = childSchema;
2225
2311
  const requiredSet = new Set(childSchema.required ?? []);
2226
2312
  function setProperty(key, schemaDef, value, required = false) {
2227
- const v = omit3(schemaDef, value, target[key]);
2313
+ const v = omit2(schemaDef, value, target[key]);
2228
2314
  if (!required && isObject(v)) {
2229
2315
  let sd = isSchemaObj(schemaDef) ? schemaDef : {};
2230
2316
  if (sd.$ref !== void 0) {
@@ -2293,17 +2379,17 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2293
2379
  if (items !== void 0) {
2294
2380
  if (Array.isArray(items)) {
2295
2381
  for (let i = 0; i < items.length; i += 1) {
2296
- target.push(omit3(items[i], source[i]));
2382
+ target.push(omit2(items[i], source[i]));
2297
2383
  }
2298
2384
  } else {
2299
2385
  for (let i = 0; i < source.length; i += 1) {
2300
- target.push(omit3(items, source[i]));
2386
+ target.push(omit2(items, source[i]));
2301
2387
  }
2302
2388
  }
2303
2389
  }
2304
2390
  if (additionalItems) {
2305
2391
  for (let i = target.length; i < source.length; i += 1) {
2306
- target.push(omit3(additionalItems, source[i]));
2392
+ target.push(omit2(additionalItems, source[i]));
2307
2393
  }
2308
2394
  }
2309
2395
  return target;
@@ -2315,7 +2401,7 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2315
2401
  }
2316
2402
  const isThenBranch = isSchemaObj(condition) ? validator.isValid(condition, source, rootSchema) : condition;
2317
2403
  const branch = isThenBranch ? then : otherwise;
2318
- return branch === void 0 ? target : omit3(branch, source, target);
2404
+ return branch === void 0 ? target : omit2(branch, source, target);
2319
2405
  }
2320
2406
  function handleOneOf(oneOf, childSchema, source, target) {
2321
2407
  if (!Array.isArray(oneOf) || isSelect(validator, childSchema, rootSchema, experimental_customMergeAllOf)) {
@@ -2333,7 +2419,7 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2333
2419
  );
2334
2420
  const winning = oneOf[bestIndex];
2335
2421
  const resolved = isObject(winning) ? resolveAllReferences(winning, rootSchema, []) : scoringOptions[bestIndex];
2336
- return omit3(resolved, source, target);
2422
+ return omit2(resolved, source, target);
2337
2423
  }
2338
2424
  function handleAnyOf(childSchema, source, target) {
2339
2425
  const { anyOf } = childSchema;
@@ -2343,7 +2429,7 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2343
2429
  if (source === void 0 || Array.isArray(source) && source.length === 0 || isObject(source) && Object.keys(source).length === 0) {
2344
2430
  let result = target;
2345
2431
  for (const branch of anyOf) {
2346
- result = omit3(branch, source, result);
2432
+ result = omit2(branch, source, result);
2347
2433
  }
2348
2434
  return result;
2349
2435
  }
@@ -2357,12 +2443,12 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2357
2443
  let result = target;
2358
2444
  for (const [key, deps] of Object.entries(dependencies)) {
2359
2445
  if (key in source && !Array.isArray(deps)) {
2360
- result = omit3(deps, source, result);
2446
+ result = omit2(deps, source, result);
2361
2447
  }
2362
2448
  }
2363
2449
  return result;
2364
2450
  }
2365
- function omit3(schemaDef, source, target) {
2451
+ function omit2(schemaDef, source, target) {
2366
2452
  if (source === void 0 || schemaDef === false) {
2367
2453
  return void 0;
2368
2454
  }
@@ -2372,10 +2458,16 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2372
2458
  let localSchema = schemaDef;
2373
2459
  const { $ref: ref, allOf } = localSchema;
2374
2460
  if (ref !== void 0) {
2375
- return omit3(findSchemaDefinition(ref, rootSchema), source, target);
2461
+ return omit2(findSchemaDefinition(ref, rootSchema), source, target);
2376
2462
  }
2377
2463
  if (allOf) {
2378
2464
  localSchema = doMergeAllOf(localSchema, experimental_customMergeAllOf);
2465
+ const remainingAllOf = localSchema.allOf;
2466
+ if (remainingAllOf) {
2467
+ for (let i = 0; i < remainingAllOf.length; i++) {
2468
+ target = omit2(remainingAllOf[i], source, target);
2469
+ }
2470
+ }
2379
2471
  }
2380
2472
  let filtered = handleAnyOf(localSchema, source, handleOneOf(localSchema.oneOf, localSchema, source, target));
2381
2473
  const type = getSchemaType(localSchema);
@@ -2394,11 +2486,11 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2394
2486
  }
2395
2487
  return handleDependencies(localSchema, source, handleConditions(localSchema, source, filtered));
2396
2488
  }
2397
- return omit3(schema, formData);
2489
+ return omit2(schema, formData);
2398
2490
  }
2399
2491
 
2400
2492
  // src/schema/sanitizeDataForNewSchema.ts
2401
- var import_get15 = __toESM(require("lodash/get"), 1);
2493
+ var import_get14 = __toESM(require("lodash/get"), 1);
2402
2494
  var import_has5 = __toESM(require("lodash/has"), 1);
2403
2495
  var NO_VALUE = /* @__PURE__ */ Symbol("no Value");
2404
2496
  function enumValuesForSchema(schema) {
@@ -2422,7 +2514,7 @@ function replacementForInvalidEnumValue(schema, formValue) {
2422
2514
  if (!enumValues || enumValues.some((value) => deepEquals_default(value, formValue))) {
2423
2515
  return NO_VALUE;
2424
2516
  }
2425
- const defaultValue = (0, import_get15.default)(schema, DEFAULT_KEY, NO_VALUE);
2517
+ const defaultValue = (0, import_get14.default)(schema, DEFAULT_KEY, NO_VALUE);
2426
2518
  if (defaultValue !== NO_VALUE && enumValues.some((value) => deepEquals_default(value, defaultValue))) {
2427
2519
  return defaultValue;
2428
2520
  }
@@ -2433,19 +2525,19 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2433
2525
  if ((0, import_has5.default)(newSchema, PROPERTIES_KEY)) {
2434
2526
  const removeOldSchemaData = {};
2435
2527
  if ((0, import_has5.default)(oldSchema, PROPERTIES_KEY)) {
2436
- const properties = (0, import_get15.default)(oldSchema, PROPERTIES_KEY, {});
2528
+ const properties = (0, import_get14.default)(oldSchema, PROPERTIES_KEY, {});
2437
2529
  Object.keys(properties).forEach((key) => {
2438
2530
  if ((0, import_has5.default)(data, key)) {
2439
2531
  removeOldSchemaData[key] = void 0;
2440
2532
  }
2441
2533
  });
2442
2534
  }
2443
- const keys2 = Object.keys((0, import_get15.default)(newSchema, PROPERTIES_KEY, {}));
2535
+ const keys2 = Object.keys((0, import_get14.default)(newSchema, PROPERTIES_KEY, {}));
2444
2536
  const nestedData = {};
2445
2537
  keys2.forEach((key) => {
2446
- const formValue = (0, import_get15.default)(data, key);
2447
- let oldKeyedSchema = (0, import_get15.default)(oldSchema, [PROPERTIES_KEY, key], {});
2448
- let newKeyedSchema = (0, import_get15.default)(newSchema, [PROPERTIES_KEY, key], {});
2538
+ const formValue = (0, import_get14.default)(data, key);
2539
+ let oldKeyedSchema = (0, import_get14.default)(oldSchema, [PROPERTIES_KEY, key], {});
2540
+ let newKeyedSchema = (0, import_get14.default)(newSchema, [PROPERTIES_KEY, key], {});
2449
2541
  if ((0, import_has5.default)(oldKeyedSchema, REF_KEY)) {
2450
2542
  oldKeyedSchema = retrieveSchema(
2451
2543
  validator,
@@ -2464,8 +2556,8 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2464
2556
  experimental_customMergeAllOf
2465
2557
  );
2466
2558
  }
2467
- const oldSchemaTypeForKey = (0, import_get15.default)(oldKeyedSchema, "type");
2468
- const newSchemaTypeForKey = (0, import_get15.default)(newKeyedSchema, "type");
2559
+ const oldSchemaTypeForKey = (0, import_get14.default)(oldKeyedSchema, "type");
2560
+ const newSchemaTypeForKey = (0, import_get14.default)(newKeyedSchema, "type");
2469
2561
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
2470
2562
  if ((0, import_has5.default)(removeOldSchemaData, key)) {
2471
2563
  delete removeOldSchemaData[key];
@@ -2483,17 +2575,17 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2483
2575
  nestedData[key] = itemData;
2484
2576
  }
2485
2577
  } else {
2486
- const newOptionDefault = (0, import_get15.default)(newKeyedSchema, DEFAULT_KEY, NO_VALUE);
2487
- const oldOptionDefault = (0, import_get15.default)(oldKeyedSchema, DEFAULT_KEY, NO_VALUE);
2578
+ const newOptionDefault = (0, import_get14.default)(newKeyedSchema, DEFAULT_KEY, NO_VALUE);
2579
+ const oldOptionDefault = (0, import_get14.default)(oldKeyedSchema, DEFAULT_KEY, NO_VALUE);
2488
2580
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
2489
2581
  if (oldOptionDefault === formValue) {
2490
2582
  removeOldSchemaData[key] = newOptionDefault;
2491
- } else if ((0, import_get15.default)(newKeyedSchema, "readOnly") === true) {
2583
+ } else if ((0, import_get14.default)(newKeyedSchema, "readOnly") === true) {
2492
2584
  removeOldSchemaData[key] = void 0;
2493
2585
  }
2494
2586
  }
2495
- const newOptionConst = (0, import_get15.default)(newKeyedSchema, CONST_KEY, NO_VALUE);
2496
- const oldOptionConst = (0, import_get15.default)(oldKeyedSchema, CONST_KEY, NO_VALUE);
2587
+ const newOptionConst = (0, import_get14.default)(newKeyedSchema, CONST_KEY, NO_VALUE);
2588
+ const oldOptionConst = (0, import_get14.default)(oldKeyedSchema, CONST_KEY, NO_VALUE);
2497
2589
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
2498
2590
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
2499
2591
  }
@@ -2511,9 +2603,9 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2511
2603
  ...removeOldSchemaData,
2512
2604
  ...nestedData
2513
2605
  };
2514
- } else if ((0, import_get15.default)(oldSchema, "type") === "array" && (0, import_get15.default)(newSchema, "type") === "array" && Array.isArray(data)) {
2515
- let oldSchemaItems = (0, import_get15.default)(oldSchema, "items");
2516
- let newSchemaItems = (0, import_get15.default)(newSchema, "items");
2606
+ } else if ((0, import_get14.default)(oldSchema, "type") === "array" && (0, import_get14.default)(newSchema, "type") === "array" && Array.isArray(data)) {
2607
+ let oldSchemaItems = (0, import_get14.default)(oldSchema, "items");
2608
+ let newSchemaItems = (0, import_get14.default)(newSchema, "items");
2517
2609
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
2518
2610
  if ((0, import_has5.default)(oldSchemaItems, REF_KEY)) {
2519
2611
  oldSchemaItems = retrieveSchema(
@@ -2533,10 +2625,10 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2533
2625
  experimental_customMergeAllOf
2534
2626
  );
2535
2627
  }
2536
- const oldSchemaType = (0, import_get15.default)(oldSchemaItems, "type");
2537
- const newSchemaType = (0, import_get15.default)(newSchemaItems, "type");
2628
+ const oldSchemaType = (0, import_get14.default)(oldSchemaItems, "type");
2629
+ const newSchemaType = (0, import_get14.default)(newSchemaItems, "type");
2538
2630
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
2539
- const maxItems = (0, import_get15.default)(newSchema, "maxItems", -1);
2631
+ const maxItems = (0, import_get14.default)(newSchema, "maxItems", -1);
2540
2632
  if (newSchemaType === "object") {
2541
2633
  newFormData = data.reduce((newValue, aValue) => {
2542
2634
  const itemValue = sanitizeDataForNewSchema(
@@ -2566,7 +2658,7 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2566
2658
  }
2567
2659
 
2568
2660
  // src/schema/toPathSchema.ts
2569
- var import_get16 = __toESM(require("lodash/get"), 1);
2661
+ var import_get15 = __toESM(require("lodash/get"), 1);
2570
2662
  var import_isObject12 = __toESM(require("lodash/isObject"), 1);
2571
2663
  var import_set2 = __toESM(require("lodash/set"), 1);
2572
2664
  function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
@@ -2617,7 +2709,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2617
2709
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema[ADDITIONAL_PROPERTIES_KEY] !== false) {
2618
2710
  (0, import_set2.default)(pathSchema, RJSF_ADDITIONAL_PROPERTIES_FLAG, true);
2619
2711
  const additionalSchema = (0, import_isObject12.default)(schema[ADDITIONAL_PROPERTIES_KEY]) ? schema[ADDITIONAL_PROPERTIES_KEY] : {};
2620
- const definedProperties = (0, import_get16.default)(schema, PROPERTIES_KEY, {});
2712
+ const definedProperties = (0, import_get15.default)(schema, PROPERTIES_KEY, {});
2621
2713
  for (const key of Object.keys(formData ?? {})) {
2622
2714
  if (!(key in definedProperties)) {
2623
2715
  pathSchema[key] = toPathSchemaInternal(
@@ -2625,7 +2717,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2625
2717
  additionalSchema,
2626
2718
  `${name}.${key}`,
2627
2719
  rootSchema,
2628
- (0, import_get16.default)(formData, [key]),
2720
+ (0, import_get15.default)(formData, [key]),
2629
2721
  _recurseList,
2630
2722
  experimental_customMergeAllOf
2631
2723
  );
@@ -2675,7 +2767,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2675
2767
  }
2676
2768
  } else if (PROPERTIES_KEY in schema) {
2677
2769
  for (const property in schema.properties) {
2678
- const field = (0, import_get16.default)(schema, [PROPERTIES_KEY, property], {});
2770
+ const field = (0, import_get15.default)(schema, [PROPERTIES_KEY, property], {});
2679
2771
  pathSchema[property] = toPathSchemaInternal(
2680
2772
  validator,
2681
2773
  field,
@@ -2683,7 +2775,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2683
2775
  rootSchema,
2684
2776
  // It's possible that formData is not an object -- this can happen if an
2685
2777
  // array item has just been added, but not populated with data yet
2686
- (0, import_get16.default)(formData, [property]),
2778
+ (0, import_get15.default)(formData, [property]),
2687
2779
  _recurseList,
2688
2780
  experimental_customMergeAllOf
2689
2781
  );
@@ -2705,8 +2797,8 @@ var SchemaUtils = class {
2705
2797
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2706
2798
  */
2707
2799
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2708
- if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2709
- this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get17.default)(rootSchema, ID_KEY, "#"));
2800
+ if (rootSchema?.[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2801
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get16.default)(rootSchema, ID_KEY, "#"));
2710
2802
  } else {
2711
2803
  this.rootSchema = rootSchema;
2712
2804
  }
@@ -3163,7 +3255,7 @@ function enumOptionValueEncoder(value, index, format = "indexed") {
3163
3255
 
3164
3256
  // src/ErrorSchemaBuilder.ts
3165
3257
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
3166
- var import_get18 = __toESM(require("lodash/get"), 1);
3258
+ var import_get17 = __toESM(require("lodash/get"), 1);
3167
3259
  var import_set3 = __toESM(require("lodash/set"), 1);
3168
3260
  var import_setWith = __toESM(require("lodash/setWith"), 1);
3169
3261
  var ErrorSchemaBuilder = class {
@@ -3192,7 +3284,7 @@ var ErrorSchemaBuilder = class {
3192
3284
  */
3193
3285
  getOrCreateErrorBlock(pathOfError) {
3194
3286
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
3195
- let errorBlock = hasPath ? (0, import_get18.default)(this.errorSchema, pathOfError) : this.errorSchema;
3287
+ let errorBlock = hasPath ? (0, import_get17.default)(this.errorSchema, pathOfError) : this.errorSchema;
3196
3288
  if (!errorBlock && pathOfError) {
3197
3289
  errorBlock = {};
3198
3290
  (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
@@ -3218,7 +3310,7 @@ var ErrorSchemaBuilder = class {
3218
3310
  */
3219
3311
  addErrors(errorOrList, pathOfError) {
3220
3312
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
3221
- let errorsList = (0, import_get18.default)(errorBlock, ERRORS_KEY);
3313
+ let errorsList = (0, import_get17.default)(errorBlock, ERRORS_KEY);
3222
3314
  if (!Array.isArray(errorsList)) {
3223
3315
  errorsList = [];
3224
3316
  errorBlock[ERRORS_KEY] = errorsList;
@@ -3260,7 +3352,7 @@ var ErrorSchemaBuilder = class {
3260
3352
 
3261
3353
  // src/getChangedFields.ts
3262
3354
  var import_difference = __toESM(require("lodash/difference"), 1);
3263
- var import_get19 = __toESM(require("lodash/get"), 1);
3355
+ var import_get18 = __toESM(require("lodash/get"), 1);
3264
3356
  var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
3265
3357
  var import_keys = __toESM(require("lodash/keys"), 1);
3266
3358
  var import_pickBy = __toESM(require("lodash/pickBy"), 1);
@@ -3276,7 +3368,7 @@ function getChangedFields(a, b) {
3276
3368
  if (!aIsPlainObject && bIsPlainObject) {
3277
3369
  return (0, import_keys.default)(b);
3278
3370
  }
3279
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals_default(value, (0, import_get19.default)(b, key))));
3371
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals_default(value, (0, import_get18.default)(b, key))));
3280
3372
  const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3281
3373
  return [...unequalFields, ...diffFields];
3282
3374
  }
@@ -3377,7 +3469,7 @@ var DEFAULT_OPTIONS = {
3377
3469
  };
3378
3470
  function getSubmitButtonOptions(uiSchema = {}) {
3379
3471
  const uiOptions = getUiOptions(uiSchema);
3380
- if (uiOptions && uiOptions[SUBMIT_BTN_OPTIONS_KEY]) {
3472
+ if (uiOptions?.[SUBMIT_BTN_OPTIONS_KEY]) {
3381
3473
  const options = uiOptions[SUBMIT_BTN_OPTIONS_KEY];
3382
3474
  return { ...DEFAULT_OPTIONS, ...options };
3383
3475
  }
@@ -3402,10 +3494,10 @@ function getTemplate(name, registry, uiOptions = {}) {
3402
3494
  }
3403
3495
 
3404
3496
  // src/getTestIds.ts
3405
- var import_get20 = __toESM(require("lodash/get"), 1);
3497
+ var import_get19 = __toESM(require("lodash/get"), 1);
3406
3498
  var import_uniqueId = __toESM(require("lodash/uniqueId"), 1);
3407
3499
  function getTestIds() {
3408
- if ((0, import_get20.default)(globalThis, "process.env.NODE_ENV") !== "test") {
3500
+ if ((0, import_get19.default)(globalThis, "process.env.NODE_ENV") !== "test") {
3409
3501
  return {};
3410
3502
  }
3411
3503
  const ids = /* @__PURE__ */ new Map();
@@ -3424,7 +3516,7 @@ function getTestIds() {
3424
3516
 
3425
3517
  // src/getWidget.tsx
3426
3518
  var import_react = require("react");
3427
- var import_get21 = __toESM(require("lodash/get"), 1);
3519
+ var import_get20 = __toESM(require("lodash/get"), 1);
3428
3520
  var import_set4 = __toESM(require("lodash/set"), 1);
3429
3521
  var import_react_is = __toESM(require("react-is"), 1);
3430
3522
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -3481,9 +3573,9 @@ var widgetMap = {
3481
3573
  }
3482
3574
  };
3483
3575
  function mergeWidgetOptions(AWidget) {
3484
- let MergedWidget = (0, import_get21.default)(AWidget, "MergedWidget");
3576
+ let MergedWidget = (0, import_get20.default)(AWidget, "MergedWidget");
3485
3577
  if (!MergedWidget) {
3486
- const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
3578
+ const defaultOptions = AWidget.defaultProps?.options || {};
3487
3579
  MergedWidget = ({ options, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AWidget, { options: { ...defaultOptions, ...options }, ...props });
3488
3580
  (0, import_set4.default)(AWidget, "MergedWidget", MergedWidget);
3489
3581
  }
@@ -3535,7 +3627,7 @@ function hashObject(object) {
3535
3627
  return hashString(sortedJSONStringify(object));
3536
3628
  }
3537
3629
  function hashForSchema(schema) {
3538
- return hashObject(schema);
3630
+ return hashString(sortedJSONStringify(schema));
3539
3631
  }
3540
3632
 
3541
3633
  // src/hasWidget.ts
@@ -3596,7 +3688,6 @@ function isFormDataAvailable(formData) {
3596
3688
  }
3597
3689
 
3598
3690
  // src/isRootSchema.ts
3599
- var import_omit2 = __toESM(require("lodash/omit"), 1);
3600
3691
  function isRootSchema(registry, schemaToCompare) {
3601
3692
  const { rootSchema, schemaUtils } = registry;
3602
3693
  if (deepEquals_default(schemaToCompare, rootSchema)) {
@@ -3604,7 +3695,7 @@ function isRootSchema(registry, schemaToCompare) {
3604
3695
  }
3605
3696
  if (REF_KEY in rootSchema) {
3606
3697
  const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
3607
- return deepEquals_default(schemaToCompare, (0, import_omit2.default)(resolvedSchema, RJSF_REF_KEY));
3698
+ return deepEquals_default(schemaToCompare, resolvedSchema);
3608
3699
  }
3609
3700
  return false;
3610
3701
  }
@@ -3619,15 +3710,24 @@ function localToUTC(dateString) {
3619
3710
  return dateString ? new Date(dateString).toJSON() : void 0;
3620
3711
  }
3621
3712
 
3713
+ // src/logUnsupportedDefaultForEnum.ts
3714
+ function logUnsupportedDefaultForEnum(id, schema, enumOptions, multiple = false) {
3715
+ if (!multiple && Array.isArray(enumOptions) && schema.default !== void 0 && enumOptionsIndexForValue(schema.default, enumOptions, multiple) === void 0) {
3716
+ console.error(
3717
+ `The schema default value "${schema.default}" is not one of the values in the enum options for "${id}"`
3718
+ );
3719
+ }
3720
+ }
3721
+
3622
3722
  // src/lookupFromFormContext.ts
3623
- var import_get22 = __toESM(require("lodash/get"), 1);
3723
+ var import_get21 = __toESM(require("lodash/get"), 1);
3624
3724
  var import_has6 = __toESM(require("lodash/has"), 1);
3625
3725
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3626
3726
  const lookupPath = [LOOKUP_MAP_NAME];
3627
3727
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3628
3728
  lookupPath.unshift(FORM_CONTEXT_NAME);
3629
3729
  }
3630
- return (0, import_get22.default)(regOrFc, [...lookupPath, toLookup], fallback);
3730
+ return (0, import_get21.default)(regOrFc, [...lookupPath, toLookup], fallback);
3631
3731
  }
3632
3732
 
3633
3733
  // src/nameGenerators.ts
@@ -3816,13 +3916,13 @@ function schemaRequiresTrueValue(schema) {
3816
3916
  if (schema.const) {
3817
3917
  return true;
3818
3918
  }
3819
- if (schema.enum && schema.enum.length === 1 && schema.enum[0] === true) {
3919
+ if (schema.enum?.length === 1 && schema.enum[0] === true) {
3820
3920
  return true;
3821
3921
  }
3822
- if (schema.anyOf && schema.anyOf.length === 1) {
3922
+ if (schema.anyOf?.length === 1) {
3823
3923
  return schemaRequiresTrueValue(schema.anyOf[0]);
3824
3924
  }
3825
- if (schema.oneOf && schema.oneOf.length === 1) {
3925
+ if (schema.oneOf?.length === 1) {
3826
3926
  return schemaRequiresTrueValue(schema.oneOf[0]);
3827
3927
  }
3828
3928
  if (schema.allOf) {
@@ -3832,6 +3932,38 @@ function schemaRequiresTrueValue(schema) {
3832
3932
  return false;
3833
3933
  }
3834
3934
 
3935
+ // src/SelectedOptionDescription.tsx
3936
+ var import_jsx_runtime2 = require("react/jsx-runtime");
3937
+ function SelectedOptionDescription({ hideLabel, id, multiple, options, registry, uiSchema, value }) {
3938
+ if (multiple || hideLabel) {
3939
+ return null;
3940
+ }
3941
+ const { label = true } = getUiOptions(uiSchema, registry.globalUiOptions);
3942
+ if (!label) {
3943
+ return null;
3944
+ }
3945
+ const option = options.enumOptions?.find(({ value: enumValue }) => enumOptionsIsSelected(enumValue, value));
3946
+ const description = option?.schema?.description;
3947
+ if (!description) {
3948
+ return null;
3949
+ }
3950
+ const DescriptionFieldTemplate = getTemplate(
3951
+ "DescriptionFieldTemplate",
3952
+ registry,
3953
+ options
3954
+ );
3955
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
3956
+ DescriptionFieldTemplate,
3957
+ {
3958
+ id: descriptionId(id),
3959
+ description,
3960
+ schema: option.schema,
3961
+ uiSchema,
3962
+ registry
3963
+ }
3964
+ );
3965
+ }
3966
+
3835
3967
  // src/shallowEquals.ts
3836
3968
  function shallowEquals(a, b) {
3837
3969
  if (Object.is(a, b)) {
@@ -3982,7 +4114,7 @@ function unwrapErrorHandler(errorHandler) {
3982
4114
 
3983
4115
  // src/useAltDateWidgetProps.tsx
3984
4116
  var import_react2 = require("react");
3985
- var import_jsx_runtime2 = require("react/jsx-runtime");
4117
+ var import_jsx_runtime3 = require("react/jsx-runtime");
3986
4118
  function readyForChange(state) {
3987
4119
  return Object.values(state).every((value) => value !== -1);
3988
4120
  }
@@ -4005,7 +4137,7 @@ function DateElement(props) {
4005
4137
  const id = `${rootId}_${type}`;
4006
4138
  const { SelectWidget } = registry.widgets;
4007
4139
  const onChange = (0, import_react2.useCallback)((newValue) => select(type, newValue), [select, type]);
4008
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
4140
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
4009
4141
  SelectWidget,
4010
4142
  {
4011
4143
  schema: { type: "integer" },
@@ -4095,7 +4227,7 @@ var import_react4 = require("react");
4095
4227
  function addNameToDataURL(dataURL, name) {
4096
4228
  return dataURL.replace(";base64", `;name=${encodeURIComponent(name)};base64`);
4097
4229
  }
4098
- function processFile(file) {
4230
+ async function processFile(file) {
4099
4231
  const { name, size, type } = file;
4100
4232
  return new Promise((resolve, reject) => {
4101
4233
  const reader = new window.FileReader();
@@ -4120,7 +4252,7 @@ function processFile(file) {
4120
4252
  reader.readAsDataURL(file);
4121
4253
  });
4122
4254
  }
4123
- function processFiles(files) {
4255
+ async function processFiles(files) {
4124
4256
  return Promise.all(Array.from(files).map(processFile));
4125
4257
  }
4126
4258
  function extractFileInfo(dataURLs) {
@@ -4259,6 +4391,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
4259
4391
  TranslatableString2["AddButton"] = "Add";
4260
4392
  TranslatableString2["AddItemButton"] = "Add Item";
4261
4393
  TranslatableString2["CopyButton"] = "Copy";
4394
+ TranslatableString2["ExpandButton"] = "Expand Cycle";
4262
4395
  TranslatableString2["MoveDownButton"] = "Move down";
4263
4396
  TranslatableString2["MoveUpButton"] = "Move up";
4264
4397
  TranslatableString2["RemoveButton"] = "Remove";
@@ -4279,6 +4412,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
4279
4412
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
4280
4413
  TranslatableString2["KeyLabel"] = "%1 Key";
4281
4414
  TranslatableString2["DeprecatedLabel"] = "%1 (deprecated)";
4415
+ TranslatableString2["CycleDetected"] = 'Circular reference ($ref cycle) detected for field "%1". You may choose to expand to the next cycle break';
4282
4416
  TranslatableString2["InvalidObjectField"] = 'Invalid "%1" object field configuration: _%2_.';
4283
4417
  TranslatableString2["UnsupportedField"] = "Unsupported field schema.";
4284
4418
  TranslatableString2["UnsupportedFieldWithId"] = "Unsupported field schema for field `%1`.";
@@ -4292,7 +4426,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
4292
4426
  var import_forEach = __toESM(require("lodash/forEach"), 1);
4293
4427
 
4294
4428
  // src/parser/ParserValidator.ts
4295
- var import_get23 = __toESM(require("lodash/get"), 1);
4429
+ var import_get22 = __toESM(require("lodash/get"), 1);
4296
4430
  var ParserValidator = class {
4297
4431
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
4298
4432
  * first.
@@ -4318,7 +4452,7 @@ var ParserValidator = class {
4318
4452
  * @param hash - The hash value at which to map the schema
4319
4453
  */
4320
4454
  addSchema(schema, hash) {
4321
- const key = (0, import_get23.default)(schema, ID_KEY, hash);
4455
+ const key = (0, import_get22.default)(schema, ID_KEY, hash);
4322
4456
  const identifiedSchema = { ...schema, [ID_KEY]: key };
4323
4457
  const existing = this.schemaMap[key];
4324
4458
  if (!existing) {