@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/index.d.ts CHANGED
@@ -92,12 +92,39 @@ type RJSFSchema = StrictRJSFSchema & GenericObjectType;
92
92
  /** Alias GenericObjectType as FormContextType to allow us to remap this at some future date
93
93
  */
94
94
  type FormContextType = GenericObjectType;
95
- /** Experimental features to specify different form state behavior. Currently, this affects the
95
+ /** Experimental feature that specifies the Array `minItems` default form state behavior
96
+ */
97
+ type Experimental_ArrayMinItems = {
98
+ /** Optional enumerated flag controlling how array minItems are populated, defaulting to `all`:
99
+ * - `all`: Legacy behavior, populate minItems entries with default values initially and include an empty array when
100
+ * no values have been defined.
101
+ * - `requiredOnly`: Ignore `minItems` on a field when calculating defaults unless the field is required.
102
+ */
103
+ populate?: 'all' | 'requiredOnly';
104
+ /** When `formData` is provided and does not contain `minItems` worth of data, this flag (`false` by default) controls
105
+ * whether the extra data provided by the defaults is appended onto the existing `formData` items to ensure the
106
+ * `minItems` condition is met. When false (legacy behavior), only the `formData` provided is merged into the default
107
+ * form state, even if there are fewer than the `minItems`. When true, the defaults are appended onto the end of the
108
+ * `formData` until the `minItems` condition is met.
109
+ */
110
+ mergeExtraDefaults?: boolean;
111
+ };
112
+ /** Experimental features to specify different default form state behaviors. Currently, this affects the
96
113
  * handling of optional array fields where `minItems` is set and handling of setting defaults based on the
97
- * value of `emptyObjectFields`
114
+ * value of `emptyObjectFields`.
98
115
  */
99
116
  type Experimental_DefaultFormStateBehavior = {
100
- arrayMinItems?: 'populate' | 'requiredOnly';
117
+ /** Optional object, that controls how the default form state for arrays with `minItems` is handled. When not provided
118
+ * it defaults to `{ populate: 'all' }`.
119
+ */
120
+ arrayMinItems?: Experimental_ArrayMinItems;
121
+ /** Optional enumerated flag controlling how empty object fields are populated, defaulting to `populateAllDefaults`:
122
+ * - `populateAllDefaults`: Legacy behavior - set default when there is a primitive value, an non-empty object field,
123
+ * or the field itself is required |
124
+ * - `populateRequiredDefaults`: Only sets default when a value is an object and its parent field is required, or it
125
+ * is a primitive value and it is required |
126
+ * - `skipDefaults`: Does not set defaults |
127
+ */
101
128
  emptyObjectFields?: 'populateAllDefaults' | 'populateRequiredDefaults' | 'skipDefaults';
102
129
  };
103
130
  /** The interface representing a Date object that contains an optional time */
@@ -1439,15 +1466,17 @@ declare function localToUTC(dateString: string): string | undefined;
1439
1466
  * - objects are deeply merged
1440
1467
  * - arrays are merged in such a way that:
1441
1468
  * - when the array is set in form data, only array entries set in form data
1442
- * are deeply merged; additional entries from the defaults are ignored
1469
+ * are deeply merged; additional entries from the defaults are ignored unless `mergeExtraArrayDefaults` is true, in
1470
+ * which case the extras are appended onto the end of the form data
1443
1471
  * - when the array is not set in form data, the default is copied over
1444
1472
  * - scalars are overwritten/set by form data
1445
1473
  *
1446
1474
  * @param [defaults] - The defaults to merge
1447
1475
  * @param [formData] - The form data into which the defaults will be merged
1476
+ * @param [mergeExtraArrayDefaults=false] - If true, any additional default array entries are appended onto the formData
1448
1477
  * @returns - The resulting merged form data with defaults
1449
1478
  */
1450
- declare function mergeDefaultsWithFormData<T = any>(defaults?: T, formData?: T): T | undefined;
1479
+ declare function mergeDefaultsWithFormData<T = any>(defaults?: T, formData?: T, mergeExtraArrayDefaults?: boolean): T | undefined;
1451
1480
 
1452
1481
  /** Recursively merge deeply nested objects.
1453
1482
  *
@@ -1879,4 +1908,4 @@ declare function toIdSchema<T = any, S extends StrictRJSFSchema = RJSFSchema, F
1879
1908
  */
1880
1909
  declare function toPathSchema<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(validator: ValidatorType<T, S, F>, schema: S, name?: string, rootSchema?: S, formData?: T): PathSchema<T>;
1881
1910
 
1882
- export { ADDITIONAL_PROPERTIES_KEY, ADDITIONAL_PROPERTY_FLAG, ALL_OF_KEY, ANY_OF_KEY, ArrayFieldDescriptionProps, ArrayFieldTemplateItemType, ArrayFieldTemplateProps, ArrayFieldTitleProps, BaseInputTemplateProps, CONST_KEY, CustomValidator, DEFAULT_KEY, DEFINITIONS_KEY, DEPENDENCIES_KEY, DateObject, DescriptionFieldProps, ENUM_KEY, ERRORS_KEY, EnumOptionsType, ErrorListProps, ErrorSchema, ErrorSchemaBuilder, ErrorTransformer, Experimental_DefaultFormStateBehavior, Field, FieldError, FieldErrorProps, FieldErrors, FieldHelpProps, FieldId, FieldPath, FieldProps, FieldTemplateProps, FieldValidation, FormContextType, FormValidation, GenericObjectType, GlobalUISchemaOptions, ID_KEY, IF_KEY, ITEMS_KEY, IconButtonProps, IdSchema, InputPropsType, JUNK_OPTION_ID, NAME_KEY, ONE_OF_KEY, ObjectFieldTemplatePropertyType, ObjectFieldTemplateProps, PROPERTIES_KEY, PathSchema, REF_KEY, REQUIRED_KEY, RJSFSchema, RJSFValidationError, RJSF_ADDITONAL_PROPERTIES_FLAG, ROOT_SCHEMA_PREFIX, RangeSpecType, Registry, RegistryFieldsType, RegistryWidgetsType, SUBMIT_BTN_OPTIONS_KEY, SchemaMap, SchemaUtilsType, StrictRJSFSchema, SubmitButtonProps, TemplatesType, TitleFieldProps, TranslatableString, UIOptionsType, UISchemaSubmitButtonOptions, UI_FIELD_KEY, UI_GLOBAL_OPTIONS_KEY, UI_OPTIONS_KEY, UI_WIDGET_KEY, UiSchema, UnsupportedFieldProps, ValidationData, ValidatorType, Widget, WidgetProps, WrapIfAdditionalTemplateProps, allowAdditionalItems, ariaDescribedByIds, asNumber, canExpand, createErrorHandler, createSchemaUtils, dataURItoBlob, deepEquals, descriptionId, englishStringTranslator, enumOptionsDeselectValue, enumOptionsIndexForValue, enumOptionsIsSelected, enumOptionsSelectValue, enumOptionsValueForIndex, errorId, examplesId, findSchemaDefinition, getClosestMatchingOption, getDefaultFormState, getDiscriminatorFieldFromSchema, getDisplayLabel, getFirstMatchingOption, getInputProps, getMatchingOption, getSchemaType, getSubmitButtonOptions, getTemplate, getUiOptions, getWidget, guessType, hasWidget, hashForSchema, helpId, isConstant, isCustomWidget, isFilesArray, isFixedItems, isMultiSelect, isObject, isSelect, labelValue, localToUTC, mergeDefaultsWithFormData, mergeObjects, mergeSchemas, mergeValidationData, optionId, optionsList, orderProperties, pad, parseDateString, rangeSpec, replaceStringParameters, retrieveSchema, sanitizeDataForNewSchema, schemaParser, schemaRequiresTrueValue, shouldRender, titleId, toConstant, toDateString, toErrorList, toErrorSchema, toIdSchema, toPathSchema, unwrapErrorHandler, utcToLocal, validationDataMerge, withIdRefPrefix };
1911
+ export { ADDITIONAL_PROPERTIES_KEY, ADDITIONAL_PROPERTY_FLAG, ALL_OF_KEY, ANY_OF_KEY, ArrayFieldDescriptionProps, ArrayFieldTemplateItemType, ArrayFieldTemplateProps, ArrayFieldTitleProps, BaseInputTemplateProps, CONST_KEY, CustomValidator, DEFAULT_KEY, DEFINITIONS_KEY, DEPENDENCIES_KEY, DateObject, DescriptionFieldProps, ENUM_KEY, ERRORS_KEY, EnumOptionsType, ErrorListProps, ErrorSchema, ErrorSchemaBuilder, ErrorTransformer, Experimental_ArrayMinItems, Experimental_DefaultFormStateBehavior, Field, FieldError, FieldErrorProps, FieldErrors, FieldHelpProps, FieldId, FieldPath, FieldProps, FieldTemplateProps, FieldValidation, FormContextType, FormValidation, GenericObjectType, GlobalUISchemaOptions, ID_KEY, IF_KEY, ITEMS_KEY, IconButtonProps, IdSchema, InputPropsType, JUNK_OPTION_ID, NAME_KEY, ONE_OF_KEY, ObjectFieldTemplatePropertyType, ObjectFieldTemplateProps, PROPERTIES_KEY, PathSchema, REF_KEY, REQUIRED_KEY, RJSFSchema, RJSFValidationError, RJSF_ADDITONAL_PROPERTIES_FLAG, ROOT_SCHEMA_PREFIX, RangeSpecType, Registry, RegistryFieldsType, RegistryWidgetsType, SUBMIT_BTN_OPTIONS_KEY, SchemaMap, SchemaUtilsType, StrictRJSFSchema, SubmitButtonProps, TemplatesType, TitleFieldProps, TranslatableString, UIOptionsType, UISchemaSubmitButtonOptions, UI_FIELD_KEY, UI_GLOBAL_OPTIONS_KEY, UI_OPTIONS_KEY, UI_WIDGET_KEY, UiSchema, UnsupportedFieldProps, ValidationData, ValidatorType, Widget, WidgetProps, WrapIfAdditionalTemplateProps, allowAdditionalItems, ariaDescribedByIds, asNumber, canExpand, createErrorHandler, createSchemaUtils, dataURItoBlob, deepEquals, descriptionId, englishStringTranslator, enumOptionsDeselectValue, enumOptionsIndexForValue, enumOptionsIsSelected, enumOptionsSelectValue, enumOptionsValueForIndex, errorId, examplesId, findSchemaDefinition, getClosestMatchingOption, getDefaultFormState, getDiscriminatorFieldFromSchema, getDisplayLabel, getFirstMatchingOption, getInputProps, getMatchingOption, getSchemaType, getSubmitButtonOptions, getTemplate, getUiOptions, getWidget, guessType, hasWidget, hashForSchema, helpId, isConstant, isCustomWidget, isFilesArray, isFixedItems, isMultiSelect, isObject, isSelect, labelValue, localToUTC, mergeDefaultsWithFormData, mergeObjects, mergeSchemas, mergeValidationData, optionId, optionsList, orderProperties, pad, parseDateString, rangeSpec, replaceStringParameters, retrieveSchema, sanitizeDataForNewSchema, schemaParser, schemaRequiresTrueValue, shouldRender, titleId, toConstant, toDateString, toErrorList, toErrorSchema, toIdSchema, toPathSchema, unwrapErrorHandler, utcToLocal, validationDataMerge, withIdRefPrefix };
@@ -549,11 +549,12 @@ function mergeSchemas(obj1, obj2) {
549
549
  }, acc);
550
550
  }
551
551
 
552
- var _excluded$1 = ["if", "then", "else"],
553
- _excluded2 = ["$ref"],
552
+ var _excluded$2 = ["if", "then", "else"],
553
+ _excluded2$1 = ["$ref"],
554
554
  _excluded3 = ["allOf"],
555
- _excluded4 = ["dependencies"],
556
- _excluded5 = ["oneOf"];
555
+ _excluded4 = ["oneOf", "anyOf"],
556
+ _excluded5 = ["dependencies"],
557
+ _excluded6 = ["oneOf"];
557
558
  /** Retrieves an expanded schema that has had all of its conditions, additional properties, references and dependencies
558
559
  * resolved and merged into the `schema` given a `validator`, `rootSchema` and `rawFormData` that is used to do the
559
560
  * potentially recursive resolution.
@@ -586,7 +587,7 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, form
586
587
  var expression = schema["if"],
587
588
  then = schema.then,
588
589
  otherwise = schema["else"],
589
- resolvedSchemaLessConditional = _objectWithoutPropertiesLoose(schema, _excluded$1);
590
+ resolvedSchemaLessConditional = _objectWithoutPropertiesLoose(schema, _excluded$2);
590
591
  var conditionValue = validator.isValid(expression, formData || {}, rootSchema);
591
592
  var resolvedSchemas = [resolvedSchemaLessConditional];
592
593
  var schemas = [];
@@ -696,7 +697,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, formDat
696
697
  function resolveReference(validator, schema, rootSchema, expandAllBranches, formData) {
697
698
  // Drop the $ref property of the source schema.
698
699
  var $ref = schema.$ref,
699
- localSchema = _objectWithoutPropertiesLoose(schema, _excluded2);
700
+ localSchema = _objectWithoutPropertiesLoose(schema, _excluded2$1);
700
701
  // Retrieve the referenced schema definition.
701
702
  var refSchema = findSchemaDefinition($ref, rootSchema);
702
703
  // Update referenced schema definition with local schema properties.
@@ -778,9 +779,9 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
778
779
  if (IF_KEY in resolvedSchema) {
779
780
  return resolveCondition(validator, resolvedSchema, rootSchema, expandAllBranches, rawFormData);
780
781
  }
781
- if (ALL_OF_KEY in schema) {
782
+ if (ALL_OF_KEY in resolvedSchema) {
782
783
  try {
783
- resolvedSchema = mergeAllOf__default["default"](s, {
784
+ resolvedSchema = mergeAllOf__default["default"](resolvedSchema, {
784
785
  deep: false
785
786
  });
786
787
  } catch (e) {
@@ -815,10 +816,14 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
815
816
  */
816
817
  function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranches, rawFormData) {
817
818
  var anyOrOneOf;
818
- if (Array.isArray(schema.oneOf)) {
819
- anyOrOneOf = schema.oneOf;
820
- } else if (Array.isArray(schema.anyOf)) {
821
- anyOrOneOf = schema.anyOf;
819
+ var _schema = schema,
820
+ oneOf = _schema.oneOf,
821
+ anyOf = _schema.anyOf,
822
+ remaining = _objectWithoutPropertiesLoose(_schema, _excluded4);
823
+ if (Array.isArray(oneOf)) {
824
+ anyOrOneOf = oneOf;
825
+ } else if (Array.isArray(anyOf)) {
826
+ anyOrOneOf = anyOf;
822
827
  }
823
828
  if (anyOrOneOf) {
824
829
  // Ensure that during expand all branches we pass an object rather than undefined so that all options are interrogated
@@ -834,9 +839,11 @@ function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranch
834
839
  // Call this to trigger the set of isValid() calls that the schema parser will need
835
840
  var option = getFirstMatchingOption(validator, formData, anyOrOneOf, rootSchema, discriminator);
836
841
  if (expandAllBranches) {
837
- return anyOrOneOf;
842
+ return anyOrOneOf.map(function (item) {
843
+ return _extends({}, remaining, item);
844
+ });
838
845
  }
839
- schema = anyOrOneOf[option];
846
+ schema = _extends({}, remaining, anyOrOneOf[option]);
840
847
  }
841
848
  return [schema];
842
849
  }
@@ -854,7 +861,7 @@ function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranch
854
861
  function resolveDependencies(validator, schema, rootSchema, expandAllBranches, formData) {
855
862
  // Drop the dependencies from the source schema.
856
863
  var dependencies = schema.dependencies,
857
- remainingSchema = _objectWithoutPropertiesLoose(schema, _excluded4);
864
+ remainingSchema = _objectWithoutPropertiesLoose(schema, _excluded5);
858
865
  var resolvedSchemas = resolveAnyOrOneOfSchemas(validator, remainingSchema, rootSchema, expandAllBranches, formData);
859
866
  return resolvedSchemas.flatMap(function (resolvedSchema) {
860
867
  return processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, formData);
@@ -937,7 +944,7 @@ function withDependentSchema(validator, schema, rootSchema, dependencyKey, depen
937
944
  var dependentSchemas = retrieveSchemaInternal(validator, dependencyValue, rootSchema, formData, expandAllBranches);
938
945
  return dependentSchemas.flatMap(function (dependent) {
939
946
  var oneOf = dependent.oneOf,
940
- dependentSchema = _objectWithoutPropertiesLoose(dependent, _excluded5);
947
+ dependentSchema = _objectWithoutPropertiesLoose(dependent, _excluded6);
941
948
  schema = mergeSchemas(schema, dependentSchema);
942
949
  // Since it does not contain oneOf, we return the original schema.
943
950
  if (oneOf === undefined) {
@@ -1052,8 +1059,10 @@ function calculateIndexScore(validator, rootSchema, schema, formData) {
1052
1059
  var newSchema = retrieveSchema(validator, value, rootSchema, formValue);
1053
1060
  return score + calculateIndexScore(validator, rootSchema, newSchema, formValue || {});
1054
1061
  }
1055
- if (has__default["default"](value, ONE_OF_KEY) && formValue) {
1056
- return score + getClosestMatchingOption(validator, rootSchema, formValue, get__default["default"](value, ONE_OF_KEY));
1062
+ if ((has__default["default"](value, ONE_OF_KEY) || has__default["default"](value, ANY_OF_KEY)) && formValue) {
1063
+ var _key = has__default["default"](value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
1064
+ var discriminator = getDiscriminatorFieldFromSchema(value);
1065
+ return score + getClosestMatchingOption(validator, rootSchema, formValue, get__default["default"](value, _key), -1, discriminator);
1057
1066
  }
1058
1067
  if (value.type === 'object') {
1059
1068
  return score + calculateIndexScore(validator, rootSchema, value, formValue || {});
@@ -1107,8 +1116,15 @@ function getClosestMatchingOption(validator, rootSchema, formData, options, sele
1107
1116
  if (selectedOption === void 0) {
1108
1117
  selectedOption = -1;
1109
1118
  }
1119
+ // First resolve any refs in the options
1120
+ var resolvedOptions = options.map(function (option) {
1121
+ if (has__default["default"](option, REF_KEY)) {
1122
+ return retrieveSchema(validator, option, rootSchema, formData);
1123
+ }
1124
+ return option;
1125
+ });
1110
1126
  // Reduce the array of options down to a list of the indexes that are considered matching options
1111
- var allValidIndexes = options.reduce(function (validList, option, index) {
1127
+ var allValidIndexes = resolvedOptions.reduce(function (validList, option, index) {
1112
1128
  var testOptions = [JUNK_OPTION, option];
1113
1129
  var match = getFirstMatchingOption(validator, formData, testOptions, rootSchema, discriminatorField);
1114
1130
  // The match is the real option, so add its index to list of valid indexes
@@ -1123,7 +1139,7 @@ function getClosestMatchingOption(validator, rootSchema, formData, options, sele
1123
1139
  }
1124
1140
  if (!allValidIndexes.length) {
1125
1141
  // No indexes were valid, so we'll score all the options, add all the indexes
1126
- times__default["default"](options.length, function (i) {
1142
+ times__default["default"](resolvedOptions.length, function (i) {
1127
1143
  return allValidIndexes.push(i);
1128
1144
  });
1129
1145
  }
@@ -1131,10 +1147,7 @@ function getClosestMatchingOption(validator, rootSchema, formData, options, sele
1131
1147
  // Score all the options in the list of valid indexes and return the index with the best score
1132
1148
  var _allValidIndexes$redu = allValidIndexes.reduce(function (scoreData, index) {
1133
1149
  var bestScore = scoreData.bestScore;
1134
- var option = options[index];
1135
- if (has__default["default"](option, REF_KEY)) {
1136
- option = retrieveSchema(validator, option, rootSchema, formData);
1137
- }
1150
+ var option = resolvedOptions[index];
1138
1151
  var score = calculateIndexScore(validator, rootSchema, option, formData);
1139
1152
  scoreCount.add(score);
1140
1153
  if (score > bestScore) {
@@ -1174,29 +1187,38 @@ function isFixedItems(schema) {
1174
1187
  * - objects are deeply merged
1175
1188
  * - arrays are merged in such a way that:
1176
1189
  * - when the array is set in form data, only array entries set in form data
1177
- * are deeply merged; additional entries from the defaults are ignored
1190
+ * are deeply merged; additional entries from the defaults are ignored unless `mergeExtraArrayDefaults` is true, in
1191
+ * which case the extras are appended onto the end of the form data
1178
1192
  * - when the array is not set in form data, the default is copied over
1179
1193
  * - scalars are overwritten/set by form data
1180
1194
  *
1181
1195
  * @param [defaults] - The defaults to merge
1182
1196
  * @param [formData] - The form data into which the defaults will be merged
1197
+ * @param [mergeExtraArrayDefaults=false] - If true, any additional default array entries are appended onto the formData
1183
1198
  * @returns - The resulting merged form data with defaults
1184
1199
  */
1185
- function mergeDefaultsWithFormData(defaults, formData) {
1200
+ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults) {
1201
+ if (mergeExtraArrayDefaults === void 0) {
1202
+ mergeExtraArrayDefaults = false;
1203
+ }
1186
1204
  if (Array.isArray(formData)) {
1187
1205
  var defaultsArray = Array.isArray(defaults) ? defaults : [];
1188
1206
  var mapped = formData.map(function (value, idx) {
1189
1207
  if (defaultsArray[idx]) {
1190
- return mergeDefaultsWithFormData(defaultsArray[idx], value);
1208
+ return mergeDefaultsWithFormData(defaultsArray[idx], value, mergeExtraArrayDefaults);
1191
1209
  }
1192
1210
  return value;
1193
1211
  });
1212
+ // Merge any extra defaults when mergeExtraArrayDefaults is true
1213
+ if (mergeExtraArrayDefaults && mapped.length < defaultsArray.length) {
1214
+ mapped.push.apply(mapped, defaultsArray.slice(mapped.length));
1215
+ }
1194
1216
  return mapped;
1195
1217
  }
1196
1218
  if (isObject(formData)) {
1197
1219
  var acc = Object.assign({}, defaults); // Prevent mutation of source object.
1198
1220
  return Object.keys(formData).reduce(function (acc, key) {
1199
- acc[key] = mergeDefaultsWithFormData(defaults ? get__default["default"](defaults, key) : {}, get__default["default"](formData, key));
1221
+ acc[key] = mergeDefaultsWithFormData(defaults ? get__default["default"](defaults, key) : {}, get__default["default"](formData, key), mergeExtraArrayDefaults);
1200
1222
  return acc;
1201
1223
  }, acc);
1202
1224
  }
@@ -1287,6 +1309,8 @@ function isMultiSelect(validator, schema, rootSchema) {
1287
1309
  return isSelect(validator, schema.items, rootSchema);
1288
1310
  }
1289
1311
 
1312
+ var _excluded$1 = ["oneOf"],
1313
+ _excluded2 = ["anyOf"];
1290
1314
  /** Enum that indicates how `schema.additionalItems` should be handled by the `getInnerSchemaForArrayItem()` function.
1291
1315
  */
1292
1316
  var AdditionalItemsHandling;
@@ -1365,10 +1389,13 @@ function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValu
1365
1389
  obj[key] = computedDefault;
1366
1390
  } else if (emptyObjectFields !== 'skipDefaults') {
1367
1391
  if (isObject(computedDefault)) {
1392
+ // If isParentRequired is undefined, then we are at the root level of the schema so defer to the requiredness of
1393
+ // the field key itself in the `requiredField` list
1394
+ var isSelfOrParentRequired = isParentRequired === undefined ? requiredFields.includes(key) : isParentRequired;
1368
1395
  // Store computedDefault if it's a non-empty object(e.g. not {}) and satisfies certain conditions
1369
1396
  // Condition 1: If computedDefault is not empty or if the key is a required field
1370
1397
  // Condition 2: If the parent object is required or emptyObjectFields is not 'populateRequiredDefaults'
1371
- if ((!isEmpty__default["default"](computedDefault) || requiredFields.includes(key)) && (isParentRequired || emptyObjectFields !== 'populateRequiredDefaults')) {
1398
+ if ((!isEmpty__default["default"](computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== 'populateRequiredDefaults')) {
1372
1399
  obj[key] = computedDefault;
1373
1400
  }
1374
1401
  } else if (
@@ -1409,8 +1436,7 @@ function computeDefaults(validator, rawSchema, _temp) {
1409
1436
  _recurseList = _ref$_recurseList === void 0 ? [] : _ref$_recurseList,
1410
1437
  _ref$experimental_def = _ref.experimental_defaultFormStateBehavior,
1411
1438
  experimental_defaultFormStateBehavior = _ref$experimental_def === void 0 ? undefined : _ref$experimental_def,
1412
- _ref$required = _ref.required,
1413
- required = _ref$required === void 0 ? false : _ref$required;
1439
+ required = _ref.required;
1414
1440
  var formData = isObject(rawFormData) ? rawFormData : {};
1415
1441
  var schema = isObject(rawSchema) ? rawSchema : {};
1416
1442
  // Compute the defaults recursively: give highest priority to deepest nodes.
@@ -1442,21 +1468,28 @@ function computeDefaults(validator, rawSchema, _temp) {
1442
1468
  _recurseList: _recurseList,
1443
1469
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1444
1470
  parentDefaults: Array.isArray(parentDefaults) ? parentDefaults[idx] : undefined,
1445
- rawFormData: formData
1471
+ rawFormData: formData,
1472
+ required: required
1446
1473
  });
1447
1474
  });
1448
1475
  } else if (ONE_OF_KEY in schema) {
1449
- if (schema.oneOf.length === 0) {
1476
+ var oneOf = schema.oneOf,
1477
+ remaining = _objectWithoutPropertiesLoose(schema, _excluded$1);
1478
+ if (oneOf.length === 0) {
1450
1479
  return undefined;
1451
1480
  }
1452
1481
  var discriminator = getDiscriminatorFieldFromSchema(schema);
1453
- schemaToCompute = schema.oneOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, schema.oneOf, 0, discriminator)];
1482
+ schemaToCompute = oneOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, oneOf, 0, discriminator)];
1483
+ schemaToCompute = _extends({}, remaining, schemaToCompute);
1454
1484
  } else if (ANY_OF_KEY in schema) {
1455
- if (schema.anyOf.length === 0) {
1485
+ var anyOf = schema.anyOf,
1486
+ _remaining = _objectWithoutPropertiesLoose(schema, _excluded2);
1487
+ if (anyOf.length === 0) {
1456
1488
  return undefined;
1457
1489
  }
1458
1490
  var _discriminator = getDiscriminatorFieldFromSchema(schema);
1459
- schemaToCompute = schema.anyOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, schema.anyOf, 0, _discriminator)];
1491
+ schemaToCompute = anyOf[getClosestMatchingOption(validator, rootSchema, isEmpty__default["default"](formData) ? undefined : formData, anyOf, 0, _discriminator)];
1492
+ schemaToCompute = _extends({}, _remaining, schemaToCompute);
1460
1493
  }
1461
1494
  if (schemaToCompute) {
1462
1495
  return computeDefaults(validator, schemaToCompute, {
@@ -1465,7 +1498,8 @@ function computeDefaults(validator, rawSchema, _temp) {
1465
1498
  _recurseList: updatedRecurseList,
1466
1499
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1467
1500
  parentDefaults: defaults,
1468
- rawFormData: formData
1501
+ rawFormData: formData,
1502
+ required: required
1469
1503
  });
1470
1504
  }
1471
1505
  // No defaults defined for this node, fallback to generic typed ones.
@@ -1532,6 +1566,7 @@ function computeDefaults(validator, rawSchema, _temp) {
1532
1566
  }
1533
1567
  case 'array':
1534
1568
  {
1569
+ var _experimental_default3;
1535
1570
  // Inject defaults into existing array defaults
1536
1571
  if (Array.isArray(defaults)) {
1537
1572
  defaults = defaults.map(function (item, idx) {
@@ -1540,7 +1575,8 @@ function computeDefaults(validator, rawSchema, _temp) {
1540
1575
  rootSchema: rootSchema,
1541
1576
  _recurseList: _recurseList,
1542
1577
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1543
- parentDefaults: item
1578
+ parentDefaults: item,
1579
+ required: required
1544
1580
  });
1545
1581
  });
1546
1582
  }
@@ -1553,11 +1589,12 @@ function computeDefaults(validator, rawSchema, _temp) {
1553
1589
  _recurseList: _recurseList,
1554
1590
  experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1555
1591
  rawFormData: item,
1556
- parentDefaults: get__default["default"](defaults, [idx])
1592
+ parentDefaults: get__default["default"](defaults, [idx]),
1593
+ required: required
1557
1594
  });
1558
1595
  });
1559
1596
  }
1560
- var ignoreMinItemsFlagSet = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.arrayMinItems) === 'requiredOnly';
1597
+ 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';
1561
1598
  if (ignoreMinItemsFlagSet && !required) {
1562
1599
  // If no form data exists or defaults are set leave the field empty/non-existent, otherwise
1563
1600
  // return form data/defaults
@@ -1575,7 +1612,8 @@ function computeDefaults(validator, rawSchema, _temp) {
1575
1612
  parentDefaults: fillerDefault,
1576
1613
  rootSchema: rootSchema,
1577
1614
  _recurseList: _recurseList,
1578
- experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior
1615
+ experimental_defaultFormStateBehavior: experimental_defaultFormStateBehavior,
1616
+ required: required
1579
1617
  }));
1580
1618
  // then fill up the rest with either the item default or empty, up to minItems
1581
1619
  return defaultEntries.concat(fillerEntries);
@@ -1614,11 +1652,13 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
1614
1652
  // No form data? Use schema defaults.
1615
1653
  return defaults;
1616
1654
  }
1655
+ var _ref2 = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.arrayMinItems) || {},
1656
+ mergeExtraDefaults = _ref2.mergeExtraDefaults;
1617
1657
  if (isObject(formData)) {
1618
- return mergeDefaultsWithFormData(defaults, formData);
1658
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1619
1659
  }
1620
1660
  if (Array.isArray(formData)) {
1621
- return mergeDefaultsWithFormData(defaults, formData);
1661
+ return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
1622
1662
  }
1623
1663
  return formData;
1624
1664
  }