@rjsf/utils 5.21.1 → 5.22.0

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 (36) hide show
  1. package/dist/index.js +201 -62
  2. package/dist/index.js.map +3 -3
  3. package/dist/utils.esm.js +201 -62
  4. package/dist/utils.esm.js.map +2 -2
  5. package/dist/utils.umd.js +199 -69
  6. package/lib/ErrorSchemaBuilder.d.ts +3 -3
  7. package/lib/ErrorSchemaBuilder.js +2 -1
  8. package/lib/ErrorSchemaBuilder.js.map +1 -1
  9. package/lib/createSchemaUtils.d.ts +3 -2
  10. package/lib/createSchemaUtils.js +17 -11
  11. package/lib/createSchemaUtils.js.map +1 -1
  12. package/lib/mergeDefaultsWithFormData.d.ts +4 -2
  13. package/lib/mergeDefaultsWithFormData.js +9 -4
  14. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  15. package/lib/schema/getClosestMatchingOption.js +6 -2
  16. package/lib/schema/getClosestMatchingOption.js.map +1 -1
  17. package/lib/schema/getDefaultFormState.d.ts +6 -3
  18. package/lib/schema/getDefaultFormState.js +43 -22
  19. package/lib/schema/getDefaultFormState.js.map +1 -1
  20. package/lib/schema/retrieveSchema.d.ts +19 -10
  21. package/lib/schema/retrieveSchema.js +54 -26
  22. package/lib/schema/retrieveSchema.js.map +1 -1
  23. package/lib/schema/toIdSchema.d.ts +3 -2
  24. package/lib/schema/toIdSchema.js +8 -6
  25. package/lib/schema/toIdSchema.js.map +1 -1
  26. package/lib/tsconfig.tsbuildinfo +1 -1
  27. package/lib/types.d.ts +19 -3
  28. package/package.json +2 -2
  29. package/src/ErrorSchemaBuilder.ts +6 -5
  30. package/src/createSchemaUtils.ts +43 -11
  31. package/src/mergeDefaultsWithFormData.ts +16 -4
  32. package/src/schema/getClosestMatchingOption.ts +6 -2
  33. package/src/schema/getDefaultFormState.ts +58 -19
  34. package/src/schema/retrieveSchema.ts +125 -28
  35. package/src/schema/toIdSchema.ts +32 -7
  36. package/src/types.ts +20 -2
package/dist/index.js CHANGED
@@ -504,10 +504,18 @@ function mergeSchemas(obj1, obj2) {
504
504
  }
505
505
 
506
506
  // src/schema/retrieveSchema.ts
507
- function retrieveSchema(validator, schema, rootSchema = {}, rawFormData) {
508
- return retrieveSchemaInternal(validator, schema, rootSchema, rawFormData)[0];
507
+ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
508
+ return retrieveSchemaInternal(
509
+ validator,
510
+ schema,
511
+ rootSchema,
512
+ rawFormData,
513
+ void 0,
514
+ void 0,
515
+ experimental_customMergeAllOf
516
+ )[0];
509
517
  }
510
- function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData) {
518
+ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
511
519
  const { if: expression, then, else: otherwise, ...resolvedSchemaLessConditional } = schema;
512
520
  const conditionValue = validator.isValid(expression, formData || {}, rootSchema);
513
521
  let resolvedSchemas = [resolvedSchemaLessConditional];
@@ -515,12 +523,28 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
515
523
  if (expandAllBranches) {
516
524
  if (then && typeof then !== "boolean") {
517
525
  schemas = schemas.concat(
518
- retrieveSchemaInternal(validator, then, rootSchema, formData, expandAllBranches, recurseList)
526
+ retrieveSchemaInternal(
527
+ validator,
528
+ then,
529
+ rootSchema,
530
+ formData,
531
+ expandAllBranches,
532
+ recurseList,
533
+ experimental_customMergeAllOf
534
+ )
519
535
  );
520
536
  }
521
537
  if (otherwise && typeof otherwise !== "boolean") {
522
538
  schemas = schemas.concat(
523
- retrieveSchemaInternal(validator, otherwise, rootSchema, formData, expandAllBranches, recurseList)
539
+ retrieveSchemaInternal(
540
+ validator,
541
+ otherwise,
542
+ rootSchema,
543
+ formData,
544
+ expandAllBranches,
545
+ recurseList,
546
+ experimental_customMergeAllOf
547
+ )
524
548
  );
525
549
  }
526
550
  } else {
@@ -533,7 +557,8 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
533
557
  rootSchema,
534
558
  formData,
535
559
  expandAllBranches,
536
- recurseList
560
+ recurseList,
561
+ experimental_customMergeAllOf
537
562
  )
538
563
  );
539
564
  }
@@ -542,7 +567,15 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
542
567
  resolvedSchemas = schemas.map((s) => mergeSchemas(resolvedSchemaLessConditional, s));
543
568
  }
544
569
  return resolvedSchemas.flatMap(
545
- (s) => retrieveSchemaInternal(validator, s, rootSchema, formData, expandAllBranches, recurseList)
570
+ (s) => retrieveSchemaInternal(
571
+ validator,
572
+ s,
573
+ rootSchema,
574
+ formData,
575
+ expandAllBranches,
576
+ recurseList,
577
+ experimental_customMergeAllOf
578
+ )
546
579
  );
547
580
  }
548
581
  function getAllPermutationsOfXxxOf(listOfLists) {
@@ -559,7 +592,7 @@ function getAllPermutationsOfXxxOf(listOfLists) {
559
592
  );
560
593
  return allPermutations;
561
594
  }
562
- function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData) {
595
+ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
563
596
  const updatedSchemas = resolveReference(
564
597
  validator,
565
598
  schema,
@@ -581,7 +614,15 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
581
614
  formData
582
615
  );
583
616
  return resolvedSchemas.flatMap((s) => {
584
- return retrieveSchemaInternal(validator, s, rootSchema, formData, expandAllBranches, recurseList);
617
+ return retrieveSchemaInternal(
618
+ validator,
619
+ s,
620
+ rootSchema,
621
+ formData,
622
+ expandAllBranches,
623
+ recurseList,
624
+ experimental_customMergeAllOf
625
+ );
585
626
  });
586
627
  }
587
628
  if (ALL_OF_KEY in schema && Array.isArray(schema.allOf)) {
@@ -592,7 +633,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
592
633
  rootSchema,
593
634
  formData,
594
635
  expandAllBranches,
595
- recurseList
636
+ recurseList,
637
+ experimental_customMergeAllOf
596
638
  )
597
639
  );
598
640
  const allPermutations = getAllPermutationsOfXxxOf(allOfSchemaElements);
@@ -600,7 +642,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
600
642
  }
601
643
  return [schema];
602
644
  }
603
- function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData) {
645
+ function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
604
646
  const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList);
605
647
  if (updatedSchema !== schema) {
606
648
  return retrieveSchemaInternal(
@@ -609,7 +651,8 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
609
651
  rootSchema,
610
652
  formData,
611
653
  expandAllBranches,
612
- recurseList
654
+ recurseList,
655
+ experimental_customMergeAllOf
613
656
  );
614
657
  }
615
658
  return [schema];
@@ -687,7 +730,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
687
730
  });
688
731
  return schema;
689
732
  }
690
- function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = []) {
733
+ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf) {
691
734
  if (!isObject(schema)) {
692
735
  return [{}];
693
736
  }
@@ -708,7 +751,8 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
708
751
  rootSchema,
709
752
  expandAllBranches,
710
753
  recurseList,
711
- rawFormData
754
+ rawFormData,
755
+ experimental_customMergeAllOf
712
756
  );
713
757
  }
714
758
  if (ALL_OF_KEY in resolvedSchema) {
@@ -717,9 +761,24 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
717
761
  return [...allOf, restOfSchema];
718
762
  }
719
763
  try {
720
- resolvedSchema = (0, import_json_schema_merge_allof.default)(resolvedSchema, {
764
+ const withContainsSchemas = [];
765
+ const withoutContainsSchemas = [];
766
+ resolvedSchema.allOf?.forEach((s2) => {
767
+ if (typeof s2 === "object" && s2.contains) {
768
+ withContainsSchemas.push(s2);
769
+ } else {
770
+ withoutContainsSchemas.push(s2);
771
+ }
772
+ });
773
+ if (withContainsSchemas.length) {
774
+ resolvedSchema = { ...resolvedSchema, allOf: withoutContainsSchemas };
775
+ }
776
+ resolvedSchema = experimental_customMergeAllOf ? experimental_customMergeAllOf(resolvedSchema) : (0, import_json_schema_merge_allof.default)(resolvedSchema, {
721
777
  deep: false
722
778
  });
779
+ if (withContainsSchemas.length) {
780
+ resolvedSchema.allOf = withContainsSchemas;
781
+ }
723
782
  } catch (e) {
724
783
  console.warn("could not merge subschemas in allOf:\n", e);
725
784
  const { allOf, ...resolvedSchemaWithoutAllOf } = resolvedSchema;
@@ -755,7 +814,7 @@ function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranch
755
814
  }
756
815
  return [schema];
757
816
  }
758
- function resolveDependencies(validator, schema, rootSchema, expandAllBranches, recurseList, formData) {
817
+ function resolveDependencies(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
759
818
  const { dependencies, ...remainingSchema } = schema;
760
819
  const resolvedSchemas = resolveAnyOrOneOfSchemas(
761
820
  validator,
@@ -772,11 +831,12 @@ function resolveDependencies(validator, schema, rootSchema, expandAllBranches, r
772
831
  rootSchema,
773
832
  expandAllBranches,
774
833
  recurseList,
775
- formData
834
+ formData,
835
+ experimental_customMergeAllOf
776
836
  )
777
837
  );
778
838
  }
779
- function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData) {
839
+ function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
780
840
  let schemas = [resolvedSchema];
781
841
  for (const dependencyKey in dependencies) {
782
842
  if (!expandAllBranches && (0, import_get4.default)(formData, [dependencyKey]) === void 0) {
@@ -800,7 +860,8 @@ function processDependencies(validator, dependencies, resolvedSchema, rootSchema
800
860
  dependencyValue,
801
861
  expandAllBranches,
802
862
  recurseList,
803
- formData
863
+ formData,
864
+ experimental_customMergeAllOf
804
865
  );
805
866
  }
806
867
  return schemas.flatMap(
@@ -811,7 +872,8 @@ function processDependencies(validator, dependencies, resolvedSchema, rootSchema
811
872
  rootSchema,
812
873
  expandAllBranches,
813
874
  recurseList,
814
- formData
875
+ formData,
876
+ experimental_customMergeAllOf
815
877
  )
816
878
  );
817
879
  }
@@ -824,14 +886,15 @@ function withDependentProperties(schema, additionallyRequired) {
824
886
  const required = Array.isArray(schema.required) ? Array.from(/* @__PURE__ */ new Set([...schema.required, ...additionallyRequired])) : additionallyRequired;
825
887
  return { ...schema, required };
826
888
  }
827
- function withDependentSchema(validator, schema, rootSchema, dependencyKey, dependencyValue, expandAllBranches, recurseList, formData) {
889
+ function withDependentSchema(validator, schema, rootSchema, dependencyKey, dependencyValue, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
828
890
  const dependentSchemas = retrieveSchemaInternal(
829
891
  validator,
830
892
  dependencyValue,
831
893
  rootSchema,
832
894
  formData,
833
895
  expandAllBranches,
834
- recurseList
896
+ recurseList,
897
+ experimental_customMergeAllOf
835
898
  );
836
899
  return dependentSchemas.flatMap((dependent) => {
837
900
  const { oneOf, ...dependentSchema } = dependent;
@@ -855,12 +918,13 @@ function withDependentSchema(validator, schema, rootSchema, dependencyKey, depen
855
918
  resolvedOneOf,
856
919
  expandAllBranches,
857
920
  recurseList,
858
- formData
921
+ formData,
922
+ experimental_customMergeAllOf
859
923
  )
860
924
  );
861
925
  });
862
926
  }
863
- function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, oneOf, expandAllBranches, recurseList, formData) {
927
+ function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, oneOf, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
864
928
  const validSubschemas = oneOf.filter((subschema) => {
865
929
  if (typeof subschema === "boolean" || !subschema || !subschema.properties) {
866
930
  return false;
@@ -891,7 +955,8 @@ function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, o
891
955
  rootSchema,
892
956
  formData,
893
957
  expandAllBranches,
894
- recurseList
958
+ recurseList,
959
+ experimental_customMergeAllOf
895
960
  );
896
961
  return schemas.map((s2) => mergeSchemas(schema, s2));
897
962
  });
@@ -907,7 +972,7 @@ var JUNK_OPTION = {
907
972
  }
908
973
  }
909
974
  };
910
- function calculateIndexScore(validator, rootSchema, schema, formData = {}) {
975
+ function calculateIndexScore(validator, rootSchema, schema, formData) {
911
976
  let totalScore = 0;
912
977
  if (schema) {
913
978
  if ((0, import_isObject5.default)(schema.properties)) {
@@ -935,7 +1000,10 @@ function calculateIndexScore(validator, rootSchema, schema, formData = {}) {
935
1000
  );
936
1001
  }
937
1002
  if (value.type === "object") {
938
- return score + calculateIndexScore(validator, rootSchema, value, formValue || {});
1003
+ if ((0, import_isObject5.default)(formValue)) {
1004
+ score += 1;
1005
+ }
1006
+ return score + calculateIndexScore(validator, rootSchema, value, formValue);
939
1007
  }
940
1008
  if (value.type === guessType(formValue)) {
941
1009
  let newScore = score + 1;
@@ -1005,12 +1073,17 @@ function isFixedItems(schema) {
1005
1073
 
1006
1074
  // src/mergeDefaultsWithFormData.ts
1007
1075
  var import_get6 = __toESM(require("lodash/get"));
1008
- function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false) {
1076
+ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false, defaultSupercedesUndefined = false) {
1009
1077
  if (Array.isArray(formData)) {
1010
1078
  const defaultsArray = Array.isArray(defaults) ? defaults : [];
1011
1079
  const mapped = formData.map((value, idx) => {
1012
1080
  if (defaultsArray[idx]) {
1013
- return mergeDefaultsWithFormData(defaultsArray[idx], value, mergeExtraArrayDefaults);
1081
+ return mergeDefaultsWithFormData(
1082
+ defaultsArray[idx],
1083
+ value,
1084
+ mergeExtraArrayDefaults,
1085
+ defaultSupercedesUndefined
1086
+ );
1014
1087
  }
1015
1088
  return value;
1016
1089
  });
@@ -1025,11 +1098,15 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1025
1098
  acc2[key] = mergeDefaultsWithFormData(
1026
1099
  defaults ? (0, import_get6.default)(defaults, key) : {},
1027
1100
  (0, import_get6.default)(formData, key),
1028
- mergeExtraArrayDefaults
1101
+ mergeExtraArrayDefaults,
1102
+ defaultSupercedesUndefined
1029
1103
  );
1030
1104
  return acc2;
1031
1105
  }, acc);
1032
1106
  }
1107
+ if (defaultSupercedesUndefined && formData === void 0) {
1108
+ return defaults;
1109
+ }
1033
1110
  return formData;
1034
1111
  }
1035
1112
 
@@ -1100,9 +1177,9 @@ function getInnerSchemaForArrayItem(schema, additionalItems = 0 /* Ignore */, id
1100
1177
  }
1101
1178
  return {};
1102
1179
  }
1103
- function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}) {
1180
+ function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
1104
1181
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1105
- if (includeUndefinedValues) {
1182
+ if (includeUndefinedValues || isConst) {
1106
1183
  obj[key] = computedDefault;
1107
1184
  } else if (emptyObjectFields !== "skipDefaults") {
1108
1185
  if (isObject(computedDefault)) {
@@ -1132,6 +1209,7 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1132
1209
  includeUndefinedValues = false,
1133
1210
  _recurseList = [],
1134
1211
  experimental_defaultFormStateBehavior = void 0,
1212
+ experimental_customMergeAllOf = void 0,
1135
1213
  required
1136
1214
  } = computeDefaultsProps;
1137
1215
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1139,7 +1217,9 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1139
1217
  let defaults = parentDefaults;
1140
1218
  let schemaToCompute = null;
1141
1219
  let updatedRecurseList = _recurseList;
1142
- if (isObject(defaults) && isObject(schema.default)) {
1220
+ if (isConstant(schema)) {
1221
+ defaults = schema.const;
1222
+ } else if (isObject(defaults) && isObject(schema.default)) {
1143
1223
  defaults = mergeObjects(defaults, schema.default);
1144
1224
  } else if (DEFAULT_KEY in schema) {
1145
1225
  defaults = schema.default;
@@ -1154,7 +1234,15 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1154
1234
  ...formData,
1155
1235
  ...getDefaultBasedOnSchemaType(validator, schema, computeDefaultsProps, defaults)
1156
1236
  };
1157
- const resolvedSchema = resolveDependencies(validator, schema, rootSchema, false, [], defaultFormData);
1237
+ const resolvedSchema = resolveDependencies(
1238
+ validator,
1239
+ schema,
1240
+ rootSchema,
1241
+ false,
1242
+ [],
1243
+ defaultFormData,
1244
+ experimental_customMergeAllOf
1245
+ );
1158
1246
  schemaToCompute = resolvedSchema[0];
1159
1247
  } else if (isFixedItems(schema)) {
1160
1248
  defaults = schema.items.map(
@@ -1222,18 +1310,24 @@ function getObjectDefaults(validator, rawSchema, {
1222
1310
  includeUndefinedValues = false,
1223
1311
  _recurseList = [],
1224
1312
  experimental_defaultFormStateBehavior = void 0,
1313
+ experimental_customMergeAllOf = void 0,
1225
1314
  required
1226
1315
  } = {}, defaults) {
1227
1316
  {
1228
1317
  const formData = isObject(rawFormData) ? rawFormData : {};
1229
1318
  const schema = rawSchema;
1230
- const retrievedSchema = experimental_defaultFormStateBehavior?.allOf === "populateDefaults" && ALL_OF_KEY in schema ? retrieveSchema(validator, schema, rootSchema, formData) : schema;
1319
+ const retrievedSchema = experimental_defaultFormStateBehavior?.allOf === "populateDefaults" && ALL_OF_KEY in schema ? retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf) : schema;
1320
+ const parentConst = retrievedSchema[CONST_KEY];
1231
1321
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
1232
1322
  (acc, key) => {
1233
- const computedDefault = computeDefaults(validator, (0, import_get7.default)(retrievedSchema, [PROPERTIES_KEY, key]), {
1323
+ const propertySchema = (0, import_get7.default)(retrievedSchema, [PROPERTIES_KEY, key]);
1324
+ const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1325
+ const hasConst = isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst;
1326
+ const computedDefault = computeDefaults(validator, propertySchema, {
1234
1327
  rootSchema,
1235
1328
  _recurseList,
1236
1329
  experimental_defaultFormStateBehavior,
1330
+ experimental_customMergeAllOf,
1237
1331
  includeUndefinedValues: includeUndefinedValues === true,
1238
1332
  parentDefaults: (0, import_get7.default)(defaults, [key]),
1239
1333
  rawFormData: (0, import_get7.default)(formData, [key]),
@@ -1246,7 +1340,8 @@ function getObjectDefaults(validator, rawSchema, {
1246
1340
  includeUndefinedValues,
1247
1341
  required,
1248
1342
  retrievedSchema.required,
1249
- experimental_defaultFormStateBehavior
1343
+ experimental_defaultFormStateBehavior,
1344
+ hasConst
1250
1345
  );
1251
1346
  return acc;
1252
1347
  },
@@ -1328,11 +1423,14 @@ function getArrayDefaults(validator, rawSchema, {
1328
1423
  });
1329
1424
  }
1330
1425
  }
1331
- if (neverPopulate) {
1332
- return defaults ?? emptyDefault;
1333
- }
1334
- if (ignoreMinItemsFlagSet && !required) {
1335
- return defaults ? defaults : void 0;
1426
+ const hasConst = isObject(schema) && CONST_KEY in schema;
1427
+ if (hasConst === false) {
1428
+ if (neverPopulate) {
1429
+ return defaults ?? emptyDefault;
1430
+ }
1431
+ if (ignoreMinItemsFlagSet && !required) {
1432
+ return defaults ? defaults : void 0;
1433
+ }
1336
1434
  }
1337
1435
  const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1338
1436
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
@@ -1362,26 +1460,29 @@ function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps
1362
1460
  }
1363
1461
  }
1364
1462
  }
1365
- function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior) {
1463
+ function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
1366
1464
  if (!isObject(theSchema)) {
1367
1465
  throw new Error("Invalid schema: " + theSchema);
1368
1466
  }
1369
- const schema = retrieveSchema(validator, theSchema, rootSchema, formData);
1467
+ const schema = retrieveSchema(validator, theSchema, rootSchema, formData, experimental_customMergeAllOf);
1370
1468
  const defaults = computeDefaults(validator, schema, {
1371
1469
  rootSchema,
1372
1470
  includeUndefinedValues,
1373
1471
  experimental_defaultFormStateBehavior,
1472
+ experimental_customMergeAllOf,
1374
1473
  rawFormData: formData
1375
1474
  });
1376
1475
  if (formData === void 0 || formData === null || typeof formData === "number" && isNaN(formData)) {
1377
1476
  return defaults;
1378
1477
  }
1379
- const { mergeExtraDefaults } = experimental_defaultFormStateBehavior?.arrayMinItems || {};
1478
+ const { mergeDefaultsIntoFormData, arrayMinItems = {} } = experimental_defaultFormStateBehavior || {};
1479
+ const { mergeExtraDefaults } = arrayMinItems;
1480
+ const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
1380
1481
  if (isObject(formData)) {
1381
- return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1482
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults, defaultSupercedesUndefined);
1382
1483
  }
1383
1484
  if (Array.isArray(formData)) {
1384
- return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1485
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults, defaultSupercedesUndefined);
1385
1486
  }
1386
1487
  return formData;
1387
1488
  }
@@ -1554,7 +1655,7 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1554
1655
  // src/schema/toIdSchema.ts
1555
1656
  var import_get9 = __toESM(require("lodash/get"));
1556
1657
  var import_isEqual2 = __toESM(require("lodash/isEqual"));
1557
- function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = []) {
1658
+ function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1558
1659
  if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1559
1660
  const _schema = retrieveSchema(validator, schema, rootSchema, formData);
1560
1661
  const sameSchemaIndex = _recurseList.findIndex((item) => (0, import_isEqual2.default)(item, _schema));
@@ -1567,7 +1668,8 @@ function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSc
1567
1668
  id,
1568
1669
  rootSchema,
1569
1670
  formData,
1570
- _recurseList.concat(_schema)
1671
+ _recurseList.concat(_schema),
1672
+ experimental_customMergeAllOf
1571
1673
  );
1572
1674
  }
1573
1675
  }
@@ -1580,7 +1682,8 @@ function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSc
1580
1682
  id,
1581
1683
  rootSchema,
1582
1684
  formData,
1583
- _recurseList
1685
+ _recurseList,
1686
+ experimental_customMergeAllOf
1584
1687
  );
1585
1688
  }
1586
1689
  const $id = id || idPrefix;
@@ -1599,14 +1702,25 @@ function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSc
1599
1702
  // It's possible that formData is not an object -- this can happen if an
1600
1703
  // array item has just been added, but not populated with data yet
1601
1704
  (0, import_get9.default)(formData, [name]),
1602
- _recurseList
1705
+ _recurseList,
1706
+ experimental_customMergeAllOf
1603
1707
  );
1604
1708
  }
1605
1709
  }
1606
1710
  return idSchema;
1607
1711
  }
1608
- function toIdSchema(validator, schema, id, rootSchema, formData, idPrefix = "root", idSeparator = "_") {
1609
- return toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData);
1712
+ function toIdSchema(validator, schema, id, rootSchema, formData, idPrefix = "root", idSeparator = "_", experimental_customMergeAllOf) {
1713
+ return toIdSchemaInternal(
1714
+ validator,
1715
+ schema,
1716
+ idPrefix,
1717
+ idSeparator,
1718
+ id,
1719
+ rootSchema,
1720
+ formData,
1721
+ void 0,
1722
+ experimental_customMergeAllOf
1723
+ );
1610
1724
  }
1611
1725
 
1612
1726
  // src/schema/toPathSchema.ts
@@ -1710,11 +1824,13 @@ var SchemaUtils = class {
1710
1824
  * @param validator - An implementation of the `ValidatorType` interface that will be forwarded to all the APIs
1711
1825
  * @param rootSchema - The root schema that will be forwarded to all the APIs
1712
1826
  * @param experimental_defaultFormStateBehavior - Configuration flags to allow users to override default form state behavior
1827
+ * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
1713
1828
  */
1714
- constructor(validator, rootSchema, experimental_defaultFormStateBehavior) {
1829
+ constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
1715
1830
  this.rootSchema = rootSchema;
1716
1831
  this.validator = validator;
1717
1832
  this.experimental_defaultFormStateBehavior = experimental_defaultFormStateBehavior;
1833
+ this.experimental_customMergeAllOf = experimental_customMergeAllOf;
1718
1834
  }
1719
1835
  /** Returns the `ValidatorType` in the `SchemaUtilsType`
1720
1836
  *
@@ -1730,13 +1846,14 @@ var SchemaUtils = class {
1730
1846
  * @param validator - An implementation of the `ValidatorType` interface that will be compared against the current one
1731
1847
  * @param rootSchema - The root schema that will be compared against the current one
1732
1848
  * @param [experimental_defaultFormStateBehavior] Optional configuration object, if provided, allows users to override default form state behavior
1849
+ * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
1733
1850
  * @returns - True if the `SchemaUtilsType` differs from the given `validator` or `rootSchema`
1734
1851
  */
1735
- doesSchemaUtilsDiffer(validator, rootSchema, experimental_defaultFormStateBehavior = {}) {
1852
+ doesSchemaUtilsDiffer(validator, rootSchema, experimental_defaultFormStateBehavior = {}, experimental_customMergeAllOf) {
1736
1853
  if (!validator || !rootSchema) {
1737
1854
  return false;
1738
1855
  }
1739
- return this.validator !== validator || !deepEquals(this.rootSchema, rootSchema) || !deepEquals(this.experimental_defaultFormStateBehavior, experimental_defaultFormStateBehavior);
1856
+ return this.validator !== validator || !deepEquals(this.rootSchema, rootSchema) || !deepEquals(this.experimental_defaultFormStateBehavior, experimental_defaultFormStateBehavior) || this.experimental_customMergeAllOf !== experimental_customMergeAllOf;
1740
1857
  }
1741
1858
  /** Returns the superset of `formData` that includes the given set updated to include any missing fields that have
1742
1859
  * computed to have defaults provided in the `schema`.
@@ -1755,7 +1872,8 @@ var SchemaUtils = class {
1755
1872
  formData,
1756
1873
  this.rootSchema,
1757
1874
  includeUndefinedValues,
1758
- this.experimental_defaultFormStateBehavior
1875
+ this.experimental_defaultFormStateBehavior,
1876
+ this.experimental_customMergeAllOf
1759
1877
  );
1760
1878
  }
1761
1879
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
@@ -1865,7 +1983,13 @@ var SchemaUtils = class {
1865
1983
  * @returns - The schema having its conditions, additional properties, references and dependencies resolved
1866
1984
  */
1867
1985
  retrieveSchema(schema, rawFormData) {
1868
- return retrieveSchema(this.validator, schema, this.rootSchema, rawFormData);
1986
+ return retrieveSchema(
1987
+ this.validator,
1988
+ schema,
1989
+ this.rootSchema,
1990
+ rawFormData,
1991
+ this.experimental_customMergeAllOf
1992
+ );
1869
1993
  }
1870
1994
  /** Sanitize the `data` associated with the `oldSchema` so it is considered appropriate for the `newSchema`. If the
1871
1995
  * new schema does not contain any properties, then `undefined` is returned to clear all the form data. Due to the
@@ -1891,7 +2015,16 @@ var SchemaUtils = class {
1891
2015
  * @returns - The `IdSchema` object for the `schema`
1892
2016
  */
1893
2017
  toIdSchema(schema, id, formData, idPrefix = "root", idSeparator = "_") {
1894
- return toIdSchema(this.validator, schema, id, this.rootSchema, formData, idPrefix, idSeparator);
2018
+ return toIdSchema(
2019
+ this.validator,
2020
+ schema,
2021
+ id,
2022
+ this.rootSchema,
2023
+ formData,
2024
+ idPrefix,
2025
+ idSeparator,
2026
+ this.experimental_customMergeAllOf
2027
+ );
1895
2028
  }
1896
2029
  /** Generates an `PathSchema` object for the `schema`, recursively
1897
2030
  *
@@ -1904,8 +2037,13 @@ var SchemaUtils = class {
1904
2037
  return toPathSchema(this.validator, schema, name, this.rootSchema, formData);
1905
2038
  }
1906
2039
  };
1907
- function createSchemaUtils(validator, rootSchema, experimental_defaultFormStateBehavior = {}) {
1908
- return new SchemaUtils(validator, rootSchema, experimental_defaultFormStateBehavior);
2040
+ function createSchemaUtils(validator, rootSchema, experimental_defaultFormStateBehavior = {}, experimental_customMergeAllOf) {
2041
+ return new SchemaUtils(
2042
+ validator,
2043
+ rootSchema,
2044
+ experimental_defaultFormStateBehavior,
2045
+ experimental_customMergeAllOf
2046
+ );
1909
2047
  }
1910
2048
 
1911
2049
  // src/dataURItoBlob.ts
@@ -2044,6 +2182,7 @@ function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2044
2182
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"));
2045
2183
  var import_get11 = __toESM(require("lodash/get"));
2046
2184
  var import_set3 = __toESM(require("lodash/set"));
2185
+ var import_setWith = __toESM(require("lodash/setWith"));
2047
2186
  var ErrorSchemaBuilder = class {
2048
2187
  /** Construct an `ErrorSchemaBuilder` with an optional initial set of errors in an `ErrorSchema`.
2049
2188
  *
@@ -2073,7 +2212,7 @@ var ErrorSchemaBuilder = class {
2073
2212
  let errorBlock = hasPath ? (0, import_get11.default)(this.errorSchema, pathOfError) : this.errorSchema;
2074
2213
  if (!errorBlock && pathOfError) {
2075
2214
  errorBlock = {};
2076
- (0, import_set3.default)(this.errorSchema, pathOfError, errorBlock);
2215
+ (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
2077
2216
  }
2078
2217
  return errorBlock;
2079
2218
  }