@rjsf/utils 6.6.2 → 6.7.0

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 (79) hide show
  1. package/LICENSE.md +201 -0
  2. package/dist/index.cjs +229 -108
  3. package/dist/index.cjs.map +4 -4
  4. package/dist/utils.esm.js +229 -108
  5. package/dist/utils.esm.js.map +4 -4
  6. package/dist/utils.umd.js +260 -136
  7. package/lib/SelectedOptionDescription.d.ts +4 -0
  8. package/lib/SelectedOptionDescription.js +24 -0
  9. package/lib/SelectedOptionDescription.js.map +1 -0
  10. package/lib/constants.d.ts +8 -5
  11. package/lib/constants.js +10 -7
  12. package/lib/constants.js.map +1 -1
  13. package/lib/createSchemaUtils.js +1 -1
  14. package/lib/createSchemaUtils.js.map +1 -1
  15. package/lib/enums.d.ts +4 -0
  16. package/lib/enums.js +4 -0
  17. package/lib/enums.js.map +1 -1
  18. package/lib/getSubmitButtonOptions.js +1 -1
  19. package/lib/getSubmitButtonOptions.js.map +1 -1
  20. package/lib/getWidget.js +2 -1
  21. package/lib/getWidget.js.map +1 -1
  22. package/lib/hashForSchema.d.ts +2 -0
  23. package/lib/hashForSchema.js +3 -1
  24. package/lib/hashForSchema.js.map +1 -1
  25. package/lib/index.d.ts +5 -2
  26. package/lib/index.js +4 -2
  27. package/lib/index.js.map +1 -1
  28. package/lib/isFixedItems.d.ts +2 -2
  29. package/lib/isFixedItems.js +3 -3
  30. package/lib/isFixedItems.js.map +1 -1
  31. package/lib/isRootSchema.js +2 -3
  32. package/lib/isRootSchema.js.map +1 -1
  33. package/lib/logUnsupportedDefaultForEnum.d.ts +9 -0
  34. package/lib/logUnsupportedDefaultForEnum.js +18 -0
  35. package/lib/logUnsupportedDefaultForEnum.js.map +1 -0
  36. package/lib/mergeSchemas.js +8 -1
  37. package/lib/mergeSchemas.js.map +1 -1
  38. package/lib/optionsList.js +22 -21
  39. package/lib/optionsList.js.map +1 -1
  40. package/lib/resolveUiSchema.js.map +1 -1
  41. package/lib/schema/getDefaultFormState.d.ts +1 -1
  42. package/lib/schema/getDefaultFormState.js +54 -17
  43. package/lib/schema/getDefaultFormState.js.map +1 -1
  44. package/lib/schema/getDisplayLabel.js +2 -3
  45. package/lib/schema/getDisplayLabel.js.map +1 -1
  46. package/lib/schema/omitExtraData.js +11 -0
  47. package/lib/schema/omitExtraData.js.map +1 -1
  48. package/lib/schema/retrieveSchema.d.ts +5 -1
  49. package/lib/schema/retrieveSchema.js +49 -14
  50. package/lib/schema/retrieveSchema.js.map +1 -1
  51. package/lib/schemaRequiresTrueValue.js +4 -3
  52. package/lib/schemaRequiresTrueValue.js.map +1 -1
  53. package/lib/tsconfig.tsbuildinfo +1 -1
  54. package/lib/types.d.ts +24 -0
  55. package/lib/useAltDateWidgetProps.d.ts +1 -1
  56. package/lib/useFileWidgetProps.js +2 -2
  57. package/lib/useFileWidgetProps.js.map +1 -1
  58. package/package.json +19 -19
  59. package/src/SelectedOptionDescription.tsx +48 -0
  60. package/src/constants.ts +10 -7
  61. package/src/createSchemaUtils.ts +1 -1
  62. package/src/enums.ts +4 -0
  63. package/src/getSubmitButtonOptions.ts +1 -1
  64. package/src/getWidget.tsx +1 -1
  65. package/src/hashForSchema.ts +3 -1
  66. package/src/index.ts +6 -0
  67. package/src/isFixedItems.ts +3 -3
  68. package/src/isRootSchema.ts +2 -4
  69. package/src/logUnsupportedDefaultForEnum.ts +28 -0
  70. package/src/mergeSchemas.ts +9 -2
  71. package/src/optionsList.ts +20 -22
  72. package/src/resolveUiSchema.ts +12 -4
  73. package/src/schema/getDefaultFormState.ts +80 -22
  74. package/src/schema/getDisplayLabel.ts +3 -4
  75. package/src/schema/omitExtraData.ts +11 -0
  76. package/src/schema/retrieveSchema.ts +59 -13
  77. package/src/schemaRequiresTrueValue.ts +3 -3
  78. package/src/types.ts +31 -0
  79. package/src/useFileWidgetProps.ts +2 -2
package/dist/utils.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
2
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('lodash/isPlainObject'), require('lodash/get'), require('fast-equals'), require('fast-uri'), require('jsonpointer'), require('lodash/isEmpty'), require('lodash/isObject'), require('lodash/omit'), require('lodash/has'), require('lodash/isString'), require('lodash/flattenDeep'), require('lodash/merge'), require('lodash/set'), require('lodash/times'), require('lodash/transform'), require('lodash/uniq'), require('lodash/union'), require('lodash/isNumber'), require('@x0k/json-schema-merge'), require('@x0k/json-schema-merge/lib/array'), require('lodash/reduce'), require('lodash/isNil'), require('lodash/pick'), require('lodash/cloneDeep'), require('lodash/setWith'), require('lodash/difference'), require('lodash/keys'), require('lodash/pickBy'), require('lodash/uniqueId'), require('react'), require('react-is'), require('react/jsx-runtime'), require('lodash/toPath'), require('lodash/forEach')) :
3
3
  typeof define === 'function' && define.amd ? define(['exports', 'lodash/isPlainObject', 'lodash/get', 'fast-equals', 'fast-uri', 'jsonpointer', 'lodash/isEmpty', 'lodash/isObject', 'lodash/omit', 'lodash/has', 'lodash/isString', 'lodash/flattenDeep', 'lodash/merge', 'lodash/set', 'lodash/times', 'lodash/transform', 'lodash/uniq', 'lodash/union', 'lodash/isNumber', '@x0k/json-schema-merge', '@x0k/json-schema-merge/lib/array', 'lodash/reduce', 'lodash/isNil', 'lodash/pick', 'lodash/cloneDeep', 'lodash/setWith', 'lodash/difference', 'lodash/keys', 'lodash/pickBy', 'lodash/uniqueId', 'react', 'react-is', 'react/jsx-runtime', 'lodash/toPath', 'lodash/forEach'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@rjsf/utils"] = {}, global.isPlainObject2, global.get15, global.fastEquals, global.UriResolver, global.jsonpointer, global.isEmpty4, global.isObject2, global.omit, global.has5, global.isString, global.flattenDeep, global.merge, global.set, global.times, global.transform, global.uniq, global.union, global.isNumber, global.jsonSchemaMerge, global.array, global.reduce, global.isNil, global.pick, global.cloneDeep, global.setWith, global.difference, global.keys, global.pickBy, global.uniqueId, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.forEach));
5
- })(this, (function (exports, isPlainObject2, get15, fastEquals, UriResolver, jsonpointer, isEmpty4, isObject2, omit, has5, isString, flattenDeep, merge, set, times, transform, uniq, union, isNumber, jsonSchemaMerge, array, reduce, isNil, pick, cloneDeep, setWith, difference, keys, pickBy, uniqueId, react, ReactIs, jsxRuntime, toPath, forEach) { 'use strict';
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@rjsf/utils"] = {}, global.isPlainObject2, global.get14, global.fastEquals, global.UriResolver, global.jsonpointer, global.isEmpty4, global.isObject2, global.omit, global.has5, global.isString, global.flattenDeep, global.merge, global.set3, global.times, global.transform, global.uniq, global.union, global.isNumber, global.jsonSchemaMerge, global.array, global.reduce, global.isNil, global.pick, global.cloneDeep, global.setWith, global.difference, global.keys, global.pickBy, global.uniqueId, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.forEach));
5
+ })(this, (function (exports, isPlainObject2, get14, fastEquals, UriResolver, jsonpointer, isEmpty4, isObject2, omit, has5, isString, flattenDeep, merge, set3, times, transform, uniq, union, isNumber, jsonSchemaMerge, array, reduce, isNil, pick, cloneDeep, setWith, difference, keys, pickBy, uniqueId, react, ReactIs, jsxRuntime, toPath, forEach) { 'use strict';
6
6
 
7
7
  // src/isObject.ts
8
8
  function isObject(thing) {
@@ -49,7 +49,7 @@
49
49
  }
50
50
 
51
51
  // src/constants.ts
52
- var ADDITIONAL_PROPERTY_FLAG = "__additional_property";
52
+ var ADDITIONAL_PROPERTY_FLAG = /* @__PURE__ */ Symbol("__additional_property");
53
53
  var ADDITIONAL_PROPERTIES_KEY = "additionalProperties";
54
54
  var ALL_OF_KEY = "allOf";
55
55
  var ANY_OF_KEY = "anyOf";
@@ -71,15 +71,17 @@
71
71
  var REQUIRED_KEY = "required";
72
72
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
73
73
  var REF_KEY = "$ref";
74
- var RJSF_REF_KEY = "__rjsf_ref";
74
+ var RJSF_REF_KEY = /* @__PURE__ */ Symbol("__rjsf_ref");
75
+ var RJSF_REF_CYCLE_KEY = /* @__PURE__ */ Symbol("__rjsf_ref_cycle");
75
76
  var SCHEMA_KEY = "$schema";
76
77
  var DEFAULT_ID_PREFIX = "root";
77
78
  var DEFAULT_ID_SEPARATOR = "_";
78
79
  var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
79
80
  var FORM_CONTEXT_NAME = "formContext";
80
81
  var LOOKUP_MAP_NAME = "layoutGridLookupMap";
81
- var RJSF_ADDITIONAL_PROPERTIES_FLAG = "__rjsf_additionalProperties";
82
- var ROOT_SCHEMA_PREFIX = "__rjsf_rootSchema";
82
+ var RJSF_PREFIX_KEY = "__rjsf";
83
+ var RJSF_ADDITIONAL_PROPERTIES_FLAG = `${RJSF_PREFIX_KEY}_additionalProperties`;
84
+ var ROOT_SCHEMA_PREFIX = `${RJSF_PREFIX_KEY}_rootSchema`;
83
85
  var UI_FIELD_KEY = "ui:field";
84
86
  var UI_WIDGET_KEY = "ui:widget";
85
87
  var UI_OPTIONS_KEY = "ui:options";
@@ -178,7 +180,7 @@
178
180
  return void 0;
179
181
  }
180
182
  function makeAllReferencesAbsolute(schema, baseURI) {
181
- const currentURI = get15(schema, ID_KEY, baseURI);
183
+ const currentURI = get14(schema, ID_KEY, baseURI);
182
184
  let result = schema;
183
185
  if (REF_KEY in result) {
184
186
  result = { ...result, [REF_KEY]: UriResolver.resolve(currentURI, result[REF_KEY]) };
@@ -200,7 +202,7 @@
200
202
  const remaining = omit(object, [key]);
201
203
  return [remaining, value];
202
204
  }
203
- function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = get15(rootSchema, [ID_KEY])) {
205
+ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = get14(rootSchema, [ID_KEY])) {
204
206
  const ref = $ref || "";
205
207
  let current = void 0;
206
208
  let currentBaseURI = baseURI;
@@ -250,13 +252,13 @@
250
252
  }
251
253
  return current;
252
254
  }
253
- function findSchemaDefinition($ref, rootSchema = {}, baseURI = get15(rootSchema, [ID_KEY])) {
255
+ function findSchemaDefinition($ref, rootSchema = {}, baseURI = get14(rootSchema, [ID_KEY])) {
254
256
  const recurseList = [];
255
257
  return findSchemaDefinitionRecursive($ref, rootSchema, recurseList, baseURI);
256
258
  }
257
259
  function getDiscriminatorFieldFromSchema(schema) {
258
260
  let discriminator;
259
- const maybeString = get15(schema, DISCRIMINATOR_PATH);
261
+ const maybeString = get14(schema, DISCRIMINATOR_PATH);
260
262
  if (isString(maybeString)) {
261
263
  discriminator = maybeString;
262
264
  } else if (maybeString !== void 0) {
@@ -313,7 +315,7 @@
313
315
  // src/mergeSchemas.ts
314
316
  function mergeSchemas(obj1, obj2) {
315
317
  const acc = { ...obj1 };
316
- return Object.keys(obj2).reduce((accumulator, key) => {
318
+ const result = Object.keys(obj2).reduce((accumulator, key) => {
317
319
  const left = obj1 ? obj1[key] : {}, right = obj2[key];
318
320
  if (obj1 && key in obj1 && isObject(right)) {
319
321
  accumulator[key] = mergeSchemas(left, right);
@@ -324,16 +326,20 @@
324
326
  }
325
327
  return accumulator;
326
328
  }, acc);
329
+ for (const sym of Object.getOwnPropertySymbols(obj2)) {
330
+ result[sym] = obj2[sym];
331
+ }
332
+ return result;
327
333
  }
328
334
  function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField) {
329
335
  if (formData && discriminatorField) {
330
- const value = get15(formData, discriminatorField);
336
+ const value = get14(formData, discriminatorField);
331
337
  if (value === void 0) {
332
338
  return void 0;
333
339
  }
334
340
  for (let i = 0; i < options.length; i += 1) {
335
341
  const option = options[i];
336
- const discriminator = get15(option, [PROPERTIES_KEY, discriminatorField], {});
342
+ const discriminator = get14(option, [PROPERTIES_KEY, discriminatorField], {});
337
343
  if (discriminator.type !== "object" && discriminator.type !== "array") {
338
344
  if (discriminator.const === value) {
339
345
  return i;
@@ -359,8 +365,8 @@
359
365
  for (let i = 0; i < options.length; i += 1) {
360
366
  const option = options[i];
361
367
  if (discriminatorField && has5(option, [PROPERTIES_KEY, discriminatorField])) {
362
- const value = get15(formData, discriminatorField);
363
- const discriminator = get15(option, [PROPERTIES_KEY, discriminatorField], {});
368
+ const value = get14(formData, discriminatorField);
369
+ const discriminator = get14(option, [PROPERTIES_KEY, discriminatorField], {});
364
370
  if (validator.isValid(discriminator, value, rootSchema)) {
365
371
  return i;
366
372
  }
@@ -413,6 +419,12 @@
413
419
  resolveAnyOfOrOneOfRefs
414
420
  )[0];
415
421
  }
422
+ function normalizeBooleanSchema(schema) {
423
+ if (typeof schema !== "boolean") {
424
+ return schema;
425
+ }
426
+ return schema ? {} : { not: {} };
427
+ }
416
428
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
417
429
  const { if: expression, then, else: otherwise, ...resolvedSchemaLessConditional } = schema;
418
430
  const conditionValue = validator.isValid(expression, formData || {}, rootSchema);
@@ -420,10 +432,11 @@
420
432
  let schemas = [];
421
433
  if (expandAllBranches) {
422
434
  if (then && typeof then !== "boolean") {
435
+ const thenSchema = then;
423
436
  schemas = schemas.concat(
424
437
  retrieveSchemaInternal(
425
438
  validator,
426
- then,
439
+ thenSchema,
427
440
  rootSchema,
428
441
  formData,
429
442
  expandAllBranches,
@@ -433,10 +446,11 @@
433
446
  );
434
447
  }
435
448
  if (otherwise && typeof otherwise !== "boolean") {
449
+ const otherwiseSchema = otherwise;
436
450
  schemas = schemas.concat(
437
451
  retrieveSchemaInternal(
438
452
  validator,
439
- otherwise,
453
+ otherwiseSchema,
440
454
  rootSchema,
441
455
  formData,
442
456
  expandAllBranches,
@@ -446,8 +460,9 @@
446
460
  );
447
461
  }
448
462
  } else {
449
- const conditionalSchema = conditionValue ? then : otherwise;
450
- if (conditionalSchema && typeof conditionalSchema !== "boolean") {
463
+ const conditionalBranch = conditionValue ? then : otherwise;
464
+ if (conditionalBranch !== void 0) {
465
+ const conditionalSchema = normalizeBooleanSchema(conditionalBranch);
451
466
  schemas = schemas.concat(
452
467
  retrieveSchemaInternal(
453
468
  validator,
@@ -493,7 +508,7 @@
493
508
  function getMatchingPatternProperties(schema, key) {
494
509
  return Object.keys(schema.patternProperties).filter((pattern) => RegExp(pattern).test(key)).reduce(
495
510
  (obj, pattern) => {
496
- set(obj, [pattern], schema.patternProperties[pattern]);
511
+ set3(obj, [pattern], schema.patternProperties[pattern]);
497
512
  return obj;
498
513
  },
499
514
  {}
@@ -571,7 +586,7 @@
571
586
  }
572
587
  return [schema];
573
588
  }
574
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
589
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs, markCycleOnDetection = false) {
575
590
  if (!isObject(schema)) {
576
591
  return schema;
577
592
  }
@@ -580,7 +595,7 @@
580
595
  if (REF_KEY in resolvedSchema) {
581
596
  const { $ref, ...localSchema } = resolvedSchema;
582
597
  if (recurseList.includes($ref)) {
583
- return resolvedSchema;
598
+ return markCycleOnDetection ? { ...resolvedSchema, [RJSF_REF_CYCLE_KEY]: true } : resolvedSchema;
584
599
  }
585
600
  recurseList.push($ref);
586
601
  const refSchema = findSchemaDefinition($ref, rootSchema, currentBaseURI);
@@ -595,7 +610,14 @@
595
610
  resolvedSchema[PROPERTIES_KEY],
596
611
  (acc, value, key) => {
597
612
  const childList = [...recurseList];
598
- acc[key] = resolveAllReferences(value, rootSchema, childList, currentBaseURI, resolveAnyOfOrOneOfRefs);
613
+ acc[key] = resolveAllReferences(
614
+ value,
615
+ rootSchema,
616
+ childList,
617
+ currentBaseURI,
618
+ resolveAnyOfOrOneOfRefs,
619
+ !resolveAnyOfOrOneOfRefs
620
+ );
599
621
  childrenLists.push(childList);
600
622
  },
601
623
  {}
@@ -606,6 +628,7 @@
606
628
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
607
629
  resolvedSchema = {
608
630
  ...resolvedSchema,
631
+ // Array items are only rendered when data exists, so a $ref cycle here does NOT cause an infinite render.
609
632
  items: resolveAllReferences(
610
633
  resolvedSchema.items,
611
634
  rootSchema,
@@ -653,10 +676,10 @@
653
676
  validator,
654
677
  { [ALL_OF_KEY]: Object.values(matchingProperties) },
655
678
  rootSchema,
656
- get15(formData, [key]),
679
+ get14(formData, [key]),
657
680
  experimental_customMergeAllOf
658
681
  );
659
- set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
682
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
660
683
  return;
661
684
  }
662
685
  }
@@ -666,9 +689,9 @@
666
689
  if (REF_KEY in schema.additionalProperties) {
667
690
  additionalProperties = retrieveSchema(
668
691
  validator,
669
- { [REF_KEY]: get15(schema.additionalProperties, [REF_KEY]) },
692
+ { [REF_KEY]: get14(schema.additionalProperties, [REF_KEY]) },
670
693
  rootSchema,
671
- formData,
694
+ get14(formData, [key]),
672
695
  experimental_customMergeAllOf
673
696
  );
674
697
  } else if ("type" in schema.additionalProperties) {
@@ -679,16 +702,16 @@
679
702
  ...schema.additionalProperties
680
703
  };
681
704
  } else {
682
- additionalProperties = { type: guessType(get15(formData, [key])) };
705
+ additionalProperties = { type: guessType(get14(formData, [key])) };
683
706
  }
684
707
  } else {
685
- additionalProperties = { type: guessType(get15(formData, [key])) };
708
+ additionalProperties = { type: guessType(get14(formData, [key])) };
686
709
  }
687
710
  schema.properties[key] = additionalProperties;
688
- set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
711
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
689
712
  } else {
690
713
  schema.properties[key] = { type: "null" };
691
- set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
714
+ schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true;
692
715
  }
693
716
  });
694
717
  return schema;
@@ -731,17 +754,26 @@
731
754
  try {
732
755
  const withContainsSchemas = [];
733
756
  const withoutContainsSchemas = [];
757
+ const allOfSymbols = {};
734
758
  resolvedSchema.allOf?.forEach((allOfItem) => {
735
759
  if (typeof allOfItem === "object" && allOfItem.contains) {
736
760
  withContainsSchemas.push(allOfItem);
737
761
  } else {
738
762
  withoutContainsSchemas.push(allOfItem);
763
+ for (const sym of Object.getOwnPropertySymbols(allOfItem)) {
764
+ if (!(sym in allOfSymbols)) {
765
+ allOfSymbols[sym] = allOfItem[sym];
766
+ }
767
+ }
739
768
  }
740
769
  });
741
770
  if (withContainsSchemas.length) {
742
771
  resolvedSchema = { ...resolvedSchema, allOf: withoutContainsSchemas };
743
772
  }
744
773
  resolvedSchema = experimental_customMergeAllOf ? experimental_customMergeAllOf(resolvedSchema) : mergeAllOf(resolvedSchema);
774
+ for (const sym of Object.getOwnPropertySymbols(allOfSymbols)) {
775
+ resolvedSchema[sym] = allOfSymbols[sym];
776
+ }
745
777
  if (withContainsSchemas.length) {
746
778
  resolvedSchema.allOf = withContainsSchemas;
747
779
  }
@@ -760,7 +792,7 @@
760
792
  validator,
761
793
  { allOf: [acc.properties[key], ...Object.values(matchingProperties)] },
762
794
  rootSchema,
763
- get15(rawFormData, [key]),
795
+ get14(rawFormData, [key]),
764
796
  experimental_customMergeAllOf
765
797
  );
766
798
  }
@@ -810,7 +842,7 @@
810
842
  function relaxOptionsForScoring(options, resolveRefs = false, rootSchema) {
811
843
  return options.map((d) => {
812
844
  if (!isObject(d)) {
813
- return d ? {} : { not: {} };
845
+ return normalizeBooleanSchema(d);
814
846
  }
815
847
  const schema = resolveRefs && rootSchema ? resolveAllReferences(d, rootSchema, []) : d;
816
848
  return schema.additionalProperties === false ? { ...schema, additionalProperties: true } : schema;
@@ -841,7 +873,7 @@
841
873
  function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
842
874
  let schemas = [resolvedSchema];
843
875
  for (const dependencyKey in dependencies) {
844
- if ((expandAllBranches || get15(formData, [dependencyKey]) !== void 0) && (!resolvedSchema.properties || dependencyKey in resolvedSchema.properties)) {
876
+ if ((expandAllBranches || get14(formData, [dependencyKey]) !== void 0) && (!resolvedSchema.properties || dependencyKey in resolvedSchema.properties)) {
845
877
  const [remainingDependencies, dependencyValue] = splitKeyElementFromObject(
846
878
  dependencyKey,
847
879
  dependencies
@@ -924,7 +956,7 @@
924
956
  }
925
957
  function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, oneOf, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
926
958
  const validSubschemas = oneOf.filter((subschema) => {
927
- if (typeof subschema === "boolean" || !subschema || !subschema.properties) {
959
+ if (typeof subschema === "boolean" || !subschema?.properties) {
928
960
  return false;
929
961
  }
930
962
  const { [dependencyKey]: conditionPropertySchema } = subschema.properties;
@@ -968,14 +1000,14 @@
968
1000
  const xxxOfs = schema[xxx].map(
969
1001
  (xxxOf) => retrieveSchema(validator, xxxOf, rootSchema, formData, experimental_customMergeAllOf)
970
1002
  );
971
- const data = get15(formData, selectorField);
1003
+ const data = get14(formData, selectorField);
972
1004
  if (data !== void 0) {
973
1005
  return xxxOfs.find(
974
1006
  (xxxOfOption) => deepEquals_default(
975
- get15(
1007
+ get14(
976
1008
  xxxOfOption,
977
1009
  [PROPERTIES_KEY, selectorField, DEFAULT_KEY],
978
- get15(xxxOfOption, [PROPERTIES_KEY, selectorField, CONST_KEY])
1010
+ get14(xxxOfOption, [PROPERTIES_KEY, selectorField, CONST_KEY])
979
1011
  ),
980
1012
  data
981
1013
  )
@@ -995,7 +1027,7 @@
995
1027
  const pathList = Array.isArray(path) ? [...path] : path.split(".");
996
1028
  const [part, ...nestedPath] = pathList;
997
1029
  if (part !== void 0 && part !== "" && has5(fieldSchema, part)) {
998
- fieldSchema = get15(fieldSchema, part);
1030
+ fieldSchema = get14(fieldSchema, part);
999
1031
  return getFromSchemaInternal(
1000
1032
  validator,
1001
1033
  rootSchema,
@@ -1038,7 +1070,7 @@
1038
1070
  parentField,
1039
1071
  fieldNameKey,
1040
1072
  ONE_OF_KEY,
1041
- get15(formData, subPath),
1073
+ get14(formData, subPath),
1042
1074
  experimental_customMergeAllOf
1043
1075
  );
1044
1076
  } else if (has5(parentField, ANY_OF_KEY)) {
@@ -1048,7 +1080,7 @@
1048
1080
  parentField,
1049
1081
  fieldNameKey,
1050
1082
  ANY_OF_KEY,
1051
- get15(formData, subPath),
1083
+ get14(formData, subPath),
1052
1084
  experimental_customMergeAllOf
1053
1085
  );
1054
1086
  }
@@ -1116,7 +1148,7 @@
1116
1148
  totalScore += reduce(
1117
1149
  schema.properties,
1118
1150
  (score, value, key) => {
1119
- const formValue = get15(formData, key);
1151
+ const formValue = get14(formData, key);
1120
1152
  if (typeof value === "boolean") {
1121
1153
  return score;
1122
1154
  }
@@ -1143,7 +1175,7 @@
1143
1175
  validator,
1144
1176
  rootSchema,
1145
1177
  formValue,
1146
- get15(value, xxxOfKey),
1178
+ get14(value, xxxOfKey),
1147
1179
  -1,
1148
1180
  discriminator,
1149
1181
  experimental_customMergeAllOf
@@ -1224,7 +1256,7 @@
1224
1256
 
1225
1257
  // src/isFixedItems.ts
1226
1258
  function isFixedItems(schema) {
1227
- return Array.isArray(schema.items) && schema.items.length > 0 && schema.items.every((item) => isObject(item));
1259
+ return Array.isArray(schema.items) && schema.items.every((item) => isObject(item));
1228
1260
  }
1229
1261
  function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false, defaultSupercedesUndefined = false, overrideFormDataWithDefaults = false) {
1230
1262
  if (Array.isArray(formData)) {
@@ -1251,22 +1283,22 @@
1251
1283
  if (isObject(formData)) {
1252
1284
  const acc = Object.assign({}, defaults);
1253
1285
  return Object.keys(formData).reduce((accumulator, key) => {
1254
- const keyValue = get15(formData, key);
1286
+ const keyValue = get14(formData, key);
1255
1287
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1256
1288
  const keyExistsInFormData = key in formData;
1257
- const keyDefault = get15(defaults, key) ?? {};
1289
+ const keyDefault = get14(defaults, key) ?? {};
1258
1290
  const defaultValueIsNestedObject = keyExistsInDefaults && isObject(keyDefault) && Object.values(keyDefault).some((v) => isObject(v));
1259
- const keyDefaultIsObject = keyExistsInDefaults && isObject(get15(defaults, key));
1291
+ const keyDefaultIsObject = keyExistsInDefaults && isObject(get14(defaults, key));
1260
1292
  const keyHasFormDataObject = keyExistsInFormData && isObject(keyValue);
1261
1293
  if (keyDefaultIsObject && keyHasFormDataObject && !defaultValueIsNestedObject) {
1262
1294
  accumulator[key] = {
1263
- ...get15(defaults, key),
1295
+ ...get14(defaults, key),
1264
1296
  ...keyValue
1265
1297
  };
1266
1298
  return accumulator;
1267
1299
  }
1268
1300
  accumulator[key] = mergeDefaultsWithFormData(
1269
- get15(defaults, key),
1301
+ get14(defaults, key),
1270
1302
  keyValue,
1271
1303
  mergeExtraArrayDefaults,
1272
1304
  defaultSupercedesUndefined,
@@ -1366,18 +1398,18 @@
1366
1398
  const { optionsSchemaSelector = selectorField } = getUiOptions(uiSchema);
1367
1399
  selectorField = optionsSchemaSelector;
1368
1400
  }
1369
- return altSchemas && altSchemas.map((aSchemaDef, index) => {
1401
+ return altSchemas?.map((aSchemaDef, index) => {
1370
1402
  const { title } = getUiOptions(altUiSchemas?.[index]);
1371
1403
  const aSchema = aSchemaDef;
1372
1404
  let value;
1373
1405
  let label = title;
1374
1406
  if (selectorField) {
1375
- const innerSchema = get15(aSchema, [PROPERTIES_KEY, selectorField], {});
1376
- value = get15(innerSchema, DEFAULT_KEY, get15(innerSchema, CONST_KEY));
1377
- label = label || innerSchema?.title || aSchema.title || String(value);
1407
+ const innerSchema = get14(aSchema, [PROPERTIES_KEY, selectorField], {});
1408
+ value = get14(innerSchema, DEFAULT_KEY, get14(innerSchema, CONST_KEY));
1409
+ label = label ?? innerSchema?.title ?? aSchema.title ?? String(value);
1378
1410
  } else {
1379
1411
  value = toConstant(aSchema);
1380
- label = label || aSchema.title || String(value);
1412
+ label = label ?? aSchema.title ?? String(value);
1381
1413
  }
1382
1414
  return {
1383
1415
  schema: aSchema,
@@ -1467,8 +1499,8 @@
1467
1499
  rootSchema = {},
1468
1500
  includeUndefinedValues = false,
1469
1501
  _recurseList = [],
1470
- experimental_defaultFormStateBehavior = void 0,
1471
- experimental_customMergeAllOf = void 0,
1502
+ experimental_defaultFormStateBehavior,
1503
+ experimental_customMergeAllOf,
1472
1504
  required,
1473
1505
  shouldMergeDefaultsIntoFormData = false,
1474
1506
  initialDefaultsGenerated
@@ -1476,14 +1508,19 @@
1476
1508
  let formData = isObject(rawFormData) ? rawFormData : {};
1477
1509
  const schema = isObject(rawSchema) ? rawSchema : {};
1478
1510
  let defaults = parentDefaults;
1511
+ const preferParentDefaults = defaults && experimental_defaultFormStateBehavior?.nestedDefaultsPrecedence === "ancestorWins";
1479
1512
  let schemaToCompute = null;
1480
1513
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1481
1514
  let updatedRecurseList = _recurseList;
1482
1515
  if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1483
1516
  defaults = schema[CONST_KEY];
1484
1517
  } else if (isObject(defaults) && isObject(schema.default) && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1485
- defaults = mergeObjects(defaults, schema.default);
1486
- } else if (DEFAULT_KEY in schema && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1518
+ if (preferParentDefaults) {
1519
+ defaults = mergeObjects(schema.default, defaults);
1520
+ } else {
1521
+ defaults = mergeObjects(defaults, schema.default);
1522
+ }
1523
+ } else if (DEFAULT_KEY in schema && !preferParentDefaults && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1487
1524
  defaults = schema.default;
1488
1525
  } else if (REF_KEY in schema) {
1489
1526
  const refName = schema[REF_KEY];
@@ -1513,7 +1550,7 @@
1513
1550
  experimental_customMergeAllOf
1514
1551
  );
1515
1552
  [schemaToCompute] = resolvedSchema;
1516
- } else if (isFixedItems(schema)) {
1553
+ } else if (isFixedItems(schema) && !preferParentDefaults) {
1517
1554
  defaults = schema.items.map(
1518
1555
  (itemSchema, idx) => computeDefaults(validator, itemSchema, {
1519
1556
  rootSchema,
@@ -1609,16 +1646,36 @@
1609
1646
  return defaultsWithFormData;
1610
1647
  }
1611
1648
  function ensureFormDataMatchingSchema(validator, schema, rootSchema, formData, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
1612
- const isSelectField = !isConstant(schema) && isSelect(validator, schema, rootSchema, experimental_customMergeAllOf);
1649
+ const shouldRetrieveAllOf = experimental_defaultFormStateBehavior?.allOf === "populateDefaults" && ALL_OF_KEY in schema;
1650
+ const schemaToMatch = shouldRetrieveAllOf ? retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf) : schema;
1651
+ const isSelectField = !isConstant(schemaToMatch) && isSelect(validator, schemaToMatch, rootSchema, experimental_customMergeAllOf);
1613
1652
  let validFormData = formData;
1614
1653
  if (isSelectField) {
1615
- const getOptionsList = optionsList(schema);
1654
+ const getOptionsList = optionsList(schemaToMatch);
1616
1655
  const isValid = getOptionsList?.some((option) => deepEquals_default(option.value, formData));
1617
1656
  validFormData = isValid ? formData : void 0;
1618
1657
  }
1619
- const constTakesPrecedence = schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults === "always";
1658
+ const constTakesPrecedence = schemaToMatch[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults === "always";
1620
1659
  if (constTakesPrecedence) {
1621
- validFormData = schema.const;
1660
+ validFormData = schemaToMatch.const;
1661
+ } else if (isObject(validFormData) && isObject(schemaToMatch.properties)) {
1662
+ validFormData = Object.keys(schemaToMatch.properties).reduce(
1663
+ (acc, key) => {
1664
+ const propertySchema = get14(schemaToMatch, [PROPERTIES_KEY, key], {});
1665
+ if (key in acc && (shouldRetrieveAllOf || isObject(propertySchema) && ALL_OF_KEY in propertySchema)) {
1666
+ acc[key] = ensureFormDataMatchingSchema(
1667
+ validator,
1668
+ propertySchema,
1669
+ rootSchema,
1670
+ get14(acc, key),
1671
+ experimental_defaultFormStateBehavior,
1672
+ experimental_customMergeAllOf
1673
+ );
1674
+ }
1675
+ return acc;
1676
+ },
1677
+ { ...validFormData }
1678
+ );
1622
1679
  }
1623
1680
  return validFormData;
1624
1681
  }
@@ -1627,8 +1684,8 @@
1627
1684
  rootSchema = {},
1628
1685
  includeUndefinedValues = false,
1629
1686
  _recurseList = [],
1630
- experimental_defaultFormStateBehavior = void 0,
1631
- experimental_customMergeAllOf = void 0,
1687
+ experimental_defaultFormStateBehavior,
1688
+ experimental_customMergeAllOf,
1632
1689
  required,
1633
1690
  shouldMergeDefaultsIntoFormData,
1634
1691
  initialDefaultsGenerated
@@ -1641,7 +1698,7 @@
1641
1698
  const parentConst = retrievedSchema[CONST_KEY];
1642
1699
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
1643
1700
  (acc, key) => {
1644
- const propertySchema = get15(retrievedSchema, [PROPERTIES_KEY, key], {});
1701
+ const propertySchema = get14(retrievedSchema, [PROPERTIES_KEY, key], {});
1645
1702
  const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1646
1703
  const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(propertySchema);
1647
1704
  const computedDefault = computeDefaults(validator, propertySchema, {
@@ -1650,8 +1707,8 @@
1650
1707
  experimental_defaultFormStateBehavior,
1651
1708
  experimental_customMergeAllOf,
1652
1709
  includeUndefinedValues: includeUndefinedValues === true,
1653
- parentDefaults: get15(defaults, [key]),
1654
- rawFormData: get15(formData, [key]),
1710
+ parentDefaults: get14(defaults, [key]),
1711
+ rawFormData: get14(formData, [key]),
1655
1712
  required: retrievedSchema.required?.includes(key),
1656
1713
  shouldMergeDefaultsIntoFormData,
1657
1714
  initialDefaultsGenerated
@@ -1689,8 +1746,8 @@
1689
1746
  experimental_defaultFormStateBehavior,
1690
1747
  experimental_customMergeAllOf,
1691
1748
  includeUndefinedValues: includeUndefinedValues === true,
1692
- parentDefaults: get15(defaults, [key]),
1693
- rawFormData: get15(formData, [key]),
1749
+ parentDefaults: get14(defaults, [key]),
1750
+ rawFormData: get14(formData, [key]),
1694
1751
  required: retrievedSchema.required?.includes(key),
1695
1752
  shouldMergeDefaultsIntoFormData,
1696
1753
  initialDefaultsGenerated
@@ -1712,8 +1769,8 @@
1712
1769
  rawFormData,
1713
1770
  rootSchema = {},
1714
1771
  _recurseList = [],
1715
- experimental_defaultFormStateBehavior = void 0,
1716
- experimental_customMergeAllOf = void 0,
1772
+ experimental_defaultFormStateBehavior,
1773
+ experimental_customMergeAllOf,
1717
1774
  required,
1718
1775
  requiredAsRoot = false,
1719
1776
  shouldMergeDefaultsIntoFormData,
@@ -1758,7 +1815,7 @@
1758
1815
  experimental_defaultFormStateBehavior,
1759
1816
  experimental_customMergeAllOf,
1760
1817
  rawFormData: item,
1761
- parentDefaults: get15(defaults, [idx]),
1818
+ parentDefaults: get14(defaults, [idx]),
1762
1819
  required,
1763
1820
  shouldMergeDefaultsIntoFormData,
1764
1821
  initialDefaultsGenerated
@@ -1768,14 +1825,21 @@
1768
1825
  defaults = mergeDefaultsWithFormData(defaults, itemDefaults, mergeExtraDefaults);
1769
1826
  }
1770
1827
  }
1828
+ const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1771
1829
  if (neverPopulate) {
1830
+ if (shouldMergeDefaultsIntoFormData) {
1831
+ if (schema.minItems && schema.minItems > defaultsLength) {
1832
+ const fillerEntries = Array.from({ length: schema.minItems - defaultsLength }, () => null);
1833
+ return (defaults ?? []).concat(fillerEntries);
1834
+ }
1835
+ return defaults;
1836
+ }
1772
1837
  return defaults ?? emptyDefault;
1773
1838
  }
1774
1839
  if (ignoreMinItemsFlagSet && !required) {
1775
1840
  return defaults || void 0;
1776
1841
  }
1777
1842
  let arrayDefault;
1778
- const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1779
1843
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
1780
1844
  arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
1781
1845
  } else {
@@ -1835,9 +1899,17 @@
1835
1899
  if (isObject(formData) || Array.isArray(formData)) {
1836
1900
  const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
1837
1901
  const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
1902
+ const matchingFormData = ensureFormDataMatchingSchema(
1903
+ validator,
1904
+ schema,
1905
+ rootSchema ?? schema,
1906
+ formData,
1907
+ experimental_defaultFormStateBehavior,
1908
+ experimental_customMergeAllOf
1909
+ );
1838
1910
  const result = mergeDefaultsWithFormData(
1839
1911
  defaults,
1840
- formData,
1912
+ matchingFormData,
1841
1913
  true,
1842
1914
  // set to true to add any additional default array entries.
1843
1915
  defaultSupercedesUndefined,
@@ -1883,7 +1955,7 @@
1883
1955
  let displayLabel = Boolean(label);
1884
1956
  if (displayLabel) {
1885
1957
  const schemaType = getSchemaType(schema);
1886
- const addedByAdditionalProperty = get15(schema, ADDITIONAL_PROPERTY_FLAG, false);
1958
+ const addedByAdditionalProperty = Boolean(schema[ADDITIONAL_PROPERTY_FLAG]);
1887
1959
  if (schemaType === "array") {
1888
1960
  displayLabel = addedByAdditionalProperty || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || isFilesArray(validator, schema, uiSchema, rootSchema, experimental_customMergeAllOf) || isCustomWidget(uiSchema);
1889
1961
  }
@@ -1893,7 +1965,7 @@
1893
1965
  if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
1894
1966
  displayLabel = false;
1895
1967
  }
1896
- if (uiSchema && uiSchema[UI_FIELD_KEY]) {
1968
+ if (uiSchema?.[UI_FIELD_KEY]) {
1897
1969
  displayLabel = false;
1898
1970
  }
1899
1971
  }
@@ -1924,7 +1996,7 @@
1924
1996
  }
1925
1997
  } else if (key === NAME_KEY && data !== "") {
1926
1998
  paths.forEach((path) => {
1927
- const formValue = get15(formData, path);
1999
+ const formValue = get14(formData, path);
1928
2000
  const isLeaf = objKeys.length === 1;
1929
2001
  if (formValueHasData(formValue, isLeaf) || Array.isArray(formValue) && formValue.every((val) => formValueHasData(val, isLeaf))) {
1930
2002
  acc.push(path);
@@ -1962,7 +2034,7 @@
1962
2034
  const { properties, additionalProperties, patternProperties, propertyNames } = childSchema;
1963
2035
  const requiredSet = new Set(childSchema.required ?? []);
1964
2036
  function setProperty(key, schemaDef, value, required = false) {
1965
- const v = omit3(schemaDef, value, target[key]);
2037
+ const v = omit2(schemaDef, value, target[key]);
1966
2038
  if (!required && isObject(v)) {
1967
2039
  let sd = isSchemaObj(schemaDef) ? schemaDef : {};
1968
2040
  if (sd.$ref !== void 0) {
@@ -2031,17 +2103,17 @@
2031
2103
  if (items !== void 0) {
2032
2104
  if (Array.isArray(items)) {
2033
2105
  for (let i = 0; i < items.length; i += 1) {
2034
- target.push(omit3(items[i], source[i]));
2106
+ target.push(omit2(items[i], source[i]));
2035
2107
  }
2036
2108
  } else {
2037
2109
  for (let i = 0; i < source.length; i += 1) {
2038
- target.push(omit3(items, source[i]));
2110
+ target.push(omit2(items, source[i]));
2039
2111
  }
2040
2112
  }
2041
2113
  }
2042
2114
  if (additionalItems) {
2043
2115
  for (let i = target.length; i < source.length; i += 1) {
2044
- target.push(omit3(additionalItems, source[i]));
2116
+ target.push(omit2(additionalItems, source[i]));
2045
2117
  }
2046
2118
  }
2047
2119
  return target;
@@ -2053,7 +2125,7 @@
2053
2125
  }
2054
2126
  const isThenBranch = isSchemaObj(condition) ? validator.isValid(condition, source, rootSchema) : condition;
2055
2127
  const branch = isThenBranch ? then : otherwise;
2056
- return branch === void 0 ? target : omit3(branch, source, target);
2128
+ return branch === void 0 ? target : omit2(branch, source, target);
2057
2129
  }
2058
2130
  function handleOneOf(oneOf, childSchema, source, target) {
2059
2131
  if (!Array.isArray(oneOf) || isSelect(validator, childSchema, rootSchema, experimental_customMergeAllOf)) {
@@ -2071,7 +2143,7 @@
2071
2143
  );
2072
2144
  const winning = oneOf[bestIndex];
2073
2145
  const resolved = isObject(winning) ? resolveAllReferences(winning, rootSchema, []) : scoringOptions[bestIndex];
2074
- return omit3(resolved, source, target);
2146
+ return omit2(resolved, source, target);
2075
2147
  }
2076
2148
  function handleAnyOf(childSchema, source, target) {
2077
2149
  const { anyOf } = childSchema;
@@ -2081,7 +2153,7 @@
2081
2153
  if (source === void 0 || Array.isArray(source) && source.length === 0 || isObject(source) && Object.keys(source).length === 0) {
2082
2154
  let result = target;
2083
2155
  for (const branch of anyOf) {
2084
- result = omit3(branch, source, result);
2156
+ result = omit2(branch, source, result);
2085
2157
  }
2086
2158
  return result;
2087
2159
  }
@@ -2095,12 +2167,12 @@
2095
2167
  let result = target;
2096
2168
  for (const [key, deps] of Object.entries(dependencies)) {
2097
2169
  if (key in source && !Array.isArray(deps)) {
2098
- result = omit3(deps, source, result);
2170
+ result = omit2(deps, source, result);
2099
2171
  }
2100
2172
  }
2101
2173
  return result;
2102
2174
  }
2103
- function omit3(schemaDef, source, target) {
2175
+ function omit2(schemaDef, source, target) {
2104
2176
  if (source === void 0 || schemaDef === false) {
2105
2177
  return void 0;
2106
2178
  }
@@ -2110,10 +2182,16 @@
2110
2182
  let localSchema = schemaDef;
2111
2183
  const { $ref: ref, allOf } = localSchema;
2112
2184
  if (ref !== void 0) {
2113
- return omit3(findSchemaDefinition(ref, rootSchema), source, target);
2185
+ return omit2(findSchemaDefinition(ref, rootSchema), source, target);
2114
2186
  }
2115
2187
  if (allOf) {
2116
2188
  localSchema = doMergeAllOf(localSchema, experimental_customMergeAllOf);
2189
+ const remainingAllOf = localSchema.allOf;
2190
+ if (remainingAllOf) {
2191
+ for (let i = 0; i < remainingAllOf.length; i++) {
2192
+ target = omit2(remainingAllOf[i], source, target);
2193
+ }
2194
+ }
2117
2195
  }
2118
2196
  let filtered = handleAnyOf(localSchema, source, handleOneOf(localSchema.oneOf, localSchema, source, target));
2119
2197
  const type = getSchemaType(localSchema);
@@ -2132,7 +2210,7 @@
2132
2210
  }
2133
2211
  return handleDependencies(localSchema, source, handleConditions(localSchema, source, filtered));
2134
2212
  }
2135
- return omit3(schema, formData);
2213
+ return omit2(schema, formData);
2136
2214
  }
2137
2215
  var NO_VALUE = /* @__PURE__ */ Symbol("no Value");
2138
2216
  function enumValuesForSchema(schema) {
@@ -2156,7 +2234,7 @@
2156
2234
  if (!enumValues || enumValues.some((value) => deepEquals_default(value, formValue))) {
2157
2235
  return NO_VALUE;
2158
2236
  }
2159
- const defaultValue = get15(schema, DEFAULT_KEY, NO_VALUE);
2237
+ const defaultValue = get14(schema, DEFAULT_KEY, NO_VALUE);
2160
2238
  if (defaultValue !== NO_VALUE && enumValues.some((value) => deepEquals_default(value, defaultValue))) {
2161
2239
  return defaultValue;
2162
2240
  }
@@ -2167,19 +2245,19 @@
2167
2245
  if (has5(newSchema, PROPERTIES_KEY)) {
2168
2246
  const removeOldSchemaData = {};
2169
2247
  if (has5(oldSchema, PROPERTIES_KEY)) {
2170
- const properties = get15(oldSchema, PROPERTIES_KEY, {});
2248
+ const properties = get14(oldSchema, PROPERTIES_KEY, {});
2171
2249
  Object.keys(properties).forEach((key) => {
2172
2250
  if (has5(data, key)) {
2173
2251
  removeOldSchemaData[key] = void 0;
2174
2252
  }
2175
2253
  });
2176
2254
  }
2177
- const keys2 = Object.keys(get15(newSchema, PROPERTIES_KEY, {}));
2255
+ const keys2 = Object.keys(get14(newSchema, PROPERTIES_KEY, {}));
2178
2256
  const nestedData = {};
2179
2257
  keys2.forEach((key) => {
2180
- const formValue = get15(data, key);
2181
- let oldKeyedSchema = get15(oldSchema, [PROPERTIES_KEY, key], {});
2182
- let newKeyedSchema = get15(newSchema, [PROPERTIES_KEY, key], {});
2258
+ const formValue = get14(data, key);
2259
+ let oldKeyedSchema = get14(oldSchema, [PROPERTIES_KEY, key], {});
2260
+ let newKeyedSchema = get14(newSchema, [PROPERTIES_KEY, key], {});
2183
2261
  if (has5(oldKeyedSchema, REF_KEY)) {
2184
2262
  oldKeyedSchema = retrieveSchema(
2185
2263
  validator,
@@ -2198,8 +2276,8 @@
2198
2276
  experimental_customMergeAllOf
2199
2277
  );
2200
2278
  }
2201
- const oldSchemaTypeForKey = get15(oldKeyedSchema, "type");
2202
- const newSchemaTypeForKey = get15(newKeyedSchema, "type");
2279
+ const oldSchemaTypeForKey = get14(oldKeyedSchema, "type");
2280
+ const newSchemaTypeForKey = get14(newKeyedSchema, "type");
2203
2281
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
2204
2282
  if (has5(removeOldSchemaData, key)) {
2205
2283
  delete removeOldSchemaData[key];
@@ -2217,17 +2295,17 @@
2217
2295
  nestedData[key] = itemData;
2218
2296
  }
2219
2297
  } else {
2220
- const newOptionDefault = get15(newKeyedSchema, DEFAULT_KEY, NO_VALUE);
2221
- const oldOptionDefault = get15(oldKeyedSchema, DEFAULT_KEY, NO_VALUE);
2298
+ const newOptionDefault = get14(newKeyedSchema, DEFAULT_KEY, NO_VALUE);
2299
+ const oldOptionDefault = get14(oldKeyedSchema, DEFAULT_KEY, NO_VALUE);
2222
2300
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
2223
2301
  if (oldOptionDefault === formValue) {
2224
2302
  removeOldSchemaData[key] = newOptionDefault;
2225
- } else if (get15(newKeyedSchema, "readOnly") === true) {
2303
+ } else if (get14(newKeyedSchema, "readOnly") === true) {
2226
2304
  removeOldSchemaData[key] = void 0;
2227
2305
  }
2228
2306
  }
2229
- const newOptionConst = get15(newKeyedSchema, CONST_KEY, NO_VALUE);
2230
- const oldOptionConst = get15(oldKeyedSchema, CONST_KEY, NO_VALUE);
2307
+ const newOptionConst = get14(newKeyedSchema, CONST_KEY, NO_VALUE);
2308
+ const oldOptionConst = get14(oldKeyedSchema, CONST_KEY, NO_VALUE);
2231
2309
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
2232
2310
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
2233
2311
  }
@@ -2245,9 +2323,9 @@
2245
2323
  ...removeOldSchemaData,
2246
2324
  ...nestedData
2247
2325
  };
2248
- } else if (get15(oldSchema, "type") === "array" && get15(newSchema, "type") === "array" && Array.isArray(data)) {
2249
- let oldSchemaItems = get15(oldSchema, "items");
2250
- let newSchemaItems = get15(newSchema, "items");
2326
+ } else if (get14(oldSchema, "type") === "array" && get14(newSchema, "type") === "array" && Array.isArray(data)) {
2327
+ let oldSchemaItems = get14(oldSchema, "items");
2328
+ let newSchemaItems = get14(newSchema, "items");
2251
2329
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
2252
2330
  if (has5(oldSchemaItems, REF_KEY)) {
2253
2331
  oldSchemaItems = retrieveSchema(
@@ -2267,10 +2345,10 @@
2267
2345
  experimental_customMergeAllOf
2268
2346
  );
2269
2347
  }
2270
- const oldSchemaType = get15(oldSchemaItems, "type");
2271
- const newSchemaType = get15(newSchemaItems, "type");
2348
+ const oldSchemaType = get14(oldSchemaItems, "type");
2349
+ const newSchemaType = get14(newSchemaItems, "type");
2272
2350
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
2273
- const maxItems = get15(newSchema, "maxItems", -1);
2351
+ const maxItems = get14(newSchema, "maxItems", -1);
2274
2352
  if (newSchemaType === "object") {
2275
2353
  newFormData = data.reduce((newValue, aValue) => {
2276
2354
  const itemValue = sanitizeDataForNewSchema(
@@ -2344,9 +2422,9 @@
2344
2422
  };
2345
2423
  }
2346
2424
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema[ADDITIONAL_PROPERTIES_KEY] !== false) {
2347
- set(pathSchema, RJSF_ADDITIONAL_PROPERTIES_FLAG, true);
2425
+ set3(pathSchema, RJSF_ADDITIONAL_PROPERTIES_FLAG, true);
2348
2426
  const additionalSchema = isObject2(schema[ADDITIONAL_PROPERTIES_KEY]) ? schema[ADDITIONAL_PROPERTIES_KEY] : {};
2349
- const definedProperties = get15(schema, PROPERTIES_KEY, {});
2427
+ const definedProperties = get14(schema, PROPERTIES_KEY, {});
2350
2428
  for (const key of Object.keys(formData ?? {})) {
2351
2429
  if (!(key in definedProperties)) {
2352
2430
  pathSchema[key] = toPathSchemaInternal(
@@ -2354,7 +2432,7 @@
2354
2432
  additionalSchema,
2355
2433
  `${name}.${key}`,
2356
2434
  rootSchema,
2357
- get15(formData, [key]),
2435
+ get14(formData, [key]),
2358
2436
  _recurseList,
2359
2437
  experimental_customMergeAllOf
2360
2438
  );
@@ -2404,7 +2482,7 @@
2404
2482
  }
2405
2483
  } else if (PROPERTIES_KEY in schema) {
2406
2484
  for (const property in schema.properties) {
2407
- const field = get15(schema, [PROPERTIES_KEY, property], {});
2485
+ const field = get14(schema, [PROPERTIES_KEY, property], {});
2408
2486
  pathSchema[property] = toPathSchemaInternal(
2409
2487
  validator,
2410
2488
  field,
@@ -2412,7 +2490,7 @@
2412
2490
  rootSchema,
2413
2491
  // It's possible that formData is not an object -- this can happen if an
2414
2492
  // array item has just been added, but not populated with data yet
2415
- get15(formData, [property]),
2493
+ get14(formData, [property]),
2416
2494
  _recurseList,
2417
2495
  experimental_customMergeAllOf
2418
2496
  );
@@ -2434,8 +2512,8 @@
2434
2512
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2435
2513
  */
2436
2514
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2437
- if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2438
- this.rootSchema = makeAllReferencesAbsolute(rootSchema, get15(rootSchema, ID_KEY, "#"));
2515
+ if (rootSchema?.[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2516
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, get14(rootSchema, ID_KEY, "#"));
2439
2517
  } else {
2440
2518
  this.rootSchema = rootSchema;
2441
2519
  }
@@ -2909,7 +2987,7 @@
2909
2987
  */
2910
2988
  getOrCreateErrorBlock(pathOfError) {
2911
2989
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2912
- let errorBlock = hasPath ? get15(this.errorSchema, pathOfError) : this.errorSchema;
2990
+ let errorBlock = hasPath ? get14(this.errorSchema, pathOfError) : this.errorSchema;
2913
2991
  if (!errorBlock && pathOfError) {
2914
2992
  errorBlock = {};
2915
2993
  setWith(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2935,15 +3013,15 @@
2935
3013
  */
2936
3014
  addErrors(errorOrList, pathOfError) {
2937
3015
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2938
- let errorsList = get15(errorBlock, ERRORS_KEY);
3016
+ let errorsList = get14(errorBlock, ERRORS_KEY);
2939
3017
  if (!Array.isArray(errorsList)) {
2940
3018
  errorsList = [];
2941
3019
  errorBlock[ERRORS_KEY] = errorsList;
2942
3020
  }
2943
3021
  if (Array.isArray(errorOrList)) {
2944
- set(errorBlock, ERRORS_KEY, [.../* @__PURE__ */ new Set([...errorsList, ...errorOrList])]);
3022
+ set3(errorBlock, ERRORS_KEY, [.../* @__PURE__ */ new Set([...errorsList, ...errorOrList])]);
2945
3023
  } else {
2946
- set(errorBlock, ERRORS_KEY, [.../* @__PURE__ */ new Set([...errorsList, errorOrList])]);
3024
+ set3(errorBlock, ERRORS_KEY, [.../* @__PURE__ */ new Set([...errorsList, errorOrList])]);
2947
3025
  }
2948
3026
  return this;
2949
3027
  }
@@ -2958,7 +3036,7 @@
2958
3036
  setErrors(errorOrList, pathOfError) {
2959
3037
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2960
3038
  const listToAdd = Array.isArray(errorOrList) ? [.../* @__PURE__ */ new Set([...errorOrList])] : [errorOrList];
2961
- set(errorBlock, ERRORS_KEY, listToAdd);
3039
+ set3(errorBlock, ERRORS_KEY, listToAdd);
2962
3040
  return this;
2963
3041
  }
2964
3042
  /** Clears the error(s) in the `ErrorSchema` at either the root level or the location within the schema described by
@@ -2970,7 +3048,7 @@
2970
3048
  */
2971
3049
  clearErrors(pathOfError) {
2972
3050
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2973
- set(errorBlock, ERRORS_KEY, []);
3051
+ set3(errorBlock, ERRORS_KEY, []);
2974
3052
  return this;
2975
3053
  }
2976
3054
  };
@@ -2986,7 +3064,7 @@
2986
3064
  if (!aIsPlainObject && bIsPlainObject) {
2987
3065
  return keys(b);
2988
3066
  }
2989
- const unequalFields = keys(pickBy(a, (value, key) => !deepEquals_default(value, get15(b, key))));
3067
+ const unequalFields = keys(pickBy(a, (value, key) => !deepEquals_default(value, get14(b, key))));
2990
3068
  const diffFields = difference(keys(b), keys(a));
2991
3069
  return [...unequalFields, ...diffFields];
2992
3070
  }
@@ -3087,7 +3165,7 @@
3087
3165
  };
3088
3166
  function getSubmitButtonOptions(uiSchema = {}) {
3089
3167
  const uiOptions = getUiOptions(uiSchema);
3090
- if (uiOptions && uiOptions[SUBMIT_BTN_OPTIONS_KEY]) {
3168
+ if (uiOptions?.[SUBMIT_BTN_OPTIONS_KEY]) {
3091
3169
  const options = uiOptions[SUBMIT_BTN_OPTIONS_KEY];
3092
3170
  return { ...DEFAULT_OPTIONS, ...options };
3093
3171
  }
@@ -3111,7 +3189,7 @@
3111
3189
  );
3112
3190
  }
3113
3191
  function getTestIds() {
3114
- if (get15(globalThis, "process.env.NODE_ENV") !== "test") {
3192
+ if (get14(globalThis, "process.env.NODE_ENV") !== "test") {
3115
3193
  return {};
3116
3194
  }
3117
3195
  const ids = /* @__PURE__ */ new Map();
@@ -3180,11 +3258,11 @@
3180
3258
  }
3181
3259
  };
3182
3260
  function mergeWidgetOptions(AWidget) {
3183
- let MergedWidget = get15(AWidget, "MergedWidget");
3261
+ let MergedWidget = get14(AWidget, "MergedWidget");
3184
3262
  if (!MergedWidget) {
3185
- const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
3263
+ const defaultOptions = AWidget.defaultProps?.options || {};
3186
3264
  MergedWidget = ({ options, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(AWidget, { options: { ...defaultOptions, ...options }, ...props });
3187
- set(AWidget, "MergedWidget", MergedWidget);
3265
+ set3(AWidget, "MergedWidget", MergedWidget);
3188
3266
  }
3189
3267
  return MergedWidget;
3190
3268
  }
@@ -3234,7 +3312,7 @@
3234
3312
  return hashString(sortedJSONStringify(object));
3235
3313
  }
3236
3314
  function hashForSchema(schema) {
3237
- return hashObject(schema);
3315
+ return hashString(sortedJSONStringify(schema));
3238
3316
  }
3239
3317
 
3240
3318
  // src/hasWidget.ts
@@ -3285,6 +3363,8 @@
3285
3363
  function isFormDataAvailable(formData) {
3286
3364
  return !isNil(formData) && (!isObject2(formData) || Array.isArray(formData) || !isEmpty4(formData));
3287
3365
  }
3366
+
3367
+ // src/isRootSchema.ts
3288
3368
  function isRootSchema(registry, schemaToCompare) {
3289
3369
  const { rootSchema, schemaUtils } = registry;
3290
3370
  if (deepEquals_default(schemaToCompare, rootSchema)) {
@@ -3292,7 +3372,7 @@
3292
3372
  }
3293
3373
  if (REF_KEY in rootSchema) {
3294
3374
  const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
3295
- return deepEquals_default(schemaToCompare, omit(resolvedSchema, RJSF_REF_KEY));
3375
+ return deepEquals_default(schemaToCompare, resolvedSchema);
3296
3376
  }
3297
3377
  return false;
3298
3378
  }
@@ -3306,12 +3386,21 @@
3306
3386
  function localToUTC(dateString) {
3307
3387
  return dateString ? new Date(dateString).toJSON() : void 0;
3308
3388
  }
3389
+
3390
+ // src/logUnsupportedDefaultForEnum.ts
3391
+ function logUnsupportedDefaultForEnum(id, schema, enumOptions, multiple = false) {
3392
+ if (!multiple && Array.isArray(enumOptions) && schema.default !== void 0 && enumOptionsIndexForValue(schema.default, enumOptions, multiple) === void 0) {
3393
+ console.error(
3394
+ `The schema default value "${schema.default}" is not one of the values in the enum options for "${id}"`
3395
+ );
3396
+ }
3397
+ }
3309
3398
  function lookupFromFormContext(regOrFc, toLookup, fallback) {
3310
3399
  const lookupPath = [LOOKUP_MAP_NAME];
3311
3400
  if (has5(regOrFc, FORM_CONTEXT_NAME)) {
3312
3401
  lookupPath.unshift(FORM_CONTEXT_NAME);
3313
3402
  }
3314
- return get15(regOrFc, [...lookupPath, toLookup], fallback);
3403
+ return get14(regOrFc, [...lookupPath, toLookup], fallback);
3315
3404
  }
3316
3405
 
3317
3406
  // src/nameGenerators.ts
@@ -3497,13 +3586,13 @@
3497
3586
  if (schema.const) {
3498
3587
  return true;
3499
3588
  }
3500
- if (schema.enum && schema.enum.length === 1 && schema.enum[0] === true) {
3589
+ if (schema.enum?.length === 1 && schema.enum[0] === true) {
3501
3590
  return true;
3502
3591
  }
3503
- if (schema.anyOf && schema.anyOf.length === 1) {
3592
+ if (schema.anyOf?.length === 1) {
3504
3593
  return schemaRequiresTrueValue(schema.anyOf[0]);
3505
3594
  }
3506
- if (schema.oneOf && schema.oneOf.length === 1) {
3595
+ if (schema.oneOf?.length === 1) {
3507
3596
  return schemaRequiresTrueValue(schema.oneOf[0]);
3508
3597
  }
3509
3598
  if (schema.allOf) {
@@ -3512,6 +3601,35 @@
3512
3601
  }
3513
3602
  return false;
3514
3603
  }
3604
+ function SelectedOptionDescription({ hideLabel, id, multiple, options, registry, uiSchema, value }) {
3605
+ if (multiple || hideLabel) {
3606
+ return null;
3607
+ }
3608
+ const { label = true } = getUiOptions(uiSchema, registry.globalUiOptions);
3609
+ if (!label) {
3610
+ return null;
3611
+ }
3612
+ const option = options.enumOptions?.find(({ value: enumValue }) => enumOptionsIsSelected(enumValue, value));
3613
+ const description = option?.schema?.description;
3614
+ if (!description) {
3615
+ return null;
3616
+ }
3617
+ const DescriptionFieldTemplate = getTemplate(
3618
+ "DescriptionFieldTemplate",
3619
+ registry,
3620
+ options
3621
+ );
3622
+ return /* @__PURE__ */ jsxRuntime.jsx(
3623
+ DescriptionFieldTemplate,
3624
+ {
3625
+ id: descriptionId(id),
3626
+ description,
3627
+ schema: option.schema,
3628
+ uiSchema,
3629
+ registry
3630
+ }
3631
+ );
3632
+ }
3515
3633
 
3516
3634
  // src/shallowEquals.ts
3517
3635
  function shallowEquals(a, b) {
@@ -3753,7 +3871,7 @@
3753
3871
  function addNameToDataURL(dataURL, name) {
3754
3872
  return dataURL.replace(";base64", `;name=${encodeURIComponent(name)};base64`);
3755
3873
  }
3756
- function processFile(file) {
3874
+ async function processFile(file) {
3757
3875
  const { name, size, type } = file;
3758
3876
  return new Promise((resolve, reject) => {
3759
3877
  const reader = new window.FileReader();
@@ -3778,7 +3896,7 @@
3778
3896
  reader.readAsDataURL(file);
3779
3897
  });
3780
3898
  }
3781
- function processFiles(files) {
3899
+ async function processFiles(files) {
3782
3900
  return Promise.all(Array.from(files).map(processFile));
3783
3901
  }
3784
3902
  function extractFileInfo(dataURLs) {
@@ -3911,6 +4029,7 @@
3911
4029
  TranslatableString2["AddButton"] = "Add";
3912
4030
  TranslatableString2["AddItemButton"] = "Add Item";
3913
4031
  TranslatableString2["CopyButton"] = "Copy";
4032
+ TranslatableString2["ExpandButton"] = "Expand Cycle";
3914
4033
  TranslatableString2["MoveDownButton"] = "Move down";
3915
4034
  TranslatableString2["MoveUpButton"] = "Move up";
3916
4035
  TranslatableString2["RemoveButton"] = "Remove";
@@ -3931,6 +4050,7 @@
3931
4050
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
3932
4051
  TranslatableString2["KeyLabel"] = "%1 Key";
3933
4052
  TranslatableString2["DeprecatedLabel"] = "%1 (deprecated)";
4053
+ TranslatableString2["CycleDetected"] = 'Circular reference ($ref cycle) detected for field "%1". You may choose to expand to the next cycle break';
3934
4054
  TranslatableString2["InvalidObjectField"] = 'Invalid "%1" object field configuration: _%2_.';
3935
4055
  TranslatableString2["UnsupportedField"] = "Unsupported field schema.";
3936
4056
  TranslatableString2["UnsupportedFieldWithId"] = "Unsupported field schema for field `%1`.";
@@ -3964,7 +4084,7 @@
3964
4084
  * @param hash - The hash value at which to map the schema
3965
4085
  */
3966
4086
  addSchema(schema, hash) {
3967
- const key = get15(schema, ID_KEY, hash);
4087
+ const key = get14(schema, ID_KEY, hash);
3968
4088
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3969
4089
  const existing = this.schemaMap[key];
3970
4090
  if (!existing) {
@@ -4086,10 +4206,13 @@
4086
4206
  exports.REF_KEY = REF_KEY;
4087
4207
  exports.REQUIRED_KEY = REQUIRED_KEY;
4088
4208
  exports.RJSF_ADDITIONAL_PROPERTIES_FLAG = RJSF_ADDITIONAL_PROPERTIES_FLAG;
4209
+ exports.RJSF_PREFIX_KEY = RJSF_PREFIX_KEY;
4210
+ exports.RJSF_REF_CYCLE_KEY = RJSF_REF_CYCLE_KEY;
4089
4211
  exports.RJSF_REF_KEY = RJSF_REF_KEY;
4090
4212
  exports.ROOT_SCHEMA_PREFIX = ROOT_SCHEMA_PREFIX;
4091
4213
  exports.SCHEMA_KEY = SCHEMA_KEY;
4092
4214
  exports.SUBMIT_BTN_OPTIONS_KEY = SUBMIT_BTN_OPTIONS_KEY;
4215
+ exports.SelectedOptionDescription = SelectedOptionDescription;
4093
4216
  exports.TranslatableString = TranslatableString;
4094
4217
  exports.UI_DEFINITIONS_KEY = UI_DEFINITIONS_KEY;
4095
4218
  exports.UI_FIELD_KEY = UI_FIELD_KEY;
@@ -4160,6 +4283,7 @@
4160
4283
  exports.isValueEmpty = isValueEmpty;
4161
4284
  exports.labelValue = labelValue;
4162
4285
  exports.localToUTC = localToUTC;
4286
+ exports.logUnsupportedDefaultForEnum = logUnsupportedDefaultForEnum;
4163
4287
  exports.lookupFromFormContext = lookupFromFormContext;
4164
4288
  exports.mergeDefaultsWithFormData = mergeDefaultsWithFormData;
4165
4289
  exports.mergeObjects = mergeObjects;