@rjsf/utils 6.0.0-beta.2 → 6.0.0-beta.21

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 (99) hide show
  1. package/dist/{index.js → index.cjs} +396 -264
  2. package/dist/index.cjs.map +7 -0
  3. package/dist/utils.esm.js +395 -263
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +368 -249
  6. package/lib/ErrorSchemaBuilder.d.ts +2 -2
  7. package/lib/canExpand.d.ts +1 -1
  8. package/lib/constants.d.ts +3 -0
  9. package/lib/constants.js +3 -0
  10. package/lib/constants.js.map +1 -1
  11. package/lib/createSchemaUtils.js +25 -18
  12. package/lib/createSchemaUtils.js.map +1 -1
  13. package/lib/enums.d.ts +9 -3
  14. package/lib/enums.js +9 -3
  15. package/lib/enums.js.map +1 -1
  16. package/lib/findSchemaDefinition.d.ts +7 -1
  17. package/lib/findSchemaDefinition.js +48 -6
  18. package/lib/findSchemaDefinition.js.map +1 -1
  19. package/lib/getTestIds.js +2 -2
  20. package/lib/getTestIds.js.map +1 -1
  21. package/lib/getUiOptions.js +4 -0
  22. package/lib/getUiOptions.js.map +1 -1
  23. package/lib/getWidget.js +3 -3
  24. package/lib/getWidget.js.map +1 -1
  25. package/lib/guessType.d.ts +1 -1
  26. package/lib/idGenerators.d.ts +22 -15
  27. package/lib/idGenerators.js +17 -8
  28. package/lib/idGenerators.js.map +1 -1
  29. package/lib/index.d.ts +10 -4
  30. package/lib/index.js +9 -4
  31. package/lib/index.js.map +1 -1
  32. package/lib/isFormDataAvailable.d.ts +7 -0
  33. package/lib/isFormDataAvailable.js +13 -0
  34. package/lib/isFormDataAvailable.js.map +1 -0
  35. package/lib/isRootSchema.d.ts +13 -0
  36. package/lib/isRootSchema.js +25 -0
  37. package/lib/isRootSchema.js.map +1 -0
  38. package/lib/mergeDefaultsWithFormData.js +14 -2
  39. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  40. package/lib/schema/findFieldInSchema.d.ts +1 -1
  41. package/lib/schema/findFieldInSchema.js +1 -1
  42. package/lib/schema/getDefaultFormState.d.ts +17 -3
  43. package/lib/schema/getDefaultFormState.js +73 -27
  44. package/lib/schema/getDefaultFormState.js.map +1 -1
  45. package/lib/schema/getDisplayLabel.js +2 -2
  46. package/lib/schema/getDisplayLabel.js.map +1 -1
  47. package/lib/schema/index.d.ts +1 -2
  48. package/lib/schema/index.js +1 -2
  49. package/lib/schema/index.js.map +1 -1
  50. package/lib/schema/retrieveSchema.d.ts +11 -6
  51. package/lib/schema/retrieveSchema.js +42 -19
  52. package/lib/schema/retrieveSchema.js.map +1 -1
  53. package/lib/shallowEquals.d.ts +8 -0
  54. package/lib/shallowEquals.js +36 -0
  55. package/lib/shallowEquals.js.map +1 -0
  56. package/lib/shouldRender.d.ts +8 -2
  57. package/lib/shouldRender.js +17 -2
  58. package/lib/shouldRender.js.map +1 -1
  59. package/lib/shouldRenderOptionalField.d.ts +18 -0
  60. package/lib/shouldRenderOptionalField.js +47 -0
  61. package/lib/shouldRenderOptionalField.js.map +1 -0
  62. package/lib/toFieldPathId.d.ts +12 -0
  63. package/lib/toFieldPathId.js +19 -0
  64. package/lib/toFieldPathId.js.map +1 -0
  65. package/lib/tsconfig.tsbuildinfo +1 -1
  66. package/lib/types.d.ts +136 -81
  67. package/lib/validationDataMerge.d.ts +2 -1
  68. package/lib/validationDataMerge.js +3 -2
  69. package/lib/validationDataMerge.js.map +1 -1
  70. package/package.json +13 -14
  71. package/src/ErrorSchemaBuilder.ts +2 -2
  72. package/src/constants.ts +3 -0
  73. package/src/createSchemaUtils.ts +25 -26
  74. package/src/enums.ts +9 -3
  75. package/src/findSchemaDefinition.ts +55 -6
  76. package/src/getTestIds.ts +2 -2
  77. package/src/getUiOptions.ts +4 -0
  78. package/src/getWidget.tsx +3 -3
  79. package/src/idGenerators.ts +35 -25
  80. package/src/index.ts +16 -2
  81. package/src/isFormDataAvailable.ts +13 -0
  82. package/src/isRootSchema.ts +30 -0
  83. package/src/mergeDefaultsWithFormData.ts +16 -2
  84. package/src/schema/findFieldInSchema.ts +1 -1
  85. package/src/schema/getDefaultFormState.ts +95 -33
  86. package/src/schema/getDisplayLabel.ts +2 -2
  87. package/src/schema/index.ts +0 -2
  88. package/src/schema/retrieveSchema.ts +46 -10
  89. package/src/shallowEquals.ts +41 -0
  90. package/src/shouldRender.ts +27 -2
  91. package/src/shouldRenderOptionalField.ts +56 -0
  92. package/src/toFieldPathId.ts +24 -0
  93. package/src/types.ts +156 -84
  94. package/src/validationDataMerge.ts +7 -1
  95. package/dist/index.js.map +0 -7
  96. package/lib/schema/toIdSchema.d.ts +0 -14
  97. package/lib/schema/toIdSchema.js +0 -62
  98. package/lib/schema/toIdSchema.js.map +0 -1
  99. package/src/schema/toIdSchema.ts +0 -131
@@ -35,6 +35,8 @@ __export(index_exports, {
35
35
  ALL_OF_KEY: () => ALL_OF_KEY,
36
36
  ANY_OF_KEY: () => ANY_OF_KEY,
37
37
  CONST_KEY: () => CONST_KEY,
38
+ DEFAULT_ID_PREFIX: () => DEFAULT_ID_PREFIX,
39
+ DEFAULT_ID_SEPARATOR: () => DEFAULT_ID_SEPARATOR,
38
40
  DEFAULT_KEY: () => DEFAULT_KEY,
39
41
  DEFINITIONS_KEY: () => DEFINITIONS_KEY,
40
42
  DEPENDENCIES_KEY: () => DEPENDENCIES_KEY,
@@ -46,6 +48,7 @@ __export(index_exports, {
46
48
  ID_KEY: () => ID_KEY,
47
49
  IF_KEY: () => IF_KEY,
48
50
  ITEMS_KEY: () => ITEMS_KEY,
51
+ JSON_SCHEMA_DRAFT_2019_09: () => JSON_SCHEMA_DRAFT_2019_09,
49
52
  JSON_SCHEMA_DRAFT_2020_12: () => JSON_SCHEMA_DRAFT_2020_12,
50
53
  JUNK_OPTION_ID: () => JUNK_OPTION_ID,
51
54
  LOOKUP_MAP_NAME: () => LOOKUP_MAP_NAME,
@@ -113,8 +116,10 @@ __export(index_exports, {
113
116
  isCustomWidget: () => isCustomWidget,
114
117
  isFilesArray: () => isFilesArray,
115
118
  isFixedItems: () => isFixedItems,
119
+ isFormDataAvailable: () => isFormDataAvailable,
116
120
  isMultiSelect: () => isMultiSelect,
117
121
  isObject: () => isObject,
122
+ isRootSchema: () => isRootSchema,
118
123
  isSelect: () => isSelect,
119
124
  labelValue: () => labelValue,
120
125
  localToUTC: () => localToUTC,
@@ -123,6 +128,7 @@ __export(index_exports, {
123
128
  mergeObjects: () => mergeObjects,
124
129
  mergeSchemas: () => mergeSchemas,
125
130
  optionId: () => optionId,
131
+ optionalControlsId: () => optionalControlsId,
126
132
  optionsList: () => optionsList,
127
133
  orderProperties: () => orderProperties,
128
134
  pad: () => pad,
@@ -133,14 +139,16 @@ __export(index_exports, {
133
139
  sanitizeDataForNewSchema: () => sanitizeDataForNewSchema,
134
140
  schemaParser: () => schemaParser,
135
141
  schemaRequiresTrueValue: () => schemaRequiresTrueValue,
142
+ shallowEquals: () => shallowEquals,
136
143
  shouldRender: () => shouldRender,
144
+ shouldRenderOptionalField: () => shouldRenderOptionalField,
137
145
  sortedJSONStringify: () => sortedJSONStringify,
138
146
  titleId: () => titleId,
139
147
  toConstant: () => toConstant,
140
148
  toDateString: () => toDateString,
141
149
  toErrorList: () => toErrorList,
142
150
  toErrorSchema: () => toErrorSchema,
143
- toIdSchema: () => toIdSchema,
151
+ toFieldPathId: () => toFieldPathId,
144
152
  toPathSchema: () => toPathSchema,
145
153
  unwrapErrorHandler: () => unwrapErrorHandler,
146
154
  utcToLocal: () => utcToLocal,
@@ -217,6 +225,8 @@ var REQUIRED_KEY = "required";
217
225
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
218
226
  var REF_KEY = "$ref";
219
227
  var SCHEMA_KEY = "$schema";
228
+ var DEFAULT_ID_PREFIX = "root";
229
+ var DEFAULT_ID_SEPARATOR = "_";
220
230
  var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
221
231
  var FORM_CONTEXT_NAME = "formContext";
222
232
  var LOOKUP_MAP_NAME = "layoutGridLookupMap";
@@ -226,10 +236,14 @@ var UI_FIELD_KEY = "ui:field";
226
236
  var UI_WIDGET_KEY = "ui:widget";
227
237
  var UI_OPTIONS_KEY = "ui:options";
228
238
  var UI_GLOBAL_OPTIONS_KEY = "ui:globalOptions";
239
+ var JSON_SCHEMA_DRAFT_2019_09 = "https://json-schema.org/draft/2019-09/schema";
229
240
  var JSON_SCHEMA_DRAFT_2020_12 = "https://json-schema.org/draft/2020-12/schema";
230
241
 
231
242
  // src/getUiOptions.ts
232
243
  function getUiOptions(uiSchema = {}, globalOptions = {}) {
244
+ if (!uiSchema) {
245
+ return { ...globalOptions };
246
+ }
233
247
  return Object.keys(uiSchema).filter((key) => key.indexOf("ui:") === 0).reduce(
234
248
  (options, key) => {
235
249
  const value = uiSchema[key];
@@ -299,15 +313,15 @@ function deepEquals(a, b) {
299
313
  }
300
314
 
301
315
  // src/schema/findFieldInSchema.ts
302
- var import_get7 = __toESM(require("lodash/get"), 1);
316
+ var import_get8 = __toESM(require("lodash/get"), 1);
303
317
  var import_has3 = __toESM(require("lodash/has"), 1);
304
318
 
305
319
  // src/schema/findSelectedOptionInXxxOf.ts
306
- var import_get5 = __toESM(require("lodash/get"), 1);
320
+ var import_get6 = __toESM(require("lodash/get"), 1);
307
321
  var import_isEqual = __toESM(require("lodash/isEqual"), 1);
308
322
 
309
323
  // src/schema/retrieveSchema.ts
310
- var import_get4 = __toESM(require("lodash/get"), 1);
324
+ var import_get5 = __toESM(require("lodash/get"), 1);
311
325
  var import_set = __toESM(require("lodash/set"), 1);
312
326
  var import_times = __toESM(require("lodash/times"), 1);
313
327
  var import_transform = __toESM(require("lodash/transform"), 1);
@@ -322,12 +336,22 @@ var import_omit = __toESM(require("lodash/omit"), 1);
322
336
  var import_isObject3 = __toESM(require("lodash/isObject"), 1);
323
337
  var import_isEmpty = __toESM(require("lodash/isEmpty"), 1);
324
338
  var import_fast_uri = __toESM(require("fast-uri"), 1);
339
+ var import_get = __toESM(require("lodash/get"), 1);
325
340
  function findEmbeddedSchemaRecursive(schema, ref) {
326
341
  if (ID_KEY in schema && import_fast_uri.default.equal(schema[ID_KEY], ref)) {
327
342
  return schema;
328
343
  }
329
344
  for (const subSchema of Object.values(schema)) {
330
- if ((0, import_isObject3.default)(subSchema)) {
345
+ if (Array.isArray(subSchema)) {
346
+ for (const item of subSchema) {
347
+ if ((0, import_isObject3.default)(item)) {
348
+ const result = findEmbeddedSchemaRecursive(item, ref);
349
+ if (result !== void 0) {
350
+ return result;
351
+ }
352
+ }
353
+ }
354
+ } else if ((0, import_isObject3.default)(subSchema)) {
331
355
  const result = findEmbeddedSchemaRecursive(subSchema, ref);
332
356
  if (result !== void 0) {
333
357
  return result;
@@ -336,12 +360,29 @@ function findEmbeddedSchemaRecursive(schema, ref) {
336
360
  }
337
361
  return void 0;
338
362
  }
363
+ function makeAllReferencesAbsolute(schema, baseURI) {
364
+ const currentURI = (0, import_get.default)(schema, ID_KEY, baseURI);
365
+ if (REF_KEY in schema) {
366
+ schema = { ...schema, [REF_KEY]: import_fast_uri.default.resolve(currentURI, schema[REF_KEY]) };
367
+ }
368
+ for (const [key, subSchema] of Object.entries(schema)) {
369
+ if (Array.isArray(subSchema)) {
370
+ schema = {
371
+ ...schema,
372
+ [key]: subSchema.map((item) => (0, import_isObject3.default)(item) ? makeAllReferencesAbsolute(item, currentURI) : item)
373
+ };
374
+ } else if ((0, import_isObject3.default)(subSchema)) {
375
+ schema = { ...schema, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
376
+ }
377
+ }
378
+ return schema;
379
+ }
339
380
  function splitKeyElementFromObject(key, object) {
340
381
  const value = object[key];
341
382
  const remaining = (0, import_omit.default)(object, [key]);
342
383
  return [remaining, value];
343
384
  }
344
- function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = ID_KEY in rootSchema ? rootSchema[ID_KEY] : void 0) {
385
+ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = (0, import_get.default)(rootSchema, [ID_KEY])) {
345
386
  const ref = $ref || "";
346
387
  let current = void 0;
347
388
  if (ref.startsWith("#")) {
@@ -381,23 +422,27 @@ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [],
381
422
  const [remaining, theRef] = splitKeyElementFromObject(REF_KEY, current);
382
423
  const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], baseURI);
383
424
  if (Object.keys(remaining).length > 0) {
384
- return { ...remaining, ...subSchema };
425
+ if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2019_09 || rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
426
+ return { [ALL_OF_KEY]: [remaining, subSchema] };
427
+ } else {
428
+ return { ...remaining, ...subSchema };
429
+ }
385
430
  }
386
431
  return subSchema;
387
432
  }
388
433
  return current;
389
434
  }
390
- function findSchemaDefinition($ref, rootSchema = {}, baseURI = ID_KEY in rootSchema ? rootSchema[ID_KEY] : void 0) {
435
+ function findSchemaDefinition($ref, rootSchema = {}, baseURI = (0, import_get.default)(rootSchema, [ID_KEY])) {
391
436
  const recurseList = [];
392
437
  return findSchemaDefinitionRecursive($ref, rootSchema, recurseList, baseURI);
393
438
  }
394
439
 
395
440
  // src/getDiscriminatorFieldFromSchema.ts
396
- var import_get = __toESM(require("lodash/get"), 1);
441
+ var import_get2 = __toESM(require("lodash/get"), 1);
397
442
  var import_isString = __toESM(require("lodash/isString"), 1);
398
443
  function getDiscriminatorFieldFromSchema(schema) {
399
444
  let discriminator;
400
- const maybeString = (0, import_get.default)(schema, DISCRIMINATOR_PATH);
445
+ const maybeString = (0, import_get2.default)(schema, DISCRIMINATOR_PATH);
401
446
  if ((0, import_isString.default)(maybeString)) {
402
447
  discriminator = maybeString;
403
448
  } else if (maybeString !== void 0) {
@@ -471,21 +516,21 @@ function mergeSchemas(obj1, obj2) {
471
516
  }
472
517
 
473
518
  // src/schema/getFirstMatchingOption.ts
474
- var import_get3 = __toESM(require("lodash/get"), 1);
519
+ var import_get4 = __toESM(require("lodash/get"), 1);
475
520
  var import_has = __toESM(require("lodash/has"), 1);
476
521
  var import_isNumber = __toESM(require("lodash/isNumber"), 1);
477
522
 
478
523
  // src/getOptionMatchingSimpleDiscriminator.ts
479
- var import_get2 = __toESM(require("lodash/get"), 1);
524
+ var import_get3 = __toESM(require("lodash/get"), 1);
480
525
  function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField) {
481
526
  if (formData && discriminatorField) {
482
- const value = (0, import_get2.default)(formData, discriminatorField);
527
+ const value = (0, import_get3.default)(formData, discriminatorField);
483
528
  if (value === void 0) {
484
529
  return;
485
530
  }
486
531
  for (let i = 0; i < options.length; i++) {
487
532
  const option = options[i];
488
- const discriminator = (0, import_get2.default)(option, [PROPERTIES_KEY, discriminatorField], {});
533
+ const discriminator = (0, import_get3.default)(option, [PROPERTIES_KEY, discriminatorField], {});
489
534
  if (discriminator.type === "object" || discriminator.type === "array") {
490
535
  continue;
491
536
  }
@@ -512,8 +557,8 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
512
557
  for (let i = 0; i < options.length; i++) {
513
558
  const option = options[i];
514
559
  if (discriminatorField && (0, import_has.default)(option, [PROPERTIES_KEY, discriminatorField])) {
515
- const value = (0, import_get3.default)(formData, discriminatorField);
516
- const discriminator = (0, import_get3.default)(option, [PROPERTIES_KEY, discriminatorField], {});
560
+ const value = (0, import_get4.default)(formData, discriminatorField);
561
+ const discriminator = (0, import_get4.default)(option, [PROPERTIES_KEY, discriminatorField], {});
517
562
  if (validator.isValid(discriminator, value, rootSchema)) {
518
563
  return i;
519
564
  }
@@ -549,7 +594,7 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
549
594
 
550
595
  // src/schema/retrieveSchema.ts
551
596
  var import_isEmpty2 = __toESM(require("lodash/isEmpty"), 1);
552
- function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
597
+ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs = false) {
553
598
  return retrieveSchemaInternal(
554
599
  validator,
555
600
  schema,
@@ -557,7 +602,8 @@ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experim
557
602
  rawFormData,
558
603
  void 0,
559
604
  void 0,
560
- experimental_customMergeAllOf
605
+ experimental_customMergeAllOf,
606
+ resolveAnyOfOrOneOfRefs
561
607
  )[0];
562
608
  }
563
609
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
@@ -646,14 +692,16 @@ function getMatchingPatternProperties(schema, key) {
646
692
  {}
647
693
  );
648
694
  }
649
- function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
695
+ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
650
696
  const updatedSchemas = resolveReference(
651
697
  validator,
652
698
  schema,
653
699
  rootSchema,
654
700
  expandAllBranches,
655
701
  recurseList,
656
- formData
702
+ formData,
703
+ experimental_customMergeAllOf,
704
+ resolveAnyOfOrOneOfRefs
657
705
  );
658
706
  if (updatedSchemas.length > 1 || updatedSchemas[0] !== schema) {
659
707
  return updatedSchemas;
@@ -665,7 +713,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
665
713
  rootSchema,
666
714
  expandAllBranches,
667
715
  recurseList,
668
- formData
716
+ formData,
717
+ experimental_customMergeAllOf
669
718
  );
670
719
  return resolvedSchemas.flatMap((s) => {
671
720
  return retrieveSchemaInternal(
@@ -679,7 +728,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
679
728
  );
680
729
  });
681
730
  }
682
- if (ALL_OF_KEY in schema && Array.isArray(schema.allOf)) {
731
+ if (ALL_OF_KEY in schema && Array.isArray(schema[ALL_OF_KEY])) {
683
732
  const allOfSchemaElements = schema.allOf.map(
684
733
  (allOfSubschema) => retrieveSchemaInternal(
685
734
  validator,
@@ -699,8 +748,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
699
748
  }
700
749
  return [schema];
701
750
  }
702
- function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
703
- const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList);
751
+ function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
752
+ const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList, void 0, resolveAnyOfOrOneOfRefs);
704
753
  if (updatedSchema !== schema) {
705
754
  return retrieveSchemaInternal(
706
755
  validator,
@@ -709,12 +758,13 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
709
758
  formData,
710
759
  expandAllBranches,
711
760
  recurseList,
712
- experimental_customMergeAllOf
761
+ experimental_customMergeAllOf,
762
+ resolveAnyOfOrOneOfRefs
713
763
  );
714
764
  }
715
765
  return [schema];
716
766
  }
717
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
767
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
718
768
  if (!isObject(schema)) {
719
769
  return schema;
720
770
  }
@@ -737,7 +787,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
737
787
  resolvedSchema[PROPERTIES_KEY],
738
788
  (result, value, key) => {
739
789
  const childList = [...recurseList];
740
- result[key] = resolveAllReferences(value, rootSchema, childList, baseURI);
790
+ result[key] = resolveAllReferences(value, rootSchema, childList, baseURI, resolveAnyOfOrOneOfRefs);
741
791
  childrenLists.push(childList);
742
792
  },
743
793
  {}
@@ -748,9 +798,28 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
748
798
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
749
799
  resolvedSchema = {
750
800
  ...resolvedSchema,
751
- items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI)
801
+ items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
752
802
  };
753
803
  }
804
+ if (resolveAnyOfOrOneOfRefs) {
805
+ let key;
806
+ let schemas;
807
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
808
+ key = ANY_OF_KEY;
809
+ schemas = resolvedSchema[ANY_OF_KEY];
810
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
811
+ key = ONE_OF_KEY;
812
+ schemas = resolvedSchema[ONE_OF_KEY];
813
+ }
814
+ if (key && schemas) {
815
+ resolvedSchema = {
816
+ ...resolvedSchema,
817
+ [key]: schemas.map(
818
+ (s) => resolveAllReferences(s, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
819
+ )
820
+ };
821
+ }
822
+ }
754
823
  return deepEquals(schema, resolvedSchema) ? schema : resolvedSchema;
755
824
  }
756
825
  function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFormData, experimental_customMergeAllOf) {
@@ -768,9 +837,9 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
768
837
  if (!(0, import_isEmpty2.default)(matchingProperties)) {
769
838
  schema.properties[key] = retrieveSchema(
770
839
  validator,
771
- { allOf: Object.values(matchingProperties) },
840
+ { [ALL_OF_KEY]: Object.values(matchingProperties) },
772
841
  rootSchema,
773
- formData,
842
+ (0, import_get5.default)(formData, [key]),
774
843
  experimental_customMergeAllOf
775
844
  );
776
845
  (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -778,12 +847,12 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
778
847
  }
779
848
  }
780
849
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema.additionalProperties !== false) {
781
- let additionalProperties = {};
850
+ let additionalProperties;
782
851
  if (typeof schema.additionalProperties !== "boolean") {
783
852
  if (REF_KEY in schema.additionalProperties) {
784
853
  additionalProperties = retrieveSchema(
785
854
  validator,
786
- { $ref: (0, import_get4.default)(schema.additionalProperties, [REF_KEY]) },
855
+ { [REF_KEY]: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
787
856
  rootSchema,
788
857
  formData,
789
858
  experimental_customMergeAllOf
@@ -796,10 +865,10 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
796
865
  ...schema.additionalProperties
797
866
  };
798
867
  } else {
799
- additionalProperties = { type: guessType((0, import_get4.default)(formData, [key])) };
868
+ additionalProperties = { type: guessType((0, import_get5.default)(formData, [key])) };
800
869
  }
801
870
  } else {
802
- additionalProperties = { type: guessType((0, import_get4.default)(formData, [key])) };
871
+ additionalProperties = { type: guessType((0, import_get5.default)(formData, [key])) };
803
872
  }
804
873
  schema.properties[key] = additionalProperties;
805
874
  (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -810,7 +879,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
810
879
  });
811
880
  return schema;
812
881
  }
813
- function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf) {
882
+ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
814
883
  if (!isObject(schema)) {
815
884
  return [{}];
816
885
  }
@@ -821,7 +890,8 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
821
890
  expandAllBranches,
822
891
  recurseList,
823
892
  rawFormData,
824
- experimental_customMergeAllOf
893
+ experimental_customMergeAllOf,
894
+ resolveAnyOfOrOneOfRefs
825
895
  );
826
896
  return resolvedSchemas.flatMap((s) => {
827
897
  let resolvedSchema = s;
@@ -878,7 +948,7 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
878
948
  validator,
879
949
  { allOf: [schema2.properties[key], ...Object.values(matchingProperties)] },
880
950
  rootSchema,
881
- rawFormData,
951
+ (0, import_get5.default)(rawFormData, [key]),
882
952
  experimental_customMergeAllOf
883
953
  );
884
954
  }
@@ -950,7 +1020,7 @@ function resolveDependencies(validator, schema, rootSchema, expandAllBranches, r
950
1020
  function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
951
1021
  let schemas = [resolvedSchema];
952
1022
  for (const dependencyKey in dependencies) {
953
- if (!expandAllBranches && (0, import_get4.default)(formData, [dependencyKey]) === void 0) {
1023
+ if (!expandAllBranches && (0, import_get5.default)(formData, [dependencyKey]) === void 0) {
954
1024
  continue;
955
1025
  }
956
1026
  if (resolvedSchema.properties && !(dependencyKey in resolvedSchema.properties)) {
@@ -1081,11 +1151,11 @@ function findSelectedOptionInXxxOf(validator, rootSchema, schema, fallbackField,
1081
1151
  const xxxOfs = schema[xxx].map(
1082
1152
  (xxxOf) => retrieveSchema(validator, xxxOf, rootSchema, formData, experimental_customMergeAllOf)
1083
1153
  );
1084
- const data = (0, import_get5.default)(formData, selectorField);
1154
+ const data = (0, import_get6.default)(formData, selectorField);
1085
1155
  if (data !== void 0) {
1086
1156
  return xxxOfs.find((xxx2) => {
1087
1157
  return (0, import_isEqual.default)(
1088
- (0, import_get5.default)(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], (0, import_get5.default)(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
1158
+ (0, import_get6.default)(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], (0, import_get6.default)(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
1089
1159
  data
1090
1160
  );
1091
1161
  });
@@ -1095,7 +1165,7 @@ function findSelectedOptionInXxxOf(validator, rootSchema, schema, fallbackField,
1095
1165
  }
1096
1166
 
1097
1167
  // src/schema/getFromSchema.ts
1098
- var import_get6 = __toESM(require("lodash/get"), 1);
1168
+ var import_get7 = __toESM(require("lodash/get"), 1);
1099
1169
  var import_has2 = __toESM(require("lodash/has"), 1);
1100
1170
  var import_isEmpty3 = __toESM(require("lodash/isEmpty"), 1);
1101
1171
  function getFromSchemaInternal(validator, rootSchema, schema, path, experimental_customMergeAllOf) {
@@ -1109,7 +1179,7 @@ function getFromSchemaInternal(validator, rootSchema, schema, path, experimental
1109
1179
  const pathList = Array.isArray(path) ? path : path.split(".");
1110
1180
  const [part, ...nestedPath] = pathList;
1111
1181
  if (part && (0, import_has2.default)(fieldSchema, part)) {
1112
- fieldSchema = (0, import_get6.default)(fieldSchema, part);
1182
+ fieldSchema = (0, import_get7.default)(fieldSchema, part);
1113
1183
  return getFromSchemaInternal(
1114
1184
  validator,
1115
1185
  rootSchema,
@@ -1151,7 +1221,7 @@ function findFieldInSchema(validator, rootSchema, schema, path, formData = {}, e
1151
1221
  parentField,
1152
1222
  fieldName,
1153
1223
  ONE_OF_KEY,
1154
- (0, import_get7.default)(formData, subPath),
1224
+ (0, import_get8.default)(formData, subPath),
1155
1225
  experimental_customMergeAllOf
1156
1226
  );
1157
1227
  } else if ((0, import_has3.default)(parentField, ANY_OF_KEY)) {
@@ -1161,7 +1231,7 @@ function findFieldInSchema(validator, rootSchema, schema, path, formData = {}, e
1161
1231
  parentField,
1162
1232
  fieldName,
1163
1233
  ANY_OF_KEY,
1164
- (0, import_get7.default)(formData, subPath),
1234
+ (0, import_get8.default)(formData, subPath),
1165
1235
  experimental_customMergeAllOf
1166
1236
  );
1167
1237
  }
@@ -1215,11 +1285,11 @@ function findFieldInSchema(validator, rootSchema, schema, path, formData = {}, e
1215
1285
  }
1216
1286
 
1217
1287
  // src/schema/getDefaultFormState.ts
1218
- var import_get11 = __toESM(require("lodash/get"), 1);
1288
+ var import_get12 = __toESM(require("lodash/get"), 1);
1219
1289
  var import_isEmpty4 = __toESM(require("lodash/isEmpty"), 1);
1220
1290
 
1221
1291
  // src/schema/getClosestMatchingOption.ts
1222
- var import_get8 = __toESM(require("lodash/get"), 1);
1292
+ var import_get9 = __toESM(require("lodash/get"), 1);
1223
1293
  var import_has4 = __toESM(require("lodash/has"), 1);
1224
1294
  var import_isNumber2 = __toESM(require("lodash/isNumber"), 1);
1225
1295
  var import_isObject6 = __toESM(require("lodash/isObject"), 1);
@@ -1242,7 +1312,7 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
1242
1312
  totalScore += (0, import_reduce.default)(
1243
1313
  schema.properties,
1244
1314
  (score, value, key) => {
1245
- const formValue = (0, import_get8.default)(formData, key);
1315
+ const formValue = (0, import_get9.default)(formData, key);
1246
1316
  if (typeof value === "boolean") {
1247
1317
  return score;
1248
1318
  }
@@ -1269,7 +1339,7 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
1269
1339
  validator,
1270
1340
  rootSchema,
1271
1341
  formValue,
1272
- (0, import_get8.default)(value, key2),
1342
+ (0, import_get9.default)(value, key2),
1273
1343
  -1,
1274
1344
  discriminator,
1275
1345
  experimental_customMergeAllOf
@@ -1348,7 +1418,7 @@ function isFixedItems(schema) {
1348
1418
  }
1349
1419
 
1350
1420
  // src/mergeDefaultsWithFormData.ts
1351
- var import_get9 = __toESM(require("lodash/get"), 1);
1421
+ var import_get10 = __toESM(require("lodash/get"), 1);
1352
1422
  var import_isNil = __toESM(require("lodash/isNil"), 1);
1353
1423
  function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false, defaultSupercedesUndefined = false, overrideFormDataWithDefaults = false) {
1354
1424
  if (Array.isArray(formData)) {
@@ -1375,11 +1445,22 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1375
1445
  if (isObject(formData)) {
1376
1446
  const acc = Object.assign({}, defaults);
1377
1447
  return Object.keys(formData).reduce((acc2, key) => {
1378
- const keyValue = (0, import_get9.default)(formData, key);
1448
+ const keyValue = (0, import_get10.default)(formData, key);
1379
1449
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1380
1450
  const keyExistsInFormData = key in formData;
1451
+ const keyDefault = (0, import_get10.default)(defaults, key) ?? {};
1452
+ const defaultValueIsNestedObject = keyExistsInDefaults && Object.entries(keyDefault).some(([, v]) => isObject(v));
1453
+ const keyDefaultIsObject = keyExistsInDefaults && isObject((0, import_get10.default)(defaults, key));
1454
+ const keyHasFormDataObject = keyExistsInFormData && isObject(keyValue);
1455
+ if (keyDefaultIsObject && keyHasFormDataObject && !defaultValueIsNestedObject) {
1456
+ acc2[key] = {
1457
+ ...(0, import_get10.default)(defaults, key),
1458
+ ...keyValue
1459
+ };
1460
+ return acc2;
1461
+ }
1381
1462
  acc2[key] = mergeDefaultsWithFormData(
1382
- defaults ? (0, import_get9.default)(defaults, key) : {},
1463
+ (0, import_get10.default)(defaults, key),
1383
1464
  keyValue,
1384
1465
  mergeExtraArrayDefaults,
1385
1466
  defaultSupercedesUndefined,
@@ -1390,7 +1471,7 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1390
1471
  return acc2;
1391
1472
  }, acc);
1392
1473
  }
1393
- if (defaultSupercedesUndefined && (!(0, import_isNil.default)(defaults) && (0, import_isNil.default)(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !(0, import_isNil.default)(formData)) {
1474
+ if (defaultSupercedesUndefined && (!(defaults === void 0) && (0, import_isNil.default)(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !(0, import_isNil.default)(formData)) {
1394
1475
  return defaults;
1395
1476
  }
1396
1477
  return formData;
@@ -1458,7 +1539,7 @@ function constIsAjvDataReference(schema) {
1458
1539
  }
1459
1540
 
1460
1541
  // src/optionsList.ts
1461
- var import_get10 = __toESM(require("lodash/get"), 1);
1542
+ var import_get11 = __toESM(require("lodash/get"), 1);
1462
1543
 
1463
1544
  // src/toConstant.ts
1464
1545
  function toConstant(schema) {
@@ -1504,8 +1585,8 @@ function optionsList(schema, uiSchema) {
1504
1585
  let value;
1505
1586
  let label = title;
1506
1587
  if (selectorField) {
1507
- const innerSchema = (0, import_get10.default)(aSchema, [PROPERTIES_KEY, selectorField], {});
1508
- value = (0, import_get10.default)(innerSchema, DEFAULT_KEY, (0, import_get10.default)(innerSchema, CONST_KEY));
1588
+ const innerSchema = (0, import_get11.default)(aSchema, [PROPERTIES_KEY, selectorField], {});
1589
+ value = (0, import_get11.default)(innerSchema, DEFAULT_KEY, (0, import_get11.default)(innerSchema, CONST_KEY));
1509
1590
  label = label || innerSchema?.title || aSchema.title || String(value);
1510
1591
  } else {
1511
1592
  value = toConstant(aSchema);
@@ -1537,10 +1618,19 @@ function getInnerSchemaForArrayItem(schema, additionalItems = 0 /* Ignore */, id
1537
1618
  }
1538
1619
  return {};
1539
1620
  }
1621
+ function computeDefaultBasedOnSchemaTypeAndDefaults(schema, computedDefault) {
1622
+ const { default: schemaDefault, type } = schema;
1623
+ const shouldReturnNullAsDefault = Array.isArray(type) && type.includes("null") && (0, import_isEmpty4.default)(computedDefault) && schemaDefault === null;
1624
+ return shouldReturnNullAsDefault ? null : computedDefault;
1625
+ }
1540
1626
  function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
1541
1627
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1542
- if (includeUndefinedValues || isConst) {
1628
+ if (includeUndefinedValues === true || isConst) {
1543
1629
  obj[key] = computedDefault;
1630
+ } else if (includeUndefinedValues === "excludeObjectChildren") {
1631
+ if (!isObject(computedDefault) || !(0, import_isEmpty4.default)(computedDefault)) {
1632
+ obj[key] = computedDefault;
1633
+ }
1544
1634
  } else if (emptyObjectFields !== "skipDefaults") {
1545
1635
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1546
1636
  if (isObject(computedDefault)) {
@@ -1572,15 +1662,16 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1572
1662
  experimental_defaultFormStateBehavior = void 0,
1573
1663
  experimental_customMergeAllOf = void 0,
1574
1664
  required,
1575
- shouldMergeDefaultsIntoFormData = false
1665
+ shouldMergeDefaultsIntoFormData = false,
1666
+ initialDefaultsGenerated
1576
1667
  } = computeDefaultsProps;
1577
- const formData = isObject(rawFormData) ? rawFormData : {};
1668
+ let formData = isObject(rawFormData) ? rawFormData : {};
1578
1669
  const schema = isObject(rawSchema) ? rawSchema : {};
1579
1670
  let defaults = parentDefaults;
1580
1671
  let schemaToCompute = null;
1581
1672
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1582
1673
  let updatedRecurseList = _recurseList;
1583
- if (schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1674
+ if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1584
1675
  defaults = schema[CONST_KEY];
1585
1676
  } else if (isObject(defaults) && isObject(schema.default)) {
1586
1677
  defaults = mergeObjects(defaults, schema.default);
@@ -1595,6 +1686,9 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1595
1686
  if (schemaToCompute && !defaults) {
1596
1687
  defaults = schema.default;
1597
1688
  }
1689
+ if (shouldMergeDefaultsIntoFormData && schemaToCompute && !isObject(rawFormData)) {
1690
+ formData = rawFormData;
1691
+ }
1598
1692
  } else if (DEPENDENCIES_KEY in schema) {
1599
1693
  const defaultFormData = {
1600
1694
  ...getDefaultBasedOnSchemaType(validator, schema, computeDefaultsProps, defaults),
@@ -1672,9 +1766,10 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1672
1766
  experimental_defaultFormStateBehavior: experimental_dfsb_to_compute,
1673
1767
  experimental_customMergeAllOf,
1674
1768
  parentDefaults: defaults,
1675
- rawFormData: formData,
1769
+ rawFormData: rawFormData ?? formData,
1676
1770
  required,
1677
- shouldMergeDefaultsIntoFormData
1771
+ shouldMergeDefaultsIntoFormData,
1772
+ initialDefaultsGenerated
1678
1773
  });
1679
1774
  }
1680
1775
  if (defaults === void 0) {
@@ -1726,7 +1821,8 @@ function getObjectDefaults(validator, rawSchema, {
1726
1821
  experimental_defaultFormStateBehavior = void 0,
1727
1822
  experimental_customMergeAllOf = void 0,
1728
1823
  required,
1729
- shouldMergeDefaultsIntoFormData
1824
+ shouldMergeDefaultsIntoFormData,
1825
+ initialDefaultsGenerated
1730
1826
  } = {}, defaults) {
1731
1827
  {
1732
1828
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1735,7 +1831,7 @@ function getObjectDefaults(validator, rawSchema, {
1735
1831
  const parentConst = retrievedSchema[CONST_KEY];
1736
1832
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
1737
1833
  (acc, key) => {
1738
- const propertySchema = (0, import_get11.default)(retrievedSchema, [PROPERTIES_KEY, key], {});
1834
+ const propertySchema = (0, import_get12.default)(retrievedSchema, [PROPERTIES_KEY, key], {});
1739
1835
  const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1740
1836
  const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(propertySchema);
1741
1837
  const computedDefault = computeDefaults(validator, propertySchema, {
@@ -1744,10 +1840,11 @@ function getObjectDefaults(validator, rawSchema, {
1744
1840
  experimental_defaultFormStateBehavior,
1745
1841
  experimental_customMergeAllOf,
1746
1842
  includeUndefinedValues: includeUndefinedValues === true,
1747
- parentDefaults: (0, import_get11.default)(defaults, [key]),
1748
- rawFormData: (0, import_get11.default)(formData, [key]),
1843
+ parentDefaults: (0, import_get12.default)(defaults, [key]),
1844
+ rawFormData: (0, import_get12.default)(formData, [key]),
1749
1845
  required: retrievedSchema.required?.includes(key),
1750
- shouldMergeDefaultsIntoFormData
1846
+ shouldMergeDefaultsIntoFormData,
1847
+ initialDefaultsGenerated
1751
1848
  });
1752
1849
  maybeAddDefaultToObject(
1753
1850
  acc,
@@ -1763,7 +1860,7 @@ function getObjectDefaults(validator, rawSchema, {
1763
1860
  },
1764
1861
  {}
1765
1862
  );
1766
- if (retrievedSchema.additionalProperties) {
1863
+ if (retrievedSchema.additionalProperties && !initialDefaultsGenerated) {
1767
1864
  const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties) ? retrievedSchema.additionalProperties : {};
1768
1865
  const keys2 = /* @__PURE__ */ new Set();
1769
1866
  if (isObject(defaults)) {
@@ -1781,10 +1878,11 @@ function getObjectDefaults(validator, rawSchema, {
1781
1878
  experimental_defaultFormStateBehavior,
1782
1879
  experimental_customMergeAllOf,
1783
1880
  includeUndefinedValues: includeUndefinedValues === true,
1784
- parentDefaults: (0, import_get11.default)(defaults, [key]),
1785
- rawFormData: (0, import_get11.default)(formData, [key]),
1881
+ parentDefaults: (0, import_get12.default)(defaults, [key]),
1882
+ rawFormData: (0, import_get12.default)(formData, [key]),
1786
1883
  required: retrievedSchema.required?.includes(key),
1787
- shouldMergeDefaultsIntoFormData
1884
+ shouldMergeDefaultsIntoFormData,
1885
+ initialDefaultsGenerated
1788
1886
  });
1789
1887
  maybeAddDefaultToObject(
1790
1888
  objectDefaults,
@@ -1796,7 +1894,7 @@ function getObjectDefaults(validator, rawSchema, {
1796
1894
  );
1797
1895
  });
1798
1896
  }
1799
- return objectDefaults;
1897
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, objectDefaults);
1800
1898
  }
1801
1899
  }
1802
1900
  function getArrayDefaults(validator, rawSchema, {
@@ -1806,7 +1904,9 @@ function getArrayDefaults(validator, rawSchema, {
1806
1904
  experimental_defaultFormStateBehavior = void 0,
1807
1905
  experimental_customMergeAllOf = void 0,
1808
1906
  required,
1809
- shouldMergeDefaultsIntoFormData
1907
+ requiredAsRoot = false,
1908
+ shouldMergeDefaultsIntoFormData,
1909
+ initialDefaultsGenerated
1810
1910
  } = {}, defaults) {
1811
1911
  const schema = rawSchema;
1812
1912
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
@@ -1827,7 +1927,8 @@ function getArrayDefaults(validator, rawSchema, {
1827
1927
  experimental_customMergeAllOf,
1828
1928
  parentDefaults: item,
1829
1929
  required,
1830
- shouldMergeDefaultsIntoFormData
1930
+ shouldMergeDefaultsIntoFormData,
1931
+ initialDefaultsGenerated
1831
1932
  });
1832
1933
  });
1833
1934
  }
@@ -1843,9 +1944,10 @@ function getArrayDefaults(validator, rawSchema, {
1843
1944
  experimental_defaultFormStateBehavior,
1844
1945
  experimental_customMergeAllOf,
1845
1946
  rawFormData: item,
1846
- parentDefaults: (0, import_get11.default)(defaults, [idx]),
1947
+ parentDefaults: (0, import_get12.default)(defaults, [idx]),
1847
1948
  required,
1848
- shouldMergeDefaultsIntoFormData
1949
+ shouldMergeDefaultsIntoFormData,
1950
+ initialDefaultsGenerated
1849
1951
  });
1850
1952
  });
1851
1953
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
@@ -1861,25 +1963,29 @@ function getArrayDefaults(validator, rawSchema, {
1861
1963
  return defaults ? defaults : void 0;
1862
1964
  }
1863
1965
  }
1966
+ let arrayDefault;
1864
1967
  const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1865
1968
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
1866
- return defaults ? defaults : emptyDefault;
1867
- }
1868
- const defaultEntries = defaults || [];
1869
- const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1870
- const fillerDefault = fillerSchema.default;
1871
- const fillerEntries = new Array(schema.minItems - defaultsLength).fill(
1872
- computeDefaults(validator, fillerSchema, {
1873
- parentDefaults: fillerDefault,
1874
- rootSchema,
1875
- _recurseList,
1876
- experimental_defaultFormStateBehavior,
1877
- experimental_customMergeAllOf,
1878
- required,
1879
- shouldMergeDefaultsIntoFormData
1880
- })
1881
- );
1882
- return defaultEntries.concat(fillerEntries);
1969
+ arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
1970
+ } else {
1971
+ const defaultEntries = defaults || [];
1972
+ const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1973
+ const fillerDefault = fillerSchema.default;
1974
+ const fillerEntries = Array.from(
1975
+ { length: schema.minItems - defaultsLength },
1976
+ () => computeDefaults(validator, fillerSchema, {
1977
+ parentDefaults: fillerDefault,
1978
+ rootSchema,
1979
+ _recurseList,
1980
+ experimental_defaultFormStateBehavior,
1981
+ experimental_customMergeAllOf,
1982
+ required,
1983
+ shouldMergeDefaultsIntoFormData
1984
+ })
1985
+ );
1986
+ arrayDefault = defaultEntries.concat(fillerEntries);
1987
+ }
1988
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, arrayDefault);
1883
1989
  }
1884
1990
  function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps = {}, defaults) {
1885
1991
  switch (getSchemaType(rawSchema)) {
@@ -1892,7 +1998,7 @@ function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps
1892
1998
  }
1893
1999
  }
1894
2000
  }
1895
- function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2001
+ function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf, initialDefaultsGenerated) {
1896
2002
  if (!isObject(theSchema)) {
1897
2003
  throw new Error("Invalid schema: " + theSchema);
1898
2004
  }
@@ -1903,8 +2009,16 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
1903
2009
  experimental_defaultFormStateBehavior,
1904
2010
  experimental_customMergeAllOf,
1905
2011
  rawFormData: formData,
1906
- shouldMergeDefaultsIntoFormData: true
2012
+ shouldMergeDefaultsIntoFormData: true,
2013
+ initialDefaultsGenerated,
2014
+ requiredAsRoot: true
1907
2015
  });
2016
+ if (schema.type !== "object" && isObject(schema.default)) {
2017
+ return {
2018
+ ...defaults,
2019
+ ...formData
2020
+ };
2021
+ }
1908
2022
  if (isObject(formData) || Array.isArray(formData)) {
1909
2023
  const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
1910
2024
  const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
@@ -1961,17 +2075,17 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
1961
2075
  if (schemaType === "object") {
1962
2076
  displayLabel = false;
1963
2077
  }
1964
- if (schemaType === "boolean" && !uiSchema[UI_WIDGET_KEY]) {
2078
+ if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
1965
2079
  displayLabel = false;
1966
2080
  }
1967
- if (uiSchema[UI_FIELD_KEY]) {
2081
+ if (uiSchema && uiSchema[UI_FIELD_KEY]) {
1968
2082
  displayLabel = false;
1969
2083
  }
1970
2084
  return displayLabel;
1971
2085
  }
1972
2086
 
1973
2087
  // src/schema/sanitizeDataForNewSchema.ts
1974
- var import_get12 = __toESM(require("lodash/get"), 1);
2088
+ var import_get13 = __toESM(require("lodash/get"), 1);
1975
2089
  var import_has5 = __toESM(require("lodash/has"), 1);
1976
2090
  var NO_VALUE = Symbol("no Value");
1977
2091
  function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, data = {}, experimental_customMergeAllOf) {
@@ -1979,19 +2093,19 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1979
2093
  if ((0, import_has5.default)(newSchema, PROPERTIES_KEY)) {
1980
2094
  const removeOldSchemaData = {};
1981
2095
  if ((0, import_has5.default)(oldSchema, PROPERTIES_KEY)) {
1982
- const properties = (0, import_get12.default)(oldSchema, PROPERTIES_KEY, {});
2096
+ const properties = (0, import_get13.default)(oldSchema, PROPERTIES_KEY, {});
1983
2097
  Object.keys(properties).forEach((key) => {
1984
2098
  if ((0, import_has5.default)(data, key)) {
1985
2099
  removeOldSchemaData[key] = void 0;
1986
2100
  }
1987
2101
  });
1988
2102
  }
1989
- const keys2 = Object.keys((0, import_get12.default)(newSchema, PROPERTIES_KEY, {}));
2103
+ const keys2 = Object.keys((0, import_get13.default)(newSchema, PROPERTIES_KEY, {}));
1990
2104
  const nestedData = {};
1991
2105
  keys2.forEach((key) => {
1992
- const formValue = (0, import_get12.default)(data, key);
1993
- let oldKeyedSchema = (0, import_get12.default)(oldSchema, [PROPERTIES_KEY, key], {});
1994
- let newKeyedSchema = (0, import_get12.default)(newSchema, [PROPERTIES_KEY, key], {});
2106
+ const formValue = (0, import_get13.default)(data, key);
2107
+ let oldKeyedSchema = (0, import_get13.default)(oldSchema, [PROPERTIES_KEY, key], {});
2108
+ let newKeyedSchema = (0, import_get13.default)(newSchema, [PROPERTIES_KEY, key], {});
1995
2109
  if ((0, import_has5.default)(oldKeyedSchema, REF_KEY)) {
1996
2110
  oldKeyedSchema = retrieveSchema(
1997
2111
  validator,
@@ -2010,8 +2124,8 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2010
2124
  experimental_customMergeAllOf
2011
2125
  );
2012
2126
  }
2013
- const oldSchemaTypeForKey = (0, import_get12.default)(oldKeyedSchema, "type");
2014
- const newSchemaTypeForKey = (0, import_get12.default)(newKeyedSchema, "type");
2127
+ const oldSchemaTypeForKey = (0, import_get13.default)(oldKeyedSchema, "type");
2128
+ const newSchemaTypeForKey = (0, import_get13.default)(newKeyedSchema, "type");
2015
2129
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
2016
2130
  if ((0, import_has5.default)(removeOldSchemaData, key)) {
2017
2131
  delete removeOldSchemaData[key];
@@ -2029,17 +2143,17 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2029
2143
  nestedData[key] = itemData;
2030
2144
  }
2031
2145
  } else {
2032
- const newOptionDefault = (0, import_get12.default)(newKeyedSchema, "default", NO_VALUE);
2033
- const oldOptionDefault = (0, import_get12.default)(oldKeyedSchema, "default", NO_VALUE);
2146
+ const newOptionDefault = (0, import_get13.default)(newKeyedSchema, "default", NO_VALUE);
2147
+ const oldOptionDefault = (0, import_get13.default)(oldKeyedSchema, "default", NO_VALUE);
2034
2148
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
2035
2149
  if (oldOptionDefault === formValue) {
2036
2150
  removeOldSchemaData[key] = newOptionDefault;
2037
- } else if ((0, import_get12.default)(newKeyedSchema, "readOnly") === true) {
2151
+ } else if ((0, import_get13.default)(newKeyedSchema, "readOnly") === true) {
2038
2152
  removeOldSchemaData[key] = void 0;
2039
2153
  }
2040
2154
  }
2041
- const newOptionConst = (0, import_get12.default)(newKeyedSchema, "const", NO_VALUE);
2042
- const oldOptionConst = (0, import_get12.default)(oldKeyedSchema, "const", NO_VALUE);
2155
+ const newOptionConst = (0, import_get13.default)(newKeyedSchema, "const", NO_VALUE);
2156
+ const oldOptionConst = (0, import_get13.default)(oldKeyedSchema, "const", NO_VALUE);
2043
2157
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
2044
2158
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
2045
2159
  }
@@ -2051,9 +2165,9 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2051
2165
  ...removeOldSchemaData,
2052
2166
  ...nestedData
2053
2167
  };
2054
- } else if ((0, import_get12.default)(oldSchema, "type") === "array" && (0, import_get12.default)(newSchema, "type") === "array" && Array.isArray(data)) {
2055
- let oldSchemaItems = (0, import_get12.default)(oldSchema, "items");
2056
- let newSchemaItems = (0, import_get12.default)(newSchema, "items");
2168
+ } else if ((0, import_get13.default)(oldSchema, "type") === "array" && (0, import_get13.default)(newSchema, "type") === "array" && Array.isArray(data)) {
2169
+ let oldSchemaItems = (0, import_get13.default)(oldSchema, "items");
2170
+ let newSchemaItems = (0, import_get13.default)(newSchema, "items");
2057
2171
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
2058
2172
  if ((0, import_has5.default)(oldSchemaItems, REF_KEY)) {
2059
2173
  oldSchemaItems = retrieveSchema(
@@ -2073,10 +2187,10 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2073
2187
  experimental_customMergeAllOf
2074
2188
  );
2075
2189
  }
2076
- const oldSchemaType = (0, import_get12.default)(oldSchemaItems, "type");
2077
- const newSchemaType = (0, import_get12.default)(newSchemaItems, "type");
2190
+ const oldSchemaType = (0, import_get13.default)(oldSchemaItems, "type");
2191
+ const newSchemaType = (0, import_get13.default)(newSchemaItems, "type");
2078
2192
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
2079
- const maxItems = (0, import_get12.default)(newSchema, "maxItems", -1);
2193
+ const maxItems = (0, import_get13.default)(newSchema, "maxItems", -1);
2080
2194
  if (newSchemaType === "object") {
2081
2195
  newFormData = data.reduce((newValue, aValue) => {
2082
2196
  const itemValue = sanitizeDataForNewSchema(
@@ -2103,78 +2217,6 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2103
2217
  return newFormData;
2104
2218
  }
2105
2219
 
2106
- // src/schema/toIdSchema.ts
2107
- var import_get13 = __toESM(require("lodash/get"), 1);
2108
- function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
2109
- const $id = id || idPrefix;
2110
- const idSchema = { $id };
2111
- if (typeof schema === "object") {
2112
- if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
2113
- const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
2114
- const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
2115
- if (sameSchemaIndex === -1) {
2116
- return toIdSchemaInternal(
2117
- validator,
2118
- _schema,
2119
- idPrefix,
2120
- idSeparator,
2121
- id,
2122
- rootSchema,
2123
- formData,
2124
- _recurseList.concat(_schema),
2125
- experimental_customMergeAllOf
2126
- );
2127
- }
2128
- }
2129
- if (ITEMS_KEY in schema && !(0, import_get13.default)(schema, [ITEMS_KEY, REF_KEY])) {
2130
- return toIdSchemaInternal(
2131
- validator,
2132
- (0, import_get13.default)(schema, ITEMS_KEY),
2133
- idPrefix,
2134
- idSeparator,
2135
- id,
2136
- rootSchema,
2137
- formData,
2138
- _recurseList,
2139
- experimental_customMergeAllOf
2140
- );
2141
- }
2142
- if (getSchemaType(schema) === "object" && PROPERTIES_KEY in schema) {
2143
- for (const name in schema.properties) {
2144
- const field = schema[PROPERTIES_KEY][name];
2145
- const fieldId = idSchema[ID_KEY] + idSeparator + name;
2146
- idSchema[name] = toIdSchemaInternal(
2147
- validator,
2148
- field,
2149
- idPrefix,
2150
- idSeparator,
2151
- fieldId,
2152
- rootSchema,
2153
- // It's possible that formData is not an object -- this can happen if an
2154
- // array item has just been added, but not populated with data yet
2155
- (0, import_get13.default)(formData, [name]),
2156
- _recurseList,
2157
- experimental_customMergeAllOf
2158
- );
2159
- }
2160
- }
2161
- }
2162
- return idSchema;
2163
- }
2164
- function toIdSchema(validator, schema, id, rootSchema, formData, idPrefix = "root", idSeparator = "_", experimental_customMergeAllOf) {
2165
- return toIdSchemaInternal(
2166
- validator,
2167
- schema,
2168
- idPrefix,
2169
- idSeparator,
2170
- id,
2171
- rootSchema,
2172
- formData,
2173
- void 0,
2174
- experimental_customMergeAllOf
2175
- );
2176
- }
2177
-
2178
2220
  // src/schema/toPathSchema.ts
2179
2221
  var import_get14 = __toESM(require("lodash/get"), 1);
2180
2222
  var import_set2 = __toESM(require("lodash/set"), 1);
@@ -2290,6 +2332,7 @@ function toPathSchema(validator, schema, name = "", rootSchema, formData, experi
2290
2332
  }
2291
2333
 
2292
2334
  // src/createSchemaUtils.ts
2335
+ var import_get15 = __toESM(require("lodash/get"), 1);
2293
2336
  var SchemaUtils = class {
2294
2337
  /** Constructs the `SchemaUtils` instance with the given `validator` and `rootSchema` stored as instance variables
2295
2338
  *
@@ -2299,11 +2342,22 @@ var SchemaUtils = class {
2299
2342
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2300
2343
  */
2301
2344
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2302
- this.rootSchema = rootSchema;
2345
+ if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2346
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get15.default)(rootSchema, ID_KEY, "#"));
2347
+ } else {
2348
+ this.rootSchema = rootSchema;
2349
+ }
2303
2350
  this.validator = validator;
2304
2351
  this.experimental_defaultFormStateBehavior = experimental_defaultFormStateBehavior;
2305
2352
  this.experimental_customMergeAllOf = experimental_customMergeAllOf;
2306
2353
  }
2354
+ /** Returns the `rootSchema` in the `SchemaUtilsType`
2355
+ *
2356
+ * @returns - The `rootSchema`
2357
+ */
2358
+ getRootSchema() {
2359
+ return this.rootSchema;
2360
+ }
2307
2361
  /** Returns the `ValidatorType` in the `SchemaUtilsType`
2308
2362
  *
2309
2363
  * @returns - The `ValidatorType`
@@ -2376,9 +2430,10 @@ var SchemaUtils = class {
2376
2430
  * @param [includeUndefinedValues=false] - Optional flag, if true, cause undefined values to be added as defaults.
2377
2431
  * If "excludeObjectChildren", pass `includeUndefinedValues` as false when computing defaults for any nested
2378
2432
  * object properties.
2433
+ * @param initialDefaultsGenerated - Indicates whether or not initial defaults have been generated
2379
2434
  * @returns - The resulting `formData` with all the defaults provided
2380
2435
  */
2381
- getDefaultFormState(schema, formData, includeUndefinedValues = false) {
2436
+ getDefaultFormState(schema, formData, includeUndefinedValues = false, initialDefaultsGenerated) {
2382
2437
  return getDefaultFormState(
2383
2438
  this.validator,
2384
2439
  schema,
@@ -2386,7 +2441,8 @@ var SchemaUtils = class {
2386
2441
  this.rootSchema,
2387
2442
  includeUndefinedValues,
2388
2443
  this.experimental_defaultFormStateBehavior,
2389
- this.experimental_customMergeAllOf
2444
+ this.experimental_customMergeAllOf,
2445
+ initialDefaultsGenerated
2390
2446
  );
2391
2447
  }
2392
2448
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
@@ -2485,15 +2541,17 @@ var SchemaUtils = class {
2485
2541
  *
2486
2542
  * @param schema - The schema for which retrieving a schema is desired
2487
2543
  * @param [rawFormData] - The current formData, if any, to assist retrieving a schema
2544
+ * @param [resolveAnyOfOrOneOfRefs] - Optional flag indicating whether to resolved refs in anyOf/oneOf lists
2488
2545
  * @returns - The schema having its conditions, additional properties, references and dependencies resolved
2489
2546
  */
2490
- retrieveSchema(schema, rawFormData) {
2547
+ retrieveSchema(schema, rawFormData, resolveAnyOfOrOneOfRefs) {
2491
2548
  return retrieveSchema(
2492
2549
  this.validator,
2493
2550
  schema,
2494
2551
  this.rootSchema,
2495
2552
  rawFormData,
2496
- this.experimental_customMergeAllOf
2553
+ this.experimental_customMergeAllOf,
2554
+ resolveAnyOfOrOneOfRefs
2497
2555
  );
2498
2556
  }
2499
2557
  /** Sanitize the `data` associated with the `oldSchema` so it is considered appropriate for the `newSchema`. If the
@@ -2517,27 +2575,6 @@ var SchemaUtils = class {
2517
2575
  this.experimental_customMergeAllOf
2518
2576
  );
2519
2577
  }
2520
- /** Generates an `IdSchema` object for the `schema`, recursively
2521
- *
2522
- * @param schema - The schema for which the display label flag is desired
2523
- * @param [id] - The base id for the schema
2524
- * @param [formData] - The current formData, if any, onto which to provide any missing defaults
2525
- * @param [idPrefix='root'] - The prefix to use for the id
2526
- * @param [idSeparator='_'] - The separator to use for the path segments in the id
2527
- * @returns - The `IdSchema` object for the `schema`
2528
- */
2529
- toIdSchema(schema, id, formData, idPrefix = "root", idSeparator = "_") {
2530
- return toIdSchema(
2531
- this.validator,
2532
- schema,
2533
- id,
2534
- this.rootSchema,
2535
- formData,
2536
- idPrefix,
2537
- idSeparator,
2538
- this.experimental_customMergeAllOf
2539
- );
2540
- }
2541
2578
  /** Generates an `PathSchema` object for the `schema`, recursively
2542
2579
  *
2543
2580
  * @param schema - The schema for which the display label flag is desired
@@ -2623,6 +2660,31 @@ function dateRangeOptions(start, stop) {
2623
2660
  return options;
2624
2661
  }
2625
2662
 
2663
+ // src/shallowEquals.ts
2664
+ function shallowEquals(a, b) {
2665
+ if (Object.is(a, b)) {
2666
+ return true;
2667
+ }
2668
+ if (a == null || b == null) {
2669
+ return false;
2670
+ }
2671
+ if (typeof a !== "object" || typeof b !== "object") {
2672
+ return false;
2673
+ }
2674
+ const keysA = Object.keys(a);
2675
+ const keysB = Object.keys(b);
2676
+ if (keysA.length !== keysB.length) {
2677
+ return false;
2678
+ }
2679
+ for (let i = 0; i < keysA.length; i++) {
2680
+ const key = keysA[i];
2681
+ if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {
2682
+ return false;
2683
+ }
2684
+ }
2685
+ return true;
2686
+ }
2687
+
2626
2688
  // src/replaceStringParameters.ts
2627
2689
  function replaceStringParameters(inputString, params) {
2628
2690
  let output = inputString;
@@ -2695,7 +2757,7 @@ function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2695
2757
 
2696
2758
  // src/ErrorSchemaBuilder.ts
2697
2759
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
2698
- var import_get15 = __toESM(require("lodash/get"), 1);
2760
+ var import_get16 = __toESM(require("lodash/get"), 1);
2699
2761
  var import_set3 = __toESM(require("lodash/set"), 1);
2700
2762
  var import_setWith = __toESM(require("lodash/setWith"), 1);
2701
2763
  var ErrorSchemaBuilder = class {
@@ -2724,7 +2786,7 @@ var ErrorSchemaBuilder = class {
2724
2786
  */
2725
2787
  getOrCreateErrorBlock(pathOfError) {
2726
2788
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2727
- let errorBlock = hasPath ? (0, import_get15.default)(this.errorSchema, pathOfError) : this.errorSchema;
2789
+ let errorBlock = hasPath ? (0, import_get16.default)(this.errorSchema, pathOfError) : this.errorSchema;
2728
2790
  if (!errorBlock && pathOfError) {
2729
2791
  errorBlock = {};
2730
2792
  (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2750,7 +2812,7 @@ var ErrorSchemaBuilder = class {
2750
2812
  */
2751
2813
  addErrors(errorOrList, pathOfError) {
2752
2814
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2753
- let errorsList = (0, import_get15.default)(errorBlock, ERRORS_KEY);
2815
+ let errorsList = (0, import_get16.default)(errorBlock, ERRORS_KEY);
2754
2816
  if (!Array.isArray(errorsList)) {
2755
2817
  errorsList = [];
2756
2818
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2790,6 +2852,29 @@ var ErrorSchemaBuilder = class {
2790
2852
  }
2791
2853
  };
2792
2854
 
2855
+ // src/getChangedFields.ts
2856
+ var import_keys = __toESM(require("lodash/keys"), 1);
2857
+ var import_pickBy = __toESM(require("lodash/pickBy"), 1);
2858
+ var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
2859
+ var import_get17 = __toESM(require("lodash/get"), 1);
2860
+ var import_difference = __toESM(require("lodash/difference"), 1);
2861
+ function getChangedFields(a, b) {
2862
+ const aIsPlainObject = (0, import_isPlainObject2.default)(a);
2863
+ const bIsPlainObject = (0, import_isPlainObject2.default)(b);
2864
+ if (a === b || !aIsPlainObject && !bIsPlainObject) {
2865
+ return [];
2866
+ }
2867
+ if (aIsPlainObject && !bIsPlainObject) {
2868
+ return (0, import_keys.default)(a);
2869
+ } else if (!aIsPlainObject && bIsPlainObject) {
2870
+ return (0, import_keys.default)(b);
2871
+ } else {
2872
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get17.default)(b, key))));
2873
+ const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
2874
+ return [...unequalFields, ...diffFields];
2875
+ }
2876
+ }
2877
+
2793
2878
  // src/getDateElementProps.ts
2794
2879
  function getDateElementProps(date, time, yearRange = [1900, (/* @__PURE__ */ new Date()).getFullYear() + 2], format = "YMD") {
2795
2880
  const { day, month, year, hour, minute, second } = date;
@@ -2898,10 +2983,10 @@ function getTemplate(name, registry, uiOptions = {}) {
2898
2983
  }
2899
2984
 
2900
2985
  // src/getTestIds.ts
2901
- var import_nanoid = require("nanoid");
2902
- var import_get16 = __toESM(require("lodash/get"), 1);
2986
+ var import_get18 = __toESM(require("lodash/get"), 1);
2987
+ var import_uniqueId = __toESM(require("lodash/uniqueId"), 1);
2903
2988
  function getTestIds() {
2904
- if (typeof process === "undefined" || (0, import_get16.default)(process, "env.NODE_ENV") !== "test") {
2989
+ if (typeof process === "undefined" || (0, import_get18.default)(process, "env.NODE_ENV") !== "test") {
2905
2990
  return {};
2906
2991
  }
2907
2992
  const ids = /* @__PURE__ */ new Map();
@@ -2910,7 +2995,7 @@ function getTestIds() {
2910
2995
  {
2911
2996
  get(_obj, prop) {
2912
2997
  if (!ids.has(prop)) {
2913
- ids.set(prop, (0, import_nanoid.nanoid)());
2998
+ ids.set(prop, (0, import_uniqueId.default)("test-id-"));
2914
2999
  }
2915
3000
  return ids.get(prop);
2916
3001
  }
@@ -2921,7 +3006,7 @@ function getTestIds() {
2921
3006
  // src/getWidget.tsx
2922
3007
  var import_react = require("react");
2923
3008
  var import_react_is = __toESM(require("react-is"), 1);
2924
- var import_get17 = __toESM(require("lodash/get"), 1);
3009
+ var import_get19 = __toESM(require("lodash/get"), 1);
2925
3010
  var import_set4 = __toESM(require("lodash/set"), 1);
2926
3011
  var import_jsx_runtime = require("react/jsx-runtime");
2927
3012
  var widgetMap = {
@@ -2977,7 +3062,7 @@ var widgetMap = {
2977
3062
  }
2978
3063
  };
2979
3064
  function mergeWidgetOptions(AWidget) {
2980
- let MergedWidget = (0, import_get17.default)(AWidget, "MergedWidget");
3065
+ let MergedWidget = (0, import_get19.default)(AWidget, "MergedWidget");
2981
3066
  if (!MergedWidget) {
2982
3067
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
2983
3068
  MergedWidget = ({ options, ...props }) => {
@@ -2993,7 +3078,7 @@ function getWidget(schema, widget, registeredWidgets = {}) {
2993
3078
  return mergeWidgetOptions(widget);
2994
3079
  }
2995
3080
  if (typeof widget !== "string") {
2996
- throw new Error(`Unsupported widget definition: ${typeof widget}`);
3081
+ throw new Error(`Unsupported widget definition: ${typeof widget} in schema: ${JSON.stringify(schema)}`);
2997
3082
  }
2998
3083
  if (widget in registeredWidgets) {
2999
3084
  const registeredWidget = registeredWidgets[widget];
@@ -3001,14 +3086,14 @@ function getWidget(schema, widget, registeredWidgets = {}) {
3001
3086
  }
3002
3087
  if (typeof type === "string") {
3003
3088
  if (!(type in widgetMap)) {
3004
- throw new Error(`No widget for type '${type}'`);
3089
+ throw new Error(`No widget for type '${type}' in schema: ${JSON.stringify(schema)}`);
3005
3090
  }
3006
3091
  if (widget in widgetMap[type]) {
3007
3092
  const registeredWidget = registeredWidgets[widgetMap[type][widget]];
3008
3093
  return getWidget(schema, registeredWidget, registeredWidgets);
3009
3094
  }
3010
3095
  }
3011
- throw new Error(`No widget '${widget}' for type '${type}'`);
3096
+ throw new Error(`No widget '${widget}' for type '${type}' in schema: ${JSON.stringify(schema)}`);
3012
3097
  }
3013
3098
 
3014
3099
  // src/hashForSchema.ts
@@ -3078,6 +3163,31 @@ function optionId(id, optionIndex) {
3078
3163
  function buttonId(id, btn) {
3079
3164
  return idGenerator(id, btn);
3080
3165
  }
3166
+ function optionalControlsId(id, element) {
3167
+ return idGenerator(id, `optional${element}`);
3168
+ }
3169
+
3170
+ // src/isFormDataAvailable.ts
3171
+ var import_isNil3 = __toESM(require("lodash/isNil"), 1);
3172
+ var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
3173
+ var import_isObject11 = __toESM(require("lodash/isObject"), 1);
3174
+ function isFormDataAvailable(formData) {
3175
+ return !(0, import_isNil3.default)(formData) && (!(0, import_isObject11.default)(formData) || Array.isArray(formData) || !(0, import_isEmpty5.default)(formData));
3176
+ }
3177
+
3178
+ // src/isRootSchema.ts
3179
+ var import_isEqual2 = __toESM(require("lodash/isEqual"), 1);
3180
+ function isRootSchema(registry, schemaToCompare) {
3181
+ const { rootSchema, schemaUtils } = registry;
3182
+ if ((0, import_isEqual2.default)(schemaToCompare, rootSchema)) {
3183
+ return true;
3184
+ }
3185
+ if (REF_KEY in rootSchema) {
3186
+ const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
3187
+ return (0, import_isEqual2.default)(schemaToCompare, resolvedSchema);
3188
+ }
3189
+ return false;
3190
+ }
3081
3191
 
3082
3192
  // src/labelValue.ts
3083
3193
  function labelValue(label, hideLabel, fallback) {
@@ -3090,14 +3200,14 @@ function localToUTC(dateString) {
3090
3200
  }
3091
3201
 
3092
3202
  // src/lookupFromFormContext.ts
3093
- var import_get18 = __toESM(require("lodash/get"), 1);
3203
+ var import_get20 = __toESM(require("lodash/get"), 1);
3094
3204
  var import_has6 = __toESM(require("lodash/has"), 1);
3095
3205
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3096
3206
  const lookupPath = [LOOKUP_MAP_NAME];
3097
3207
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3098
3208
  lookupPath.unshift(FORM_CONTEXT_NAME);
3099
3209
  }
3100
- return (0, import_get18.default)(regOrFc, [...lookupPath, toLookup], fallback);
3210
+ return (0, import_get20.default)(regOrFc, [...lookupPath, toLookup], fallback);
3101
3211
  }
3102
3212
 
3103
3213
  // src/orderProperties.ts
@@ -3178,11 +3288,40 @@ function schemaRequiresTrueValue(schema) {
3178
3288
  }
3179
3289
 
3180
3290
  // src/shouldRender.ts
3181
- function shouldRender(component, nextProps, nextState) {
3291
+ function shouldRender(component, nextProps, nextState, updateStrategy = "customDeep") {
3292
+ if (updateStrategy === "always") {
3293
+ return true;
3294
+ }
3295
+ if (updateStrategy === "shallow") {
3296
+ const { props: props2, state: state2 } = component;
3297
+ return !shallowEquals(props2, nextProps) || !shallowEquals(state2, nextState);
3298
+ }
3182
3299
  const { props, state } = component;
3183
3300
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3184
3301
  }
3185
3302
 
3303
+ // src/shouldRenderOptionalField.ts
3304
+ var import_isObject12 = __toESM(require("lodash/isObject"), 1);
3305
+ var import_uniq2 = __toESM(require("lodash/uniq"), 1);
3306
+ function getSchemaTypesForXxxOf(schemas) {
3307
+ const allTypes = (0, import_uniq2.default)(
3308
+ schemas.map((s) => (0, import_isObject12.default)(s) ? getSchemaType(s) : void 0).flat().filter((t) => t !== void 0)
3309
+ );
3310
+ return allTypes.length === 1 ? allTypes[0] : allTypes;
3311
+ }
3312
+ function shouldRenderOptionalField(registry, schema, required, uiSchema) {
3313
+ const { enableOptionalDataFieldForType = [] } = getUiOptions(uiSchema, registry.globalUiOptions);
3314
+ let schemaType;
3315
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
3316
+ schemaType = getSchemaTypesForXxxOf(schema[ANY_OF_KEY]);
3317
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
3318
+ schemaType = getSchemaTypesForXxxOf(schema[ONE_OF_KEY]);
3319
+ } else {
3320
+ schemaType = getSchemaType(schema);
3321
+ }
3322
+ return !isRootSchema(registry, schema) && !required && !!schemaType && !Array.isArray(schemaType) && !!enableOptionalDataFieldForType.find((val) => val === schemaType);
3323
+ }
3324
+
3186
3325
  // src/toDateString.ts
3187
3326
  function toDateString(dateObject, time = true) {
3188
3327
  const { year, month, day, hour = 0, minute = 0, second = 0 } = dateObject;
@@ -3192,7 +3331,7 @@ function toDateString(dateObject, time = true) {
3192
3331
  }
3193
3332
 
3194
3333
  // src/toErrorList.ts
3195
- var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
3334
+ var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"), 1);
3196
3335
  function toErrorList(errorSchema, fieldPath = []) {
3197
3336
  if (!errorSchema) {
3198
3337
  return [];
@@ -3213,7 +3352,7 @@ function toErrorList(errorSchema, fieldPath = []) {
3213
3352
  return Object.keys(errorSchema).reduce((acc, key) => {
3214
3353
  if (key !== ERRORS_KEY) {
3215
3354
  const childSchema = errorSchema[key];
3216
- if ((0, import_isPlainObject2.default)(childSchema)) {
3355
+ if ((0, import_isPlainObject3.default)(childSchema)) {
3217
3356
  acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
3218
3357
  }
3219
3358
  }
@@ -3240,15 +3379,24 @@ function toErrorSchema(errors) {
3240
3379
  return builder.ErrorSchema;
3241
3380
  }
3242
3381
 
3382
+ // src/toFieldPathId.ts
3383
+ function toFieldPathId(fieldPath, globalFormOptions, parentPath) {
3384
+ const basePath = Array.isArray(parentPath) ? parentPath : parentPath?.path;
3385
+ const childPath = fieldPath === "" ? [] : [fieldPath];
3386
+ const path = basePath ? basePath.concat(...childPath) : childPath;
3387
+ const id = [globalFormOptions.idPrefix, ...path].join(globalFormOptions.idSeparator);
3388
+ return { path, [ID_KEY]: id };
3389
+ }
3390
+
3243
3391
  // src/unwrapErrorHandler.ts
3244
- var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"), 1);
3392
+ var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3245
3393
  function unwrapErrorHandler(errorHandler) {
3246
3394
  return Object.keys(errorHandler).reduce((acc, key) => {
3247
3395
  if (key === "addError") {
3248
3396
  return acc;
3249
3397
  } else {
3250
3398
  const childSchema = errorHandler[key];
3251
- if ((0, import_isPlainObject3.default)(childSchema)) {
3399
+ if ((0, import_isPlainObject4.default)(childSchema)) {
3252
3400
  return {
3253
3401
  ...acc,
3254
3402
  [key]: unwrapErrorHandler(childSchema)
@@ -3276,23 +3424,27 @@ function utcToLocal(jsonDate) {
3276
3424
  }
3277
3425
 
3278
3426
  // src/validationDataMerge.ts
3279
- var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
3280
- function validationDataMerge(validationData, additionalErrorSchema) {
3427
+ var import_isEmpty6 = __toESM(require("lodash/isEmpty"), 1);
3428
+ function validationDataMerge(validationData, additionalErrorSchema, preventDuplicates = false) {
3281
3429
  if (!additionalErrorSchema) {
3282
3430
  return validationData;
3283
3431
  }
3284
3432
  const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
3285
3433
  let errors = toErrorList(additionalErrorSchema);
3286
3434
  let errorSchema = additionalErrorSchema;
3287
- if (!(0, import_isEmpty5.default)(oldErrorSchema)) {
3288
- errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
3435
+ if (!(0, import_isEmpty6.default)(oldErrorSchema)) {
3436
+ errorSchema = mergeObjects(
3437
+ oldErrorSchema,
3438
+ additionalErrorSchema,
3439
+ preventDuplicates ? "preventDuplicates" : true
3440
+ );
3289
3441
  errors = [...oldErrors].concat(errors);
3290
3442
  }
3291
3443
  return { errorSchema, errors };
3292
3444
  }
3293
3445
 
3294
3446
  // src/withIdRefPrefix.ts
3295
- var import_isObject11 = __toESM(require("lodash/isObject"), 1);
3447
+ var import_isObject13 = __toESM(require("lodash/isObject"), 1);
3296
3448
  function withIdRefPrefixObject(node) {
3297
3449
  for (const key in node) {
3298
3450
  const realObj = node;
@@ -3315,35 +3467,12 @@ function withIdRefPrefix(schemaNode) {
3315
3467
  if (Array.isArray(schemaNode)) {
3316
3468
  return withIdRefPrefixArray([...schemaNode]);
3317
3469
  }
3318
- if ((0, import_isObject11.default)(schemaNode)) {
3470
+ if ((0, import_isObject13.default)(schemaNode)) {
3319
3471
  return withIdRefPrefixObject({ ...schemaNode });
3320
3472
  }
3321
3473
  return schemaNode;
3322
3474
  }
3323
3475
 
3324
- // src/getChangedFields.ts
3325
- var import_keys = __toESM(require("lodash/keys"), 1);
3326
- var import_pickBy = __toESM(require("lodash/pickBy"), 1);
3327
- var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3328
- var import_get19 = __toESM(require("lodash/get"), 1);
3329
- var import_difference = __toESM(require("lodash/difference"), 1);
3330
- function getChangedFields(a, b) {
3331
- const aIsPlainObject = (0, import_isPlainObject4.default)(a);
3332
- const bIsPlainObject = (0, import_isPlainObject4.default)(b);
3333
- if (a === b || !aIsPlainObject && !bIsPlainObject) {
3334
- return [];
3335
- }
3336
- if (aIsPlainObject && !bIsPlainObject) {
3337
- return (0, import_keys.default)(a);
3338
- } else if (!aIsPlainObject && bIsPlainObject) {
3339
- return (0, import_keys.default)(b);
3340
- } else {
3341
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get19.default)(b, key))));
3342
- const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3343
- return [...unequalFields, ...diffFields];
3344
- }
3345
- }
3346
-
3347
3476
  // src/enums.ts
3348
3477
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3349
3478
  TranslatableString2["ArrayItemTitle"] = "Item";
@@ -3366,6 +3495,9 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3366
3495
  TranslatableString2["PreviewLabel"] = "Preview";
3367
3496
  TranslatableString2["DecrementAriaLabel"] = "Decrease value by 1";
3368
3497
  TranslatableString2["IncrementAriaLabel"] = "Increase value by 1";
3498
+ TranslatableString2["OptionalObjectAdd"] = "Add data for optional field";
3499
+ TranslatableString2["OptionalObjectRemove"] = "Remove data for optional field";
3500
+ TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
3369
3501
  TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
3370
3502
  TranslatableString2["OptionPrefix"] = "Option %1";
3371
3503
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
@@ -3383,7 +3515,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3383
3515
  var import_forEach = __toESM(require("lodash/forEach"), 1);
3384
3516
 
3385
3517
  // src/parser/ParserValidator.ts
3386
- var import_get20 = __toESM(require("lodash/get"), 1);
3518
+ var import_get21 = __toESM(require("lodash/get"), 1);
3387
3519
  var ParserValidator = class {
3388
3520
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
3389
3521
  * first.
@@ -3409,7 +3541,7 @@ var ParserValidator = class {
3409
3541
  * @param hash - The hash value at which to map the schema
3410
3542
  */
3411
3543
  addSchema(schema, hash) {
3412
- const key = (0, import_get20.default)(schema, ID_KEY, hash);
3544
+ const key = (0, import_get21.default)(schema, ID_KEY, hash);
3413
3545
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3414
3546
  const existing = this.schemaMap[key];
3415
3547
  if (!existing) {
@@ -3499,4 +3631,4 @@ function schemaParser(rootSchema) {
3499
3631
  parseSchema(validator, recurseList, rootSchema, rootSchema);
3500
3632
  return validator.getSchemaMap();
3501
3633
  }
3502
- //# sourceMappingURL=index.js.map
3634
+ //# sourceMappingURL=index.cjs.map