@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/utils.esm.js CHANGED
@@ -435,7 +435,7 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
435
435
 
436
436
  // src/schema/retrieveSchema.ts
437
437
  import isEmpty2 from "lodash/isEmpty";
438
- function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
438
+ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs = false) {
439
439
  return retrieveSchemaInternal(
440
440
  validator,
441
441
  schema,
@@ -443,7 +443,8 @@ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experim
443
443
  rawFormData,
444
444
  void 0,
445
445
  void 0,
446
- experimental_customMergeAllOf
446
+ experimental_customMergeAllOf,
447
+ resolveAnyOfOrOneOfRefs
447
448
  )[0];
448
449
  }
449
450
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
@@ -532,7 +533,7 @@ function getMatchingPatternProperties(schema, key) {
532
533
  {}
533
534
  );
534
535
  }
535
- function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
536
+ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
536
537
  const updatedSchemas = resolveReference(
537
538
  validator,
538
539
  schema,
@@ -540,7 +541,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
540
541
  expandAllBranches,
541
542
  recurseList,
542
543
  formData,
543
- experimental_customMergeAllOf
544
+ experimental_customMergeAllOf,
545
+ resolveAnyOfOrOneOfRefs
544
546
  );
545
547
  if (updatedSchemas.length > 1 || updatedSchemas[0] !== schema) {
546
548
  return updatedSchemas;
@@ -567,7 +569,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
567
569
  );
568
570
  });
569
571
  }
570
- if (ALL_OF_KEY in schema && Array.isArray(schema.allOf)) {
572
+ if (ALL_OF_KEY in schema && Array.isArray(schema[ALL_OF_KEY])) {
571
573
  const allOfSchemaElements = schema.allOf.map(
572
574
  (allOfSubschema) => retrieveSchemaInternal(
573
575
  validator,
@@ -587,8 +589,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
587
589
  }
588
590
  return [schema];
589
591
  }
590
- function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
591
- const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList);
592
+ function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
593
+ const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList, void 0, resolveAnyOfOrOneOfRefs);
592
594
  if (updatedSchema !== schema) {
593
595
  return retrieveSchemaInternal(
594
596
  validator,
@@ -597,12 +599,13 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
597
599
  formData,
598
600
  expandAllBranches,
599
601
  recurseList,
600
- experimental_customMergeAllOf
602
+ experimental_customMergeAllOf,
603
+ resolveAnyOfOrOneOfRefs
601
604
  );
602
605
  }
603
606
  return [schema];
604
607
  }
605
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
608
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
606
609
  if (!isObject(schema)) {
607
610
  return schema;
608
611
  }
@@ -625,7 +628,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
625
628
  resolvedSchema[PROPERTIES_KEY],
626
629
  (result, value, key) => {
627
630
  const childList = [...recurseList];
628
- result[key] = resolveAllReferences(value, rootSchema, childList, baseURI);
631
+ result[key] = resolveAllReferences(value, rootSchema, childList, baseURI, resolveAnyOfOrOneOfRefs);
629
632
  childrenLists.push(childList);
630
633
  },
631
634
  {}
@@ -636,9 +639,28 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
636
639
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
637
640
  resolvedSchema = {
638
641
  ...resolvedSchema,
639
- items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI)
642
+ items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
640
643
  };
641
644
  }
645
+ if (resolveAnyOfOrOneOfRefs) {
646
+ let key;
647
+ let schemas;
648
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
649
+ key = ANY_OF_KEY;
650
+ schemas = resolvedSchema[ANY_OF_KEY];
651
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
652
+ key = ONE_OF_KEY;
653
+ schemas = resolvedSchema[ONE_OF_KEY];
654
+ }
655
+ if (key && schemas) {
656
+ resolvedSchema = {
657
+ ...resolvedSchema,
658
+ [key]: schemas.map(
659
+ (s) => resolveAllReferences(s, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
660
+ )
661
+ };
662
+ }
663
+ }
642
664
  return deepEquals(schema, resolvedSchema) ? schema : resolvedSchema;
643
665
  }
644
666
  function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFormData, experimental_customMergeAllOf) {
@@ -666,7 +688,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
666
688
  }
667
689
  }
668
690
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema.additionalProperties !== false) {
669
- let additionalProperties = {};
691
+ let additionalProperties;
670
692
  if (typeof schema.additionalProperties !== "boolean") {
671
693
  if (REF_KEY in schema.additionalProperties) {
672
694
  additionalProperties = retrieveSchema(
@@ -698,7 +720,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
698
720
  });
699
721
  return schema;
700
722
  }
701
- function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf) {
723
+ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
702
724
  if (!isObject(schema)) {
703
725
  return [{}];
704
726
  }
@@ -709,7 +731,8 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
709
731
  expandAllBranches,
710
732
  recurseList,
711
733
  rawFormData,
712
- experimental_customMergeAllOf
734
+ experimental_customMergeAllOf,
735
+ resolveAnyOfOrOneOfRefs
713
736
  );
714
737
  return resolvedSchemas.flatMap((s) => {
715
738
  let resolvedSchema = s;
@@ -1480,7 +1503,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1480
1503
  experimental_defaultFormStateBehavior = void 0,
1481
1504
  experimental_customMergeAllOf = void 0,
1482
1505
  required,
1483
- shouldMergeDefaultsIntoFormData = false
1506
+ shouldMergeDefaultsIntoFormData = false,
1507
+ initialDefaultsGenerated
1484
1508
  } = computeDefaultsProps;
1485
1509
  let formData = isObject(rawFormData) ? rawFormData : {};
1486
1510
  const schema = isObject(rawSchema) ? rawSchema : {};
@@ -1585,7 +1609,8 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1585
1609
  parentDefaults: defaults,
1586
1610
  rawFormData: rawFormData ?? formData,
1587
1611
  required,
1588
- shouldMergeDefaultsIntoFormData
1612
+ shouldMergeDefaultsIntoFormData,
1613
+ initialDefaultsGenerated
1589
1614
  });
1590
1615
  }
1591
1616
  if (defaults === void 0) {
@@ -1637,7 +1662,8 @@ function getObjectDefaults(validator, rawSchema, {
1637
1662
  experimental_defaultFormStateBehavior = void 0,
1638
1663
  experimental_customMergeAllOf = void 0,
1639
1664
  required,
1640
- shouldMergeDefaultsIntoFormData
1665
+ shouldMergeDefaultsIntoFormData,
1666
+ initialDefaultsGenerated
1641
1667
  } = {}, defaults) {
1642
1668
  {
1643
1669
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1658,7 +1684,8 @@ function getObjectDefaults(validator, rawSchema, {
1658
1684
  parentDefaults: get12(defaults, [key]),
1659
1685
  rawFormData: get12(formData, [key]),
1660
1686
  required: retrievedSchema.required?.includes(key),
1661
- shouldMergeDefaultsIntoFormData
1687
+ shouldMergeDefaultsIntoFormData,
1688
+ initialDefaultsGenerated
1662
1689
  });
1663
1690
  maybeAddDefaultToObject(
1664
1691
  acc,
@@ -1674,7 +1701,7 @@ function getObjectDefaults(validator, rawSchema, {
1674
1701
  },
1675
1702
  {}
1676
1703
  );
1677
- if (retrievedSchema.additionalProperties) {
1704
+ if (retrievedSchema.additionalProperties && !initialDefaultsGenerated) {
1678
1705
  const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties) ? retrievedSchema.additionalProperties : {};
1679
1706
  const keys2 = /* @__PURE__ */ new Set();
1680
1707
  if (isObject(defaults)) {
@@ -1695,7 +1722,8 @@ function getObjectDefaults(validator, rawSchema, {
1695
1722
  parentDefaults: get12(defaults, [key]),
1696
1723
  rawFormData: get12(formData, [key]),
1697
1724
  required: retrievedSchema.required?.includes(key),
1698
- shouldMergeDefaultsIntoFormData
1725
+ shouldMergeDefaultsIntoFormData,
1726
+ initialDefaultsGenerated
1699
1727
  });
1700
1728
  maybeAddDefaultToObject(
1701
1729
  objectDefaults,
@@ -1717,7 +1745,9 @@ function getArrayDefaults(validator, rawSchema, {
1717
1745
  experimental_defaultFormStateBehavior = void 0,
1718
1746
  experimental_customMergeAllOf = void 0,
1719
1747
  required,
1720
- shouldMergeDefaultsIntoFormData
1748
+ requiredAsRoot = false,
1749
+ shouldMergeDefaultsIntoFormData,
1750
+ initialDefaultsGenerated
1721
1751
  } = {}, defaults) {
1722
1752
  const schema = rawSchema;
1723
1753
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
@@ -1738,7 +1768,8 @@ function getArrayDefaults(validator, rawSchema, {
1738
1768
  experimental_customMergeAllOf,
1739
1769
  parentDefaults: item,
1740
1770
  required,
1741
- shouldMergeDefaultsIntoFormData
1771
+ shouldMergeDefaultsIntoFormData,
1772
+ initialDefaultsGenerated
1742
1773
  });
1743
1774
  });
1744
1775
  }
@@ -1756,7 +1787,8 @@ function getArrayDefaults(validator, rawSchema, {
1756
1787
  rawFormData: item,
1757
1788
  parentDefaults: get12(defaults, [idx]),
1758
1789
  required,
1759
- shouldMergeDefaultsIntoFormData
1790
+ shouldMergeDefaultsIntoFormData,
1791
+ initialDefaultsGenerated
1760
1792
  });
1761
1793
  });
1762
1794
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
@@ -1775,7 +1807,7 @@ function getArrayDefaults(validator, rawSchema, {
1775
1807
  let arrayDefault;
1776
1808
  const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1777
1809
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
1778
- arrayDefault = defaults ? defaults : emptyDefault;
1810
+ arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
1779
1811
  } else {
1780
1812
  const defaultEntries = defaults || [];
1781
1813
  const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
@@ -1807,7 +1839,7 @@ function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps
1807
1839
  }
1808
1840
  }
1809
1841
  }
1810
- function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
1842
+ function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf, initialDefaultsGenerated) {
1811
1843
  if (!isObject(theSchema)) {
1812
1844
  throw new Error("Invalid schema: " + theSchema);
1813
1845
  }
@@ -1818,7 +1850,9 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
1818
1850
  experimental_defaultFormStateBehavior,
1819
1851
  experimental_customMergeAllOf,
1820
1852
  rawFormData: formData,
1821
- shouldMergeDefaultsIntoFormData: true
1853
+ shouldMergeDefaultsIntoFormData: true,
1854
+ initialDefaultsGenerated,
1855
+ requiredAsRoot: true
1822
1856
  });
1823
1857
  if (schema.type !== "object" && isObject(schema.default)) {
1824
1858
  return {
@@ -2237,9 +2271,10 @@ var SchemaUtils = class {
2237
2271
  * @param [includeUndefinedValues=false] - Optional flag, if true, cause undefined values to be added as defaults.
2238
2272
  * If "excludeObjectChildren", pass `includeUndefinedValues` as false when computing defaults for any nested
2239
2273
  * object properties.
2274
+ * @param initialDefaultsGenerated - Indicates whether or not initial defaults have been generated
2240
2275
  * @returns - The resulting `formData` with all the defaults provided
2241
2276
  */
2242
- getDefaultFormState(schema, formData, includeUndefinedValues = false) {
2277
+ getDefaultFormState(schema, formData, includeUndefinedValues = false, initialDefaultsGenerated) {
2243
2278
  return getDefaultFormState(
2244
2279
  this.validator,
2245
2280
  schema,
@@ -2247,7 +2282,8 @@ var SchemaUtils = class {
2247
2282
  this.rootSchema,
2248
2283
  includeUndefinedValues,
2249
2284
  this.experimental_defaultFormStateBehavior,
2250
- this.experimental_customMergeAllOf
2285
+ this.experimental_customMergeAllOf,
2286
+ initialDefaultsGenerated
2251
2287
  );
2252
2288
  }
2253
2289
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
@@ -2346,15 +2382,17 @@ var SchemaUtils = class {
2346
2382
  *
2347
2383
  * @param schema - The schema for which retrieving a schema is desired
2348
2384
  * @param [rawFormData] - The current formData, if any, to assist retrieving a schema
2385
+ * @param [resolveAnyOfOrOneOfRefs] - Optional flag indicating whether to resolved refs in anyOf/oneOf lists
2349
2386
  * @returns - The schema having its conditions, additional properties, references and dependencies resolved
2350
2387
  */
2351
- retrieveSchema(schema, rawFormData) {
2388
+ retrieveSchema(schema, rawFormData, resolveAnyOfOrOneOfRefs) {
2352
2389
  return retrieveSchema(
2353
2390
  this.validator,
2354
2391
  schema,
2355
2392
  this.rootSchema,
2356
2393
  rawFormData,
2357
- this.experimental_customMergeAllOf
2394
+ this.experimental_customMergeAllOf,
2395
+ resolveAnyOfOrOneOfRefs
2358
2396
  );
2359
2397
  }
2360
2398
  /** Sanitize the `data` associated with the `oldSchema` so it is considered appropriate for the `newSchema`. If the
@@ -2655,6 +2693,29 @@ var ErrorSchemaBuilder = class {
2655
2693
  }
2656
2694
  };
2657
2695
 
2696
+ // src/getChangedFields.ts
2697
+ import keys from "lodash/keys";
2698
+ import pickBy from "lodash/pickBy";
2699
+ import isPlainObject2 from "lodash/isPlainObject";
2700
+ import get17 from "lodash/get";
2701
+ import difference from "lodash/difference";
2702
+ function getChangedFields(a, b) {
2703
+ const aIsPlainObject = isPlainObject2(a);
2704
+ const bIsPlainObject = isPlainObject2(b);
2705
+ if (a === b || !aIsPlainObject && !bIsPlainObject) {
2706
+ return [];
2707
+ }
2708
+ if (aIsPlainObject && !bIsPlainObject) {
2709
+ return keys(a);
2710
+ } else if (!aIsPlainObject && bIsPlainObject) {
2711
+ return keys(b);
2712
+ } else {
2713
+ const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get17(b, key))));
2714
+ const diffFields = difference(keys(b), keys(a));
2715
+ return [...unequalFields, ...diffFields];
2716
+ }
2717
+ }
2718
+
2658
2719
  // src/getDateElementProps.ts
2659
2720
  function getDateElementProps(date, time, yearRange = [1900, (/* @__PURE__ */ new Date()).getFullYear() + 2], format = "YMD") {
2660
2721
  const { day, month, year, hour, minute, second } = date;
@@ -2763,10 +2824,10 @@ function getTemplate(name, registry, uiOptions = {}) {
2763
2824
  }
2764
2825
 
2765
2826
  // src/getTestIds.ts
2766
- import get17 from "lodash/get";
2827
+ import get18 from "lodash/get";
2767
2828
  import uniqueId from "lodash/uniqueId";
2768
2829
  function getTestIds() {
2769
- if (typeof process === "undefined" || get17(process, "env.NODE_ENV") !== "test") {
2830
+ if (typeof process === "undefined" || get18(process, "env.NODE_ENV") !== "test") {
2770
2831
  return {};
2771
2832
  }
2772
2833
  const ids = /* @__PURE__ */ new Map();
@@ -2786,7 +2847,7 @@ function getTestIds() {
2786
2847
  // src/getWidget.tsx
2787
2848
  import { createElement } from "react";
2788
2849
  import ReactIs from "react-is";
2789
- import get18 from "lodash/get";
2850
+ import get19 from "lodash/get";
2790
2851
  import set4 from "lodash/set";
2791
2852
  import { jsx } from "react/jsx-runtime";
2792
2853
  var widgetMap = {
@@ -2842,7 +2903,7 @@ var widgetMap = {
2842
2903
  }
2843
2904
  };
2844
2905
  function mergeWidgetOptions(AWidget) {
2845
- let MergedWidget = get18(AWidget, "MergedWidget");
2906
+ let MergedWidget = get19(AWidget, "MergedWidget");
2846
2907
  if (!MergedWidget) {
2847
2908
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
2848
2909
  MergedWidget = ({ options, ...props }) => {
@@ -2943,6 +3004,31 @@ function optionId(id, optionIndex) {
2943
3004
  function buttonId(id, btn) {
2944
3005
  return idGenerator(id, btn);
2945
3006
  }
3007
+ function optionalControlsId(id, element) {
3008
+ return idGenerator(id, `optional${element}`);
3009
+ }
3010
+
3011
+ // src/isFormDataAvailable.ts
3012
+ import isNil3 from "lodash/isNil";
3013
+ import isEmpty5 from "lodash/isEmpty";
3014
+ import isObject4 from "lodash/isObject";
3015
+ function isFormDataAvailable(formData) {
3016
+ return !isNil3(formData) && (!isObject4(formData) || Array.isArray(formData) || !isEmpty5(formData));
3017
+ }
3018
+
3019
+ // src/isRootSchema.ts
3020
+ import isEqual2 from "lodash/isEqual";
3021
+ function isRootSchema(registry, schemaToCompare) {
3022
+ const { rootSchema, schemaUtils } = registry;
3023
+ if (isEqual2(schemaToCompare, rootSchema)) {
3024
+ return true;
3025
+ }
3026
+ if (REF_KEY in rootSchema) {
3027
+ const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
3028
+ return isEqual2(schemaToCompare, resolvedSchema);
3029
+ }
3030
+ return false;
3031
+ }
2946
3032
 
2947
3033
  // src/labelValue.ts
2948
3034
  function labelValue(label, hideLabel, fallback) {
@@ -2955,14 +3041,14 @@ function localToUTC(dateString) {
2955
3041
  }
2956
3042
 
2957
3043
  // src/lookupFromFormContext.ts
2958
- import get19 from "lodash/get";
3044
+ import get20 from "lodash/get";
2959
3045
  import has6 from "lodash/has";
2960
3046
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
2961
3047
  const lookupPath = [LOOKUP_MAP_NAME];
2962
3048
  if (has6(regOrFc, FORM_CONTEXT_NAME)) {
2963
3049
  lookupPath.unshift(FORM_CONTEXT_NAME);
2964
3050
  }
2965
- return get19(regOrFc, [...lookupPath, toLookup], fallback);
3051
+ return get20(regOrFc, [...lookupPath, toLookup], fallback);
2966
3052
  }
2967
3053
 
2968
3054
  // src/orderProperties.ts
@@ -3055,6 +3141,28 @@ function shouldRender(component, nextProps, nextState, updateStrategy = "customD
3055
3141
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3056
3142
  }
3057
3143
 
3144
+ // src/shouldRenderOptionalField.ts
3145
+ import isObject5 from "lodash/isObject";
3146
+ import uniq2 from "lodash/uniq";
3147
+ function getSchemaTypesForXxxOf(schemas) {
3148
+ const allTypes = uniq2(
3149
+ schemas.map((s) => isObject5(s) ? getSchemaType(s) : void 0).flat().filter((t) => t !== void 0)
3150
+ );
3151
+ return allTypes.length === 1 ? allTypes[0] : allTypes;
3152
+ }
3153
+ function shouldRenderOptionalField(registry, schema, required, uiSchema) {
3154
+ const { enableOptionalDataFieldForType = [] } = getUiOptions(uiSchema, registry.globalUiOptions);
3155
+ let schemaType;
3156
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
3157
+ schemaType = getSchemaTypesForXxxOf(schema[ANY_OF_KEY]);
3158
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
3159
+ schemaType = getSchemaTypesForXxxOf(schema[ONE_OF_KEY]);
3160
+ } else {
3161
+ schemaType = getSchemaType(schema);
3162
+ }
3163
+ return !isRootSchema(registry, schema) && !required && !!schemaType && !Array.isArray(schemaType) && !!enableOptionalDataFieldForType.find((val) => val === schemaType);
3164
+ }
3165
+
3058
3166
  // src/toDateString.ts
3059
3167
  function toDateString(dateObject, time = true) {
3060
3168
  const { year, month, day, hour = 0, minute = 0, second = 0 } = dateObject;
@@ -3064,7 +3172,7 @@ function toDateString(dateObject, time = true) {
3064
3172
  }
3065
3173
 
3066
3174
  // src/toErrorList.ts
3067
- import isPlainObject2 from "lodash/isPlainObject";
3175
+ import isPlainObject3 from "lodash/isPlainObject";
3068
3176
  function toErrorList(errorSchema, fieldPath = []) {
3069
3177
  if (!errorSchema) {
3070
3178
  return [];
@@ -3085,7 +3193,7 @@ function toErrorList(errorSchema, fieldPath = []) {
3085
3193
  return Object.keys(errorSchema).reduce((acc, key) => {
3086
3194
  if (key !== ERRORS_KEY) {
3087
3195
  const childSchema = errorSchema[key];
3088
- if (isPlainObject2(childSchema)) {
3196
+ if (isPlainObject3(childSchema)) {
3089
3197
  acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
3090
3198
  }
3091
3199
  }
@@ -3113,23 +3221,27 @@ function toErrorSchema(errors) {
3113
3221
  }
3114
3222
 
3115
3223
  // src/toFieldPathId.ts
3116
- function toFieldPathId(fieldPath, globalFormOptions, parentPath) {
3224
+ function toFieldPathId(fieldPath, globalFormOptions, parentPath, isMultiValue) {
3117
3225
  const basePath = Array.isArray(parentPath) ? parentPath : parentPath?.path;
3118
3226
  const childPath = fieldPath === "" ? [] : [fieldPath];
3119
3227
  const path = basePath ? basePath.concat(...childPath) : childPath;
3120
3228
  const id = [globalFormOptions.idPrefix, ...path].join(globalFormOptions.idSeparator);
3121
- return { path, [ID_KEY]: id };
3229
+ let name;
3230
+ if (globalFormOptions.nameGenerator && path.length > 0) {
3231
+ name = globalFormOptions.nameGenerator(path, globalFormOptions.idPrefix, isMultiValue);
3232
+ }
3233
+ return { path, [ID_KEY]: id, ...name !== void 0 && { name } };
3122
3234
  }
3123
3235
 
3124
3236
  // src/unwrapErrorHandler.ts
3125
- import isPlainObject3 from "lodash/isPlainObject";
3237
+ import isPlainObject4 from "lodash/isPlainObject";
3126
3238
  function unwrapErrorHandler(errorHandler) {
3127
3239
  return Object.keys(errorHandler).reduce((acc, key) => {
3128
3240
  if (key === "addError") {
3129
3241
  return acc;
3130
3242
  } else {
3131
3243
  const childSchema = errorHandler[key];
3132
- if (isPlainObject3(childSchema)) {
3244
+ if (isPlainObject4(childSchema)) {
3133
3245
  return {
3134
3246
  ...acc,
3135
3247
  [key]: unwrapErrorHandler(childSchema)
@@ -3140,6 +3252,17 @@ function unwrapErrorHandler(errorHandler) {
3140
3252
  }, {});
3141
3253
  }
3142
3254
 
3255
+ // src/useDeepCompareMemo.ts
3256
+ import { useRef } from "react";
3257
+ import isEqual3 from "lodash/isEqual";
3258
+ function useDeepCompareMemo(newValue) {
3259
+ const valueRef = useRef(newValue);
3260
+ if (!isEqual3(newValue, valueRef.current)) {
3261
+ valueRef.current = newValue;
3262
+ }
3263
+ return valueRef.current;
3264
+ }
3265
+
3143
3266
  // src/utcToLocal.ts
3144
3267
  function utcToLocal(jsonDate) {
3145
3268
  if (!jsonDate) {
@@ -3157,23 +3280,27 @@ function utcToLocal(jsonDate) {
3157
3280
  }
3158
3281
 
3159
3282
  // src/validationDataMerge.ts
3160
- import isEmpty5 from "lodash/isEmpty";
3161
- function validationDataMerge(validationData, additionalErrorSchema) {
3283
+ import isEmpty6 from "lodash/isEmpty";
3284
+ function validationDataMerge(validationData, additionalErrorSchema, preventDuplicates = false) {
3162
3285
  if (!additionalErrorSchema) {
3163
3286
  return validationData;
3164
3287
  }
3165
3288
  const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
3166
3289
  let errors = toErrorList(additionalErrorSchema);
3167
3290
  let errorSchema = additionalErrorSchema;
3168
- if (!isEmpty5(oldErrorSchema)) {
3169
- errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
3291
+ if (!isEmpty6(oldErrorSchema)) {
3292
+ errorSchema = mergeObjects(
3293
+ oldErrorSchema,
3294
+ additionalErrorSchema,
3295
+ preventDuplicates ? "preventDuplicates" : true
3296
+ );
3170
3297
  errors = [...oldErrors].concat(errors);
3171
3298
  }
3172
3299
  return { errorSchema, errors };
3173
3300
  }
3174
3301
 
3175
3302
  // src/withIdRefPrefix.ts
3176
- import isObject4 from "lodash/isObject";
3303
+ import isObject6 from "lodash/isObject";
3177
3304
  function withIdRefPrefixObject(node) {
3178
3305
  for (const key in node) {
3179
3306
  const realObj = node;
@@ -3196,34 +3323,31 @@ function withIdRefPrefix(schemaNode) {
3196
3323
  if (Array.isArray(schemaNode)) {
3197
3324
  return withIdRefPrefixArray([...schemaNode]);
3198
3325
  }
3199
- if (isObject4(schemaNode)) {
3326
+ if (isObject6(schemaNode)) {
3200
3327
  return withIdRefPrefixObject({ ...schemaNode });
3201
3328
  }
3202
3329
  return schemaNode;
3203
3330
  }
3204
3331
 
3205
- // src/getChangedFields.ts
3206
- import keys from "lodash/keys";
3207
- import pickBy from "lodash/pickBy";
3208
- import isPlainObject4 from "lodash/isPlainObject";
3209
- import get20 from "lodash/get";
3210
- import difference from "lodash/difference";
3211
- function getChangedFields(a, b) {
3212
- const aIsPlainObject = isPlainObject4(a);
3213
- const bIsPlainObject = isPlainObject4(b);
3214
- if (a === b || !aIsPlainObject && !bIsPlainObject) {
3215
- return [];
3332
+ // src/nameGenerators.ts
3333
+ var bracketNameGenerator = (path, idPrefix, isMultiValue) => {
3334
+ if (!path || path.length === 0) {
3335
+ return idPrefix;
3216
3336
  }
3217
- if (aIsPlainObject && !bIsPlainObject) {
3218
- return keys(a);
3219
- } else if (!aIsPlainObject && bIsPlainObject) {
3220
- return keys(b);
3221
- } else {
3222
- const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get20(b, key))));
3223
- const diffFields = difference(keys(b), keys(a));
3224
- return [...unequalFields, ...diffFields];
3337
+ const baseName = path.reduce((acc, pathUnit, index) => {
3338
+ if (index === 0) {
3339
+ return `${idPrefix}[${String(pathUnit)}]`;
3340
+ }
3341
+ return `${acc}[${String(pathUnit)}]`;
3342
+ }, "");
3343
+ return isMultiValue ? `${baseName}[]` : baseName;
3344
+ };
3345
+ var dotNotationNameGenerator = (path, idPrefix, _isMultiValue) => {
3346
+ if (!path || path.length === 0) {
3347
+ return idPrefix;
3225
3348
  }
3226
- }
3349
+ return `${idPrefix}.${path.map(String).join(".")}`;
3350
+ };
3227
3351
 
3228
3352
  // src/enums.ts
3229
3353
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
@@ -3247,6 +3371,9 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3247
3371
  TranslatableString2["PreviewLabel"] = "Preview";
3248
3372
  TranslatableString2["DecrementAriaLabel"] = "Decrease value by 1";
3249
3373
  TranslatableString2["IncrementAriaLabel"] = "Increase value by 1";
3374
+ TranslatableString2["OptionalObjectAdd"] = "Add data for optional field";
3375
+ TranslatableString2["OptionalObjectRemove"] = "Remove data for optional field";
3376
+ TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
3250
3377
  TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
3251
3378
  TranslatableString2["OptionPrefix"] = "Option %1";
3252
3379
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
@@ -3422,6 +3549,7 @@ export {
3422
3549
  allowAdditionalItems,
3423
3550
  ariaDescribedByIds,
3424
3551
  asNumber,
3552
+ bracketNameGenerator,
3425
3553
  buttonId,
3426
3554
  canExpand,
3427
3555
  createErrorHandler,
@@ -3430,6 +3558,7 @@ export {
3430
3558
  dateRangeOptions,
3431
3559
  deepEquals,
3432
3560
  descriptionId,
3561
+ dotNotationNameGenerator,
3433
3562
  englishStringTranslator,
3434
3563
  enumOptionsDeselectValue,
3435
3564
  enumOptionsIndexForValue,
@@ -3467,8 +3596,10 @@ export {
3467
3596
  isCustomWidget,
3468
3597
  isFilesArray,
3469
3598
  isFixedItems,
3599
+ isFormDataAvailable,
3470
3600
  isMultiSelect,
3471
3601
  isObject,
3602
+ isRootSchema,
3472
3603
  isSelect,
3473
3604
  labelValue,
3474
3605
  localToUTC,
@@ -3477,6 +3608,7 @@ export {
3477
3608
  mergeObjects,
3478
3609
  mergeSchemas,
3479
3610
  optionId,
3611
+ optionalControlsId,
3480
3612
  optionsList,
3481
3613
  orderProperties,
3482
3614
  pad,
@@ -3489,6 +3621,7 @@ export {
3489
3621
  schemaRequiresTrueValue,
3490
3622
  shallowEquals,
3491
3623
  shouldRender,
3624
+ shouldRenderOptionalField,
3492
3625
  sortedJSONStringify,
3493
3626
  titleId,
3494
3627
  toConstant,
@@ -3498,6 +3631,7 @@ export {
3498
3631
  toFieldPathId,
3499
3632
  toPathSchema,
3500
3633
  unwrapErrorHandler,
3634
+ useDeepCompareMemo,
3501
3635
  utcToLocal,
3502
3636
  validationDataMerge,
3503
3637
  withIdRefPrefix