@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.
package/dist/utils.esm.js CHANGED
@@ -523,11 +523,12 @@ function mergeSchemas(obj1, obj2) {
523
523
  }, acc);
524
524
  }
525
525
 
526
- var _excluded$1 = ["if", "then", "else"],
527
- _excluded2 = ["$ref"],
526
+ var _excluded$2 = ["if", "then", "else"],
527
+ _excluded2$1 = ["$ref"],
528
528
  _excluded3 = ["allOf"],
529
- _excluded4 = ["dependencies"],
530
- _excluded5 = ["oneOf"];
529
+ _excluded4 = ["oneOf", "anyOf"],
530
+ _excluded5 = ["dependencies"],
531
+ _excluded6 = ["oneOf"];
531
532
  /** Retrieves an expanded schema that has had all of its conditions, additional properties, references and dependencies
532
533
  * resolved and merged into the `schema` given a `validator`, `rootSchema` and `rawFormData` that is used to do the
533
534
  * potentially recursive resolution.
@@ -560,7 +561,7 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, form
560
561
  var expression = schema["if"],
561
562
  then = schema.then,
562
563
  otherwise = schema["else"],
563
- resolvedSchemaLessConditional = _objectWithoutPropertiesLoose(schema, _excluded$1);
564
+ resolvedSchemaLessConditional = _objectWithoutPropertiesLoose(schema, _excluded$2);
564
565
  var conditionValue = validator.isValid(expression, formData || {}, rootSchema);
565
566
  var resolvedSchemas = [resolvedSchemaLessConditional];
566
567
  var schemas = [];
@@ -670,7 +671,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, formDat
670
671
  function resolveReference(validator, schema, rootSchema, expandAllBranches, formData) {
671
672
  // Drop the $ref property of the source schema.
672
673
  var $ref = schema.$ref,
673
- localSchema = _objectWithoutPropertiesLoose(schema, _excluded2);
674
+ localSchema = _objectWithoutPropertiesLoose(schema, _excluded2$1);
674
675
  // Retrieve the referenced schema definition.
675
676
  var refSchema = findSchemaDefinition($ref, rootSchema);
676
677
  // Update referenced schema definition with local schema properties.
@@ -752,9 +753,9 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
752
753
  if (IF_KEY in resolvedSchema) {
753
754
  return resolveCondition(validator, resolvedSchema, rootSchema, expandAllBranches, rawFormData);
754
755
  }
755
- if (ALL_OF_KEY in schema) {
756
+ if (ALL_OF_KEY in resolvedSchema) {
756
757
  try {
757
- resolvedSchema = mergeAllOf(s, {
758
+ resolvedSchema = mergeAllOf(resolvedSchema, {
758
759
  deep: false
759
760
  });
760
761
  } catch (e) {
@@ -789,10 +790,14 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
789
790
  */
790
791
  function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranches, rawFormData) {
791
792
  var anyOrOneOf;
792
- if (Array.isArray(schema.oneOf)) {
793
- anyOrOneOf = schema.oneOf;
794
- } else if (Array.isArray(schema.anyOf)) {
795
- anyOrOneOf = schema.anyOf;
793
+ var _schema = schema,
794
+ oneOf = _schema.oneOf,
795
+ anyOf = _schema.anyOf,
796
+ remaining = _objectWithoutPropertiesLoose(_schema, _excluded4);
797
+ if (Array.isArray(oneOf)) {
798
+ anyOrOneOf = oneOf;
799
+ } else if (Array.isArray(anyOf)) {
800
+ anyOrOneOf = anyOf;
796
801
  }
797
802
  if (anyOrOneOf) {
798
803
  // Ensure that during expand all branches we pass an object rather than undefined so that all options are interrogated
@@ -808,9 +813,11 @@ function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranch
808
813
  // Call this to trigger the set of isValid() calls that the schema parser will need
809
814
  var option = getFirstMatchingOption(validator, formData, anyOrOneOf, rootSchema, discriminator);
810
815
  if (expandAllBranches) {
811
- return anyOrOneOf;
816
+ return anyOrOneOf.map(function (item) {
817
+ return _extends({}, remaining, item);
818
+ });
812
819
  }
813
- schema = anyOrOneOf[option];
820
+ schema = _extends({}, remaining, anyOrOneOf[option]);
814
821
  }
815
822
  return [schema];
816
823
  }
@@ -828,7 +835,7 @@ function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranch
828
835
  function resolveDependencies(validator, schema, rootSchema, expandAllBranches, formData) {
829
836
  // Drop the dependencies from the source schema.
830
837
  var dependencies = schema.dependencies,
831
- remainingSchema = _objectWithoutPropertiesLoose(schema, _excluded4);
838
+ remainingSchema = _objectWithoutPropertiesLoose(schema, _excluded5);
832
839
  var resolvedSchemas = resolveAnyOrOneOfSchemas(validator, remainingSchema, rootSchema, expandAllBranches, formData);
833
840
  return resolvedSchemas.flatMap(function (resolvedSchema) {
834
841
  return processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, formData);
@@ -911,7 +918,7 @@ function withDependentSchema(validator, schema, rootSchema, dependencyKey, depen
911
918
  var dependentSchemas = retrieveSchemaInternal(validator, dependencyValue, rootSchema, formData, expandAllBranches);
912
919
  return dependentSchemas.flatMap(function (dependent) {
913
920
  var oneOf = dependent.oneOf,
914
- dependentSchema = _objectWithoutPropertiesLoose(dependent, _excluded5);
921
+ dependentSchema = _objectWithoutPropertiesLoose(dependent, _excluded6);
915
922
  schema = mergeSchemas(schema, dependentSchema);
916
923
  // Since it does not contain oneOf, we return the original schema.
917
924
  if (oneOf === undefined) {
@@ -1026,8 +1033,10 @@ function calculateIndexScore(validator, rootSchema, schema, formData) {
1026
1033
  var newSchema = retrieveSchema(validator, value, rootSchema, formValue);
1027
1034
  return score + calculateIndexScore(validator, rootSchema, newSchema, formValue || {});
1028
1035
  }
1029
- if (has(value, ONE_OF_KEY) && formValue) {
1030
- return score + getClosestMatchingOption(validator, rootSchema, formValue, get(value, ONE_OF_KEY));
1036
+ if ((has(value, ONE_OF_KEY) || has(value, ANY_OF_KEY)) && formValue) {
1037
+ var _key = has(value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
1038
+ var discriminator = getDiscriminatorFieldFromSchema(value);
1039
+ return score + getClosestMatchingOption(validator, rootSchema, formValue, get(value, _key), -1, discriminator);
1031
1040
  }
1032
1041
  if (value.type === 'object') {
1033
1042
  return score + calculateIndexScore(validator, rootSchema, value, formValue || {});
@@ -1081,8 +1090,15 @@ function getClosestMatchingOption(validator, rootSchema, formData, options, sele
1081
1090
  if (selectedOption === void 0) {
1082
1091
  selectedOption = -1;
1083
1092
  }
1093
+ // First resolve any refs in the options
1094
+ var resolvedOptions = options.map(function (option) {
1095
+ if (has(option, REF_KEY)) {
1096
+ return retrieveSchema(validator, option, rootSchema, formData);
1097
+ }
1098
+ return option;
1099
+ });
1084
1100
  // Reduce the array of options down to a list of the indexes that are considered matching options
1085
- var allValidIndexes = options.reduce(function (validList, option, index) {
1101
+ var allValidIndexes = resolvedOptions.reduce(function (validList, option, index) {
1086
1102
  var testOptions = [JUNK_OPTION, option];
1087
1103
  var match = getFirstMatchingOption(validator, formData, testOptions, rootSchema, discriminatorField);
1088
1104
  // The match is the real option, so add its index to list of valid indexes
@@ -1097,7 +1113,7 @@ function getClosestMatchingOption(validator, rootSchema, formData, options, sele
1097
1113
  }
1098
1114
  if (!allValidIndexes.length) {
1099
1115
  // No indexes were valid, so we'll score all the options, add all the indexes
1100
- times(options.length, function (i) {
1116
+ times(resolvedOptions.length, function (i) {
1101
1117
  return allValidIndexes.push(i);
1102
1118
  });
1103
1119
  }
@@ -1105,10 +1121,7 @@ function getClosestMatchingOption(validator, rootSchema, formData, options, sele
1105
1121
  // Score all the options in the list of valid indexes and return the index with the best score
1106
1122
  var _allValidIndexes$redu = allValidIndexes.reduce(function (scoreData, index) {
1107
1123
  var bestScore = scoreData.bestScore;
1108
- var option = options[index];
1109
- if (has(option, REF_KEY)) {
1110
- option = retrieveSchema(validator, option, rootSchema, formData);
1111
- }
1124
+ var option = resolvedOptions[index];
1112
1125
  var score = calculateIndexScore(validator, rootSchema, option, formData);
1113
1126
  scoreCount.add(score);
1114
1127
  if (score > bestScore) {
@@ -1148,29 +1161,38 @@ function isFixedItems(schema) {
1148
1161
  * - objects are deeply merged
1149
1162
  * - arrays are merged in such a way that:
1150
1163
  * - when the array is set in form data, only array entries set in form data
1151
- * are deeply merged; additional entries from the defaults are ignored
1164
+ * are deeply merged; additional entries from the defaults are ignored unless `mergeExtraArrayDefaults` is true, in
1165
+ * which case the extras are appended onto the end of the form data
1152
1166
  * - when the array is not set in form data, the default is copied over
1153
1167
  * - scalars are overwritten/set by form data
1154
1168
  *
1155
1169
  * @param [defaults] - The defaults to merge
1156
1170
  * @param [formData] - The form data into which the defaults will be merged
1171
+ * @param [mergeExtraArrayDefaults=false] - If true, any additional default array entries are appended onto the formData
1157
1172
  * @returns - The resulting merged form data with defaults
1158
1173
  */
1159
- function mergeDefaultsWithFormData(defaults, formData) {
1174
+ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults) {
1175
+ if (mergeExtraArrayDefaults === void 0) {
1176
+ mergeExtraArrayDefaults = false;
1177
+ }
1160
1178
  if (Array.isArray(formData)) {
1161
1179
  var defaultsArray = Array.isArray(defaults) ? defaults : [];
1162
1180
  var mapped = formData.map(function (value, idx) {
1163
1181
  if (defaultsArray[idx]) {
1164
- return mergeDefaultsWithFormData(defaultsArray[idx], value);
1182
+ return mergeDefaultsWithFormData(defaultsArray[idx], value, mergeExtraArrayDefaults);
1165
1183
  }
1166
1184
  return value;
1167
1185
  });
1186
+ // Merge any extra defaults when mergeExtraArrayDefaults is true
1187
+ if (mergeExtraArrayDefaults && mapped.length < defaultsArray.length) {
1188
+ mapped.push.apply(mapped, defaultsArray.slice(mapped.length));
1189
+ }
1168
1190
  return mapped;
1169
1191
  }
1170
1192
  if (isObject(formData)) {
1171
1193
  var acc = Object.assign({}, defaults); // Prevent mutation of source object.
1172
1194
  return Object.keys(formData).reduce(function (acc, key) {
1173
- acc[key] = mergeDefaultsWithFormData(defaults ? get(defaults, key) : {}, get(formData, key));
1195
+ acc[key] = mergeDefaultsWithFormData(defaults ? get(defaults, key) : {}, get(formData, key), mergeExtraArrayDefaults);
1174
1196
  return acc;
1175
1197
  }, acc);
1176
1198
  }
@@ -1261,6 +1283,8 @@ function isMultiSelect(validator, schema, rootSchema) {
1261
1283
  return isSelect(validator, schema.items, rootSchema);
1262
1284
  }
1263
1285
 
1286
+ var _excluded$1 = ["oneOf"],
1287
+ _excluded2 = ["anyOf"];
1264
1288
  /** Enum that indicates how `schema.additionalItems` should be handled by the `getInnerSchemaForArrayItem()` function.
1265
1289
  */
1266
1290
  var AdditionalItemsHandling;
@@ -1339,10 +1363,13 @@ function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValu
1339
1363
  obj[key] = computedDefault;
1340
1364
  } else if (emptyObjectFields !== 'skipDefaults') {
1341
1365
  if (isObject(computedDefault)) {
1366
+ // If isParentRequired is undefined, then we are at the root level of the schema so defer to the requiredness of
1367
+ // the field key itself in the `requiredField` list
1368
+ var isSelfOrParentRequired = isParentRequired === undefined ? requiredFields.includes(key) : isParentRequired;
1342
1369
  // Store computedDefault if it's a non-empty object(e.g. not {}) and satisfies certain conditions
1343
1370
  // Condition 1: If computedDefault is not empty or if the key is a required field
1344
1371
  // Condition 2: If the parent object is required or emptyObjectFields is not 'populateRequiredDefaults'
1345
- if ((!isEmpty(computedDefault) || requiredFields.includes(key)) && (isParentRequired || emptyObjectFields !== 'populateRequiredDefaults')) {
1372
+ if ((!isEmpty(computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== 'populateRequiredDefaults')) {
1346
1373
  obj[key] = computedDefault;
1347
1374
  }
1348
1375
  } else if (
@@ -1383,8 +1410,7 @@ function computeDefaults(validator, rawSchema, _temp) {
1383
1410
  _recurseList = _ref$_recurseList === void 0 ? [] : _ref$_recurseList,
1384
1411
  _ref$experimental_def = _ref.experimental_defaultFormStateBehavior,
1385
1412
  experimental_defaultFormStateBehavior = _ref$experimental_def === void 0 ? undefined : _ref$experimental_def,
1386
- _ref$required = _ref.required,
1387
- required = _ref$required === void 0 ? false : _ref$required;
1413
+ required = _ref.required;
1388
1414
  var formData = isObject(rawFormData) ? rawFormData : {};
1389
1415
  var schema = isObject(rawSchema) ? rawSchema : {};
1390
1416
  // Compute the defaults recursively: give highest priority to deepest nodes.
@@ -1416,21 +1442,28 @@ function computeDefaults(validator, rawSchema, _temp) {
1416
1442
  _recurseList: _recurseList,
1417
1443
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1418
1444
  parentDefaults: Array.isArray(parentDefaults) ? parentDefaults[idx] : undefined,
1419
- rawFormData: formData
1445
+ rawFormData: formData,
1446
+ required: required
1420
1447
  });
1421
1448
  });
1422
1449
  } else if (ONE_OF_KEY in schema) {
1423
- if (schema.oneOf.length === 0) {
1450
+ var oneOf = schema.oneOf,
1451
+ remaining = _objectWithoutPropertiesLoose(schema, _excluded$1);
1452
+ if (oneOf.length === 0) {
1424
1453
  return undefined;
1425
1454
  }
1426
1455
  var discriminator = getDiscriminatorFieldFromSchema(schema);
1427
- schemaToCompute = schema.oneOf[getClosestMatchingOption(validator, rootSchema, isEmpty(formData) ? undefined : formData, schema.oneOf, 0, discriminator)];
1456
+ schemaToCompute = oneOf[getClosestMatchingOption(validator, rootSchema, isEmpty(formData) ? undefined : formData, oneOf, 0, discriminator)];
1457
+ schemaToCompute = _extends({}, remaining, schemaToCompute);
1428
1458
  } else if (ANY_OF_KEY in schema) {
1429
- if (schema.anyOf.length === 0) {
1459
+ var anyOf = schema.anyOf,
1460
+ _remaining = _objectWithoutPropertiesLoose(schema, _excluded2);
1461
+ if (anyOf.length === 0) {
1430
1462
  return undefined;
1431
1463
  }
1432
1464
  var _discriminator = getDiscriminatorFieldFromSchema(schema);
1433
- schemaToCompute = schema.anyOf[getClosestMatchingOption(validator, rootSchema, isEmpty(formData) ? undefined : formData, schema.anyOf, 0, _discriminator)];
1465
+ schemaToCompute = anyOf[getClosestMatchingOption(validator, rootSchema, isEmpty(formData) ? undefined : formData, anyOf, 0, _discriminator)];
1466
+ schemaToCompute = _extends({}, _remaining, schemaToCompute);
1434
1467
  }
1435
1468
  if (schemaToCompute) {
1436
1469
  return computeDefaults(validator, schemaToCompute, {
@@ -1439,7 +1472,8 @@ function computeDefaults(validator, rawSchema, _temp) {
1439
1472
  _recurseList: updatedRecurseList,
1440
1473
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1441
1474
  parentDefaults: defaults,
1442
- rawFormData: formData
1475
+ rawFormData: formData,
1476
+ required: required
1443
1477
  });
1444
1478
  }
1445
1479
  // No defaults defined for this node, fallback to generic typed ones.
@@ -1506,6 +1540,7 @@ function computeDefaults(validator, rawSchema, _temp) {
1506
1540
  }
1507
1541
  case 'array':
1508
1542
  {
1543
+ var _experimental_default3;
1509
1544
  // Inject defaults into existing array defaults
1510
1545
  if (Array.isArray(defaults)) {
1511
1546
  defaults = defaults.map(function (item, idx) {
@@ -1514,7 +1549,8 @@ function computeDefaults(validator, rawSchema, _temp) {
1514
1549
  rootSchema: rootSchema,
1515
1550
  _recurseList: _recurseList,
1516
1551
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1517
- parentDefaults: item
1552
+ parentDefaults: item,
1553
+ required: required
1518
1554
  });
1519
1555
  });
1520
1556
  }
@@ -1527,11 +1563,12 @@ function computeDefaults(validator, rawSchema, _temp) {
1527
1563
  _recurseList: _recurseList,
1528
1564
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1529
1565
  rawFormData: item,
1530
- parentDefaults: get(defaults, [idx])
1566
+ parentDefaults: get(defaults, [idx]),
1567
+ required: required
1531
1568
  });
1532
1569
  });
1533
1570
  }
1534
- var ignoreMinItemsFlagSet = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.arrayMinItems) === 'requiredOnly';
1571
+ 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';
1535
1572
  if (ignoreMinItemsFlagSet && !required) {
1536
1573
  // If no form data exists or defaults are set leave the field empty/non-existent, otherwise
1537
1574
  // return form data/defaults
@@ -1549,7 +1586,8 @@ function computeDefaults(validator, rawSchema, _temp) {
1549
1586
  parentDefaults: fillerDefault,
1550
1587
  rootSchema: rootSchema,
1551
1588
  _recurseList: _recurseList,
1552
- experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior
1589
+ experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1590
+ required: required
1553
1591
  }));
1554
1592
  // then fill up the rest with either the item default or empty, up to minItems
1555
1593
  return defaultEntries.concat(fillerEntries);
@@ -1588,11 +1626,13 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
1588
1626
  // No form data? Use schema defaults.
1589
1627
  return defaults;
1590
1628
  }
1629
+ var _ref2 = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.arrayMinItems) || {},
1630
+ mergeExtraDefaults = _ref2.mergeExtraDefaults;
1591
1631
  if (isObject(formData)) {
1592
- return mergeDefaultsWithFormData(defaults, formData);
1632
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1593
1633
  }
1594
1634
  if (Array.isArray(formData)) {
1595
- return mergeDefaultsWithFormData(defaults, formData);
1635
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1596
1636
  }
1597
1637
  return formData;
1598
1638
  }