@rjsf/utils 6.0.0-alpha.0 → 6.0.0-beta.10
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.js +1347 -642
- package/dist/index.js.map +4 -4
- package/dist/utils.esm.js +1324 -619
- package/dist/utils.esm.js.map +4 -4
- package/dist/utils.umd.js +1266 -590
- package/lib/ErrorSchemaBuilder.d.ts +8 -4
- package/lib/ErrorSchemaBuilder.js +10 -8
- package/lib/ErrorSchemaBuilder.js.map +1 -1
- package/lib/allowAdditionalItems.d.ts +1 -1
- package/lib/allowAdditionalItems.js +1 -1
- package/lib/allowAdditionalItems.js.map +1 -1
- package/lib/asNumber.js.map +1 -1
- package/lib/canExpand.d.ts +2 -2
- package/lib/canExpand.js +2 -2
- package/lib/canExpand.js.map +1 -1
- package/lib/constIsAjvDataReference.d.ts +9 -0
- package/lib/constIsAjvDataReference.js +15 -0
- package/lib/constIsAjvDataReference.js.map +1 -0
- package/lib/constants.d.ts +15 -3
- package/lib/constants.js +15 -3
- package/lib/constants.js.map +1 -1
- package/lib/createErrorHandler.d.ts +1 -1
- package/lib/createErrorHandler.js +2 -2
- package/lib/createErrorHandler.js.map +1 -1
- package/lib/createSchemaUtils.d.ts +3 -2
- package/lib/createSchemaUtils.js +56 -46
- package/lib/createSchemaUtils.js.map +1 -1
- package/lib/dataURItoBlob.js.map +1 -1
- package/lib/dateRangeOptions.d.ts +1 -1
- package/lib/dateRangeOptions.js +1 -1
- package/lib/dateRangeOptions.js.map +1 -1
- package/lib/deepEquals.js +1 -1
- package/lib/deepEquals.js.map +1 -1
- package/lib/englishStringTranslator.d.ts +1 -1
- package/lib/englishStringTranslator.js +1 -1
- package/lib/enumOptionsDeselectValue.d.ts +1 -1
- package/lib/enumOptionsDeselectValue.js +4 -4
- package/lib/enumOptionsDeselectValue.js.map +1 -1
- package/lib/enumOptionsIndexForValue.d.ts +1 -1
- package/lib/enumOptionsIndexForValue.js +1 -1
- package/lib/enumOptionsIndexForValue.js.map +1 -1
- package/lib/enumOptionsIsSelected.d.ts +1 -1
- package/lib/enumOptionsIsSelected.js +3 -3
- package/lib/enumOptionsIsSelected.js.map +1 -1
- package/lib/enumOptionsSelectValue.d.ts +1 -1
- package/lib/enumOptionsSelectValue.js +2 -2
- package/lib/enumOptionsSelectValue.js.map +1 -1
- package/lib/enumOptionsValueForIndex.d.ts +1 -1
- package/lib/enumOptionsValueForIndex.js.map +1 -1
- package/lib/enums.d.ts +2 -0
- package/lib/enums.js +2 -0
- package/lib/enums.js.map +1 -1
- package/lib/findSchemaDefinition.d.ts +5 -3
- package/lib/findSchemaDefinition.js +54 -11
- package/lib/findSchemaDefinition.js.map +1 -1
- package/lib/getChangedFields.d.ts +17 -0
- package/lib/getChangedFields.js +42 -0
- package/lib/getChangedFields.js.map +1 -0
- package/lib/getDateElementProps.d.ts +1 -1
- package/lib/getDateElementProps.js.map +1 -1
- package/lib/getDiscriminatorFieldFromSchema.d.ts +1 -1
- package/lib/getDiscriminatorFieldFromSchema.js +4 -3
- package/lib/getDiscriminatorFieldFromSchema.js.map +1 -1
- package/lib/getInputProps.d.ts +1 -1
- package/lib/getInputProps.js +4 -1
- package/lib/getInputProps.js.map +1 -1
- package/lib/getOptionMatchingSimpleDiscriminator.d.ts +1 -1
- package/lib/getOptionMatchingSimpleDiscriminator.js +2 -2
- package/lib/getOptionMatchingSimpleDiscriminator.js.map +1 -1
- package/lib/getSchemaType.d.ts +2 -1
- package/lib/getSchemaType.js +3 -2
- package/lib/getSchemaType.js.map +1 -1
- package/lib/getSubmitButtonOptions.d.ts +1 -1
- package/lib/getSubmitButtonOptions.js +2 -2
- package/lib/getSubmitButtonOptions.js.map +1 -1
- package/lib/getTemplate.d.ts +1 -1
- package/lib/getTemplate.js +9 -0
- package/lib/getTemplate.js.map +1 -1
- package/lib/getTestIds.d.ts +17 -0
- package/lib/getTestIds.js +34 -0
- package/lib/getTestIds.js.map +1 -0
- package/lib/getUiOptions.d.ts +1 -1
- package/lib/getUiOptions.js +2 -2
- package/lib/getUiOptions.js.map +1 -1
- package/lib/getWidget.d.ts +1 -1
- package/lib/getWidget.js +3 -3
- package/lib/getWidget.js.map +1 -1
- package/lib/guessType.d.ts +1 -1
- package/lib/guessType.js.map +1 -1
- package/lib/hasWidget.d.ts +1 -1
- package/lib/hasWidget.js +1 -1
- package/lib/hasWidget.js.map +1 -1
- package/lib/hashForSchema.d.ts +23 -1
- package/lib/hashForSchema.js +24 -6
- package/lib/hashForSchema.js.map +1 -1
- package/lib/idGenerators.d.ts +8 -1
- package/lib/idGenerators.js +11 -2
- package/lib/idGenerators.js.map +1 -1
- package/lib/index.d.ts +63 -60
- package/lib/index.js +63 -60
- package/lib/index.js.map +1 -1
- package/lib/isConstant.d.ts +1 -1
- package/lib/isConstant.js +1 -1
- package/lib/isCustomWidget.d.ts +1 -1
- package/lib/isCustomWidget.js +1 -1
- package/lib/isFixedItems.d.ts +1 -1
- package/lib/isFixedItems.js +1 -1
- package/lib/isObject.d.ts +2 -2
- package/lib/isObject.js +11 -4
- package/lib/isObject.js.map +1 -1
- package/lib/lookupFromFormContext.d.ts +11 -0
- package/lib/lookupFromFormContext.js +20 -0
- package/lib/lookupFromFormContext.js.map +1 -0
- package/lib/mergeDefaultsWithFormData.d.ts +8 -2
- package/lib/mergeDefaultsWithFormData.js +39 -10
- package/lib/mergeDefaultsWithFormData.js.map +1 -1
- package/lib/mergeObjects.d.ts +1 -1
- package/lib/mergeObjects.js +1 -1
- package/lib/mergeObjects.js.map +1 -1
- package/lib/mergeSchemas.d.ts +1 -1
- package/lib/mergeSchemas.js +4 -4
- package/lib/mergeSchemas.js.map +1 -1
- package/lib/optionsList.d.ts +9 -7
- package/lib/optionsList.js +30 -19
- package/lib/optionsList.js.map +1 -1
- package/lib/orderProperties.js.map +1 -1
- package/lib/pad.js.map +1 -1
- package/lib/parseDateString.d.ts +1 -1
- package/lib/parseDateString.js +1 -1
- package/lib/parseDateString.js.map +1 -1
- package/lib/parser/ParserValidator.d.ts +1 -1
- package/lib/parser/ParserValidator.js +6 -6
- package/lib/parser/ParserValidator.js.map +1 -1
- package/lib/parser/index.d.ts +2 -2
- package/lib/parser/index.js +1 -1
- package/lib/parser/schemaParser.d.ts +2 -2
- package/lib/parser/schemaParser.js +6 -6
- package/lib/parser/schemaParser.js.map +1 -1
- package/lib/rangeSpec.d.ts +2 -2
- package/lib/rangeSpec.js.map +1 -1
- package/lib/replaceStringParameters.js.map +1 -1
- package/lib/schema/findFieldInSchema.d.ts +19 -0
- package/lib/schema/findFieldInSchema.js +61 -0
- package/lib/schema/findFieldInSchema.js.map +1 -0
- package/lib/schema/findSelectedOptionInXxxOf.d.ts +16 -0
- package/lib/schema/findSelectedOptionInXxxOf.js +34 -0
- package/lib/schema/findSelectedOptionInXxxOf.js.map +1 -0
- package/lib/schema/getClosestMatchingOption.d.ts +5 -3
- package/lib/schema/getClosestMatchingOption.js +28 -20
- package/lib/schema/getClosestMatchingOption.js.map +1 -1
- package/lib/schema/getDefaultFormState.d.ts +60 -13
- package/lib/schema/getDefaultFormState.js +316 -167
- package/lib/schema/getDefaultFormState.js.map +1 -1
- package/lib/schema/getDisplayLabel.d.ts +3 -2
- package/lib/schema/getDisplayLabel.js +10 -9
- package/lib/schema/getDisplayLabel.js.map +1 -1
- package/lib/schema/getFirstMatchingOption.d.ts +1 -1
- package/lib/schema/getFirstMatchingOption.js +70 -2
- package/lib/schema/getFirstMatchingOption.js.map +1 -1
- package/lib/schema/getFromSchema.d.ts +14 -0
- package/lib/schema/getFromSchema.js +39 -0
- package/lib/schema/getFromSchema.js.map +1 -0
- package/lib/schema/index.d.ts +15 -14
- package/lib/schema/index.js +15 -14
- package/lib/schema/index.js.map +1 -1
- package/lib/schema/isFilesArray.d.ts +3 -2
- package/lib/schema/isFilesArray.js +5 -4
- package/lib/schema/isFilesArray.js.map +1 -1
- package/lib/schema/isMultiSelect.d.ts +3 -2
- package/lib/schema/isMultiSelect.js +4 -3
- package/lib/schema/isMultiSelect.js.map +1 -1
- package/lib/schema/isSelect.d.ts +3 -2
- package/lib/schema/isSelect.js +5 -4
- package/lib/schema/isSelect.js.map +1 -1
- package/lib/schema/retrieveSchema.d.ts +30 -12
- package/lib/schema/retrieveSchema.js +153 -70
- package/lib/schema/retrieveSchema.js.map +1 -1
- package/lib/schema/sanitizeDataForNewSchema.d.ts +3 -2
- package/lib/schema/sanitizeDataForNewSchema.js +12 -11
- package/lib/schema/sanitizeDataForNewSchema.js.map +1 -1
- package/lib/schema/toIdSchema.d.ts +3 -2
- package/lib/schema/toIdSchema.js +30 -27
- package/lib/schema/toIdSchema.js.map +1 -1
- package/lib/schema/toPathSchema.d.ts +3 -2
- package/lib/schema/toPathSchema.js +22 -20
- package/lib/schema/toPathSchema.js.map +1 -1
- package/lib/schemaRequiresTrueValue.d.ts +1 -1
- package/lib/schemaRequiresTrueValue.js.map +1 -1
- package/lib/shouldRender.js +1 -1
- package/lib/toConstant.d.ts +1 -1
- package/lib/toConstant.js +1 -1
- package/lib/toConstant.js.map +1 -1
- package/lib/toDateString.d.ts +1 -1
- package/lib/toErrorList.d.ts +1 -1
- package/lib/toErrorList.js +2 -2
- package/lib/toErrorList.js.map +1 -1
- package/lib/toErrorSchema.d.ts +1 -1
- package/lib/toErrorSchema.js +2 -2
- package/lib/toErrorSchema.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types.d.ts +172 -142
- package/lib/unwrapErrorHandler.d.ts +1 -1
- package/lib/unwrapErrorHandler.js +1 -1
- package/lib/unwrapErrorHandler.js.map +1 -1
- package/lib/utcToLocal.js +1 -1
- package/lib/utcToLocal.js.map +1 -1
- package/lib/validationDataMerge.d.ts +1 -1
- package/lib/validationDataMerge.js +3 -3
- package/lib/validationDataMerge.js.map +1 -1
- package/lib/withIdRefPrefix.d.ts +1 -1
- package/lib/withIdRefPrefix.js +2 -2
- package/lib/withIdRefPrefix.js.map +1 -1
- package/package.json +37 -26
- package/src/ErrorSchemaBuilder.ts +15 -8
- package/src/canExpand.ts +2 -2
- package/src/constIsAjvDataReference.ts +17 -0
- package/src/constants.ts +17 -3
- package/src/createSchemaUtils.ts +140 -50
- package/src/dataURItoBlob.ts +1 -1
- package/src/dateRangeOptions.ts +1 -1
- package/src/enumOptionsDeselectValue.ts +4 -5
- package/src/enumOptionsIndexForValue.ts +1 -1
- package/src/enumOptionsIsSelected.ts +4 -5
- package/src/enumOptionsSelectValue.ts +1 -1
- package/src/enumOptionsValueForIndex.ts +1 -1
- package/src/enums.ts +2 -0
- package/src/findSchemaDefinition.ts +55 -10
- package/src/getChangedFields.ts +40 -0
- package/src/getDateElementProps.ts +2 -2
- package/src/getDiscriminatorFieldFromSchema.ts +2 -1
- package/src/getInputProps.ts +6 -2
- package/src/getOptionMatchingSimpleDiscriminator.ts +2 -2
- package/src/getSchemaType.ts +3 -2
- package/src/getSubmitButtonOptions.ts +1 -1
- package/src/getTemplate.ts +12 -1
- package/src/getTestIds.ts +40 -0
- package/src/getUiOptions.ts +2 -2
- package/src/getWidget.tsx +2 -2
- package/src/hasWidget.ts +1 -1
- package/src/hashForSchema.ts +26 -6
- package/src/idGenerators.ts +10 -0
- package/src/index.ts +21 -2
- package/src/isCustomWidget.ts +1 -1
- package/src/isObject.ts +12 -5
- package/src/labelValue.ts +2 -2
- package/src/lookupFromFormContext.ts +26 -0
- package/src/mergeDefaultsWithFormData.ts +54 -9
- package/src/mergeObjects.ts +24 -21
- package/src/optionsList.ts +31 -22
- package/src/parser/ParserValidator.ts +5 -5
- package/src/parser/schemaParser.ts +6 -6
- package/src/schema/findFieldInSchema.ts +138 -0
- package/src/schema/findSelectedOptionInXxxOf.ts +53 -0
- package/src/schema/getClosestMatchingOption.ts +38 -11
- package/src/schema/getDefaultFormState.ts +461 -193
- package/src/schema/getDisplayLabel.ts +7 -4
- package/src/schema/getFirstMatchingOption.ts +79 -4
- package/src/schema/getFromSchema.ts +100 -0
- package/src/schema/index.ts +6 -4
- package/src/schema/isFilesArray.ts +18 -3
- package/src/schema/isMultiSelect.ts +10 -4
- package/src/schema/isSelect.ts +5 -3
- package/src/schema/retrieveSchema.ts +268 -78
- package/src/schema/sanitizeDataForNewSchema.ts +52 -11
- package/src/schema/toIdSchema.ts +69 -43
- package/src/schema/toPathSchema.ts +49 -16
- package/src/toErrorList.ts +2 -2
- package/src/types.ts +278 -184
- package/src/validationDataMerge.ts +1 -1
- package/src/withIdRefPrefix.ts +1 -1
- package/LICENSE.md +0 -201
- package/lib/schema/getMatchingOption.d.ts +0 -14
- package/lib/schema/getMatchingOption.js +0 -85
- package/lib/schema/getMatchingOption.js.map +0 -1
- package/lib/schema/mergeValidationData.d.ts +0 -14
- package/lib/schema/mergeValidationData.js +0 -28
- package/lib/schema/mergeValidationData.js.map +0 -1
- package/src/schema/getMatchingOption.ts +0 -103
- package/src/schema/mergeValidationData.ts +0 -38
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
import get from 'lodash/get';
|
|
2
|
-
import isEmpty from 'lodash/isEmpty';
|
|
3
|
-
import { ANY_OF_KEY, DEFAULT_KEY, DEPENDENCIES_KEY,
|
|
4
|
-
import findSchemaDefinition from '../findSchemaDefinition';
|
|
5
|
-
import getClosestMatchingOption from './getClosestMatchingOption';
|
|
6
|
-
import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema';
|
|
7
|
-
import getSchemaType from '../getSchemaType';
|
|
8
|
-
import isObject from '../isObject';
|
|
9
|
-
import isFixedItems from '../isFixedItems';
|
|
10
|
-
import mergeDefaultsWithFormData from '../mergeDefaultsWithFormData';
|
|
11
|
-
import mergeObjects from '../mergeObjects';
|
|
12
|
-
import mergeSchemas from '../mergeSchemas';
|
|
13
|
-
import isMultiSelect from './isMultiSelect';
|
|
14
|
-
import
|
|
1
|
+
import get from 'lodash-es/get.js';
|
|
2
|
+
import isEmpty from 'lodash-es/isEmpty.js';
|
|
3
|
+
import { ALL_OF_KEY, ANY_OF_KEY, CONST_KEY, DEFAULT_KEY, DEPENDENCIES_KEY, ONE_OF_KEY, PROPERTIES_KEY, REF_KEY, } from '../constants.js';
|
|
4
|
+
import findSchemaDefinition from '../findSchemaDefinition.js';
|
|
5
|
+
import getClosestMatchingOption from './getClosestMatchingOption.js';
|
|
6
|
+
import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema.js';
|
|
7
|
+
import getSchemaType from '../getSchemaType.js';
|
|
8
|
+
import isObject from '../isObject.js';
|
|
9
|
+
import isFixedItems from '../isFixedItems.js';
|
|
10
|
+
import mergeDefaultsWithFormData from '../mergeDefaultsWithFormData.js';
|
|
11
|
+
import mergeObjects from '../mergeObjects.js';
|
|
12
|
+
import mergeSchemas from '../mergeSchemas.js';
|
|
13
|
+
import isMultiSelect from './isMultiSelect.js';
|
|
14
|
+
import isSelect from './isSelect.js';
|
|
15
|
+
import retrieveSchema, { resolveDependencies } from './retrieveSchema.js';
|
|
16
|
+
import isConstant from '../isConstant.js';
|
|
17
|
+
import constIsAjvDataReference from '../constIsAjvDataReference.js';
|
|
18
|
+
import optionsList from '../optionsList.js';
|
|
19
|
+
import deepEquals from '../deepEquals.js';
|
|
20
|
+
const PRIMITIVE_TYPES = ['string', 'number', 'integer', 'boolean', 'null'];
|
|
15
21
|
/** Enum that indicates how `schema.additionalItems` should be handled by the `getInnerSchemaForArrayItem()` function.
|
|
16
22
|
*/
|
|
17
23
|
export var AdditionalItemsHandling;
|
|
@@ -70,24 +76,26 @@ export function getInnerSchemaForArrayItem(schema, additionalItems = AdditionalI
|
|
|
70
76
|
* @param requiredFields - The list of fields that are required
|
|
71
77
|
* @param experimental_defaultFormStateBehavior - Optional configuration object, if provided, allows users to override
|
|
72
78
|
* default form state behavior
|
|
79
|
+
* @param isConst - Optional flag, if true, indicates that the schema has a const property defined, thus we should always return the computedDefault since it's coming from the const.
|
|
73
80
|
*/
|
|
74
|
-
function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}) {
|
|
81
|
+
function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
|
|
75
82
|
const { emptyObjectFields = 'populateAllDefaults' } = experimental_defaultFormStateBehavior;
|
|
76
|
-
if (includeUndefinedValues) {
|
|
83
|
+
if (includeUndefinedValues || isConst) {
|
|
84
|
+
// If includeUndefinedValues
|
|
85
|
+
// Or if the schema has a const property defined, then we should always return the computedDefault since it's coming from the const.
|
|
77
86
|
obj[key] = computedDefault;
|
|
78
87
|
}
|
|
79
88
|
else if (emptyObjectFields !== 'skipDefaults') {
|
|
89
|
+
// If isParentRequired is undefined, then we are at the root level of the schema so defer to the requiredness of
|
|
90
|
+
// the field key itself in the `requiredField` list
|
|
91
|
+
const isSelfOrParentRequired = isParentRequired === undefined ? requiredFields.includes(key) : isParentRequired;
|
|
80
92
|
if (isObject(computedDefault)) {
|
|
81
|
-
// If isParentRequired is undefined, then we are at the root level of the schema so defer to the requiredness of
|
|
82
|
-
// the field key itself in the `requiredField` list
|
|
83
|
-
const isSelfOrParentRequired = isParentRequired === undefined ? requiredFields.includes(key) : isParentRequired;
|
|
84
93
|
// If emptyObjectFields 'skipEmptyDefaults' store computedDefault if it's a non-empty object(e.g. not {})
|
|
85
94
|
if (emptyObjectFields === 'skipEmptyDefaults') {
|
|
86
95
|
if (!isEmpty(computedDefault)) {
|
|
87
96
|
obj[key] = computedDefault;
|
|
88
97
|
}
|
|
89
|
-
}
|
|
90
|
-
// Else store computedDefault if it's a non-empty object(e.g. not {}) and satisfies certain conditions
|
|
98
|
+
} // Else store computedDefault if it's a non-empty object(e.g. not {}) and satisfies certain conditions
|
|
91
99
|
// Condition 1: If computedDefault is not empty or if the key is a required field
|
|
92
100
|
// Condition 2: If the parent object is required or emptyObjectFields is not 'populateRequiredDefaults'
|
|
93
101
|
else if ((!isEmpty(computedDefault) || requiredFields.includes(key)) &&
|
|
@@ -98,11 +106,12 @@ function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValu
|
|
|
98
106
|
else if (
|
|
99
107
|
// Store computedDefault if it's a defined primitive (e.g., true) and satisfies certain conditions
|
|
100
108
|
// Condition 1: computedDefault is not undefined
|
|
101
|
-
// Condition 2: If emptyObjectFields is 'populateAllDefaults' or 'skipEmptyDefaults)
|
|
109
|
+
// Condition 2: If emptyObjectFields is 'populateAllDefaults' or 'skipEmptyDefaults)
|
|
110
|
+
// Or if isSelfOrParentRequired is 'true' and the key is a required field
|
|
102
111
|
computedDefault !== undefined &&
|
|
103
112
|
(emptyObjectFields === 'populateAllDefaults' ||
|
|
104
113
|
emptyObjectFields === 'skipEmptyDefaults' ||
|
|
105
|
-
requiredFields.includes(key))) {
|
|
114
|
+
(isSelfOrParentRequired && requiredFields.includes(key)))) {
|
|
106
115
|
obj[key] = computedDefault;
|
|
107
116
|
}
|
|
108
117
|
}
|
|
@@ -112,33 +121,32 @@ function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValu
|
|
|
112
121
|
*
|
|
113
122
|
* @param validator - an implementation of the `ValidatorType` interface that will be used when necessary
|
|
114
123
|
* @param rawSchema - The schema for which the default state is desired
|
|
115
|
-
* @param
|
|
116
|
-
* @param [props.parentDefaults] - Any defaults provided by the parent field in the schema
|
|
117
|
-
* @param [props.rootSchema] - The options root schema, used to primarily to look up `$ref`s
|
|
118
|
-
* @param [props.rawFormData] - The current formData, if any, onto which to provide any missing defaults
|
|
119
|
-
* @param [props.includeUndefinedValues=false] - Optional flag, if true, cause undefined values to be added as defaults.
|
|
120
|
-
* If "excludeObjectChildren", cause undefined values for this object and pass `includeUndefinedValues` as
|
|
121
|
-
* false when computing defaults for any nested object properties.
|
|
122
|
-
* @param [props._recurseList=[]] - The list of ref names currently being recursed, used to prevent infinite recursion
|
|
123
|
-
* @param [props.experimental_defaultFormStateBehavior] Optional configuration object, if provided, allows users to override default form state behavior
|
|
124
|
-
* @param [props.required] - Optional flag, if true, indicates this schema was required in the parent schema.
|
|
124
|
+
* @param {ComputeDefaultsProps} computeDefaultsProps - Optional props for this function
|
|
125
125
|
* @returns - The resulting `formData` with all the defaults provided
|
|
126
126
|
*/
|
|
127
|
-
export function computeDefaults(validator, rawSchema,
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
export function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
|
|
128
|
+
const { parentDefaults, rawFormData, rootSchema = {}, includeUndefinedValues = false, _recurseList = [], experimental_defaultFormStateBehavior = undefined, experimental_customMergeAllOf = undefined, required, shouldMergeDefaultsIntoFormData = false, } = computeDefaultsProps;
|
|
129
|
+
let formData = (isObject(rawFormData) ? rawFormData : {});
|
|
130
130
|
const schema = isObject(rawSchema) ? rawSchema : {};
|
|
131
131
|
// Compute the defaults recursively: give highest priority to deepest nodes.
|
|
132
132
|
let defaults = parentDefaults;
|
|
133
133
|
// If we get a new schema, then we need to recompute defaults again for the new schema found.
|
|
134
134
|
let schemaToCompute = null;
|
|
135
|
+
let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
|
|
135
136
|
let updatedRecurseList = _recurseList;
|
|
136
|
-
if (
|
|
137
|
+
if (schema[CONST_KEY] &&
|
|
138
|
+
(experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.constAsDefaults) !== 'never' &&
|
|
139
|
+
!constIsAjvDataReference(schema)) {
|
|
140
|
+
defaults = schema[CONST_KEY];
|
|
141
|
+
}
|
|
142
|
+
else if (isObject(defaults) && isObject(schema.default)) {
|
|
137
143
|
// For object defaults, only override parent defaults that are defined in
|
|
138
144
|
// schema.default.
|
|
139
145
|
defaults = mergeObjects(defaults, schema.default);
|
|
140
146
|
}
|
|
141
|
-
else if (DEFAULT_KEY in schema) {
|
|
147
|
+
else if (DEFAULT_KEY in schema && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
|
|
148
|
+
// If the schema has a default value, then we should use it as the default.
|
|
149
|
+
// And if the schema does not have anyOf or oneOf, this is done because we need to merge the defaults with the formData.
|
|
142
150
|
defaults = schema.default;
|
|
143
151
|
}
|
|
144
152
|
else if (REF_KEY in schema) {
|
|
@@ -148,9 +156,25 @@ export function computeDefaults(validator, rawSchema, { parentDefaults, rawFormD
|
|
|
148
156
|
updatedRecurseList = _recurseList.concat(refName);
|
|
149
157
|
schemaToCompute = findSchemaDefinition(refName, rootSchema);
|
|
150
158
|
}
|
|
159
|
+
// If the referenced schema exists and parentDefaults is not set
|
|
160
|
+
// Then set the defaults from the current schema for the referenced schema
|
|
161
|
+
if (schemaToCompute && !defaults) {
|
|
162
|
+
defaults = schema.default;
|
|
163
|
+
}
|
|
164
|
+
// If shouldMergeDefaultsIntoFormData is true
|
|
165
|
+
// And the schemaToCompute is set and the rawFormData is not an object
|
|
166
|
+
// Then set the formData to the rawFormData
|
|
167
|
+
if (shouldMergeDefaultsIntoFormData && schemaToCompute && !isObject(rawFormData)) {
|
|
168
|
+
formData = rawFormData;
|
|
169
|
+
}
|
|
151
170
|
}
|
|
152
171
|
else if (DEPENDENCIES_KEY in schema) {
|
|
153
|
-
|
|
172
|
+
// Get the default if set from properties to ensure the dependencies conditions are resolved based on it
|
|
173
|
+
const defaultFormData = {
|
|
174
|
+
...getDefaultBasedOnSchemaType(validator, schema, computeDefaultsProps, defaults),
|
|
175
|
+
...formData,
|
|
176
|
+
};
|
|
177
|
+
const resolvedSchema = resolveDependencies(validator, schema, rootSchema, false, [], defaultFormData, experimental_customMergeAllOf);
|
|
154
178
|
schemaToCompute = resolvedSchema[0]; // pick the first element from resolve dependencies
|
|
155
179
|
}
|
|
156
180
|
else if (isFixedItems(schema)) {
|
|
@@ -159,9 +183,11 @@ export function computeDefaults(validator, rawSchema, { parentDefaults, rawFormD
|
|
|
159
183
|
includeUndefinedValues,
|
|
160
184
|
_recurseList,
|
|
161
185
|
experimental_defaultFormStateBehavior,
|
|
186
|
+
experimental_customMergeAllOf,
|
|
162
187
|
parentDefaults: Array.isArray(parentDefaults) ? parentDefaults[idx] : undefined,
|
|
163
188
|
rawFormData: formData,
|
|
164
189
|
required,
|
|
190
|
+
shouldMergeDefaultsIntoFormData,
|
|
165
191
|
}));
|
|
166
192
|
}
|
|
167
193
|
else if (ONE_OF_KEY in schema) {
|
|
@@ -170,7 +196,17 @@ export function computeDefaults(validator, rawSchema, { parentDefaults, rawFormD
|
|
|
170
196
|
return undefined;
|
|
171
197
|
}
|
|
172
198
|
const discriminator = getDiscriminatorFieldFromSchema(schema);
|
|
173
|
-
|
|
199
|
+
const { type = 'null' } = remaining;
|
|
200
|
+
if (!Array.isArray(type) &&
|
|
201
|
+
PRIMITIVE_TYPES.includes(type) &&
|
|
202
|
+
(experimental_dfsb_to_compute === null || experimental_dfsb_to_compute === void 0 ? void 0 : experimental_dfsb_to_compute.constAsDefaults) === 'skipOneOf') {
|
|
203
|
+
// If we are in a oneOf of a primitive type, then we want to pass constAsDefaults as 'never' for the recursion
|
|
204
|
+
experimental_dfsb_to_compute = {
|
|
205
|
+
...experimental_dfsb_to_compute,
|
|
206
|
+
constAsDefaults: 'never',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
schemaToCompute = oneOf[getClosestMatchingOption(validator, rootSchema, rawFormData !== null && rawFormData !== void 0 ? rawFormData : schema.default, oneOf, 0, discriminator, experimental_customMergeAllOf)];
|
|
174
210
|
schemaToCompute = mergeSchemas(remaining, schemaToCompute);
|
|
175
211
|
}
|
|
176
212
|
else if (ANY_OF_KEY in schema) {
|
|
@@ -179,7 +215,7 @@ export function computeDefaults(validator, rawSchema, { parentDefaults, rawFormD
|
|
|
179
215
|
return undefined;
|
|
180
216
|
}
|
|
181
217
|
const discriminator = getDiscriminatorFieldFromSchema(schema);
|
|
182
|
-
schemaToCompute = anyOf[getClosestMatchingOption(validator, rootSchema,
|
|
218
|
+
schemaToCompute = anyOf[getClosestMatchingOption(validator, rootSchema, rawFormData !== null && rawFormData !== void 0 ? rawFormData : schema.default, anyOf, 0, discriminator, experimental_customMergeAllOf)];
|
|
183
219
|
schemaToCompute = mergeSchemas(remaining, schemaToCompute);
|
|
184
220
|
}
|
|
185
221
|
if (schemaToCompute) {
|
|
@@ -187,144 +223,253 @@ export function computeDefaults(validator, rawSchema, { parentDefaults, rawFormD
|
|
|
187
223
|
rootSchema,
|
|
188
224
|
includeUndefinedValues,
|
|
189
225
|
_recurseList: updatedRecurseList,
|
|
190
|
-
experimental_defaultFormStateBehavior,
|
|
226
|
+
experimental_defaultFormStateBehavior: experimental_dfsb_to_compute,
|
|
227
|
+
experimental_customMergeAllOf,
|
|
191
228
|
parentDefaults: defaults,
|
|
192
229
|
rawFormData: formData,
|
|
193
230
|
required,
|
|
231
|
+
shouldMergeDefaultsIntoFormData,
|
|
194
232
|
});
|
|
195
233
|
}
|
|
196
234
|
// No defaults defined for this node, fallback to generic typed ones.
|
|
197
235
|
if (defaults === undefined) {
|
|
198
236
|
defaults = schema.default;
|
|
199
237
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
238
|
+
const defaultBasedOnSchemaType = getDefaultBasedOnSchemaType(validator, schema, computeDefaultsProps, defaults);
|
|
239
|
+
let defaultsWithFormData = defaultBasedOnSchemaType !== null && defaultBasedOnSchemaType !== void 0 ? defaultBasedOnSchemaType : defaults;
|
|
240
|
+
// if shouldMergeDefaultsIntoFormData is true, then merge the defaults into the formData.
|
|
241
|
+
if (shouldMergeDefaultsIntoFormData) {
|
|
242
|
+
const { arrayMinItems = {} } = experimental_defaultFormStateBehavior || {};
|
|
243
|
+
const { mergeExtraDefaults } = arrayMinItems;
|
|
244
|
+
const matchingFormData = ensureFormDataMatchingSchema(validator, schema, rootSchema, rawFormData, experimental_defaultFormStateBehavior, experimental_customMergeAllOf);
|
|
245
|
+
if (!isObject(rawFormData) || ALL_OF_KEY in schema) {
|
|
246
|
+
// If the formData is not an object which means it's a primitive field, then we need to merge the defaults into the formData.
|
|
247
|
+
// Or if the schema has allOf, we need to merge the defaults into the formData because we don't compute the defaults for allOf.
|
|
248
|
+
defaultsWithFormData = mergeDefaultsWithFormData(defaultsWithFormData, matchingFormData, mergeExtraDefaults, true);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return defaultsWithFormData;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Ensure that the formData matches the given schema. If it's not matching in the case of a selectField, we change it to match the schema.
|
|
255
|
+
*
|
|
256
|
+
* @param validator - an implementation of the `ValidatorType` interface that will be used when necessary
|
|
257
|
+
* @param schema - The schema for which the formData state is desired
|
|
258
|
+
* @param rootSchema - The root schema, used to primarily to look up `$ref`s
|
|
259
|
+
* @param formData - The current formData
|
|
260
|
+
* @param [experimental_defaultFormStateBehavior] - Optional configuration object, if provided, allows users to override default form state behavior
|
|
261
|
+
* @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
|
|
262
|
+
* @returns - valid formData that matches schema
|
|
263
|
+
*/
|
|
264
|
+
export function ensureFormDataMatchingSchema(validator, schema, rootSchema, formData, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
|
|
265
|
+
const isSelectField = !isConstant(schema) && isSelect(validator, schema, rootSchema, experimental_customMergeAllOf);
|
|
266
|
+
let validFormData = formData;
|
|
267
|
+
if (isSelectField) {
|
|
268
|
+
const getOptionsList = optionsList(schema);
|
|
269
|
+
const isValid = getOptionsList === null || getOptionsList === void 0 ? void 0 : getOptionsList.some((option) => deepEquals(option.value, formData));
|
|
270
|
+
validFormData = isValid ? formData : undefined;
|
|
271
|
+
}
|
|
272
|
+
// Override the formData with the const if the constAsDefaults is set to always
|
|
273
|
+
const constTakesPrecedence = schema[CONST_KEY] && (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.constAsDefaults) === 'always';
|
|
274
|
+
if (constTakesPrecedence) {
|
|
275
|
+
validFormData = schema.const;
|
|
276
|
+
}
|
|
277
|
+
return validFormData;
|
|
278
|
+
}
|
|
279
|
+
/** Computes the default value for objects.
|
|
280
|
+
*
|
|
281
|
+
* @param validator - an implementation of the `ValidatorType` interface that will be used when necessary
|
|
282
|
+
* @param rawSchema - The schema for which the default state is desired
|
|
283
|
+
* @param {ComputeDefaultsProps} computeDefaultsProps - Optional props for this function
|
|
284
|
+
* @param defaults - Optional props for this function
|
|
285
|
+
* @returns - The default value based on the schema type if they are defined for object or array schemas.
|
|
286
|
+
*/
|
|
287
|
+
export function getObjectDefaults(validator, rawSchema, { rawFormData, rootSchema = {}, includeUndefinedValues = false, _recurseList = [], experimental_defaultFormStateBehavior = undefined, experimental_customMergeAllOf = undefined, required, shouldMergeDefaultsIntoFormData, } = {}, defaults) {
|
|
288
|
+
{
|
|
289
|
+
const formData = (isObject(rawFormData) ? rawFormData : {});
|
|
290
|
+
const schema = rawSchema;
|
|
291
|
+
// This is a custom addition that fixes this issue:
|
|
292
|
+
// https://github.com/rjsf-team/react-jsonschema-form/issues/3832
|
|
293
|
+
const retrievedSchema = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.allOf) === 'populateDefaults' && ALL_OF_KEY in schema
|
|
294
|
+
? retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf)
|
|
295
|
+
: schema;
|
|
296
|
+
const parentConst = retrievedSchema[CONST_KEY];
|
|
297
|
+
const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce((acc, key) => {
|
|
298
|
+
var _a;
|
|
299
|
+
const propertySchema = get(retrievedSchema, [PROPERTIES_KEY, key], {});
|
|
300
|
+
// Check if the parent schema has a const property defined AND we are supporting const as defaults, then we
|
|
301
|
+
// should always return the computedDefault since it's coming from the const.
|
|
302
|
+
const hasParentConst = isObject(parentConst) && parentConst[key] !== undefined;
|
|
303
|
+
const hasConst = ((isObject(propertySchema) && CONST_KEY in propertySchema) || hasParentConst) &&
|
|
304
|
+
(experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.constAsDefaults) !== 'never' &&
|
|
305
|
+
!constIsAjvDataReference(propertySchema);
|
|
306
|
+
// Compute the defaults for this node, with the parent defaults we might
|
|
307
|
+
// have from a previous run: defaults[key].
|
|
308
|
+
const computedDefault = computeDefaults(validator, propertySchema, {
|
|
309
|
+
rootSchema,
|
|
310
|
+
_recurseList,
|
|
311
|
+
experimental_defaultFormStateBehavior,
|
|
312
|
+
experimental_customMergeAllOf,
|
|
313
|
+
includeUndefinedValues: includeUndefinedValues === true,
|
|
314
|
+
parentDefaults: get(defaults, [key]),
|
|
315
|
+
rawFormData: get(formData, [key]),
|
|
316
|
+
required: (_a = retrievedSchema.required) === null || _a === void 0 ? void 0 : _a.includes(key),
|
|
317
|
+
shouldMergeDefaultsIntoFormData,
|
|
318
|
+
});
|
|
319
|
+
maybeAddDefaultToObject(acc, key, computedDefault, includeUndefinedValues, required, retrievedSchema.required, experimental_defaultFormStateBehavior, hasConst);
|
|
320
|
+
return acc;
|
|
321
|
+
}, {});
|
|
322
|
+
if (retrievedSchema.additionalProperties) {
|
|
323
|
+
// as per spec additionalProperties may be either schema or boolean
|
|
324
|
+
const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties)
|
|
325
|
+
? retrievedSchema.additionalProperties
|
|
326
|
+
: {};
|
|
327
|
+
const keys = new Set();
|
|
328
|
+
if (isObject(defaults)) {
|
|
329
|
+
Object.keys(defaults)
|
|
330
|
+
.filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key])
|
|
331
|
+
.forEach((key) => keys.add(key));
|
|
332
|
+
}
|
|
333
|
+
const formDataRequired = [];
|
|
334
|
+
Object.keys(formData)
|
|
335
|
+
.filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key])
|
|
336
|
+
.forEach((key) => {
|
|
337
|
+
keys.add(key);
|
|
338
|
+
formDataRequired.push(key);
|
|
339
|
+
});
|
|
340
|
+
keys.forEach((key) => {
|
|
209
341
|
var _a;
|
|
210
|
-
|
|
211
|
-
// have from a previous run: defaults[key].
|
|
212
|
-
const computedDefault = computeDefaults(validator, get(retrievedSchema, [PROPERTIES_KEY, key]), {
|
|
342
|
+
const computedDefault = computeDefaults(validator, additionalPropertiesSchema, {
|
|
213
343
|
rootSchema,
|
|
214
344
|
_recurseList,
|
|
215
345
|
experimental_defaultFormStateBehavior,
|
|
346
|
+
experimental_customMergeAllOf,
|
|
216
347
|
includeUndefinedValues: includeUndefinedValues === true,
|
|
217
348
|
parentDefaults: get(defaults, [key]),
|
|
218
349
|
rawFormData: get(formData, [key]),
|
|
219
350
|
required: (_a = retrievedSchema.required) === null || _a === void 0 ? void 0 : _a.includes(key),
|
|
351
|
+
shouldMergeDefaultsIntoFormData,
|
|
220
352
|
});
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
if (retrievedSchema.additionalProperties) {
|
|
225
|
-
// as per spec additionalProperties may be either schema or boolean
|
|
226
|
-
const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties)
|
|
227
|
-
? retrievedSchema.additionalProperties
|
|
228
|
-
: {};
|
|
229
|
-
const keys = new Set();
|
|
230
|
-
if (isObject(defaults)) {
|
|
231
|
-
Object.keys(defaults)
|
|
232
|
-
.filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key])
|
|
233
|
-
.forEach((key) => keys.add(key));
|
|
234
|
-
}
|
|
235
|
-
const formDataRequired = [];
|
|
236
|
-
Object.keys(formData)
|
|
237
|
-
.filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key])
|
|
238
|
-
.forEach((key) => {
|
|
239
|
-
keys.add(key);
|
|
240
|
-
formDataRequired.push(key);
|
|
241
|
-
});
|
|
242
|
-
keys.forEach((key) => {
|
|
243
|
-
var _a;
|
|
244
|
-
const computedDefault = computeDefaults(validator, additionalPropertiesSchema, {
|
|
245
|
-
rootSchema,
|
|
246
|
-
_recurseList,
|
|
247
|
-
experimental_defaultFormStateBehavior,
|
|
248
|
-
includeUndefinedValues: includeUndefinedValues === true,
|
|
249
|
-
parentDefaults: get(defaults, [key]),
|
|
250
|
-
rawFormData: get(formData, [key]),
|
|
251
|
-
required: (_a = retrievedSchema.required) === null || _a === void 0 ? void 0 : _a.includes(key),
|
|
252
|
-
});
|
|
253
|
-
// Since these are additional properties we don't need to add the `experimental_defaultFormStateBehavior` prop
|
|
254
|
-
maybeAddDefaultToObject(objectDefaults, key, computedDefault, includeUndefinedValues, required, formDataRequired);
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
return objectDefaults;
|
|
353
|
+
// Since these are additional properties we don't need to add the `experimental_defaultFormStateBehavior` prop
|
|
354
|
+
maybeAddDefaultToObject(objectDefaults, key, computedDefault, includeUndefinedValues, required, formDataRequired);
|
|
355
|
+
});
|
|
258
356
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return computeDefaults(validator, schemaItem, {
|
|
287
|
-
rootSchema,
|
|
288
|
-
_recurseList,
|
|
289
|
-
experimental_defaultFormStateBehavior,
|
|
290
|
-
rawFormData: item,
|
|
291
|
-
parentDefaults: get(defaults, [idx]),
|
|
292
|
-
required,
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
if (neverPopulate) {
|
|
298
|
-
return defaults !== null && defaults !== void 0 ? defaults : emptyDefault;
|
|
299
|
-
}
|
|
300
|
-
if (ignoreMinItemsFlagSet && !required) {
|
|
301
|
-
// If no form data exists or defaults are set leave the field empty/non-existent, otherwise
|
|
302
|
-
// return form data/defaults
|
|
303
|
-
return defaults ? defaults : undefined;
|
|
304
|
-
}
|
|
305
|
-
const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
|
|
306
|
-
if (!schema.minItems ||
|
|
307
|
-
isMultiSelect(validator, schema, rootSchema) ||
|
|
308
|
-
computeSkipPopulate(validator, schema, rootSchema) ||
|
|
309
|
-
schema.minItems <= defaultsLength) {
|
|
310
|
-
return defaults ? defaults : emptyDefault;
|
|
311
|
-
}
|
|
312
|
-
const defaultEntries = (defaults || []);
|
|
313
|
-
const fillerSchema = getInnerSchemaForArrayItem(schema, AdditionalItemsHandling.Invert);
|
|
314
|
-
const fillerDefault = fillerSchema.default;
|
|
315
|
-
// Calculate filler entries for remaining items (minItems - existing raw data/defaults)
|
|
316
|
-
const fillerEntries = new Array(schema.minItems - defaultsLength).fill(computeDefaults(validator, fillerSchema, {
|
|
317
|
-
parentDefaults: fillerDefault,
|
|
357
|
+
return objectDefaults;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/** Computes the default value for arrays.
|
|
361
|
+
*
|
|
362
|
+
* @param validator - an implementation of the `ValidatorType` interface that will be used when necessary
|
|
363
|
+
* @param rawSchema - The schema for which the default state is desired
|
|
364
|
+
* @param {ComputeDefaultsProps} computeDefaultsProps - Optional props for this function
|
|
365
|
+
* @param defaults - Optional props for this function
|
|
366
|
+
* @returns - The default value based on the schema type if they are defined for object or array schemas.
|
|
367
|
+
*/
|
|
368
|
+
export function getArrayDefaults(validator, rawSchema, { rawFormData, rootSchema = {}, _recurseList = [], experimental_defaultFormStateBehavior = undefined, experimental_customMergeAllOf = undefined, required, shouldMergeDefaultsIntoFormData, } = {}, defaults) {
|
|
369
|
+
var _a, _b;
|
|
370
|
+
const schema = rawSchema;
|
|
371
|
+
const arrayMinItemsStateBehavior = (_a = experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.arrayMinItems) !== null && _a !== void 0 ? _a : {};
|
|
372
|
+
const { populate: arrayMinItemsPopulate, mergeExtraDefaults: arrayMergeExtraDefaults } = arrayMinItemsStateBehavior;
|
|
373
|
+
const neverPopulate = arrayMinItemsPopulate === 'never';
|
|
374
|
+
const ignoreMinItemsFlagSet = arrayMinItemsPopulate === 'requiredOnly';
|
|
375
|
+
const isPopulateAll = arrayMinItemsPopulate === 'all' || (!neverPopulate && !ignoreMinItemsFlagSet);
|
|
376
|
+
const computeSkipPopulate = (_b = arrayMinItemsStateBehavior === null || arrayMinItemsStateBehavior === void 0 ? void 0 : arrayMinItemsStateBehavior.computeSkipPopulate) !== null && _b !== void 0 ? _b : (() => false);
|
|
377
|
+
const isSkipEmptyDefaults = (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.emptyObjectFields) === 'skipEmptyDefaults';
|
|
378
|
+
const emptyDefault = isSkipEmptyDefaults ? undefined : [];
|
|
379
|
+
// Inject defaults into existing array defaults
|
|
380
|
+
if (Array.isArray(defaults)) {
|
|
381
|
+
defaults = defaults.map((item, idx) => {
|
|
382
|
+
const schemaItem = getInnerSchemaForArrayItem(schema, AdditionalItemsHandling.Fallback, idx);
|
|
383
|
+
return computeDefaults(validator, schemaItem, {
|
|
318
384
|
rootSchema,
|
|
319
385
|
_recurseList,
|
|
320
386
|
experimental_defaultFormStateBehavior,
|
|
387
|
+
experimental_customMergeAllOf,
|
|
388
|
+
parentDefaults: item,
|
|
321
389
|
required,
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
390
|
+
shouldMergeDefaultsIntoFormData,
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
// Deeply inject defaults into already existing form data
|
|
395
|
+
if (Array.isArray(rawFormData)) {
|
|
396
|
+
const schemaItem = getInnerSchemaForArrayItem(schema);
|
|
397
|
+
if (neverPopulate) {
|
|
398
|
+
defaults = rawFormData;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
const itemDefaults = rawFormData.map((item, idx) => {
|
|
402
|
+
return computeDefaults(validator, schemaItem, {
|
|
403
|
+
rootSchema,
|
|
404
|
+
_recurseList,
|
|
405
|
+
experimental_defaultFormStateBehavior,
|
|
406
|
+
experimental_customMergeAllOf,
|
|
407
|
+
rawFormData: item,
|
|
408
|
+
parentDefaults: get(defaults, [idx]),
|
|
409
|
+
required,
|
|
410
|
+
shouldMergeDefaultsIntoFormData,
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
// If the populate 'requiredOnly' flag is set then we only merge and include extra defaults if they are required.
|
|
414
|
+
// Or if populate 'all' is set we merge and include extra defaults.
|
|
415
|
+
const mergeExtraDefaults = ((ignoreMinItemsFlagSet && required) || isPopulateAll) && arrayMergeExtraDefaults;
|
|
416
|
+
defaults = mergeDefaultsWithFormData(defaults, itemDefaults, mergeExtraDefaults);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// Check if the schema has a const property defined AND we are supporting const as defaults, then we should always
|
|
420
|
+
// return the computedDefault since it's coming from the const.
|
|
421
|
+
const hasConst = isObject(schema) && CONST_KEY in schema && (experimental_defaultFormStateBehavior === null || experimental_defaultFormStateBehavior === void 0 ? void 0 : experimental_defaultFormStateBehavior.constAsDefaults) !== 'never';
|
|
422
|
+
if (hasConst === false) {
|
|
423
|
+
if (neverPopulate) {
|
|
424
|
+
return defaults !== null && defaults !== void 0 ? defaults : emptyDefault;
|
|
425
|
+
}
|
|
426
|
+
if (ignoreMinItemsFlagSet && !required) {
|
|
427
|
+
// If no form data exists or defaults are set leave the field empty/non-existent, otherwise
|
|
428
|
+
// return form data/defaults
|
|
429
|
+
return defaults ? defaults : undefined;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
|
|
433
|
+
if (!schema.minItems ||
|
|
434
|
+
isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) ||
|
|
435
|
+
computeSkipPopulate(validator, schema, rootSchema) ||
|
|
436
|
+
schema.minItems <= defaultsLength) {
|
|
437
|
+
return defaults ? defaults : emptyDefault;
|
|
438
|
+
}
|
|
439
|
+
const defaultEntries = (defaults || []);
|
|
440
|
+
const fillerSchema = getInnerSchemaForArrayItem(schema, AdditionalItemsHandling.Invert);
|
|
441
|
+
const fillerDefault = fillerSchema.default;
|
|
442
|
+
// Calculate filler entries for remaining items (minItems - existing raw data/defaults)
|
|
443
|
+
const fillerEntries = new Array(schema.minItems - defaultsLength).fill(computeDefaults(validator, fillerSchema, {
|
|
444
|
+
parentDefaults: fillerDefault,
|
|
445
|
+
rootSchema,
|
|
446
|
+
_recurseList,
|
|
447
|
+
experimental_defaultFormStateBehavior,
|
|
448
|
+
experimental_customMergeAllOf,
|
|
449
|
+
required,
|
|
450
|
+
shouldMergeDefaultsIntoFormData,
|
|
451
|
+
}));
|
|
452
|
+
// then fill up the rest with either the item default or empty, up to minItems
|
|
453
|
+
return defaultEntries.concat(fillerEntries);
|
|
454
|
+
}
|
|
455
|
+
/** Computes the default value based on the schema type.
|
|
456
|
+
*
|
|
457
|
+
* @param validator - an implementation of the `ValidatorType` interface that will be used when necessary
|
|
458
|
+
* @param rawSchema - The schema for which the default state is desired
|
|
459
|
+
* @param {ComputeDefaultsProps} computeDefaultsProps - Optional props for this function
|
|
460
|
+
* @param defaults - Optional props for this function
|
|
461
|
+
* @returns - The default value based on the schema type if they are defined for object or array schemas.
|
|
462
|
+
*/
|
|
463
|
+
export function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps = {}, defaults) {
|
|
464
|
+
switch (getSchemaType(rawSchema)) {
|
|
465
|
+
// We need to recurse for object schema inner default values.
|
|
466
|
+
case 'object': {
|
|
467
|
+
return getObjectDefaults(validator, rawSchema, computeDefaultsProps, defaults);
|
|
468
|
+
}
|
|
469
|
+
case 'array': {
|
|
470
|
+
return getArrayDefaults(validator, rawSchema, computeDefaultsProps, defaults);
|
|
325
471
|
}
|
|
326
472
|
}
|
|
327
|
-
return defaults;
|
|
328
473
|
}
|
|
329
474
|
/** Returns the superset of `formData` that includes the given set updated to include any missing fields that have
|
|
330
475
|
* computed to have defaults provided in the `schema`.
|
|
@@ -337,30 +482,34 @@ export function computeDefaults(validator, rawSchema, { parentDefaults, rawFormD
|
|
|
337
482
|
* If "excludeObjectChildren", cause undefined values for this object and pass `includeUndefinedValues` as
|
|
338
483
|
* false when computing defaults for any nested object properties.
|
|
339
484
|
* @param [experimental_defaultFormStateBehavior] Optional configuration object, if provided, allows users to override default form state behavior
|
|
485
|
+
* @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
|
|
340
486
|
* @returns - The resulting `formData` with all the defaults provided
|
|
341
487
|
*/
|
|
342
|
-
export default function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior) {
|
|
488
|
+
export default function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
|
|
343
489
|
if (!isObject(theSchema)) {
|
|
344
490
|
throw new Error('Invalid schema: ' + theSchema);
|
|
345
491
|
}
|
|
346
|
-
const schema = retrieveSchema(validator, theSchema, rootSchema, formData);
|
|
492
|
+
const schema = retrieveSchema(validator, theSchema, rootSchema, formData, experimental_customMergeAllOf);
|
|
493
|
+
// Get the computed defaults with 'shouldMergeDefaultsIntoFormData' set to true to merge defaults into formData.
|
|
494
|
+
// This is done when for example the value from formData does not exist in the schema 'enum' property, in such
|
|
495
|
+
// cases we take the value from the defaults because the value from the formData is not valid.
|
|
347
496
|
const defaults = computeDefaults(validator, schema, {
|
|
348
497
|
rootSchema,
|
|
349
498
|
includeUndefinedValues,
|
|
350
499
|
experimental_defaultFormStateBehavior,
|
|
500
|
+
experimental_customMergeAllOf,
|
|
351
501
|
rawFormData: formData,
|
|
502
|
+
shouldMergeDefaultsIntoFormData: true,
|
|
352
503
|
});
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
504
|
+
// If the formData is an object or an array, add additional properties from formData and override formData with
|
|
505
|
+
// defaults since the defaults are already merged with formData.
|
|
506
|
+
if (isObject(formData) || Array.isArray(formData)) {
|
|
507
|
+
const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
|
|
508
|
+
const defaultSupercedesUndefined = mergeDefaultsIntoFormData === 'useDefaultIfFormDataUndefined';
|
|
509
|
+
const result = mergeDefaultsWithFormData(defaults, formData, true, // set to true to add any additional default array entries.
|
|
510
|
+
defaultSupercedesUndefined, true);
|
|
511
|
+
return result;
|
|
360
512
|
}
|
|
361
|
-
|
|
362
|
-
return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults);
|
|
363
|
-
}
|
|
364
|
-
return formData;
|
|
513
|
+
return defaults;
|
|
365
514
|
}
|
|
366
515
|
//# sourceMappingURL=getDefaultFormState.js.map
|