@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 +35 -6
- package/dist/utils.cjs.development.js +83 -43
- package/dist/utils.cjs.development.js.map +1 -1
- package/dist/utils.cjs.production.min.js +1 -1
- package/dist/utils.cjs.production.min.js.map +1 -1
- package/dist/utils.esm.js +83 -43
- package/dist/utils.esm.js.map +1 -1
- package/dist/utils.umd.development.js +83 -43
- package/dist/utils.umd.development.js.map +1 -1
- package/dist/utils.umd.production.min.js +1 -1
- package/dist/utils.umd.production.min.js.map +1 -1
- package/package.json +9 -9
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
|
|
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
|
-
|
|
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$
|
|
553
|
-
_excluded2 = ["$ref"],
|
|
552
|
+
var _excluded$2 = ["if", "then", "else"],
|
|
553
|
+
_excluded2$1 = ["$ref"],
|
|
554
554
|
_excluded3 = ["allOf"],
|
|
555
|
-
_excluded4 = ["
|
|
556
|
-
_excluded5 = ["
|
|
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$
|
|
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
|
|
782
|
+
if (ALL_OF_KEY in resolvedSchema) {
|
|
782
783
|
try {
|
|
783
|
-
resolvedSchema = mergeAllOf__default["default"](
|
|
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
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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 =
|
|
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"](
|
|
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 =
|
|
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)) && (
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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
|
}
|