@rjsf/utils 6.0.0-beta.20 → 6.0.0-beta.22

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 (63) hide show
  1. package/dist/index.cjs +202 -68
  2. package/dist/index.cjs.map +4 -4
  3. package/dist/utils.esm.js +202 -68
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +175 -57
  6. package/lib/ErrorSchemaBuilder.d.ts +2 -2
  7. package/lib/createSchemaUtils.js +6 -4
  8. package/lib/createSchemaUtils.js.map +1 -1
  9. package/lib/enums.d.ts +6 -0
  10. package/lib/enums.js +6 -0
  11. package/lib/enums.js.map +1 -1
  12. package/lib/guessType.d.ts +1 -1
  13. package/lib/idGenerators.d.ts +8 -1
  14. package/lib/idGenerators.js +10 -1
  15. package/lib/idGenerators.js.map +1 -1
  16. package/lib/index.d.ts +9 -4
  17. package/lib/index.js +9 -4
  18. package/lib/index.js.map +1 -1
  19. package/lib/isFormDataAvailable.d.ts +7 -0
  20. package/lib/isFormDataAvailable.js +13 -0
  21. package/lib/isFormDataAvailable.js.map +1 -0
  22. package/lib/isRootSchema.d.ts +13 -0
  23. package/lib/isRootSchema.js +25 -0
  24. package/lib/isRootSchema.js.map +1 -0
  25. package/lib/nameGenerators.d.ts +13 -0
  26. package/lib/nameGenerators.js +30 -0
  27. package/lib/nameGenerators.js.map +1 -0
  28. package/lib/schema/getDefaultFormState.d.ts +8 -3
  29. package/lib/schema/getDefaultFormState.js +15 -6
  30. package/lib/schema/getDefaultFormState.js.map +1 -1
  31. package/lib/schema/retrieveSchema.d.ts +10 -5
  32. package/lib/schema/retrieveSchema.js +37 -14
  33. package/lib/schema/retrieveSchema.js.map +1 -1
  34. package/lib/shouldRenderOptionalField.d.ts +18 -0
  35. package/lib/shouldRenderOptionalField.js +47 -0
  36. package/lib/shouldRenderOptionalField.js.map +1 -0
  37. package/lib/toFieldPathId.d.ts +4 -2
  38. package/lib/toFieldPathId.js +10 -3
  39. package/lib/toFieldPathId.js.map +1 -1
  40. package/lib/tsconfig.tsbuildinfo +1 -1
  41. package/lib/types.d.ts +87 -43
  42. package/lib/useDeepCompareMemo.d.ts +8 -0
  43. package/lib/useDeepCompareMemo.js +17 -0
  44. package/lib/useDeepCompareMemo.js.map +1 -0
  45. package/lib/validationDataMerge.d.ts +2 -1
  46. package/lib/validationDataMerge.js +3 -2
  47. package/lib/validationDataMerge.js.map +1 -1
  48. package/package.json +1 -1
  49. package/src/ErrorSchemaBuilder.ts +2 -2
  50. package/src/createSchemaUtils.ts +6 -1
  51. package/src/enums.ts +6 -0
  52. package/src/idGenerators.ts +11 -1
  53. package/src/index.ts +15 -2
  54. package/src/isFormDataAvailable.ts +13 -0
  55. package/src/isRootSchema.ts +30 -0
  56. package/src/nameGenerators.ts +43 -0
  57. package/src/schema/getDefaultFormState.ts +20 -2
  58. package/src/schema/retrieveSchema.ts +39 -5
  59. package/src/shouldRenderOptionalField.ts +56 -0
  60. package/src/toFieldPathId.ts +12 -2
  61. package/src/types.ts +100 -47
  62. package/src/useDeepCompareMemo.ts +17 -0
  63. package/src/validationDataMerge.ts +7 -1
package/dist/index.cjs CHANGED
@@ -71,6 +71,7 @@ __export(index_exports, {
71
71
  allowAdditionalItems: () => allowAdditionalItems,
72
72
  ariaDescribedByIds: () => ariaDescribedByIds,
73
73
  asNumber: () => asNumber,
74
+ bracketNameGenerator: () => bracketNameGenerator,
74
75
  buttonId: () => buttonId,
75
76
  canExpand: () => canExpand,
76
77
  createErrorHandler: () => createErrorHandler,
@@ -79,6 +80,7 @@ __export(index_exports, {
79
80
  dateRangeOptions: () => dateRangeOptions,
80
81
  deepEquals: () => deepEquals,
81
82
  descriptionId: () => descriptionId,
83
+ dotNotationNameGenerator: () => dotNotationNameGenerator,
82
84
  englishStringTranslator: () => englishStringTranslator,
83
85
  enumOptionsDeselectValue: () => enumOptionsDeselectValue,
84
86
  enumOptionsIndexForValue: () => enumOptionsIndexForValue,
@@ -116,8 +118,10 @@ __export(index_exports, {
116
118
  isCustomWidget: () => isCustomWidget,
117
119
  isFilesArray: () => isFilesArray,
118
120
  isFixedItems: () => isFixedItems,
121
+ isFormDataAvailable: () => isFormDataAvailable,
119
122
  isMultiSelect: () => isMultiSelect,
120
123
  isObject: () => isObject,
124
+ isRootSchema: () => isRootSchema,
121
125
  isSelect: () => isSelect,
122
126
  labelValue: () => labelValue,
123
127
  localToUTC: () => localToUTC,
@@ -126,6 +130,7 @@ __export(index_exports, {
126
130
  mergeObjects: () => mergeObjects,
127
131
  mergeSchemas: () => mergeSchemas,
128
132
  optionId: () => optionId,
133
+ optionalControlsId: () => optionalControlsId,
129
134
  optionsList: () => optionsList,
130
135
  orderProperties: () => orderProperties,
131
136
  pad: () => pad,
@@ -138,6 +143,7 @@ __export(index_exports, {
138
143
  schemaRequiresTrueValue: () => schemaRequiresTrueValue,
139
144
  shallowEquals: () => shallowEquals,
140
145
  shouldRender: () => shouldRender,
146
+ shouldRenderOptionalField: () => shouldRenderOptionalField,
141
147
  sortedJSONStringify: () => sortedJSONStringify,
142
148
  titleId: () => titleId,
143
149
  toConstant: () => toConstant,
@@ -147,6 +153,7 @@ __export(index_exports, {
147
153
  toFieldPathId: () => toFieldPathId,
148
154
  toPathSchema: () => toPathSchema,
149
155
  unwrapErrorHandler: () => unwrapErrorHandler,
156
+ useDeepCompareMemo: () => useDeepCompareMemo,
150
157
  utcToLocal: () => utcToLocal,
151
158
  validationDataMerge: () => validationDataMerge,
152
159
  withIdRefPrefix: () => withIdRefPrefix
@@ -590,7 +597,7 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
590
597
 
591
598
  // src/schema/retrieveSchema.ts
592
599
  var import_isEmpty2 = __toESM(require("lodash/isEmpty"), 1);
593
- function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
600
+ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs = false) {
594
601
  return retrieveSchemaInternal(
595
602
  validator,
596
603
  schema,
@@ -598,7 +605,8 @@ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experim
598
605
  rawFormData,
599
606
  void 0,
600
607
  void 0,
601
- experimental_customMergeAllOf
608
+ experimental_customMergeAllOf,
609
+ resolveAnyOfOrOneOfRefs
602
610
  )[0];
603
611
  }
604
612
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
@@ -687,7 +695,7 @@ function getMatchingPatternProperties(schema, key) {
687
695
  {}
688
696
  );
689
697
  }
690
- function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
698
+ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
691
699
  const updatedSchemas = resolveReference(
692
700
  validator,
693
701
  schema,
@@ -695,7 +703,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
695
703
  expandAllBranches,
696
704
  recurseList,
697
705
  formData,
698
- experimental_customMergeAllOf
706
+ experimental_customMergeAllOf,
707
+ resolveAnyOfOrOneOfRefs
699
708
  );
700
709
  if (updatedSchemas.length > 1 || updatedSchemas[0] !== schema) {
701
710
  return updatedSchemas;
@@ -722,7 +731,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
722
731
  );
723
732
  });
724
733
  }
725
- if (ALL_OF_KEY in schema && Array.isArray(schema.allOf)) {
734
+ if (ALL_OF_KEY in schema && Array.isArray(schema[ALL_OF_KEY])) {
726
735
  const allOfSchemaElements = schema.allOf.map(
727
736
  (allOfSubschema) => retrieveSchemaInternal(
728
737
  validator,
@@ -742,8 +751,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
742
751
  }
743
752
  return [schema];
744
753
  }
745
- function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
746
- const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList);
754
+ function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
755
+ const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList, void 0, resolveAnyOfOrOneOfRefs);
747
756
  if (updatedSchema !== schema) {
748
757
  return retrieveSchemaInternal(
749
758
  validator,
@@ -752,12 +761,13 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
752
761
  formData,
753
762
  expandAllBranches,
754
763
  recurseList,
755
- experimental_customMergeAllOf
764
+ experimental_customMergeAllOf,
765
+ resolveAnyOfOrOneOfRefs
756
766
  );
757
767
  }
758
768
  return [schema];
759
769
  }
760
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
770
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
761
771
  if (!isObject(schema)) {
762
772
  return schema;
763
773
  }
@@ -780,7 +790,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
780
790
  resolvedSchema[PROPERTIES_KEY],
781
791
  (result, value, key) => {
782
792
  const childList = [...recurseList];
783
- result[key] = resolveAllReferences(value, rootSchema, childList, baseURI);
793
+ result[key] = resolveAllReferences(value, rootSchema, childList, baseURI, resolveAnyOfOrOneOfRefs);
784
794
  childrenLists.push(childList);
785
795
  },
786
796
  {}
@@ -791,9 +801,28 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
791
801
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
792
802
  resolvedSchema = {
793
803
  ...resolvedSchema,
794
- items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI)
804
+ items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
795
805
  };
796
806
  }
807
+ if (resolveAnyOfOrOneOfRefs) {
808
+ let key;
809
+ let schemas;
810
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
811
+ key = ANY_OF_KEY;
812
+ schemas = resolvedSchema[ANY_OF_KEY];
813
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
814
+ key = ONE_OF_KEY;
815
+ schemas = resolvedSchema[ONE_OF_KEY];
816
+ }
817
+ if (key && schemas) {
818
+ resolvedSchema = {
819
+ ...resolvedSchema,
820
+ [key]: schemas.map(
821
+ (s) => resolveAllReferences(s, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
822
+ )
823
+ };
824
+ }
825
+ }
797
826
  return deepEquals(schema, resolvedSchema) ? schema : resolvedSchema;
798
827
  }
799
828
  function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFormData, experimental_customMergeAllOf) {
@@ -821,7 +850,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
821
850
  }
822
851
  }
823
852
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema.additionalProperties !== false) {
824
- let additionalProperties = {};
853
+ let additionalProperties;
825
854
  if (typeof schema.additionalProperties !== "boolean") {
826
855
  if (REF_KEY in schema.additionalProperties) {
827
856
  additionalProperties = retrieveSchema(
@@ -853,7 +882,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
853
882
  });
854
883
  return schema;
855
884
  }
856
- function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf) {
885
+ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
857
886
  if (!isObject(schema)) {
858
887
  return [{}];
859
888
  }
@@ -864,7 +893,8 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
864
893
  expandAllBranches,
865
894
  recurseList,
866
895
  rawFormData,
867
- experimental_customMergeAllOf
896
+ experimental_customMergeAllOf,
897
+ resolveAnyOfOrOneOfRefs
868
898
  );
869
899
  return resolvedSchemas.flatMap((s) => {
870
900
  let resolvedSchema = s;
@@ -1635,7 +1665,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1635
1665
  experimental_defaultFormStateBehavior = void 0,
1636
1666
  experimental_customMergeAllOf = void 0,
1637
1667
  required,
1638
- shouldMergeDefaultsIntoFormData = false
1668
+ shouldMergeDefaultsIntoFormData = false,
1669
+ initialDefaultsGenerated
1639
1670
  } = computeDefaultsProps;
1640
1671
  let formData = isObject(rawFormData) ? rawFormData : {};
1641
1672
  const schema = isObject(rawSchema) ? rawSchema : {};
@@ -1740,7 +1771,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1740
1771
  parentDefaults: defaults,
1741
1772
  rawFormData: rawFormData ?? formData,
1742
1773
  required,
1743
- shouldMergeDefaultsIntoFormData
1774
+ shouldMergeDefaultsIntoFormData,
1775
+ initialDefaultsGenerated
1744
1776
  });
1745
1777
  }
1746
1778
  if (defaults === void 0) {
@@ -1792,7 +1824,8 @@ function getObjectDefaults(validator, rawSchema, {
1792
1824
  experimental_defaultFormStateBehavior = void 0,
1793
1825
  experimental_customMergeAllOf = void 0,
1794
1826
  required,
1795
- shouldMergeDefaultsIntoFormData
1827
+ shouldMergeDefaultsIntoFormData,
1828
+ initialDefaultsGenerated
1796
1829
  } = {}, defaults) {
1797
1830
  {
1798
1831
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1813,7 +1846,8 @@ function getObjectDefaults(validator, rawSchema, {
1813
1846
  parentDefaults: (0, import_get12.default)(defaults, [key]),
1814
1847
  rawFormData: (0, import_get12.default)(formData, [key]),
1815
1848
  required: retrievedSchema.required?.includes(key),
1816
- shouldMergeDefaultsIntoFormData
1849
+ shouldMergeDefaultsIntoFormData,
1850
+ initialDefaultsGenerated
1817
1851
  });
1818
1852
  maybeAddDefaultToObject(
1819
1853
  acc,
@@ -1829,7 +1863,7 @@ function getObjectDefaults(validator, rawSchema, {
1829
1863
  },
1830
1864
  {}
1831
1865
  );
1832
- if (retrievedSchema.additionalProperties) {
1866
+ if (retrievedSchema.additionalProperties && !initialDefaultsGenerated) {
1833
1867
  const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties) ? retrievedSchema.additionalProperties : {};
1834
1868
  const keys2 = /* @__PURE__ */ new Set();
1835
1869
  if (isObject(defaults)) {
@@ -1850,7 +1884,8 @@ function getObjectDefaults(validator, rawSchema, {
1850
1884
  parentDefaults: (0, import_get12.default)(defaults, [key]),
1851
1885
  rawFormData: (0, import_get12.default)(formData, [key]),
1852
1886
  required: retrievedSchema.required?.includes(key),
1853
- shouldMergeDefaultsIntoFormData
1887
+ shouldMergeDefaultsIntoFormData,
1888
+ initialDefaultsGenerated
1854
1889
  });
1855
1890
  maybeAddDefaultToObject(
1856
1891
  objectDefaults,
@@ -1872,7 +1907,9 @@ function getArrayDefaults(validator, rawSchema, {
1872
1907
  experimental_defaultFormStateBehavior = void 0,
1873
1908
  experimental_customMergeAllOf = void 0,
1874
1909
  required,
1875
- shouldMergeDefaultsIntoFormData
1910
+ requiredAsRoot = false,
1911
+ shouldMergeDefaultsIntoFormData,
1912
+ initialDefaultsGenerated
1876
1913
  } = {}, defaults) {
1877
1914
  const schema = rawSchema;
1878
1915
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
@@ -1893,7 +1930,8 @@ function getArrayDefaults(validator, rawSchema, {
1893
1930
  experimental_customMergeAllOf,
1894
1931
  parentDefaults: item,
1895
1932
  required,
1896
- shouldMergeDefaultsIntoFormData
1933
+ shouldMergeDefaultsIntoFormData,
1934
+ initialDefaultsGenerated
1897
1935
  });
1898
1936
  });
1899
1937
  }
@@ -1911,7 +1949,8 @@ function getArrayDefaults(validator, rawSchema, {
1911
1949
  rawFormData: item,
1912
1950
  parentDefaults: (0, import_get12.default)(defaults, [idx]),
1913
1951
  required,
1914
- shouldMergeDefaultsIntoFormData
1952
+ shouldMergeDefaultsIntoFormData,
1953
+ initialDefaultsGenerated
1915
1954
  });
1916
1955
  });
1917
1956
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
@@ -1930,7 +1969,7 @@ function getArrayDefaults(validator, rawSchema, {
1930
1969
  let arrayDefault;
1931
1970
  const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1932
1971
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
1933
- arrayDefault = defaults ? defaults : emptyDefault;
1972
+ arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
1934
1973
  } else {
1935
1974
  const defaultEntries = defaults || [];
1936
1975
  const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
@@ -1962,7 +2001,7 @@ function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps
1962
2001
  }
1963
2002
  }
1964
2003
  }
1965
- function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2004
+ function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf, initialDefaultsGenerated) {
1966
2005
  if (!isObject(theSchema)) {
1967
2006
  throw new Error("Invalid schema: " + theSchema);
1968
2007
  }
@@ -1973,7 +2012,9 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
1973
2012
  experimental_defaultFormStateBehavior,
1974
2013
  experimental_customMergeAllOf,
1975
2014
  rawFormData: formData,
1976
- shouldMergeDefaultsIntoFormData: true
2015
+ shouldMergeDefaultsIntoFormData: true,
2016
+ initialDefaultsGenerated,
2017
+ requiredAsRoot: true
1977
2018
  });
1978
2019
  if (schema.type !== "object" && isObject(schema.default)) {
1979
2020
  return {
@@ -2392,9 +2433,10 @@ var SchemaUtils = class {
2392
2433
  * @param [includeUndefinedValues=false] - Optional flag, if true, cause undefined values to be added as defaults.
2393
2434
  * If "excludeObjectChildren", pass `includeUndefinedValues` as false when computing defaults for any nested
2394
2435
  * object properties.
2436
+ * @param initialDefaultsGenerated - Indicates whether or not initial defaults have been generated
2395
2437
  * @returns - The resulting `formData` with all the defaults provided
2396
2438
  */
2397
- getDefaultFormState(schema, formData, includeUndefinedValues = false) {
2439
+ getDefaultFormState(schema, formData, includeUndefinedValues = false, initialDefaultsGenerated) {
2398
2440
  return getDefaultFormState(
2399
2441
  this.validator,
2400
2442
  schema,
@@ -2402,7 +2444,8 @@ var SchemaUtils = class {
2402
2444
  this.rootSchema,
2403
2445
  includeUndefinedValues,
2404
2446
  this.experimental_defaultFormStateBehavior,
2405
- this.experimental_customMergeAllOf
2447
+ this.experimental_customMergeAllOf,
2448
+ initialDefaultsGenerated
2406
2449
  );
2407
2450
  }
2408
2451
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
@@ -2501,15 +2544,17 @@ var SchemaUtils = class {
2501
2544
  *
2502
2545
  * @param schema - The schema for which retrieving a schema is desired
2503
2546
  * @param [rawFormData] - The current formData, if any, to assist retrieving a schema
2547
+ * @param [resolveAnyOfOrOneOfRefs] - Optional flag indicating whether to resolved refs in anyOf/oneOf lists
2504
2548
  * @returns - The schema having its conditions, additional properties, references and dependencies resolved
2505
2549
  */
2506
- retrieveSchema(schema, rawFormData) {
2550
+ retrieveSchema(schema, rawFormData, resolveAnyOfOrOneOfRefs) {
2507
2551
  return retrieveSchema(
2508
2552
  this.validator,
2509
2553
  schema,
2510
2554
  this.rootSchema,
2511
2555
  rawFormData,
2512
- this.experimental_customMergeAllOf
2556
+ this.experimental_customMergeAllOf,
2557
+ resolveAnyOfOrOneOfRefs
2513
2558
  );
2514
2559
  }
2515
2560
  /** Sanitize the `data` associated with the `oldSchema` so it is considered appropriate for the `newSchema`. If the
@@ -2810,6 +2855,29 @@ var ErrorSchemaBuilder = class {
2810
2855
  }
2811
2856
  };
2812
2857
 
2858
+ // src/getChangedFields.ts
2859
+ var import_keys = __toESM(require("lodash/keys"), 1);
2860
+ var import_pickBy = __toESM(require("lodash/pickBy"), 1);
2861
+ var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
2862
+ var import_get17 = __toESM(require("lodash/get"), 1);
2863
+ var import_difference = __toESM(require("lodash/difference"), 1);
2864
+ function getChangedFields(a, b) {
2865
+ const aIsPlainObject = (0, import_isPlainObject2.default)(a);
2866
+ const bIsPlainObject = (0, import_isPlainObject2.default)(b);
2867
+ if (a === b || !aIsPlainObject && !bIsPlainObject) {
2868
+ return [];
2869
+ }
2870
+ if (aIsPlainObject && !bIsPlainObject) {
2871
+ return (0, import_keys.default)(a);
2872
+ } else if (!aIsPlainObject && bIsPlainObject) {
2873
+ return (0, import_keys.default)(b);
2874
+ } else {
2875
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get17.default)(b, key))));
2876
+ const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
2877
+ return [...unequalFields, ...diffFields];
2878
+ }
2879
+ }
2880
+
2813
2881
  // src/getDateElementProps.ts
2814
2882
  function getDateElementProps(date, time, yearRange = [1900, (/* @__PURE__ */ new Date()).getFullYear() + 2], format = "YMD") {
2815
2883
  const { day, month, year, hour, minute, second } = date;
@@ -2918,10 +2986,10 @@ function getTemplate(name, registry, uiOptions = {}) {
2918
2986
  }
2919
2987
 
2920
2988
  // src/getTestIds.ts
2921
- var import_get17 = __toESM(require("lodash/get"), 1);
2989
+ var import_get18 = __toESM(require("lodash/get"), 1);
2922
2990
  var import_uniqueId = __toESM(require("lodash/uniqueId"), 1);
2923
2991
  function getTestIds() {
2924
- if (typeof process === "undefined" || (0, import_get17.default)(process, "env.NODE_ENV") !== "test") {
2992
+ if (typeof process === "undefined" || (0, import_get18.default)(process, "env.NODE_ENV") !== "test") {
2925
2993
  return {};
2926
2994
  }
2927
2995
  const ids = /* @__PURE__ */ new Map();
@@ -2941,7 +3009,7 @@ function getTestIds() {
2941
3009
  // src/getWidget.tsx
2942
3010
  var import_react = require("react");
2943
3011
  var import_react_is = __toESM(require("react-is"), 1);
2944
- var import_get18 = __toESM(require("lodash/get"), 1);
3012
+ var import_get19 = __toESM(require("lodash/get"), 1);
2945
3013
  var import_set4 = __toESM(require("lodash/set"), 1);
2946
3014
  var import_jsx_runtime = require("react/jsx-runtime");
2947
3015
  var widgetMap = {
@@ -2997,7 +3065,7 @@ var widgetMap = {
2997
3065
  }
2998
3066
  };
2999
3067
  function mergeWidgetOptions(AWidget) {
3000
- let MergedWidget = (0, import_get18.default)(AWidget, "MergedWidget");
3068
+ let MergedWidget = (0, import_get19.default)(AWidget, "MergedWidget");
3001
3069
  if (!MergedWidget) {
3002
3070
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
3003
3071
  MergedWidget = ({ options, ...props }) => {
@@ -3098,6 +3166,31 @@ function optionId(id, optionIndex) {
3098
3166
  function buttonId(id, btn) {
3099
3167
  return idGenerator(id, btn);
3100
3168
  }
3169
+ function optionalControlsId(id, element) {
3170
+ return idGenerator(id, `optional${element}`);
3171
+ }
3172
+
3173
+ // src/isFormDataAvailable.ts
3174
+ var import_isNil3 = __toESM(require("lodash/isNil"), 1);
3175
+ var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
3176
+ var import_isObject11 = __toESM(require("lodash/isObject"), 1);
3177
+ function isFormDataAvailable(formData) {
3178
+ return !(0, import_isNil3.default)(formData) && (!(0, import_isObject11.default)(formData) || Array.isArray(formData) || !(0, import_isEmpty5.default)(formData));
3179
+ }
3180
+
3181
+ // src/isRootSchema.ts
3182
+ var import_isEqual2 = __toESM(require("lodash/isEqual"), 1);
3183
+ function isRootSchema(registry, schemaToCompare) {
3184
+ const { rootSchema, schemaUtils } = registry;
3185
+ if ((0, import_isEqual2.default)(schemaToCompare, rootSchema)) {
3186
+ return true;
3187
+ }
3188
+ if (REF_KEY in rootSchema) {
3189
+ const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
3190
+ return (0, import_isEqual2.default)(schemaToCompare, resolvedSchema);
3191
+ }
3192
+ return false;
3193
+ }
3101
3194
 
3102
3195
  // src/labelValue.ts
3103
3196
  function labelValue(label, hideLabel, fallback) {
@@ -3110,14 +3203,14 @@ function localToUTC(dateString) {
3110
3203
  }
3111
3204
 
3112
3205
  // src/lookupFromFormContext.ts
3113
- var import_get19 = __toESM(require("lodash/get"), 1);
3206
+ var import_get20 = __toESM(require("lodash/get"), 1);
3114
3207
  var import_has6 = __toESM(require("lodash/has"), 1);
3115
3208
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3116
3209
  const lookupPath = [LOOKUP_MAP_NAME];
3117
3210
  if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3118
3211
  lookupPath.unshift(FORM_CONTEXT_NAME);
3119
3212
  }
3120
- return (0, import_get19.default)(regOrFc, [...lookupPath, toLookup], fallback);
3213
+ return (0, import_get20.default)(regOrFc, [...lookupPath, toLookup], fallback);
3121
3214
  }
3122
3215
 
3123
3216
  // src/orderProperties.ts
@@ -3210,6 +3303,28 @@ function shouldRender(component, nextProps, nextState, updateStrategy = "customD
3210
3303
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3211
3304
  }
3212
3305
 
3306
+ // src/shouldRenderOptionalField.ts
3307
+ var import_isObject12 = __toESM(require("lodash/isObject"), 1);
3308
+ var import_uniq2 = __toESM(require("lodash/uniq"), 1);
3309
+ function getSchemaTypesForXxxOf(schemas) {
3310
+ const allTypes = (0, import_uniq2.default)(
3311
+ schemas.map((s) => (0, import_isObject12.default)(s) ? getSchemaType(s) : void 0).flat().filter((t) => t !== void 0)
3312
+ );
3313
+ return allTypes.length === 1 ? allTypes[0] : allTypes;
3314
+ }
3315
+ function shouldRenderOptionalField(registry, schema, required, uiSchema) {
3316
+ const { enableOptionalDataFieldForType = [] } = getUiOptions(uiSchema, registry.globalUiOptions);
3317
+ let schemaType;
3318
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
3319
+ schemaType = getSchemaTypesForXxxOf(schema[ANY_OF_KEY]);
3320
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
3321
+ schemaType = getSchemaTypesForXxxOf(schema[ONE_OF_KEY]);
3322
+ } else {
3323
+ schemaType = getSchemaType(schema);
3324
+ }
3325
+ return !isRootSchema(registry, schema) && !required && !!schemaType && !Array.isArray(schemaType) && !!enableOptionalDataFieldForType.find((val) => val === schemaType);
3326
+ }
3327
+
3213
3328
  // src/toDateString.ts
3214
3329
  function toDateString(dateObject, time = true) {
3215
3330
  const { year, month, day, hour = 0, minute = 0, second = 0 } = dateObject;
@@ -3219,7 +3334,7 @@ function toDateString(dateObject, time = true) {
3219
3334
  }
3220
3335
 
3221
3336
  // src/toErrorList.ts
3222
- var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
3337
+ var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"), 1);
3223
3338
  function toErrorList(errorSchema, fieldPath = []) {
3224
3339
  if (!errorSchema) {
3225
3340
  return [];
@@ -3240,7 +3355,7 @@ function toErrorList(errorSchema, fieldPath = []) {
3240
3355
  return Object.keys(errorSchema).reduce((acc, key) => {
3241
3356
  if (key !== ERRORS_KEY) {
3242
3357
  const childSchema = errorSchema[key];
3243
- if ((0, import_isPlainObject2.default)(childSchema)) {
3358
+ if ((0, import_isPlainObject3.default)(childSchema)) {
3244
3359
  acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
3245
3360
  }
3246
3361
  }
@@ -3268,23 +3383,27 @@ function toErrorSchema(errors) {
3268
3383
  }
3269
3384
 
3270
3385
  // src/toFieldPathId.ts
3271
- function toFieldPathId(fieldPath, globalFormOptions, parentPath) {
3386
+ function toFieldPathId(fieldPath, globalFormOptions, parentPath, isMultiValue) {
3272
3387
  const basePath = Array.isArray(parentPath) ? parentPath : parentPath?.path;
3273
3388
  const childPath = fieldPath === "" ? [] : [fieldPath];
3274
3389
  const path = basePath ? basePath.concat(...childPath) : childPath;
3275
3390
  const id = [globalFormOptions.idPrefix, ...path].join(globalFormOptions.idSeparator);
3276
- return { path, [ID_KEY]: id };
3391
+ let name;
3392
+ if (globalFormOptions.nameGenerator && path.length > 0) {
3393
+ name = globalFormOptions.nameGenerator(path, globalFormOptions.idPrefix, isMultiValue);
3394
+ }
3395
+ return { path, [ID_KEY]: id, ...name !== void 0 && { name } };
3277
3396
  }
3278
3397
 
3279
3398
  // src/unwrapErrorHandler.ts
3280
- var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"), 1);
3399
+ var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3281
3400
  function unwrapErrorHandler(errorHandler) {
3282
3401
  return Object.keys(errorHandler).reduce((acc, key) => {
3283
3402
  if (key === "addError") {
3284
3403
  return acc;
3285
3404
  } else {
3286
3405
  const childSchema = errorHandler[key];
3287
- if ((0, import_isPlainObject3.default)(childSchema)) {
3406
+ if ((0, import_isPlainObject4.default)(childSchema)) {
3288
3407
  return {
3289
3408
  ...acc,
3290
3409
  [key]: unwrapErrorHandler(childSchema)
@@ -3295,6 +3414,17 @@ function unwrapErrorHandler(errorHandler) {
3295
3414
  }, {});
3296
3415
  }
3297
3416
 
3417
+ // src/useDeepCompareMemo.ts
3418
+ var import_react2 = require("react");
3419
+ var import_isEqual3 = __toESM(require("lodash/isEqual"), 1);
3420
+ function useDeepCompareMemo(newValue) {
3421
+ const valueRef = (0, import_react2.useRef)(newValue);
3422
+ if (!(0, import_isEqual3.default)(newValue, valueRef.current)) {
3423
+ valueRef.current = newValue;
3424
+ }
3425
+ return valueRef.current;
3426
+ }
3427
+
3298
3428
  // src/utcToLocal.ts
3299
3429
  function utcToLocal(jsonDate) {
3300
3430
  if (!jsonDate) {
@@ -3312,23 +3442,27 @@ function utcToLocal(jsonDate) {
3312
3442
  }
3313
3443
 
3314
3444
  // src/validationDataMerge.ts
3315
- var import_isEmpty5 = __toESM(require("lodash/isEmpty"), 1);
3316
- function validationDataMerge(validationData, additionalErrorSchema) {
3445
+ var import_isEmpty6 = __toESM(require("lodash/isEmpty"), 1);
3446
+ function validationDataMerge(validationData, additionalErrorSchema, preventDuplicates = false) {
3317
3447
  if (!additionalErrorSchema) {
3318
3448
  return validationData;
3319
3449
  }
3320
3450
  const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
3321
3451
  let errors = toErrorList(additionalErrorSchema);
3322
3452
  let errorSchema = additionalErrorSchema;
3323
- if (!(0, import_isEmpty5.default)(oldErrorSchema)) {
3324
- errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
3453
+ if (!(0, import_isEmpty6.default)(oldErrorSchema)) {
3454
+ errorSchema = mergeObjects(
3455
+ oldErrorSchema,
3456
+ additionalErrorSchema,
3457
+ preventDuplicates ? "preventDuplicates" : true
3458
+ );
3325
3459
  errors = [...oldErrors].concat(errors);
3326
3460
  }
3327
3461
  return { errorSchema, errors };
3328
3462
  }
3329
3463
 
3330
3464
  // src/withIdRefPrefix.ts
3331
- var import_isObject11 = __toESM(require("lodash/isObject"), 1);
3465
+ var import_isObject13 = __toESM(require("lodash/isObject"), 1);
3332
3466
  function withIdRefPrefixObject(node) {
3333
3467
  for (const key in node) {
3334
3468
  const realObj = node;
@@ -3351,34 +3485,31 @@ function withIdRefPrefix(schemaNode) {
3351
3485
  if (Array.isArray(schemaNode)) {
3352
3486
  return withIdRefPrefixArray([...schemaNode]);
3353
3487
  }
3354
- if ((0, import_isObject11.default)(schemaNode)) {
3488
+ if ((0, import_isObject13.default)(schemaNode)) {
3355
3489
  return withIdRefPrefixObject({ ...schemaNode });
3356
3490
  }
3357
3491
  return schemaNode;
3358
3492
  }
3359
3493
 
3360
- // src/getChangedFields.ts
3361
- var import_keys = __toESM(require("lodash/keys"), 1);
3362
- var import_pickBy = __toESM(require("lodash/pickBy"), 1);
3363
- var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3364
- var import_get20 = __toESM(require("lodash/get"), 1);
3365
- var import_difference = __toESM(require("lodash/difference"), 1);
3366
- function getChangedFields(a, b) {
3367
- const aIsPlainObject = (0, import_isPlainObject4.default)(a);
3368
- const bIsPlainObject = (0, import_isPlainObject4.default)(b);
3369
- if (a === b || !aIsPlainObject && !bIsPlainObject) {
3370
- return [];
3494
+ // src/nameGenerators.ts
3495
+ var bracketNameGenerator = (path, idPrefix, isMultiValue) => {
3496
+ if (!path || path.length === 0) {
3497
+ return idPrefix;
3371
3498
  }
3372
- if (aIsPlainObject && !bIsPlainObject) {
3373
- return (0, import_keys.default)(a);
3374
- } else if (!aIsPlainObject && bIsPlainObject) {
3375
- return (0, import_keys.default)(b);
3376
- } else {
3377
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get20.default)(b, key))));
3378
- const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3379
- return [...unequalFields, ...diffFields];
3499
+ const baseName = path.reduce((acc, pathUnit, index) => {
3500
+ if (index === 0) {
3501
+ return `${idPrefix}[${String(pathUnit)}]`;
3502
+ }
3503
+ return `${acc}[${String(pathUnit)}]`;
3504
+ }, "");
3505
+ return isMultiValue ? `${baseName}[]` : baseName;
3506
+ };
3507
+ var dotNotationNameGenerator = (path, idPrefix, _isMultiValue) => {
3508
+ if (!path || path.length === 0) {
3509
+ return idPrefix;
3380
3510
  }
3381
- }
3511
+ return `${idPrefix}.${path.map(String).join(".")}`;
3512
+ };
3382
3513
 
3383
3514
  // src/enums.ts
3384
3515
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
@@ -3402,6 +3533,9 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3402
3533
  TranslatableString2["PreviewLabel"] = "Preview";
3403
3534
  TranslatableString2["DecrementAriaLabel"] = "Decrease value by 1";
3404
3535
  TranslatableString2["IncrementAriaLabel"] = "Increase value by 1";
3536
+ TranslatableString2["OptionalObjectAdd"] = "Add data for optional field";
3537
+ TranslatableString2["OptionalObjectRemove"] = "Remove data for optional field";
3538
+ TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
3405
3539
  TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
3406
3540
  TranslatableString2["OptionPrefix"] = "Option %1";
3407
3541
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";