@rjsf/utils 6.6.1 → 6.7.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 (289) hide show
  1. package/LICENSE.md +201 -0
  2. package/dist/index.cjs +534 -376
  3. package/dist/index.cjs.map +4 -4
  4. package/dist/utils.esm.js +534 -376
  5. package/dist/utils.esm.js.map +4 -4
  6. package/dist/utils.umd.js +561 -400
  7. package/lib/ErrorSchemaBuilder.d.ts +1 -1
  8. package/lib/SelectedOptionDescription.d.ts +4 -0
  9. package/lib/SelectedOptionDescription.js +24 -0
  10. package/lib/SelectedOptionDescription.js.map +1 -0
  11. package/lib/allowAdditionalItems.d.ts +1 -1
  12. package/lib/allowAdditionalItems.js +1 -0
  13. package/lib/allowAdditionalItems.js.map +1 -1
  14. package/lib/asNumber.js +2 -0
  15. package/lib/asNumber.js.map +1 -1
  16. package/lib/canExpand.d.ts +1 -1
  17. package/lib/constIsAjvDataReference.d.ts +1 -1
  18. package/lib/constants.d.ts +8 -5
  19. package/lib/constants.js +10 -7
  20. package/lib/constants.js.map +1 -1
  21. package/lib/createErrorHandler.d.ts +1 -1
  22. package/lib/createErrorHandler.js +2 -6
  23. package/lib/createErrorHandler.js.map +1 -1
  24. package/lib/createSchemaUtils.d.ts +1 -1
  25. package/lib/createSchemaUtils.js +3 -1
  26. package/lib/createSchemaUtils.js.map +1 -1
  27. package/lib/dataURItoBlob.js +3 -3
  28. package/lib/dataURItoBlob.js.map +1 -1
  29. package/lib/dateRangeOptions.d.ts +1 -1
  30. package/lib/dateRangeOptions.js +8 -7
  31. package/lib/dateRangeOptions.js.map +1 -1
  32. package/lib/englishStringTranslator.d.ts +1 -1
  33. package/lib/enumOptionSelectedValue.d.ts +1 -1
  34. package/lib/enumOptionValueDecoder.d.ts +1 -1
  35. package/lib/enumOptionValueDecoder.js +1 -1
  36. package/lib/enumOptionValueDecoder.js.map +1 -1
  37. package/lib/enumOptionValueEncoder.d.ts +1 -1
  38. package/lib/enumOptionsDeselectValue.d.ts +1 -1
  39. package/lib/enumOptionsIndexForValue.d.ts +1 -1
  40. package/lib/enumOptionsIndexForValue.js.map +1 -1
  41. package/lib/enumOptionsIsSelected.d.ts +1 -1
  42. package/lib/enumOptionsSelectValue.d.ts +1 -1
  43. package/lib/enumOptionsValueForIndex.d.ts +2 -2
  44. package/lib/enumOptionsValueForIndex.js.map +1 -1
  45. package/lib/enums.d.ts +4 -0
  46. package/lib/enums.js +4 -0
  47. package/lib/enums.js.map +1 -1
  48. package/lib/findSchemaDefinition.d.ts +1 -1
  49. package/lib/findSchemaDefinition.js +15 -15
  50. package/lib/findSchemaDefinition.js.map +1 -1
  51. package/lib/getChangedFields.js +4 -6
  52. package/lib/getChangedFields.js.map +1 -1
  53. package/lib/getDateElementProps.d.ts +3 -3
  54. package/lib/getDiscriminatorFieldFromSchema.d.ts +1 -1
  55. package/lib/getDiscriminatorFieldFromSchema.js +1 -0
  56. package/lib/getDiscriminatorFieldFromSchema.js.map +1 -1
  57. package/lib/getInputProps.d.ts +1 -1
  58. package/lib/getOptionMatchingSimpleDiscriminator.d.ts +1 -1
  59. package/lib/getOptionMatchingSimpleDiscriminator.js +10 -11
  60. package/lib/getOptionMatchingSimpleDiscriminator.js.map +1 -1
  61. package/lib/getOptionValueFormat.d.ts +1 -1
  62. package/lib/getSchemaType.d.ts +1 -1
  63. package/lib/getSchemaType.js +2 -1
  64. package/lib/getSchemaType.js.map +1 -1
  65. package/lib/getSubmitButtonOptions.d.ts +1 -1
  66. package/lib/getSubmitButtonOptions.js +1 -1
  67. package/lib/getSubmitButtonOptions.js.map +1 -1
  68. package/lib/getTemplate.d.ts +1 -1
  69. package/lib/getTestIds.d.ts +1 -1
  70. package/lib/getUiOptions.d.ts +1 -1
  71. package/lib/getUiOptions.js +2 -1
  72. package/lib/getUiOptions.js.map +1 -1
  73. package/lib/getWidget.d.ts +1 -1
  74. package/lib/getWidget.js +4 -4
  75. package/lib/getWidget.js.map +1 -1
  76. package/lib/guessType.js +1 -1
  77. package/lib/guessType.js.map +1 -1
  78. package/lib/hasWidget.d.ts +1 -1
  79. package/lib/hashForSchema.d.ts +3 -1
  80. package/lib/hashForSchema.js +11 -4
  81. package/lib/hashForSchema.js.map +1 -1
  82. package/lib/idGenerators.d.ts +1 -1
  83. package/lib/index.d.ts +14 -7
  84. package/lib/index.js +5 -2
  85. package/lib/index.js.map +1 -1
  86. package/lib/isConstant.d.ts +1 -1
  87. package/lib/isCustomWidget.d.ts +1 -1
  88. package/lib/isCustomWidget.js +1 -1
  89. package/lib/isCustomWidget.js.map +1 -1
  90. package/lib/isFixedItems.d.ts +3 -3
  91. package/lib/isFixedItems.js +3 -3
  92. package/lib/isFixedItems.js.map +1 -1
  93. package/lib/isRootSchema.d.ts +1 -1
  94. package/lib/isRootSchema.js +2 -3
  95. package/lib/isRootSchema.js.map +1 -1
  96. package/lib/labelValue.d.ts +1 -1
  97. package/lib/logUnsupportedDefaultForEnum.d.ts +9 -0
  98. package/lib/logUnsupportedDefaultForEnum.js +18 -0
  99. package/lib/logUnsupportedDefaultForEnum.js.map +1 -0
  100. package/lib/lookupFromFormContext.d.ts +1 -1
  101. package/lib/mergeDefaultsWithFormData.js +6 -5
  102. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  103. package/lib/mergeObjects.d.ts +4 -2
  104. package/lib/mergeObjects.js +1 -1
  105. package/lib/mergeObjects.js.map +1 -1
  106. package/lib/mergeSchemas.d.ts +4 -2
  107. package/lib/mergeSchemas.js +13 -6
  108. package/lib/mergeSchemas.js.map +1 -1
  109. package/lib/nameGenerators.d.ts +1 -1
  110. package/lib/optionsList.d.ts +1 -1
  111. package/lib/optionsList.js +22 -21
  112. package/lib/optionsList.js.map +1 -1
  113. package/lib/orderProperties.js +3 -3
  114. package/lib/orderProperties.js.map +1 -1
  115. package/lib/pad.js +1 -1
  116. package/lib/pad.js.map +1 -1
  117. package/lib/parseDateString.d.ts +1 -1
  118. package/lib/parseDateString.js +1 -1
  119. package/lib/parseDateString.js.map +1 -1
  120. package/lib/parser/ParserValidator.d.ts +2 -4
  121. package/lib/parser/ParserValidator.js +2 -0
  122. package/lib/parser/ParserValidator.js.map +1 -1
  123. package/lib/parser/index.d.ts +1 -1
  124. package/lib/parser/schemaParser.d.ts +2 -2
  125. package/lib/parser/schemaParser.js +7 -7
  126. package/lib/parser/schemaParser.js.map +1 -1
  127. package/lib/rangeSpec.d.ts +1 -2
  128. package/lib/rangeSpec.js.map +1 -1
  129. package/lib/removeOptionalEmptyObjects.d.ts +1 -1
  130. package/lib/removeOptionalEmptyObjects.js +6 -8
  131. package/lib/removeOptionalEmptyObjects.js.map +1 -1
  132. package/lib/resolveUiSchema.d.ts +1 -1
  133. package/lib/resolveUiSchema.js +16 -16
  134. package/lib/resolveUiSchema.js.map +1 -1
  135. package/lib/schema/findFieldInSchema.d.ts +1 -1
  136. package/lib/schema/findSelectedOptionInXxxOf.d.ts +1 -1
  137. package/lib/schema/findSelectedOptionInXxxOf.js +1 -3
  138. package/lib/schema/findSelectedOptionInXxxOf.js.map +1 -1
  139. package/lib/schema/getClosestMatchingOption.d.ts +1 -1
  140. package/lib/schema/getClosestMatchingOption.js +6 -9
  141. package/lib/schema/getClosestMatchingOption.js.map +1 -1
  142. package/lib/schema/getDefaultFormState.d.ts +4 -4
  143. package/lib/schema/getDefaultFormState.js +81 -43
  144. package/lib/schema/getDefaultFormState.js.map +1 -1
  145. package/lib/schema/getDisplayLabel.d.ts +1 -1
  146. package/lib/schema/getDisplayLabel.js +2 -3
  147. package/lib/schema/getDisplayLabel.js.map +1 -1
  148. package/lib/schema/getFirstMatchingOption.d.ts +1 -1
  149. package/lib/schema/getFirstMatchingOption.js +2 -2
  150. package/lib/schema/getFirstMatchingOption.js.map +1 -1
  151. package/lib/schema/getFromSchema.d.ts +1 -1
  152. package/lib/schema/index.js +9 -3
  153. package/lib/schema/index.js.map +1 -1
  154. package/lib/schema/isFilesArray.d.ts +1 -1
  155. package/lib/schema/isMultiSelect.d.ts +1 -1
  156. package/lib/schema/isMultiSelect.js.map +1 -1
  157. package/lib/schema/isSelect.d.ts +1 -1
  158. package/lib/schema/isSelect.js +1 -1
  159. package/lib/schema/isSelect.js.map +1 -1
  160. package/lib/schema/omitExtraData.d.ts +1 -1
  161. package/lib/schema/omitExtraData.js +66 -52
  162. package/lib/schema/omitExtraData.js.map +1 -1
  163. package/lib/schema/retrieveSchema.d.ts +7 -3
  164. package/lib/schema/retrieveSchema.js +83 -56
  165. package/lib/schema/retrieveSchema.js.map +1 -1
  166. package/lib/schema/sanitizeDataForNewSchema.d.ts +1 -1
  167. package/lib/schema/sanitizeDataForNewSchema.js +48 -7
  168. package/lib/schema/sanitizeDataForNewSchema.js.map +1 -1
  169. package/lib/schema/toPathSchema.d.ts +1 -1
  170. package/lib/schema/toPathSchema.js +9 -5
  171. package/lib/schema/toPathSchema.js.map +1 -1
  172. package/lib/schemaRequiresTrueValue.d.ts +1 -1
  173. package/lib/schemaRequiresTrueValue.js +4 -3
  174. package/lib/schemaRequiresTrueValue.js.map +1 -1
  175. package/lib/shallowEquals.js +2 -2
  176. package/lib/shallowEquals.js.map +1 -1
  177. package/lib/shouldRenderOptionalField.d.ts +1 -1
  178. package/lib/toConstant.d.ts +1 -1
  179. package/lib/toDateString.d.ts +1 -1
  180. package/lib/toErrorList.d.ts +1 -1
  181. package/lib/toErrorList.js +3 -3
  182. package/lib/toErrorList.js.map +1 -1
  183. package/lib/toErrorSchema.d.ts +1 -1
  184. package/lib/toFieldPathId.d.ts +1 -1
  185. package/lib/tsconfig.tsbuildinfo +1 -1
  186. package/lib/types.d.ts +63 -57
  187. package/lib/unwrapErrorHandler.d.ts +1 -1
  188. package/lib/unwrapErrorHandler.js +7 -9
  189. package/lib/unwrapErrorHandler.js.map +1 -1
  190. package/lib/useAltDateWidgetProps.d.ts +6 -6
  191. package/lib/useAltDateWidgetProps.js +3 -3
  192. package/lib/useAltDateWidgetProps.js.map +1 -1
  193. package/lib/useFileWidgetProps.d.ts +2 -2
  194. package/lib/useFileWidgetProps.js +3 -3
  195. package/lib/useFileWidgetProps.js.map +1 -1
  196. package/lib/validationDataMerge.d.ts +1 -1
  197. package/lib/withIdRefPrefix.d.ts +1 -1
  198. package/lib/withIdRefPrefix.js +12 -12
  199. package/lib/withIdRefPrefix.js.map +1 -1
  200. package/package.json +19 -19
  201. package/src/ErrorSchemaBuilder.ts +1 -1
  202. package/src/SelectedOptionDescription.tsx +48 -0
  203. package/src/allowAdditionalItems.ts +2 -1
  204. package/src/asNumber.ts +2 -0
  205. package/src/canExpand.ts +1 -1
  206. package/src/constIsAjvDataReference.ts +2 -2
  207. package/src/constants.ts +10 -7
  208. package/src/createErrorHandler.ts +6 -7
  209. package/src/createSchemaUtils.ts +4 -2
  210. package/src/dataURItoBlob.ts +3 -3
  211. package/src/dateRangeOptions.ts +9 -7
  212. package/src/englishStringTranslator.ts +1 -1
  213. package/src/enumOptionSelectedValue.ts +1 -1
  214. package/src/enumOptionValueDecoder.ts +2 -2
  215. package/src/enumOptionValueEncoder.ts +1 -1
  216. package/src/enumOptionsDeselectValue.ts +1 -1
  217. package/src/enumOptionsIndexForValue.ts +2 -2
  218. package/src/enumOptionsIsSelected.ts +1 -1
  219. package/src/enumOptionsSelectValue.ts +1 -1
  220. package/src/enumOptionsValueForIndex.ts +2 -2
  221. package/src/enums.ts +4 -0
  222. package/src/findSchemaDefinition.ts +18 -17
  223. package/src/getChangedFields.ts +5 -5
  224. package/src/getDateElementProps.ts +3 -3
  225. package/src/getDiscriminatorFieldFromSchema.ts +2 -1
  226. package/src/getInputProps.ts +1 -1
  227. package/src/getOptionMatchingSimpleDiscriminator.ts +11 -15
  228. package/src/getOptionValueFormat.ts +1 -1
  229. package/src/getSchemaType.ts +3 -2
  230. package/src/getSubmitButtonOptions.ts +3 -3
  231. package/src/getTemplate.ts +1 -1
  232. package/src/getTestIds.ts +1 -1
  233. package/src/getUiOptions.ts +10 -2
  234. package/src/getWidget.tsx +5 -6
  235. package/src/guessType.ts +1 -1
  236. package/src/hasWidget.ts +1 -1
  237. package/src/hashForSchema.ts +12 -5
  238. package/src/idGenerators.ts +1 -1
  239. package/src/index.ts +16 -5
  240. package/src/isConstant.ts +1 -1
  241. package/src/isCustomWidget.ts +2 -2
  242. package/src/isFixedItems.ts +4 -4
  243. package/src/isRootSchema.ts +3 -5
  244. package/src/labelValue.ts +1 -1
  245. package/src/logUnsupportedDefaultForEnum.ts +28 -0
  246. package/src/lookupFromFormContext.ts +1 -1
  247. package/src/mergeDefaultsWithFormData.ts +8 -7
  248. package/src/mergeObjects.ts +2 -2
  249. package/src/mergeSchemas.ts +14 -7
  250. package/src/nameGenerators.ts +1 -1
  251. package/src/optionsList.ts +21 -23
  252. package/src/orderProperties.ts +4 -4
  253. package/src/pad.ts +1 -1
  254. package/src/parseDateString.ts +2 -2
  255. package/src/parser/ParserValidator.ts +4 -4
  256. package/src/parser/index.ts +1 -1
  257. package/src/parser/schemaParser.ts +10 -9
  258. package/src/rangeSpec.ts +1 -2
  259. package/src/removeOptionalEmptyObjects.ts +8 -11
  260. package/src/resolveUiSchema.ts +32 -25
  261. package/src/schema/findFieldInSchema.ts +1 -1
  262. package/src/schema/findSelectedOptionInXxxOf.ts +17 -7
  263. package/src/schema/getClosestMatchingOption.ts +17 -11
  264. package/src/schema/getDefaultFormState.ts +104 -43
  265. package/src/schema/getDisplayLabel.ts +4 -5
  266. package/src/schema/getFirstMatchingOption.ts +3 -3
  267. package/src/schema/getFromSchema.ts +1 -1
  268. package/src/schema/index.ts +3 -0
  269. package/src/schema/isFilesArray.ts +1 -1
  270. package/src/schema/isMultiSelect.ts +7 -1
  271. package/src/schema/isSelect.ts +8 -2
  272. package/src/schema/omitExtraData.ts +73 -60
  273. package/src/schema/retrieveSchema.ts +131 -83
  274. package/src/schema/sanitizeDataForNewSchema.ts +57 -8
  275. package/src/schema/toPathSchema.ts +11 -7
  276. package/src/schemaRequiresTrueValue.ts +4 -4
  277. package/src/shallowEquals.ts +2 -2
  278. package/src/shouldRenderOptionalField.ts +1 -1
  279. package/src/toConstant.ts +1 -1
  280. package/src/toDateString.ts +1 -1
  281. package/src/toErrorList.ts +4 -4
  282. package/src/toErrorSchema.ts +1 -1
  283. package/src/toFieldPathId.ts +1 -1
  284. package/src/types.ts +92 -63
  285. package/src/unwrapErrorHandler.ts +11 -12
  286. package/src/useAltDateWidgetProps.tsx +10 -8
  287. package/src/useFileWidgetProps.ts +7 -7
  288. package/src/validationDataMerge.ts +1 -1
  289. package/src/withIdRefPrefix.ts +12 -12
package/dist/index.cjs CHANGED
@@ -61,10 +61,13 @@ __export(index_exports, {
61
61
  REF_KEY: () => REF_KEY,
62
62
  REQUIRED_KEY: () => REQUIRED_KEY,
63
63
  RJSF_ADDITIONAL_PROPERTIES_FLAG: () => RJSF_ADDITIONAL_PROPERTIES_FLAG,
64
+ RJSF_PREFIX_KEY: () => RJSF_PREFIX_KEY,
65
+ RJSF_REF_CYCLE_KEY: () => RJSF_REF_CYCLE_KEY,
64
66
  RJSF_REF_KEY: () => RJSF_REF_KEY,
65
67
  ROOT_SCHEMA_PREFIX: () => ROOT_SCHEMA_PREFIX,
66
68
  SCHEMA_KEY: () => SCHEMA_KEY,
67
69
  SUBMIT_BTN_OPTIONS_KEY: () => SUBMIT_BTN_OPTIONS_KEY,
70
+ SelectedOptionDescription: () => SelectedOptionDescription,
68
71
  TranslatableString: () => TranslatableString,
69
72
  UI_DEFINITIONS_KEY: () => UI_DEFINITIONS_KEY,
70
73
  UI_FIELD_KEY: () => UI_FIELD_KEY,
@@ -135,6 +138,7 @@ __export(index_exports, {
135
138
  isValueEmpty: () => isValueEmpty,
136
139
  labelValue: () => labelValue,
137
140
  localToUTC: () => localToUTC,
141
+ logUnsupportedDefaultForEnum: () => logUnsupportedDefaultForEnum,
138
142
  lookupFromFormContext: () => lookupFromFormContext,
139
143
  mergeDefaultsWithFormData: () => mergeDefaultsWithFormData,
140
144
  mergeObjects: () => mergeObjects,
@@ -221,7 +225,7 @@ function asNumber(value) {
221
225
  }
222
226
 
223
227
  // src/constants.ts
224
- var ADDITIONAL_PROPERTY_FLAG = "__additional_property";
228
+ var ADDITIONAL_PROPERTY_FLAG = /* @__PURE__ */ Symbol("__additional_property");
225
229
  var ADDITIONAL_PROPERTIES_KEY = "additionalProperties";
226
230
  var ALL_OF_KEY = "allOf";
227
231
  var ANY_OF_KEY = "anyOf";
@@ -243,15 +247,17 @@ var READONLY_KEY = "readonly";
243
247
  var REQUIRED_KEY = "required";
244
248
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
245
249
  var REF_KEY = "$ref";
246
- var RJSF_REF_KEY = "__rjsf_ref";
250
+ var RJSF_REF_KEY = /* @__PURE__ */ Symbol("__rjsf_ref");
251
+ var RJSF_REF_CYCLE_KEY = /* @__PURE__ */ Symbol("__rjsf_ref_cycle");
247
252
  var SCHEMA_KEY = "$schema";
248
253
  var DEFAULT_ID_PREFIX = "root";
249
254
  var DEFAULT_ID_SEPARATOR = "_";
250
255
  var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
251
256
  var FORM_CONTEXT_NAME = "formContext";
252
257
  var LOOKUP_MAP_NAME = "layoutGridLookupMap";
253
- var RJSF_ADDITIONAL_PROPERTIES_FLAG = "__rjsf_additionalProperties";
254
- var ROOT_SCHEMA_PREFIX = "__rjsf_rootSchema";
258
+ var RJSF_PREFIX_KEY = "__rjsf";
259
+ var RJSF_ADDITIONAL_PROPERTIES_FLAG = `${RJSF_PREFIX_KEY}_additionalProperties`;
260
+ var ROOT_SCHEMA_PREFIX = `${RJSF_PREFIX_KEY}_rootSchema`;
255
261
  var UI_FIELD_KEY = "ui:field";
256
262
  var UI_WIDGET_KEY = "ui:widget";
257
263
  var UI_OPTIONS_KEY = "ui:options";
@@ -265,7 +271,7 @@ function getUiOptions(uiSchema = {}, globalOptions = {}) {
265
271
  if (!uiSchema) {
266
272
  return { ...globalOptions };
267
273
  }
268
- return Object.keys(uiSchema).filter((key) => key.indexOf("ui:") === 0).reduce(
274
+ return Object.keys(uiSchema).filter((key) => key.startsWith("ui:")).reduce(
269
275
  (options, key) => {
270
276
  const value = uiSchema[key];
271
277
  if (key === UI_WIDGET_KEY && isObject(value)) {
@@ -309,21 +315,20 @@ function createErrorHandler(formData) {
309
315
  }
310
316
  };
311
317
  if (Array.isArray(formData)) {
312
- return formData.reduce((acc, value, key) => {
313
- return { ...acc, [key]: createErrorHandler(value) };
314
- }, handler);
318
+ return formData.reduce((acc, value, key) => ({ ...acc, [key]: createErrorHandler(value) }), handler);
315
319
  }
316
320
  if ((0, import_isPlainObject.default)(formData)) {
317
321
  const formObject = formData;
318
- return Object.keys(formObject).reduce((acc, key) => {
319
- return { ...acc, [key]: createErrorHandler(formObject[key]) };
320
- }, handler);
322
+ return Object.keys(formObject).reduce(
323
+ (acc, key) => ({ ...acc, [key]: createErrorHandler(formObject[key]) }),
324
+ handler
325
+ );
321
326
  }
322
327
  return handler;
323
328
  }
324
329
 
325
330
  // src/createSchemaUtils.ts
326
- var import_get17 = __toESM(require("lodash/get"), 1);
331
+ var import_get16 = __toESM(require("lodash/get"), 1);
327
332
 
328
333
  // src/deepEquals.ts
329
334
  var import_fast_equals = require("fast-equals");
@@ -369,20 +374,21 @@ function findEmbeddedSchemaRecursive(schema, ref) {
369
374
  }
370
375
  function makeAllReferencesAbsolute(schema, baseURI) {
371
376
  const currentURI = (0, import_get.default)(schema, ID_KEY, baseURI);
372
- if (REF_KEY in schema) {
373
- schema = { ...schema, [REF_KEY]: import_fast_uri.default.resolve(currentURI, schema[REF_KEY]) };
377
+ let result = schema;
378
+ if (REF_KEY in result) {
379
+ result = { ...result, [REF_KEY]: import_fast_uri.default.resolve(currentURI, result[REF_KEY]) };
374
380
  }
375
- for (const [key, subSchema] of Object.entries(schema)) {
381
+ for (const [key, subSchema] of Object.entries(result)) {
376
382
  if (Array.isArray(subSchema)) {
377
- schema = {
378
- ...schema,
383
+ result = {
384
+ ...result,
379
385
  [key]: subSchema.map((item) => (0, import_isObject3.default)(item) ? makeAllReferencesAbsolute(item, currentURI) : item)
380
386
  };
381
387
  } else if ((0, import_isObject3.default)(subSchema)) {
382
- schema = { ...schema, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
388
+ result = { ...result, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
383
389
  }
384
390
  }
385
- return schema;
391
+ return result;
386
392
  }
387
393
  function splitKeyElementFromObject(key, object) {
388
394
  const value = object[key];
@@ -392,22 +398,23 @@ function splitKeyElementFromObject(key, object) {
392
398
  function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = (0, import_get.default)(rootSchema, [ID_KEY])) {
393
399
  const ref = $ref || "";
394
400
  let current = void 0;
401
+ let currentBaseURI = baseURI;
395
402
  if (ref.startsWith("#")) {
396
403
  const decodedRef = decodeURIComponent(ref.substring(1));
397
- if (baseURI === void 0 || ID_KEY in rootSchema && rootSchema[ID_KEY] === baseURI) {
404
+ if (currentBaseURI === void 0 || ID_KEY in rootSchema && rootSchema[ID_KEY] === currentBaseURI) {
398
405
  current = import_jsonpointer.default.get(rootSchema, decodedRef);
399
406
  } else if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
400
- current = findEmbeddedSchemaRecursive(rootSchema, baseURI.replace(/\/$/, ""));
407
+ current = findEmbeddedSchemaRecursive(rootSchema, currentBaseURI.replace(/\/$/, ""));
401
408
  if (current !== void 0) {
402
409
  current = import_jsonpointer.default.get(current, decodedRef);
403
410
  }
404
411
  }
405
412
  } else if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
406
- const resolvedRef = baseURI ? import_fast_uri.default.resolve(baseURI, ref) : ref;
413
+ const resolvedRef = currentBaseURI ? import_fast_uri.default.resolve(currentBaseURI, ref) : ref;
407
414
  const [refId, ...refAnchor] = resolvedRef.replace(/#\/?$/, "").split("#");
408
415
  current = findEmbeddedSchemaRecursive(rootSchema, refId.replace(/\/$/, ""));
409
416
  if (current !== void 0) {
410
- baseURI = current[ID_KEY];
417
+ currentBaseURI = current[ID_KEY];
411
418
  if (!(0, import_isEmpty.default)(refAnchor)) {
412
419
  current = import_jsonpointer.default.get(current, decodeURIComponent(refAnchor.join("#")));
413
420
  }
@@ -427,13 +434,12 @@ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [],
427
434
  throw new Error(`Definition for ${firstRef} contains a circular reference through ${circularPath}`);
428
435
  }
429
436
  const [remaining, theRef] = splitKeyElementFromObject(REF_KEY, current);
430
- const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], baseURI);
437
+ const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], currentBaseURI);
431
438
  if (Object.keys(remaining).length > 0) {
432
439
  if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2019_09 || rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
433
440
  return { [ALL_OF_KEY]: [remaining, subSchema] };
434
- } else {
435
- return { ...remaining, ...subSchema };
436
441
  }
442
+ return { ...remaining, ...subSchema };
437
443
  }
438
444
  return subSchema;
439
445
  }
@@ -489,7 +495,7 @@ function guessType(value) {
489
495
  if (typeof value === "boolean") {
490
496
  return "boolean";
491
497
  }
492
- if (!isNaN(value)) {
498
+ if (typeof value === "number" && !Number.isNaN(value)) {
493
499
  return "number";
494
500
  }
495
501
  if (typeof value === "object") {
@@ -515,7 +521,7 @@ function getSchemaType(schema) {
515
521
  }
516
522
  if (Array.isArray(type)) {
517
523
  if (type.length === 2 && type.includes("null")) {
518
- type = type.find((type2) => type2 !== "null");
524
+ type = type.find((t) => t !== "null");
519
525
  } else {
520
526
  type = type[0];
521
527
  }
@@ -525,18 +531,22 @@ function getSchemaType(schema) {
525
531
 
526
532
  // src/mergeSchemas.ts
527
533
  function mergeSchemas(obj1, obj2) {
528
- const acc = Object.assign({}, obj1);
529
- return Object.keys(obj2).reduce((acc2, key) => {
534
+ const acc = { ...obj1 };
535
+ const result = Object.keys(obj2).reduce((accumulator, key) => {
530
536
  const left = obj1 ? obj1[key] : {}, right = obj2[key];
531
537
  if (obj1 && key in obj1 && isObject(right)) {
532
- acc2[key] = mergeSchemas(left, right);
538
+ accumulator[key] = mergeSchemas(left, right);
533
539
  } else if (obj1 && obj2 && (getSchemaType(obj1) === "object" || getSchemaType(obj2) === "object") && key === REQUIRED_KEY && Array.isArray(left) && Array.isArray(right)) {
534
- acc2[key] = (0, import_union.default)(left, right);
540
+ accumulator[key] = (0, import_union.default)(left, right);
535
541
  } else {
536
- acc2[key] = right;
542
+ accumulator[key] = right;
537
543
  }
538
- return acc2;
544
+ return accumulator;
539
545
  }, acc);
546
+ for (const sym of Object.getOwnPropertySymbols(obj2)) {
547
+ result[sym] = obj2[sym];
548
+ }
549
+ return result;
540
550
  }
541
551
 
542
552
  // src/schema/getFirstMatchingOption.ts
@@ -550,23 +560,22 @@ function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorFi
550
560
  if (formData && discriminatorField) {
551
561
  const value = (0, import_get3.default)(formData, discriminatorField);
552
562
  if (value === void 0) {
553
- return;
563
+ return void 0;
554
564
  }
555
- for (let i = 0; i < options.length; i++) {
565
+ for (let i = 0; i < options.length; i += 1) {
556
566
  const option = options[i];
557
567
  const discriminator = (0, import_get3.default)(option, [PROPERTIES_KEY, discriminatorField], {});
558
- if (discriminator.type === "object" || discriminator.type === "array") {
559
- continue;
560
- }
561
- if (discriminator.const === value) {
562
- return i;
563
- }
564
- if (discriminator.enum?.includes(value)) {
565
- return i;
568
+ if (discriminator.type !== "object" && discriminator.type !== "array") {
569
+ if (discriminator.const === value) {
570
+ return i;
571
+ }
572
+ if (discriminator.enum?.includes(value)) {
573
+ return i;
574
+ }
566
575
  }
567
576
  }
568
577
  }
569
- return;
578
+ return void 0;
570
579
  }
571
580
 
572
581
  // src/schema/getFirstMatchingOption.ts
@@ -578,7 +587,7 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
578
587
  if ((0, import_isNumber.default)(simpleDiscriminatorMatch)) {
579
588
  return simpleDiscriminatorMatch;
580
589
  }
581
- for (let i = 0; i < options.length; i++) {
590
+ for (let i = 0; i < options.length; i += 1) {
582
591
  const option = options[i];
583
592
  if (discriminatorField && (0, import_has.default)(option, [PROPERTIES_KEY, discriminatorField])) {
584
593
  const value = (0, import_get4.default)(formData, discriminatorField);
@@ -603,7 +612,7 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
603
612
  shallowClone.allOf.push(requiresAnyOf);
604
613
  augmentedSchema = shallowClone;
605
614
  } else {
606
- augmentedSchema = Object.assign({}, option, requiresAnyOf);
615
+ augmentedSchema = { ...option, ...requiresAnyOf };
607
616
  }
608
617
  delete augmentedSchema.required;
609
618
  if (validator.isValid(augmentedSchema, formData, rootSchema)) {
@@ -639,6 +648,12 @@ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experim
639
648
  resolveAnyOfOrOneOfRefs
640
649
  )[0];
641
650
  }
651
+ function normalizeBooleanSchema(schema) {
652
+ if (typeof schema !== "boolean") {
653
+ return schema;
654
+ }
655
+ return schema ? {} : { not: {} };
656
+ }
642
657
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
643
658
  const { if: expression, then, else: otherwise, ...resolvedSchemaLessConditional } = schema;
644
659
  const conditionValue = validator.isValid(expression, formData || {}, rootSchema);
@@ -646,10 +661,11 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
646
661
  let schemas = [];
647
662
  if (expandAllBranches) {
648
663
  if (then && typeof then !== "boolean") {
664
+ const thenSchema = then;
649
665
  schemas = schemas.concat(
650
666
  retrieveSchemaInternal(
651
667
  validator,
652
- then,
668
+ thenSchema,
653
669
  rootSchema,
654
670
  formData,
655
671
  expandAllBranches,
@@ -659,10 +675,11 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
659
675
  );
660
676
  }
661
677
  if (otherwise && typeof otherwise !== "boolean") {
678
+ const otherwiseSchema = otherwise;
662
679
  schemas = schemas.concat(
663
680
  retrieveSchemaInternal(
664
681
  validator,
665
- otherwise,
682
+ otherwiseSchema,
666
683
  rootSchema,
667
684
  formData,
668
685
  expandAllBranches,
@@ -672,8 +689,9 @@ function resolveCondition(validator, schema, rootSchema, expandAllBranches, recu
672
689
  );
673
690
  }
674
691
  } else {
675
- const conditionalSchema = conditionValue ? then : otherwise;
676
- if (conditionalSchema && typeof conditionalSchema !== "boolean") {
692
+ const conditionalBranch = conditionValue ? then : otherwise;
693
+ if (conditionalBranch !== void 0) {
694
+ const conditionalSchema = normalizeBooleanSchema(conditionalBranch);
677
695
  schemas = schemas.concat(
678
696
  retrieveSchemaInternal(
679
697
  validator,
@@ -749,8 +767,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
749
767
  formData,
750
768
  experimental_customMergeAllOf
751
769
  );
752
- return resolvedSchemas.flatMap((s) => {
753
- return retrieveSchemaInternal(
770
+ return resolvedSchemas.flatMap(
771
+ (s) => retrieveSchemaInternal(
754
772
  validator,
755
773
  s,
756
774
  rootSchema,
@@ -758,8 +776,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
758
776
  expandAllBranches,
759
777
  recurseList,
760
778
  experimental_customMergeAllOf
761
- );
762
- });
779
+ )
780
+ );
763
781
  }
764
782
  if (ALL_OF_KEY in schema && Array.isArray(schema[ALL_OF_KEY])) {
765
783
  const allOfSchemaElements = schema.allOf.map(
@@ -797,30 +815,38 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
797
815
  }
798
816
  return [schema];
799
817
  }
800
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
818
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs, markCycleOnDetection = false) {
801
819
  if (!isObject(schema)) {
802
820
  return schema;
803
821
  }
804
822
  let resolvedSchema = schema;
823
+ let currentBaseURI = baseURI;
805
824
  if (REF_KEY in resolvedSchema) {
806
825
  const { $ref, ...localSchema } = resolvedSchema;
807
826
  if (recurseList.includes($ref)) {
808
- return resolvedSchema;
827
+ return markCycleOnDetection ? { ...resolvedSchema, [RJSF_REF_CYCLE_KEY]: true } : resolvedSchema;
809
828
  }
810
829
  recurseList.push($ref);
811
- const refSchema = findSchemaDefinition($ref, rootSchema, baseURI);
830
+ const refSchema = findSchemaDefinition($ref, rootSchema, currentBaseURI);
812
831
  resolvedSchema = { ...refSchema, ...localSchema, [RJSF_REF_KEY]: $ref };
813
832
  if (ID_KEY in resolvedSchema) {
814
- baseURI = resolvedSchema[ID_KEY];
833
+ currentBaseURI = resolvedSchema[ID_KEY];
815
834
  }
816
835
  }
817
836
  if (PROPERTIES_KEY in resolvedSchema) {
818
837
  const childrenLists = [];
819
838
  const updatedProps = (0, import_transform.default)(
820
839
  resolvedSchema[PROPERTIES_KEY],
821
- (result, value, key) => {
840
+ (acc, value, key) => {
822
841
  const childList = [...recurseList];
823
- result[key] = resolveAllReferences(value, rootSchema, childList, baseURI, resolveAnyOfOrOneOfRefs);
842
+ acc[key] = resolveAllReferences(
843
+ value,
844
+ rootSchema,
845
+ childList,
846
+ currentBaseURI,
847
+ resolveAnyOfOrOneOfRefs,
848
+ !resolveAnyOfOrOneOfRefs
849
+ );
824
850
  childrenLists.push(childList);
825
851
  },
826
852
  {}
@@ -831,7 +857,14 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveA
831
857
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
832
858
  resolvedSchema = {
833
859
  ...resolvedSchema,
834
- items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
860
+ // Array items are only rendered when data exists, so a $ref cycle here does NOT cause an infinite render.
861
+ items: resolveAllReferences(
862
+ resolvedSchema.items,
863
+ rootSchema,
864
+ recurseList,
865
+ currentBaseURI,
866
+ resolveAnyOfOrOneOfRefs
867
+ )
835
868
  };
836
869
  }
837
870
  if (resolveAnyOfOrOneOfRefs) {
@@ -848,7 +881,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveA
848
881
  resolvedSchema = {
849
882
  ...resolvedSchema,
850
883
  [key]: schemas.map(
851
- (s) => resolveAllReferences(s, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
884
+ (s) => resolveAllReferences(s, rootSchema, recurseList, currentBaseURI, resolveAnyOfOrOneOfRefs)
852
885
  )
853
886
  };
854
887
  }
@@ -875,7 +908,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
875
908
  (0, import_get5.default)(formData, [key]),
876
909
  experimental_customMergeAllOf
877
910
  );
878
- (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
911
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
879
912
  return;
880
913
  }
881
914
  }
@@ -887,7 +920,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
887
920
  validator,
888
921
  { [REF_KEY]: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
889
922
  rootSchema,
890
- formData,
923
+ (0, import_get5.default)(formData, [key]),
891
924
  experimental_customMergeAllOf
892
925
  );
893
926
  } else if ("type" in schema.additionalProperties) {
@@ -904,10 +937,10 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
904
937
  additionalProperties = { type: guessType((0, import_get5.default)(formData, [key])) };
905
938
  }
906
939
  schema.properties[key] = additionalProperties;
907
- (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
940
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
908
941
  } else {
909
942
  schema.properties[key] = { type: "null" };
910
- (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
943
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
911
944
  }
912
945
  });
913
946
  return schema;
@@ -950,17 +983,26 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
950
983
  try {
951
984
  const withContainsSchemas = [];
952
985
  const withoutContainsSchemas = [];
953
- resolvedSchema.allOf?.forEach((s2) => {
954
- if (typeof s2 === "object" && s2.contains) {
955
- withContainsSchemas.push(s2);
986
+ const allOfSymbols = {};
987
+ resolvedSchema.allOf?.forEach((allOfItem) => {
988
+ if (typeof allOfItem === "object" && allOfItem.contains) {
989
+ withContainsSchemas.push(allOfItem);
956
990
  } else {
957
- withoutContainsSchemas.push(s2);
991
+ withoutContainsSchemas.push(allOfItem);
992
+ for (const sym of Object.getOwnPropertySymbols(allOfItem)) {
993
+ if (!(sym in allOfSymbols)) {
994
+ allOfSymbols[sym] = allOfItem[sym];
995
+ }
996
+ }
958
997
  }
959
998
  });
960
999
  if (withContainsSchemas.length) {
961
1000
  resolvedSchema = { ...resolvedSchema, allOf: withoutContainsSchemas };
962
1001
  }
963
1002
  resolvedSchema = experimental_customMergeAllOf ? experimental_customMergeAllOf(resolvedSchema) : mergeAllOf(resolvedSchema);
1003
+ for (const sym of Object.getOwnPropertySymbols(allOfSymbols)) {
1004
+ resolvedSchema[sym] = allOfSymbols[sym];
1005
+ }
964
1006
  if (withContainsSchemas.length) {
965
1007
  resolvedSchema.allOf = withContainsSchemas;
966
1008
  }
@@ -972,18 +1014,18 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
972
1014
  }
973
1015
  if (PROPERTIES_KEY in resolvedSchema && PATTERN_PROPERTIES_KEY in resolvedSchema) {
974
1016
  resolvedSchema = Object.keys(resolvedSchema.properties).reduce(
975
- (schema2, key) => {
976
- const matchingProperties = getMatchingPatternProperties(schema2, key);
1017
+ (acc, key) => {
1018
+ const matchingProperties = getMatchingPatternProperties(acc, key);
977
1019
  if (!(0, import_isEmpty2.default)(matchingProperties)) {
978
- schema2.properties[key] = retrieveSchema(
1020
+ acc.properties[key] = retrieveSchema(
979
1021
  validator,
980
- { allOf: [schema2.properties[key], ...Object.values(matchingProperties)] },
1022
+ { allOf: [acc.properties[key], ...Object.values(matchingProperties)] },
981
1023
  rootSchema,
982
1024
  (0, import_get5.default)(rawFormData, [key]),
983
1025
  experimental_customMergeAllOf
984
1026
  );
985
1027
  }
986
- return schema2;
1028
+ return acc;
987
1029
  },
988
1030
  {
989
1031
  ...resolvedSchema,
@@ -1015,23 +1057,21 @@ function resolveAnyOrOneOfSchemas(validator, schema, rootSchema, expandAllBranch
1015
1057
  if (anyOrOneOf) {
1016
1058
  const formData = rawFormData === void 0 && expandAllBranches ? {} : rawFormData;
1017
1059
  const discriminator = getDiscriminatorFieldFromSchema(schema);
1018
- anyOrOneOf = anyOrOneOf.map((s) => {
1019
- return resolveAllReferences(s, rootSchema, []);
1020
- });
1060
+ anyOrOneOf = anyOrOneOf.map((s) => resolveAllReferences(s, rootSchema, []));
1021
1061
  const option = getFirstMatchingOption(validator, formData, anyOrOneOf, rootSchema, discriminator);
1022
1062
  if (expandAllBranches) {
1023
1063
  const relaxed = relaxOptionsForScoring(anyOrOneOf, false, rootSchema);
1024
1064
  getFirstMatchingOption(validator, formData, relaxed, rootSchema, discriminator);
1025
1065
  return anyOrOneOf.map((item) => mergeSchemas(remaining, item));
1026
1066
  }
1027
- schema = mergeSchemas(remaining, anyOrOneOf[option]);
1067
+ return [mergeSchemas(remaining, anyOrOneOf[option])];
1028
1068
  }
1029
1069
  return [schema];
1030
1070
  }
1031
1071
  function relaxOptionsForScoring(options, resolveRefs = false, rootSchema) {
1032
1072
  return options.map((d) => {
1033
1073
  if (!isObject(d)) {
1034
- return d ? {} : { not: {} };
1074
+ return normalizeBooleanSchema(d);
1035
1075
  }
1036
1076
  const schema = resolveRefs && rootSchema ? resolveAllReferences(d, rootSchema, []) : d;
1037
1077
  return schema.additionalProperties === false ? { ...schema, additionalProperties: true } : schema;
@@ -1062,43 +1102,39 @@ function resolveDependencies(validator, schema, rootSchema, expandAllBranches, r
1062
1102
  function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
1063
1103
  let schemas = [resolvedSchema];
1064
1104
  for (const dependencyKey in dependencies) {
1065
- if (!expandAllBranches && (0, import_get5.default)(formData, [dependencyKey]) === void 0) {
1066
- continue;
1067
- }
1068
- if (resolvedSchema.properties && !(dependencyKey in resolvedSchema.properties)) {
1069
- continue;
1070
- }
1071
- const [remainingDependencies, dependencyValue] = splitKeyElementFromObject(
1072
- dependencyKey,
1073
- dependencies
1074
- );
1075
- if (Array.isArray(dependencyValue)) {
1076
- schemas[0] = withDependentProperties(resolvedSchema, dependencyValue);
1077
- } else if (isObject(dependencyValue)) {
1078
- schemas = withDependentSchema(
1079
- validator,
1080
- resolvedSchema,
1081
- rootSchema,
1105
+ if ((expandAllBranches || (0, import_get5.default)(formData, [dependencyKey]) !== void 0) && (!resolvedSchema.properties || dependencyKey in resolvedSchema.properties)) {
1106
+ const [remainingDependencies, dependencyValue] = splitKeyElementFromObject(
1082
1107
  dependencyKey,
1083
- dependencyValue,
1084
- expandAllBranches,
1085
- recurseList,
1086
- formData,
1087
- experimental_customMergeAllOf
1108
+ dependencies
1109
+ );
1110
+ if (Array.isArray(dependencyValue)) {
1111
+ schemas[0] = withDependentProperties(resolvedSchema, dependencyValue);
1112
+ } else if (isObject(dependencyValue)) {
1113
+ schemas = withDependentSchema(
1114
+ validator,
1115
+ resolvedSchema,
1116
+ rootSchema,
1117
+ dependencyKey,
1118
+ dependencyValue,
1119
+ expandAllBranches,
1120
+ recurseList,
1121
+ formData,
1122
+ experimental_customMergeAllOf
1123
+ );
1124
+ }
1125
+ return schemas.flatMap(
1126
+ (schema) => processDependencies(
1127
+ validator,
1128
+ remainingDependencies,
1129
+ schema,
1130
+ rootSchema,
1131
+ expandAllBranches,
1132
+ recurseList,
1133
+ formData,
1134
+ experimental_customMergeAllOf
1135
+ )
1088
1136
  );
1089
1137
  }
1090
- return schemas.flatMap(
1091
- (schema) => processDependencies(
1092
- validator,
1093
- remainingDependencies,
1094
- schema,
1095
- rootSchema,
1096
- expandAllBranches,
1097
- recurseList,
1098
- formData,
1099
- experimental_customMergeAllOf
1100
- )
1101
- );
1102
1138
  }
1103
1139
  return schemas;
1104
1140
  }
@@ -1121,9 +1157,9 @@ function withDependentSchema(validator, schema, rootSchema, dependencyKey, depen
1121
1157
  );
1122
1158
  return dependentSchemas.flatMap((dependent) => {
1123
1159
  const { oneOf, ...dependentSchema } = dependent;
1124
- schema = mergeSchemas(schema, dependentSchema);
1160
+ const mergedSchema = mergeSchemas(schema, dependentSchema);
1125
1161
  if (oneOf === void 0) {
1126
- return schema;
1162
+ return mergedSchema;
1127
1163
  }
1128
1164
  const resolvedOneOfs = oneOf.map((subschema) => {
1129
1165
  if (typeof subschema === "boolean" || !(REF_KEY in subschema)) {
@@ -1135,7 +1171,7 @@ function withDependentSchema(validator, schema, rootSchema, dependencyKey, depen
1135
1171
  return allPermutations.flatMap(
1136
1172
  (resolvedOneOf) => withExactlyOneSubschema(
1137
1173
  validator,
1138
- schema,
1174
+ mergedSchema,
1139
1175
  rootSchema,
1140
1176
  dependencyKey,
1141
1177
  resolvedOneOf,
@@ -1149,7 +1185,7 @@ function withDependentSchema(validator, schema, rootSchema, dependencyKey, depen
1149
1185
  }
1150
1186
  function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, oneOf, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
1151
1187
  const validSubschemas = oneOf.filter((subschema) => {
1152
- if (typeof subschema === "boolean" || !subschema || !subschema.properties) {
1188
+ if (typeof subschema === "boolean" || !subschema?.properties) {
1153
1189
  return false;
1154
1190
  }
1155
1191
  const { [dependencyKey]: conditionPropertySchema } = subschema.properties;
@@ -1181,7 +1217,7 @@ function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, o
1181
1217
  recurseList,
1182
1218
  experimental_customMergeAllOf
1183
1219
  );
1184
- return schemas.map((s2) => mergeSchemas(schema, s2));
1220
+ return schemas.map((resolvedSubschema) => mergeSchemas(schema, resolvedSubschema));
1185
1221
  });
1186
1222
  }
1187
1223
 
@@ -1195,12 +1231,16 @@ function findSelectedOptionInXxxOf(validator, rootSchema, schema, fallbackField,
1195
1231
  );
1196
1232
  const data = (0, import_get6.default)(formData, selectorField);
1197
1233
  if (data !== void 0) {
1198
- return xxxOfs.find((xxx2) => {
1199
- return deepEquals_default(
1200
- (0, import_get6.default)(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], (0, import_get6.default)(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
1234
+ return xxxOfs.find(
1235
+ (xxxOfOption) => deepEquals_default(
1236
+ (0, import_get6.default)(
1237
+ xxxOfOption,
1238
+ [PROPERTIES_KEY, selectorField, DEFAULT_KEY],
1239
+ (0, import_get6.default)(xxxOfOption, [PROPERTIES_KEY, selectorField, CONST_KEY])
1240
+ ),
1201
1241
  data
1202
- );
1203
- });
1242
+ )
1243
+ );
1204
1244
  }
1205
1245
  }
1206
1246
  return void 0;
@@ -1372,23 +1412,21 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
1372
1412
  );
1373
1413
  }
1374
1414
  if (((0, import_has4.default)(value, ONE_OF_KEY) || (0, import_has4.default)(value, ANY_OF_KEY)) && formValue) {
1375
- const key2 = (0, import_has4.default)(value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
1415
+ const xxxOfKey = (0, import_has4.default)(value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
1376
1416
  const discriminator = getDiscriminatorFieldFromSchema(value);
1377
1417
  return score + getClosestMatchingOption(
1378
1418
  validator,
1379
1419
  rootSchema,
1380
1420
  formValue,
1381
- (0, import_get9.default)(value, key2),
1421
+ (0, import_get9.default)(value, xxxOfKey),
1382
1422
  -1,
1383
1423
  discriminator,
1384
1424
  experimental_customMergeAllOf
1385
1425
  );
1386
1426
  }
1387
1427
  if (value.type === "object") {
1388
- if ((0, import_isObject6.default)(formValue)) {
1389
- score += 1;
1390
- }
1391
- return score + calculateIndexScore(validator, rootSchema, value, formValue, experimental_customMergeAllOf);
1428
+ const structureBoost = (0, import_isObject6.default)(formValue) ? 1 : 0;
1429
+ return score + structureBoost + calculateIndexScore(validator, rootSchema, value, formValue, experimental_customMergeAllOf);
1392
1430
  }
1393
1431
  if (value.type === guessType(formValue)) {
1394
1432
  let newScore = score + 1;
@@ -1410,9 +1448,7 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
1410
1448
  return totalScore;
1411
1449
  }
1412
1450
  function getClosestMatchingOption(validator, rootSchema, formData, options, selectedOption = -1, discriminatorField, experimental_customMergeAllOf) {
1413
- const resolvedOptions = options.map((option) => {
1414
- return resolveAllReferences(option, rootSchema, []);
1415
- });
1451
+ const resolvedOptions = options.map((option) => resolveAllReferences(option, rootSchema, []));
1416
1452
  const simpleDiscriminatorMatch = getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField);
1417
1453
  if ((0, import_isNumber2.default)(simpleDiscriminatorMatch)) {
1418
1454
  return simpleDiscriminatorMatch;
@@ -1470,7 +1506,7 @@ function isConstant(schema) {
1470
1506
 
1471
1507
  // src/isFixedItems.ts
1472
1508
  function isFixedItems(schema) {
1473
- return Array.isArray(schema.items) && schema.items.length > 0 && schema.items.every((item) => isObject(item));
1509
+ return Array.isArray(schema.items) && schema.items.every((item) => isObject(item));
1474
1510
  }
1475
1511
 
1476
1512
  // src/mergeDefaultsWithFormData.ts
@@ -1500,7 +1536,7 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1500
1536
  }
1501
1537
  if (isObject(formData)) {
1502
1538
  const acc = Object.assign({}, defaults);
1503
- return Object.keys(formData).reduce((acc2, key) => {
1539
+ return Object.keys(formData).reduce((accumulator, key) => {
1504
1540
  const keyValue = (0, import_get10.default)(formData, key);
1505
1541
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1506
1542
  const keyExistsInFormData = key in formData;
@@ -1509,13 +1545,13 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1509
1545
  const keyDefaultIsObject = keyExistsInDefaults && isObject((0, import_get10.default)(defaults, key));
1510
1546
  const keyHasFormDataObject = keyExistsInFormData && isObject(keyValue);
1511
1547
  if (keyDefaultIsObject && keyHasFormDataObject && !defaultValueIsNestedObject) {
1512
- acc2[key] = {
1548
+ accumulator[key] = {
1513
1549
  ...(0, import_get10.default)(defaults, key),
1514
1550
  ...keyValue
1515
1551
  };
1516
- return acc2;
1552
+ return accumulator;
1517
1553
  }
1518
- acc2[key] = mergeDefaultsWithFormData(
1554
+ accumulator[key] = mergeDefaultsWithFormData(
1519
1555
  (0, import_get10.default)(defaults, key),
1520
1556
  keyValue,
1521
1557
  mergeExtraArrayDefaults,
@@ -1524,10 +1560,10 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1524
1560
  // Or if the key value doesn't exist in formData
1525
1561
  overrideFormDataWithDefaults && (keyExistsInDefaults || !keyExistsInFormData)
1526
1562
  );
1527
- return acc2;
1563
+ return acc;
1528
1564
  }, acc);
1529
1565
  }
1530
- if (defaultSupercedesUndefined && (!(defaults === void 0) && (0, import_isNil.default)(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !(0, import_isNil.default)(formData)) {
1566
+ if (defaultSupercedesUndefined && (!(defaults === void 0) && (0, import_isNil.default)(formData) || typeof formData === "number" && Number.isNaN(formData)) || overrideFormDataWithDefaults && !(0, import_isNil.default)(formData)) {
1531
1567
  return defaults;
1532
1568
  }
1533
1569
  return formData;
@@ -1556,7 +1592,7 @@ function mergeObjects(obj1, obj2, concatArrays = false) {
1556
1592
  }
1557
1593
  return acc;
1558
1594
  },
1559
- Object.assign({}, obj1)
1595
+ { ...obj1 }
1560
1596
  );
1561
1597
  }
1562
1598
 
@@ -1619,7 +1655,7 @@ function optionsList(schema, uiSchema) {
1619
1655
  const { optionsSchemaSelector = selectorField } = getUiOptions(uiSchema);
1620
1656
  selectorField = optionsSchemaSelector;
1621
1657
  }
1622
- return altSchemas && altSchemas.map((aSchemaDef, index) => {
1658
+ return altSchemas?.map((aSchemaDef, index) => {
1623
1659
  const { title } = getUiOptions(altUiSchemas?.[index]);
1624
1660
  const aSchema = aSchemaDef;
1625
1661
  let value;
@@ -1627,10 +1663,10 @@ function optionsList(schema, uiSchema) {
1627
1663
  if (selectorField) {
1628
1664
  const innerSchema = (0, import_get11.default)(aSchema, [PROPERTIES_KEY, selectorField], {});
1629
1665
  value = (0, import_get11.default)(innerSchema, DEFAULT_KEY, (0, import_get11.default)(innerSchema, CONST_KEY));
1630
- label = label || innerSchema?.title || aSchema.title || String(value);
1666
+ label = label ?? innerSchema?.title ?? aSchema.title ?? String(value);
1631
1667
  } else {
1632
1668
  value = toConstant(aSchema);
1633
- label = label || aSchema.title || String(value);
1669
+ label = label ?? aSchema.title ?? String(value);
1634
1670
  }
1635
1671
  return {
1636
1672
  schema: aSchema,
@@ -1648,7 +1684,7 @@ function isSelect(validator, theSchema, rootSchema = {}, experimental_customMerg
1648
1684
  return true;
1649
1685
  }
1650
1686
  if (Array.isArray(altSchemas)) {
1651
- return altSchemas.every((altSchemas2) => typeof altSchemas2 !== "boolean" && isConstant(altSchemas2));
1687
+ return altSchemas.every((altSchema) => typeof altSchema !== "boolean" && isConstant(altSchema));
1652
1688
  }
1653
1689
  return false;
1654
1690
  }
@@ -1684,23 +1720,23 @@ function computeDefaultBasedOnSchemaTypeAndDefaults(schema, computedDefault) {
1684
1720
  const shouldReturnNullAsDefault = Array.isArray(type) && type.includes("null") && (0, import_isEmpty4.default)(computedDefault) && schemaDefault === null;
1685
1721
  return shouldReturnNullAsDefault ? null : computedDefault;
1686
1722
  }
1687
- function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false, isNullType = false) {
1723
+ function maybeAddDefaultToObject(acc, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false, isNullType = false) {
1688
1724
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1689
1725
  if (includeUndefinedValues === true || isConst) {
1690
- obj[key] = computedDefault;
1726
+ acc[key] = computedDefault;
1691
1727
  } else if (includeUndefinedValues === "excludeObjectChildren") {
1692
1728
  if (isNullType && computedDefault !== void 0 || !isObject(computedDefault) || !(0, import_isEmpty4.default)(computedDefault)) {
1693
- obj[key] = computedDefault;
1729
+ acc[key] = computedDefault;
1694
1730
  }
1695
1731
  } else if (emptyObjectFields !== "skipDefaults") {
1696
1732
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1697
1733
  if (isObject(computedDefault)) {
1698
1734
  if (emptyObjectFields === "skipEmptyDefaults") {
1699
1735
  if (!(0, import_isEmpty4.default)(computedDefault)) {
1700
- obj[key] = computedDefault;
1736
+ acc[key] = computedDefault;
1701
1737
  }
1702
1738
  } else if ((!(0, import_isEmpty4.default)(computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== "populateRequiredDefaults")) {
1703
- obj[key] = computedDefault;
1739
+ acc[key] = computedDefault;
1704
1740
  }
1705
1741
  } else if (
1706
1742
  // Store computedDefault if it's a defined primitive (e.g., true) and satisfies certain conditions
@@ -1709,7 +1745,7 @@ function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValu
1709
1745
  // Or if isSelfOrParentRequired is 'true' and the key is a required field
1710
1746
  computedDefault !== void 0 && (emptyObjectFields === "populateAllDefaults" || emptyObjectFields === "skipEmptyDefaults" || isSelfOrParentRequired && requiredFields.includes(key))
1711
1747
  ) {
1712
- obj[key] = computedDefault;
1748
+ acc[key] = computedDefault;
1713
1749
  }
1714
1750
  }
1715
1751
  }
@@ -1720,8 +1756,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1720
1756
  rootSchema = {},
1721
1757
  includeUndefinedValues = false,
1722
1758
  _recurseList = [],
1723
- experimental_defaultFormStateBehavior = void 0,
1724
- experimental_customMergeAllOf = void 0,
1759
+ experimental_defaultFormStateBehavior,
1760
+ experimental_customMergeAllOf,
1725
1761
  required,
1726
1762
  shouldMergeDefaultsIntoFormData = false,
1727
1763
  initialDefaultsGenerated
@@ -1729,14 +1765,19 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1729
1765
  let formData = isObject(rawFormData) ? rawFormData : {};
1730
1766
  const schema = isObject(rawSchema) ? rawSchema : {};
1731
1767
  let defaults = parentDefaults;
1768
+ const preferParentDefaults = defaults && experimental_defaultFormStateBehavior?.nestedDefaultsPrecedence === "ancestorWins";
1732
1769
  let schemaToCompute = null;
1733
1770
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1734
1771
  let updatedRecurseList = _recurseList;
1735
1772
  if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1736
1773
  defaults = schema[CONST_KEY];
1737
1774
  } else if (isObject(defaults) && isObject(schema.default) && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1738
- defaults = mergeObjects(defaults, schema.default);
1739
- } else if (DEFAULT_KEY in schema && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1775
+ if (preferParentDefaults) {
1776
+ defaults = mergeObjects(schema.default, defaults);
1777
+ } else {
1778
+ defaults = mergeObjects(defaults, schema.default);
1779
+ }
1780
+ } else if (DEFAULT_KEY in schema && !preferParentDefaults && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1740
1781
  defaults = schema.default;
1741
1782
  } else if (REF_KEY in schema) {
1742
1783
  const refName = schema[REF_KEY];
@@ -1765,8 +1806,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1765
1806
  defaultFormData,
1766
1807
  experimental_customMergeAllOf
1767
1808
  );
1768
- schemaToCompute = resolvedSchema[0];
1769
- } else if (isFixedItems(schema)) {
1809
+ [schemaToCompute] = resolvedSchema;
1810
+ } else if (isFixedItems(schema) && !preferParentDefaults) {
1770
1811
  defaults = schema.items.map(
1771
1812
  (itemSchema, idx) => computeDefaults(validator, itemSchema, {
1772
1813
  rootSchema,
@@ -1862,16 +1903,36 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1862
1903
  return defaultsWithFormData;
1863
1904
  }
1864
1905
  function ensureFormDataMatchingSchema(validator, schema, rootSchema, formData, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
1865
- const isSelectField = !isConstant(schema) && isSelect(validator, schema, rootSchema, experimental_customMergeAllOf);
1906
+ const shouldRetrieveAllOf = experimental_defaultFormStateBehavior?.allOf === "populateDefaults" && ALL_OF_KEY in schema;
1907
+ const schemaToMatch = shouldRetrieveAllOf ? retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf) : schema;
1908
+ const isSelectField = !isConstant(schemaToMatch) && isSelect(validator, schemaToMatch, rootSchema, experimental_customMergeAllOf);
1866
1909
  let validFormData = formData;
1867
1910
  if (isSelectField) {
1868
- const getOptionsList = optionsList(schema);
1911
+ const getOptionsList = optionsList(schemaToMatch);
1869
1912
  const isValid = getOptionsList?.some((option) => deepEquals_default(option.value, formData));
1870
1913
  validFormData = isValid ? formData : void 0;
1871
1914
  }
1872
- const constTakesPrecedence = schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults === "always";
1915
+ const constTakesPrecedence = schemaToMatch[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults === "always";
1873
1916
  if (constTakesPrecedence) {
1874
- validFormData = schema.const;
1917
+ validFormData = schemaToMatch.const;
1918
+ } else if (isObject(validFormData) && isObject(schemaToMatch.properties)) {
1919
+ validFormData = Object.keys(schemaToMatch.properties).reduce(
1920
+ (acc, key) => {
1921
+ const propertySchema = (0, import_get12.default)(schemaToMatch, [PROPERTIES_KEY, key], {});
1922
+ if (key in acc && (shouldRetrieveAllOf || isObject(propertySchema) && ALL_OF_KEY in propertySchema)) {
1923
+ acc[key] = ensureFormDataMatchingSchema(
1924
+ validator,
1925
+ propertySchema,
1926
+ rootSchema,
1927
+ (0, import_get12.default)(acc, key),
1928
+ experimental_defaultFormStateBehavior,
1929
+ experimental_customMergeAllOf
1930
+ );
1931
+ }
1932
+ return acc;
1933
+ },
1934
+ { ...validFormData }
1935
+ );
1875
1936
  }
1876
1937
  return validFormData;
1877
1938
  }
@@ -1880,8 +1941,8 @@ function getObjectDefaults(validator, rawSchema, {
1880
1941
  rootSchema = {},
1881
1942
  includeUndefinedValues = false,
1882
1943
  _recurseList = [],
1883
- experimental_defaultFormStateBehavior = void 0,
1884
- experimental_customMergeAllOf = void 0,
1944
+ experimental_defaultFormStateBehavior,
1945
+ experimental_customMergeAllOf,
1885
1946
  required,
1886
1947
  shouldMergeDefaultsIntoFormData,
1887
1948
  initialDefaultsGenerated
@@ -1965,13 +2026,14 @@ function getArrayDefaults(validator, rawSchema, {
1965
2026
  rawFormData,
1966
2027
  rootSchema = {},
1967
2028
  _recurseList = [],
1968
- experimental_defaultFormStateBehavior = void 0,
1969
- experimental_customMergeAllOf = void 0,
2029
+ experimental_defaultFormStateBehavior,
2030
+ experimental_customMergeAllOf,
1970
2031
  required,
1971
2032
  requiredAsRoot = false,
1972
2033
  shouldMergeDefaultsIntoFormData,
1973
2034
  initialDefaultsGenerated
1974
- } = {}, defaults) {
2035
+ } = {}, initialDefaults) {
2036
+ let defaults = initialDefaults;
1975
2037
  const schema = rawSchema;
1976
2038
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
1977
2039
  const { populate: arrayMinItemsPopulate, mergeExtraDefaults: arrayMergeExtraDefaults } = arrayMinItemsStateBehavior;
@@ -2003,8 +2065,8 @@ function getArrayDefaults(validator, rawSchema, {
2003
2065
  if (neverPopulate) {
2004
2066
  defaults = rawFormData;
2005
2067
  } else {
2006
- const itemDefaults = rawFormData.map((item, idx) => {
2007
- return computeDefaults(validator, schemaItem, {
2068
+ const itemDefaults = rawFormData.map(
2069
+ (item, idx) => computeDefaults(validator, schemaItem, {
2008
2070
  rootSchema,
2009
2071
  _recurseList,
2010
2072
  experimental_defaultFormStateBehavior,
@@ -2014,20 +2076,27 @@ function getArrayDefaults(validator, rawSchema, {
2014
2076
  required,
2015
2077
  shouldMergeDefaultsIntoFormData,
2016
2078
  initialDefaultsGenerated
2017
- });
2018
- });
2079
+ })
2080
+ );
2019
2081
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
2020
2082
  defaults = mergeDefaultsWithFormData(defaults, itemDefaults, mergeExtraDefaults);
2021
2083
  }
2022
2084
  }
2085
+ const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
2023
2086
  if (neverPopulate) {
2087
+ if (shouldMergeDefaultsIntoFormData) {
2088
+ if (schema.minItems && schema.minItems > defaultsLength) {
2089
+ const fillerEntries = Array.from({ length: schema.minItems - defaultsLength }, () => null);
2090
+ return (defaults ?? []).concat(fillerEntries);
2091
+ }
2092
+ return defaults;
2093
+ }
2024
2094
  return defaults ?? emptyDefault;
2025
2095
  }
2026
2096
  if (ignoreMinItemsFlagSet && !required) {
2027
- return defaults ? defaults : void 0;
2097
+ return defaults || void 0;
2028
2098
  }
2029
2099
  let arrayDefault;
2030
- const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
2031
2100
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
2032
2101
  arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
2033
2102
  } else {
@@ -2059,11 +2128,13 @@ function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps
2059
2128
  case "array": {
2060
2129
  return getArrayDefaults(validator, rawSchema, computeDefaultsProps, defaults);
2061
2130
  }
2131
+ default:
2132
+ return void 0;
2062
2133
  }
2063
2134
  }
2064
2135
  function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf, initialDefaultsGenerated) {
2065
2136
  if (!isObject(theSchema)) {
2066
- throw new Error("Invalid schema: " + theSchema);
2137
+ throw new Error(`Invalid schema: ${theSchema}`);
2067
2138
  }
2068
2139
  const schema = retrieveSchema(validator, theSchema, rootSchema, formData, experimental_customMergeAllOf);
2069
2140
  const defaults = computeDefaults(validator, schema, {
@@ -2085,9 +2156,17 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
2085
2156
  if (isObject(formData) || Array.isArray(formData)) {
2086
2157
  const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
2087
2158
  const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
2159
+ const matchingFormData = ensureFormDataMatchingSchema(
2160
+ validator,
2161
+ schema,
2162
+ rootSchema ?? schema,
2163
+ formData,
2164
+ experimental_defaultFormStateBehavior,
2165
+ experimental_customMergeAllOf
2166
+ );
2088
2167
  const result = mergeDefaultsWithFormData(
2089
2168
  defaults,
2090
- formData,
2169
+ matchingFormData,
2091
2170
  true,
2092
2171
  // set to true to add any additional default array entries.
2093
2172
  defaultSupercedesUndefined,
@@ -2099,15 +2178,12 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
2099
2178
  return defaults;
2100
2179
  }
2101
2180
 
2102
- // src/schema/getDisplayLabel.ts
2103
- var import_get13 = __toESM(require("lodash/get"), 1);
2104
-
2105
2181
  // src/isCustomWidget.ts
2106
2182
  function isCustomWidget(uiSchema = {}) {
2107
2183
  return (
2108
2184
  // TODO: Remove the `&& uiSchema['ui:widget'] !== 'hidden'` once we support hidden widgets for arrays.
2109
2185
  // https://rjsf-team.github.io/react-jsonschema-form/docs/usage/widgets/#hidden-widgets
2110
- "widget" in getUiOptions(uiSchema) && getUiOptions(uiSchema)["widget"] !== "hidden"
2186
+ "widget" in getUiOptions(uiSchema) && getUiOptions(uiSchema).widget !== "hidden"
2111
2187
  );
2112
2188
  }
2113
2189
 
@@ -2136,7 +2212,7 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
2136
2212
  let displayLabel = Boolean(label);
2137
2213
  if (displayLabel) {
2138
2214
  const schemaType = getSchemaType(schema);
2139
- const addedByAdditionalProperty = (0, import_get13.default)(schema, ADDITIONAL_PROPERTY_FLAG, false);
2215
+ const addedByAdditionalProperty = Boolean(schema[ADDITIONAL_PROPERTY_FLAG]);
2140
2216
  if (schemaType === "array") {
2141
2217
  displayLabel = addedByAdditionalProperty || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || isFilesArray(validator, schema, uiSchema, rootSchema, experimental_customMergeAllOf) || isCustomWidget(uiSchema);
2142
2218
  }
@@ -2146,7 +2222,7 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
2146
2222
  if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
2147
2223
  displayLabel = false;
2148
2224
  }
2149
- if (uiSchema && uiSchema[UI_FIELD_KEY]) {
2225
+ if (uiSchema?.[UI_FIELD_KEY]) {
2150
2226
  displayLabel = false;
2151
2227
  }
2152
2228
  }
@@ -2154,7 +2230,7 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
2154
2230
  }
2155
2231
 
2156
2232
  // src/schema/omitExtraData.ts
2157
- var import_get14 = __toESM(require("lodash/get"), 1);
2233
+ var import_get13 = __toESM(require("lodash/get"), 1);
2158
2234
  var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
2159
2235
  var import_isNil2 = __toESM(require("lodash/isNil"), 1);
2160
2236
  var import_pick = __toESM(require("lodash/pick"), 1);
@@ -2183,7 +2259,7 @@ function getFieldNames(pathSchema, formData) {
2183
2259
  }
2184
2260
  } else if (key === NAME_KEY && data !== "") {
2185
2261
  paths.forEach((path) => {
2186
- const formValue = (0, import_get14.default)(formData, path);
2262
+ const formValue = (0, import_get13.default)(formData, path);
2187
2263
  const isLeaf = objKeys.length === 1;
2188
2264
  if (formValueHasData(formValue, isLeaf) || Array.isArray(formValue) && formValue.every((val) => formValueHasData(val, isLeaf))) {
2189
2265
  acc.push(path);
@@ -2217,11 +2293,11 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2217
2293
  function isSchemaObj(schemaDef) {
2218
2294
  return isObject(schemaDef);
2219
2295
  }
2220
- function handleObject(schema2, source, target) {
2221
- const { properties, additionalProperties, patternProperties, propertyNames } = schema2;
2222
- const requiredSet = new Set(schema2.required ?? []);
2296
+ function handleObject(childSchema, source, target) {
2297
+ const { properties, additionalProperties, patternProperties, propertyNames } = childSchema;
2298
+ const requiredSet = new Set(childSchema.required ?? []);
2223
2299
  function setProperty(key, schemaDef, value, required = false) {
2224
- const v = omit3(schemaDef, value, target[key]);
2300
+ const v = omit2(schemaDef, value, target[key]);
2225
2301
  if (!required && isObject(v)) {
2226
2302
  let sd = isSchemaObj(schemaDef) ? schemaDef : {};
2227
2303
  if (sd.$ref !== void 0) {
@@ -2253,15 +2329,14 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2253
2329
  ]);
2254
2330
  const knownProperties = new Set(Object.keys(properties ?? {}));
2255
2331
  for (const [key, value] of Object.entries(source)) {
2256
- if (knownProperties.has(key)) {
2257
- continue;
2258
- }
2259
- const matched = patterns.find(([re]) => re.test(key));
2260
- if (matched === void 0) {
2261
- patternPropertiesRest.push(key);
2262
- continue;
2332
+ if (!knownProperties.has(key)) {
2333
+ const matched = patterns.find(([re]) => re.test(key));
2334
+ if (matched === void 0) {
2335
+ patternPropertiesRest.push(key);
2336
+ } else {
2337
+ setProperty(key, matched[1], value);
2338
+ }
2263
2339
  }
2264
- setProperty(key, matched[1], value);
2265
2340
  }
2266
2341
  }
2267
2342
  if (additionalProperties !== void 0 && additionalProperties !== false) {
@@ -2273,10 +2348,9 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2273
2348
  } else {
2274
2349
  const knownProperties = new Set(Object.keys(properties ?? {}));
2275
2350
  for (const [key, value] of Object.entries(source)) {
2276
- if (knownProperties.has(key)) {
2277
- continue;
2351
+ if (!knownProperties.has(key)) {
2352
+ setProperty(key, addlSchema, value);
2278
2353
  }
2279
- setProperty(key, addlSchema, value);
2280
2354
  }
2281
2355
  }
2282
2356
  }
@@ -2287,37 +2361,37 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2287
2361
  }
2288
2362
  return target;
2289
2363
  }
2290
- function handleArray(schema2, source, target) {
2291
- const { items, additionalItems } = schema2;
2364
+ function handleArray(childSchema, source, target) {
2365
+ const { items, additionalItems } = childSchema;
2292
2366
  if (items !== void 0) {
2293
2367
  if (Array.isArray(items)) {
2294
- for (let i = 0; i < items.length; i++) {
2295
- target.push(omit3(items[i], source[i]));
2368
+ for (let i = 0; i < items.length; i += 1) {
2369
+ target.push(omit2(items[i], source[i]));
2296
2370
  }
2297
2371
  } else {
2298
- for (let i = 0; i < source.length; i++) {
2299
- target.push(omit3(items, source[i]));
2372
+ for (let i = 0; i < source.length; i += 1) {
2373
+ target.push(omit2(items, source[i]));
2300
2374
  }
2301
2375
  }
2302
2376
  }
2303
2377
  if (additionalItems) {
2304
- for (let i = target.length; i < source.length; i++) {
2305
- target.push(omit3(additionalItems, source[i]));
2378
+ for (let i = target.length; i < source.length; i += 1) {
2379
+ target.push(omit2(additionalItems, source[i]));
2306
2380
  }
2307
2381
  }
2308
2382
  return target;
2309
2383
  }
2310
- function handleConditions(schema2, source, target) {
2311
- const { if: condition, then, else: otherwise } = schema2;
2384
+ function handleConditions(childSchema, source, target) {
2385
+ const { if: condition, then, else: otherwise } = childSchema;
2312
2386
  if (condition === void 0) {
2313
2387
  return target;
2314
2388
  }
2315
2389
  const isThenBranch = isSchemaObj(condition) ? validator.isValid(condition, source, rootSchema) : condition;
2316
2390
  const branch = isThenBranch ? then : otherwise;
2317
- return branch === void 0 ? target : omit3(branch, source, target);
2391
+ return branch === void 0 ? target : omit2(branch, source, target);
2318
2392
  }
2319
- function handleOneOf(oneOf, schema2, source, target) {
2320
- if (!Array.isArray(oneOf) || isSelect(validator, schema2, rootSchema, experimental_customMergeAllOf)) {
2393
+ function handleOneOf(oneOf, childSchema, source, target) {
2394
+ if (!Array.isArray(oneOf) || isSelect(validator, childSchema, rootSchema, experimental_customMergeAllOf)) {
2321
2395
  return target;
2322
2396
  }
2323
2397
  const scoringOptions = relaxOptionsForScoring(oneOf, true, rootSchema);
@@ -2327,96 +2401,130 @@ function omitExtraData(validator, schema, rootSchema = {}, formData, experimenta
2327
2401
  source,
2328
2402
  scoringOptions,
2329
2403
  0,
2330
- getDiscriminatorFieldFromSchema(schema2),
2404
+ getDiscriminatorFieldFromSchema(childSchema),
2331
2405
  experimental_customMergeAllOf
2332
2406
  );
2333
2407
  const winning = oneOf[bestIndex];
2334
2408
  const resolved = isObject(winning) ? resolveAllReferences(winning, rootSchema, []) : scoringOptions[bestIndex];
2335
- return omit3(resolved, source, target);
2409
+ return omit2(resolved, source, target);
2336
2410
  }
2337
- function handleAnyOf(schema2, source, target) {
2338
- const { anyOf } = schema2;
2411
+ function handleAnyOf(childSchema, source, target) {
2412
+ const { anyOf } = childSchema;
2339
2413
  if (!Array.isArray(anyOf)) {
2340
2414
  return target;
2341
2415
  }
2342
2416
  if (source === void 0 || Array.isArray(source) && source.length === 0 || isObject(source) && Object.keys(source).length === 0) {
2417
+ let result = target;
2343
2418
  for (const branch of anyOf) {
2344
- target = omit3(branch, source, target);
2419
+ result = omit2(branch, source, result);
2345
2420
  }
2346
- return target;
2421
+ return result;
2347
2422
  }
2348
- return handleOneOf(anyOf, schema2, source, target);
2423
+ return handleOneOf(anyOf, childSchema, source, target);
2349
2424
  }
2350
- function handleDependencies(schema2, source, target) {
2351
- const { dependencies } = schema2;
2425
+ function handleDependencies(childSchema, source, target) {
2426
+ const { dependencies } = childSchema;
2352
2427
  if (dependencies === void 0 || !isObjectValue(source)) {
2353
2428
  return target;
2354
2429
  }
2430
+ let result = target;
2355
2431
  for (const [key, deps] of Object.entries(dependencies)) {
2356
- if (!(key in source) || Array.isArray(deps)) {
2357
- continue;
2432
+ if (key in source && !Array.isArray(deps)) {
2433
+ result = omit2(deps, source, result);
2358
2434
  }
2359
- target = omit3(deps, source, target);
2360
2435
  }
2361
- return target;
2436
+ return result;
2362
2437
  }
2363
- function omit3(schemaDef, source, target) {
2438
+ function omit2(schemaDef, source, target) {
2364
2439
  if (source === void 0 || schemaDef === false) {
2365
2440
  return void 0;
2366
2441
  }
2367
2442
  if (schemaDef === true || (0, import_isEmpty5.default)(schemaDef)) {
2368
2443
  return source;
2369
2444
  }
2370
- let schema2 = schemaDef;
2371
- const { $ref: ref, allOf } = schema2;
2445
+ let localSchema = schemaDef;
2446
+ const { $ref: ref, allOf } = localSchema;
2372
2447
  if (ref !== void 0) {
2373
- return omit3(findSchemaDefinition(ref, rootSchema), source, target);
2448
+ return omit2(findSchemaDefinition(ref, rootSchema), source, target);
2374
2449
  }
2375
2450
  if (allOf) {
2376
- schema2 = doMergeAllOf(schema2, experimental_customMergeAllOf);
2451
+ localSchema = doMergeAllOf(localSchema, experimental_customMergeAllOf);
2452
+ const remainingAllOf = localSchema.allOf;
2453
+ if (remainingAllOf) {
2454
+ for (let i = 0; i < remainingAllOf.length; i++) {
2455
+ target = omit2(remainingAllOf[i], source, target);
2456
+ }
2457
+ }
2377
2458
  }
2378
- target = handleAnyOf(schema2, source, handleOneOf(schema2.oneOf, schema2, source, target));
2379
- const type = getSchemaType(schema2);
2459
+ let filtered = handleAnyOf(localSchema, source, handleOneOf(localSchema.oneOf, localSchema, source, target));
2460
+ const type = getSchemaType(localSchema);
2380
2461
  if (type === "object") {
2381
2462
  if (!isObjectValue(source)) {
2382
2463
  return void 0;
2383
2464
  }
2384
- target = handleObject(schema2, source, isObjectValue(target) ? target : {});
2465
+ filtered = handleObject(localSchema, source, isObjectValue(filtered) ? filtered : {});
2385
2466
  } else if (type === "array") {
2386
2467
  if (!Array.isArray(source)) {
2387
2468
  return void 0;
2388
2469
  }
2389
- target = handleArray(schema2, source, Array.isArray(target) ? target : []);
2390
- } else if (target === void 0) {
2391
- target = source;
2470
+ filtered = handleArray(localSchema, source, Array.isArray(filtered) ? filtered : []);
2471
+ } else if (filtered === void 0) {
2472
+ filtered = source;
2392
2473
  }
2393
- return handleDependencies(schema2, source, handleConditions(schema2, source, target));
2474
+ return handleDependencies(localSchema, source, handleConditions(localSchema, source, filtered));
2394
2475
  }
2395
- return omit3(schema, formData);
2476
+ return omit2(schema, formData);
2396
2477
  }
2397
2478
 
2398
2479
  // src/schema/sanitizeDataForNewSchema.ts
2399
- var import_get15 = __toESM(require("lodash/get"), 1);
2480
+ var import_get14 = __toESM(require("lodash/get"), 1);
2400
2481
  var import_has5 = __toESM(require("lodash/has"), 1);
2401
2482
  var NO_VALUE = /* @__PURE__ */ Symbol("no Value");
2483
+ function enumValuesForSchema(schema) {
2484
+ if (Array.isArray(schema.enum)) {
2485
+ return schema.enum;
2486
+ }
2487
+ const options = schema.oneOf || schema.anyOf;
2488
+ if (!Array.isArray(options)) {
2489
+ return void 0;
2490
+ }
2491
+ const values = options.map((option) => {
2492
+ if (CONST_KEY in option) {
2493
+ return option[CONST_KEY];
2494
+ }
2495
+ return Array.isArray(option.enum) && option.enum.length === 1 ? option.enum[0] : NO_VALUE;
2496
+ }).filter((value) => value !== NO_VALUE);
2497
+ return values.length > 0 ? values : void 0;
2498
+ }
2499
+ function replacementForInvalidEnumValue(schema, formValue) {
2500
+ const enumValues = enumValuesForSchema(schema);
2501
+ if (!enumValues || enumValues.some((value) => deepEquals_default(value, formValue))) {
2502
+ return NO_VALUE;
2503
+ }
2504
+ const defaultValue = (0, import_get14.default)(schema, DEFAULT_KEY, NO_VALUE);
2505
+ if (defaultValue !== NO_VALUE && enumValues.some((value) => deepEquals_default(value, defaultValue))) {
2506
+ return defaultValue;
2507
+ }
2508
+ return enumValues.length === 1 ? enumValues[0] : void 0;
2509
+ }
2402
2510
  function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, data = {}, experimental_customMergeAllOf) {
2403
2511
  let newFormData;
2404
2512
  if ((0, import_has5.default)(newSchema, PROPERTIES_KEY)) {
2405
2513
  const removeOldSchemaData = {};
2406
2514
  if ((0, import_has5.default)(oldSchema, PROPERTIES_KEY)) {
2407
- const properties = (0, import_get15.default)(oldSchema, PROPERTIES_KEY, {});
2515
+ const properties = (0, import_get14.default)(oldSchema, PROPERTIES_KEY, {});
2408
2516
  Object.keys(properties).forEach((key) => {
2409
2517
  if ((0, import_has5.default)(data, key)) {
2410
2518
  removeOldSchemaData[key] = void 0;
2411
2519
  }
2412
2520
  });
2413
2521
  }
2414
- const keys2 = Object.keys((0, import_get15.default)(newSchema, PROPERTIES_KEY, {}));
2522
+ const keys2 = Object.keys((0, import_get14.default)(newSchema, PROPERTIES_KEY, {}));
2415
2523
  const nestedData = {};
2416
2524
  keys2.forEach((key) => {
2417
- const formValue = (0, import_get15.default)(data, key);
2418
- let oldKeyedSchema = (0, import_get15.default)(oldSchema, [PROPERTIES_KEY, key], {});
2419
- let newKeyedSchema = (0, import_get15.default)(newSchema, [PROPERTIES_KEY, key], {});
2525
+ const formValue = (0, import_get14.default)(data, key);
2526
+ let oldKeyedSchema = (0, import_get14.default)(oldSchema, [PROPERTIES_KEY, key], {});
2527
+ let newKeyedSchema = (0, import_get14.default)(newSchema, [PROPERTIES_KEY, key], {});
2420
2528
  if ((0, import_has5.default)(oldKeyedSchema, REF_KEY)) {
2421
2529
  oldKeyedSchema = retrieveSchema(
2422
2530
  validator,
@@ -2435,8 +2543,8 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2435
2543
  experimental_customMergeAllOf
2436
2544
  );
2437
2545
  }
2438
- const oldSchemaTypeForKey = (0, import_get15.default)(oldKeyedSchema, "type");
2439
- const newSchemaTypeForKey = (0, import_get15.default)(newKeyedSchema, "type");
2546
+ const oldSchemaTypeForKey = (0, import_get14.default)(oldKeyedSchema, "type");
2547
+ const newSchemaTypeForKey = (0, import_get14.default)(newKeyedSchema, "type");
2440
2548
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
2441
2549
  if ((0, import_has5.default)(removeOldSchemaData, key)) {
2442
2550
  delete removeOldSchemaData[key];
@@ -2454,31 +2562,37 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2454
2562
  nestedData[key] = itemData;
2455
2563
  }
2456
2564
  } else {
2457
- const newOptionDefault = (0, import_get15.default)(newKeyedSchema, "default", NO_VALUE);
2458
- const oldOptionDefault = (0, import_get15.default)(oldKeyedSchema, "default", NO_VALUE);
2565
+ const newOptionDefault = (0, import_get14.default)(newKeyedSchema, DEFAULT_KEY, NO_VALUE);
2566
+ const oldOptionDefault = (0, import_get14.default)(oldKeyedSchema, DEFAULT_KEY, NO_VALUE);
2459
2567
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
2460
2568
  if (oldOptionDefault === formValue) {
2461
2569
  removeOldSchemaData[key] = newOptionDefault;
2462
- } else if ((0, import_get15.default)(newKeyedSchema, "readOnly") === true) {
2570
+ } else if ((0, import_get14.default)(newKeyedSchema, "readOnly") === true) {
2463
2571
  removeOldSchemaData[key] = void 0;
2464
2572
  }
2465
2573
  }
2466
- const newOptionConst = (0, import_get15.default)(newKeyedSchema, "const", NO_VALUE);
2467
- const oldOptionConst = (0, import_get15.default)(oldKeyedSchema, "const", NO_VALUE);
2574
+ const newOptionConst = (0, import_get14.default)(newKeyedSchema, CONST_KEY, NO_VALUE);
2575
+ const oldOptionConst = (0, import_get14.default)(oldKeyedSchema, CONST_KEY, NO_VALUE);
2468
2576
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
2469
2577
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
2470
2578
  }
2579
+ if ((0, import_has5.default)(data, key)) {
2580
+ const enumReplacement = replacementForInvalidEnumValue(newKeyedSchema, formValue);
2581
+ if (enumReplacement !== NO_VALUE) {
2582
+ removeOldSchemaData[key] = enumReplacement;
2583
+ }
2584
+ }
2471
2585
  }
2472
2586
  }
2473
2587
  });
2474
2588
  newFormData = {
2475
- ...typeof data == "string" || Array.isArray(data) ? void 0 : data,
2589
+ ...typeof data === "string" || Array.isArray(data) ? void 0 : data,
2476
2590
  ...removeOldSchemaData,
2477
2591
  ...nestedData
2478
2592
  };
2479
- } else if ((0, import_get15.default)(oldSchema, "type") === "array" && (0, import_get15.default)(newSchema, "type") === "array" && Array.isArray(data)) {
2480
- let oldSchemaItems = (0, import_get15.default)(oldSchema, "items");
2481
- let newSchemaItems = (0, import_get15.default)(newSchema, "items");
2593
+ } else if ((0, import_get14.default)(oldSchema, "type") === "array" && (0, import_get14.default)(newSchema, "type") === "array" && Array.isArray(data)) {
2594
+ let oldSchemaItems = (0, import_get14.default)(oldSchema, "items");
2595
+ let newSchemaItems = (0, import_get14.default)(newSchema, "items");
2482
2596
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
2483
2597
  if ((0, import_has5.default)(oldSchemaItems, REF_KEY)) {
2484
2598
  oldSchemaItems = retrieveSchema(
@@ -2498,10 +2612,10 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2498
2612
  experimental_customMergeAllOf
2499
2613
  );
2500
2614
  }
2501
- const oldSchemaType = (0, import_get15.default)(oldSchemaItems, "type");
2502
- const newSchemaType = (0, import_get15.default)(newSchemaItems, "type");
2615
+ const oldSchemaType = (0, import_get14.default)(oldSchemaItems, "type");
2616
+ const newSchemaType = (0, import_get14.default)(newSchemaItems, "type");
2503
2617
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
2504
- const maxItems = (0, import_get15.default)(newSchema, "maxItems", -1);
2618
+ const maxItems = (0, import_get14.default)(newSchema, "maxItems", -1);
2505
2619
  if (newSchemaType === "object") {
2506
2620
  newFormData = data.reduce((newValue, aValue) => {
2507
2621
  const itemValue = sanitizeDataForNewSchema(
@@ -2518,7 +2632,9 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2518
2632
  return newValue;
2519
2633
  }, []);
2520
2634
  } else {
2521
- newFormData = maxItems > 0 && data.length > maxItems ? data.slice(0, maxItems) : data;
2635
+ const newItemEnumValues = enumValuesForSchema(newSchemaItems);
2636
+ const filteredData = newItemEnumValues ? data.filter((item) => newItemEnumValues.some((v) => deepEquals_default(v, item))) : data;
2637
+ newFormData = maxItems > 0 && filteredData.length > maxItems ? filteredData.slice(0, maxItems) : filteredData;
2522
2638
  }
2523
2639
  }
2524
2640
  } else if (typeof oldSchemaItems === "boolean" && typeof newSchemaItems === "boolean" && oldSchemaItems === newSchemaItems) {
@@ -2529,21 +2645,21 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2529
2645
  }
2530
2646
 
2531
2647
  // src/schema/toPathSchema.ts
2532
- var import_get16 = __toESM(require("lodash/get"), 1);
2648
+ var import_get15 = __toESM(require("lodash/get"), 1);
2533
2649
  var import_isObject12 = __toESM(require("lodash/isObject"), 1);
2534
2650
  var import_set2 = __toESM(require("lodash/set"), 1);
2535
2651
  function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
2536
2652
  if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema || IF_KEY in schema) {
2537
- const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
2538
- const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals_default(item, _schema));
2653
+ const innerSchema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
2654
+ const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals_default(item, innerSchema));
2539
2655
  if (sameSchemaIndex === -1) {
2540
2656
  return toPathSchemaInternal(
2541
2657
  validator,
2542
- _schema,
2658
+ innerSchema,
2543
2659
  name,
2544
2660
  rootSchema,
2545
2661
  formData,
2546
- _recurseList.concat(_schema),
2662
+ _recurseList.concat(innerSchema),
2547
2663
  experimental_customMergeAllOf
2548
2664
  );
2549
2665
  }
@@ -2563,12 +2679,12 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2563
2679
  discriminator,
2564
2680
  experimental_customMergeAllOf
2565
2681
  );
2566
- const _schema = xxxOf[index];
2682
+ const innerSchema = xxxOf[index];
2567
2683
  pathSchema = {
2568
2684
  ...pathSchema,
2569
2685
  ...toPathSchemaInternal(
2570
2686
  validator,
2571
- _schema,
2687
+ innerSchema,
2572
2688
  name,
2573
2689
  rootSchema,
2574
2690
  formData,
@@ -2580,7 +2696,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2580
2696
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema[ADDITIONAL_PROPERTIES_KEY] !== false) {
2581
2697
  (0, import_set2.default)(pathSchema, RJSF_ADDITIONAL_PROPERTIES_FLAG, true);
2582
2698
  const additionalSchema = (0, import_isObject12.default)(schema[ADDITIONAL_PROPERTIES_KEY]) ? schema[ADDITIONAL_PROPERTIES_KEY] : {};
2583
- const definedProperties = (0, import_get16.default)(schema, PROPERTIES_KEY, {});
2699
+ const definedProperties = (0, import_get15.default)(schema, PROPERTIES_KEY, {});
2584
2700
  for (const key of Object.keys(formData ?? {})) {
2585
2701
  if (!(key in definedProperties)) {
2586
2702
  pathSchema[key] = toPathSchemaInternal(
@@ -2588,7 +2704,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2588
2704
  additionalSchema,
2589
2705
  `${name}.${key}`,
2590
2706
  rootSchema,
2591
- (0, import_get16.default)(formData, [key]),
2707
+ (0, import_get15.default)(formData, [key]),
2592
2708
  _recurseList,
2593
2709
  experimental_customMergeAllOf
2594
2710
  );
@@ -2638,7 +2754,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2638
2754
  }
2639
2755
  } else if (PROPERTIES_KEY in schema) {
2640
2756
  for (const property in schema.properties) {
2641
- const field = (0, import_get16.default)(schema, [PROPERTIES_KEY, property], {});
2757
+ const field = (0, import_get15.default)(schema, [PROPERTIES_KEY, property], {});
2642
2758
  pathSchema[property] = toPathSchemaInternal(
2643
2759
  validator,
2644
2760
  field,
@@ -2646,7 +2762,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2646
2762
  rootSchema,
2647
2763
  // It's possible that formData is not an object -- this can happen if an
2648
2764
  // array item has just been added, but not populated with data yet
2649
- (0, import_get16.default)(formData, [property]),
2765
+ (0, import_get15.default)(formData, [property]),
2650
2766
  _recurseList,
2651
2767
  experimental_customMergeAllOf
2652
2768
  );
@@ -2668,8 +2784,8 @@ var SchemaUtils = class {
2668
2784
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2669
2785
  */
2670
2786
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2671
- if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2672
- this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get17.default)(rootSchema, ID_KEY, "#"));
2787
+ if (rootSchema?.[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2788
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get16.default)(rootSchema, ID_KEY, "#"));
2673
2789
  } else {
2674
2790
  this.rootSchema = rootSchema;
2675
2791
  }
@@ -2920,6 +3036,7 @@ var SchemaUtils = class {
2920
3036
  * @param [formData] - The current formData, if any, onto which to provide any missing defaults
2921
3037
  * @returns - The `PathSchema` object for the `schema`
2922
3038
  */
3039
+ // oxlint-disable-next-line typescript/no-deprecated
2923
3040
  toPathSchema(schema, name, formData) {
2924
3041
  return toPathSchema(
2925
3042
  this.validator,
@@ -2942,7 +3059,7 @@ function createSchemaUtils(validator, rootSchema, experimental_defaultFormStateB
2942
3059
 
2943
3060
  // src/dataURItoBlob.ts
2944
3061
  function dataURItoBlob(dataURILike) {
2945
- if (dataURILike.indexOf("data:") === -1) {
3062
+ if (!dataURILike.includes("data:")) {
2946
3063
  throw new Error("File is invalid: URI must be a dataURI");
2947
3064
  }
2948
3065
  const dataURI = dataURILike.slice(5);
@@ -2961,13 +3078,13 @@ function dataURItoBlob(dataURILike) {
2961
3078
  try {
2962
3079
  const binary = atob(base64);
2963
3080
  const array = new Array(binary.length);
2964
- for (let i = 0; i < binary.length; i++) {
3081
+ for (let i = 0; i < binary.length; i += 1) {
2965
3082
  array[i] = binary.charCodeAt(i);
2966
3083
  }
2967
3084
  const blob = new window.Blob([new Uint8Array(array)], { type });
2968
3085
  return { blob, name };
2969
3086
  } catch (error) {
2970
- throw new Error("File is invalid: " + error.message);
3087
+ throw new Error(`File is invalid: ${error.message}`);
2971
3088
  }
2972
3089
  }
2973
3090
 
@@ -2975,24 +3092,26 @@ function dataURItoBlob(dataURILike) {
2975
3092
  function pad(num, width) {
2976
3093
  let s = String(num);
2977
3094
  while (s.length < width) {
2978
- s = "0" + s;
3095
+ s = `0${s}`;
2979
3096
  }
2980
3097
  return s;
2981
3098
  }
2982
3099
 
2983
3100
  // src/dateRangeOptions.ts
2984
3101
  function dateRangeOptions(start, stop) {
2985
- if (start <= 0 && stop <= 0) {
2986
- start = (/* @__PURE__ */ new Date()).getFullYear() + start;
2987
- stop = (/* @__PURE__ */ new Date()).getFullYear() + stop;
2988
- } else if (start < 0 || stop < 0) {
3102
+ const bothRelative = start <= 0 && stop <= 0;
3103
+ const eitherNegative = start < 0 || stop < 0;
3104
+ if (!bothRelative && eitherNegative) {
2989
3105
  throw new Error(`Both start (${start}) and stop (${stop}) must both be <= 0 or > 0, got one of each`);
2990
3106
  }
2991
- if (start > stop) {
3107
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
3108
+ const resolvedStart = bothRelative ? currentYear + start : start;
3109
+ const resolvedStop = bothRelative ? currentYear + stop : stop;
3110
+ if (resolvedStart > resolvedStop) {
2992
3111
  return dateRangeOptions(stop, start).reverse();
2993
3112
  }
2994
3113
  const options = [];
2995
- for (let i = start; i <= stop; i++) {
3114
+ for (let i = resolvedStart; i <= resolvedStop; i += 1) {
2996
3115
  options.push({ value: i, label: pad(i, 2) });
2997
3116
  }
2998
3117
  return options;
@@ -3091,7 +3210,7 @@ function decodeSingle(value, enumOptions, emptyValue) {
3091
3210
  return match.value;
3092
3211
  }
3093
3212
  const index = Number(value);
3094
- if (!isNaN(index) && index >= 0 && index < enumOptions.length) {
3213
+ if (!Number.isNaN(index) && index >= 0 && index < enumOptions.length) {
3095
3214
  return enumOptions[index].value;
3096
3215
  }
3097
3216
  return emptyValue;
@@ -3123,7 +3242,7 @@ function enumOptionValueEncoder(value, index, format = "indexed") {
3123
3242
 
3124
3243
  // src/ErrorSchemaBuilder.ts
3125
3244
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
3126
- var import_get18 = __toESM(require("lodash/get"), 1);
3245
+ var import_get17 = __toESM(require("lodash/get"), 1);
3127
3246
  var import_set3 = __toESM(require("lodash/set"), 1);
3128
3247
  var import_setWith = __toESM(require("lodash/setWith"), 1);
3129
3248
  var ErrorSchemaBuilder = class {
@@ -3152,7 +3271,7 @@ var ErrorSchemaBuilder = class {
3152
3271
  */
3153
3272
  getOrCreateErrorBlock(pathOfError) {
3154
3273
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
3155
- let errorBlock = hasPath ? (0, import_get18.default)(this.errorSchema, pathOfError) : this.errorSchema;
3274
+ let errorBlock = hasPath ? (0, import_get17.default)(this.errorSchema, pathOfError) : this.errorSchema;
3156
3275
  if (!errorBlock && pathOfError) {
3157
3276
  errorBlock = {};
3158
3277
  (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
@@ -3178,7 +3297,7 @@ var ErrorSchemaBuilder = class {
3178
3297
  */
3179
3298
  addErrors(errorOrList, pathOfError) {
3180
3299
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
3181
- let errorsList = (0, import_get18.default)(errorBlock, ERRORS_KEY);
3300
+ let errorsList = (0, import_get17.default)(errorBlock, ERRORS_KEY);
3182
3301
  if (!Array.isArray(errorsList)) {
3183
3302
  errorsList = [];
3184
3303
  errorBlock[ERRORS_KEY] = errorsList;
@@ -3220,7 +3339,7 @@ var ErrorSchemaBuilder = class {
3220
3339
 
3221
3340
  // src/getChangedFields.ts
3222
3341
  var import_difference = __toESM(require("lodash/difference"), 1);
3223
- var import_get19 = __toESM(require("lodash/get"), 1);
3342
+ var import_get18 = __toESM(require("lodash/get"), 1);
3224
3343
  var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
3225
3344
  var import_keys = __toESM(require("lodash/keys"), 1);
3226
3345
  var import_pickBy = __toESM(require("lodash/pickBy"), 1);
@@ -3232,13 +3351,13 @@ function getChangedFields(a, b) {
3232
3351
  }
3233
3352
  if (aIsPlainObject && !bIsPlainObject) {
3234
3353
  return (0, import_keys.default)(a);
3235
- } else if (!aIsPlainObject && bIsPlainObject) {
3354
+ }
3355
+ if (!aIsPlainObject && bIsPlainObject) {
3236
3356
  return (0, import_keys.default)(b);
3237
- } else {
3238
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals_default(value, (0, import_get19.default)(b, key))));
3239
- const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3240
- return [...unequalFields, ...diffFields];
3241
3357
  }
3358
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals_default(value, (0, import_get18.default)(b, key))));
3359
+ const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3360
+ return [...unequalFields, ...diffFields];
3242
3361
  }
3243
3362
 
3244
3363
  // src/getDateElementProps.ts
@@ -3337,7 +3456,7 @@ var DEFAULT_OPTIONS = {
3337
3456
  };
3338
3457
  function getSubmitButtonOptions(uiSchema = {}) {
3339
3458
  const uiOptions = getUiOptions(uiSchema);
3340
- if (uiOptions && uiOptions[SUBMIT_BTN_OPTIONS_KEY]) {
3459
+ if (uiOptions?.[SUBMIT_BTN_OPTIONS_KEY]) {
3341
3460
  const options = uiOptions[SUBMIT_BTN_OPTIONS_KEY];
3342
3461
  return { ...DEFAULT_OPTIONS, ...options };
3343
3462
  }
@@ -3362,10 +3481,10 @@ function getTemplate(name, registry, uiOptions = {}) {
3362
3481
  }
3363
3482
 
3364
3483
  // src/getTestIds.ts
3365
- var import_get20 = __toESM(require("lodash/get"), 1);
3484
+ var import_get19 = __toESM(require("lodash/get"), 1);
3366
3485
  var import_uniqueId = __toESM(require("lodash/uniqueId"), 1);
3367
3486
  function getTestIds() {
3368
- if ((0, import_get20.default)(globalThis, "process.env.NODE_ENV") !== "test") {
3487
+ if ((0, import_get19.default)(globalThis, "process.env.NODE_ENV") !== "test") {
3369
3488
  return {};
3370
3489
  }
3371
3490
  const ids = /* @__PURE__ */ new Map();
@@ -3384,7 +3503,7 @@ function getTestIds() {
3384
3503
 
3385
3504
  // src/getWidget.tsx
3386
3505
  var import_react = require("react");
3387
- var import_get21 = __toESM(require("lodash/get"), 1);
3506
+ var import_get20 = __toESM(require("lodash/get"), 1);
3388
3507
  var import_set4 = __toESM(require("lodash/set"), 1);
3389
3508
  var import_react_is = __toESM(require("react-is"), 1);
3390
3509
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -3441,12 +3560,10 @@ var widgetMap = {
3441
3560
  }
3442
3561
  };
3443
3562
  function mergeWidgetOptions(AWidget) {
3444
- let MergedWidget = (0, import_get21.default)(AWidget, "MergedWidget");
3563
+ let MergedWidget = (0, import_get20.default)(AWidget, "MergedWidget");
3445
3564
  if (!MergedWidget) {
3446
- const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
3447
- MergedWidget = ({ options, ...props }) => {
3448
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AWidget, { options: { ...defaultOptions, ...options }, ...props });
3449
- };
3565
+ const defaultOptions = AWidget.defaultProps?.options || {};
3566
+ MergedWidget = ({ options, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AWidget, { options: { ...defaultOptions, ...options }, ...props });
3450
3567
  (0, import_set4.default)(AWidget, "MergedWidget", MergedWidget);
3451
3568
  }
3452
3569
  return MergedWidget;
@@ -3478,23 +3595,26 @@ function getWidget(schema, widget, registeredWidgets = {}) {
3478
3595
  // src/hashForSchema.ts
3479
3596
  function hashString(string) {
3480
3597
  let hash = 0;
3481
- for (let i = 0; i < string.length; i += 1) {
3598
+ for (let i = 0; i < string.length; i++) {
3482
3599
  const chr = string.charCodeAt(i);
3483
3600
  hash = (hash << 5) - hash + chr;
3484
- hash = hash & hash;
3601
+ hash &= hash;
3485
3602
  }
3486
3603
  return hash.toString(16);
3487
3604
  }
3488
3605
  function sortedJSONStringify(object) {
3489
3606
  const allKeys = /* @__PURE__ */ new Set();
3490
- JSON.stringify(object, (key, value) => (allKeys.add(key), value));
3607
+ JSON.stringify(object, (key, value) => {
3608
+ allKeys.add(key);
3609
+ return value;
3610
+ });
3491
3611
  return JSON.stringify(object, Array.from(allKeys).sort());
3492
3612
  }
3493
3613
  function hashObject(object) {
3494
3614
  return hashString(sortedJSONStringify(object));
3495
3615
  }
3496
3616
  function hashForSchema(schema) {
3497
- return hashObject(schema);
3617
+ return hashString(sortedJSONStringify(schema));
3498
3618
  }
3499
3619
 
3500
3620
  // src/hasWidget.ts
@@ -3555,7 +3675,6 @@ function isFormDataAvailable(formData) {
3555
3675
  }
3556
3676
 
3557
3677
  // src/isRootSchema.ts
3558
- var import_omit2 = __toESM(require("lodash/omit"), 1);
3559
3678
  function isRootSchema(registry, schemaToCompare) {
3560
3679
  const { rootSchema, schemaUtils } = registry;
3561
3680
  if (deepEquals_default(schemaToCompare, rootSchema)) {
@@ -3563,7 +3682,7 @@ function isRootSchema(registry, schemaToCompare) {
3563
3682
  }
3564
3683
  if (REF_KEY in rootSchema) {
3565
3684
  const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
3566
- return deepEquals_default(schemaToCompare, (0, import_omit2.default)(resolvedSchema, RJSF_REF_KEY));
3685
+ return deepEquals_default(schemaToCompare, resolvedSchema);
3567
3686
  }
3568
3687
  return false;
3569
3688
  }
@@ -3578,15 +3697,24 @@ function localToUTC(dateString) {
3578
3697
  return dateString ? new Date(dateString).toJSON() : void 0;
3579
3698
  }
3580
3699
 
3700
+ // src/logUnsupportedDefaultForEnum.ts
3701
+ function logUnsupportedDefaultForEnum(id, schema, enumOptions, multiple = false) {
3702
+ if (!multiple && Array.isArray(enumOptions) && schema.default !== void 0 && enumOptionsIndexForValue(schema.default, enumOptions, multiple) === void 0) {
3703
+ console.error(
3704
+ `The schema default value "${schema.default}" is not one of the values in the enum options for "${id}"`
3705
+ );
3706
+ }
3707
+ }
3708
+
3581
3709
  // src/lookupFromFormContext.ts
3582
- var import_get22 = __toESM(require("lodash/get"), 1);
3710
+ var import_get21 = __toESM(require("lodash/get"), 1);
3583
3711
  var import_has6 = __toESM(require("lodash/has"), 1);
3584
3712
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3585
3713
  const lookupPath = [LOOKUP_MAP_NAME];
3586
3714
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3587
3715
  lookupPath.unshift(FORM_CONTEXT_NAME);
3588
3716
  }
3589
- return (0, import_get22.default)(regOrFc, [...lookupPath, toLookup], fallback);
3717
+ return (0, import_get21.default)(regOrFc, [...lookupPath, toLookup], fallback);
3590
3718
  }
3591
3719
 
3592
3720
  // src/nameGenerators.ts
@@ -3614,9 +3742,9 @@ function orderProperties(properties, order) {
3614
3742
  if (!Array.isArray(order)) {
3615
3743
  return properties;
3616
3744
  }
3617
- const arrayToHash = (arr) => arr.reduce((prev, curr) => {
3618
- prev[curr] = true;
3619
- return prev;
3745
+ const arrayToHash = (arr) => arr.reduce((acc, curr) => {
3746
+ acc[curr] = true;
3747
+ return acc;
3620
3748
  }, {});
3621
3749
  const errorPropList = (arr) => arr.length > 1 ? `properties '${arr.join("', '")}'` : `property '${arr[0]}'`;
3622
3750
  const propertyHash = arrayToHash(properties);
@@ -3652,7 +3780,7 @@ function parseDateString(dateString, includeTime = true) {
3652
3780
  }
3653
3781
  const date = new Date(dateString);
3654
3782
  if (Number.isNaN(date.getTime())) {
3655
- throw new Error("Unable to parse date " + dateString);
3783
+ throw new Error(`Unable to parse date ${dateString}`);
3656
3784
  }
3657
3785
  return {
3658
3786
  year: date.getUTCFullYear(),
@@ -3705,11 +3833,10 @@ function removeOptionalEmptyObjects(validator, schema, rootSchema, formData) {
3705
3833
  const isArr = Array.isArray(value);
3706
3834
  if ((isObj || isArr) && properties[key]) {
3707
3835
  const cleaned = removeOptionalEmptyObjects(validator, propertySchema, rootSchema, value);
3708
- if (!isRequired && isValueEmpty(cleaned)) {
3709
- continue;
3836
+ if (isRequired || !isValueEmpty(cleaned)) {
3837
+ result[key] = cleaned;
3838
+ hasAnyValue = true;
3710
3839
  }
3711
- result[key] = cleaned;
3712
- hasAnyValue = true;
3713
3840
  } else if (isRequired || !isValueEmpty(value) || !properties[key]) {
3714
3841
  result[key] = value;
3715
3842
  if (!isValueEmpty(value)) {
@@ -3749,23 +3876,22 @@ function resolveUiSchema(schema, localUiSchema, registry) {
3749
3876
  }
3750
3877
  for (const keyword of [ONE_OF_KEY, ANY_OF_KEY]) {
3751
3878
  const schemaOptions = resolvedSchema[keyword];
3752
- if (!Array.isArray(schemaOptions) || schemaOptions.length === 0) {
3753
- continue;
3754
- }
3755
- const currentUiSchemaArray = result[keyword];
3756
- const uiSchemaArray = Array.isArray(currentUiSchemaArray) ? [...currentUiSchemaArray] : [];
3757
- let hasExpanded = false;
3758
- for (let i = 0; i < schemaOptions.length; i++) {
3759
- const option = schemaOptions[i];
3760
- const optionRef = option?.[RJSF_REF_KEY] ?? option?.[REF_KEY];
3761
- if (optionRef && optionRef in definitions) {
3762
- const optionUiSchema = uiSchemaArray[i] || {};
3763
- uiSchemaArray[i] = mergeObjects(definitions[optionRef], optionUiSchema);
3764
- hasExpanded = true;
3879
+ if (Array.isArray(schemaOptions) && schemaOptions.length > 0) {
3880
+ const currentUiSchemaArray = result[keyword];
3881
+ const uiSchemaArray = Array.isArray(currentUiSchemaArray) ? [...currentUiSchemaArray] : [];
3882
+ let hasExpanded = false;
3883
+ for (let i = 0; i < schemaOptions.length; i++) {
3884
+ const option = schemaOptions[i];
3885
+ const optionRef = option?.[RJSF_REF_KEY] ?? option?.[REF_KEY];
3886
+ if (optionRef && optionRef in definitions) {
3887
+ const optionUiSchema = uiSchemaArray[i] || {};
3888
+ uiSchemaArray[i] = mergeObjects(definitions[optionRef], optionUiSchema);
3889
+ hasExpanded = true;
3890
+ }
3891
+ }
3892
+ if (hasExpanded) {
3893
+ result[keyword] = uiSchemaArray;
3765
3894
  }
3766
- }
3767
- if (hasExpanded) {
3768
- result[keyword] = uiSchemaArray;
3769
3895
  }
3770
3896
  }
3771
3897
  }
@@ -3777,13 +3903,13 @@ function schemaRequiresTrueValue(schema) {
3777
3903
  if (schema.const) {
3778
3904
  return true;
3779
3905
  }
3780
- if (schema.enum && schema.enum.length === 1 && schema.enum[0] === true) {
3906
+ if (schema.enum?.length === 1 && schema.enum[0] === true) {
3781
3907
  return true;
3782
3908
  }
3783
- if (schema.anyOf && schema.anyOf.length === 1) {
3909
+ if (schema.anyOf?.length === 1) {
3784
3910
  return schemaRequiresTrueValue(schema.anyOf[0]);
3785
3911
  }
3786
- if (schema.oneOf && schema.oneOf.length === 1) {
3912
+ if (schema.oneOf?.length === 1) {
3787
3913
  return schemaRequiresTrueValue(schema.oneOf[0]);
3788
3914
  }
3789
3915
  if (schema.allOf) {
@@ -3793,6 +3919,38 @@ function schemaRequiresTrueValue(schema) {
3793
3919
  return false;
3794
3920
  }
3795
3921
 
3922
+ // src/SelectedOptionDescription.tsx
3923
+ var import_jsx_runtime2 = require("react/jsx-runtime");
3924
+ function SelectedOptionDescription({ hideLabel, id, multiple, options, registry, uiSchema, value }) {
3925
+ if (multiple || hideLabel) {
3926
+ return null;
3927
+ }
3928
+ const { label = true } = getUiOptions(uiSchema, registry.globalUiOptions);
3929
+ if (!label) {
3930
+ return null;
3931
+ }
3932
+ const option = options.enumOptions?.find(({ value: enumValue }) => enumOptionsIsSelected(enumValue, value));
3933
+ const description = option?.schema?.description;
3934
+ if (!description) {
3935
+ return null;
3936
+ }
3937
+ const DescriptionFieldTemplate = getTemplate(
3938
+ "DescriptionFieldTemplate",
3939
+ registry,
3940
+ options
3941
+ );
3942
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
3943
+ DescriptionFieldTemplate,
3944
+ {
3945
+ id: descriptionId(id),
3946
+ description,
3947
+ schema: option.schema,
3948
+ uiSchema,
3949
+ registry
3950
+ }
3951
+ );
3952
+ }
3953
+
3796
3954
  // src/shallowEquals.ts
3797
3955
  function shallowEquals(a, b) {
3798
3956
  if (Object.is(a, b)) {
@@ -3809,9 +3967,9 @@ function shallowEquals(a, b) {
3809
3967
  if (keysA.length !== keysB.length) {
3810
3968
  return false;
3811
3969
  }
3812
- for (let i = 0; i < keysA.length; i++) {
3970
+ for (let i = 0; i < keysA.length; i += 1) {
3813
3971
  const key = keysA[i];
3814
- if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {
3972
+ if (!Object.hasOwn(b, key) || !Object.is(a[key], b[key])) {
3815
3973
  return false;
3816
3974
  }
3817
3975
  }
@@ -3880,14 +4038,14 @@ function toErrorList(errorSchema, fieldPath = []) {
3880
4038
  })
3881
4039
  );
3882
4040
  }
3883
- return Object.keys(errorSchema).reduce((acc, key) => {
4041
+ return Object.keys(errorSchema).reduce((currentList, key) => {
3884
4042
  if (key !== ERRORS_KEY) {
3885
4043
  const childSchema = errorSchema[key];
3886
4044
  if ((0, import_isPlainObject3.default)(childSchema)) {
3887
- acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
4045
+ return currentList.concat(toErrorList(childSchema, [...fieldPath, key]));
3888
4046
  }
3889
4047
  }
3890
- return acc;
4048
+ return currentList;
3891
4049
  }, errorList);
3892
4050
  }
3893
4051
 
@@ -3929,22 +4087,21 @@ function unwrapErrorHandler(errorHandler) {
3929
4087
  return Object.keys(errorHandler).reduce((acc, key) => {
3930
4088
  if (key === "addError") {
3931
4089
  return acc;
3932
- } else {
3933
- const childSchema = errorHandler[key];
3934
- if ((0, import_isPlainObject4.default)(childSchema)) {
3935
- return {
3936
- ...acc,
3937
- [key]: unwrapErrorHandler(childSchema)
3938
- };
3939
- }
3940
- return { ...acc, [key]: childSchema };
3941
4090
  }
4091
+ const childSchema = errorHandler[key];
4092
+ if ((0, import_isPlainObject4.default)(childSchema)) {
4093
+ return {
4094
+ ...acc,
4095
+ [key]: unwrapErrorHandler(childSchema)
4096
+ };
4097
+ }
4098
+ return { ...acc, [key]: childSchema };
3942
4099
  }, {});
3943
4100
  }
3944
4101
 
3945
4102
  // src/useAltDateWidgetProps.tsx
3946
4103
  var import_react2 = require("react");
3947
- var import_jsx_runtime2 = require("react/jsx-runtime");
4104
+ var import_jsx_runtime3 = require("react/jsx-runtime");
3948
4105
  function readyForChange(state) {
3949
4106
  return Object.values(state).every((value) => value !== -1);
3950
4107
  }
@@ -3966,8 +4123,8 @@ function DateElement(props) {
3966
4123
  } = props;
3967
4124
  const id = `${rootId}_${type}`;
3968
4125
  const { SelectWidget } = registry.widgets;
3969
- const onChange = (0, import_react2.useCallback)((value2) => select(type, value2), [select, type]);
3970
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
4126
+ const onChange = (0, import_react2.useCallback)((newValue) => select(type, newValue), [select, type]);
4127
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
3971
4128
  SelectWidget,
3972
4129
  {
3973
4130
  schema: { type: "integer" },
@@ -3996,10 +4153,10 @@ function useAltDateWidgetProps(props) {
3996
4153
  setState(parseDateString(value, time));
3997
4154
  }, [time, value]);
3998
4155
  const handleChange = (0, import_react2.useCallback)(
3999
- (property, value2) => {
4156
+ (property, newValue) => {
4000
4157
  const nextState = {
4001
4158
  ...state,
4002
- [property]: typeof value2 === "undefined" ? -1 : value2
4159
+ [property]: typeof newValue === "undefined" ? -1 : newValue
4003
4160
  };
4004
4161
  if (readyForChange(nextState)) {
4005
4162
  onChange(toDateString(nextState, time));
@@ -4057,7 +4214,7 @@ var import_react4 = require("react");
4057
4214
  function addNameToDataURL(dataURL, name) {
4058
4215
  return dataURL.replace(";base64", `;name=${encodeURIComponent(name)};base64`);
4059
4216
  }
4060
- function processFile(file) {
4217
+ async function processFile(file) {
4061
4218
  const { name, size, type } = file;
4062
4219
  return new Promise((resolve, reject) => {
4063
4220
  const reader = new window.FileReader();
@@ -4082,7 +4239,7 @@ function processFile(file) {
4082
4239
  reader.readAsDataURL(file);
4083
4240
  });
4084
4241
  }
4085
- function processFiles(files) {
4242
+ async function processFiles(files) {
4086
4243
  return Promise.all(Array.from(files).map(processFile));
4087
4244
  }
4088
4245
  function extractFileInfo(dataURLs) {
@@ -4182,22 +4339,21 @@ function validationDataMerge(validationData, additionalErrorSchema, preventDupli
4182
4339
  // src/withIdRefPrefix.ts
4183
4340
  var import_isObject16 = __toESM(require("lodash/isObject"), 1);
4184
4341
  function withIdRefPrefixObject(node) {
4185
- for (const key in node) {
4186
- const realObj = node;
4187
- const value = realObj[key];
4188
- if (key === REF_KEY && typeof value === "string" && value.startsWith("#")) {
4189
- realObj[key] = ROOT_SCHEMA_PREFIX + value;
4190
- } else {
4191
- realObj[key] = withIdRefPrefix(value);
4342
+ const realObj = node;
4343
+ for (const key in realObj) {
4344
+ if (Object.hasOwn(realObj, key)) {
4345
+ const value = realObj[key];
4346
+ if (key === REF_KEY && typeof value === "string" && value.startsWith("#")) {
4347
+ realObj[key] = ROOT_SCHEMA_PREFIX + value;
4348
+ } else {
4349
+ realObj[key] = withIdRefPrefix(value);
4350
+ }
4192
4351
  }
4193
4352
  }
4194
4353
  return node;
4195
4354
  }
4196
4355
  function withIdRefPrefixArray(node) {
4197
- for (let i = 0; i < node.length; i++) {
4198
- node[i] = withIdRefPrefix(node[i]);
4199
- }
4200
- return node;
4356
+ return node.map((item) => withIdRefPrefix(item));
4201
4357
  }
4202
4358
  function withIdRefPrefix(schemaNode) {
4203
4359
  if (Array.isArray(schemaNode)) {
@@ -4222,6 +4378,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
4222
4378
  TranslatableString2["AddButton"] = "Add";
4223
4379
  TranslatableString2["AddItemButton"] = "Add Item";
4224
4380
  TranslatableString2["CopyButton"] = "Copy";
4381
+ TranslatableString2["ExpandButton"] = "Expand Cycle";
4225
4382
  TranslatableString2["MoveDownButton"] = "Move down";
4226
4383
  TranslatableString2["MoveUpButton"] = "Move up";
4227
4384
  TranslatableString2["RemoveButton"] = "Remove";
@@ -4242,6 +4399,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
4242
4399
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
4243
4400
  TranslatableString2["KeyLabel"] = "%1 Key";
4244
4401
  TranslatableString2["DeprecatedLabel"] = "%1 (deprecated)";
4402
+ TranslatableString2["CycleDetected"] = 'Circular reference ($ref cycle) detected for field "%1". You may choose to expand to the next cycle break';
4245
4403
  TranslatableString2["InvalidObjectField"] = 'Invalid "%1" object field configuration: _%2_.';
4246
4404
  TranslatableString2["UnsupportedField"] = "Unsupported field schema.";
4247
4405
  TranslatableString2["UnsupportedFieldWithId"] = "Unsupported field schema for field `%1`.";
@@ -4255,7 +4413,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
4255
4413
  var import_forEach = __toESM(require("lodash/forEach"), 1);
4256
4414
 
4257
4415
  // src/parser/ParserValidator.ts
4258
- var import_get23 = __toESM(require("lodash/get"), 1);
4416
+ var import_get22 = __toESM(require("lodash/get"), 1);
4259
4417
  var ParserValidator = class {
4260
4418
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
4261
4419
  * first.
@@ -4281,7 +4439,7 @@ var ParserValidator = class {
4281
4439
  * @param hash - The hash value at which to map the schema
4282
4440
  */
4283
4441
  addSchema(schema, hash) {
4284
- const key = (0, import_get23.default)(schema, ID_KEY, hash);
4442
+ const key = (0, import_get22.default)(schema, ID_KEY, hash);
4285
4443
  const identifiedSchema = { ...schema, [ID_KEY]: key };
4286
4444
  const existing = this.schemaMap[key];
4287
4445
  if (!existing) {
@@ -4347,20 +4505,20 @@ var ParserValidator = class {
4347
4505
  // src/parser/schemaParser.ts
4348
4506
  function parseSchema(validator, recurseList, rootSchema, schema) {
4349
4507
  const schemas = retrieveSchemaInternal(validator, schema, rootSchema, void 0, true);
4350
- schemas.forEach((schema2) => {
4351
- const sameSchemaIndex = recurseList.findIndex((item) => deepEquals_default(item, schema2));
4508
+ schemas.forEach((localSchema) => {
4509
+ const sameSchemaIndex = recurseList.findIndex((item) => deepEquals_default(item, localSchema));
4352
4510
  if (sameSchemaIndex === -1) {
4353
- recurseList.push(schema2);
4354
- const allOptions = resolveAnyOrOneOfSchemas(validator, schema2, rootSchema, true);
4511
+ recurseList.push(localSchema);
4512
+ const allOptions = resolveAnyOrOneOfSchemas(validator, localSchema, rootSchema, true);
4355
4513
  allOptions.forEach((s) => {
4356
4514
  if (PROPERTIES_KEY in s && s[PROPERTIES_KEY]) {
4357
- (0, import_forEach.default)(schema2[PROPERTIES_KEY], (value) => {
4515
+ (0, import_forEach.default)(localSchema[PROPERTIES_KEY], (value) => {
4358
4516
  parseSchema(validator, recurseList, rootSchema, value);
4359
4517
  });
4360
4518
  }
4361
4519
  });
4362
- if (ITEMS_KEY in schema2 && !Array.isArray(schema2.items) && typeof schema2.items !== "boolean") {
4363
- parseSchema(validator, recurseList, rootSchema, schema2.items);
4520
+ if (ITEMS_KEY in localSchema && !Array.isArray(localSchema.items) && typeof localSchema.items !== "boolean") {
4521
+ parseSchema(validator, recurseList, rootSchema, localSchema.items);
4364
4522
  }
4365
4523
  }
4366
4524
  });