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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/{index.js → index.cjs} +396 -264
  2. package/dist/index.cjs.map +7 -0
  3. package/dist/utils.esm.js +395 -263
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +368 -249
  6. package/lib/ErrorSchemaBuilder.d.ts +2 -2
  7. package/lib/canExpand.d.ts +1 -1
  8. package/lib/constants.d.ts +3 -0
  9. package/lib/constants.js +3 -0
  10. package/lib/constants.js.map +1 -1
  11. package/lib/createSchemaUtils.js +25 -18
  12. package/lib/createSchemaUtils.js.map +1 -1
  13. package/lib/enums.d.ts +9 -3
  14. package/lib/enums.js +9 -3
  15. package/lib/enums.js.map +1 -1
  16. package/lib/findSchemaDefinition.d.ts +7 -1
  17. package/lib/findSchemaDefinition.js +48 -6
  18. package/lib/findSchemaDefinition.js.map +1 -1
  19. package/lib/getTestIds.js +2 -2
  20. package/lib/getTestIds.js.map +1 -1
  21. package/lib/getUiOptions.js +4 -0
  22. package/lib/getUiOptions.js.map +1 -1
  23. package/lib/getWidget.js +3 -3
  24. package/lib/getWidget.js.map +1 -1
  25. package/lib/guessType.d.ts +1 -1
  26. package/lib/idGenerators.d.ts +22 -15
  27. package/lib/idGenerators.js +17 -8
  28. package/lib/idGenerators.js.map +1 -1
  29. package/lib/index.d.ts +10 -4
  30. package/lib/index.js +9 -4
  31. package/lib/index.js.map +1 -1
  32. package/lib/isFormDataAvailable.d.ts +7 -0
  33. package/lib/isFormDataAvailable.js +13 -0
  34. package/lib/isFormDataAvailable.js.map +1 -0
  35. package/lib/isRootSchema.d.ts +13 -0
  36. package/lib/isRootSchema.js +25 -0
  37. package/lib/isRootSchema.js.map +1 -0
  38. package/lib/mergeDefaultsWithFormData.js +14 -2
  39. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  40. package/lib/schema/findFieldInSchema.d.ts +1 -1
  41. package/lib/schema/findFieldInSchema.js +1 -1
  42. package/lib/schema/getDefaultFormState.d.ts +17 -3
  43. package/lib/schema/getDefaultFormState.js +73 -27
  44. package/lib/schema/getDefaultFormState.js.map +1 -1
  45. package/lib/schema/getDisplayLabel.js +2 -2
  46. package/lib/schema/getDisplayLabel.js.map +1 -1
  47. package/lib/schema/index.d.ts +1 -2
  48. package/lib/schema/index.js +1 -2
  49. package/lib/schema/index.js.map +1 -1
  50. package/lib/schema/retrieveSchema.d.ts +11 -6
  51. package/lib/schema/retrieveSchema.js +42 -19
  52. package/lib/schema/retrieveSchema.js.map +1 -1
  53. package/lib/shallowEquals.d.ts +8 -0
  54. package/lib/shallowEquals.js +36 -0
  55. package/lib/shallowEquals.js.map +1 -0
  56. package/lib/shouldRender.d.ts +8 -2
  57. package/lib/shouldRender.js +17 -2
  58. package/lib/shouldRender.js.map +1 -1
  59. package/lib/shouldRenderOptionalField.d.ts +18 -0
  60. package/lib/shouldRenderOptionalField.js +47 -0
  61. package/lib/shouldRenderOptionalField.js.map +1 -0
  62. package/lib/toFieldPathId.d.ts +12 -0
  63. package/lib/toFieldPathId.js +19 -0
  64. package/lib/toFieldPathId.js.map +1 -0
  65. package/lib/tsconfig.tsbuildinfo +1 -1
  66. package/lib/types.d.ts +136 -81
  67. package/lib/validationDataMerge.d.ts +2 -1
  68. package/lib/validationDataMerge.js +3 -2
  69. package/lib/validationDataMerge.js.map +1 -1
  70. package/package.json +13 -14
  71. package/src/ErrorSchemaBuilder.ts +2 -2
  72. package/src/constants.ts +3 -0
  73. package/src/createSchemaUtils.ts +25 -26
  74. package/src/enums.ts +9 -3
  75. package/src/findSchemaDefinition.ts +55 -6
  76. package/src/getTestIds.ts +2 -2
  77. package/src/getUiOptions.ts +4 -0
  78. package/src/getWidget.tsx +3 -3
  79. package/src/idGenerators.ts +35 -25
  80. package/src/index.ts +16 -2
  81. package/src/isFormDataAvailable.ts +13 -0
  82. package/src/isRootSchema.ts +30 -0
  83. package/src/mergeDefaultsWithFormData.ts +16 -2
  84. package/src/schema/findFieldInSchema.ts +1 -1
  85. package/src/schema/getDefaultFormState.ts +95 -33
  86. package/src/schema/getDisplayLabel.ts +2 -2
  87. package/src/schema/index.ts +0 -2
  88. package/src/schema/retrieveSchema.ts +46 -10
  89. package/src/shallowEquals.ts +41 -0
  90. package/src/shouldRender.ts +27 -2
  91. package/src/shouldRenderOptionalField.ts +56 -0
  92. package/src/toFieldPathId.ts +24 -0
  93. package/src/types.ts +156 -84
  94. package/src/validationDataMerge.ts +7 -1
  95. package/dist/index.js.map +0 -7
  96. package/lib/schema/toIdSchema.d.ts +0 -14
  97. package/lib/schema/toIdSchema.js +0 -62
  98. package/lib/schema/toIdSchema.js.map +0 -1
  99. package/src/schema/toIdSchema.ts +0 -131
package/dist/utils.esm.js CHANGED
@@ -66,6 +66,8 @@ var REQUIRED_KEY = "required";
66
66
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
67
67
  var REF_KEY = "$ref";
68
68
  var SCHEMA_KEY = "$schema";
69
+ var DEFAULT_ID_PREFIX = "root";
70
+ var DEFAULT_ID_SEPARATOR = "_";
69
71
  var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
70
72
  var FORM_CONTEXT_NAME = "formContext";
71
73
  var LOOKUP_MAP_NAME = "layoutGridLookupMap";
@@ -75,10 +77,14 @@ var UI_FIELD_KEY = "ui:field";
75
77
  var UI_WIDGET_KEY = "ui:widget";
76
78
  var UI_OPTIONS_KEY = "ui:options";
77
79
  var UI_GLOBAL_OPTIONS_KEY = "ui:globalOptions";
80
+ var JSON_SCHEMA_DRAFT_2019_09 = "https://json-schema.org/draft/2019-09/schema";
78
81
  var JSON_SCHEMA_DRAFT_2020_12 = "https://json-schema.org/draft/2020-12/schema";
79
82
 
80
83
  // src/getUiOptions.ts
81
84
  function getUiOptions(uiSchema = {}, globalOptions = {}) {
85
+ if (!uiSchema) {
86
+ return { ...globalOptions };
87
+ }
82
88
  return Object.keys(uiSchema).filter((key) => key.indexOf("ui:") === 0).reduce(
83
89
  (options, key) => {
84
90
  const value = uiSchema[key];
@@ -148,15 +154,15 @@ function deepEquals(a, b) {
148
154
  }
149
155
 
150
156
  // src/schema/findFieldInSchema.ts
151
- import get7 from "lodash/get";
157
+ import get8 from "lodash/get";
152
158
  import has3 from "lodash/has";
153
159
 
154
160
  // src/schema/findSelectedOptionInXxxOf.ts
155
- import get5 from "lodash/get";
161
+ import get6 from "lodash/get";
156
162
  import isEqual from "lodash/isEqual";
157
163
 
158
164
  // src/schema/retrieveSchema.ts
159
- import get4 from "lodash/get";
165
+ import get5 from "lodash/get";
160
166
  import set from "lodash/set";
161
167
  import times from "lodash/times";
162
168
  import transform from "lodash/transform";
@@ -171,12 +177,22 @@ import omit from "lodash/omit";
171
177
  import isObject2 from "lodash/isObject";
172
178
  import isEmpty from "lodash/isEmpty";
173
179
  import UriResolver from "fast-uri";
180
+ import get from "lodash/get";
174
181
  function findEmbeddedSchemaRecursive(schema, ref) {
175
182
  if (ID_KEY in schema && UriResolver.equal(schema[ID_KEY], ref)) {
176
183
  return schema;
177
184
  }
178
185
  for (const subSchema of Object.values(schema)) {
179
- if (isObject2(subSchema)) {
186
+ if (Array.isArray(subSchema)) {
187
+ for (const item of subSchema) {
188
+ if (isObject2(item)) {
189
+ const result = findEmbeddedSchemaRecursive(item, ref);
190
+ if (result !== void 0) {
191
+ return result;
192
+ }
193
+ }
194
+ }
195
+ } else if (isObject2(subSchema)) {
180
196
  const result = findEmbeddedSchemaRecursive(subSchema, ref);
181
197
  if (result !== void 0) {
182
198
  return result;
@@ -185,12 +201,29 @@ function findEmbeddedSchemaRecursive(schema, ref) {
185
201
  }
186
202
  return void 0;
187
203
  }
204
+ function makeAllReferencesAbsolute(schema, baseURI) {
205
+ const currentURI = get(schema, ID_KEY, baseURI);
206
+ if (REF_KEY in schema) {
207
+ schema = { ...schema, [REF_KEY]: UriResolver.resolve(currentURI, schema[REF_KEY]) };
208
+ }
209
+ for (const [key, subSchema] of Object.entries(schema)) {
210
+ if (Array.isArray(subSchema)) {
211
+ schema = {
212
+ ...schema,
213
+ [key]: subSchema.map((item) => isObject2(item) ? makeAllReferencesAbsolute(item, currentURI) : item)
214
+ };
215
+ } else if (isObject2(subSchema)) {
216
+ schema = { ...schema, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
217
+ }
218
+ }
219
+ return schema;
220
+ }
188
221
  function splitKeyElementFromObject(key, object) {
189
222
  const value = object[key];
190
223
  const remaining = omit(object, [key]);
191
224
  return [remaining, value];
192
225
  }
193
- function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = ID_KEY in rootSchema ? rootSchema[ID_KEY] : void 0) {
226
+ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = get(rootSchema, [ID_KEY])) {
194
227
  const ref = $ref || "";
195
228
  let current = void 0;
196
229
  if (ref.startsWith("#")) {
@@ -230,23 +263,27 @@ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [],
230
263
  const [remaining, theRef] = splitKeyElementFromObject(REF_KEY, current);
231
264
  const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], baseURI);
232
265
  if (Object.keys(remaining).length > 0) {
233
- return { ...remaining, ...subSchema };
266
+ if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2019_09 || rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
267
+ return { [ALL_OF_KEY]: [remaining, subSchema] };
268
+ } else {
269
+ return { ...remaining, ...subSchema };
270
+ }
234
271
  }
235
272
  return subSchema;
236
273
  }
237
274
  return current;
238
275
  }
239
- function findSchemaDefinition($ref, rootSchema = {}, baseURI = ID_KEY in rootSchema ? rootSchema[ID_KEY] : void 0) {
276
+ function findSchemaDefinition($ref, rootSchema = {}, baseURI = get(rootSchema, [ID_KEY])) {
240
277
  const recurseList = [];
241
278
  return findSchemaDefinitionRecursive($ref, rootSchema, recurseList, baseURI);
242
279
  }
243
280
 
244
281
  // src/getDiscriminatorFieldFromSchema.ts
245
- import get from "lodash/get";
282
+ import get2 from "lodash/get";
246
283
  import isString from "lodash/isString";
247
284
  function getDiscriminatorFieldFromSchema(schema) {
248
285
  let discriminator;
249
- const maybeString = get(schema, DISCRIMINATOR_PATH);
286
+ const maybeString = get2(schema, DISCRIMINATOR_PATH);
250
287
  if (isString(maybeString)) {
251
288
  discriminator = maybeString;
252
289
  } else if (maybeString !== void 0) {
@@ -320,21 +357,21 @@ function mergeSchemas(obj1, obj2) {
320
357
  }
321
358
 
322
359
  // src/schema/getFirstMatchingOption.ts
323
- import get3 from "lodash/get";
360
+ import get4 from "lodash/get";
324
361
  import has from "lodash/has";
325
362
  import isNumber from "lodash/isNumber";
326
363
 
327
364
  // src/getOptionMatchingSimpleDiscriminator.ts
328
- import get2 from "lodash/get";
365
+ import get3 from "lodash/get";
329
366
  function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField) {
330
367
  if (formData && discriminatorField) {
331
- const value = get2(formData, discriminatorField);
368
+ const value = get3(formData, discriminatorField);
332
369
  if (value === void 0) {
333
370
  return;
334
371
  }
335
372
  for (let i = 0; i < options.length; i++) {
336
373
  const option = options[i];
337
- const discriminator = get2(option, [PROPERTIES_KEY, discriminatorField], {});
374
+ const discriminator = get3(option, [PROPERTIES_KEY, discriminatorField], {});
338
375
  if (discriminator.type === "object" || discriminator.type === "array") {
339
376
  continue;
340
377
  }
@@ -361,8 +398,8 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
361
398
  for (let i = 0; i < options.length; i++) {
362
399
  const option = options[i];
363
400
  if (discriminatorField && has(option, [PROPERTIES_KEY, discriminatorField])) {
364
- const value = get3(formData, discriminatorField);
365
- const discriminator = get3(option, [PROPERTIES_KEY, discriminatorField], {});
401
+ const value = get4(formData, discriminatorField);
402
+ const discriminator = get4(option, [PROPERTIES_KEY, discriminatorField], {});
366
403
  if (validator.isValid(discriminator, value, rootSchema)) {
367
404
  return i;
368
405
  }
@@ -398,7 +435,7 @@ function getFirstMatchingOption(validator, formData, options, rootSchema, discri
398
435
 
399
436
  // src/schema/retrieveSchema.ts
400
437
  import isEmpty2 from "lodash/isEmpty";
401
- function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
438
+ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs = false) {
402
439
  return retrieveSchemaInternal(
403
440
  validator,
404
441
  schema,
@@ -406,7 +443,8 @@ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experim
406
443
  rawFormData,
407
444
  void 0,
408
445
  void 0,
409
- experimental_customMergeAllOf
446
+ experimental_customMergeAllOf,
447
+ resolveAnyOfOrOneOfRefs
410
448
  )[0];
411
449
  }
412
450
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
@@ -495,14 +533,16 @@ function getMatchingPatternProperties(schema, key) {
495
533
  {}
496
534
  );
497
535
  }
498
- function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
536
+ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
499
537
  const updatedSchemas = resolveReference(
500
538
  validator,
501
539
  schema,
502
540
  rootSchema,
503
541
  expandAllBranches,
504
542
  recurseList,
505
- formData
543
+ formData,
544
+ experimental_customMergeAllOf,
545
+ resolveAnyOfOrOneOfRefs
506
546
  );
507
547
  if (updatedSchemas.length > 1 || updatedSchemas[0] !== schema) {
508
548
  return updatedSchemas;
@@ -514,7 +554,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
514
554
  rootSchema,
515
555
  expandAllBranches,
516
556
  recurseList,
517
- formData
557
+ formData,
558
+ experimental_customMergeAllOf
518
559
  );
519
560
  return resolvedSchemas.flatMap((s) => {
520
561
  return retrieveSchemaInternal(
@@ -528,7 +569,7 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
528
569
  );
529
570
  });
530
571
  }
531
- if (ALL_OF_KEY in schema && Array.isArray(schema.allOf)) {
572
+ if (ALL_OF_KEY in schema && Array.isArray(schema[ALL_OF_KEY])) {
532
573
  const allOfSchemaElements = schema.allOf.map(
533
574
  (allOfSubschema) => retrieveSchemaInternal(
534
575
  validator,
@@ -548,8 +589,8 @@ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurse
548
589
  }
549
590
  return [schema];
550
591
  }
551
- function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
552
- 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);
553
594
  if (updatedSchema !== schema) {
554
595
  return retrieveSchemaInternal(
555
596
  validator,
@@ -558,12 +599,13 @@ function resolveReference(validator, schema, rootSchema, expandAllBranches, recu
558
599
  formData,
559
600
  expandAllBranches,
560
601
  recurseList,
561
- experimental_customMergeAllOf
602
+ experimental_customMergeAllOf,
603
+ resolveAnyOfOrOneOfRefs
562
604
  );
563
605
  }
564
606
  return [schema];
565
607
  }
566
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
608
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
567
609
  if (!isObject(schema)) {
568
610
  return schema;
569
611
  }
@@ -586,7 +628,7 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
586
628
  resolvedSchema[PROPERTIES_KEY],
587
629
  (result, value, key) => {
588
630
  const childList = [...recurseList];
589
- result[key] = resolveAllReferences(value, rootSchema, childList, baseURI);
631
+ result[key] = resolveAllReferences(value, rootSchema, childList, baseURI, resolveAnyOfOrOneOfRefs);
590
632
  childrenLists.push(childList);
591
633
  },
592
634
  {}
@@ -597,9 +639,28 @@ function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
597
639
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
598
640
  resolvedSchema = {
599
641
  ...resolvedSchema,
600
- items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI)
642
+ items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
601
643
  };
602
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
+ }
603
664
  return deepEquals(schema, resolvedSchema) ? schema : resolvedSchema;
604
665
  }
605
666
  function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFormData, experimental_customMergeAllOf) {
@@ -617,9 +678,9 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
617
678
  if (!isEmpty2(matchingProperties)) {
618
679
  schema.properties[key] = retrieveSchema(
619
680
  validator,
620
- { allOf: Object.values(matchingProperties) },
681
+ { [ALL_OF_KEY]: Object.values(matchingProperties) },
621
682
  rootSchema,
622
- formData,
683
+ get5(formData, [key]),
623
684
  experimental_customMergeAllOf
624
685
  );
625
686
  set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -627,12 +688,12 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
627
688
  }
628
689
  }
629
690
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema.additionalProperties !== false) {
630
- let additionalProperties = {};
691
+ let additionalProperties;
631
692
  if (typeof schema.additionalProperties !== "boolean") {
632
693
  if (REF_KEY in schema.additionalProperties) {
633
694
  additionalProperties = retrieveSchema(
634
695
  validator,
635
- { $ref: get4(schema.additionalProperties, [REF_KEY]) },
696
+ { [REF_KEY]: get5(schema.additionalProperties, [REF_KEY]) },
636
697
  rootSchema,
637
698
  formData,
638
699
  experimental_customMergeAllOf
@@ -645,10 +706,10 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
645
706
  ...schema.additionalProperties
646
707
  };
647
708
  } else {
648
- additionalProperties = { type: guessType(get4(formData, [key])) };
709
+ additionalProperties = { type: guessType(get5(formData, [key])) };
649
710
  }
650
711
  } else {
651
- additionalProperties = { type: guessType(get4(formData, [key])) };
712
+ additionalProperties = { type: guessType(get5(formData, [key])) };
652
713
  }
653
714
  schema.properties[key] = additionalProperties;
654
715
  set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -659,7 +720,7 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
659
720
  });
660
721
  return schema;
661
722
  }
662
- function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf) {
723
+ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
663
724
  if (!isObject(schema)) {
664
725
  return [{}];
665
726
  }
@@ -670,7 +731,8 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
670
731
  expandAllBranches,
671
732
  recurseList,
672
733
  rawFormData,
673
- experimental_customMergeAllOf
734
+ experimental_customMergeAllOf,
735
+ resolveAnyOfOrOneOfRefs
674
736
  );
675
737
  return resolvedSchemas.flatMap((s) => {
676
738
  let resolvedSchema = s;
@@ -727,7 +789,7 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
727
789
  validator,
728
790
  { allOf: [schema2.properties[key], ...Object.values(matchingProperties)] },
729
791
  rootSchema,
730
- rawFormData,
792
+ get5(rawFormData, [key]),
731
793
  experimental_customMergeAllOf
732
794
  );
733
795
  }
@@ -799,7 +861,7 @@ function resolveDependencies(validator, schema, rootSchema, expandAllBranches, r
799
861
  function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
800
862
  let schemas = [resolvedSchema];
801
863
  for (const dependencyKey in dependencies) {
802
- if (!expandAllBranches && get4(formData, [dependencyKey]) === void 0) {
864
+ if (!expandAllBranches && get5(formData, [dependencyKey]) === void 0) {
803
865
  continue;
804
866
  }
805
867
  if (resolvedSchema.properties && !(dependencyKey in resolvedSchema.properties)) {
@@ -930,11 +992,11 @@ function findSelectedOptionInXxxOf(validator, rootSchema, schema, fallbackField,
930
992
  const xxxOfs = schema[xxx].map(
931
993
  (xxxOf) => retrieveSchema(validator, xxxOf, rootSchema, formData, experimental_customMergeAllOf)
932
994
  );
933
- const data = get5(formData, selectorField);
995
+ const data = get6(formData, selectorField);
934
996
  if (data !== void 0) {
935
997
  return xxxOfs.find((xxx2) => {
936
998
  return isEqual(
937
- get5(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], get5(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
999
+ get6(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], get6(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
938
1000
  data
939
1001
  );
940
1002
  });
@@ -944,7 +1006,7 @@ function findSelectedOptionInXxxOf(validator, rootSchema, schema, fallbackField,
944
1006
  }
945
1007
 
946
1008
  // src/schema/getFromSchema.ts
947
- import get6 from "lodash/get";
1009
+ import get7 from "lodash/get";
948
1010
  import has2 from "lodash/has";
949
1011
  import isEmpty3 from "lodash/isEmpty";
950
1012
  function getFromSchemaInternal(validator, rootSchema, schema, path, experimental_customMergeAllOf) {
@@ -958,7 +1020,7 @@ function getFromSchemaInternal(validator, rootSchema, schema, path, experimental
958
1020
  const pathList = Array.isArray(path) ? path : path.split(".");
959
1021
  const [part, ...nestedPath] = pathList;
960
1022
  if (part && has2(fieldSchema, part)) {
961
- fieldSchema = get6(fieldSchema, part);
1023
+ fieldSchema = get7(fieldSchema, part);
962
1024
  return getFromSchemaInternal(
963
1025
  validator,
964
1026
  rootSchema,
@@ -1000,7 +1062,7 @@ function findFieldInSchema(validator, rootSchema, schema, path, formData = {}, e
1000
1062
  parentField,
1001
1063
  fieldName,
1002
1064
  ONE_OF_KEY,
1003
- get7(formData, subPath),
1065
+ get8(formData, subPath),
1004
1066
  experimental_customMergeAllOf
1005
1067
  );
1006
1068
  } else if (has3(parentField, ANY_OF_KEY)) {
@@ -1010,7 +1072,7 @@ function findFieldInSchema(validator, rootSchema, schema, path, formData = {}, e
1010
1072
  parentField,
1011
1073
  fieldName,
1012
1074
  ANY_OF_KEY,
1013
- get7(formData, subPath),
1075
+ get8(formData, subPath),
1014
1076
  experimental_customMergeAllOf
1015
1077
  );
1016
1078
  }
@@ -1064,11 +1126,11 @@ function findFieldInSchema(validator, rootSchema, schema, path, formData = {}, e
1064
1126
  }
1065
1127
 
1066
1128
  // src/schema/getDefaultFormState.ts
1067
- import get11 from "lodash/get";
1129
+ import get12 from "lodash/get";
1068
1130
  import isEmpty4 from "lodash/isEmpty";
1069
1131
 
1070
1132
  // src/schema/getClosestMatchingOption.ts
1071
- import get8 from "lodash/get";
1133
+ import get9 from "lodash/get";
1072
1134
  import has4 from "lodash/has";
1073
1135
  import isNumber2 from "lodash/isNumber";
1074
1136
  import isObject3 from "lodash/isObject";
@@ -1091,7 +1153,7 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
1091
1153
  totalScore += reduce(
1092
1154
  schema.properties,
1093
1155
  (score, value, key) => {
1094
- const formValue = get8(formData, key);
1156
+ const formValue = get9(formData, key);
1095
1157
  if (typeof value === "boolean") {
1096
1158
  return score;
1097
1159
  }
@@ -1118,7 +1180,7 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
1118
1180
  validator,
1119
1181
  rootSchema,
1120
1182
  formValue,
1121
- get8(value, key2),
1183
+ get9(value, key2),
1122
1184
  -1,
1123
1185
  discriminator,
1124
1186
  experimental_customMergeAllOf
@@ -1197,7 +1259,7 @@ function isFixedItems(schema) {
1197
1259
  }
1198
1260
 
1199
1261
  // src/mergeDefaultsWithFormData.ts
1200
- import get9 from "lodash/get";
1262
+ import get10 from "lodash/get";
1201
1263
  import isNil from "lodash/isNil";
1202
1264
  function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false, defaultSupercedesUndefined = false, overrideFormDataWithDefaults = false) {
1203
1265
  if (Array.isArray(formData)) {
@@ -1224,11 +1286,22 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1224
1286
  if (isObject(formData)) {
1225
1287
  const acc = Object.assign({}, defaults);
1226
1288
  return Object.keys(formData).reduce((acc2, key) => {
1227
- const keyValue = get9(formData, key);
1289
+ const keyValue = get10(formData, key);
1228
1290
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1229
1291
  const keyExistsInFormData = key in formData;
1292
+ const keyDefault = get10(defaults, key) ?? {};
1293
+ const defaultValueIsNestedObject = keyExistsInDefaults && Object.entries(keyDefault).some(([, v]) => isObject(v));
1294
+ const keyDefaultIsObject = keyExistsInDefaults && isObject(get10(defaults, key));
1295
+ const keyHasFormDataObject = keyExistsInFormData && isObject(keyValue);
1296
+ if (keyDefaultIsObject && keyHasFormDataObject && !defaultValueIsNestedObject) {
1297
+ acc2[key] = {
1298
+ ...get10(defaults, key),
1299
+ ...keyValue
1300
+ };
1301
+ return acc2;
1302
+ }
1230
1303
  acc2[key] = mergeDefaultsWithFormData(
1231
- defaults ? get9(defaults, key) : {},
1304
+ get10(defaults, key),
1232
1305
  keyValue,
1233
1306
  mergeExtraArrayDefaults,
1234
1307
  defaultSupercedesUndefined,
@@ -1239,7 +1312,7 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1239
1312
  return acc2;
1240
1313
  }, acc);
1241
1314
  }
1242
- if (defaultSupercedesUndefined && (!isNil(defaults) && isNil(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !isNil(formData)) {
1315
+ if (defaultSupercedesUndefined && (!(defaults === void 0) && isNil(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !isNil(formData)) {
1243
1316
  return defaults;
1244
1317
  }
1245
1318
  return formData;
@@ -1307,7 +1380,7 @@ function constIsAjvDataReference(schema) {
1307
1380
  }
1308
1381
 
1309
1382
  // src/optionsList.ts
1310
- import get10 from "lodash/get";
1383
+ import get11 from "lodash/get";
1311
1384
 
1312
1385
  // src/toConstant.ts
1313
1386
  function toConstant(schema) {
@@ -1353,8 +1426,8 @@ function optionsList(schema, uiSchema) {
1353
1426
  let value;
1354
1427
  let label = title;
1355
1428
  if (selectorField) {
1356
- const innerSchema = get10(aSchema, [PROPERTIES_KEY, selectorField], {});
1357
- value = get10(innerSchema, DEFAULT_KEY, get10(innerSchema, CONST_KEY));
1429
+ const innerSchema = get11(aSchema, [PROPERTIES_KEY, selectorField], {});
1430
+ value = get11(innerSchema, DEFAULT_KEY, get11(innerSchema, CONST_KEY));
1358
1431
  label = label || innerSchema?.title || aSchema.title || String(value);
1359
1432
  } else {
1360
1433
  value = toConstant(aSchema);
@@ -1386,10 +1459,19 @@ function getInnerSchemaForArrayItem(schema, additionalItems = 0 /* Ignore */, id
1386
1459
  }
1387
1460
  return {};
1388
1461
  }
1462
+ function computeDefaultBasedOnSchemaTypeAndDefaults(schema, computedDefault) {
1463
+ const { default: schemaDefault, type } = schema;
1464
+ const shouldReturnNullAsDefault = Array.isArray(type) && type.includes("null") && isEmpty4(computedDefault) && schemaDefault === null;
1465
+ return shouldReturnNullAsDefault ? null : computedDefault;
1466
+ }
1389
1467
  function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
1390
1468
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1391
- if (includeUndefinedValues || isConst) {
1469
+ if (includeUndefinedValues === true || isConst) {
1392
1470
  obj[key] = computedDefault;
1471
+ } else if (includeUndefinedValues === "excludeObjectChildren") {
1472
+ if (!isObject(computedDefault) || !isEmpty4(computedDefault)) {
1473
+ obj[key] = computedDefault;
1474
+ }
1393
1475
  } else if (emptyObjectFields !== "skipDefaults") {
1394
1476
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1395
1477
  if (isObject(computedDefault)) {
@@ -1421,15 +1503,16 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1421
1503
  experimental_defaultFormStateBehavior = void 0,
1422
1504
  experimental_customMergeAllOf = void 0,
1423
1505
  required,
1424
- shouldMergeDefaultsIntoFormData = false
1506
+ shouldMergeDefaultsIntoFormData = false,
1507
+ initialDefaultsGenerated
1425
1508
  } = computeDefaultsProps;
1426
- const formData = isObject(rawFormData) ? rawFormData : {};
1509
+ let formData = isObject(rawFormData) ? rawFormData : {};
1427
1510
  const schema = isObject(rawSchema) ? rawSchema : {};
1428
1511
  let defaults = parentDefaults;
1429
1512
  let schemaToCompute = null;
1430
1513
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1431
1514
  let updatedRecurseList = _recurseList;
1432
- if (schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1515
+ if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1433
1516
  defaults = schema[CONST_KEY];
1434
1517
  } else if (isObject(defaults) && isObject(schema.default)) {
1435
1518
  defaults = mergeObjects(defaults, schema.default);
@@ -1444,6 +1527,9 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1444
1527
  if (schemaToCompute && !defaults) {
1445
1528
  defaults = schema.default;
1446
1529
  }
1530
+ if (shouldMergeDefaultsIntoFormData && schemaToCompute && !isObject(rawFormData)) {
1531
+ formData = rawFormData;
1532
+ }
1447
1533
  } else if (DEPENDENCIES_KEY in schema) {
1448
1534
  const defaultFormData = {
1449
1535
  ...getDefaultBasedOnSchemaType(validator, schema, computeDefaultsProps, defaults),
@@ -1521,9 +1607,10 @@ function computeDefaults(validator, rawSchema, computeDefaultsProps = {}) {
1521
1607
  experimental_defaultFormStateBehavior: experimental_dfsb_to_compute,
1522
1608
  experimental_customMergeAllOf,
1523
1609
  parentDefaults: defaults,
1524
- rawFormData: formData,
1610
+ rawFormData: rawFormData ?? formData,
1525
1611
  required,
1526
- shouldMergeDefaultsIntoFormData
1612
+ shouldMergeDefaultsIntoFormData,
1613
+ initialDefaultsGenerated
1527
1614
  });
1528
1615
  }
1529
1616
  if (defaults === void 0) {
@@ -1575,7 +1662,8 @@ function getObjectDefaults(validator, rawSchema, {
1575
1662
  experimental_defaultFormStateBehavior = void 0,
1576
1663
  experimental_customMergeAllOf = void 0,
1577
1664
  required,
1578
- shouldMergeDefaultsIntoFormData
1665
+ shouldMergeDefaultsIntoFormData,
1666
+ initialDefaultsGenerated
1579
1667
  } = {}, defaults) {
1580
1668
  {
1581
1669
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1584,7 +1672,7 @@ function getObjectDefaults(validator, rawSchema, {
1584
1672
  const parentConst = retrievedSchema[CONST_KEY];
1585
1673
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
1586
1674
  (acc, key) => {
1587
- const propertySchema = get11(retrievedSchema, [PROPERTIES_KEY, key], {});
1675
+ const propertySchema = get12(retrievedSchema, [PROPERTIES_KEY, key], {});
1588
1676
  const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1589
1677
  const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(propertySchema);
1590
1678
  const computedDefault = computeDefaults(validator, propertySchema, {
@@ -1593,10 +1681,11 @@ function getObjectDefaults(validator, rawSchema, {
1593
1681
  experimental_defaultFormStateBehavior,
1594
1682
  experimental_customMergeAllOf,
1595
1683
  includeUndefinedValues: includeUndefinedValues === true,
1596
- parentDefaults: get11(defaults, [key]),
1597
- rawFormData: get11(formData, [key]),
1684
+ parentDefaults: get12(defaults, [key]),
1685
+ rawFormData: get12(formData, [key]),
1598
1686
  required: retrievedSchema.required?.includes(key),
1599
- shouldMergeDefaultsIntoFormData
1687
+ shouldMergeDefaultsIntoFormData,
1688
+ initialDefaultsGenerated
1600
1689
  });
1601
1690
  maybeAddDefaultToObject(
1602
1691
  acc,
@@ -1612,7 +1701,7 @@ function getObjectDefaults(validator, rawSchema, {
1612
1701
  },
1613
1702
  {}
1614
1703
  );
1615
- if (retrievedSchema.additionalProperties) {
1704
+ if (retrievedSchema.additionalProperties && !initialDefaultsGenerated) {
1616
1705
  const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties) ? retrievedSchema.additionalProperties : {};
1617
1706
  const keys2 = /* @__PURE__ */ new Set();
1618
1707
  if (isObject(defaults)) {
@@ -1630,10 +1719,11 @@ function getObjectDefaults(validator, rawSchema, {
1630
1719
  experimental_defaultFormStateBehavior,
1631
1720
  experimental_customMergeAllOf,
1632
1721
  includeUndefinedValues: includeUndefinedValues === true,
1633
- parentDefaults: get11(defaults, [key]),
1634
- rawFormData: get11(formData, [key]),
1722
+ parentDefaults: get12(defaults, [key]),
1723
+ rawFormData: get12(formData, [key]),
1635
1724
  required: retrievedSchema.required?.includes(key),
1636
- shouldMergeDefaultsIntoFormData
1725
+ shouldMergeDefaultsIntoFormData,
1726
+ initialDefaultsGenerated
1637
1727
  });
1638
1728
  maybeAddDefaultToObject(
1639
1729
  objectDefaults,
@@ -1645,7 +1735,7 @@ function getObjectDefaults(validator, rawSchema, {
1645
1735
  );
1646
1736
  });
1647
1737
  }
1648
- return objectDefaults;
1738
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, objectDefaults);
1649
1739
  }
1650
1740
  }
1651
1741
  function getArrayDefaults(validator, rawSchema, {
@@ -1655,7 +1745,9 @@ function getArrayDefaults(validator, rawSchema, {
1655
1745
  experimental_defaultFormStateBehavior = void 0,
1656
1746
  experimental_customMergeAllOf = void 0,
1657
1747
  required,
1658
- shouldMergeDefaultsIntoFormData
1748
+ requiredAsRoot = false,
1749
+ shouldMergeDefaultsIntoFormData,
1750
+ initialDefaultsGenerated
1659
1751
  } = {}, defaults) {
1660
1752
  const schema = rawSchema;
1661
1753
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
@@ -1676,7 +1768,8 @@ function getArrayDefaults(validator, rawSchema, {
1676
1768
  experimental_customMergeAllOf,
1677
1769
  parentDefaults: item,
1678
1770
  required,
1679
- shouldMergeDefaultsIntoFormData
1771
+ shouldMergeDefaultsIntoFormData,
1772
+ initialDefaultsGenerated
1680
1773
  });
1681
1774
  });
1682
1775
  }
@@ -1692,9 +1785,10 @@ function getArrayDefaults(validator, rawSchema, {
1692
1785
  experimental_defaultFormStateBehavior,
1693
1786
  experimental_customMergeAllOf,
1694
1787
  rawFormData: item,
1695
- parentDefaults: get11(defaults, [idx]),
1788
+ parentDefaults: get12(defaults, [idx]),
1696
1789
  required,
1697
- shouldMergeDefaultsIntoFormData
1790
+ shouldMergeDefaultsIntoFormData,
1791
+ initialDefaultsGenerated
1698
1792
  });
1699
1793
  });
1700
1794
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
@@ -1710,25 +1804,29 @@ function getArrayDefaults(validator, rawSchema, {
1710
1804
  return defaults ? defaults : void 0;
1711
1805
  }
1712
1806
  }
1807
+ let arrayDefault;
1713
1808
  const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1714
1809
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
1715
- return defaults ? defaults : emptyDefault;
1716
- }
1717
- const defaultEntries = defaults || [];
1718
- const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1719
- const fillerDefault = fillerSchema.default;
1720
- const fillerEntries = new Array(schema.minItems - defaultsLength).fill(
1721
- computeDefaults(validator, fillerSchema, {
1722
- parentDefaults: fillerDefault,
1723
- rootSchema,
1724
- _recurseList,
1725
- experimental_defaultFormStateBehavior,
1726
- experimental_customMergeAllOf,
1727
- required,
1728
- shouldMergeDefaultsIntoFormData
1729
- })
1730
- );
1731
- return defaultEntries.concat(fillerEntries);
1810
+ arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
1811
+ } else {
1812
+ const defaultEntries = defaults || [];
1813
+ const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1814
+ const fillerDefault = fillerSchema.default;
1815
+ const fillerEntries = Array.from(
1816
+ { length: schema.minItems - defaultsLength },
1817
+ () => computeDefaults(validator, fillerSchema, {
1818
+ parentDefaults: fillerDefault,
1819
+ rootSchema,
1820
+ _recurseList,
1821
+ experimental_defaultFormStateBehavior,
1822
+ experimental_customMergeAllOf,
1823
+ required,
1824
+ shouldMergeDefaultsIntoFormData
1825
+ })
1826
+ );
1827
+ arrayDefault = defaultEntries.concat(fillerEntries);
1828
+ }
1829
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, arrayDefault);
1732
1830
  }
1733
1831
  function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps = {}, defaults) {
1734
1832
  switch (getSchemaType(rawSchema)) {
@@ -1741,7 +1839,7 @@ function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps
1741
1839
  }
1742
1840
  }
1743
1841
  }
1744
- 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) {
1745
1843
  if (!isObject(theSchema)) {
1746
1844
  throw new Error("Invalid schema: " + theSchema);
1747
1845
  }
@@ -1752,8 +1850,16 @@ function getDefaultFormState(validator, theSchema, formData, rootSchema, include
1752
1850
  experimental_defaultFormStateBehavior,
1753
1851
  experimental_customMergeAllOf,
1754
1852
  rawFormData: formData,
1755
- shouldMergeDefaultsIntoFormData: true
1853
+ shouldMergeDefaultsIntoFormData: true,
1854
+ initialDefaultsGenerated,
1855
+ requiredAsRoot: true
1756
1856
  });
1857
+ if (schema.type !== "object" && isObject(schema.default)) {
1858
+ return {
1859
+ ...defaults,
1860
+ ...formData
1861
+ };
1862
+ }
1757
1863
  if (isObject(formData) || Array.isArray(formData)) {
1758
1864
  const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
1759
1865
  const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
@@ -1810,17 +1916,17 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
1810
1916
  if (schemaType === "object") {
1811
1917
  displayLabel = false;
1812
1918
  }
1813
- if (schemaType === "boolean" && !uiSchema[UI_WIDGET_KEY]) {
1919
+ if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
1814
1920
  displayLabel = false;
1815
1921
  }
1816
- if (uiSchema[UI_FIELD_KEY]) {
1922
+ if (uiSchema && uiSchema[UI_FIELD_KEY]) {
1817
1923
  displayLabel = false;
1818
1924
  }
1819
1925
  return displayLabel;
1820
1926
  }
1821
1927
 
1822
1928
  // src/schema/sanitizeDataForNewSchema.ts
1823
- import get12 from "lodash/get";
1929
+ import get13 from "lodash/get";
1824
1930
  import has5 from "lodash/has";
1825
1931
  var NO_VALUE = Symbol("no Value");
1826
1932
  function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, data = {}, experimental_customMergeAllOf) {
@@ -1828,19 +1934,19 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1828
1934
  if (has5(newSchema, PROPERTIES_KEY)) {
1829
1935
  const removeOldSchemaData = {};
1830
1936
  if (has5(oldSchema, PROPERTIES_KEY)) {
1831
- const properties = get12(oldSchema, PROPERTIES_KEY, {});
1937
+ const properties = get13(oldSchema, PROPERTIES_KEY, {});
1832
1938
  Object.keys(properties).forEach((key) => {
1833
1939
  if (has5(data, key)) {
1834
1940
  removeOldSchemaData[key] = void 0;
1835
1941
  }
1836
1942
  });
1837
1943
  }
1838
- const keys2 = Object.keys(get12(newSchema, PROPERTIES_KEY, {}));
1944
+ const keys2 = Object.keys(get13(newSchema, PROPERTIES_KEY, {}));
1839
1945
  const nestedData = {};
1840
1946
  keys2.forEach((key) => {
1841
- const formValue = get12(data, key);
1842
- let oldKeyedSchema = get12(oldSchema, [PROPERTIES_KEY, key], {});
1843
- let newKeyedSchema = get12(newSchema, [PROPERTIES_KEY, key], {});
1947
+ const formValue = get13(data, key);
1948
+ let oldKeyedSchema = get13(oldSchema, [PROPERTIES_KEY, key], {});
1949
+ let newKeyedSchema = get13(newSchema, [PROPERTIES_KEY, key], {});
1844
1950
  if (has5(oldKeyedSchema, REF_KEY)) {
1845
1951
  oldKeyedSchema = retrieveSchema(
1846
1952
  validator,
@@ -1859,8 +1965,8 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1859
1965
  experimental_customMergeAllOf
1860
1966
  );
1861
1967
  }
1862
- const oldSchemaTypeForKey = get12(oldKeyedSchema, "type");
1863
- const newSchemaTypeForKey = get12(newKeyedSchema, "type");
1968
+ const oldSchemaTypeForKey = get13(oldKeyedSchema, "type");
1969
+ const newSchemaTypeForKey = get13(newKeyedSchema, "type");
1864
1970
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
1865
1971
  if (has5(removeOldSchemaData, key)) {
1866
1972
  delete removeOldSchemaData[key];
@@ -1878,17 +1984,17 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1878
1984
  nestedData[key] = itemData;
1879
1985
  }
1880
1986
  } else {
1881
- const newOptionDefault = get12(newKeyedSchema, "default", NO_VALUE);
1882
- const oldOptionDefault = get12(oldKeyedSchema, "default", NO_VALUE);
1987
+ const newOptionDefault = get13(newKeyedSchema, "default", NO_VALUE);
1988
+ const oldOptionDefault = get13(oldKeyedSchema, "default", NO_VALUE);
1883
1989
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
1884
1990
  if (oldOptionDefault === formValue) {
1885
1991
  removeOldSchemaData[key] = newOptionDefault;
1886
- } else if (get12(newKeyedSchema, "readOnly") === true) {
1992
+ } else if (get13(newKeyedSchema, "readOnly") === true) {
1887
1993
  removeOldSchemaData[key] = void 0;
1888
1994
  }
1889
1995
  }
1890
- const newOptionConst = get12(newKeyedSchema, "const", NO_VALUE);
1891
- const oldOptionConst = get12(oldKeyedSchema, "const", NO_VALUE);
1996
+ const newOptionConst = get13(newKeyedSchema, "const", NO_VALUE);
1997
+ const oldOptionConst = get13(oldKeyedSchema, "const", NO_VALUE);
1892
1998
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
1893
1999
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
1894
2000
  }
@@ -1900,9 +2006,9 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1900
2006
  ...removeOldSchemaData,
1901
2007
  ...nestedData
1902
2008
  };
1903
- } else if (get12(oldSchema, "type") === "array" && get12(newSchema, "type") === "array" && Array.isArray(data)) {
1904
- let oldSchemaItems = get12(oldSchema, "items");
1905
- let newSchemaItems = get12(newSchema, "items");
2009
+ } else if (get13(oldSchema, "type") === "array" && get13(newSchema, "type") === "array" && Array.isArray(data)) {
2010
+ let oldSchemaItems = get13(oldSchema, "items");
2011
+ let newSchemaItems = get13(newSchema, "items");
1906
2012
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
1907
2013
  if (has5(oldSchemaItems, REF_KEY)) {
1908
2014
  oldSchemaItems = retrieveSchema(
@@ -1922,10 +2028,10 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1922
2028
  experimental_customMergeAllOf
1923
2029
  );
1924
2030
  }
1925
- const oldSchemaType = get12(oldSchemaItems, "type");
1926
- const newSchemaType = get12(newSchemaItems, "type");
2031
+ const oldSchemaType = get13(oldSchemaItems, "type");
2032
+ const newSchemaType = get13(newSchemaItems, "type");
1927
2033
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
1928
- const maxItems = get12(newSchema, "maxItems", -1);
2034
+ const maxItems = get13(newSchema, "maxItems", -1);
1929
2035
  if (newSchemaType === "object") {
1930
2036
  newFormData = data.reduce((newValue, aValue) => {
1931
2037
  const itemValue = sanitizeDataForNewSchema(
@@ -1952,78 +2058,6 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1952
2058
  return newFormData;
1953
2059
  }
1954
2060
 
1955
- // src/schema/toIdSchema.ts
1956
- import get13 from "lodash/get";
1957
- function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1958
- const $id = id || idPrefix;
1959
- const idSchema = { $id };
1960
- if (typeof schema === "object") {
1961
- if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1962
- const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
1963
- const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
1964
- if (sameSchemaIndex === -1) {
1965
- return toIdSchemaInternal(
1966
- validator,
1967
- _schema,
1968
- idPrefix,
1969
- idSeparator,
1970
- id,
1971
- rootSchema,
1972
- formData,
1973
- _recurseList.concat(_schema),
1974
- experimental_customMergeAllOf
1975
- );
1976
- }
1977
- }
1978
- if (ITEMS_KEY in schema && !get13(schema, [ITEMS_KEY, REF_KEY])) {
1979
- return toIdSchemaInternal(
1980
- validator,
1981
- get13(schema, ITEMS_KEY),
1982
- idPrefix,
1983
- idSeparator,
1984
- id,
1985
- rootSchema,
1986
- formData,
1987
- _recurseList,
1988
- experimental_customMergeAllOf
1989
- );
1990
- }
1991
- if (getSchemaType(schema) === "object" && PROPERTIES_KEY in schema) {
1992
- for (const name in schema.properties) {
1993
- const field = schema[PROPERTIES_KEY][name];
1994
- const fieldId = idSchema[ID_KEY] + idSeparator + name;
1995
- idSchema[name] = toIdSchemaInternal(
1996
- validator,
1997
- field,
1998
- idPrefix,
1999
- idSeparator,
2000
- fieldId,
2001
- rootSchema,
2002
- // It's possible that formData is not an object -- this can happen if an
2003
- // array item has just been added, but not populated with data yet
2004
- get13(formData, [name]),
2005
- _recurseList,
2006
- experimental_customMergeAllOf
2007
- );
2008
- }
2009
- }
2010
- }
2011
- return idSchema;
2012
- }
2013
- function toIdSchema(validator, schema, id, rootSchema, formData, idPrefix = "root", idSeparator = "_", experimental_customMergeAllOf) {
2014
- return toIdSchemaInternal(
2015
- validator,
2016
- schema,
2017
- idPrefix,
2018
- idSeparator,
2019
- id,
2020
- rootSchema,
2021
- formData,
2022
- void 0,
2023
- experimental_customMergeAllOf
2024
- );
2025
- }
2026
-
2027
2061
  // src/schema/toPathSchema.ts
2028
2062
  import get14 from "lodash/get";
2029
2063
  import set2 from "lodash/set";
@@ -2139,6 +2173,7 @@ function toPathSchema(validator, schema, name = "", rootSchema, formData, experi
2139
2173
  }
2140
2174
 
2141
2175
  // src/createSchemaUtils.ts
2176
+ import get15 from "lodash/get";
2142
2177
  var SchemaUtils = class {
2143
2178
  /** Constructs the `SchemaUtils` instance with the given `validator` and `rootSchema` stored as instance variables
2144
2179
  *
@@ -2148,11 +2183,22 @@ var SchemaUtils = class {
2148
2183
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2149
2184
  */
2150
2185
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2151
- this.rootSchema = rootSchema;
2186
+ if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2187
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, get15(rootSchema, ID_KEY, "#"));
2188
+ } else {
2189
+ this.rootSchema = rootSchema;
2190
+ }
2152
2191
  this.validator = validator;
2153
2192
  this.experimental_defaultFormStateBehavior = experimental_defaultFormStateBehavior;
2154
2193
  this.experimental_customMergeAllOf = experimental_customMergeAllOf;
2155
2194
  }
2195
+ /** Returns the `rootSchema` in the `SchemaUtilsType`
2196
+ *
2197
+ * @returns - The `rootSchema`
2198
+ */
2199
+ getRootSchema() {
2200
+ return this.rootSchema;
2201
+ }
2156
2202
  /** Returns the `ValidatorType` in the `SchemaUtilsType`
2157
2203
  *
2158
2204
  * @returns - The `ValidatorType`
@@ -2225,9 +2271,10 @@ var SchemaUtils = class {
2225
2271
  * @param [includeUndefinedValues=false] - Optional flag, if true, cause undefined values to be added as defaults.
2226
2272
  * If "excludeObjectChildren", pass `includeUndefinedValues` as false when computing defaults for any nested
2227
2273
  * object properties.
2274
+ * @param initialDefaultsGenerated - Indicates whether or not initial defaults have been generated
2228
2275
  * @returns - The resulting `formData` with all the defaults provided
2229
2276
  */
2230
- getDefaultFormState(schema, formData, includeUndefinedValues = false) {
2277
+ getDefaultFormState(schema, formData, includeUndefinedValues = false, initialDefaultsGenerated) {
2231
2278
  return getDefaultFormState(
2232
2279
  this.validator,
2233
2280
  schema,
@@ -2235,7 +2282,8 @@ var SchemaUtils = class {
2235
2282
  this.rootSchema,
2236
2283
  includeUndefinedValues,
2237
2284
  this.experimental_defaultFormStateBehavior,
2238
- this.experimental_customMergeAllOf
2285
+ this.experimental_customMergeAllOf,
2286
+ initialDefaultsGenerated
2239
2287
  );
2240
2288
  }
2241
2289
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
@@ -2334,15 +2382,17 @@ var SchemaUtils = class {
2334
2382
  *
2335
2383
  * @param schema - The schema for which retrieving a schema is desired
2336
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
2337
2386
  * @returns - The schema having its conditions, additional properties, references and dependencies resolved
2338
2387
  */
2339
- retrieveSchema(schema, rawFormData) {
2388
+ retrieveSchema(schema, rawFormData, resolveAnyOfOrOneOfRefs) {
2340
2389
  return retrieveSchema(
2341
2390
  this.validator,
2342
2391
  schema,
2343
2392
  this.rootSchema,
2344
2393
  rawFormData,
2345
- this.experimental_customMergeAllOf
2394
+ this.experimental_customMergeAllOf,
2395
+ resolveAnyOfOrOneOfRefs
2346
2396
  );
2347
2397
  }
2348
2398
  /** Sanitize the `data` associated with the `oldSchema` so it is considered appropriate for the `newSchema`. If the
@@ -2366,27 +2416,6 @@ var SchemaUtils = class {
2366
2416
  this.experimental_customMergeAllOf
2367
2417
  );
2368
2418
  }
2369
- /** Generates an `IdSchema` object for the `schema`, recursively
2370
- *
2371
- * @param schema - The schema for which the display label flag is desired
2372
- * @param [id] - The base id for the schema
2373
- * @param [formData] - The current formData, if any, onto which to provide any missing defaults
2374
- * @param [idPrefix='root'] - The prefix to use for the id
2375
- * @param [idSeparator='_'] - The separator to use for the path segments in the id
2376
- * @returns - The `IdSchema` object for the `schema`
2377
- */
2378
- toIdSchema(schema, id, formData, idPrefix = "root", idSeparator = "_") {
2379
- return toIdSchema(
2380
- this.validator,
2381
- schema,
2382
- id,
2383
- this.rootSchema,
2384
- formData,
2385
- idPrefix,
2386
- idSeparator,
2387
- this.experimental_customMergeAllOf
2388
- );
2389
- }
2390
2419
  /** Generates an `PathSchema` object for the `schema`, recursively
2391
2420
  *
2392
2421
  * @param schema - The schema for which the display label flag is desired
@@ -2472,6 +2501,31 @@ function dateRangeOptions(start, stop) {
2472
2501
  return options;
2473
2502
  }
2474
2503
 
2504
+ // src/shallowEquals.ts
2505
+ function shallowEquals(a, b) {
2506
+ if (Object.is(a, b)) {
2507
+ return true;
2508
+ }
2509
+ if (a == null || b == null) {
2510
+ return false;
2511
+ }
2512
+ if (typeof a !== "object" || typeof b !== "object") {
2513
+ return false;
2514
+ }
2515
+ const keysA = Object.keys(a);
2516
+ const keysB = Object.keys(b);
2517
+ if (keysA.length !== keysB.length) {
2518
+ return false;
2519
+ }
2520
+ for (let i = 0; i < keysA.length; i++) {
2521
+ const key = keysA[i];
2522
+ if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {
2523
+ return false;
2524
+ }
2525
+ }
2526
+ return true;
2527
+ }
2528
+
2475
2529
  // src/replaceStringParameters.ts
2476
2530
  function replaceStringParameters(inputString, params) {
2477
2531
  let output = inputString;
@@ -2544,7 +2598,7 @@ function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2544
2598
 
2545
2599
  // src/ErrorSchemaBuilder.ts
2546
2600
  import cloneDeep from "lodash/cloneDeep";
2547
- import get15 from "lodash/get";
2601
+ import get16 from "lodash/get";
2548
2602
  import set3 from "lodash/set";
2549
2603
  import setWith from "lodash/setWith";
2550
2604
  var ErrorSchemaBuilder = class {
@@ -2573,7 +2627,7 @@ var ErrorSchemaBuilder = class {
2573
2627
  */
2574
2628
  getOrCreateErrorBlock(pathOfError) {
2575
2629
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2576
- let errorBlock = hasPath ? get15(this.errorSchema, pathOfError) : this.errorSchema;
2630
+ let errorBlock = hasPath ? get16(this.errorSchema, pathOfError) : this.errorSchema;
2577
2631
  if (!errorBlock && pathOfError) {
2578
2632
  errorBlock = {};
2579
2633
  setWith(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2599,7 +2653,7 @@ var ErrorSchemaBuilder = class {
2599
2653
  */
2600
2654
  addErrors(errorOrList, pathOfError) {
2601
2655
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2602
- let errorsList = get15(errorBlock, ERRORS_KEY);
2656
+ let errorsList = get16(errorBlock, ERRORS_KEY);
2603
2657
  if (!Array.isArray(errorsList)) {
2604
2658
  errorsList = [];
2605
2659
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2639,6 +2693,29 @@ var ErrorSchemaBuilder = class {
2639
2693
  }
2640
2694
  };
2641
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
+
2642
2719
  // src/getDateElementProps.ts
2643
2720
  function getDateElementProps(date, time, yearRange = [1900, (/* @__PURE__ */ new Date()).getFullYear() + 2], format = "YMD") {
2644
2721
  const { day, month, year, hour, minute, second } = date;
@@ -2747,10 +2824,10 @@ function getTemplate(name, registry, uiOptions = {}) {
2747
2824
  }
2748
2825
 
2749
2826
  // src/getTestIds.ts
2750
- import { nanoid } from "nanoid";
2751
- import get16 from "lodash/get";
2827
+ import get18 from "lodash/get";
2828
+ import uniqueId from "lodash/uniqueId";
2752
2829
  function getTestIds() {
2753
- if (typeof process === "undefined" || get16(process, "env.NODE_ENV") !== "test") {
2830
+ if (typeof process === "undefined" || get18(process, "env.NODE_ENV") !== "test") {
2754
2831
  return {};
2755
2832
  }
2756
2833
  const ids = /* @__PURE__ */ new Map();
@@ -2759,7 +2836,7 @@ function getTestIds() {
2759
2836
  {
2760
2837
  get(_obj, prop) {
2761
2838
  if (!ids.has(prop)) {
2762
- ids.set(prop, nanoid());
2839
+ ids.set(prop, uniqueId("test-id-"));
2763
2840
  }
2764
2841
  return ids.get(prop);
2765
2842
  }
@@ -2770,7 +2847,7 @@ function getTestIds() {
2770
2847
  // src/getWidget.tsx
2771
2848
  import { createElement } from "react";
2772
2849
  import ReactIs from "react-is";
2773
- import get17 from "lodash/get";
2850
+ import get19 from "lodash/get";
2774
2851
  import set4 from "lodash/set";
2775
2852
  import { jsx } from "react/jsx-runtime";
2776
2853
  var widgetMap = {
@@ -2826,7 +2903,7 @@ var widgetMap = {
2826
2903
  }
2827
2904
  };
2828
2905
  function mergeWidgetOptions(AWidget) {
2829
- let MergedWidget = get17(AWidget, "MergedWidget");
2906
+ let MergedWidget = get19(AWidget, "MergedWidget");
2830
2907
  if (!MergedWidget) {
2831
2908
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
2832
2909
  MergedWidget = ({ options, ...props }) => {
@@ -2842,7 +2919,7 @@ function getWidget(schema, widget, registeredWidgets = {}) {
2842
2919
  return mergeWidgetOptions(widget);
2843
2920
  }
2844
2921
  if (typeof widget !== "string") {
2845
- throw new Error(`Unsupported widget definition: ${typeof widget}`);
2922
+ throw new Error(`Unsupported widget definition: ${typeof widget} in schema: ${JSON.stringify(schema)}`);
2846
2923
  }
2847
2924
  if (widget in registeredWidgets) {
2848
2925
  const registeredWidget = registeredWidgets[widget];
@@ -2850,14 +2927,14 @@ function getWidget(schema, widget, registeredWidgets = {}) {
2850
2927
  }
2851
2928
  if (typeof type === "string") {
2852
2929
  if (!(type in widgetMap)) {
2853
- throw new Error(`No widget for type '${type}'`);
2930
+ throw new Error(`No widget for type '${type}' in schema: ${JSON.stringify(schema)}`);
2854
2931
  }
2855
2932
  if (widget in widgetMap[type]) {
2856
2933
  const registeredWidget = registeredWidgets[widgetMap[type][widget]];
2857
2934
  return getWidget(schema, registeredWidget, registeredWidgets);
2858
2935
  }
2859
2936
  }
2860
- throw new Error(`No widget '${widget}' for type '${type}'`);
2937
+ throw new Error(`No widget '${widget}' for type '${type}' in schema: ${JSON.stringify(schema)}`);
2861
2938
  }
2862
2939
 
2863
2940
  // src/hashForSchema.ts
@@ -2927,6 +3004,31 @@ function optionId(id, optionIndex) {
2927
3004
  function buttonId(id, btn) {
2928
3005
  return idGenerator(id, btn);
2929
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
+ }
2930
3032
 
2931
3033
  // src/labelValue.ts
2932
3034
  function labelValue(label, hideLabel, fallback) {
@@ -2939,14 +3041,14 @@ function localToUTC(dateString) {
2939
3041
  }
2940
3042
 
2941
3043
  // src/lookupFromFormContext.ts
2942
- import get18 from "lodash/get";
3044
+ import get20 from "lodash/get";
2943
3045
  import has6 from "lodash/has";
2944
3046
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
2945
3047
  const lookupPath = [LOOKUP_MAP_NAME];
2946
3048
  if (has6(regOrFc, FORM_CONTEXT_NAME)) {
2947
3049
  lookupPath.unshift(FORM_CONTEXT_NAME);
2948
3050
  }
2949
- return get18(regOrFc, [...lookupPath, toLookup], fallback);
3051
+ return get20(regOrFc, [...lookupPath, toLookup], fallback);
2950
3052
  }
2951
3053
 
2952
3054
  // src/orderProperties.ts
@@ -3027,11 +3129,40 @@ function schemaRequiresTrueValue(schema) {
3027
3129
  }
3028
3130
 
3029
3131
  // src/shouldRender.ts
3030
- function shouldRender(component, nextProps, nextState) {
3132
+ function shouldRender(component, nextProps, nextState, updateStrategy = "customDeep") {
3133
+ if (updateStrategy === "always") {
3134
+ return true;
3135
+ }
3136
+ if (updateStrategy === "shallow") {
3137
+ const { props: props2, state: state2 } = component;
3138
+ return !shallowEquals(props2, nextProps) || !shallowEquals(state2, nextState);
3139
+ }
3031
3140
  const { props, state } = component;
3032
3141
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
3033
3142
  }
3034
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
+
3035
3166
  // src/toDateString.ts
3036
3167
  function toDateString(dateObject, time = true) {
3037
3168
  const { year, month, day, hour = 0, minute = 0, second = 0 } = dateObject;
@@ -3041,7 +3172,7 @@ function toDateString(dateObject, time = true) {
3041
3172
  }
3042
3173
 
3043
3174
  // src/toErrorList.ts
3044
- import isPlainObject2 from "lodash/isPlainObject";
3175
+ import isPlainObject3 from "lodash/isPlainObject";
3045
3176
  function toErrorList(errorSchema, fieldPath = []) {
3046
3177
  if (!errorSchema) {
3047
3178
  return [];
@@ -3062,7 +3193,7 @@ function toErrorList(errorSchema, fieldPath = []) {
3062
3193
  return Object.keys(errorSchema).reduce((acc, key) => {
3063
3194
  if (key !== ERRORS_KEY) {
3064
3195
  const childSchema = errorSchema[key];
3065
- if (isPlainObject2(childSchema)) {
3196
+ if (isPlainObject3(childSchema)) {
3066
3197
  acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
3067
3198
  }
3068
3199
  }
@@ -3089,15 +3220,24 @@ function toErrorSchema(errors) {
3089
3220
  return builder.ErrorSchema;
3090
3221
  }
3091
3222
 
3223
+ // src/toFieldPathId.ts
3224
+ function toFieldPathId(fieldPath, globalFormOptions, parentPath) {
3225
+ const basePath = Array.isArray(parentPath) ? parentPath : parentPath?.path;
3226
+ const childPath = fieldPath === "" ? [] : [fieldPath];
3227
+ const path = basePath ? basePath.concat(...childPath) : childPath;
3228
+ const id = [globalFormOptions.idPrefix, ...path].join(globalFormOptions.idSeparator);
3229
+ return { path, [ID_KEY]: id };
3230
+ }
3231
+
3092
3232
  // src/unwrapErrorHandler.ts
3093
- import isPlainObject3 from "lodash/isPlainObject";
3233
+ import isPlainObject4 from "lodash/isPlainObject";
3094
3234
  function unwrapErrorHandler(errorHandler) {
3095
3235
  return Object.keys(errorHandler).reduce((acc, key) => {
3096
3236
  if (key === "addError") {
3097
3237
  return acc;
3098
3238
  } else {
3099
3239
  const childSchema = errorHandler[key];
3100
- if (isPlainObject3(childSchema)) {
3240
+ if (isPlainObject4(childSchema)) {
3101
3241
  return {
3102
3242
  ...acc,
3103
3243
  [key]: unwrapErrorHandler(childSchema)
@@ -3125,23 +3265,27 @@ function utcToLocal(jsonDate) {
3125
3265
  }
3126
3266
 
3127
3267
  // src/validationDataMerge.ts
3128
- import isEmpty5 from "lodash/isEmpty";
3129
- function validationDataMerge(validationData, additionalErrorSchema) {
3268
+ import isEmpty6 from "lodash/isEmpty";
3269
+ function validationDataMerge(validationData, additionalErrorSchema, preventDuplicates = false) {
3130
3270
  if (!additionalErrorSchema) {
3131
3271
  return validationData;
3132
3272
  }
3133
3273
  const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
3134
3274
  let errors = toErrorList(additionalErrorSchema);
3135
3275
  let errorSchema = additionalErrorSchema;
3136
- if (!isEmpty5(oldErrorSchema)) {
3137
- errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
3276
+ if (!isEmpty6(oldErrorSchema)) {
3277
+ errorSchema = mergeObjects(
3278
+ oldErrorSchema,
3279
+ additionalErrorSchema,
3280
+ preventDuplicates ? "preventDuplicates" : true
3281
+ );
3138
3282
  errors = [...oldErrors].concat(errors);
3139
3283
  }
3140
3284
  return { errorSchema, errors };
3141
3285
  }
3142
3286
 
3143
3287
  // src/withIdRefPrefix.ts
3144
- import isObject4 from "lodash/isObject";
3288
+ import isObject6 from "lodash/isObject";
3145
3289
  function withIdRefPrefixObject(node) {
3146
3290
  for (const key in node) {
3147
3291
  const realObj = node;
@@ -3164,35 +3308,12 @@ function withIdRefPrefix(schemaNode) {
3164
3308
  if (Array.isArray(schemaNode)) {
3165
3309
  return withIdRefPrefixArray([...schemaNode]);
3166
3310
  }
3167
- if (isObject4(schemaNode)) {
3311
+ if (isObject6(schemaNode)) {
3168
3312
  return withIdRefPrefixObject({ ...schemaNode });
3169
3313
  }
3170
3314
  return schemaNode;
3171
3315
  }
3172
3316
 
3173
- // src/getChangedFields.ts
3174
- import keys from "lodash/keys";
3175
- import pickBy from "lodash/pickBy";
3176
- import isPlainObject4 from "lodash/isPlainObject";
3177
- import get19 from "lodash/get";
3178
- import difference from "lodash/difference";
3179
- function getChangedFields(a, b) {
3180
- const aIsPlainObject = isPlainObject4(a);
3181
- const bIsPlainObject = isPlainObject4(b);
3182
- if (a === b || !aIsPlainObject && !bIsPlainObject) {
3183
- return [];
3184
- }
3185
- if (aIsPlainObject && !bIsPlainObject) {
3186
- return keys(a);
3187
- } else if (!aIsPlainObject && bIsPlainObject) {
3188
- return keys(b);
3189
- } else {
3190
- const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get19(b, key))));
3191
- const diffFields = difference(keys(b), keys(a));
3192
- return [...unequalFields, ...diffFields];
3193
- }
3194
- }
3195
-
3196
3317
  // src/enums.ts
3197
3318
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3198
3319
  TranslatableString2["ArrayItemTitle"] = "Item";
@@ -3215,6 +3336,9 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3215
3336
  TranslatableString2["PreviewLabel"] = "Preview";
3216
3337
  TranslatableString2["DecrementAriaLabel"] = "Decrease value by 1";
3217
3338
  TranslatableString2["IncrementAriaLabel"] = "Increase value by 1";
3339
+ TranslatableString2["OptionalObjectAdd"] = "Add data for optional field";
3340
+ TranslatableString2["OptionalObjectRemove"] = "Remove data for optional field";
3341
+ TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
3218
3342
  TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
3219
3343
  TranslatableString2["OptionPrefix"] = "Option %1";
3220
3344
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
@@ -3232,7 +3356,7 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3232
3356
  import forEach from "lodash/forEach";
3233
3357
 
3234
3358
  // src/parser/ParserValidator.ts
3235
- import get20 from "lodash/get";
3359
+ import get21 from "lodash/get";
3236
3360
  var ParserValidator = class {
3237
3361
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
3238
3362
  * first.
@@ -3258,7 +3382,7 @@ var ParserValidator = class {
3258
3382
  * @param hash - The hash value at which to map the schema
3259
3383
  */
3260
3384
  addSchema(schema, hash) {
3261
- const key = get20(schema, ID_KEY, hash);
3385
+ const key = get21(schema, ID_KEY, hash);
3262
3386
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3263
3387
  const existing = this.schemaMap[key];
3264
3388
  if (!existing) {
@@ -3354,6 +3478,8 @@ export {
3354
3478
  ALL_OF_KEY,
3355
3479
  ANY_OF_KEY,
3356
3480
  CONST_KEY,
3481
+ DEFAULT_ID_PREFIX,
3482
+ DEFAULT_ID_SEPARATOR,
3357
3483
  DEFAULT_KEY,
3358
3484
  DEFINITIONS_KEY,
3359
3485
  DEPENDENCIES_KEY,
@@ -3365,6 +3491,7 @@ export {
3365
3491
  ID_KEY,
3366
3492
  IF_KEY,
3367
3493
  ITEMS_KEY,
3494
+ JSON_SCHEMA_DRAFT_2019_09,
3368
3495
  JSON_SCHEMA_DRAFT_2020_12,
3369
3496
  JUNK_OPTION_ID,
3370
3497
  LOOKUP_MAP_NAME,
@@ -3432,8 +3559,10 @@ export {
3432
3559
  isCustomWidget,
3433
3560
  isFilesArray,
3434
3561
  isFixedItems,
3562
+ isFormDataAvailable,
3435
3563
  isMultiSelect,
3436
3564
  isObject,
3565
+ isRootSchema,
3437
3566
  isSelect,
3438
3567
  labelValue,
3439
3568
  localToUTC,
@@ -3442,6 +3571,7 @@ export {
3442
3571
  mergeObjects,
3443
3572
  mergeSchemas,
3444
3573
  optionId,
3574
+ optionalControlsId,
3445
3575
  optionsList,
3446
3576
  orderProperties,
3447
3577
  pad,
@@ -3452,14 +3582,16 @@ export {
3452
3582
  sanitizeDataForNewSchema,
3453
3583
  schemaParser,
3454
3584
  schemaRequiresTrueValue,
3585
+ shallowEquals,
3455
3586
  shouldRender,
3587
+ shouldRenderOptionalField,
3456
3588
  sortedJSONStringify,
3457
3589
  titleId,
3458
3590
  toConstant,
3459
3591
  toDateString,
3460
3592
  toErrorList,
3461
3593
  toErrorSchema,
3462
- toIdSchema,
3594
+ toFieldPathId,
3463
3595
  toPathSchema,
3464
3596
  unwrapErrorHandler,
3465
3597
  utcToLocal,