@rjsf/utils 6.0.0-alpha.0 → 6.0.0-beta.2

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