@rjsf/utils 6.0.0-beta.9 → 6.0.1

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 (113) hide show
  1. package/dist/{index.js → index.cjs} +563 -200
  2. package/dist/index.cjs.map +7 -0
  3. package/dist/utils.esm.js +562 -199
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +533 -193
  6. package/lib/ErrorSchemaBuilder.d.ts +2 -2
  7. package/lib/constants.d.ts +3 -0
  8. package/lib/constants.js +3 -0
  9. package/lib/constants.js.map +1 -1
  10. package/lib/createSchemaUtils.js +25 -18
  11. package/lib/createSchemaUtils.js.map +1 -1
  12. package/lib/enums.d.ts +13 -3
  13. package/lib/enums.js +13 -3
  14. package/lib/enums.js.map +1 -1
  15. package/lib/findSchemaDefinition.d.ts +6 -0
  16. package/lib/findSchemaDefinition.js +44 -3
  17. package/lib/findSchemaDefinition.js.map +1 -1
  18. package/lib/getDateElementProps.d.ts +1 -2
  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 +16 -6
  30. package/lib/index.js +13 -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/nameGenerators.d.ts +13 -0
  41. package/lib/nameGenerators.js +30 -0
  42. package/lib/nameGenerators.js.map +1 -0
  43. package/lib/schema/getDefaultFormState.d.ts +17 -3
  44. package/lib/schema/getDefaultFormState.js +66 -26
  45. package/lib/schema/getDefaultFormState.js.map +1 -1
  46. package/lib/schema/getDisplayLabel.js +2 -2
  47. package/lib/schema/getDisplayLabel.js.map +1 -1
  48. package/lib/schema/index.d.ts +1 -2
  49. package/lib/schema/index.js +1 -2
  50. package/lib/schema/index.js.map +1 -1
  51. package/lib/schema/retrieveSchema.d.ts +10 -5
  52. package/lib/schema/retrieveSchema.js +40 -17
  53. package/lib/schema/retrieveSchema.js.map +1 -1
  54. package/lib/shallowEquals.d.ts +8 -0
  55. package/lib/shallowEquals.js +36 -0
  56. package/lib/shallowEquals.js.map +1 -0
  57. package/lib/shouldRender.d.ts +8 -2
  58. package/lib/shouldRender.js +17 -2
  59. package/lib/shouldRender.js.map +1 -1
  60. package/lib/shouldRenderOptionalField.d.ts +18 -0
  61. package/lib/shouldRenderOptionalField.js +47 -0
  62. package/lib/shouldRenderOptionalField.js.map +1 -0
  63. package/lib/toFieldPathId.d.ts +14 -0
  64. package/lib/toFieldPathId.js +26 -0
  65. package/lib/toFieldPathId.js.map +1 -0
  66. package/lib/tsconfig.tsbuildinfo +1 -1
  67. package/lib/types.d.ts +196 -105
  68. package/lib/useAltDateWidgetProps.d.ts +39 -0
  69. package/lib/useAltDateWidgetProps.js +71 -0
  70. package/lib/useAltDateWidgetProps.js.map +1 -0
  71. package/lib/useDeepCompareMemo.d.ts +8 -0
  72. package/lib/useDeepCompareMemo.js +17 -0
  73. package/lib/useDeepCompareMemo.js.map +1 -0
  74. package/lib/useFileWidgetProps.d.ts +29 -0
  75. package/lib/useFileWidgetProps.js +119 -0
  76. package/lib/useFileWidgetProps.js.map +1 -0
  77. package/lib/validationDataMerge.d.ts +2 -1
  78. package/lib/validationDataMerge.js +3 -2
  79. package/lib/validationDataMerge.js.map +1 -1
  80. package/package.json +13 -14
  81. package/src/ErrorSchemaBuilder.ts +2 -2
  82. package/src/constants.ts +3 -0
  83. package/src/createSchemaUtils.ts +25 -26
  84. package/src/enums.ts +13 -3
  85. package/src/findSchemaDefinition.ts +51 -3
  86. package/src/getDateElementProps.ts +1 -1
  87. package/src/getTestIds.ts +2 -2
  88. package/src/getUiOptions.ts +4 -0
  89. package/src/getWidget.tsx +3 -3
  90. package/src/idGenerators.ts +35 -25
  91. package/src/index.ts +36 -5
  92. package/src/isFormDataAvailable.ts +13 -0
  93. package/src/isRootSchema.ts +30 -0
  94. package/src/mergeDefaultsWithFormData.ts +16 -2
  95. package/src/nameGenerators.ts +43 -0
  96. package/src/schema/getDefaultFormState.ts +87 -31
  97. package/src/schema/getDisplayLabel.ts +2 -2
  98. package/src/schema/index.ts +0 -2
  99. package/src/schema/retrieveSchema.ts +43 -7
  100. package/src/shallowEquals.ts +41 -0
  101. package/src/shouldRender.ts +27 -2
  102. package/src/shouldRenderOptionalField.ts +56 -0
  103. package/src/toFieldPathId.ts +34 -0
  104. package/src/types.ts +229 -113
  105. package/src/useAltDateWidgetProps.tsx +163 -0
  106. package/src/useDeepCompareMemo.ts +17 -0
  107. package/src/useFileWidgetProps.ts +155 -0
  108. package/src/validationDataMerge.ts +7 -1
  109. package/dist/index.js.map +0 -7
  110. package/lib/schema/toIdSchema.d.ts +0 -14
  111. package/lib/schema/toIdSchema.js +0 -62
  112. package/lib/schema/toIdSchema.js.map +0 -1
  113. package/src/schema/toIdSchema.ts +0 -131
@@ -35,10 +35,13 @@ __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,
41
43
  DISCRIMINATOR_PATH: () => DISCRIMINATOR_PATH,
44
+ DateElement: () => DateElement,
42
45
  ENUM_KEY: () => ENUM_KEY,
43
46
  ERRORS_KEY: () => ERRORS_KEY,
44
47
  ErrorSchemaBuilder: () => ErrorSchemaBuilder,
@@ -46,6 +49,7 @@ __export(index_exports, {
46
49
  ID_KEY: () => ID_KEY,
47
50
  IF_KEY: () => IF_KEY,
48
51
  ITEMS_KEY: () => ITEMS_KEY,
52
+ JSON_SCHEMA_DRAFT_2019_09: () => JSON_SCHEMA_DRAFT_2019_09,
49
53
  JSON_SCHEMA_DRAFT_2020_12: () => JSON_SCHEMA_DRAFT_2020_12,
50
54
  JUNK_OPTION_ID: () => JUNK_OPTION_ID,
51
55
  LOOKUP_MAP_NAME: () => LOOKUP_MAP_NAME,
@@ -68,6 +72,7 @@ __export(index_exports, {
68
72
  allowAdditionalItems: () => allowAdditionalItems,
69
73
  ariaDescribedByIds: () => ariaDescribedByIds,
70
74
  asNumber: () => asNumber,
75
+ bracketNameGenerator: () => bracketNameGenerator,
71
76
  buttonId: () => buttonId,
72
77
  canExpand: () => canExpand,
73
78
  createErrorHandler: () => createErrorHandler,
@@ -76,6 +81,7 @@ __export(index_exports, {
76
81
  dateRangeOptions: () => dateRangeOptions,
77
82
  deepEquals: () => deepEquals,
78
83
  descriptionId: () => descriptionId,
84
+ dotNotationNameGenerator: () => dotNotationNameGenerator,
79
85
  englishStringTranslator: () => englishStringTranslator,
80
86
  enumOptionsDeselectValue: () => enumOptionsDeselectValue,
81
87
  enumOptionsIndexForValue: () => enumOptionsIndexForValue,
@@ -113,8 +119,10 @@ __export(index_exports, {
113
119
  isCustomWidget: () => isCustomWidget,
114
120
  isFilesArray: () => isFilesArray,
115
121
  isFixedItems: () => isFixedItems,
122
+ isFormDataAvailable: () => isFormDataAvailable,
116
123
  isMultiSelect: () => isMultiSelect,
117
124
  isObject: () => isObject,
125
+ isRootSchema: () => isRootSchema,
118
126
  isSelect: () => isSelect,
119
127
  labelValue: () => labelValue,
120
128
  localToUTC: () => localToUTC,
@@ -123,6 +131,7 @@ __export(index_exports, {
123
131
  mergeObjects: () => mergeObjects,
124
132
  mergeSchemas: () => mergeSchemas,
125
133
  optionId: () => optionId,
134
+ optionalControlsId: () => optionalControlsId,
126
135
  optionsList: () => optionsList,
127
136
  orderProperties: () => orderProperties,
128
137
  pad: () => pad,
@@ -133,16 +142,21 @@ __export(index_exports, {
133
142
  sanitizeDataForNewSchema: () => sanitizeDataForNewSchema,
134
143
  schemaParser: () => schemaParser,
135
144
  schemaRequiresTrueValue: () => schemaRequiresTrueValue,
145
+ shallowEquals: () => shallowEquals,
136
146
  shouldRender: () => shouldRender,
147
+ shouldRenderOptionalField: () => shouldRenderOptionalField,
137
148
  sortedJSONStringify: () => sortedJSONStringify,
138
149
  titleId: () => titleId,
139
150
  toConstant: () => toConstant,
140
151
  toDateString: () => toDateString,
141
152
  toErrorList: () => toErrorList,
142
153
  toErrorSchema: () => toErrorSchema,
143
- toIdSchema: () => toIdSchema,
154
+ toFieldPathId: () => toFieldPathId,
144
155
  toPathSchema: () => toPathSchema,
145
156
  unwrapErrorHandler: () => unwrapErrorHandler,
157
+ useAltDateWidgetProps: () => useAltDateWidgetProps,
158
+ useDeepCompareMemo: () => useDeepCompareMemo,
159
+ useFileWidgetProps: () => useFileWidgetProps,
146
160
  utcToLocal: () => utcToLocal,
147
161
  validationDataMerge: () => validationDataMerge,
148
162
  withIdRefPrefix: () => withIdRefPrefix
@@ -217,6 +231,8 @@ var REQUIRED_KEY = "required";
217
231
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
218
232
  var REF_KEY = "$ref";
219
233
  var SCHEMA_KEY = "$schema";
234
+ var DEFAULT_ID_PREFIX = "root";
235
+ var DEFAULT_ID_SEPARATOR = "_";
220
236
  var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
221
237
  var FORM_CONTEXT_NAME = "formContext";
222
238
  var LOOKUP_MAP_NAME = "layoutGridLookupMap";
@@ -226,10 +242,14 @@ var UI_FIELD_KEY = "ui:field";
226
242
  var UI_WIDGET_KEY = "ui:widget";
227
243
  var UI_OPTIONS_KEY = "ui:options";
228
244
  var UI_GLOBAL_OPTIONS_KEY = "ui:globalOptions";
245
+ var JSON_SCHEMA_DRAFT_2019_09 = "https://json-schema.org/draft/2019-09/schema";
229
246
  var JSON_SCHEMA_DRAFT_2020_12 = "https://json-schema.org/draft/2020-12/schema";
230
247
 
231
248
  // src/getUiOptions.ts
232
249
  function getUiOptions(uiSchema = {}, globalOptions = {}) {
250
+ if (!uiSchema) {
251
+ return { ...globalOptions };
252
+ }
233
253
  return Object.keys(uiSchema).filter((key) => key.indexOf("ui:") === 0).reduce(
234
254
  (options, key) => {
235
255
  const value = uiSchema[key];
@@ -328,7 +348,16 @@ function findEmbeddedSchemaRecursive(schema, ref) {
328
348
  return schema;
329
349
  }
330
350
  for (const subSchema of Object.values(schema)) {
331
- if ((0, import_isObject3.default)(subSchema)) {
351
+ if (Array.isArray(subSchema)) {
352
+ for (const item of subSchema) {
353
+ if ((0, import_isObject3.default)(item)) {
354
+ const result = findEmbeddedSchemaRecursive(item, ref);
355
+ if (result !== void 0) {
356
+ return result;
357
+ }
358
+ }
359
+ }
360
+ } else if ((0, import_isObject3.default)(subSchema)) {
332
361
  const result = findEmbeddedSchemaRecursive(subSchema, ref);
333
362
  if (result !== void 0) {
334
363
  return result;
@@ -337,6 +366,23 @@ function findEmbeddedSchemaRecursive(schema, ref) {
337
366
  }
338
367
  return void 0;
339
368
  }
369
+ function makeAllReferencesAbsolute(schema, baseURI) {
370
+ const currentURI = (0, import_get.default)(schema, ID_KEY, baseURI);
371
+ if (REF_KEY in schema) {
372
+ schema = { ...schema, [REF_KEY]: import_fast_uri.default.resolve(currentURI, schema[REF_KEY]) };
373
+ }
374
+ for (const [key, subSchema] of Object.entries(schema)) {
375
+ if (Array.isArray(subSchema)) {
376
+ schema = {
377
+ ...schema,
378
+ [key]: subSchema.map((item) => (0, import_isObject3.default)(item) ? makeAllReferencesAbsolute(item, currentURI) : item)
379
+ };
380
+ } else if ((0, import_isObject3.default)(subSchema)) {
381
+ schema = { ...schema, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
382
+ }
383
+ }
384
+ return schema;
385
+ }
340
386
  function splitKeyElementFromObject(key, object) {
341
387
  const value = object[key];
342
388
  const remaining = (0, import_omit.default)(object, [key]);
@@ -382,7 +428,11 @@ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [],
382
428
  const [remaining, theRef] = splitKeyElementFromObject(REF_KEY, current);
383
429
  const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], baseURI);
384
430
  if (Object.keys(remaining).length > 0) {
385
- return { ...remaining, ...subSchema };
431
+ if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2019_09 || rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
432
+ return { [ALL_OF_KEY]: [remaining, subSchema] };
433
+ } else {
434
+ return { ...remaining, ...subSchema };
435
+ }
386
436
  }
387
437
  return subSchema;
388
438
  }
@@ -550,7 +600,7 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
550
600
 
551
601
  // src/schema/retrieveSchema.ts
552
602
  var import_isEmpty2 = __toESM(require("lodash/isEmpty"), 1);
553
- function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
603
+ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs = false) {
554
604
  return retrieveSchemaInternal(
555
605
  validator,
556
606
  schema,
@@ -558,7 +608,8 @@ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experim
558
608
  rawFormData,
559
609
  void 0,
560
610
  void 0,
561
- experimental_customMergeAllOf
611
+ experimental_customMergeAllOf,
612
+ resolveAnyOfOrOneOfRefs
562
613
  )[0];
563
614
  }
564
615
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
@@ -647,14 +698,16 @@ function getMatchingPatternProperties(schema, key) {
647
698
  {}
648
699
  );
649
700
  }
650
- function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
701
+ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
651
702
  const updatedSchemas = resolveReference(
652
703
  validator,
653
704
  schema,
654
705
  rootSchema,
655
706
  expandAllBranches,
656
707
  recurseList,
657
- formData
708
+ formData,
709
+ experimental_customMergeAllOf,
710
+ resolveAnyOfOrOneOfRefs
658
711
  );
659
712
  if (updatedSchemas.length > 1 || updatedSchemas[0] !== schema) {
660
713
  return updatedSchemas;
@@ -666,7 +719,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
666
719
  rootSchema,
667
720
  expandAllBranches,
668
721
  recurseList,
669
- formData
722
+ formData,
723
+ experimental_customMergeAllOf
670
724
  );
671
725
  return resolvedSchemas.flatMap((s) => {
672
726
  return retrieveSchemaInternal(
@@ -680,7 +734,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
680
734
  );
681
735
  });
682
736
  }
683
- if (ALL_OF_KEY in schema && Array.isArray(schema.allOf)) {
737
+ if (ALL_OF_KEY in schema && Array.isArray(schema[ALL_OF_KEY])) {
684
738
  const allOfSchemaElements = schema.allOf.map(
685
739
  (allOfSubschema) => retrieveSchemaInternal(
686
740
  validator,
@@ -700,8 +754,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
700
754
  }
701
755
  return [schema];
702
756
  }
703
- function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
704
- const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList);
757
+ function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
758
+ const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList, void 0, resolveAnyOfOrOneOfRefs);
705
759
  if (updatedSchema !== schema) {
706
760
  return retrieveSchemaInternal(
707
761
  validator,
@@ -710,12 +764,13 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
710
764
  formData,
711
765
  expandAllBranches,
712
766
  recurseList,
713
- experimental_customMergeAllOf
767
+ experimental_customMergeAllOf,
768
+ resolveAnyOfOrOneOfRefs
714
769
  );
715
770
  }
716
771
  return [schema];
717
772
  }
718
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
773
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
719
774
  if (!isObject(schema)) {
720
775
  return schema;
721
776
  }
@@ -738,7 +793,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
738
793
  resolvedSchema[PROPERTIES_KEY],
739
794
  (result, value, key) => {
740
795
  const childList = [...recurseList];
741
- result[key] = resolveAllReferences(value, rootSchema, childList, baseURI);
796
+ result[key] = resolveAllReferences(value, rootSchema, childList, baseURI, resolveAnyOfOrOneOfRefs);
742
797
  childrenLists.push(childList);
743
798
  },
744
799
  {}
@@ -749,9 +804,28 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
749
804
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
750
805
  resolvedSchema = {
751
806
  ...resolvedSchema,
752
- items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI)
807
+ items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
753
808
  };
754
809
  }
810
+ if (resolveAnyOfOrOneOfRefs) {
811
+ let key;
812
+ let schemas;
813
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
814
+ key = ANY_OF_KEY;
815
+ schemas = resolvedSchema[ANY_OF_KEY];
816
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
817
+ key = ONE_OF_KEY;
818
+ schemas = resolvedSchema[ONE_OF_KEY];
819
+ }
820
+ if (key && schemas) {
821
+ resolvedSchema = {
822
+ ...resolvedSchema,
823
+ [key]: schemas.map(
824
+ (s) => resolveAllReferences(s, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
825
+ )
826
+ };
827
+ }
828
+ }
755
829
  return deepEquals(schema, resolvedSchema) ? schema : resolvedSchema;
756
830
  }
757
831
  function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFormData, experimental_customMergeAllOf) {
@@ -769,7 +843,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
769
843
  if (!(0, import_isEmpty2.default)(matchingProperties)) {
770
844
  schema.properties[key] = retrieveSchema(
771
845
  validator,
772
- { allOf: Object.values(matchingProperties) },
846
+ { [ALL_OF_KEY]: Object.values(matchingProperties) },
773
847
  rootSchema,
774
848
  (0, import_get5.default)(formData, [key]),
775
849
  experimental_customMergeAllOf
@@ -779,12 +853,12 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
779
853
  }
780
854
  }
781
855
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema.additionalProperties !== false) {
782
- let additionalProperties = {};
856
+ let additionalProperties;
783
857
  if (typeof schema.additionalProperties !== "boolean") {
784
858
  if (REF_KEY in schema.additionalProperties) {
785
859
  additionalProperties = retrieveSchema(
786
860
  validator,
787
- { $ref: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
861
+ { [REF_KEY]: (0, import_get5.default)(schema.additionalProperties, [REF_KEY]) },
788
862
  rootSchema,
789
863
  formData,
790
864
  experimental_customMergeAllOf
@@ -811,7 +885,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
811
885
  });
812
886
  return schema;
813
887
  }
814
- function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf) {
888
+ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
815
889
  if (!isObject(schema)) {
816
890
  return [{}];
817
891
  }
@@ -822,7 +896,8 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
822
896
  expandAllBranches,
823
897
  recurseList,
824
898
  rawFormData,
825
- experimental_customMergeAllOf
899
+ experimental_customMergeAllOf,
900
+ resolveAnyOfOrOneOfRefs
826
901
  );
827
902
  return resolvedSchemas.flatMap((s) => {
828
903
  let resolvedSchema = s;
@@ -1379,8 +1454,19 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1379
1454
  const keyValue = (0, import_get10.default)(formData, key);
1380
1455
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1381
1456
  const keyExistsInFormData = key in formData;
1457
+ const keyDefault = (0, import_get10.default)(defaults, key) ?? {};
1458
+ const defaultValueIsNestedObject = keyExistsInDefaults && Object.entries(keyDefault).some(([, v]) => isObject(v));
1459
+ const keyDefaultIsObject = keyExistsInDefaults && isObject((0, import_get10.default)(defaults, key));
1460
+ const keyHasFormDataObject = keyExistsInFormData && isObject(keyValue);
1461
+ if (keyDefaultIsObject && keyHasFormDataObject && !defaultValueIsNestedObject) {
1462
+ acc2[key] = {
1463
+ ...(0, import_get10.default)(defaults, key),
1464
+ ...keyValue
1465
+ };
1466
+ return acc2;
1467
+ }
1382
1468
  acc2[key] = mergeDefaultsWithFormData(
1383
- defaults ? (0, import_get10.default)(defaults, key) : {},
1469
+ (0, import_get10.default)(defaults, key),
1384
1470
  keyValue,
1385
1471
  mergeExtraArrayDefaults,
1386
1472
  defaultSupercedesUndefined,
@@ -1391,7 +1477,7 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1391
1477
  return acc2;
1392
1478
  }, acc);
1393
1479
  }
1394
- if (defaultSupercedesUndefined && (!(0, import_isNil.default)(defaults) && (0, import_isNil.default)(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !(0, import_isNil.default)(formData)) {
1480
+ if (defaultSupercedesUndefined && (!(defaults === void 0) && (0, import_isNil.default)(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !(0, import_isNil.default)(formData)) {
1395
1481
  return defaults;
1396
1482
  }
1397
1483
  return formData;
@@ -1538,10 +1624,19 @@ function getInnerSchemaForArrayItem(schema, additionalItems = 0 /* Ignore */, id
1538
1624
  }
1539
1625
  return {};
1540
1626
  }
1627
+ function computeDefaultBasedOnSchemaTypeAndDefaults(schema, computedDefault) {
1628
+ const { default: schemaDefault, type } = schema;
1629
+ const shouldReturnNullAsDefault = Array.isArray(type) && type.includes("null") && (0, import_isEmpty4.default)(computedDefault) && schemaDefault === null;
1630
+ return shouldReturnNullAsDefault ? null : computedDefault;
1631
+ }
1541
1632
  function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
1542
1633
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1543
- if (includeUndefinedValues || isConst) {
1634
+ if (includeUndefinedValues === true || isConst) {
1544
1635
  obj[key] = computedDefault;
1636
+ } else if (includeUndefinedValues === "excludeObjectChildren") {
1637
+ if (!isObject(computedDefault) || !(0, import_isEmpty4.default)(computedDefault)) {
1638
+ obj[key] = computedDefault;
1639
+ }
1545
1640
  } else if (emptyObjectFields !== "skipDefaults") {
1546
1641
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1547
1642
  if (isObject(computedDefault)) {
@@ -1573,7 +1668,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1573
1668
  experimental_defaultFormStateBehavior = void 0,
1574
1669
  experimental_customMergeAllOf = void 0,
1575
1670
  required,
1576
- shouldMergeDefaultsIntoFormData = false
1671
+ shouldMergeDefaultsIntoFormData = false,
1672
+ initialDefaultsGenerated
1577
1673
  } = computeDefaultsProps;
1578
1674
  let formData = isObject(rawFormData) ? rawFormData : {};
1579
1675
  const schema = isObject(rawSchema) ? rawSchema : {};
@@ -1581,7 +1677,7 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1581
1677
  let schemaToCompute = null;
1582
1678
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1583
1679
  let updatedRecurseList = _recurseList;
1584
- if (schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1680
+ if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1585
1681
  defaults = schema[CONST_KEY];
1586
1682
  } else if (isObject(defaults) && isObject(schema.default)) {
1587
1683
  defaults = mergeObjects(defaults, schema.default);
@@ -1676,9 +1772,10 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1676
1772
  experimental_defaultFormStateBehavior: experimental_dfsb_to_compute,
1677
1773
  experimental_customMergeAllOf,
1678
1774
  parentDefaults: defaults,
1679
- rawFormData: formData,
1775
+ rawFormData: rawFormData ?? formData,
1680
1776
  required,
1681
- shouldMergeDefaultsIntoFormData
1777
+ shouldMergeDefaultsIntoFormData,
1778
+ initialDefaultsGenerated
1682
1779
  });
1683
1780
  }
1684
1781
  if (defaults === void 0) {
@@ -1730,7 +1827,8 @@ function getObjectDefaults(validator, rawSchema, {
1730
1827
  experimental_defaultFormStateBehavior = void 0,
1731
1828
  experimental_customMergeAllOf = void 0,
1732
1829
  required,
1733
- shouldMergeDefaultsIntoFormData
1830
+ shouldMergeDefaultsIntoFormData,
1831
+ initialDefaultsGenerated
1734
1832
  } = {}, defaults) {
1735
1833
  {
1736
1834
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1751,7 +1849,8 @@ function getObjectDefaults(validator, rawSchema, {
1751
1849
  parentDefaults: (0, import_get12.default)(defaults, [key]),
1752
1850
  rawFormData: (0, import_get12.default)(formData, [key]),
1753
1851
  required: retrievedSchema.required?.includes(key),
1754
- shouldMergeDefaultsIntoFormData
1852
+ shouldMergeDefaultsIntoFormData,
1853
+ initialDefaultsGenerated
1755
1854
  });
1756
1855
  maybeAddDefaultToObject(
1757
1856
  acc,
@@ -1767,7 +1866,7 @@ function getObjectDefaults(validator, rawSchema, {
1767
1866
  },
1768
1867
  {}
1769
1868
  );
1770
- if (retrievedSchema.additionalProperties) {
1869
+ if (retrievedSchema.additionalProperties && !initialDefaultsGenerated) {
1771
1870
  const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties) ? retrievedSchema.additionalProperties : {};
1772
1871
  const keys2 = /* @__PURE__ */ new Set();
1773
1872
  if (isObject(defaults)) {
@@ -1788,7 +1887,8 @@ function getObjectDefaults(validator, rawSchema, {
1788
1887
  parentDefaults: (0, import_get12.default)(defaults, [key]),
1789
1888
  rawFormData: (0, import_get12.default)(formData, [key]),
1790
1889
  required: retrievedSchema.required?.includes(key),
1791
- shouldMergeDefaultsIntoFormData
1890
+ shouldMergeDefaultsIntoFormData,
1891
+ initialDefaultsGenerated
1792
1892
  });
1793
1893
  maybeAddDefaultToObject(
1794
1894
  objectDefaults,
@@ -1800,7 +1900,7 @@ function getObjectDefaults(validator, rawSchema, {
1800
1900
  );
1801
1901
  });
1802
1902
  }
1803
- return objectDefaults;
1903
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, objectDefaults);
1804
1904
  }
1805
1905
  }
1806
1906
  function getArrayDefaults(validator, rawSchema, {
@@ -1810,7 +1910,9 @@ function getArrayDefaults(validator, rawSchema, {
1810
1910
  experimental_defaultFormStateBehavior = void 0,
1811
1911
  experimental_customMergeAllOf = void 0,
1812
1912
  required,
1813
- shouldMergeDefaultsIntoFormData
1913
+ requiredAsRoot = false,
1914
+ shouldMergeDefaultsIntoFormData,
1915
+ initialDefaultsGenerated
1814
1916
  } = {}, defaults) {
1815
1917
  const schema = rawSchema;
1816
1918
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
@@ -1831,7 +1933,8 @@ function getArrayDefaults(validator, rawSchema, {
1831
1933
  experimental_customMergeAllOf,
1832
1934
  parentDefaults: item,
1833
1935
  required,
1834
- shouldMergeDefaultsIntoFormData
1936
+ shouldMergeDefaultsIntoFormData,
1937
+ initialDefaultsGenerated
1835
1938
  });
1836
1939
  });
1837
1940
  }
@@ -1849,7 +1952,8 @@ function getArrayDefaults(validator, rawSchema, {
1849
1952
  rawFormData: item,
1850
1953
  parentDefaults: (0, import_get12.default)(defaults, [idx]),
1851
1954
  required,
1852
- shouldMergeDefaultsIntoFormData
1955
+ shouldMergeDefaultsIntoFormData,
1956
+ initialDefaultsGenerated
1853
1957
  });
1854
1958
  });
1855
1959
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
@@ -1865,25 +1969,29 @@ function getArrayDefaults(validator, rawSchema, {
1865
1969
  return defaults ? defaults : void 0;
1866
1970
  }
1867
1971
  }
1972
+ let arrayDefault;
1868
1973
  const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1869
1974
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
1870
- return defaults ? defaults : emptyDefault;
1871
- }
1872
- const defaultEntries = defaults || [];
1873
- const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1874
- const fillerDefault = fillerSchema.default;
1875
- const fillerEntries = new Array(schema.minItems - defaultsLength).fill(
1876
- computeDefaults(validator, fillerSchema, {
1877
- parentDefaults: fillerDefault,
1878
- rootSchema,
1879
- _recurseList,
1880
- experimental_defaultFormStateBehavior,
1881
- experimental_customMergeAllOf,
1882
- required,
1883
- shouldMergeDefaultsIntoFormData
1884
- })
1885
- );
1886
- return defaultEntries.concat(fillerEntries);
1975
+ arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
1976
+ } else {
1977
+ const defaultEntries = defaults || [];
1978
+ const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1979
+ const fillerDefault = fillerSchema.default;
1980
+ const fillerEntries = Array.from(
1981
+ { length: schema.minItems - defaultsLength },
1982
+ () => computeDefaults(validator, fillerSchema, {
1983
+ parentDefaults: fillerDefault,
1984
+ rootSchema,
1985
+ _recurseList,
1986
+ experimental_defaultFormStateBehavior,
1987
+ experimental_customMergeAllOf,
1988
+ required,
1989
+ shouldMergeDefaultsIntoFormData
1990
+ })
1991
+ );
1992
+ arrayDefault = defaultEntries.concat(fillerEntries);
1993
+ }
1994
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, arrayDefault);
1887
1995
  }
1888
1996
  function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps = {}, defaults) {
1889
1997
  switch (getSchemaType(rawSchema)) {
@@ -1896,7 +2004,7 @@ function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps
1896
2004
  }
1897
2005
  }
1898
2006
  }
1899
- function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2007
+ function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf, initialDefaultsGenerated) {
1900
2008
  if (!isObject(theSchema)) {
1901
2009
  throw new Error("Invalid schema: " + theSchema);
1902
2010
  }
@@ -1907,8 +2015,16 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
1907
2015
  experimental_defaultFormStateBehavior,
1908
2016
  experimental_customMergeAllOf,
1909
2017
  rawFormData: formData,
1910
- shouldMergeDefaultsIntoFormData: true
2018
+ shouldMergeDefaultsIntoFormData: true,
2019
+ initialDefaultsGenerated,
2020
+ requiredAsRoot: true
1911
2021
  });
2022
+ if (schema.type !== "object" && isObject(schema.default)) {
2023
+ return {
2024
+ ...defaults,
2025
+ ...formData
2026
+ };
2027
+ }
1912
2028
  if (isObject(formData) || Array.isArray(formData)) {
1913
2029
  const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
1914
2030
  const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
@@ -1965,10 +2081,10 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
1965
2081
  if (schemaType === "object") {
1966
2082
  displayLabel = false;
1967
2083
  }
1968
- if (schemaType === "boolean" && !uiSchema[UI_WIDGET_KEY]) {
2084
+ if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
1969
2085
  displayLabel = false;
1970
2086
  }
1971
- if (uiSchema[UI_FIELD_KEY]) {
2087
+ if (uiSchema && uiSchema[UI_FIELD_KEY]) {
1972
2088
  displayLabel = false;
1973
2089
  }
1974
2090
  return displayLabel;
@@ -2107,80 +2223,8 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
2107
2223
  return newFormData;
2108
2224
  }
2109
2225
 
2110
- // src/schema/toIdSchema.ts
2111
- var import_get14 = __toESM(require("lodash/get"), 1);
2112
- function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
2113
- const $id = id || idPrefix;
2114
- const idSchema = { $id };
2115
- if (typeof schema === "object") {
2116
- if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
2117
- const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
2118
- const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
2119
- if (sameSchemaIndex === -1) {
2120
- return toIdSchemaInternal(
2121
- validator,
2122
- _schema,
2123
- idPrefix,
2124
- idSeparator,
2125
- id,
2126
- rootSchema,
2127
- formData,
2128
- _recurseList.concat(_schema),
2129
- experimental_customMergeAllOf
2130
- );
2131
- }
2132
- }
2133
- if (ITEMS_KEY in schema && !(0, import_get14.default)(schema, [ITEMS_KEY, REF_KEY])) {
2134
- return toIdSchemaInternal(
2135
- validator,
2136
- (0, import_get14.default)(schema, ITEMS_KEY),
2137
- idPrefix,
2138
- idSeparator,
2139
- id,
2140
- rootSchema,
2141
- formData,
2142
- _recurseList,
2143
- experimental_customMergeAllOf
2144
- );
2145
- }
2146
- if (getSchemaType(schema) === "object" && PROPERTIES_KEY in schema) {
2147
- for (const name in schema.properties) {
2148
- const field = schema[PROPERTIES_KEY][name];
2149
- const fieldId = idSchema[ID_KEY] + idSeparator + name;
2150
- idSchema[name] = toIdSchemaInternal(
2151
- validator,
2152
- field,
2153
- idPrefix,
2154
- idSeparator,
2155
- fieldId,
2156
- rootSchema,
2157
- // It's possible that formData is not an object -- this can happen if an
2158
- // array item has just been added, but not populated with data yet
2159
- (0, import_get14.default)(formData, [name]),
2160
- _recurseList,
2161
- experimental_customMergeAllOf
2162
- );
2163
- }
2164
- }
2165
- }
2166
- return idSchema;
2167
- }
2168
- function toIdSchema(validator, schema, id, rootSchema, formData, idPrefix = "root", idSeparator = "_", experimental_customMergeAllOf) {
2169
- return toIdSchemaInternal(
2170
- validator,
2171
- schema,
2172
- idPrefix,
2173
- idSeparator,
2174
- id,
2175
- rootSchema,
2176
- formData,
2177
- void 0,
2178
- experimental_customMergeAllOf
2179
- );
2180
- }
2181
-
2182
2226
  // src/schema/toPathSchema.ts
2183
- var import_get15 = __toESM(require("lodash/get"), 1);
2227
+ var import_get14 = __toESM(require("lodash/get"), 1);
2184
2228
  var import_set2 = __toESM(require("lodash/set"), 1);
2185
2229
  function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
2186
2230
  if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
@@ -2273,7 +2317,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2273
2317
  }
2274
2318
  } else if (PROPERTIES_KEY in schema) {
2275
2319
  for (const property in schema.properties) {
2276
- const field = (0, import_get15.default)(schema, [PROPERTIES_KEY, property], {});
2320
+ const field = (0, import_get14.default)(schema, [PROPERTIES_KEY, property], {});
2277
2321
  pathSchema[property] = toPathSchemaInternal(
2278
2322
  validator,
2279
2323
  field,
@@ -2281,7 +2325,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2281
2325
  rootSchema,
2282
2326
  // It's possible that formData is not an object -- this can happen if an
2283
2327
  // array item has just been added, but not populated with data yet
2284
- (0, import_get15.default)(formData, [property]),
2328
+ (0, import_get14.default)(formData, [property]),
2285
2329
  _recurseList,
2286
2330
  experimental_customMergeAllOf
2287
2331
  );
@@ -2294,6 +2338,7 @@ function toPathSchema(validator, schema, name = "", rootSchema, formData, experi
2294
2338
  }
2295
2339
 
2296
2340
  // src/createSchemaUtils.ts
2341
+ var import_get15 = __toESM(require("lodash/get"), 1);
2297
2342
  var SchemaUtils = class {
2298
2343
  /** Constructs the `SchemaUtils` instance with the given `validator` and `rootSchema` stored as instance variables
2299
2344
  *
@@ -2303,11 +2348,22 @@ var SchemaUtils = class {
2303
2348
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2304
2349
  */
2305
2350
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2306
- this.rootSchema = rootSchema;
2351
+ if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2352
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, (0, import_get15.default)(rootSchema, ID_KEY, "#"));
2353
+ } else {
2354
+ this.rootSchema = rootSchema;
2355
+ }
2307
2356
  this.validator = validator;
2308
2357
  this.experimental_defaultFormStateBehavior = experimental_defaultFormStateBehavior;
2309
2358
  this.experimental_customMergeAllOf = experimental_customMergeAllOf;
2310
2359
  }
2360
+ /** Returns the `rootSchema` in the `SchemaUtilsType`
2361
+ *
2362
+ * @returns - The `rootSchema`
2363
+ */
2364
+ getRootSchema() {
2365
+ return this.rootSchema;
2366
+ }
2311
2367
  /** Returns the `ValidatorType` in the `SchemaUtilsType`
2312
2368
  *
2313
2369
  * @returns - The `ValidatorType`
@@ -2380,9 +2436,10 @@ var SchemaUtils = class {
2380
2436
  * @param [includeUndefinedValues=false] - Optional flag, if true, cause undefined values to be added as defaults.
2381
2437
  * If "excludeObjectChildren", pass `includeUndefinedValues` as false when computing defaults for any nested
2382
2438
  * object properties.
2439
+ * @param initialDefaultsGenerated - Indicates whether or not initial defaults have been generated
2383
2440
  * @returns - The resulting `formData` with all the defaults provided
2384
2441
  */
2385
- getDefaultFormState(schema, formData, includeUndefinedValues = false) {
2442
+ getDefaultFormState(schema, formData, includeUndefinedValues = false, initialDefaultsGenerated) {
2386
2443
  return getDefaultFormState(
2387
2444
  this.validator,
2388
2445
  schema,
@@ -2390,7 +2447,8 @@ var SchemaUtils = class {
2390
2447
  this.rootSchema,
2391
2448
  includeUndefinedValues,
2392
2449
  this.experimental_defaultFormStateBehavior,
2393
- this.experimental_customMergeAllOf
2450
+ this.experimental_customMergeAllOf,
2451
+ initialDefaultsGenerated
2394
2452
  );
2395
2453
  }
2396
2454
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
@@ -2489,15 +2547,17 @@ var SchemaUtils = class {
2489
2547
  *
2490
2548
  * @param schema - The schema for which retrieving a schema is desired
2491
2549
  * @param [rawFormData] - The current formData, if any, to assist retrieving a schema
2550
+ * @param [resolveAnyOfOrOneOfRefs] - Optional flag indicating whether to resolved refs in anyOf/oneOf lists
2492
2551
  * @returns - The schema having its conditions, additional properties, references and dependencies resolved
2493
2552
  */
2494
- retrieveSchema(schema, rawFormData) {
2553
+ retrieveSchema(schema, rawFormData, resolveAnyOfOrOneOfRefs) {
2495
2554
  return retrieveSchema(
2496
2555
  this.validator,
2497
2556
  schema,
2498
2557
  this.rootSchema,
2499
2558
  rawFormData,
2500
- this.experimental_customMergeAllOf
2559
+ this.experimental_customMergeAllOf,
2560
+ resolveAnyOfOrOneOfRefs
2501
2561
  );
2502
2562
  }
2503
2563
  /** Sanitize the `data` associated with the `oldSchema` so it is considered appropriate for the `newSchema`. If the
@@ -2521,27 +2581,6 @@ var SchemaUtils = class {
2521
2581
  this.experimental_customMergeAllOf
2522
2582
  );
2523
2583
  }
2524
- /** Generates an `IdSchema` object for the `schema`, recursively
2525
- *
2526
- * @param schema - The schema for which the display label flag is desired
2527
- * @param [id] - The base id for the schema
2528
- * @param [formData] - The current formData, if any, onto which to provide any missing defaults
2529
- * @param [idPrefix='root'] - The prefix to use for the id
2530
- * @param [idSeparator='_'] - The separator to use for the path segments in the id
2531
- * @returns - The `IdSchema` object for the `schema`
2532
- */
2533
- toIdSchema(schema, id, formData, idPrefix = "root", idSeparator = "_") {
2534
- return toIdSchema(
2535
- this.validator,
2536
- schema,
2537
- id,
2538
- this.rootSchema,
2539
- formData,
2540
- idPrefix,
2541
- idSeparator,
2542
- this.experimental_customMergeAllOf
2543
- );
2544
- }
2545
2584
  /** Generates an `PathSchema` object for the `schema`, recursively
2546
2585
  *
2547
2586
  * @param schema - The schema for which the display label flag is desired
@@ -2627,6 +2666,31 @@ function dateRangeOptions(start, stop) {
2627
2666
  return options;
2628
2667
  }
2629
2668
 
2669
+ // src/shallowEquals.ts
2670
+ function shallowEquals(a, b) {
2671
+ if (Object.is(a, b)) {
2672
+ return true;
2673
+ }
2674
+ if (a == null || b == null) {
2675
+ return false;
2676
+ }
2677
+ if (typeof a !== "object" || typeof b !== "object") {
2678
+ return false;
2679
+ }
2680
+ const keysA = Object.keys(a);
2681
+ const keysB = Object.keys(b);
2682
+ if (keysA.length !== keysB.length) {
2683
+ return false;
2684
+ }
2685
+ for (let i = 0; i < keysA.length; i++) {
2686
+ const key = keysA[i];
2687
+ if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {
2688
+ return false;
2689
+ }
2690
+ }
2691
+ return true;
2692
+ }
2693
+
2630
2694
  // src/replaceStringParameters.ts
2631
2695
  function replaceStringParameters(inputString, params) {
2632
2696
  let output = inputString;
@@ -2794,6 +2858,29 @@ var ErrorSchemaBuilder = class {
2794
2858
  }
2795
2859
  };
2796
2860
 
2861
+ // src/getChangedFields.ts
2862
+ var import_keys = __toESM(require("lodash/keys"), 1);
2863
+ var import_pickBy = __toESM(require("lodash/pickBy"), 1);
2864
+ var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
2865
+ var import_get17 = __toESM(require("lodash/get"), 1);
2866
+ var import_difference = __toESM(require("lodash/difference"), 1);
2867
+ function getChangedFields(a, b) {
2868
+ const aIsPlainObject = (0, import_isPlainObject2.default)(a);
2869
+ const bIsPlainObject = (0, import_isPlainObject2.default)(b);
2870
+ if (a === b || !aIsPlainObject && !bIsPlainObject) {
2871
+ return [];
2872
+ }
2873
+ if (aIsPlainObject && !bIsPlainObject) {
2874
+ return (0, import_keys.default)(a);
2875
+ } else if (!aIsPlainObject && bIsPlainObject) {
2876
+ return (0, import_keys.default)(b);
2877
+ } else {
2878
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get17.default)(b, key))));
2879
+ const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
2880
+ return [...unequalFields, ...diffFields];
2881
+ }
2882
+ }
2883
+
2797
2884
  // src/getDateElementProps.ts
2798
2885
  function getDateElementProps(date, time, yearRange = [1900, (/* @__PURE__ */ new Date()).getFullYear() + 2], format = "YMD") {
2799
2886
  const { day, month, year, hour, minute, second } = date;
@@ -2902,10 +2989,10 @@ function getTemplate(name, registry, uiOptions = {}) {
2902
2989
  }
2903
2990
 
2904
2991
  // src/getTestIds.ts
2905
- var import_nanoid = require("nanoid");
2906
- var import_get17 = __toESM(require("lodash/get"), 1);
2992
+ var import_get18 = __toESM(require("lodash/get"), 1);
2993
+ var import_uniqueId = __toESM(require("lodash/uniqueId"), 1);
2907
2994
  function getTestIds() {
2908
- if (typeof process === "undefined" || (0, import_get17.default)(process, "env.NODE_ENV") !== "test") {
2995
+ if (typeof process === "undefined" || (0, import_get18.default)(process, "env.NODE_ENV") !== "test") {
2909
2996
  return {};
2910
2997
  }
2911
2998
  const ids = /* @__PURE__ */ new Map();
@@ -2914,7 +3001,7 @@ function getTestIds() {
2914
3001
  {
2915
3002
  get(_obj, prop) {
2916
3003
  if (!ids.has(prop)) {
2917
- ids.set(prop, (0, import_nanoid.nanoid)());
3004
+ ids.set(prop, (0, import_uniqueId.default)("test-id-"));
2918
3005
  }
2919
3006
  return ids.get(prop);
2920
3007
  }
@@ -2925,7 +3012,7 @@ function getTestIds() {
2925
3012
  // src/getWidget.tsx
2926
3013
  var import_react = require("react");
2927
3014
  var import_react_is = __toESM(require("react-is"), 1);
2928
- var import_get18 = __toESM(require("lodash/get"), 1);
3015
+ var import_get19 = __toESM(require("lodash/get"), 1);
2929
3016
  var import_set4 = __toESM(require("lodash/set"), 1);
2930
3017
  var import_jsx_runtime = require("react/jsx-runtime");
2931
3018
  var widgetMap = {
@@ -2981,7 +3068,7 @@ var widgetMap = {
2981
3068
  }
2982
3069
  };
2983
3070
  function mergeWidgetOptions(AWidget) {
2984
- let MergedWidget = (0, import_get18.default)(AWidget, "MergedWidget");
3071
+ let MergedWidget = (0, import_get19.default)(AWidget, "MergedWidget");
2985
3072
  if (!MergedWidget) {
2986
3073
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
2987
3074
  MergedWidget = ({ options, ...props }) => {
@@ -2997,7 +3084,7 @@ function getWidget(schema, widget, registeredWidgets = {}) {
2997
3084
  return mergeWidgetOptions(widget);
2998
3085
  }
2999
3086
  if (typeof widget !== "string") {
3000
- throw new Error(`Unsupported widget definition: ${typeof widget}`);
3087
+ throw new Error(`Unsupported widget definition: ${typeof widget} in schema: ${JSON.stringify(schema)}`);
3001
3088
  }
3002
3089
  if (widget in registeredWidgets) {
3003
3090
  const registeredWidget = registeredWidgets[widget];
@@ -3005,14 +3092,14 @@ function getWidget(schema, widget, registeredWidgets = {}) {
3005
3092
  }
3006
3093
  if (typeof type === "string") {
3007
3094
  if (!(type in widgetMap)) {
3008
- throw new Error(`No widget for type '${type}'`);
3095
+ throw new Error(`No widget for type '${type}' in schema: ${JSON.stringify(schema)}`);
3009
3096
  }
3010
3097
  if (widget in widgetMap[type]) {
3011
3098
  const registeredWidget = registeredWidgets[widgetMap[type][widget]];
3012
3099
  return getWidget(schema, registeredWidget, registeredWidgets);
3013
3100
  }
3014
3101
  }
3015
- throw new Error(`No widget '${widget}' for type '${type}'`);
3102
+ throw new Error(`No widget '${widget}' for type '${type}' in schema: ${JSON.stringify(schema)}`);
3016
3103
  }
3017
3104
 
3018
3105
  // src/hashForSchema.ts
@@ -3082,6 +3169,31 @@ function optionId(id, optionIndex) {
3082
3169
  function buttonId(id, btn) {
3083
3170
  return idGenerator(id, btn);
3084
3171
  }
3172
+ function optionalControlsId(id, element) {
3173
+ return idGenerator(id, `optional${element}`);
3174
+ }
3175
+
3176
+ // src/isFormDataAvailable.ts
3177
+ var import_isNil3 = __toESM(require("lodash/isNil"), 1);
3178
+ var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
3179
+ var import_isObject11 = __toESM(require("lodash/isObject"), 1);
3180
+ function isFormDataAvailable(formData) {
3181
+ return !(0, import_isNil3.default)(formData) && (!(0, import_isObject11.default)(formData) || Array.isArray(formData) || !(0, import_isEmpty5.default)(formData));
3182
+ }
3183
+
3184
+ // src/isRootSchema.ts
3185
+ var import_isEqual2 = __toESM(require("lodash/isEqual"), 1);
3186
+ function isRootSchema(registry, schemaToCompare) {
3187
+ const { rootSchema, schemaUtils } = registry;
3188
+ if ((0, import_isEqual2.default)(schemaToCompare, rootSchema)) {
3189
+ return true;
3190
+ }
3191
+ if (REF_KEY in rootSchema) {
3192
+ const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
3193
+ return (0, import_isEqual2.default)(schemaToCompare, resolvedSchema);
3194
+ }
3195
+ return false;
3196
+ }
3085
3197
 
3086
3198
  // src/labelValue.ts
3087
3199
  function labelValue(label, hideLabel, fallback) {
@@ -3094,14 +3206,14 @@ function localToUTC(dateString) {
3094
3206
  }
3095
3207
 
3096
3208
  // src/lookupFromFormContext.ts
3097
- var import_get19 = __toESM(require("lodash/get"), 1);
3209
+ var import_get20 = __toESM(require("lodash/get"), 1);
3098
3210
  var import_has6 = __toESM(require("lodash/has"), 1);
3099
3211
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3100
3212
  const lookupPath = [LOOKUP_MAP_NAME];
3101
3213
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3102
3214
  lookupPath.unshift(FORM_CONTEXT_NAME);
3103
3215
  }
3104
- return (0, import_get19.default)(regOrFc, [...lookupPath, toLookup], fallback);
3216
+ return (0, import_get20.default)(regOrFc, [...lookupPath, toLookup], fallback);
3105
3217
  }
3106
3218
 
3107
3219
  // src/orderProperties.ts
@@ -3182,11 +3294,40 @@ function schemaRequiresTrueValue(schema) {
3182
3294
  }
3183
3295
 
3184
3296
  // src/shouldRender.ts
3185
- function shouldRender(component, nextProps, nextState) {
3297
+ function shouldRender(component, nextProps, nextState, updateStrategy = "customDeep") {
3298
+ if (updateStrategy === "always") {
3299
+ return true;
3300
+ }
3301
+ if (updateStrategy === "shallow") {
3302
+ const { props: props2, state: state2 } = component;
3303
+ return !shallowEquals(props2, nextProps) || !shallowEquals(state2, nextState);
3304
+ }
3186
3305
  const { props, state } = component;
3187
3306
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3188
3307
  }
3189
3308
 
3309
+ // src/shouldRenderOptionalField.ts
3310
+ var import_isObject12 = __toESM(require("lodash/isObject"), 1);
3311
+ var import_uniq2 = __toESM(require("lodash/uniq"), 1);
3312
+ function getSchemaTypesForXxxOf(schemas) {
3313
+ const allTypes = (0, import_uniq2.default)(
3314
+ schemas.map((s) => (0, import_isObject12.default)(s) ? getSchemaType(s) : void 0).flat().filter((t) => t !== void 0)
3315
+ );
3316
+ return allTypes.length === 1 ? allTypes[0] : allTypes;
3317
+ }
3318
+ function shouldRenderOptionalField(registry, schema, required, uiSchema) {
3319
+ const { enableOptionalDataFieldForType = [] } = getUiOptions(uiSchema, registry.globalUiOptions);
3320
+ let schemaType;
3321
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
3322
+ schemaType = getSchemaTypesForXxxOf(schema[ANY_OF_KEY]);
3323
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
3324
+ schemaType = getSchemaTypesForXxxOf(schema[ONE_OF_KEY]);
3325
+ } else {
3326
+ schemaType = getSchemaType(schema);
3327
+ }
3328
+ return !isRootSchema(registry, schema) && !required && !!schemaType && !Array.isArray(schemaType) && !!enableOptionalDataFieldForType.find((val) => val === schemaType);
3329
+ }
3330
+
3190
3331
  // src/toDateString.ts
3191
3332
  function toDateString(dateObject, time = true) {
3192
3333
  const { year, month, day, hour = 0, minute = 0, second = 0 } = dateObject;
@@ -3196,7 +3337,7 @@ function toDateString(dateObject, time = true) {
3196
3337
  }
3197
3338
 
3198
3339
  // src/toErrorList.ts
3199
- var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
3340
+ var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"), 1);
3200
3341
  function toErrorList(errorSchema, fieldPath = []) {
3201
3342
  if (!errorSchema) {
3202
3343
  return [];
@@ -3217,7 +3358,7 @@ function toErrorList(errorSchema, fieldPath = []) {
3217
3358
  return Object.keys(errorSchema).reduce((acc, key) => {
3218
3359
  if (key !== ERRORS_KEY) {
3219
3360
  const childSchema = errorSchema[key];
3220
- if ((0, import_isPlainObject2.default)(childSchema)) {
3361
+ if ((0, import_isPlainObject3.default)(childSchema)) {
3221
3362
  acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
3222
3363
  }
3223
3364
  }
@@ -3244,15 +3385,28 @@ function toErrorSchema(errors) {
3244
3385
  return builder.ErrorSchema;
3245
3386
  }
3246
3387
 
3388
+ // src/toFieldPathId.ts
3389
+ function toFieldPathId(fieldPath, globalFormOptions, parentPath, isMultiValue) {
3390
+ const basePath = Array.isArray(parentPath) ? parentPath : parentPath?.path;
3391
+ const childPath = fieldPath === "" ? [] : [fieldPath];
3392
+ const path = basePath ? basePath.concat(...childPath) : childPath;
3393
+ const id = [globalFormOptions.idPrefix, ...path].join(globalFormOptions.idSeparator);
3394
+ let name;
3395
+ if (globalFormOptions.nameGenerator && path.length > 0) {
3396
+ name = globalFormOptions.nameGenerator(path, globalFormOptions.idPrefix, isMultiValue);
3397
+ }
3398
+ return { path, [ID_KEY]: id, ...name !== void 0 && { name } };
3399
+ }
3400
+
3247
3401
  // src/unwrapErrorHandler.ts
3248
- var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"), 1);
3402
+ var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3249
3403
  function unwrapErrorHandler(errorHandler) {
3250
3404
  return Object.keys(errorHandler).reduce((acc, key) => {
3251
3405
  if (key === "addError") {
3252
3406
  return acc;
3253
3407
  } else {
3254
3408
  const childSchema = errorHandler[key];
3255
- if ((0, import_isPlainObject3.default)(childSchema)) {
3409
+ if ((0, import_isPlainObject4.default)(childSchema)) {
3256
3410
  return {
3257
3411
  ...acc,
3258
3412
  [key]: unwrapErrorHandler(childSchema)
@@ -3263,6 +3417,209 @@ function unwrapErrorHandler(errorHandler) {
3263
3417
  }, {});
3264
3418
  }
3265
3419
 
3420
+ // src/useAltDateWidgetProps.tsx
3421
+ var import_react2 = require("react");
3422
+ var import_jsx_runtime2 = require("react/jsx-runtime");
3423
+ function readyForChange(state) {
3424
+ return Object.values(state).every((value) => value !== -1);
3425
+ }
3426
+ function DateElement(props) {
3427
+ const {
3428
+ className = "form-control",
3429
+ type,
3430
+ range,
3431
+ value,
3432
+ select,
3433
+ rootId,
3434
+ name,
3435
+ disabled,
3436
+ readonly,
3437
+ autofocus,
3438
+ registry,
3439
+ onBlur,
3440
+ onFocus
3441
+ } = props;
3442
+ const id = `${rootId}_${type}`;
3443
+ const { SelectWidget } = registry.widgets;
3444
+ const onChange = (0, import_react2.useCallback)((value2) => select(type, value2), [select, type]);
3445
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
3446
+ SelectWidget,
3447
+ {
3448
+ schema: { type: "integer" },
3449
+ id,
3450
+ name,
3451
+ className,
3452
+ options: { enumOptions: dateRangeOptions(range[0], range[1]) },
3453
+ placeholder: type,
3454
+ value,
3455
+ disabled,
3456
+ readonly,
3457
+ autofocus,
3458
+ onChange,
3459
+ onBlur,
3460
+ onFocus,
3461
+ registry,
3462
+ label: "",
3463
+ "aria-describedby": ariaDescribedByIds(rootId)
3464
+ }
3465
+ );
3466
+ }
3467
+ function useAltDateWidgetProps(props) {
3468
+ const { time = false, disabled = false, readonly = false, options, onChange, value } = props;
3469
+ const [state, setState] = (0, import_react2.useState)(parseDateString(value, time));
3470
+ (0, import_react2.useEffect)(() => {
3471
+ setState(parseDateString(value, time));
3472
+ }, [time, value]);
3473
+ const handleChange = (0, import_react2.useCallback)(
3474
+ (property, value2) => {
3475
+ const nextState = {
3476
+ ...state,
3477
+ [property]: typeof value2 === "undefined" ? -1 : value2
3478
+ };
3479
+ if (readyForChange(nextState)) {
3480
+ onChange(toDateString(nextState, time));
3481
+ } else {
3482
+ setState(nextState);
3483
+ }
3484
+ },
3485
+ [state, onChange, time]
3486
+ );
3487
+ const handleClear = (0, import_react2.useCallback)(
3488
+ (event) => {
3489
+ event.preventDefault();
3490
+ if (disabled || readonly) {
3491
+ return;
3492
+ }
3493
+ onChange(void 0);
3494
+ },
3495
+ [disabled, readonly, onChange]
3496
+ );
3497
+ const handleSetNow = (0, import_react2.useCallback)(
3498
+ (event) => {
3499
+ event.preventDefault();
3500
+ if (disabled || readonly) {
3501
+ return;
3502
+ }
3503
+ const nextState = parseDateString((/* @__PURE__ */ new Date()).toJSON(), time);
3504
+ onChange(toDateString(nextState, time));
3505
+ },
3506
+ [disabled, readonly, time, onChange]
3507
+ );
3508
+ const elements = (0, import_react2.useMemo)(
3509
+ () => getDateElementProps(
3510
+ state,
3511
+ time,
3512
+ options.yearsRange,
3513
+ options.format
3514
+ ),
3515
+ [state, time, options.yearsRange, options.format]
3516
+ );
3517
+ return { elements, handleChange, handleClear, handleSetNow };
3518
+ }
3519
+
3520
+ // src/useDeepCompareMemo.ts
3521
+ var import_react3 = require("react");
3522
+ var import_isEqual3 = __toESM(require("lodash/isEqual"), 1);
3523
+ function useDeepCompareMemo(newValue) {
3524
+ const valueRef = (0, import_react3.useRef)(newValue);
3525
+ if (!(0, import_isEqual3.default)(newValue, valueRef.current)) {
3526
+ valueRef.current = newValue;
3527
+ }
3528
+ return valueRef.current;
3529
+ }
3530
+
3531
+ // src/useFileWidgetProps.ts
3532
+ var import_react4 = require("react");
3533
+ function addNameToDataURL(dataURL, name) {
3534
+ return dataURL.replace(";base64", `;name=${encodeURIComponent(name)};base64`);
3535
+ }
3536
+ function processFile(file) {
3537
+ const { name, size, type } = file;
3538
+ return new Promise((resolve, reject) => {
3539
+ const reader = new window.FileReader();
3540
+ reader.onerror = reject;
3541
+ reader.onload = (event) => {
3542
+ if (typeof event.target?.result === "string") {
3543
+ resolve({
3544
+ dataURL: addNameToDataURL(event.target.result, name),
3545
+ name,
3546
+ size,
3547
+ type
3548
+ });
3549
+ } else {
3550
+ resolve({
3551
+ dataURL: null,
3552
+ name,
3553
+ size,
3554
+ type
3555
+ });
3556
+ }
3557
+ };
3558
+ reader.readAsDataURL(file);
3559
+ });
3560
+ }
3561
+ function processFiles(files) {
3562
+ return Promise.all(Array.from(files).map(processFile));
3563
+ }
3564
+ function extractFileInfo(dataURLs) {
3565
+ return dataURLs.reduce((acc, dataURL) => {
3566
+ if (!dataURL) {
3567
+ return acc;
3568
+ }
3569
+ try {
3570
+ const { blob, name } = dataURItoBlob(dataURL);
3571
+ return [
3572
+ ...acc,
3573
+ {
3574
+ dataURL,
3575
+ name,
3576
+ size: blob.size,
3577
+ type: blob.type
3578
+ }
3579
+ ];
3580
+ } catch {
3581
+ return acc;
3582
+ }
3583
+ }, []);
3584
+ }
3585
+ function useFileWidgetProps(value, onChange, multiple = false) {
3586
+ const values = (0, import_react4.useMemo)(() => {
3587
+ if (multiple && value) {
3588
+ return Array.isArray(value) ? value : [value];
3589
+ }
3590
+ return [];
3591
+ }, [value, multiple]);
3592
+ const filesInfo = (0, import_react4.useMemo)(
3593
+ () => Array.isArray(value) ? extractFileInfo(value) : extractFileInfo([value || ""]),
3594
+ [value]
3595
+ );
3596
+ const handleChange = (0, import_react4.useCallback)(
3597
+ (files) => {
3598
+ processFiles(files).then((filesInfoEvent) => {
3599
+ const newValue = filesInfoEvent.map((fileInfo) => fileInfo.dataURL || null);
3600
+ if (multiple) {
3601
+ onChange(values.concat(...newValue));
3602
+ } else {
3603
+ onChange(newValue[0]);
3604
+ }
3605
+ });
3606
+ },
3607
+ [values, multiple, onChange]
3608
+ );
3609
+ const handleRemove = (0, import_react4.useCallback)(
3610
+ (index) => {
3611
+ if (multiple) {
3612
+ const newValue = values.filter((_, i) => i !== index);
3613
+ onChange(newValue);
3614
+ } else {
3615
+ onChange(void 0);
3616
+ }
3617
+ },
3618
+ [values, multiple, onChange]
3619
+ );
3620
+ return { filesInfo, handleChange, handleRemove };
3621
+ }
3622
+
3266
3623
  // src/utcToLocal.ts
3267
3624
  function utcToLocal(jsonDate) {
3268
3625
  if (!jsonDate) {
@@ -3280,23 +3637,27 @@ function utcToLocal(jsonDate) {
3280
3637
  }
3281
3638
 
3282
3639
  // src/validationDataMerge.ts
3283
- var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
3284
- function validationDataMerge(validationData, additionalErrorSchema) {
3640
+ var import_isEmpty6 = __toESM(require("lodash/isEmpty"), 1);
3641
+ function validationDataMerge(validationData, additionalErrorSchema, preventDuplicates = false) {
3285
3642
  if (!additionalErrorSchema) {
3286
3643
  return validationData;
3287
3644
  }
3288
3645
  const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
3289
3646
  let errors = toErrorList(additionalErrorSchema);
3290
3647
  let errorSchema = additionalErrorSchema;
3291
- if (!(0, import_isEmpty5.default)(oldErrorSchema)) {
3292
- errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
3648
+ if (!(0, import_isEmpty6.default)(oldErrorSchema)) {
3649
+ errorSchema = mergeObjects(
3650
+ oldErrorSchema,
3651
+ additionalErrorSchema,
3652
+ preventDuplicates ? "preventDuplicates" : true
3653
+ );
3293
3654
  errors = [...oldErrors].concat(errors);
3294
3655
  }
3295
3656
  return { errorSchema, errors };
3296
3657
  }
3297
3658
 
3298
3659
  // src/withIdRefPrefix.ts
3299
- var import_isObject11 = __toESM(require("lodash/isObject"), 1);
3660
+ var import_isObject13 = __toESM(require("lodash/isObject"), 1);
3300
3661
  function withIdRefPrefixObject(node) {
3301
3662
  for (const key in node) {
3302
3663
  const realObj = node;
@@ -3319,34 +3680,31 @@ function withIdRefPrefix(schemaNode) {
3319
3680
  if (Array.isArray(schemaNode)) {
3320
3681
  return withIdRefPrefixArray([...schemaNode]);
3321
3682
  }
3322
- if ((0, import_isObject11.default)(schemaNode)) {
3683
+ if ((0, import_isObject13.default)(schemaNode)) {
3323
3684
  return withIdRefPrefixObject({ ...schemaNode });
3324
3685
  }
3325
3686
  return schemaNode;
3326
3687
  }
3327
3688
 
3328
- // src/getChangedFields.ts
3329
- var import_keys = __toESM(require("lodash/keys"), 1);
3330
- var import_pickBy = __toESM(require("lodash/pickBy"), 1);
3331
- var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3332
- var import_get20 = __toESM(require("lodash/get"), 1);
3333
- var import_difference = __toESM(require("lodash/difference"), 1);
3334
- function getChangedFields(a, b) {
3335
- const aIsPlainObject = (0, import_isPlainObject4.default)(a);
3336
- const bIsPlainObject = (0, import_isPlainObject4.default)(b);
3337
- if (a === b || !aIsPlainObject && !bIsPlainObject) {
3338
- return [];
3689
+ // src/nameGenerators.ts
3690
+ var bracketNameGenerator = (path, idPrefix, isMultiValue) => {
3691
+ if (!path || path.length === 0) {
3692
+ return idPrefix;
3339
3693
  }
3340
- if (aIsPlainObject && !bIsPlainObject) {
3341
- return (0, import_keys.default)(a);
3342
- } else if (!aIsPlainObject && bIsPlainObject) {
3343
- return (0, import_keys.default)(b);
3344
- } else {
3345
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get20.default)(b, key))));
3346
- const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3347
- return [...unequalFields, ...diffFields];
3694
+ const baseName = path.reduce((acc, pathUnit, index) => {
3695
+ if (index === 0) {
3696
+ return `${idPrefix}[${String(pathUnit)}]`;
3697
+ }
3698
+ return `${acc}[${String(pathUnit)}]`;
3699
+ }, "");
3700
+ return isMultiValue ? `${baseName}[]` : baseName;
3701
+ };
3702
+ var dotNotationNameGenerator = (path, idPrefix, _isMultiValue) => {
3703
+ if (!path || path.length === 0) {
3704
+ return idPrefix;
3348
3705
  }
3349
- }
3706
+ return `${idPrefix}.${path.map(String).join(".")}`;
3707
+ };
3350
3708
 
3351
3709
  // src/enums.ts
3352
3710
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
@@ -3370,6 +3728,11 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3370
3728
  TranslatableString2["PreviewLabel"] = "Preview";
3371
3729
  TranslatableString2["DecrementAriaLabel"] = "Decrease value by 1";
3372
3730
  TranslatableString2["IncrementAriaLabel"] = "Increase value by 1";
3731
+ TranslatableString2["OptionalObjectAdd"] = "Add data for optional field";
3732
+ TranslatableString2["OptionalObjectRemove"] = "Remove data for optional field";
3733
+ TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
3734
+ TranslatableString2["Type"] = "Type";
3735
+ TranslatableString2["Value"] = "Value";
3373
3736
  TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
3374
3737
  TranslatableString2["OptionPrefix"] = "Option %1";
3375
3738
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
@@ -3503,4 +3866,4 @@ function schemaParser(rootSchema) {
3503
3866
  parseSchema(validator, recurseList, rootSchema, rootSchema);
3504
3867
  return validator.getSchemaMap();
3505
3868
  }
3506
- //# sourceMappingURL=index.js.map
3869
+ //# sourceMappingURL=index.cjs.map