@rjsf/utils 5.8.2 → 5.10.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.
@@ -528,11 +528,12 @@
528
528
  }, acc);
529
529
  }
530
530
 
531
- var _excluded$1 = ["if", "then", "else"],
532
- _excluded2 = ["$ref"],
531
+ var _excluded$2 = ["if", "then", "else"],
532
+ _excluded2$1 = ["$ref"],
533
533
  _excluded3 = ["allOf"],
534
- _excluded4 = ["dependencies"],
535
- _excluded5 = ["oneOf"];
534
+ _excluded4 = ["oneOf", "anyOf"],
535
+ _excluded5 = ["dependencies"],
536
+ _excluded6 = ["oneOf"];
536
537
  /** Retrieves an expanded schema that has had all of its conditions, additional properties, references and dependencies
537
538
  * resolved and merged into the `schema` given a `validator`, `rootSchema` and `rawFormData` that is used to do the
538
539
  * potentially recursive resolution.
@@ -565,7 +566,7 @@
565
566
  var expression = schema["if"],
566
567
  then = schema.then,
567
568
  otherwise = schema["else"],
568
- resolvedSchemaLessConditional = _objectWithoutPropertiesLoose(schema, _excluded$1);
569
+ resolvedSchemaLessConditional = _objectWithoutPropertiesLoose(schema, _excluded$2);
569
570
  var conditionValue = validator.isValid(expression, formData || {}, rootSchema);
570
571
  var resolvedSchemas = [resolvedSchemaLessConditional];
571
572
  var schemas = [];
@@ -675,7 +676,7 @@
675
676
  function resolveReference(validator, schema, rootSchema, expandAllBranches, formData) {
676
677
  // Drop the $ref property of the source schema.
677
678
  var $ref = schema.$ref,
678
- localSchema = _objectWithoutPropertiesLoose(schema, _excluded2);
679
+ localSchema = _objectWithoutPropertiesLoose(schema, _excluded2$1);
679
680
  // Retrieve the referenced schema definition.
680
681
  var refSchema = findSchemaDefinition($ref, rootSchema);
681
682
  // Update referenced schema definition with local schema properties.
@@ -757,9 +758,9 @@
757
758
  if (IF_KEY in resolvedSchema) {
758
759
  return resolveCondition(validator, resolvedSchema, rootSchema, expandAllBranches, rawFormData);
759
760
  }
760
- if (ALL_OF_KEY in schema) {
761
+ if (ALL_OF_KEY in resolvedSchema) {
761
762
  try {
762
- resolvedSchema = mergeAllOf__default["default"](s, {
763
+ resolvedSchema = mergeAllOf__default["default"](resolvedSchema, {
763
764
  deep: false
764
765
  });
765
766
  } catch (e) {
@@ -794,10 +795,14 @@
794
795
  */
795
796
  function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranches, rawFormData) {
796
797
  var anyOrOneOf;
797
- if (Array.isArray(schema.oneOf)) {
798
- anyOrOneOf = schema.oneOf;
799
- } else if (Array.isArray(schema.anyOf)) {
800
- anyOrOneOf = schema.anyOf;
798
+ var _schema = schema,
799
+ oneOf = _schema.oneOf,
800
+ anyOf = _schema.anyOf,
801
+ remaining = _objectWithoutPropertiesLoose(_schema, _excluded4);
802
+ if (Array.isArray(oneOf)) {
803
+ anyOrOneOf = oneOf;
804
+ } else if (Array.isArray(anyOf)) {
805
+ anyOrOneOf = anyOf;
801
806
  }
802
807
  if (anyOrOneOf) {
803
808
  // Ensure that during expand all branches we pass an object rather than undefined so that all options are interrogated
@@ -813,9 +818,11 @@
813
818
  // Call this to trigger the set of isValid() calls that the schema parser will need
814
819
  var option = getFirstMatchingOption(validator, formData, anyOrOneOf, rootSchema, discriminator);
815
820
  if (expandAllBranches) {
816
- return anyOrOneOf;
821
+ return anyOrOneOf.map(function (item) {
822
+ return _extends({}, remaining, item);
823
+ });
817
824
  }
818
- schema = anyOrOneOf[option];
825
+ schema = _extends({}, remaining, anyOrOneOf[option]);
819
826
  }
820
827
  return [schema];
821
828
  }
@@ -833,7 +840,7 @@
833
840
  function resolveDependencies(validator, schema, rootSchema, expandAllBranches, formData) {
834
841
  // Drop the dependencies from the source schema.
835
842
  var dependencies = schema.dependencies,
836
- remainingSchema = _objectWithoutPropertiesLoose(schema, _excluded4);
843
+ remainingSchema = _objectWithoutPropertiesLoose(schema, _excluded5);
837
844
  var resolvedSchemas = resolveAnyOrOneOfSchemas(validator, remainingSchema, rootSchema, expandAllBranches, formData);
838
845
  return resolvedSchemas.flatMap(function (resolvedSchema) {
839
846
  return processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, formData);
@@ -916,7 +923,7 @@
916
923
  var dependentSchemas = retrieveSchemaInternal(validator, dependencyValue, rootSchema, formData, expandAllBranches);
917
924
  return dependentSchemas.flatMap(function (dependent) {
918
925
  var oneOf = dependent.oneOf,
919
- dependentSchema = _objectWithoutPropertiesLoose(dependent, _excluded5);
926
+ dependentSchema = _objectWithoutPropertiesLoose(dependent, _excluded6);
920
927
  schema = mergeSchemas(schema, dependentSchema);
921
928
  // Since it does not contain oneOf, we return the original schema.
922
929
  if (oneOf === undefined) {
@@ -1031,8 +1038,10 @@
1031
1038
  var newSchema = retrieveSchema(validator, value, rootSchema, formValue);
1032
1039
  return score + calculateIndexScore(validator, rootSchema, newSchema, formValue || {});
1033
1040
  }
1034
- if (has__default["default"](value, ONE_OF_KEY) && formValue) {
1035
- return score + getClosestMatchingOption(validator, rootSchema, formValue, get__default["default"](value, ONE_OF_KEY));
1041
+ if ((has__default["default"](value, ONE_OF_KEY) || has__default["default"](value, ANY_OF_KEY)) && formValue) {
1042
+ var _key = has__default["default"](value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
1043
+ var discriminator = getDiscriminatorFieldFromSchema(value);
1044
+ return score + getClosestMatchingOption(validator, rootSchema, formValue, get__default["default"](value, _key), -1, discriminator);
1036
1045
  }
1037
1046
  if (value.type === 'object') {
1038
1047
  return score + calculateIndexScore(validator, rootSchema, value, formValue || {});
@@ -1086,8 +1095,15 @@
1086
1095
  if (selectedOption === void 0) {
1087
1096
  selectedOption = -1;
1088
1097
  }
1098
+ // First resolve any refs in the options
1099
+ var resolvedOptions = options.map(function (option) {
1100
+ if (has__default["default"](option, REF_KEY)) {
1101
+ return retrieveSchema(validator, option, rootSchema, formData);
1102
+ }
1103
+ return option;
1104
+ });
1089
1105
  // Reduce the array of options down to a list of the indexes that are considered matching options
1090
- var allValidIndexes = options.reduce(function (validList, option, index) {
1106
+ var allValidIndexes = resolvedOptions.reduce(function (validList, option, index) {
1091
1107
  var testOptions = [JUNK_OPTION, option];
1092
1108
  var match = getFirstMatchingOption(validator, formData, testOptions, rootSchema, discriminatorField);
1093
1109
  // The match is the real option, so add its index to list of valid indexes
@@ -1102,7 +1118,7 @@
1102
1118
  }
1103
1119
  if (!allValidIndexes.length) {
1104
1120
  // No indexes were valid, so we'll score all the options, add all the indexes
1105
- times__default["default"](options.length, function (i) {
1121
+ times__default["default"](resolvedOptions.length, function (i) {
1106
1122
  return allValidIndexes.push(i);
1107
1123
  });
1108
1124
  }
@@ -1110,10 +1126,7 @@
1110
1126
  // Score all the options in the list of valid indexes and return the index with the best score
1111
1127
  var _allValidIndexes$redu = allValidIndexes.reduce(function (scoreData, index) {
1112
1128
  var bestScore = scoreData.bestScore;
1113
- var option = options[index];
1114
- if (has__default["default"](option, REF_KEY)) {
1115
- option = retrieveSchema(validator, option, rootSchema, formData);
1116
- }
1129
+ var option = resolvedOptions[index];
1117
1130
  var score = calculateIndexScore(validator, rootSchema, option, formData);
1118
1131
  scoreCount.add(score);
1119
1132
  if (score > bestScore) {
@@ -1153,29 +1166,38 @@
1153
1166
  * - objects are deeply merged
1154
1167
  * - arrays are merged in such a way that:
1155
1168
  * - when the array is set in form data, only array entries set in form data
1156
- * are deeply merged; additional entries from the defaults are ignored
1169
+ * are deeply merged; additional entries from the defaults are ignored unless `mergeExtraArrayDefaults` is true, in
1170
+ * which case the extras are appended onto the end of the form data
1157
1171
  * - when the array is not set in form data, the default is copied over
1158
1172
  * - scalars are overwritten/set by form data
1159
1173
  *
1160
1174
  * @param [defaults] - The defaults to merge
1161
1175
  * @param [formData] - The form data into which the defaults will be merged
1176
+ * @param [mergeExtraArrayDefaults=false] - If true, any additional default array entries are appended onto the formData
1162
1177
  * @returns - The resulting merged form data with defaults
1163
1178
  */
1164
- function mergeDefaultsWithFormData(defaults, formData) {
1179
+ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults) {
1180
+ if (mergeExtraArrayDefaults === void 0) {
1181
+ mergeExtraArrayDefaults = false;
1182
+ }
1165
1183
  if (Array.isArray(formData)) {
1166
1184
  var defaultsArray = Array.isArray(defaults) ? defaults : [];
1167
1185
  var mapped = formData.map(function (value, idx) {
1168
1186
  if (defaultsArray[idx]) {
1169
- return mergeDefaultsWithFormData(defaultsArray[idx], value);
1187
+ return mergeDefaultsWithFormData(defaultsArray[idx], value, mergeExtraArrayDefaults);
1170
1188
  }
1171
1189
  return value;
1172
1190
  });
1191
+ // Merge any extra defaults when mergeExtraArrayDefaults is true
1192
+ if (mergeExtraArrayDefaults && mapped.length < defaultsArray.length) {
1193
+ mapped.push.apply(mapped, defaultsArray.slice(mapped.length));
1194
+ }
1173
1195
  return mapped;
1174
1196
  }
1175
1197
  if (isObject(formData)) {
1176
1198
  var acc = Object.assign({}, defaults); // Prevent mutation of source object.
1177
1199
  return Object.keys(formData).reduce(function (acc, key) {
1178
- acc[key] = mergeDefaultsWithFormData(defaults ? get__default["default"](defaults, key) : {}, get__default["default"](formData, key));
1200
+ acc[key] = mergeDefaultsWithFormData(defaults ? get__default["default"](defaults, key) : {}, get__default["default"](formData, key), mergeExtraArrayDefaults);
1179
1201
  return acc;
1180
1202
  }, acc);
1181
1203
  }
@@ -1266,6 +1288,8 @@
1266
1288
  return isSelect(validator, schema.items, rootSchema);
1267
1289
  }
1268
1290
 
1291
+ var _excluded$1 = ["oneOf"],
1292
+ _excluded2 = ["anyOf"];
1269
1293
  /** Enum that indicates how `schema.additionalItems` should be handled by the `getInnerSchemaForArrayItem()` function.
1270
1294
  */
1271
1295
  var AdditionalItemsHandling;
@@ -1344,10 +1368,13 @@
1344
1368
  obj[key] = computedDefault;
1345
1369
  } else if (emptyObjectFields !== 'skipDefaults') {
1346
1370
  if (isObject(computedDefault)) {
1371
+ // If isParentRequired is undefined, then we are at the root level of the schema so defer to the requiredness of
1372
+ // the field key itself in the `requiredField` list
1373
+ var isSelfOrParentRequired = isParentRequired === undefined ? requiredFields.includes(key) : isParentRequired;
1347
1374
  // Store computedDefault if it's a non-empty object(e.g. not {}) and satisfies certain conditions
1348
1375
  // Condition 1: If computedDefault is not empty or if the key is a required field
1349
1376
  // Condition 2: If the parent object is required or emptyObjectFields is not 'populateRequiredDefaults'
1350
- if ((!isEmpty__default["default"](computedDefault) || requiredFields.includes(key)) && (isParentRequired || emptyObjectFields !== 'populateRequiredDefaults')) {
1377
+ if ((!isEmpty__default["default"](computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== 'populateRequiredDefaults')) {
1351
1378
  obj[key] = computedDefault;
1352
1379
  }
1353
1380
  } else if (
@@ -1388,8 +1415,7 @@
1388
1415
  _recurseList = _ref$_recurseList === void 0 ? [] : _ref$_recurseList,
1389
1416
  _ref$experimental_def = _ref.experimental_defaultFormStateBehavior,
1390
1417
  experimental_defaultFormStateBehavior = _ref$experimental_def === void 0 ? undefined : _ref$experimental_def,
1391
- _ref$required = _ref.required,
1392
- required = _ref$required === void 0 ? false : _ref$required;
1418
+ required = _ref.required;
1393
1419
  var formData = isObject(rawFormData) ? rawFormData : {};
1394
1420
  var schema = isObject(rawSchema) ? rawSchema : {};
1395
1421
  // Compute the defaults recursively: give highest priority to deepest nodes.
@@ -1421,21 +1447,28 @@
1421
1447
  _recurseList: _recurseList,
1422
1448
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1423
1449
  parentDefaults: Array.isArray(parentDefaults) ? parentDefaults[idx] : undefined,
1424
- rawFormData: formData
1450
+ rawFormData: formData,
1451
+ required: required
1425
1452
  });
1426
1453
  });
1427
1454
  } else if (ONE_OF_KEY in schema) {
1428
- if (schema.oneOf.length === 0) {
1455
+ var oneOf = schema.oneOf,
1456
+ remaining = _objectWithoutPropertiesLoose(schema, _excluded$1);
1457
+ if (oneOf.length === 0) {
1429
1458
  return undefined;
1430
1459
  }
1431
1460
  var discriminator = getDiscriminatorFieldFromSchema(schema);
1432
- schemaToCompute = schema.oneOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, schema.oneOf, 0, discriminator)];
1461
+ schemaToCompute = oneOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, oneOf, 0, discriminator)];
1462
+ schemaToCompute = _extends({}, remaining, schemaToCompute);
1433
1463
  } else if (ANY_OF_KEY in schema) {
1434
- if (schema.anyOf.length === 0) {
1464
+ var anyOf = schema.anyOf,
1465
+ _remaining = _objectWithoutPropertiesLoose(schema, _excluded2);
1466
+ if (anyOf.length === 0) {
1435
1467
  return undefined;
1436
1468
  }
1437
1469
  var _discriminator = getDiscriminatorFieldFromSchema(schema);
1438
- schemaToCompute = schema.anyOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, schema.anyOf, 0, _discriminator)];
1470
+ schemaToCompute = anyOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, anyOf, 0, _discriminator)];
1471
+ schemaToCompute = _extends({}, _remaining, schemaToCompute);
1439
1472
  }
1440
1473
  if (schemaToCompute) {
1441
1474
  return computeDefaults(validator, schemaToCompute, {
@@ -1444,7 +1477,8 @@
1444
1477
  _recurseList: updatedRecurseList,
1445
1478
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1446
1479
  parentDefaults: defaults,
1447
- rawFormData: formData
1480
+ rawFormData: formData,
1481
+ required: required
1448
1482
  });
1449
1483
  }
1450
1484
  // No defaults defined for this node, fallback to generic typed ones.
@@ -1511,6 +1545,7 @@
1511
1545
  }
1512
1546
  case 'array':
1513
1547
  {
1548
+ var _experimental_default3;
1514
1549
  // Inject defaults into existing array defaults
1515
1550
  if (Array.isArray(defaults)) {
1516
1551
  defaults = defaults.map(function (item, idx) {
@@ -1519,7 +1554,8 @@
1519
1554
  rootSchema: rootSchema,
1520
1555
  _recurseList: _recurseList,
1521
1556
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1522
- parentDefaults: item
1557
+ parentDefaults: item,
1558
+ required: required
1523
1559
  });
1524
1560
  });
1525
1561
  }
@@ -1532,11 +1568,12 @@
1532
1568
  _recurseList: _recurseList,
1533
1569
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1534
1570
  rawFormData: item,
1535
- parentDefaults: get__default["default"](defaults, [idx])
1571
+ parentDefaults: get__default["default"](defaults, [idx]),
1572
+ required: required
1536
1573
  });
1537
1574
  });
1538
1575
  }
1539
- var ignoreMinItemsFlagSet = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.arrayMinItems) === 'requiredOnly';
1576
+ var ignoreMinItemsFlagSet = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : (_experimental_default3 = experimental_defaultFormStateBehavior.arrayMinItems) === null || _experimental_default3 === void 0 ? void 0 : _experimental_default3.populate) === 'requiredOnly';
1540
1577
  if (ignoreMinItemsFlagSet && !required) {
1541
1578
  // If no form data exists or defaults are set leave the field empty/non-existent, otherwise
1542
1579
  // return form data/defaults
@@ -1554,7 +1591,8 @@
1554
1591
  parentDefaults: fillerDefault,
1555
1592
  rootSchema: rootSchema,
1556
1593
  _recurseList: _recurseList,
1557
- experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior
1594
+ experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1595
+ required: required
1558
1596
  }));
1559
1597
  // then fill up the rest with either the item default or empty, up to minItems
1560
1598
  return defaultEntries.concat(fillerEntries);
@@ -1593,11 +1631,13 @@
1593
1631
  // No form data? Use schema defaults.
1594
1632
  return defaults;
1595
1633
  }
1634
+ var _ref2 = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.arrayMinItems) || {},
1635
+ mergeExtraDefaults = _ref2.mergeExtraDefaults;
1596
1636
  if (isObject(formData)) {
1597
- return mergeDefaultsWithFormData(defaults, formData);
1637
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1598
1638
  }
1599
1639
  if (Array.isArray(formData)) {
1600
- return mergeDefaultsWithFormData(defaults, formData);
1640
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1601
1641
  }
1602
1642
  return formData;
1603
1643
  }