@rjsf/utils 6.8.0 → 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/dist/index.cjs +509 -419
  2. package/dist/index.cjs.map +4 -4
  3. package/dist/utils.esm.js +508 -418
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +567 -327
  6. package/lib/ErrorSchemaBuilder.d.ts +8 -7
  7. package/lib/ErrorSchemaBuilder.d.ts.map +1 -0
  8. package/lib/ErrorSchemaBuilder.js +29 -27
  9. package/lib/ErrorSchemaBuilder.js.map +1 -1
  10. package/lib/SelectedOptionDescription.d.ts +2 -1
  11. package/lib/SelectedOptionDescription.d.ts.map +1 -0
  12. package/lib/SelectedOptionDescription.js +6 -7
  13. package/lib/SelectedOptionDescription.js.map +1 -1
  14. package/lib/allowAdditionalItems.d.ts +2 -1
  15. package/lib/allowAdditionalItems.d.ts.map +1 -0
  16. package/lib/allowAdditionalItems.js +1 -1
  17. package/lib/allowAdditionalItems.js.map +1 -1
  18. package/lib/asNumber.d.ts +1 -0
  19. package/lib/asNumber.d.ts.map +1 -0
  20. package/lib/asNumber.js +1 -1
  21. package/lib/asNumber.js.map +1 -1
  22. package/lib/canExpand.d.ts +2 -1
  23. package/lib/canExpand.d.ts.map +1 -0
  24. package/lib/canExpand.js +1 -1
  25. package/lib/canExpand.js.map +1 -1
  26. package/lib/constIsAjvDataReference.d.ts +2 -1
  27. package/lib/constIsAjvDataReference.d.ts.map +1 -0
  28. package/lib/constIsAjvDataReference.js +2 -3
  29. package/lib/constIsAjvDataReference.js.map +1 -1
  30. package/lib/constants.d.ts +1 -0
  31. package/lib/constants.d.ts.map +1 -0
  32. package/lib/createErrorHandler.d.ts +2 -1
  33. package/lib/createErrorHandler.d.ts.map +1 -0
  34. package/lib/createErrorHandler.js +3 -4
  35. package/lib/createErrorHandler.js.map +1 -1
  36. package/lib/createSchemaUtils.d.ts +2 -1
  37. package/lib/createSchemaUtils.d.ts.map +1 -0
  38. package/lib/createSchemaUtils.js +10 -7
  39. package/lib/createSchemaUtils.js.map +1 -1
  40. package/lib/dataURItoBlob.d.ts +1 -0
  41. package/lib/dataURItoBlob.d.ts.map +1 -0
  42. package/lib/dataURItoBlob.js +1 -2
  43. package/lib/dataURItoBlob.js.map +1 -1
  44. package/lib/dateRangeOptions.d.ts +2 -1
  45. package/lib/dateRangeOptions.d.ts.map +1 -0
  46. package/lib/dateRangeOptions.js +1 -1
  47. package/lib/dateRangeOptions.js.map +1 -1
  48. package/lib/deepEquals.d.ts +1 -0
  49. package/lib/deepEquals.d.ts.map +1 -0
  50. package/lib/englishStringTranslator.d.ts +2 -1
  51. package/lib/englishStringTranslator.d.ts.map +1 -0
  52. package/lib/englishStringTranslator.js +1 -1
  53. package/lib/englishStringTranslator.js.map +1 -1
  54. package/lib/enumOptionSelectedValue.d.ts +2 -1
  55. package/lib/enumOptionSelectedValue.d.ts.map +1 -0
  56. package/lib/enumOptionSelectedValue.js +1 -1
  57. package/lib/enumOptionSelectedValue.js.map +1 -1
  58. package/lib/enumOptionValueDecoder.d.ts +2 -1
  59. package/lib/enumOptionValueDecoder.d.ts.map +1 -0
  60. package/lib/enumOptionValueDecoder.js +1 -1
  61. package/lib/enumOptionValueDecoder.js.map +1 -1
  62. package/lib/enumOptionValueEncoder.d.ts +2 -1
  63. package/lib/enumOptionValueEncoder.d.ts.map +1 -0
  64. package/lib/enumOptionValueEncoder.js +1 -2
  65. package/lib/enumOptionValueEncoder.js.map +1 -1
  66. package/lib/enumOptionsDeselectValue.d.ts +2 -1
  67. package/lib/enumOptionsDeselectValue.d.ts.map +1 -0
  68. package/lib/enumOptionsDeselectValue.js +2 -2
  69. package/lib/enumOptionsDeselectValue.js.map +1 -1
  70. package/lib/enumOptionsIndexForValue.d.ts +2 -1
  71. package/lib/enumOptionsIndexForValue.d.ts.map +1 -0
  72. package/lib/enumOptionsIndexForValue.js +1 -1
  73. package/lib/enumOptionsIndexForValue.js.map +1 -1
  74. package/lib/enumOptionsIsSelected.d.ts +2 -1
  75. package/lib/enumOptionsIsSelected.d.ts.map +1 -0
  76. package/lib/enumOptionsIsSelected.js +1 -1
  77. package/lib/enumOptionsIsSelected.js.map +1 -1
  78. package/lib/enumOptionsSelectValue.d.ts +2 -1
  79. package/lib/enumOptionsSelectValue.d.ts.map +1 -0
  80. package/lib/enumOptionsSelectValue.js +2 -3
  81. package/lib/enumOptionsSelectValue.js.map +1 -1
  82. package/lib/enumOptionsValueForIndex.d.ts +2 -1
  83. package/lib/enumOptionsValueForIndex.d.ts.map +1 -0
  84. package/lib/enums.d.ts +1 -0
  85. package/lib/enums.d.ts.map +1 -0
  86. package/lib/findSchemaDefinition.d.ts +2 -1
  87. package/lib/findSchemaDefinition.d.ts.map +1 -0
  88. package/lib/findSchemaDefinition.js +7 -11
  89. package/lib/findSchemaDefinition.js.map +1 -1
  90. package/lib/getChangedFields.d.ts +11 -2
  91. package/lib/getChangedFields.d.ts.map +1 -0
  92. package/lib/getChangedFields.js +57 -18
  93. package/lib/getChangedFields.js.map +1 -1
  94. package/lib/getDateElementProps.d.ts +2 -1
  95. package/lib/getDateElementProps.d.ts.map +1 -0
  96. package/lib/getDecimalSeparator.d.ts +1 -0
  97. package/lib/getDecimalSeparator.d.ts.map +1 -0
  98. package/lib/getDecimalSeparator.js +1 -2
  99. package/lib/getDecimalSeparator.js.map +1 -1
  100. package/lib/getDiscriminatorFieldFromSchema.d.ts +2 -1
  101. package/lib/getDiscriminatorFieldFromSchema.d.ts.map +1 -0
  102. package/lib/getDiscriminatorFieldFromSchema.js +4 -5
  103. package/lib/getDiscriminatorFieldFromSchema.js.map +1 -1
  104. package/lib/getInputProps.d.ts +2 -1
  105. package/lib/getInputProps.d.ts.map +1 -0
  106. package/lib/getInputProps.js +4 -1
  107. package/lib/getInputProps.js.map +1 -1
  108. package/lib/getOptionMatchingSimpleDiscriminator.d.ts +2 -1
  109. package/lib/getOptionMatchingSimpleDiscriminator.d.ts.map +1 -0
  110. package/lib/getOptionMatchingSimpleDiscriminator.js +6 -6
  111. package/lib/getOptionMatchingSimpleDiscriminator.js.map +1 -1
  112. package/lib/getOptionValueFormat.d.ts +2 -1
  113. package/lib/getOptionValueFormat.d.ts.map +1 -0
  114. package/lib/getOptionValueFormat.js +1 -2
  115. package/lib/getOptionValueFormat.js.map +1 -1
  116. package/lib/getPropertySchema.d.ts +12 -0
  117. package/lib/getPropertySchema.d.ts.map +1 -0
  118. package/lib/getPropertySchema.js +14 -0
  119. package/lib/getPropertySchema.js.map +1 -0
  120. package/lib/getSchemaType.d.ts +2 -1
  121. package/lib/getSchemaType.d.ts.map +1 -0
  122. package/lib/getSchemaType.js +1 -1
  123. package/lib/getSchemaType.js.map +1 -1
  124. package/lib/getSubmitButtonOptions.d.ts +2 -1
  125. package/lib/getSubmitButtonOptions.d.ts.map +1 -0
  126. package/lib/getSubmitButtonOptions.js +3 -3
  127. package/lib/getSubmitButtonOptions.js.map +1 -1
  128. package/lib/getTemplate.d.ts +2 -1
  129. package/lib/getTemplate.d.ts.map +1 -0
  130. package/lib/getTestIds.d.ts +2 -1
  131. package/lib/getTestIds.d.ts.map +1 -0
  132. package/lib/getTestIds.js +6 -5
  133. package/lib/getTestIds.js.map +1 -1
  134. package/lib/getUiOptions.d.ts +2 -1
  135. package/lib/getUiOptions.d.ts.map +1 -0
  136. package/lib/getUiOptions.js +2 -2
  137. package/lib/getUiOptions.js.map +1 -1
  138. package/lib/getWidget.d.ts +2 -1
  139. package/lib/getWidget.d.ts.map +1 -0
  140. package/lib/getWidget.js +6 -7
  141. package/lib/getWidget.js.map +1 -1
  142. package/lib/guessType.d.ts +2 -1
  143. package/lib/guessType.d.ts.map +1 -0
  144. package/lib/hasWidget.d.ts +2 -1
  145. package/lib/hasWidget.d.ts.map +1 -0
  146. package/lib/hasWidget.js +1 -1
  147. package/lib/hasWidget.js.map +1 -1
  148. package/lib/hashForSchema.d.ts +2 -1
  149. package/lib/hashForSchema.d.ts.map +1 -0
  150. package/lib/idGenerators.d.ts +2 -1
  151. package/lib/idGenerators.d.ts.map +1 -0
  152. package/lib/idGenerators.js +2 -3
  153. package/lib/idGenerators.js.map +1 -1
  154. package/lib/index.d.ts +93 -87
  155. package/lib/index.d.ts.map +1 -0
  156. package/lib/index.js +85 -81
  157. package/lib/index.js.map +1 -1
  158. package/lib/isConstant.d.ts +2 -1
  159. package/lib/isConstant.d.ts.map +1 -0
  160. package/lib/isConstant.js +1 -1
  161. package/lib/isConstant.js.map +1 -1
  162. package/lib/isCustomWidget.d.ts +2 -1
  163. package/lib/isCustomWidget.d.ts.map +1 -0
  164. package/lib/isCustomWidget.js +1 -1
  165. package/lib/isCustomWidget.js.map +1 -1
  166. package/lib/isFixedItems.d.ts +2 -1
  167. package/lib/isFixedItems.d.ts.map +1 -0
  168. package/lib/isFixedItems.js +1 -1
  169. package/lib/isFixedItems.js.map +1 -1
  170. package/lib/isFormDataAvailable.d.ts +1 -0
  171. package/lib/isFormDataAvailable.d.ts.map +1 -0
  172. package/lib/isFormDataAvailable.js +7 -4
  173. package/lib/isFormDataAvailable.js.map +1 -1
  174. package/lib/isObject.d.ts +3 -1
  175. package/lib/isObject.d.ts.map +1 -0
  176. package/lib/isObject.js +8 -2
  177. package/lib/isObject.js.map +1 -1
  178. package/lib/isPlainObject.d.ts +9 -0
  179. package/lib/isPlainObject.d.ts.map +1 -0
  180. package/lib/isPlainObject.js +15 -0
  181. package/lib/isPlainObject.js.map +1 -0
  182. package/lib/isRootSchema.d.ts +2 -1
  183. package/lib/isRootSchema.d.ts.map +1 -0
  184. package/lib/isRootSchema.js +2 -2
  185. package/lib/isRootSchema.js.map +1 -1
  186. package/lib/jsonSchemaAugmentation.d.ts +1 -0
  187. package/lib/jsonSchemaAugmentation.d.ts.map +1 -0
  188. package/lib/labelValue.d.ts +1 -0
  189. package/lib/labelValue.d.ts.map +1 -0
  190. package/lib/localToUTC.d.ts +1 -0
  191. package/lib/localToUTC.d.ts.map +1 -0
  192. package/lib/logUnsupportedDefaultForEnum.d.ts +2 -1
  193. package/lib/logUnsupportedDefaultForEnum.d.ts.map +1 -0
  194. package/lib/logUnsupportedDefaultForEnum.js +1 -1
  195. package/lib/logUnsupportedDefaultForEnum.js.map +1 -1
  196. package/lib/lookupFromFormContext.d.ts +3 -2
  197. package/lib/lookupFromFormContext.d.ts.map +1 -0
  198. package/lib/lookupFromFormContext.js +4 -5
  199. package/lib/lookupFromFormContext.js.map +1 -1
  200. package/lib/mergeDefaultsWithFormData.d.ts +1 -0
  201. package/lib/mergeDefaultsWithFormData.d.ts.map +1 -0
  202. package/lib/mergeDefaultsWithFormData.js +20 -16
  203. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  204. package/lib/mergeObjects.d.ts +2 -1
  205. package/lib/mergeObjects.d.ts.map +1 -0
  206. package/lib/mergeObjects.js +1 -1
  207. package/lib/mergeObjects.js.map +1 -1
  208. package/lib/mergeSchemas.d.ts +2 -1
  209. package/lib/mergeSchemas.d.ts.map +1 -0
  210. package/lib/mergeSchemas.js +4 -5
  211. package/lib/mergeSchemas.js.map +1 -1
  212. package/lib/nameGenerators.d.ts +2 -1
  213. package/lib/nameGenerators.d.ts.map +1 -0
  214. package/lib/noop.d.ts +5 -0
  215. package/lib/noop.d.ts.map +1 -0
  216. package/lib/noop.js +5 -0
  217. package/lib/noop.js.map +1 -0
  218. package/lib/optionsList.d.ts +2 -1
  219. package/lib/optionsList.d.ts.map +1 -0
  220. package/lib/optionsList.js +15 -15
  221. package/lib/optionsList.js.map +1 -1
  222. package/lib/orderProperties.d.ts +1 -0
  223. package/lib/orderProperties.d.ts.map +1 -0
  224. package/lib/pad.d.ts +1 -0
  225. package/lib/pad.d.ts.map +1 -0
  226. package/lib/parseDateString.d.ts +2 -1
  227. package/lib/parseDateString.d.ts.map +1 -0
  228. package/lib/parser/ParserValidator.d.ts +2 -1
  229. package/lib/parser/ParserValidator.d.ts.map +1 -0
  230. package/lib/parser/ParserValidator.js +8 -7
  231. package/lib/parser/ParserValidator.js.map +1 -1
  232. package/lib/parser/index.d.ts +3 -2
  233. package/lib/parser/index.d.ts.map +1 -0
  234. package/lib/parser/index.js +1 -1
  235. package/lib/parser/index.js.map +1 -1
  236. package/lib/parser/schemaParser.d.ts +3 -2
  237. package/lib/parser/schemaParser.d.ts.map +1 -0
  238. package/lib/parser/schemaParser.js +6 -7
  239. package/lib/parser/schemaParser.js.map +1 -1
  240. package/lib/pathUtils.d.ts +77 -0
  241. package/lib/pathUtils.d.ts.map +1 -0
  242. package/lib/pathUtils.js +192 -0
  243. package/lib/pathUtils.js.map +1 -0
  244. package/lib/rangeSpec.d.ts +2 -1
  245. package/lib/rangeSpec.d.ts.map +1 -0
  246. package/lib/removeOptionalEmptyObjects.d.ts +2 -1
  247. package/lib/removeOptionalEmptyObjects.d.ts.map +1 -0
  248. package/lib/removeOptionalEmptyObjects.js +2 -2
  249. package/lib/removeOptionalEmptyObjects.js.map +1 -1
  250. package/lib/replaceStringParameters.d.ts +1 -0
  251. package/lib/replaceStringParameters.d.ts.map +1 -0
  252. package/lib/resolveUiSchema.d.ts +2 -1
  253. package/lib/resolveUiSchema.d.ts.map +1 -0
  254. package/lib/resolveUiSchema.js +6 -8
  255. package/lib/resolveUiSchema.js.map +1 -1
  256. package/lib/schema/findFieldInSchema.d.ts +2 -1
  257. package/lib/schema/findFieldInSchema.d.ts.map +1 -0
  258. package/lib/schema/findFieldInSchema.js +10 -11
  259. package/lib/schema/findFieldInSchema.js.map +1 -1
  260. package/lib/schema/findSelectedOptionInXxxOf.d.ts +2 -1
  261. package/lib/schema/findSelectedOptionInXxxOf.d.ts.map +1 -0
  262. package/lib/schema/findSelectedOptionInXxxOf.js +7 -7
  263. package/lib/schema/findSelectedOptionInXxxOf.js.map +1 -1
  264. package/lib/schema/getClosestMatchingOption.d.ts +2 -1
  265. package/lib/schema/getClosestMatchingOption.d.ts.map +1 -0
  266. package/lib/schema/getClosestMatchingOption.js +18 -23
  267. package/lib/schema/getClosestMatchingOption.js.map +1 -1
  268. package/lib/schema/getDefaultFormState.d.ts +2 -1
  269. package/lib/schema/getDefaultFormState.d.ts.map +1 -0
  270. package/lib/schema/getDefaultFormState.js +78 -56
  271. package/lib/schema/getDefaultFormState.js.map +1 -1
  272. package/lib/schema/getDisplayLabel.d.ts +2 -1
  273. package/lib/schema/getDisplayLabel.d.ts.map +1 -0
  274. package/lib/schema/getDisplayLabel.js +7 -7
  275. package/lib/schema/getDisplayLabel.js.map +1 -1
  276. package/lib/schema/getFirstMatchingOption.d.ts +2 -1
  277. package/lib/schema/getFirstMatchingOption.d.ts.map +1 -0
  278. package/lib/schema/getFirstMatchingOption.js +9 -9
  279. package/lib/schema/getFirstMatchingOption.js.map +1 -1
  280. package/lib/schema/getFromSchema.d.ts +3 -2
  281. package/lib/schema/getFromSchema.d.ts.map +1 -0
  282. package/lib/schema/getFromSchema.js +10 -11
  283. package/lib/schema/getFromSchema.js.map +1 -1
  284. package/lib/schema/index.d.ts +15 -14
  285. package/lib/schema/index.d.ts.map +1 -0
  286. package/lib/schema/index.js +14 -14
  287. package/lib/schema/index.js.map +1 -1
  288. package/lib/schema/isFilesArray.d.ts +2 -1
  289. package/lib/schema/isFilesArray.d.ts.map +1 -0
  290. package/lib/schema/isFilesArray.js +2 -2
  291. package/lib/schema/isFilesArray.js.map +1 -1
  292. package/lib/schema/isMultiSelect.d.ts +2 -1
  293. package/lib/schema/isMultiSelect.d.ts.map +1 -0
  294. package/lib/schema/isMultiSelect.js +1 -1
  295. package/lib/schema/isMultiSelect.js.map +1 -1
  296. package/lib/schema/isSelect.d.ts +2 -1
  297. package/lib/schema/isSelect.d.ts.map +1 -0
  298. package/lib/schema/isSelect.js +2 -2
  299. package/lib/schema/isSelect.js.map +1 -1
  300. package/lib/schema/omitExtraData.d.ts +2 -1
  301. package/lib/schema/omitExtraData.d.ts.map +1 -0
  302. package/lib/schema/omitExtraData.js +100 -64
  303. package/lib/schema/omitExtraData.js.map +1 -1
  304. package/lib/schema/retrieveSchema.d.ts +2 -1
  305. package/lib/schema/retrieveSchema.d.ts.map +1 -0
  306. package/lib/schema/retrieveSchema.js +32 -40
  307. package/lib/schema/retrieveSchema.js.map +1 -1
  308. package/lib/schema/sanitizeDataForNewSchema.d.ts +4 -3
  309. package/lib/schema/sanitizeDataForNewSchema.d.ts.map +1 -0
  310. package/lib/schema/sanitizeDataForNewSchema.js +41 -39
  311. package/lib/schema/sanitizeDataForNewSchema.js.map +1 -1
  312. package/lib/schema/shallowAllOfMerge.d.ts +1 -0
  313. package/lib/schema/shallowAllOfMerge.d.ts.map +1 -0
  314. package/lib/schema/toPathSchema.d.ts +2 -1
  315. package/lib/schema/toPathSchema.d.ts.map +1 -0
  316. package/lib/schema/toPathSchema.js +14 -14
  317. package/lib/schema/toPathSchema.js.map +1 -1
  318. package/lib/schemaRequiresTrueValue.d.ts +2 -1
  319. package/lib/schemaRequiresTrueValue.d.ts.map +1 -0
  320. package/lib/schemaRequiresTrueValue.js +3 -4
  321. package/lib/schemaRequiresTrueValue.js.map +1 -1
  322. package/lib/shallowEquals.d.ts +1 -0
  323. package/lib/shallowEquals.d.ts.map +1 -0
  324. package/lib/shouldRender.d.ts +2 -1
  325. package/lib/shouldRender.d.ts.map +1 -0
  326. package/lib/shouldRender.js +2 -2
  327. package/lib/shouldRender.js.map +1 -1
  328. package/lib/shouldRenderOptionalField.d.ts +2 -1
  329. package/lib/shouldRenderOptionalField.d.ts.map +1 -0
  330. package/lib/shouldRenderOptionalField.js +11 -10
  331. package/lib/shouldRenderOptionalField.js.map +1 -1
  332. package/lib/toConstant.d.ts +2 -1
  333. package/lib/toConstant.d.ts.map +1 -0
  334. package/lib/toConstant.js +1 -1
  335. package/lib/toConstant.js.map +1 -1
  336. package/lib/toDateString.d.ts +2 -1
  337. package/lib/toDateString.d.ts.map +1 -0
  338. package/lib/toErrorList.d.ts +2 -1
  339. package/lib/toErrorList.d.ts.map +1 -0
  340. package/lib/toErrorList.js +20 -21
  341. package/lib/toErrorList.js.map +1 -1
  342. package/lib/toErrorSchema.d.ts +2 -1
  343. package/lib/toErrorSchema.d.ts.map +1 -0
  344. package/lib/toErrorSchema.js +4 -9
  345. package/lib/toErrorSchema.js.map +1 -1
  346. package/lib/toFieldPathId.d.ts +2 -1
  347. package/lib/toFieldPathId.d.ts.map +1 -0
  348. package/lib/toFieldPathId.js +2 -2
  349. package/lib/toFieldPathId.js.map +1 -1
  350. package/lib/types.d.ts +15 -5
  351. package/lib/types.d.ts.map +1 -0
  352. package/lib/types.js +1 -1
  353. package/lib/types.js.map +1 -1
  354. package/lib/unwrapErrorHandler.d.ts +2 -1
  355. package/lib/unwrapErrorHandler.d.ts.map +1 -0
  356. package/lib/unwrapErrorHandler.js +13 -4
  357. package/lib/unwrapErrorHandler.js.map +1 -1
  358. package/lib/useAltDateWidgetProps.d.ts +3 -2
  359. package/lib/useAltDateWidgetProps.d.ts.map +1 -0
  360. package/lib/useAltDateWidgetProps.js +5 -5
  361. package/lib/useAltDateWidgetProps.js.map +1 -1
  362. package/lib/useDeepCompareMemo.d.ts +1 -0
  363. package/lib/useDeepCompareMemo.d.ts.map +1 -0
  364. package/lib/useDeepCompareMemo.js +1 -1
  365. package/lib/useDeepCompareMemo.js.map +1 -1
  366. package/lib/useFileWidgetProps.d.ts +1 -0
  367. package/lib/useFileWidgetProps.d.ts.map +1 -0
  368. package/lib/useFileWidgetProps.js +3 -4
  369. package/lib/useFileWidgetProps.js.map +1 -1
  370. package/lib/utcToLocal.d.ts +1 -0
  371. package/lib/utcToLocal.d.ts.map +1 -0
  372. package/lib/utcToLocal.js +1 -1
  373. package/lib/utcToLocal.js.map +1 -1
  374. package/lib/validationDataMerge.d.ts +2 -1
  375. package/lib/validationDataMerge.d.ts.map +1 -0
  376. package/lib/validationDataMerge.js +3 -4
  377. package/lib/validationDataMerge.js.map +1 -1
  378. package/lib/withIdRefPrefix.d.ts +2 -1
  379. package/lib/withIdRefPrefix.d.ts.map +1 -0
  380. package/lib/withIdRefPrefix.js +2 -2
  381. package/lib/withIdRefPrefix.js.map +1 -1
  382. package/package.json +5 -6
  383. package/src/ErrorSchemaBuilder.ts +25 -24
  384. package/src/SelectedOptionDescription.tsx +5 -5
  385. package/src/allowAdditionalItems.ts +2 -2
  386. package/src/asNumber.ts +1 -1
  387. package/src/canExpand.ts +2 -2
  388. package/src/constIsAjvDataReference.ts +5 -4
  389. package/src/createErrorHandler.ts +5 -7
  390. package/src/createSchemaUtils.ts +8 -10
  391. package/src/dateRangeOptions.ts +2 -2
  392. package/src/englishStringTranslator.ts +2 -2
  393. package/src/enumOptionSelectedValue.ts +2 -2
  394. package/src/enumOptionValueDecoder.ts +2 -2
  395. package/src/enumOptionValueEncoder.ts +2 -4
  396. package/src/enumOptionsDeselectValue.ts +3 -3
  397. package/src/enumOptionsIndexForValue.ts +2 -2
  398. package/src/enumOptionsIsSelected.ts +2 -2
  399. package/src/enumOptionsSelectValue.ts +3 -5
  400. package/src/enumOptionsValueForIndex.ts +1 -1
  401. package/src/findSchemaDefinition.ts +8 -12
  402. package/src/getChangedFields.ts +57 -18
  403. package/src/getDateElementProps.ts +1 -1
  404. package/src/getDiscriminatorFieldFromSchema.ts +5 -7
  405. package/src/getInputProps.ts +6 -2
  406. package/src/getOptionMatchingSimpleDiscriminator.ts +7 -7
  407. package/src/getOptionValueFormat.ts +1 -1
  408. package/src/getPropertySchema.ts +18 -0
  409. package/src/getSchemaType.ts +2 -2
  410. package/src/getSubmitButtonOptions.ts +3 -3
  411. package/src/getTemplate.ts +1 -1
  412. package/src/getTestIds.ts +7 -6
  413. package/src/getUiOptions.ts +3 -3
  414. package/src/getWidget.tsx +6 -6
  415. package/src/hasWidget.ts +2 -2
  416. package/src/hashForSchema.ts +1 -1
  417. package/src/idGenerators.ts +3 -5
  418. package/src/index.ts +99 -85
  419. package/src/isConstant.ts +2 -2
  420. package/src/isCustomWidget.ts +2 -2
  421. package/src/isFixedItems.ts +2 -2
  422. package/src/isFormDataAvailable.ts +7 -5
  423. package/src/isObject.ts +15 -3
  424. package/src/isPlainObject.ts +14 -0
  425. package/src/isRootSchema.ts +3 -3
  426. package/src/logUnsupportedDefaultForEnum.ts +2 -2
  427. package/src/lookupFromFormContext.ts +7 -8
  428. package/src/mergeDefaultsWithFormData.ts +22 -18
  429. package/src/mergeObjects.ts +2 -2
  430. package/src/mergeSchemas.ts +5 -7
  431. package/src/nameGenerators.ts +1 -1
  432. package/src/noop.ts +4 -0
  433. package/src/optionsList.ts +9 -9
  434. package/src/orderProperties.ts +1 -1
  435. package/src/parseDateString.ts +1 -1
  436. package/src/parser/ParserValidator.ts +5 -7
  437. package/src/parser/index.ts +2 -2
  438. package/src/parser/schemaParser.ts +8 -10
  439. package/src/pathUtils.ts +203 -0
  440. package/src/rangeSpec.ts +1 -1
  441. package/src/removeOptionalEmptyObjects.ts +3 -3
  442. package/src/resolveUiSchema.ts +5 -7
  443. package/src/schema/findFieldInSchema.ts +11 -13
  444. package/src/schema/findSelectedOptionInXxxOf.ts +9 -10
  445. package/src/schema/getClosestMatchingOption.ts +73 -83
  446. package/src/schema/getDefaultFormState.ts +62 -34
  447. package/src/schema/getDisplayLabel.ts +7 -7
  448. package/src/schema/getFirstMatchingOption.ts +10 -11
  449. package/src/schema/getFromSchema.ts +12 -14
  450. package/src/schema/index.ts +14 -14
  451. package/src/schema/isFilesArray.ts +3 -3
  452. package/src/schema/isMultiSelect.ts +2 -2
  453. package/src/schema/isSelect.ts +3 -3
  454. package/src/schema/omitExtraData.ts +104 -68
  455. package/src/schema/retrieveSchema.ts +47 -60
  456. package/src/schema/sanitizeDataForNewSchema.ts +42 -41
  457. package/src/schema/toPathSchema.ts +14 -14
  458. package/src/schemaRequiresTrueValue.ts +1 -1
  459. package/src/shouldRender.ts +3 -3
  460. package/src/shouldRenderOptionalField.ts +14 -14
  461. package/src/toConstant.ts +2 -2
  462. package/src/toDateString.ts +1 -1
  463. package/src/toErrorList.ts +22 -25
  464. package/src/toErrorSchema.ts +5 -11
  465. package/src/toFieldPathId.ts +2 -2
  466. package/src/types.ts +14 -5
  467. package/src/unwrapErrorHandler.ts +15 -6
  468. package/src/useAltDateWidgetProps.tsx +7 -7
  469. package/src/useDeepCompareMemo.ts +1 -1
  470. package/src/useFileWidgetProps.ts +1 -1
  471. package/src/utcToLocal.ts +1 -1
  472. package/src/validationDataMerge.ts +4 -6
  473. package/src/withIdRefPrefix.ts +3 -4
  474. package/lib/tsconfig.tsbuildinfo +0 -1
  475. package/src/tsconfig.json +0 -9
@@ -1,7 +1,5 @@
1
- import get from 'lodash/get';
2
- import has from 'lodash/has';
3
-
4
- import { ANY_OF_KEY, ONE_OF_KEY, PROPERTIES_KEY, REQUIRED_KEY } from '../constants';
1
+ import { ANY_OF_KEY, ONE_OF_KEY, PROPERTIES_KEY, REQUIRED_KEY } from '../constants.ts';
2
+ import { getByPath, hasByPath } from '../pathUtils.ts';
5
3
  import type {
6
4
  Experimental_CustomMergeAllOf,
7
5
  FormContextType,
@@ -10,9 +8,9 @@ import type {
10
8
  SchemaFieldPath,
11
9
  StrictRJSFSchema,
12
10
  ValidatorType,
13
- } from '../types';
14
- import findSelectedOptionInXxxOf from './findSelectedOptionInXxxOf';
15
- import getFromSchema from './getFromSchema';
11
+ } from '../types.ts';
12
+ import findSelectedOptionInXxxOf from './findSelectedOptionInXxxOf.ts';
13
+ import getFromSchema from './getFromSchema.ts';
16
14
 
17
15
  /** Unique schema that represents no schema was found, exported for testing purposes */
18
16
  export const NOT_FOUND_SCHEMA = { title: '!@#$_UNKNOWN_$#@!' };
@@ -60,7 +58,7 @@ export default function findFieldInSchema<
60
58
  {} as S,
61
59
  experimental_customMergeAllOf,
62
60
  );
63
- if (has(parentField, ONE_OF_KEY)) {
61
+ if (hasByPath(parentField, ONE_OF_KEY)) {
64
62
  // if this sub-path has a `oneOf` then use the formData to drill into the schema with the selected option
65
63
  parentField = findSelectedOptionInXxxOf(
66
64
  validator,
@@ -68,10 +66,10 @@ export default function findFieldInSchema<
68
66
  parentField,
69
67
  fieldNameKey,
70
68
  ONE_OF_KEY,
71
- get(formData, subPath),
69
+ getByPath<T>(formData, subPath),
72
70
  experimental_customMergeAllOf,
73
71
  )!;
74
- } else if (has(parentField, ANY_OF_KEY)) {
72
+ } else if (hasByPath(parentField, ANY_OF_KEY)) {
75
73
  // if this sub-path has a `anyOf` then use the formData to drill into the schema with the selected option
76
74
  parentField = findSelectedOptionInXxxOf(
77
75
  validator,
@@ -79,14 +77,14 @@ export default function findFieldInSchema<
79
77
  parentField,
80
78
  fieldNameKey,
81
79
  ANY_OF_KEY,
82
- get(formData, subPath),
80
+ getByPath<T>(formData, subPath),
83
81
  experimental_customMergeAllOf,
84
82
  )!;
85
83
  }
86
84
  });
87
85
  }
88
86
 
89
- if (has(parentField, ONE_OF_KEY)) {
87
+ if (hasByPath(parentField, ONE_OF_KEY)) {
90
88
  // When oneOf is in the root schema, use the formData to drill into the schema with the selected option
91
89
  parentField = findSelectedOptionInXxxOf(
92
90
  validator,
@@ -97,7 +95,7 @@ export default function findFieldInSchema<
97
95
  formData,
98
96
  experimental_customMergeAllOf,
99
97
  )!;
100
- } else if (has(parentField, ANY_OF_KEY)) {
98
+ } else if (hasByPath(parentField, ANY_OF_KEY)) {
101
99
  // When anyOf is in the root schema, use the formData to drill into the schema with the selected option
102
100
  parentField = findSelectedOptionInXxxOf(
103
101
  validator,
@@ -1,16 +1,15 @@
1
- import get from 'lodash/get';
2
-
3
- import { CONST_KEY, DEFAULT_KEY, PROPERTIES_KEY } from '../constants';
4
- import deepEquals from '../deepEquals';
5
- import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema';
1
+ import { CONST_KEY, DEFAULT_KEY, PROPERTIES_KEY } from '../constants.ts';
2
+ import deepEquals from '../deepEquals.ts';
3
+ import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema.ts';
4
+ import { getByPath } from '../pathUtils.ts';
6
5
  import type {
7
6
  Experimental_CustomMergeAllOf,
8
7
  FormContextType,
9
8
  RJSFSchema,
10
9
  StrictRJSFSchema,
11
10
  ValidatorType,
12
- } from '../types';
13
- import retrieveSchema from './retrieveSchema';
11
+ } from '../types.ts';
12
+ import retrieveSchema from './retrieveSchema.ts';
14
13
 
15
14
  /** Finds the option inside the `schema['any/oneOf']` list which has the `properties[selectorField].default` or
16
15
  * `properties[selectorField].const` that matches the `formData[selectorField]` value. For the purposes of this
@@ -45,14 +44,14 @@ export default function findSelectedOptionInXxxOf<
45
44
  const xxxOfs = schema[xxx].map((xxxOf) =>
46
45
  retrieveSchema<T, S, F>(validator, xxxOf as S, rootSchema, formData, experimental_customMergeAllOf),
47
46
  );
48
- const data = get(formData, selectorField);
47
+ const data = getByPath(formData, selectorField);
49
48
  if (data !== undefined) {
50
49
  return xxxOfs.find((xxxOfOption) =>
51
50
  deepEquals(
52
- get(
51
+ getByPath(
53
52
  xxxOfOption,
54
53
  [PROPERTIES_KEY, selectorField, DEFAULT_KEY],
55
- get(xxxOfOption, [PROPERTIES_KEY, selectorField, CONST_KEY]),
54
+ getByPath(xxxOfOption, [PROPERTIES_KEY, selectorField, CONST_KEY]),
56
55
  ),
57
56
  data,
58
57
  ),
@@ -1,24 +1,18 @@
1
- import get from 'lodash/get';
2
- import has from 'lodash/has';
3
- import isNumber from 'lodash/isNumber';
4
- import isObject from 'lodash/isObject';
5
- import isString from 'lodash/isString';
6
- import reduce from 'lodash/reduce';
7
- import times from 'lodash/times';
8
-
9
- import { ONE_OF_KEY, REF_KEY, JUNK_OPTION_ID, ANY_OF_KEY } from '../constants';
10
- import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema';
11
- import getOptionMatchingSimpleDiscriminator from '../getOptionMatchingSimpleDiscriminator';
12
- import guessType from '../guessType';
1
+ import { ONE_OF_KEY, REF_KEY, JUNK_OPTION_ID, ANY_OF_KEY } from '../constants.ts';
2
+ import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema.ts';
3
+ import getOptionMatchingSimpleDiscriminator from '../getOptionMatchingSimpleDiscriminator.ts';
4
+ import guessType from '../guessType.ts';
5
+ import isObject from '../isObject.ts';
6
+ import { getByPath, hasByPath } from '../pathUtils.ts';
13
7
  import type {
14
8
  Experimental_CustomMergeAllOf,
15
9
  FormContextType,
16
10
  RJSFSchema,
17
11
  StrictRJSFSchema,
18
12
  ValidatorType,
19
- } from '../types';
20
- import getFirstMatchingOption from './getFirstMatchingOption';
21
- import retrieveSchema, { resolveAllReferences } from './retrieveSchema';
13
+ } from '../types.ts';
14
+ import getFirstMatchingOption from './getFirstMatchingOption.ts';
15
+ import retrieveSchema, { resolveAllReferences } from './retrieveSchema.ts';
22
16
 
23
17
  /** A junk option used to determine when the getFirstMatchingOption call really matches an option rather than returning
24
18
  * the first item
@@ -64,77 +58,73 @@ export function calculateIndexScore<T = any, S extends StrictRJSFSchema = RJSFSc
64
58
  let totalScore = 0;
65
59
  if (schema) {
66
60
  if (isObject(schema.properties)) {
67
- totalScore += reduce(
68
- schema.properties,
69
- (score, value, key) => {
70
- const formValue = get(formData, key);
71
- if (typeof value === 'boolean') {
72
- return score;
73
- }
74
- if (has(value, REF_KEY)) {
75
- const newSchema = retrieveSchema<T, S, F>(
61
+ totalScore += Object.entries(schema.properties).reduce((score, [key, value]) => {
62
+ const formValue = formData?.[key];
63
+ if (typeof value === 'boolean') {
64
+ return score;
65
+ }
66
+ if (hasByPath(value, REF_KEY)) {
67
+ const newSchema = retrieveSchema<T, S, F>(
68
+ validator,
69
+ value as S,
70
+ rootSchema,
71
+ formValue,
72
+ experimental_customMergeAllOf,
73
+ );
74
+ return (
75
+ score +
76
+ calculateIndexScore<T, S, F>(
77
+ validator,
78
+ rootSchema,
79
+ newSchema,
80
+ formValue || {},
81
+ experimental_customMergeAllOf,
82
+ )
83
+ );
84
+ }
85
+ if ((hasByPath(value, ONE_OF_KEY) || hasByPath(value, ANY_OF_KEY)) && formValue) {
86
+ const xxxOfKey = hasByPath(value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
87
+ const discriminator = getDiscriminatorFieldFromSchema<S>(value as S);
88
+ return (
89
+ score +
90
+ getClosestMatchingOption<T, S, F>(
76
91
  validator,
77
- value as S,
78
92
  rootSchema,
79
93
  formValue,
94
+ getByPath<S[]>(value, xxxOfKey),
95
+ -1,
96
+ discriminator,
80
97
  experimental_customMergeAllOf,
81
- );
82
- return (
83
- score +
84
- calculateIndexScore<T, S, F>(
85
- validator,
86
- rootSchema,
87
- newSchema,
88
- formValue || {},
89
- experimental_customMergeAllOf,
90
- )
91
- );
92
- }
93
- if ((has(value, ONE_OF_KEY) || has(value, ANY_OF_KEY)) && formValue) {
94
- const xxxOfKey = has(value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
95
- const discriminator = getDiscriminatorFieldFromSchema<S>(value as S);
96
- return (
97
- score +
98
- getClosestMatchingOption<T, S, F>(
99
- validator,
100
- rootSchema,
101
- formValue,
102
- get(value, xxxOfKey) as S[],
103
- -1,
104
- discriminator,
105
- experimental_customMergeAllOf,
106
- )
107
- );
108
- }
109
- if (value.type === 'object') {
110
- // If the structure is matching then give it a little boost in score
111
- const structureBoost = isObject(formValue) ? 1 : 0;
112
- return (
113
- score +
114
- structureBoost +
115
- calculateIndexScore<T, S, F>(validator, rootSchema, value as S, formValue, experimental_customMergeAllOf)
116
- );
98
+ )
99
+ );
100
+ }
101
+ if (value.type === 'object') {
102
+ // If the structure is matching then give it a little boost in score
103
+ const structureBoost = typeof formValue === 'object' && formValue !== null ? 1 : 0;
104
+ return (
105
+ score +
106
+ structureBoost +
107
+ calculateIndexScore<T, S, F>(validator, rootSchema, value as S, formValue, experimental_customMergeAllOf)
108
+ );
109
+ }
110
+ if (value.type === guessType(formValue)) {
111
+ // If the types match, then we bump the score by one
112
+ let newScore = score + 1;
113
+ if (value.default) {
114
+ // If the schema contains a readonly default value score the value that matches the default higher and
115
+ // any non-matching value lower
116
+ newScore += formValue === value.default ? 1 : -1;
117
+ } else if (value.const) {
118
+ // If the schema contains a const value score the value that matches the default higher and
119
+ // any non-matching value lower
120
+ newScore += formValue === value.const ? 1 : -1;
117
121
  }
118
- if (value.type === guessType(formValue)) {
119
- // If the types match, then we bump the score by one
120
- let newScore = score + 1;
121
- if (value.default) {
122
- // If the schema contains a readonly default value score the value that matches the default higher and
123
- // any non-matching value lower
124
- newScore += formValue === value.default ? 1 : -1;
125
- } else if (value.const) {
126
- // If the schema contains a const value score the value that matches the default higher and
127
- // any non-matching value lower
128
- newScore += formValue === value.const ? 1 : -1;
129
- }
130
- // TODO eventually, deal with enums/arrays
131
- return newScore;
132
- }
133
- return score;
134
- },
135
- 0,
136
- );
137
- } else if (isString(schema.type) && schema.type === guessType(formData)) {
122
+ // TODO eventually, deal with enums/arrays
123
+ return newScore;
124
+ }
125
+ return score;
126
+ }, 0);
127
+ } else if (typeof schema.type === 'string' && schema.type === guessType(formData)) {
138
128
  totalScore += 1;
139
129
  }
140
130
  }
@@ -181,7 +171,7 @@ export default function getClosestMatchingOption<
181
171
  const resolvedOptions = options.map((option) => resolveAllReferences<S>(option, rootSchema, []));
182
172
 
183
173
  const simpleDiscriminatorMatch = getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField);
184
- if (isNumber(simpleDiscriminatorMatch)) {
174
+ if (typeof simpleDiscriminatorMatch === 'number') {
185
175
  return simpleDiscriminatorMatch;
186
176
  }
187
177
 
@@ -202,7 +192,7 @@ export default function getClosestMatchingOption<
202
192
  }
203
193
  if (!allValidIndexes.length) {
204
194
  // No indexes were valid, so we'll score all the options, add all the indexes
205
- times(resolvedOptions.length, (i) => allValidIndexes.push(i));
195
+ allValidIndexes.push(...resolvedOptions.keys());
206
196
  }
207
197
  interface BestType {
208
198
  bestIndex: number;
@@ -1,6 +1,4 @@
1
1
  import type { JSONSchema7Object } from 'json-schema';
2
- import get from 'lodash/get';
3
- import isEmpty from 'lodash/isEmpty';
4
2
 
5
3
  import {
6
4
  ALL_OF_KEY,
@@ -10,21 +8,22 @@ import {
10
8
  DEPENDENCIES_KEY,
11
9
  IF_KEY,
12
10
  ONE_OF_KEY,
13
- PROPERTIES_KEY,
14
11
  REF_KEY,
15
- } from '../constants';
16
- import constIsAjvDataReference from '../constIsAjvDataReference';
17
- import deepEquals from '../deepEquals';
18
- import findSchemaDefinition from '../findSchemaDefinition';
19
- import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema';
20
- import getSchemaType from '../getSchemaType';
21
- import isConstant from '../isConstant';
22
- import isFixedItems from '../isFixedItems';
23
- import isObject from '../isObject';
24
- import mergeDefaultsWithFormData from '../mergeDefaultsWithFormData';
25
- import mergeObjects from '../mergeObjects';
26
- import mergeSchemas from '../mergeSchemas';
27
- import optionsList from '../optionsList';
12
+ } from '../constants.ts';
13
+ import constIsAjvDataReference from '../constIsAjvDataReference.ts';
14
+ import deepEquals from '../deepEquals.ts';
15
+ import findSchemaDefinition from '../findSchemaDefinition.ts';
16
+ import getDiscriminatorFieldFromSchema from '../getDiscriminatorFieldFromSchema.ts';
17
+ import getPropertySchema from '../getPropertySchema.ts';
18
+ import getSchemaType from '../getSchemaType.ts';
19
+ import isConstant from '../isConstant.ts';
20
+ import isFixedItems from '../isFixedItems.ts';
21
+ import isObject from '../isObject.ts';
22
+ import mergeDefaultsWithFormData from '../mergeDefaultsWithFormData.ts';
23
+ import mergeObjects from '../mergeObjects.ts';
24
+ import mergeSchemas from '../mergeSchemas.ts';
25
+ import optionsList from '../optionsList.ts';
26
+ import { getByPath } from '../pathUtils.ts';
28
27
  import type {
29
28
  Experimental_CustomMergeAllOf,
30
29
  Experimental_DefaultFormStateBehavior,
@@ -33,11 +32,11 @@ import type {
33
32
  RJSFSchema,
34
33
  StrictRJSFSchema,
35
34
  ValidatorType,
36
- } from '../types';
37
- import getClosestMatchingOption from './getClosestMatchingOption';
38
- import isMultiSelect from './isMultiSelect';
39
- import isSelect from './isSelect';
40
- import retrieveSchema, { resolveDependencies } from './retrieveSchema';
35
+ } from '../types.ts';
36
+ import getClosestMatchingOption from './getClosestMatchingOption.ts';
37
+ import isMultiSelect from './isMultiSelect.ts';
38
+ import isSelect from './isSelect.ts';
39
+ import retrieveSchema, { resolveDependencies } from './retrieveSchema.ts';
41
40
 
42
41
  const PRIMITIVE_TYPES = ['string', 'number', 'integer', 'boolean', 'null'];
43
42
 
@@ -85,6 +84,22 @@ export function getInnerSchemaForArrayItem<S extends StrictRJSFSchema = RJSFSche
85
84
  return {} as S;
86
85
  }
87
86
 
87
+ /** Determines whether `value` holds anything: a non-empty string or array, or an object with at least one own key.
88
+ * Everything else — including numbers, booleans, `null` and `undefined` — has no content.
89
+ *
90
+ * @param value - The value to inspect
91
+ * @returns - True if the value holds content, otherwise false
92
+ */
93
+ function hasContent(value: unknown): boolean {
94
+ if (typeof value === 'string' || Array.isArray(value)) {
95
+ return value.length > 0;
96
+ }
97
+ if (typeof value === 'object' && value !== null) {
98
+ return Object.keys(value).length > 0;
99
+ }
100
+ return false;
101
+ }
102
+
88
103
  /** Checks if the given `schema` contains the `null` type along with another type AND if the `default` contained within
89
104
  * the schema is `null` AND the `computedDefault` is empty. If all of those conditions are true, then the `schema`'s
90
105
  * default should be `null` rather than `computedDefault`.
@@ -99,7 +114,7 @@ export function computeDefaultBasedOnSchemaTypeAndDefaults<T = any, S extends St
99
114
  ) {
100
115
  const { default: schemaDefault, type } = schema;
101
116
  const shouldReturnNullAsDefault =
102
- Array.isArray(type) && type.includes('null') && isEmpty(computedDefault) && schemaDefault === null;
117
+ Array.isArray(type) && type.includes('null') && !hasContent(computedDefault) && schemaDefault === null;
103
118
  return shouldReturnNullAsDefault ? (null as T) : computedDefault;
104
119
  }
105
120
 
@@ -144,7 +159,11 @@ function maybeAddDefaultToObject<T = any>(
144
159
  } else if (includeUndefinedValues === 'excludeObjectChildren') {
145
160
  // Fix for Issue #4709: When in 'excludeObjectChildren' mode, don't set primitive fields to empty objects
146
161
  // Only add the computed default if it's not an empty object placeholder for a primitive field
147
- if ((isNullType && computedDefault !== undefined) || !isObject(computedDefault) || !isEmpty(computedDefault)) {
162
+ if (
163
+ (isNullType && computedDefault !== undefined) ||
164
+ !isObject(computedDefault) ||
165
+ Object.keys(computedDefault).length > 0
166
+ ) {
148
167
  acc[key] = computedDefault;
149
168
  }
150
169
  // If computedDefault is an empty object {}, don't add it - let the field stay undefined
@@ -156,14 +175,14 @@ function maybeAddDefaultToObject<T = any>(
156
175
  if (isObject(computedDefault)) {
157
176
  // If emptyObjectFields 'skipEmptyDefaults' store computedDefault if it's a non-empty object(e.g. not {})
158
177
  if (emptyObjectFields === 'skipEmptyDefaults') {
159
- if (!isEmpty(computedDefault)) {
178
+ if (Object.keys(computedDefault).length > 0) {
160
179
  acc[key] = computedDefault;
161
180
  }
162
181
  } // Else store computedDefault if it's a non-empty object(e.g. not {}) and satisfies certain conditions
163
182
  // Condition 1: If computedDefault is not empty or if the key is a required field
164
183
  // Condition 2: If the parent object is required or emptyObjectFields is not 'populateRequiredDefaults'
165
184
  else if (
166
- (!isEmpty(computedDefault) || requiredFields.includes(key)) &&
185
+ (Object.keys(computedDefault).length > 0 || requiredFields.includes(key)) &&
167
186
  (isSelfOrParentRequired || emptyObjectFields !== 'populateRequiredDefaults')
168
187
  ) {
169
188
  acc[key] = computedDefault;
@@ -293,7 +312,8 @@ export function computeDefaults<T = any, S extends StrictRJSFSchema = RJSFSchema
293
312
  // Then set the defaults from the current schema for the referenced schema.
294
313
  // Only do this if rawFormData has no meaningful data - we don't want to override user's existing values.
295
314
  // Check for undefined OR empty object - rawFormData may be coerced to {} when not an object.
296
- const hasNoExistingData = rawFormData === undefined || (isObject(rawFormData) && isEmpty(rawFormData));
315
+ const hasNoExistingData =
316
+ rawFormData === undefined || (isObject(rawFormData) && Object.keys(rawFormData).length === 0);
297
317
  if (schemaToCompute && !defaults && hasNoExistingData) {
298
318
  defaults = schema.default as T | undefined;
299
319
  }
@@ -483,13 +503,13 @@ export function ensureFormDataMatchingSchema<
483
503
  } else if (isObject(validFormData) && isObject(schemaToMatch.properties)) {
484
504
  validFormData = Object.keys(schemaToMatch.properties).reduce(
485
505
  (acc: GenericObjectType, key: string) => {
486
- const propertySchema: S = get(schemaToMatch, [PROPERTIES_KEY, key], {}) as S;
506
+ const propertySchema = getPropertySchema<S>(schemaToMatch, key);
487
507
  if (key in acc && (shouldRetrieveAllOf || (isObject(propertySchema) && ALL_OF_KEY in propertySchema))) {
488
508
  acc[key] = ensureFormDataMatchingSchema<T, S, F>(
489
509
  validator,
490
510
  propertySchema,
491
511
  rootSchema,
492
- get(acc, key),
512
+ acc[key],
493
513
  experimental_defaultFormStateBehavior,
494
514
  experimental_customMergeAllOf,
495
515
  );
@@ -543,7 +563,7 @@ export function getObjectDefaults<T = any, S extends StrictRJSFSchema = RJSFSche
543
563
  const parentConst = retrievedSchema[CONST_KEY];
544
564
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
545
565
  (acc: GenericObjectType, key: string) => {
546
- const propertySchema: S = get(retrievedSchema, [PROPERTIES_KEY, key], {}) as S;
566
+ const propertySchema = getPropertySchema<S>(retrievedSchema, key);
547
567
  // Check if the parent schema has a const property defined AND we are supporting const as defaults, then we
548
568
  // should always return the computedDefault since it's coming from the const.
549
569
  const hasParentConst = isObject(parentConst) && (parentConst as JSONSchema7Object)[key] !== undefined;
@@ -559,8 +579,8 @@ export function getObjectDefaults<T = any, S extends StrictRJSFSchema = RJSFSche
559
579
  experimental_defaultFormStateBehavior,
560
580
  experimental_customMergeAllOf,
561
581
  includeUndefinedValues: includeUndefinedValues === true,
562
- parentDefaults: get(defaults, [key]),
563
- rawFormData: get(formData, [key]),
582
+ parentDefaults: getByPath<T>(defaults, key),
583
+ rawFormData: getByPath<T>(formData, key),
564
584
  required: retrievedSchema.required?.includes(key),
565
585
  shouldMergeDefaultsIntoFormData,
566
586
  initialDefaultsGenerated,
@@ -611,8 +631,8 @@ export function getObjectDefaults<T = any, S extends StrictRJSFSchema = RJSFSche
611
631
  experimental_defaultFormStateBehavior,
612
632
  experimental_customMergeAllOf,
613
633
  includeUndefinedValues: includeUndefinedValues === true,
614
- parentDefaults: get(defaults, [key]),
615
- rawFormData: get(formData, [key]),
634
+ parentDefaults: getByPath<T>(defaults, key),
635
+ rawFormData: getByPath<T>(formData, key),
616
636
  required: retrievedSchema.required?.includes(key),
617
637
  shouldMergeDefaultsIntoFormData,
618
638
  initialDefaultsGenerated,
@@ -702,7 +722,7 @@ export function getArrayDefaults<T = any, S extends StrictRJSFSchema = RJSFSchem
702
722
  experimental_defaultFormStateBehavior,
703
723
  experimental_customMergeAllOf,
704
724
  rawFormData: item,
705
- parentDefaults: get(defaults, [idx]),
725
+ parentDefaults: getByPath<T>(defaults, idx),
706
726
  required,
707
727
  shouldMergeDefaultsIntoFormData,
708
728
  initialDefaultsGenerated,
@@ -792,6 +812,14 @@ export function getDefaultBasedOnSchemaType<
792
812
  case 'array': {
793
813
  return getArrayDefaults(validator, rawSchema, computeDefaultsProps, defaults as T[]);
794
814
  }
815
+ case 'boolean': {
816
+ // A required boolean with no explicit default gets false — it must be
817
+ // present in the submitted data, and false is the natural zero-value.
818
+ if (computeDefaultsProps.required && defaults === undefined) {
819
+ return false as unknown as T;
820
+ }
821
+ return undefined;
822
+ }
795
823
  default:
796
824
  return undefined;
797
825
  }
@@ -1,7 +1,7 @@
1
- import { ADDITIONAL_PROPERTY_FLAG, UI_FIELD_KEY, UI_WIDGET_KEY } from '../constants';
2
- import getSchemaType from '../getSchemaType';
3
- import getUiOptions from '../getUiOptions';
4
- import isCustomWidget from '../isCustomWidget';
1
+ import { ADDITIONAL_PROPERTY_FLAG, UI_FIELD_KEY, UI_WIDGET_KEY } from '../constants.ts';
2
+ import getSchemaType from '../getSchemaType.ts';
3
+ import getUiOptions from '../getUiOptions.ts';
4
+ import isCustomWidget from '../isCustomWidget.ts';
5
5
  import type {
6
6
  FormContextType,
7
7
  GlobalUISchemaOptions,
@@ -11,9 +11,9 @@ import type {
11
11
  UiSchema,
12
12
  ValidatorType,
13
13
  Experimental_CustomMergeAllOf,
14
- } from '../types';
15
- import isFilesArray from './isFilesArray';
16
- import isMultiSelect from './isMultiSelect';
14
+ } from '../types.ts';
15
+ import isFilesArray from './isFilesArray.ts';
16
+ import isMultiSelect from './isMultiSelect.ts';
17
17
 
18
18
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
19
19
  * should be displayed in a UI.
@@ -1,10 +1,7 @@
1
- import get from 'lodash/get';
2
- import has from 'lodash/has';
3
- import isNumber from 'lodash/isNumber';
4
-
5
- import { PROPERTIES_KEY } from '../constants';
6
- import getOptionMatchingSimpleDiscriminator from '../getOptionMatchingSimpleDiscriminator';
7
- import type { FormContextType, RJSFSchema, StrictRJSFSchema, ValidatorType } from '../types';
1
+ import { PROPERTIES_KEY } from '../constants.ts';
2
+ import getOptionMatchingSimpleDiscriminator from '../getOptionMatchingSimpleDiscriminator.ts';
3
+ import { getByPath } from '../pathUtils.ts';
4
+ import type { FormContextType, RJSFSchema, StrictRJSFSchema, ValidatorType } from '../types.ts';
8
5
 
9
6
  /** Given the `formData` and list of `options`, attempts to find the index of the first option that matches the data.
10
7
  * Always returns the first option if there is nothing that matches.
@@ -35,7 +32,7 @@ export default function getFirstMatchingOption<
35
32
  }
36
33
 
37
34
  const simpleDiscriminatorMatch = getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField);
38
- if (isNumber(simpleDiscriminatorMatch)) {
35
+ if (typeof simpleDiscriminatorMatch === 'number') {
39
36
  return simpleDiscriminatorMatch;
40
37
  }
41
38
 
@@ -43,9 +40,11 @@ export default function getFirstMatchingOption<
43
40
  const option = options[i];
44
41
 
45
42
  // If we have a discriminator field, then we will use this to make the determination
46
- if (discriminatorField && has(option, [PROPERTIES_KEY, discriminatorField])) {
47
- const value = get(formData, discriminatorField);
48
- const discriminator: S = get(option, [PROPERTIES_KEY, discriminatorField], {}) as S;
43
+ const discriminator = discriminatorField
44
+ ? (option[PROPERTIES_KEY]?.[discriminatorField] as S | undefined)
45
+ : undefined;
46
+ if (discriminatorField && discriminator !== undefined) {
47
+ const value = getByPath<T>(formData, discriminatorField);
49
48
  if (validator.isValid(discriminator, value, rootSchema)) {
50
49
  return i;
51
50
  }
@@ -1,8 +1,5 @@
1
- import get from 'lodash/get';
2
- import has from 'lodash/has';
3
- import isEmpty from 'lodash/isEmpty';
4
-
5
- import { REF_KEY } from '../constants';
1
+ import { REF_KEY } from '../constants.ts';
2
+ import { getByPath, hasByPath, toPath } from '../pathUtils.ts';
6
3
  import type {
7
4
  Experimental_CustomMergeAllOf,
8
5
  FormContextType,
@@ -10,10 +7,10 @@ import type {
10
7
  SchemaFieldPath,
11
8
  StrictRJSFSchema,
12
9
  ValidatorType,
13
- } from '../types';
14
- import retrieveSchema from './retrieveSchema';
10
+ } from '../types.ts';
11
+ import retrieveSchema from './retrieveSchema.ts';
15
12
 
16
- /** Internal helper function that acts like lodash's `get` but additionally retrieves `$ref`s as needed to get the path
13
+ /** Internal helper function that acts like `getByPath` but additionally retrieves `$ref`s as needed to get the path
17
14
  * for schemas containing potentially nested `$ref`s.
18
15
  *
19
16
  * @param validator - An implementation of the `ValidatorType` interface that will be forwarded to all the APIs
@@ -31,16 +28,17 @@ function getFromSchemaInternal<T = any, S extends StrictRJSFSchema = RJSFSchema,
31
28
  experimental_customMergeAllOf?: Experimental_CustomMergeAllOf<S>,
32
29
  ): T | S | undefined {
33
30
  let fieldSchema = schema;
34
- if (has(schema, REF_KEY)) {
31
+ // hasByPath instead of `in` because `schema` can be undefined at runtime when drilling past a non-matching xxxOf
32
+ if (hasByPath(schema, REF_KEY)) {
35
33
  fieldSchema = retrieveSchema<T, S, F>(validator, schema, rootSchema, undefined, experimental_customMergeAllOf);
36
34
  }
37
- if (isEmpty(path)) {
35
+ if (path.length === 0) {
38
36
  return fieldSchema;
39
37
  }
40
- const pathList = Array.isArray(path) ? [...path] : path.split('.');
38
+ const pathList = Array.isArray(path) ? [...path] : toPath(path);
41
39
  const [part, ...nestedPath] = pathList;
42
- if (part !== undefined && part !== '' && has(fieldSchema, part)) {
43
- fieldSchema = get(fieldSchema, part) as S;
40
+ if (part !== undefined && part !== '' && hasByPath(fieldSchema, part)) {
41
+ fieldSchema = getByPath<S>(fieldSchema, part);
44
42
  return getFromSchemaInternal<T, S, F>(
45
43
  validator,
46
44
  rootSchema,
@@ -52,7 +50,7 @@ function getFromSchemaInternal<T = any, S extends StrictRJSFSchema = RJSFSchema,
52
50
  return undefined;
53
51
  }
54
52
 
55
- /** Helper that acts like lodash's `get` but additionally retrieves `$ref`s as needed to get the path for schemas
53
+ /** Helper that acts like `getByPath` but additionally retrieves `$ref`s as needed to get the path for schemas
56
54
  * containing potentially nested `$ref`s.
57
55
  *
58
56
  * @param validator - An implementation of the `ValidatorType` interface that will be forwarded to all the APIs