@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.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('lodash/isPlainObject'), require('lodash/isEqualWith'), require('lodash/get'), require('lodash/has'), require('lodash/isEqual'), require('lodash/set'), require('lodash/times'), require('lodash/transform'), require('lodash/merge'), require('lodash/flattenDeep'), require('lodash/uniq'), require('json-schema-merge-allof'), require('jsonpointer'), require('lodash/omit'), require('lodash/isObject'), require('lodash/isEmpty'), require('fast-uri'), require('lodash/isString'), require('lodash/union'), require('lodash/isNumber'), require('lodash/reduce'), require('lodash/isNil'), require('lodash/cloneDeep'), require('lodash/setWith'), require('nanoid'), require('react'), require('react-is'), require('react/jsx-runtime'), require('lodash/toPath'), require('lodash/keys'), require('lodash/pickBy'), require('lodash/difference'), require('lodash/forEach')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'lodash/isPlainObject', 'lodash/isEqualWith', 'lodash/get', 'lodash/has', 'lodash/isEqual', 'lodash/set', 'lodash/times', 'lodash/transform', 'lodash/merge', 'lodash/flattenDeep', 'lodash/uniq', 'json-schema-merge-allof', 'jsonpointer', 'lodash/omit', 'lodash/isObject', 'lodash/isEmpty', 'fast-uri', 'lodash/isString', 'lodash/union', 'lodash/isNumber', 'lodash/reduce', 'lodash/isNil', 'lodash/cloneDeep', 'lodash/setWith', 'nanoid', 'react', 'react-is', 'react/jsx-runtime', 'lodash/toPath', 'lodash/keys', 'lodash/pickBy', 'lodash/difference', 'lodash/forEach'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@rjsf/utils"] = {}, global.isPlainObject4, global.isEqualWith, global.get12, global.has5, global.isEqual, global.set, global.times, global.transform, global.merge, global.flattenDeep, global.uniq, global.mergeAllOf, global.jsonpointer, global.omit, global.isObject3, global.isEmpty2, global.UriResolver, global.isString, global.union, global.isNumber, global.reduce, global.isNil, global.cloneDeep, global.setWith, global.nanoid, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.keys, global.pickBy, global.difference, global.forEach));
5
- })(this, (function (exports, isPlainObject4, isEqualWith, get12, has5, isEqual, set, times, transform, merge, flattenDeep, uniq, mergeAllOf, jsonpointer, omit, isObject3, isEmpty2, UriResolver, isString, union, isNumber, reduce, isNil, cloneDeep, setWith, nanoid, react, ReactIs, jsxRuntime, toPath, keys, pickBy, difference, forEach) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('lodash/isPlainObject'), require('lodash/isEqualWith'), require('lodash/get'), require('lodash/has'), require('lodash/isEqual'), require('lodash/set'), require('lodash/times'), require('lodash/transform'), require('lodash/merge'), require('lodash/flattenDeep'), require('lodash/uniq'), require('json-schema-merge-allof'), require('jsonpointer'), require('lodash/omit'), require('lodash/isObject'), require('lodash/isEmpty'), require('fast-uri'), require('lodash/isString'), require('lodash/union'), require('lodash/isNumber'), require('lodash/reduce'), require('lodash/isNil'), require('lodash/cloneDeep'), require('lodash/setWith'), require('lodash/keys'), require('lodash/pickBy'), require('lodash/difference'), require('lodash/uniqueId'), require('react'), require('react-is'), require('react/jsx-runtime'), require('lodash/toPath'), require('lodash/forEach')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'lodash/isPlainObject', 'lodash/isEqualWith', 'lodash/get', 'lodash/has', 'lodash/isEqual', 'lodash/set', 'lodash/times', 'lodash/transform', 'lodash/merge', 'lodash/flattenDeep', 'lodash/uniq', 'json-schema-merge-allof', 'jsonpointer', 'lodash/omit', 'lodash/isObject', 'lodash/isEmpty', 'fast-uri', 'lodash/isString', 'lodash/union', 'lodash/isNumber', 'lodash/reduce', 'lodash/isNil', 'lodash/cloneDeep', 'lodash/setWith', 'lodash/keys', 'lodash/pickBy', 'lodash/difference', '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.isEqualWith, global.get13, global.has5, global.isEqual2, global.set, global.times, global.transform, global.merge, global.flattenDeep, global.uniq, global.mergeAllOf, global.jsonpointer, global.omit, global.isObject2, global.isEmpty4, global.UriResolver, global.isString, global.union, global.isNumber, global.reduce, global.isNil, global.cloneDeep, global.setWith, global.keys, global.pickBy, global.difference, global.uniqueId, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.forEach));
5
+ })(this, (function (exports, isPlainObject2, isEqualWith, get13, has5, isEqual2, set, times, transform, merge, flattenDeep, uniq, mergeAllOf, jsonpointer, omit, isObject2, isEmpty4, UriResolver, isString, union, isNumber, reduce, isNil, cloneDeep, setWith, keys, pickBy, difference, uniqueId, react, ReactIs, jsxRuntime, toPath, forEach) { 'use strict';
6
6
 
7
7
  // src/isObject.ts
8
8
  function isObject(thing) {
@@ -72,6 +72,8 @@
72
72
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
73
73
  var REF_KEY = "$ref";
74
74
  var SCHEMA_KEY = "$schema";
75
+ var DEFAULT_ID_PREFIX = "root";
76
+ var DEFAULT_ID_SEPARATOR = "_";
75
77
  var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
76
78
  var FORM_CONTEXT_NAME = "formContext";
77
79
  var LOOKUP_MAP_NAME = "layoutGridLookupMap";
@@ -81,10 +83,14 @@
81
83
  var UI_WIDGET_KEY = "ui:widget";
82
84
  var UI_OPTIONS_KEY = "ui:options";
83
85
  var UI_GLOBAL_OPTIONS_KEY = "ui:globalOptions";
86
+ var JSON_SCHEMA_DRAFT_2019_09 = "https://json-schema.org/draft/2019-09/schema";
84
87
  var JSON_SCHEMA_DRAFT_2020_12 = "https://json-schema.org/draft/2020-12/schema";
85
88
 
86
89
  // src/getUiOptions.ts
87
90
  function getUiOptions(uiSchema = {}, globalOptions = {}) {
91
+ if (!uiSchema) {
92
+ return { ...globalOptions };
93
+ }
88
94
  return Object.keys(uiSchema).filter((key) => key.indexOf("ui:") === 0).reduce(
89
95
  (options, key) => {
90
96
  const value = uiSchema[key];
@@ -130,7 +136,7 @@
130
136
  return { ...acc, [key]: createErrorHandler(value) };
131
137
  }, handler);
132
138
  }
133
- if (isPlainObject4(formData)) {
139
+ if (isPlainObject2(formData)) {
134
140
  const formObject = formData;
135
141
  return Object.keys(formObject).reduce((acc, key) => {
136
142
  return { ...acc, [key]: createErrorHandler(formObject[key]) };
@@ -151,7 +157,16 @@
151
157
  return schema;
152
158
  }
153
159
  for (const subSchema of Object.values(schema)) {
154
- if (isObject3(subSchema)) {
160
+ if (Array.isArray(subSchema)) {
161
+ for (const item of subSchema) {
162
+ if (isObject2(item)) {
163
+ const result = findEmbeddedSchemaRecursive(item, ref);
164
+ if (result !== void 0) {
165
+ return result;
166
+ }
167
+ }
168
+ }
169
+ } else if (isObject2(subSchema)) {
155
170
  const result = findEmbeddedSchemaRecursive(subSchema, ref);
156
171
  if (result !== void 0) {
157
172
  return result;
@@ -160,12 +175,29 @@
160
175
  }
161
176
  return void 0;
162
177
  }
178
+ function makeAllReferencesAbsolute(schema, baseURI) {
179
+ const currentURI = get13(schema, ID_KEY, baseURI);
180
+ if (REF_KEY in schema) {
181
+ schema = { ...schema, [REF_KEY]: UriResolver.resolve(currentURI, schema[REF_KEY]) };
182
+ }
183
+ for (const [key, subSchema] of Object.entries(schema)) {
184
+ if (Array.isArray(subSchema)) {
185
+ schema = {
186
+ ...schema,
187
+ [key]: subSchema.map((item) => isObject2(item) ? makeAllReferencesAbsolute(item, currentURI) : item)
188
+ };
189
+ } else if (isObject2(subSchema)) {
190
+ schema = { ...schema, [key]: makeAllReferencesAbsolute(subSchema, currentURI) };
191
+ }
192
+ }
193
+ return schema;
194
+ }
163
195
  function splitKeyElementFromObject(key, object) {
164
196
  const value = object[key];
165
197
  const remaining = omit(object, [key]);
166
198
  return [remaining, value];
167
199
  }
168
- function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = ID_KEY in rootSchema ? rootSchema[ID_KEY] : void 0) {
200
+ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = get13(rootSchema, [ID_KEY])) {
169
201
  const ref = $ref || "";
170
202
  let current = void 0;
171
203
  if (ref.startsWith("#")) {
@@ -184,7 +216,7 @@
184
216
  current = findEmbeddedSchemaRecursive(rootSchema, refId.replace(/\/$/, ""));
185
217
  if (current !== void 0) {
186
218
  baseURI = current[ID_KEY];
187
- if (!isEmpty2(refAnchor)) {
219
+ if (!isEmpty4(refAnchor)) {
188
220
  current = jsonpointer.get(current, decodeURIComponent(refAnchor.join("#")));
189
221
  }
190
222
  }
@@ -205,19 +237,23 @@
205
237
  const [remaining, theRef] = splitKeyElementFromObject(REF_KEY, current);
206
238
  const subSchema = findSchemaDefinitionRecursive(theRef, rootSchema, [...recurseList, ref], baseURI);
207
239
  if (Object.keys(remaining).length > 0) {
208
- return { ...remaining, ...subSchema };
240
+ if (rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2019_09 || rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
241
+ return { [ALL_OF_KEY]: [remaining, subSchema] };
242
+ } else {
243
+ return { ...remaining, ...subSchema };
244
+ }
209
245
  }
210
246
  return subSchema;
211
247
  }
212
248
  return current;
213
249
  }
214
- function findSchemaDefinition($ref, rootSchema = {}, baseURI = ID_KEY in rootSchema ? rootSchema[ID_KEY] : void 0) {
250
+ function findSchemaDefinition($ref, rootSchema = {}, baseURI = get13(rootSchema, [ID_KEY])) {
215
251
  const recurseList = [];
216
252
  return findSchemaDefinitionRecursive($ref, rootSchema, recurseList, baseURI);
217
253
  }
218
254
  function getDiscriminatorFieldFromSchema(schema) {
219
255
  let discriminator;
220
- const maybeString = get12(schema, DISCRIMINATOR_PATH);
256
+ const maybeString = get13(schema, DISCRIMINATOR_PATH);
221
257
  if (isString(maybeString)) {
222
258
  discriminator = maybeString;
223
259
  } else if (maybeString !== void 0) {
@@ -288,13 +324,13 @@
288
324
  }
289
325
  function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField) {
290
326
  if (formData && discriminatorField) {
291
- const value = get12(formData, discriminatorField);
327
+ const value = get13(formData, discriminatorField);
292
328
  if (value === void 0) {
293
329
  return;
294
330
  }
295
331
  for (let i = 0; i < options.length; i++) {
296
332
  const option = options[i];
297
- const discriminator = get12(option, [PROPERTIES_KEY, discriminatorField], {});
333
+ const discriminator = get13(option, [PROPERTIES_KEY, discriminatorField], {});
298
334
  if (discriminator.type === "object" || discriminator.type === "array") {
299
335
  continue;
300
336
  }
@@ -321,8 +357,8 @@
321
357
  for (let i = 0; i < options.length; i++) {
322
358
  const option = options[i];
323
359
  if (discriminatorField && has5(option, [PROPERTIES_KEY, discriminatorField])) {
324
- const value = get12(formData, discriminatorField);
325
- const discriminator = get12(option, [PROPERTIES_KEY, discriminatorField], {});
360
+ const value = get13(formData, discriminatorField);
361
+ const discriminator = get13(option, [PROPERTIES_KEY, discriminatorField], {});
326
362
  if (validator.isValid(discriminator, value, rootSchema)) {
327
363
  return i;
328
364
  }
@@ -355,7 +391,7 @@
355
391
  }
356
392
  return 0;
357
393
  }
358
- function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
394
+ function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs = false) {
359
395
  return retrieveSchemaInternal(
360
396
  validator,
361
397
  schema,
@@ -363,7 +399,8 @@
363
399
  rawFormData,
364
400
  void 0,
365
401
  void 0,
366
- experimental_customMergeAllOf
402
+ experimental_customMergeAllOf,
403
+ resolveAnyOfOrOneOfRefs
367
404
  )[0];
368
405
  }
369
406
  function resolveCondition(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
@@ -452,14 +489,16 @@
452
489
  {}
453
490
  );
454
491
  }
455
- function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
492
+ function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
456
493
  const updatedSchemas = resolveReference(
457
494
  validator,
458
495
  schema,
459
496
  rootSchema,
460
497
  expandAllBranches,
461
498
  recurseList,
462
- formData
499
+ formData,
500
+ experimental_customMergeAllOf,
501
+ resolveAnyOfOrOneOfRefs
463
502
  );
464
503
  if (updatedSchemas.length > 1 || updatedSchemas[0] !== schema) {
465
504
  return updatedSchemas;
@@ -471,7 +510,8 @@
471
510
  rootSchema,
472
511
  expandAllBranches,
473
512
  recurseList,
474
- formData
513
+ formData,
514
+ experimental_customMergeAllOf
475
515
  );
476
516
  return resolvedSchemas.flatMap((s) => {
477
517
  return retrieveSchemaInternal(
@@ -485,7 +525,7 @@
485
525
  );
486
526
  });
487
527
  }
488
- if (ALL_OF_KEY in schema && Array.isArray(schema.allOf)) {
528
+ if (ALL_OF_KEY in schema && Array.isArray(schema[ALL_OF_KEY])) {
489
529
  const allOfSchemaElements = schema.allOf.map(
490
530
  (allOfSubschema) => retrieveSchemaInternal(
491
531
  validator,
@@ -505,8 +545,8 @@
505
545
  }
506
546
  return [schema];
507
547
  }
508
- function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
509
- const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList);
548
+ function resolveReference(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
549
+ const updatedSchema = resolveAllReferences(schema, rootSchema, recurseList, void 0, resolveAnyOfOrOneOfRefs);
510
550
  if (updatedSchema !== schema) {
511
551
  return retrieveSchemaInternal(
512
552
  validator,
@@ -515,12 +555,13 @@
515
555
  formData,
516
556
  expandAllBranches,
517
557
  recurseList,
518
- experimental_customMergeAllOf
558
+ experimental_customMergeAllOf,
559
+ resolveAnyOfOrOneOfRefs
519
560
  );
520
561
  }
521
562
  return [schema];
522
563
  }
523
- function resolveAllReferences(schema, rootSchema, recurseList, baseURI) {
564
+ function resolveAllReferences(schema, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs) {
524
565
  if (!isObject(schema)) {
525
566
  return schema;
526
567
  }
@@ -543,7 +584,7 @@
543
584
  resolvedSchema[PROPERTIES_KEY],
544
585
  (result, value, key) => {
545
586
  const childList = [...recurseList];
546
- result[key] = resolveAllReferences(value, rootSchema, childList, baseURI);
587
+ result[key] = resolveAllReferences(value, rootSchema, childList, baseURI, resolveAnyOfOrOneOfRefs);
547
588
  childrenLists.push(childList);
548
589
  },
549
590
  {}
@@ -554,9 +595,28 @@
554
595
  if (ITEMS_KEY in resolvedSchema && !Array.isArray(resolvedSchema.items) && typeof resolvedSchema.items !== "boolean") {
555
596
  resolvedSchema = {
556
597
  ...resolvedSchema,
557
- items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI)
598
+ items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
558
599
  };
559
600
  }
601
+ if (resolveAnyOfOrOneOfRefs) {
602
+ let key;
603
+ let schemas;
604
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
605
+ key = ANY_OF_KEY;
606
+ schemas = resolvedSchema[ANY_OF_KEY];
607
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
608
+ key = ONE_OF_KEY;
609
+ schemas = resolvedSchema[ONE_OF_KEY];
610
+ }
611
+ if (key && schemas) {
612
+ resolvedSchema = {
613
+ ...resolvedSchema,
614
+ [key]: schemas.map(
615
+ (s) => resolveAllReferences(s, rootSchema, recurseList, baseURI, resolveAnyOfOrOneOfRefs)
616
+ )
617
+ };
618
+ }
619
+ }
560
620
  return deepEquals(schema, resolvedSchema) ? schema : resolvedSchema;
561
621
  }
562
622
  function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFormData, experimental_customMergeAllOf) {
@@ -571,12 +631,12 @@
571
631
  }
572
632
  if (PATTERN_PROPERTIES_KEY in schema) {
573
633
  const matchingProperties = getMatchingPatternProperties(schema, key);
574
- if (!isEmpty2(matchingProperties)) {
634
+ if (!isEmpty4(matchingProperties)) {
575
635
  schema.properties[key] = retrieveSchema(
576
636
  validator,
577
- { allOf: Object.values(matchingProperties) },
637
+ { [ALL_OF_KEY]: Object.values(matchingProperties) },
578
638
  rootSchema,
579
- formData,
639
+ get13(formData, [key]),
580
640
  experimental_customMergeAllOf
581
641
  );
582
642
  set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -584,12 +644,12 @@
584
644
  }
585
645
  }
586
646
  if (ADDITIONAL_PROPERTIES_KEY in schema && schema.additionalProperties !== false) {
587
- let additionalProperties = {};
647
+ let additionalProperties;
588
648
  if (typeof schema.additionalProperties !== "boolean") {
589
649
  if (REF_KEY in schema.additionalProperties) {
590
650
  additionalProperties = retrieveSchema(
591
651
  validator,
592
- { $ref: get12(schema.additionalProperties, [REF_KEY]) },
652
+ { [REF_KEY]: get13(schema.additionalProperties, [REF_KEY]) },
593
653
  rootSchema,
594
654
  formData,
595
655
  experimental_customMergeAllOf
@@ -602,10 +662,10 @@
602
662
  ...schema.additionalProperties
603
663
  };
604
664
  } else {
605
- additionalProperties = { type: guessType(get12(formData, [key])) };
665
+ additionalProperties = { type: guessType(get13(formData, [key])) };
606
666
  }
607
667
  } else {
608
- additionalProperties = { type: guessType(get12(formData, [key])) };
668
+ additionalProperties = { type: guessType(get13(formData, [key])) };
609
669
  }
610
670
  schema.properties[key] = additionalProperties;
611
671
  set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -616,7 +676,7 @@
616
676
  });
617
677
  return schema;
618
678
  }
619
- function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf) {
679
+ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expandAllBranches = false, recurseList = [], experimental_customMergeAllOf, resolveAnyOfOrOneOfRefs) {
620
680
  if (!isObject(schema)) {
621
681
  return [{}];
622
682
  }
@@ -627,7 +687,8 @@
627
687
  expandAllBranches,
628
688
  recurseList,
629
689
  rawFormData,
630
- experimental_customMergeAllOf
690
+ experimental_customMergeAllOf,
691
+ resolveAnyOfOrOneOfRefs
631
692
  );
632
693
  return resolvedSchemas.flatMap((s) => {
633
694
  let resolvedSchema = s;
@@ -679,12 +740,12 @@
679
740
  resolvedSchema = Object.keys(resolvedSchema.properties).reduce(
680
741
  (schema2, key) => {
681
742
  const matchingProperties = getMatchingPatternProperties(schema2, key);
682
- if (!isEmpty2(matchingProperties)) {
743
+ if (!isEmpty4(matchingProperties)) {
683
744
  schema2.properties[key] = retrieveSchema(
684
745
  validator,
685
746
  { allOf: [schema2.properties[key], ...Object.values(matchingProperties)] },
686
747
  rootSchema,
687
- rawFormData,
748
+ get13(rawFormData, [key]),
688
749
  experimental_customMergeAllOf
689
750
  );
690
751
  }
@@ -756,7 +817,7 @@
756
817
  function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
757
818
  let schemas = [resolvedSchema];
758
819
  for (const dependencyKey in dependencies) {
759
- if (!expandAllBranches && get12(formData, [dependencyKey]) === void 0) {
820
+ if (!expandAllBranches && get13(formData, [dependencyKey]) === void 0) {
760
821
  continue;
761
822
  }
762
823
  if (resolvedSchema.properties && !(dependencyKey in resolvedSchema.properties)) {
@@ -887,11 +948,11 @@
887
948
  const xxxOfs = schema[xxx].map(
888
949
  (xxxOf) => retrieveSchema(validator, xxxOf, rootSchema, formData, experimental_customMergeAllOf)
889
950
  );
890
- const data = get12(formData, selectorField);
951
+ const data = get13(formData, selectorField);
891
952
  if (data !== void 0) {
892
953
  return xxxOfs.find((xxx2) => {
893
- return isEqual(
894
- get12(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], get12(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
954
+ return isEqual2(
955
+ get13(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], get13(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
895
956
  data
896
957
  );
897
958
  });
@@ -904,13 +965,13 @@
904
965
  if (has5(schema, REF_KEY)) {
905
966
  fieldSchema = retrieveSchema(validator, schema, rootSchema, void 0, experimental_customMergeAllOf);
906
967
  }
907
- if (isEmpty2(path)) {
968
+ if (isEmpty4(path)) {
908
969
  return fieldSchema;
909
970
  }
910
971
  const pathList = Array.isArray(path) ? path : path.split(".");
911
972
  const [part, ...nestedPath] = pathList;
912
973
  if (part && has5(fieldSchema, part)) {
913
- fieldSchema = get12(fieldSchema, part);
974
+ fieldSchema = get13(fieldSchema, part);
914
975
  return getFromSchemaInternal(
915
976
  validator,
916
977
  rootSchema,
@@ -952,7 +1013,7 @@
952
1013
  parentField,
953
1014
  fieldName,
954
1015
  ONE_OF_KEY,
955
- get12(formData, subPath),
1016
+ get13(formData, subPath),
956
1017
  experimental_customMergeAllOf
957
1018
  );
958
1019
  } else if (has5(parentField, ANY_OF_KEY)) {
@@ -962,7 +1023,7 @@
962
1023
  parentField,
963
1024
  fieldName,
964
1025
  ANY_OF_KEY,
965
- get12(formData, subPath),
1026
+ get13(formData, subPath),
966
1027
  experimental_customMergeAllOf
967
1028
  );
968
1029
  }
@@ -1026,11 +1087,11 @@
1026
1087
  function calculateIndexScore(validator, rootSchema, schema, formData, experimental_customMergeAllOf) {
1027
1088
  let totalScore = 0;
1028
1089
  if (schema) {
1029
- if (isObject3(schema.properties)) {
1090
+ if (isObject2(schema.properties)) {
1030
1091
  totalScore += reduce(
1031
1092
  schema.properties,
1032
1093
  (score, value, key) => {
1033
- const formValue = get12(formData, key);
1094
+ const formValue = get13(formData, key);
1034
1095
  if (typeof value === "boolean") {
1035
1096
  return score;
1036
1097
  }
@@ -1057,14 +1118,14 @@
1057
1118
  validator,
1058
1119
  rootSchema,
1059
1120
  formValue,
1060
- get12(value, key2),
1121
+ get13(value, key2),
1061
1122
  -1,
1062
1123
  discriminator,
1063
1124
  experimental_customMergeAllOf
1064
1125
  );
1065
1126
  }
1066
1127
  if (value.type === "object") {
1067
- if (isObject3(formValue)) {
1128
+ if (isObject2(formValue)) {
1068
1129
  score += 1;
1069
1130
  }
1070
1131
  return score + calculateIndexScore(validator, rootSchema, value, formValue, experimental_customMergeAllOf);
@@ -1159,11 +1220,22 @@
1159
1220
  if (isObject(formData)) {
1160
1221
  const acc = Object.assign({}, defaults);
1161
1222
  return Object.keys(formData).reduce((acc2, key) => {
1162
- const keyValue = get12(formData, key);
1223
+ const keyValue = get13(formData, key);
1163
1224
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1164
1225
  const keyExistsInFormData = key in formData;
1226
+ const keyDefault = get13(defaults, key) ?? {};
1227
+ const defaultValueIsNestedObject = keyExistsInDefaults && Object.entries(keyDefault).some(([, v]) => isObject(v));
1228
+ const keyDefaultIsObject = keyExistsInDefaults && isObject(get13(defaults, key));
1229
+ const keyHasFormDataObject = keyExistsInFormData && isObject(keyValue);
1230
+ if (keyDefaultIsObject && keyHasFormDataObject && !defaultValueIsNestedObject) {
1231
+ acc2[key] = {
1232
+ ...get13(defaults, key),
1233
+ ...keyValue
1234
+ };
1235
+ return acc2;
1236
+ }
1165
1237
  acc2[key] = mergeDefaultsWithFormData(
1166
- defaults ? get12(defaults, key) : {},
1238
+ get13(defaults, key),
1167
1239
  keyValue,
1168
1240
  mergeExtraArrayDefaults,
1169
1241
  defaultSupercedesUndefined,
@@ -1174,7 +1246,7 @@
1174
1246
  return acc2;
1175
1247
  }, acc);
1176
1248
  }
1177
- if (defaultSupercedesUndefined && (!isNil(defaults) && isNil(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !isNil(formData)) {
1249
+ if (defaultSupercedesUndefined && (!(defaults === void 0) && isNil(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !isNil(formData)) {
1178
1250
  return defaults;
1179
1251
  }
1180
1252
  return formData;
@@ -1282,8 +1354,8 @@
1282
1354
  let value;
1283
1355
  let label = title;
1284
1356
  if (selectorField) {
1285
- const innerSchema = get12(aSchema, [PROPERTIES_KEY, selectorField], {});
1286
- value = get12(innerSchema, DEFAULT_KEY, get12(innerSchema, CONST_KEY));
1357
+ const innerSchema = get13(aSchema, [PROPERTIES_KEY, selectorField], {});
1358
+ value = get13(innerSchema, DEFAULT_KEY, get13(innerSchema, CONST_KEY));
1287
1359
  label = label || innerSchema?.title || aSchema.title || String(value);
1288
1360
  } else {
1289
1361
  value = toConstant(aSchema);
@@ -1315,18 +1387,27 @@
1315
1387
  }
1316
1388
  return {};
1317
1389
  }
1390
+ function computeDefaultBasedOnSchemaTypeAndDefaults(schema, computedDefault) {
1391
+ const { default: schemaDefault, type } = schema;
1392
+ const shouldReturnNullAsDefault = Array.isArray(type) && type.includes("null") && isEmpty4(computedDefault) && schemaDefault === null;
1393
+ return shouldReturnNullAsDefault ? null : computedDefault;
1394
+ }
1318
1395
  function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValues, isParentRequired, requiredFields = [], experimental_defaultFormStateBehavior = {}, isConst = false) {
1319
1396
  const { emptyObjectFields = "populateAllDefaults" } = experimental_defaultFormStateBehavior;
1320
- if (includeUndefinedValues || isConst) {
1397
+ if (includeUndefinedValues === true || isConst) {
1321
1398
  obj[key] = computedDefault;
1399
+ } else if (includeUndefinedValues === "excludeObjectChildren") {
1400
+ if (!isObject(computedDefault) || !isEmpty4(computedDefault)) {
1401
+ obj[key] = computedDefault;
1402
+ }
1322
1403
  } else if (emptyObjectFields !== "skipDefaults") {
1323
1404
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1324
1405
  if (isObject(computedDefault)) {
1325
1406
  if (emptyObjectFields === "skipEmptyDefaults") {
1326
- if (!isEmpty2(computedDefault)) {
1407
+ if (!isEmpty4(computedDefault)) {
1327
1408
  obj[key] = computedDefault;
1328
1409
  }
1329
- } else if ((!isEmpty2(computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== "populateRequiredDefaults")) {
1410
+ } else if ((!isEmpty4(computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== "populateRequiredDefaults")) {
1330
1411
  obj[key] = computedDefault;
1331
1412
  }
1332
1413
  } else if (
@@ -1350,15 +1431,16 @@
1350
1431
  experimental_defaultFormStateBehavior = void 0,
1351
1432
  experimental_customMergeAllOf = void 0,
1352
1433
  required,
1353
- shouldMergeDefaultsIntoFormData = false
1434
+ shouldMergeDefaultsIntoFormData = false,
1435
+ initialDefaultsGenerated
1354
1436
  } = computeDefaultsProps;
1355
- const formData = isObject(rawFormData) ? rawFormData : {};
1437
+ let formData = isObject(rawFormData) ? rawFormData : {};
1356
1438
  const schema = isObject(rawSchema) ? rawSchema : {};
1357
1439
  let defaults = parentDefaults;
1358
1440
  let schemaToCompute = null;
1359
1441
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1360
1442
  let updatedRecurseList = _recurseList;
1361
- if (schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1443
+ if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1362
1444
  defaults = schema[CONST_KEY];
1363
1445
  } else if (isObject(defaults) && isObject(schema.default)) {
1364
1446
  defaults = mergeObjects(defaults, schema.default);
@@ -1373,6 +1455,9 @@
1373
1455
  if (schemaToCompute && !defaults) {
1374
1456
  defaults = schema.default;
1375
1457
  }
1458
+ if (shouldMergeDefaultsIntoFormData && schemaToCompute && !isObject(rawFormData)) {
1459
+ formData = rawFormData;
1460
+ }
1376
1461
  } else if (DEPENDENCIES_KEY in schema) {
1377
1462
  const defaultFormData = {
1378
1463
  ...getDefaultBasedOnSchemaType(validator, schema, computeDefaultsProps, defaults),
@@ -1450,9 +1535,10 @@
1450
1535
  experimental_defaultFormStateBehavior: experimental_dfsb_to_compute,
1451
1536
  experimental_customMergeAllOf,
1452
1537
  parentDefaults: defaults,
1453
- rawFormData: formData,
1538
+ rawFormData: rawFormData ?? formData,
1454
1539
  required,
1455
- shouldMergeDefaultsIntoFormData
1540
+ shouldMergeDefaultsIntoFormData,
1541
+ initialDefaultsGenerated
1456
1542
  });
1457
1543
  }
1458
1544
  if (defaults === void 0) {
@@ -1504,7 +1590,8 @@
1504
1590
  experimental_defaultFormStateBehavior = void 0,
1505
1591
  experimental_customMergeAllOf = void 0,
1506
1592
  required,
1507
- shouldMergeDefaultsIntoFormData
1593
+ shouldMergeDefaultsIntoFormData,
1594
+ initialDefaultsGenerated
1508
1595
  } = {}, defaults) {
1509
1596
  {
1510
1597
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1513,7 +1600,7 @@
1513
1600
  const parentConst = retrievedSchema[CONST_KEY];
1514
1601
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
1515
1602
  (acc, key) => {
1516
- const propertySchema = get12(retrievedSchema, [PROPERTIES_KEY, key], {});
1603
+ const propertySchema = get13(retrievedSchema, [PROPERTIES_KEY, key], {});
1517
1604
  const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1518
1605
  const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(propertySchema);
1519
1606
  const computedDefault = computeDefaults(validator, propertySchema, {
@@ -1522,10 +1609,11 @@
1522
1609
  experimental_defaultFormStateBehavior,
1523
1610
  experimental_customMergeAllOf,
1524
1611
  includeUndefinedValues: includeUndefinedValues === true,
1525
- parentDefaults: get12(defaults, [key]),
1526
- rawFormData: get12(formData, [key]),
1612
+ parentDefaults: get13(defaults, [key]),
1613
+ rawFormData: get13(formData, [key]),
1527
1614
  required: retrievedSchema.required?.includes(key),
1528
- shouldMergeDefaultsIntoFormData
1615
+ shouldMergeDefaultsIntoFormData,
1616
+ initialDefaultsGenerated
1529
1617
  });
1530
1618
  maybeAddDefaultToObject(
1531
1619
  acc,
@@ -1541,7 +1629,7 @@
1541
1629
  },
1542
1630
  {}
1543
1631
  );
1544
- if (retrievedSchema.additionalProperties) {
1632
+ if (retrievedSchema.additionalProperties && !initialDefaultsGenerated) {
1545
1633
  const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties) ? retrievedSchema.additionalProperties : {};
1546
1634
  const keys2 = /* @__PURE__ */ new Set();
1547
1635
  if (isObject(defaults)) {
@@ -1559,10 +1647,11 @@
1559
1647
  experimental_defaultFormStateBehavior,
1560
1648
  experimental_customMergeAllOf,
1561
1649
  includeUndefinedValues: includeUndefinedValues === true,
1562
- parentDefaults: get12(defaults, [key]),
1563
- rawFormData: get12(formData, [key]),
1650
+ parentDefaults: get13(defaults, [key]),
1651
+ rawFormData: get13(formData, [key]),
1564
1652
  required: retrievedSchema.required?.includes(key),
1565
- shouldMergeDefaultsIntoFormData
1653
+ shouldMergeDefaultsIntoFormData,
1654
+ initialDefaultsGenerated
1566
1655
  });
1567
1656
  maybeAddDefaultToObject(
1568
1657
  objectDefaults,
@@ -1574,7 +1663,7 @@
1574
1663
  );
1575
1664
  });
1576
1665
  }
1577
- return objectDefaults;
1666
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, objectDefaults);
1578
1667
  }
1579
1668
  }
1580
1669
  function getArrayDefaults(validator, rawSchema, {
@@ -1584,7 +1673,9 @@
1584
1673
  experimental_defaultFormStateBehavior = void 0,
1585
1674
  experimental_customMergeAllOf = void 0,
1586
1675
  required,
1587
- shouldMergeDefaultsIntoFormData
1676
+ requiredAsRoot = false,
1677
+ shouldMergeDefaultsIntoFormData,
1678
+ initialDefaultsGenerated
1588
1679
  } = {}, defaults) {
1589
1680
  const schema = rawSchema;
1590
1681
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
@@ -1605,7 +1696,8 @@
1605
1696
  experimental_customMergeAllOf,
1606
1697
  parentDefaults: item,
1607
1698
  required,
1608
- shouldMergeDefaultsIntoFormData
1699
+ shouldMergeDefaultsIntoFormData,
1700
+ initialDefaultsGenerated
1609
1701
  });
1610
1702
  });
1611
1703
  }
@@ -1621,9 +1713,10 @@
1621
1713
  experimental_defaultFormStateBehavior,
1622
1714
  experimental_customMergeAllOf,
1623
1715
  rawFormData: item,
1624
- parentDefaults: get12(defaults, [idx]),
1716
+ parentDefaults: get13(defaults, [idx]),
1625
1717
  required,
1626
- shouldMergeDefaultsIntoFormData
1718
+ shouldMergeDefaultsIntoFormData,
1719
+ initialDefaultsGenerated
1627
1720
  });
1628
1721
  });
1629
1722
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
@@ -1639,25 +1732,29 @@
1639
1732
  return defaults ? defaults : void 0;
1640
1733
  }
1641
1734
  }
1735
+ let arrayDefault;
1642
1736
  const defaultsLength = Array.isArray(defaults) ? defaults.length : 0;
1643
1737
  if (!schema.minItems || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || computeSkipPopulate(validator, schema, rootSchema) || schema.minItems <= defaultsLength) {
1644
- return defaults ? defaults : emptyDefault;
1645
- }
1646
- const defaultEntries = defaults || [];
1647
- const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1648
- const fillerDefault = fillerSchema.default;
1649
- const fillerEntries = new Array(schema.minItems - defaultsLength).fill(
1650
- computeDefaults(validator, fillerSchema, {
1651
- parentDefaults: fillerDefault,
1652
- rootSchema,
1653
- _recurseList,
1654
- experimental_defaultFormStateBehavior,
1655
- experimental_customMergeAllOf,
1656
- required,
1657
- shouldMergeDefaultsIntoFormData
1658
- })
1659
- );
1660
- return defaultEntries.concat(fillerEntries);
1738
+ arrayDefault = defaults || !required && !requiredAsRoot ? defaults : emptyDefault;
1739
+ } else {
1740
+ const defaultEntries = defaults || [];
1741
+ const fillerSchema = getInnerSchemaForArrayItem(schema, 1 /* Invert */);
1742
+ const fillerDefault = fillerSchema.default;
1743
+ const fillerEntries = Array.from(
1744
+ { length: schema.minItems - defaultsLength },
1745
+ () => computeDefaults(validator, fillerSchema, {
1746
+ parentDefaults: fillerDefault,
1747
+ rootSchema,
1748
+ _recurseList,
1749
+ experimental_defaultFormStateBehavior,
1750
+ experimental_customMergeAllOf,
1751
+ required,
1752
+ shouldMergeDefaultsIntoFormData
1753
+ })
1754
+ );
1755
+ arrayDefault = defaultEntries.concat(fillerEntries);
1756
+ }
1757
+ return computeDefaultBasedOnSchemaTypeAndDefaults(rawSchema, arrayDefault);
1661
1758
  }
1662
1759
  function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps = {}, defaults) {
1663
1760
  switch (getSchemaType(rawSchema)) {
@@ -1670,7 +1767,7 @@
1670
1767
  }
1671
1768
  }
1672
1769
  }
1673
- function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
1770
+ function getDefaultFormState(validator, theSchema, formData, rootSchema, includeUndefinedValues = false, experimental_defaultFormStateBehavior, experimental_customMergeAllOf, initialDefaultsGenerated) {
1674
1771
  if (!isObject(theSchema)) {
1675
1772
  throw new Error("Invalid schema: " + theSchema);
1676
1773
  }
@@ -1681,8 +1778,16 @@
1681
1778
  experimental_defaultFormStateBehavior,
1682
1779
  experimental_customMergeAllOf,
1683
1780
  rawFormData: formData,
1684
- shouldMergeDefaultsIntoFormData: true
1781
+ shouldMergeDefaultsIntoFormData: true,
1782
+ initialDefaultsGenerated,
1783
+ requiredAsRoot: true
1685
1784
  });
1785
+ if (schema.type !== "object" && isObject(schema.default)) {
1786
+ return {
1787
+ ...defaults,
1788
+ ...formData
1789
+ };
1790
+ }
1686
1791
  if (isObject(formData) || Array.isArray(formData)) {
1687
1792
  const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
1688
1793
  const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
@@ -1739,10 +1844,10 @@
1739
1844
  if (schemaType === "object") {
1740
1845
  displayLabel = false;
1741
1846
  }
1742
- if (schemaType === "boolean" && !uiSchema[UI_WIDGET_KEY]) {
1847
+ if (schemaType === "boolean" && uiSchema && !uiSchema[UI_WIDGET_KEY]) {
1743
1848
  displayLabel = false;
1744
1849
  }
1745
- if (uiSchema[UI_FIELD_KEY]) {
1850
+ if (uiSchema && uiSchema[UI_FIELD_KEY]) {
1746
1851
  displayLabel = false;
1747
1852
  }
1748
1853
  return displayLabel;
@@ -1753,19 +1858,19 @@
1753
1858
  if (has5(newSchema, PROPERTIES_KEY)) {
1754
1859
  const removeOldSchemaData = {};
1755
1860
  if (has5(oldSchema, PROPERTIES_KEY)) {
1756
- const properties = get12(oldSchema, PROPERTIES_KEY, {});
1861
+ const properties = get13(oldSchema, PROPERTIES_KEY, {});
1757
1862
  Object.keys(properties).forEach((key) => {
1758
1863
  if (has5(data, key)) {
1759
1864
  removeOldSchemaData[key] = void 0;
1760
1865
  }
1761
1866
  });
1762
1867
  }
1763
- const keys2 = Object.keys(get12(newSchema, PROPERTIES_KEY, {}));
1868
+ const keys2 = Object.keys(get13(newSchema, PROPERTIES_KEY, {}));
1764
1869
  const nestedData = {};
1765
1870
  keys2.forEach((key) => {
1766
- const formValue = get12(data, key);
1767
- let oldKeyedSchema = get12(oldSchema, [PROPERTIES_KEY, key], {});
1768
- let newKeyedSchema = get12(newSchema, [PROPERTIES_KEY, key], {});
1871
+ const formValue = get13(data, key);
1872
+ let oldKeyedSchema = get13(oldSchema, [PROPERTIES_KEY, key], {});
1873
+ let newKeyedSchema = get13(newSchema, [PROPERTIES_KEY, key], {});
1769
1874
  if (has5(oldKeyedSchema, REF_KEY)) {
1770
1875
  oldKeyedSchema = retrieveSchema(
1771
1876
  validator,
@@ -1784,8 +1889,8 @@
1784
1889
  experimental_customMergeAllOf
1785
1890
  );
1786
1891
  }
1787
- const oldSchemaTypeForKey = get12(oldKeyedSchema, "type");
1788
- const newSchemaTypeForKey = get12(newKeyedSchema, "type");
1892
+ const oldSchemaTypeForKey = get13(oldKeyedSchema, "type");
1893
+ const newSchemaTypeForKey = get13(newKeyedSchema, "type");
1789
1894
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
1790
1895
  if (has5(removeOldSchemaData, key)) {
1791
1896
  delete removeOldSchemaData[key];
@@ -1803,17 +1908,17 @@
1803
1908
  nestedData[key] = itemData;
1804
1909
  }
1805
1910
  } else {
1806
- const newOptionDefault = get12(newKeyedSchema, "default", NO_VALUE);
1807
- const oldOptionDefault = get12(oldKeyedSchema, "default", NO_VALUE);
1911
+ const newOptionDefault = get13(newKeyedSchema, "default", NO_VALUE);
1912
+ const oldOptionDefault = get13(oldKeyedSchema, "default", NO_VALUE);
1808
1913
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
1809
1914
  if (oldOptionDefault === formValue) {
1810
1915
  removeOldSchemaData[key] = newOptionDefault;
1811
- } else if (get12(newKeyedSchema, "readOnly") === true) {
1916
+ } else if (get13(newKeyedSchema, "readOnly") === true) {
1812
1917
  removeOldSchemaData[key] = void 0;
1813
1918
  }
1814
1919
  }
1815
- const newOptionConst = get12(newKeyedSchema, "const", NO_VALUE);
1816
- const oldOptionConst = get12(oldKeyedSchema, "const", NO_VALUE);
1920
+ const newOptionConst = get13(newKeyedSchema, "const", NO_VALUE);
1921
+ const oldOptionConst = get13(oldKeyedSchema, "const", NO_VALUE);
1817
1922
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
1818
1923
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
1819
1924
  }
@@ -1825,9 +1930,9 @@
1825
1930
  ...removeOldSchemaData,
1826
1931
  ...nestedData
1827
1932
  };
1828
- } else if (get12(oldSchema, "type") === "array" && get12(newSchema, "type") === "array" && Array.isArray(data)) {
1829
- let oldSchemaItems = get12(oldSchema, "items");
1830
- let newSchemaItems = get12(newSchema, "items");
1933
+ } else if (get13(oldSchema, "type") === "array" && get13(newSchema, "type") === "array" && Array.isArray(data)) {
1934
+ let oldSchemaItems = get13(oldSchema, "items");
1935
+ let newSchemaItems = get13(newSchema, "items");
1831
1936
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
1832
1937
  if (has5(oldSchemaItems, REF_KEY)) {
1833
1938
  oldSchemaItems = retrieveSchema(
@@ -1847,10 +1952,10 @@
1847
1952
  experimental_customMergeAllOf
1848
1953
  );
1849
1954
  }
1850
- const oldSchemaType = get12(oldSchemaItems, "type");
1851
- const newSchemaType = get12(newSchemaItems, "type");
1955
+ const oldSchemaType = get13(oldSchemaItems, "type");
1956
+ const newSchemaType = get13(newSchemaItems, "type");
1852
1957
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
1853
- const maxItems = get12(newSchema, "maxItems", -1);
1958
+ const maxItems = get13(newSchema, "maxItems", -1);
1854
1959
  if (newSchemaType === "object") {
1855
1960
  newFormData = data.reduce((newValue, aValue) => {
1856
1961
  const itemValue = sanitizeDataForNewSchema(
@@ -1876,75 +1981,6 @@
1876
1981
  }
1877
1982
  return newFormData;
1878
1983
  }
1879
- function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1880
- const $id = id || idPrefix;
1881
- const idSchema = { $id };
1882
- if (typeof schema === "object") {
1883
- if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1884
- const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
1885
- const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
1886
- if (sameSchemaIndex === -1) {
1887
- return toIdSchemaInternal(
1888
- validator,
1889
- _schema,
1890
- idPrefix,
1891
- idSeparator,
1892
- id,
1893
- rootSchema,
1894
- formData,
1895
- _recurseList.concat(_schema),
1896
- experimental_customMergeAllOf
1897
- );
1898
- }
1899
- }
1900
- if (ITEMS_KEY in schema && !get12(schema, [ITEMS_KEY, REF_KEY])) {
1901
- return toIdSchemaInternal(
1902
- validator,
1903
- get12(schema, ITEMS_KEY),
1904
- idPrefix,
1905
- idSeparator,
1906
- id,
1907
- rootSchema,
1908
- formData,
1909
- _recurseList,
1910
- experimental_customMergeAllOf
1911
- );
1912
- }
1913
- if (getSchemaType(schema) === "object" && PROPERTIES_KEY in schema) {
1914
- for (const name in schema.properties) {
1915
- const field = schema[PROPERTIES_KEY][name];
1916
- const fieldId = idSchema[ID_KEY] + idSeparator + name;
1917
- idSchema[name] = toIdSchemaInternal(
1918
- validator,
1919
- field,
1920
- idPrefix,
1921
- idSeparator,
1922
- fieldId,
1923
- rootSchema,
1924
- // It's possible that formData is not an object -- this can happen if an
1925
- // array item has just been added, but not populated with data yet
1926
- get12(formData, [name]),
1927
- _recurseList,
1928
- experimental_customMergeAllOf
1929
- );
1930
- }
1931
- }
1932
- }
1933
- return idSchema;
1934
- }
1935
- function toIdSchema(validator, schema, id, rootSchema, formData, idPrefix = "root", idSeparator = "_", experimental_customMergeAllOf) {
1936
- return toIdSchemaInternal(
1937
- validator,
1938
- schema,
1939
- idPrefix,
1940
- idSeparator,
1941
- id,
1942
- rootSchema,
1943
- formData,
1944
- void 0,
1945
- experimental_customMergeAllOf
1946
- );
1947
- }
1948
1984
  function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1949
1985
  if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1950
1986
  const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
@@ -2036,7 +2072,7 @@
2036
2072
  }
2037
2073
  } else if (PROPERTIES_KEY in schema) {
2038
2074
  for (const property in schema.properties) {
2039
- const field = get12(schema, [PROPERTIES_KEY, property], {});
2075
+ const field = get13(schema, [PROPERTIES_KEY, property], {});
2040
2076
  pathSchema[property] = toPathSchemaInternal(
2041
2077
  validator,
2042
2078
  field,
@@ -2044,7 +2080,7 @@
2044
2080
  rootSchema,
2045
2081
  // It's possible that formData is not an object -- this can happen if an
2046
2082
  // array item has just been added, but not populated with data yet
2047
- get12(formData, [property]),
2083
+ get13(formData, [property]),
2048
2084
  _recurseList,
2049
2085
  experimental_customMergeAllOf
2050
2086
  );
@@ -2055,8 +2091,6 @@
2055
2091
  function toPathSchema(validator, schema, name = "", rootSchema, formData, experimental_customMergeAllOf) {
2056
2092
  return toPathSchemaInternal(validator, schema, name, rootSchema, formData, void 0, experimental_customMergeAllOf);
2057
2093
  }
2058
-
2059
- // src/createSchemaUtils.ts
2060
2094
  var SchemaUtils = class {
2061
2095
  /** Constructs the `SchemaUtils` instance with the given `validator` and `rootSchema` stored as instance variables
2062
2096
  *
@@ -2066,11 +2100,22 @@
2066
2100
  * @param [experimental_customMergeAllOf] - Optional function that allows for custom merging of `allOf` schemas
2067
2101
  */
2068
2102
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2069
- this.rootSchema = rootSchema;
2103
+ if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2104
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, get13(rootSchema, ID_KEY, "#"));
2105
+ } else {
2106
+ this.rootSchema = rootSchema;
2107
+ }
2070
2108
  this.validator = validator;
2071
2109
  this.experimental_defaultFormStateBehavior = experimental_defaultFormStateBehavior;
2072
2110
  this.experimental_customMergeAllOf = experimental_customMergeAllOf;
2073
2111
  }
2112
+ /** Returns the `rootSchema` in the `SchemaUtilsType`
2113
+ *
2114
+ * @returns - The `rootSchema`
2115
+ */
2116
+ getRootSchema() {
2117
+ return this.rootSchema;
2118
+ }
2074
2119
  /** Returns the `ValidatorType` in the `SchemaUtilsType`
2075
2120
  *
2076
2121
  * @returns - The `ValidatorType`
@@ -2143,9 +2188,10 @@
2143
2188
  * @param [includeUndefinedValues=false] - Optional flag, if true, cause undefined values to be added as defaults.
2144
2189
  * If "excludeObjectChildren", pass `includeUndefinedValues` as false when computing defaults for any nested
2145
2190
  * object properties.
2191
+ * @param initialDefaultsGenerated - Indicates whether or not initial defaults have been generated
2146
2192
  * @returns - The resulting `formData` with all the defaults provided
2147
2193
  */
2148
- getDefaultFormState(schema, formData, includeUndefinedValues = false) {
2194
+ getDefaultFormState(schema, formData, includeUndefinedValues = false, initialDefaultsGenerated) {
2149
2195
  return getDefaultFormState(
2150
2196
  this.validator,
2151
2197
  schema,
@@ -2153,7 +2199,8 @@
2153
2199
  this.rootSchema,
2154
2200
  includeUndefinedValues,
2155
2201
  this.experimental_defaultFormStateBehavior,
2156
- this.experimental_customMergeAllOf
2202
+ this.experimental_customMergeAllOf,
2203
+ initialDefaultsGenerated
2157
2204
  );
2158
2205
  }
2159
2206
  /** Determines whether the combination of `schema` and `uiSchema` properties indicates that the label for the `schema`
@@ -2252,15 +2299,17 @@
2252
2299
  *
2253
2300
  * @param schema - The schema for which retrieving a schema is desired
2254
2301
  * @param [rawFormData] - The current formData, if any, to assist retrieving a schema
2302
+ * @param [resolveAnyOfOrOneOfRefs] - Optional flag indicating whether to resolved refs in anyOf/oneOf lists
2255
2303
  * @returns - The schema having its conditions, additional properties, references and dependencies resolved
2256
2304
  */
2257
- retrieveSchema(schema, rawFormData) {
2305
+ retrieveSchema(schema, rawFormData, resolveAnyOfOrOneOfRefs) {
2258
2306
  return retrieveSchema(
2259
2307
  this.validator,
2260
2308
  schema,
2261
2309
  this.rootSchema,
2262
2310
  rawFormData,
2263
- this.experimental_customMergeAllOf
2311
+ this.experimental_customMergeAllOf,
2312
+ resolveAnyOfOrOneOfRefs
2264
2313
  );
2265
2314
  }
2266
2315
  /** Sanitize the `data` associated with the `oldSchema` so it is considered appropriate for the `newSchema`. If the
@@ -2284,27 +2333,6 @@
2284
2333
  this.experimental_customMergeAllOf
2285
2334
  );
2286
2335
  }
2287
- /** Generates an `IdSchema` object for the `schema`, recursively
2288
- *
2289
- * @param schema - The schema for which the display label flag is desired
2290
- * @param [id] - The base id for the schema
2291
- * @param [formData] - The current formData, if any, onto which to provide any missing defaults
2292
- * @param [idPrefix='root'] - The prefix to use for the id
2293
- * @param [idSeparator='_'] - The separator to use for the path segments in the id
2294
- * @returns - The `IdSchema` object for the `schema`
2295
- */
2296
- toIdSchema(schema, id, formData, idPrefix = "root", idSeparator = "_") {
2297
- return toIdSchema(
2298
- this.validator,
2299
- schema,
2300
- id,
2301
- this.rootSchema,
2302
- formData,
2303
- idPrefix,
2304
- idSeparator,
2305
- this.experimental_customMergeAllOf
2306
- );
2307
- }
2308
2336
  /** Generates an `PathSchema` object for the `schema`, recursively
2309
2337
  *
2310
2338
  * @param schema - The schema for which the display label flag is desired
@@ -2390,6 +2418,31 @@
2390
2418
  return options;
2391
2419
  }
2392
2420
 
2421
+ // src/shallowEquals.ts
2422
+ function shallowEquals(a, b) {
2423
+ if (Object.is(a, b)) {
2424
+ return true;
2425
+ }
2426
+ if (a == null || b == null) {
2427
+ return false;
2428
+ }
2429
+ if (typeof a !== "object" || typeof b !== "object") {
2430
+ return false;
2431
+ }
2432
+ const keysA = Object.keys(a);
2433
+ const keysB = Object.keys(b);
2434
+ if (keysA.length !== keysB.length) {
2435
+ return false;
2436
+ }
2437
+ for (let i = 0; i < keysA.length; i++) {
2438
+ const key = keysA[i];
2439
+ if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {
2440
+ return false;
2441
+ }
2442
+ }
2443
+ return true;
2444
+ }
2445
+
2393
2446
  // src/replaceStringParameters.ts
2394
2447
  function replaceStringParameters(inputString, params) {
2395
2448
  let output = inputString;
@@ -2482,7 +2535,7 @@
2482
2535
  */
2483
2536
  getOrCreateErrorBlock(pathOfError) {
2484
2537
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2485
- let errorBlock = hasPath ? get12(this.errorSchema, pathOfError) : this.errorSchema;
2538
+ let errorBlock = hasPath ? get13(this.errorSchema, pathOfError) : this.errorSchema;
2486
2539
  if (!errorBlock && pathOfError) {
2487
2540
  errorBlock = {};
2488
2541
  setWith(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2508,7 +2561,7 @@
2508
2561
  */
2509
2562
  addErrors(errorOrList, pathOfError) {
2510
2563
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2511
- let errorsList = get12(errorBlock, ERRORS_KEY);
2564
+ let errorsList = get13(errorBlock, ERRORS_KEY);
2512
2565
  if (!Array.isArray(errorsList)) {
2513
2566
  errorsList = [];
2514
2567
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2547,6 +2600,22 @@
2547
2600
  return this;
2548
2601
  }
2549
2602
  };
2603
+ function getChangedFields(a, b) {
2604
+ const aIsPlainObject = isPlainObject2(a);
2605
+ const bIsPlainObject = isPlainObject2(b);
2606
+ if (a === b || !aIsPlainObject && !bIsPlainObject) {
2607
+ return [];
2608
+ }
2609
+ if (aIsPlainObject && !bIsPlainObject) {
2610
+ return keys(a);
2611
+ } else if (!aIsPlainObject && bIsPlainObject) {
2612
+ return keys(b);
2613
+ } else {
2614
+ const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get13(b, key))));
2615
+ const diffFields = difference(keys(b), keys(a));
2616
+ return [...unequalFields, ...diffFields];
2617
+ }
2618
+ }
2550
2619
 
2551
2620
  // src/getDateElementProps.ts
2552
2621
  function getDateElementProps(date, time, yearRange = [1900, (/* @__PURE__ */ new Date()).getFullYear() + 2], format = "YMD") {
@@ -2655,7 +2724,7 @@
2655
2724
  );
2656
2725
  }
2657
2726
  function getTestIds() {
2658
- if (typeof process === "undefined" || get12(process, "env.NODE_ENV") !== "test") {
2727
+ if (typeof process === "undefined" || get13(process, "env.NODE_ENV") !== "test") {
2659
2728
  return {};
2660
2729
  }
2661
2730
  const ids = /* @__PURE__ */ new Map();
@@ -2664,7 +2733,7 @@
2664
2733
  {
2665
2734
  get(_obj, prop) {
2666
2735
  if (!ids.has(prop)) {
2667
- ids.set(prop, nanoid.nanoid());
2736
+ ids.set(prop, uniqueId("test-id-"));
2668
2737
  }
2669
2738
  return ids.get(prop);
2670
2739
  }
@@ -2724,7 +2793,7 @@
2724
2793
  }
2725
2794
  };
2726
2795
  function mergeWidgetOptions(AWidget) {
2727
- let MergedWidget = get12(AWidget, "MergedWidget");
2796
+ let MergedWidget = get13(AWidget, "MergedWidget");
2728
2797
  if (!MergedWidget) {
2729
2798
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
2730
2799
  MergedWidget = ({ options, ...props }) => {
@@ -2740,7 +2809,7 @@
2740
2809
  return mergeWidgetOptions(widget);
2741
2810
  }
2742
2811
  if (typeof widget !== "string") {
2743
- throw new Error(`Unsupported widget definition: ${typeof widget}`);
2812
+ throw new Error(`Unsupported widget definition: ${typeof widget} in schema: ${JSON.stringify(schema)}`);
2744
2813
  }
2745
2814
  if (widget in registeredWidgets) {
2746
2815
  const registeredWidget = registeredWidgets[widget];
@@ -2748,14 +2817,14 @@
2748
2817
  }
2749
2818
  if (typeof type === "string") {
2750
2819
  if (!(type in widgetMap)) {
2751
- throw new Error(`No widget for type '${type}'`);
2820
+ throw new Error(`No widget for type '${type}' in schema: ${JSON.stringify(schema)}`);
2752
2821
  }
2753
2822
  if (widget in widgetMap[type]) {
2754
2823
  const registeredWidget = registeredWidgets[widgetMap[type][widget]];
2755
2824
  return getWidget(schema, registeredWidget, registeredWidgets);
2756
2825
  }
2757
2826
  }
2758
- throw new Error(`No widget '${widget}' for type '${type}'`);
2827
+ throw new Error(`No widget '${widget}' for type '${type}' in schema: ${JSON.stringify(schema)}`);
2759
2828
  }
2760
2829
 
2761
2830
  // src/hashForSchema.ts
@@ -2822,6 +2891,23 @@
2822
2891
  function buttonId(id, btn) {
2823
2892
  return idGenerator(id, btn);
2824
2893
  }
2894
+ function optionalControlsId(id, element) {
2895
+ return idGenerator(id, `optional${element}`);
2896
+ }
2897
+ function isFormDataAvailable(formData) {
2898
+ return !isNil(formData) && (!isObject2(formData) || Array.isArray(formData) || !isEmpty4(formData));
2899
+ }
2900
+ function isRootSchema(registry, schemaToCompare) {
2901
+ const { rootSchema, schemaUtils } = registry;
2902
+ if (isEqual2(schemaToCompare, rootSchema)) {
2903
+ return true;
2904
+ }
2905
+ if (REF_KEY in rootSchema) {
2906
+ const resolvedSchema = schemaUtils.retrieveSchema(rootSchema);
2907
+ return isEqual2(schemaToCompare, resolvedSchema);
2908
+ }
2909
+ return false;
2910
+ }
2825
2911
 
2826
2912
  // src/labelValue.ts
2827
2913
  function labelValue(label, hideLabel, fallback) {
@@ -2837,7 +2923,7 @@
2837
2923
  if (has5(regOrFc, FORM_CONTEXT_NAME)) {
2838
2924
  lookupPath.unshift(FORM_CONTEXT_NAME);
2839
2925
  }
2840
- return get12(regOrFc, [...lookupPath, toLookup], fallback);
2926
+ return get13(regOrFc, [...lookupPath, toLookup], fallback);
2841
2927
  }
2842
2928
 
2843
2929
  // src/orderProperties.ts
@@ -2918,10 +3004,35 @@
2918
3004
  }
2919
3005
 
2920
3006
  // src/shouldRender.ts
2921
- function shouldRender(component, nextProps, nextState) {
3007
+ function shouldRender(component, nextProps, nextState, updateStrategy = "customDeep") {
3008
+ if (updateStrategy === "always") {
3009
+ return true;
3010
+ }
3011
+ if (updateStrategy === "shallow") {
3012
+ const { props: props2, state: state2 } = component;
3013
+ return !shallowEquals(props2, nextProps) || !shallowEquals(state2, nextState);
3014
+ }
2922
3015
  const { props, state } = component;
2923
3016
  return !deepEquals(props, nextProps) || !deepEquals(state, nextState);
2924
3017
  }
3018
+ function getSchemaTypesForXxxOf(schemas) {
3019
+ const allTypes = uniq(
3020
+ schemas.map((s) => isObject2(s) ? getSchemaType(s) : void 0).flat().filter((t) => t !== void 0)
3021
+ );
3022
+ return allTypes.length === 1 ? allTypes[0] : allTypes;
3023
+ }
3024
+ function shouldRenderOptionalField(registry, schema, required, uiSchema) {
3025
+ const { enableOptionalDataFieldForType = [] } = getUiOptions(uiSchema, registry.globalUiOptions);
3026
+ let schemaType;
3027
+ if (ANY_OF_KEY in schema && Array.isArray(schema[ANY_OF_KEY])) {
3028
+ schemaType = getSchemaTypesForXxxOf(schema[ANY_OF_KEY]);
3029
+ } else if (ONE_OF_KEY in schema && Array.isArray(schema[ONE_OF_KEY])) {
3030
+ schemaType = getSchemaTypesForXxxOf(schema[ONE_OF_KEY]);
3031
+ } else {
3032
+ schemaType = getSchemaType(schema);
3033
+ }
3034
+ return !isRootSchema(registry, schema) && !required && !!schemaType && !Array.isArray(schemaType) && !!enableOptionalDataFieldForType.find((val) => val === schemaType);
3035
+ }
2925
3036
 
2926
3037
  // src/toDateString.ts
2927
3038
  function toDateString(dateObject, time = true) {
@@ -2950,7 +3061,7 @@
2950
3061
  return Object.keys(errorSchema).reduce((acc, key) => {
2951
3062
  if (key !== ERRORS_KEY) {
2952
3063
  const childSchema = errorSchema[key];
2953
- if (isPlainObject4(childSchema)) {
3064
+ if (isPlainObject2(childSchema)) {
2954
3065
  acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
2955
3066
  }
2956
3067
  }
@@ -2973,13 +3084,22 @@
2973
3084
  }
2974
3085
  return builder.ErrorSchema;
2975
3086
  }
3087
+
3088
+ // src/toFieldPathId.ts
3089
+ function toFieldPathId(fieldPath, globalFormOptions, parentPath) {
3090
+ const basePath = Array.isArray(parentPath) ? parentPath : parentPath?.path;
3091
+ const childPath = fieldPath === "" ? [] : [fieldPath];
3092
+ const path = basePath ? basePath.concat(...childPath) : childPath;
3093
+ const id = [globalFormOptions.idPrefix, ...path].join(globalFormOptions.idSeparator);
3094
+ return { path, [ID_KEY]: id };
3095
+ }
2976
3096
  function unwrapErrorHandler(errorHandler) {
2977
3097
  return Object.keys(errorHandler).reduce((acc, key) => {
2978
3098
  if (key === "addError") {
2979
3099
  return acc;
2980
3100
  } else {
2981
3101
  const childSchema = errorHandler[key];
2982
- if (isPlainObject4(childSchema)) {
3102
+ if (isPlainObject2(childSchema)) {
2983
3103
  return {
2984
3104
  ...acc,
2985
3105
  [key]: unwrapErrorHandler(childSchema)
@@ -3005,15 +3125,19 @@
3005
3125
  const SSS = pad(date.getMilliseconds(), 3);
3006
3126
  return `${yyyy}-${MM}-${dd}T${hh}:${mm}:${ss}.${SSS}`;
3007
3127
  }
3008
- function validationDataMerge(validationData, additionalErrorSchema) {
3128
+ function validationDataMerge(validationData, additionalErrorSchema, preventDuplicates = false) {
3009
3129
  if (!additionalErrorSchema) {
3010
3130
  return validationData;
3011
3131
  }
3012
3132
  const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
3013
3133
  let errors = toErrorList(additionalErrorSchema);
3014
3134
  let errorSchema = additionalErrorSchema;
3015
- if (!isEmpty2(oldErrorSchema)) {
3016
- errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
3135
+ if (!isEmpty4(oldErrorSchema)) {
3136
+ errorSchema = mergeObjects(
3137
+ oldErrorSchema,
3138
+ additionalErrorSchema,
3139
+ preventDuplicates ? "preventDuplicates" : true
3140
+ );
3017
3141
  errors = [...oldErrors].concat(errors);
3018
3142
  }
3019
3143
  return { errorSchema, errors };
@@ -3040,27 +3164,11 @@
3040
3164
  if (Array.isArray(schemaNode)) {
3041
3165
  return withIdRefPrefixArray([...schemaNode]);
3042
3166
  }
3043
- if (isObject3(schemaNode)) {
3167
+ if (isObject2(schemaNode)) {
3044
3168
  return withIdRefPrefixObject({ ...schemaNode });
3045
3169
  }
3046
3170
  return schemaNode;
3047
3171
  }
3048
- function getChangedFields(a, b) {
3049
- const aIsPlainObject = isPlainObject4(a);
3050
- const bIsPlainObject = isPlainObject4(b);
3051
- if (a === b || !aIsPlainObject && !bIsPlainObject) {
3052
- return [];
3053
- }
3054
- if (aIsPlainObject && !bIsPlainObject) {
3055
- return keys(a);
3056
- } else if (!aIsPlainObject && bIsPlainObject) {
3057
- return keys(b);
3058
- } else {
3059
- const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get12(b, key))));
3060
- const diffFields = difference(keys(b), keys(a));
3061
- return [...unequalFields, ...diffFields];
3062
- }
3063
- }
3064
3172
 
3065
3173
  // src/enums.ts
3066
3174
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
@@ -3084,6 +3192,9 @@
3084
3192
  TranslatableString2["PreviewLabel"] = "Preview";
3085
3193
  TranslatableString2["DecrementAriaLabel"] = "Decrease value by 1";
3086
3194
  TranslatableString2["IncrementAriaLabel"] = "Increase value by 1";
3195
+ TranslatableString2["OptionalObjectAdd"] = "Add data for optional field";
3196
+ TranslatableString2["OptionalObjectRemove"] = "Remove data for optional field";
3197
+ TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
3087
3198
  TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
3088
3199
  TranslatableString2["OptionPrefix"] = "Option %1";
3089
3200
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
@@ -3121,7 +3232,7 @@
3121
3232
  * @param hash - The hash value at which to map the schema
3122
3233
  */
3123
3234
  addSchema(schema, hash) {
3124
- const key = get12(schema, ID_KEY, hash);
3235
+ const key = get13(schema, ID_KEY, hash);
3125
3236
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3126
3237
  const existing = this.schemaMap[key];
3127
3238
  if (!existing) {
@@ -3217,6 +3328,8 @@
3217
3328
  exports.ALL_OF_KEY = ALL_OF_KEY;
3218
3329
  exports.ANY_OF_KEY = ANY_OF_KEY;
3219
3330
  exports.CONST_KEY = CONST_KEY;
3331
+ exports.DEFAULT_ID_PREFIX = DEFAULT_ID_PREFIX;
3332
+ exports.DEFAULT_ID_SEPARATOR = DEFAULT_ID_SEPARATOR;
3220
3333
  exports.DEFAULT_KEY = DEFAULT_KEY;
3221
3334
  exports.DEFINITIONS_KEY = DEFINITIONS_KEY;
3222
3335
  exports.DEPENDENCIES_KEY = DEPENDENCIES_KEY;
@@ -3228,6 +3341,7 @@
3228
3341
  exports.ID_KEY = ID_KEY;
3229
3342
  exports.IF_KEY = IF_KEY;
3230
3343
  exports.ITEMS_KEY = ITEMS_KEY;
3344
+ exports.JSON_SCHEMA_DRAFT_2019_09 = JSON_SCHEMA_DRAFT_2019_09;
3231
3345
  exports.JSON_SCHEMA_DRAFT_2020_12 = JSON_SCHEMA_DRAFT_2020_12;
3232
3346
  exports.JUNK_OPTION_ID = JUNK_OPTION_ID;
3233
3347
  exports.LOOKUP_MAP_NAME = LOOKUP_MAP_NAME;
@@ -3295,8 +3409,10 @@
3295
3409
  exports.isCustomWidget = isCustomWidget;
3296
3410
  exports.isFilesArray = isFilesArray;
3297
3411
  exports.isFixedItems = isFixedItems;
3412
+ exports.isFormDataAvailable = isFormDataAvailable;
3298
3413
  exports.isMultiSelect = isMultiSelect;
3299
3414
  exports.isObject = isObject;
3415
+ exports.isRootSchema = isRootSchema;
3300
3416
  exports.isSelect = isSelect;
3301
3417
  exports.labelValue = labelValue;
3302
3418
  exports.localToUTC = localToUTC;
@@ -3305,6 +3421,7 @@
3305
3421
  exports.mergeObjects = mergeObjects;
3306
3422
  exports.mergeSchemas = mergeSchemas;
3307
3423
  exports.optionId = optionId;
3424
+ exports.optionalControlsId = optionalControlsId;
3308
3425
  exports.optionsList = optionsList;
3309
3426
  exports.orderProperties = orderProperties;
3310
3427
  exports.pad = pad;
@@ -3315,14 +3432,16 @@
3315
3432
  exports.sanitizeDataForNewSchema = sanitizeDataForNewSchema;
3316
3433
  exports.schemaParser = schemaParser;
3317
3434
  exports.schemaRequiresTrueValue = schemaRequiresTrueValue;
3435
+ exports.shallowEquals = shallowEquals;
3318
3436
  exports.shouldRender = shouldRender;
3437
+ exports.shouldRenderOptionalField = shouldRenderOptionalField;
3319
3438
  exports.sortedJSONStringify = sortedJSONStringify;
3320
3439
  exports.titleId = titleId;
3321
3440
  exports.toConstant = toConstant;
3322
3441
  exports.toDateString = toDateString;
3323
3442
  exports.toErrorList = toErrorList;
3324
3443
  exports.toErrorSchema = toErrorSchema;
3325
- exports.toIdSchema = toIdSchema;
3444
+ exports.toFieldPathId = toFieldPathId;
3326
3445
  exports.toPathSchema = toPathSchema;
3327
3446
  exports.unwrapErrorHandler = unwrapErrorHandler;
3328
3447
  exports.utcToLocal = utcToLocal;