@rjsf/utils 5.24.10 → 6.0.0-beta.1

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 (182) hide show
  1. package/dist/index.js +605 -330
  2. package/dist/index.js.map +4 -4
  3. package/dist/utils.esm.js +575 -300
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +519 -268
  6. package/lib/ErrorSchemaBuilder.d.ts +7 -3
  7. package/lib/ErrorSchemaBuilder.js +1 -0
  8. package/lib/ErrorSchemaBuilder.js.map +1 -1
  9. package/lib/allowAdditionalItems.js.map +1 -1
  10. package/lib/asNumber.js.map +1 -1
  11. package/lib/canExpand.js +1 -1
  12. package/lib/canExpand.js.map +1 -1
  13. package/lib/constants.d.ts +11 -3
  14. package/lib/constants.js +11 -3
  15. package/lib/constants.js.map +1 -1
  16. package/lib/createErrorHandler.js.map +1 -1
  17. package/lib/createSchemaUtils.js +31 -27
  18. package/lib/createSchemaUtils.js.map +1 -1
  19. package/lib/dataURItoBlob.js.map +1 -1
  20. package/lib/dateRangeOptions.js.map +1 -1
  21. package/lib/deepEquals.js.map +1 -1
  22. package/lib/enumOptionsDeselectValue.js.map +1 -1
  23. package/lib/enumOptionsIndexForValue.js.map +1 -1
  24. package/lib/enumOptionsIsSelected.js.map +1 -1
  25. package/lib/enumOptionsSelectValue.js.map +1 -1
  26. package/lib/enumOptionsValueForIndex.js.map +1 -1
  27. package/lib/enums.d.ts +2 -0
  28. package/lib/enums.js +2 -0
  29. package/lib/enums.js.map +1 -1
  30. package/lib/findSchemaDefinition.js.map +1 -1
  31. package/lib/getChangedFields.js.map +1 -1
  32. package/lib/getDateElementProps.js.map +1 -1
  33. package/lib/getDiscriminatorFieldFromSchema.js +2 -1
  34. package/lib/getDiscriminatorFieldFromSchema.js.map +1 -1
  35. package/lib/getInputProps.js.map +1 -1
  36. package/lib/getOptionMatchingSimpleDiscriminator.js.map +1 -1
  37. package/lib/getSchemaType.d.ts +1 -0
  38. package/lib/getSchemaType.js +2 -1
  39. package/lib/getSchemaType.js.map +1 -1
  40. package/lib/getSubmitButtonOptions.js.map +1 -1
  41. package/lib/getTemplate.js +9 -0
  42. package/lib/getTemplate.js.map +1 -1
  43. package/lib/getTestIds.d.ts +17 -0
  44. package/lib/getTestIds.js +34 -0
  45. package/lib/getTestIds.js.map +1 -0
  46. package/lib/getUiOptions.js.map +1 -1
  47. package/lib/getWidget.js.map +1 -1
  48. package/lib/guessType.d.ts +1 -1
  49. package/lib/guessType.js.map +1 -1
  50. package/lib/hasWidget.js.map +1 -1
  51. package/lib/hashForSchema.d.ts +22 -0
  52. package/lib/hashForSchema.js +24 -6
  53. package/lib/hashForSchema.js.map +1 -1
  54. package/lib/idGenerators.d.ts +7 -0
  55. package/lib/idGenerators.js +9 -0
  56. package/lib/idGenerators.js.map +1 -1
  57. package/lib/index.d.ts +5 -3
  58. package/lib/index.js +5 -3
  59. package/lib/index.js.map +1 -1
  60. package/lib/isObject.d.ts +1 -1
  61. package/lib/isObject.js.map +1 -1
  62. package/lib/lookupFromFormContext.d.ts +11 -0
  63. package/lib/lookupFromFormContext.js +20 -0
  64. package/lib/lookupFromFormContext.js.map +1 -0
  65. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  66. package/lib/mergeObjects.js.map +1 -1
  67. package/lib/mergeSchemas.js.map +1 -1
  68. package/lib/optionsList.d.ts +8 -6
  69. package/lib/optionsList.js +29 -18
  70. package/lib/optionsList.js.map +1 -1
  71. package/lib/orderProperties.js.map +1 -1
  72. package/lib/pad.js.map +1 -1
  73. package/lib/parseDateString.js +1 -1
  74. package/lib/parseDateString.js.map +1 -1
  75. package/lib/parser/ParserValidator.js.map +1 -1
  76. package/lib/parser/schemaParser.js.map +1 -1
  77. package/lib/rangeSpec.js.map +1 -1
  78. package/lib/replaceStringParameters.js.map +1 -1
  79. package/lib/schema/findFieldInSchema.d.ts +19 -0
  80. package/lib/schema/findFieldInSchema.js +61 -0
  81. package/lib/schema/findFieldInSchema.js.map +1 -0
  82. package/lib/schema/findSelectedOptionInXxxOf.d.ts +16 -0
  83. package/lib/schema/findSelectedOptionInXxxOf.js +34 -0
  84. package/lib/schema/findSelectedOptionInXxxOf.js.map +1 -0
  85. package/lib/schema/getClosestMatchingOption.js.map +1 -1
  86. package/lib/schema/getDefaultFormState.js +2 -3
  87. package/lib/schema/getDefaultFormState.js.map +1 -1
  88. package/lib/schema/getDisplayLabel.js.map +1 -1
  89. package/lib/schema/getFirstMatchingOption.js +70 -2
  90. package/lib/schema/getFirstMatchingOption.js.map +1 -1
  91. package/lib/schema/getFromSchema.d.ts +14 -0
  92. package/lib/schema/getFromSchema.js +39 -0
  93. package/lib/schema/getFromSchema.js.map +1 -0
  94. package/lib/schema/index.d.ts +4 -3
  95. package/lib/schema/index.js +4 -3
  96. package/lib/schema/index.js.map +1 -1
  97. package/lib/schema/isFilesArray.js.map +1 -1
  98. package/lib/schema/isMultiSelect.js.map +1 -1
  99. package/lib/schema/isSelect.js.map +1 -1
  100. package/lib/schema/retrieveSchema.d.ts +7 -0
  101. package/lib/schema/retrieveSchema.js +65 -21
  102. package/lib/schema/retrieveSchema.js.map +1 -1
  103. package/lib/schema/sanitizeDataForNewSchema.js.map +1 -1
  104. package/lib/schema/toIdSchema.js +20 -19
  105. package/lib/schema/toIdSchema.js.map +1 -1
  106. package/lib/schema/toPathSchema.js +1 -1
  107. package/lib/schema/toPathSchema.js.map +1 -1
  108. package/lib/schemaRequiresTrueValue.js.map +1 -1
  109. package/lib/toConstant.js.map +1 -1
  110. package/lib/toErrorList.js.map +1 -1
  111. package/lib/toErrorSchema.js.map +1 -1
  112. package/lib/tsconfig.tsbuildinfo +1 -1
  113. package/lib/types.d.ts +127 -128
  114. package/lib/unwrapErrorHandler.js.map +1 -1
  115. package/lib/utcToLocal.js.map +1 -1
  116. package/lib/validationDataMerge.js.map +1 -1
  117. package/lib/withIdRefPrefix.js.map +1 -1
  118. package/package.json +35 -25
  119. package/src/ErrorSchemaBuilder.ts +10 -4
  120. package/src/canExpand.ts +2 -2
  121. package/src/constants.ts +12 -3
  122. package/src/createSchemaUtils.ts +79 -43
  123. package/src/dataURItoBlob.ts +1 -1
  124. package/src/dateRangeOptions.ts +1 -1
  125. package/src/enumOptionsDeselectValue.ts +1 -1
  126. package/src/enumOptionsIndexForValue.ts +1 -1
  127. package/src/enumOptionsIsSelected.ts +1 -1
  128. package/src/enumOptionsSelectValue.ts +1 -1
  129. package/src/enumOptionsValueForIndex.ts +1 -1
  130. package/src/enums.ts +2 -0
  131. package/src/findSchemaDefinition.ts +2 -2
  132. package/src/getDateElementProps.ts +2 -2
  133. package/src/getDiscriminatorFieldFromSchema.ts +2 -1
  134. package/src/getInputProps.ts +2 -2
  135. package/src/getOptionMatchingSimpleDiscriminator.ts +2 -2
  136. package/src/getSchemaType.ts +3 -2
  137. package/src/getSubmitButtonOptions.ts +1 -1
  138. package/src/getTemplate.ts +12 -1
  139. package/src/getTestIds.ts +40 -0
  140. package/src/getUiOptions.ts +2 -2
  141. package/src/getWidget.tsx +2 -2
  142. package/src/hasWidget.ts +1 -1
  143. package/src/hashForSchema.ts +26 -6
  144. package/src/idGenerators.ts +10 -0
  145. package/src/index.ts +19 -2
  146. package/src/isCustomWidget.ts +1 -1
  147. package/src/isObject.ts +1 -1
  148. package/src/labelValue.ts +2 -2
  149. package/src/lookupFromFormContext.ts +26 -0
  150. package/src/mergeDefaultsWithFormData.ts +3 -3
  151. package/src/mergeObjects.ts +24 -21
  152. package/src/optionsList.ts +31 -22
  153. package/src/parser/ParserValidator.ts +2 -2
  154. package/src/parser/schemaParser.ts +2 -2
  155. package/src/schema/findFieldInSchema.ts +138 -0
  156. package/src/schema/findSelectedOptionInXxxOf.ts +53 -0
  157. package/src/schema/getClosestMatchingOption.ts +8 -8
  158. package/src/schema/getDefaultFormState.ts +26 -25
  159. package/src/schema/getDisplayLabel.ts +2 -2
  160. package/src/schema/getFirstMatchingOption.ts +79 -4
  161. package/src/schema/getFromSchema.ts +100 -0
  162. package/src/schema/index.ts +6 -4
  163. package/src/schema/isFilesArray.ts +2 -2
  164. package/src/schema/isMultiSelect.ts +2 -2
  165. package/src/schema/isSelect.ts +1 -1
  166. package/src/schema/retrieveSchema.ts +135 -69
  167. package/src/schema/sanitizeDataForNewSchema.ts +10 -10
  168. package/src/schema/toIdSchema.ts +45 -44
  169. package/src/schema/toPathSchema.ts +10 -10
  170. package/src/toErrorList.ts +2 -2
  171. package/src/types.ts +233 -173
  172. package/src/validationDataMerge.ts +1 -1
  173. package/src/withIdRefPrefix.ts +1 -1
  174. package/LICENSE.md +0 -201
  175. package/lib/schema/getMatchingOption.d.ts +0 -14
  176. package/lib/schema/getMatchingOption.js +0 -85
  177. package/lib/schema/getMatchingOption.js.map +0 -1
  178. package/lib/schema/mergeValidationData.d.ts +0 -14
  179. package/lib/schema/mergeValidationData.js +0 -28
  180. package/lib/schema/mergeValidationData.js.map +0 -1
  181. package/src/schema/getMatchingOption.ts +0 -103
  182. package/src/schema/mergeValidationData.ts +0 -38
package/dist/index.js CHANGED
@@ -28,8 +28,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
30
  // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
33
  ADDITIONAL_PROPERTIES_KEY: () => ADDITIONAL_PROPERTIES_KEY,
34
34
  ADDITIONAL_PROPERTY_FLAG: () => ADDITIONAL_PROPERTY_FLAG,
35
35
  ALL_OF_KEY: () => ALL_OF_KEY,
@@ -38,20 +38,24 @@ __export(src_exports, {
38
38
  DEFAULT_KEY: () => DEFAULT_KEY,
39
39
  DEFINITIONS_KEY: () => DEFINITIONS_KEY,
40
40
  DEPENDENCIES_KEY: () => DEPENDENCIES_KEY,
41
+ DISCRIMINATOR_PATH: () => DISCRIMINATOR_PATH,
41
42
  ENUM_KEY: () => ENUM_KEY,
42
43
  ERRORS_KEY: () => ERRORS_KEY,
43
44
  ErrorSchemaBuilder: () => ErrorSchemaBuilder,
45
+ FORM_CONTEXT_NAME: () => FORM_CONTEXT_NAME,
44
46
  ID_KEY: () => ID_KEY,
45
47
  IF_KEY: () => IF_KEY,
46
48
  ITEMS_KEY: () => ITEMS_KEY,
47
49
  JUNK_OPTION_ID: () => JUNK_OPTION_ID,
50
+ LOOKUP_MAP_NAME: () => LOOKUP_MAP_NAME,
48
51
  NAME_KEY: () => NAME_KEY,
49
52
  ONE_OF_KEY: () => ONE_OF_KEY,
53
+ PATTERN_PROPERTIES_KEY: () => PATTERN_PROPERTIES_KEY,
50
54
  PROPERTIES_KEY: () => PROPERTIES_KEY,
55
+ READONLY_KEY: () => READONLY_KEY,
51
56
  REF_KEY: () => REF_KEY,
52
57
  REQUIRED_KEY: () => REQUIRED_KEY,
53
58
  RJSF_ADDITIONAL_PROPERTIES_FLAG: () => RJSF_ADDITIONAL_PROPERTIES_FLAG,
54
- RJSF_ADDITONAL_PROPERTIES_FLAG: () => RJSF_ADDITONAL_PROPERTIES_FLAG,
55
59
  ROOT_SCHEMA_PREFIX: () => ROOT_SCHEMA_PREFIX,
56
60
  SUBMIT_BTN_OPTIONS_KEY: () => SUBMIT_BTN_OPTIONS_KEY,
57
61
  TranslatableString: () => TranslatableString,
@@ -62,6 +66,7 @@ __export(src_exports, {
62
66
  allowAdditionalItems: () => allowAdditionalItems,
63
67
  ariaDescribedByIds: () => ariaDescribedByIds,
64
68
  asNumber: () => asNumber,
69
+ buttonId: () => buttonId,
65
70
  canExpand: () => canExpand,
66
71
  createErrorHandler: () => createErrorHandler,
67
72
  createSchemaUtils: () => createSchemaUtils,
@@ -77,7 +82,9 @@ __export(src_exports, {
77
82
  enumOptionsValueForIndex: () => enumOptionsValueForIndex,
78
83
  errorId: () => errorId,
79
84
  examplesId: () => examplesId,
85
+ findFieldInSchema: () => findFieldInSchema,
80
86
  findSchemaDefinition: () => findSchemaDefinition,
87
+ findSelectedOptionInXxxOf: () => findSelectedOptionInXxxOf,
81
88
  getChangedFields: () => getChangedFields,
82
89
  getClosestMatchingOption: () => getClosestMatchingOption,
83
90
  getDateElementProps: () => getDateElementProps,
@@ -85,17 +92,20 @@ __export(src_exports, {
85
92
  getDiscriminatorFieldFromSchema: () => getDiscriminatorFieldFromSchema,
86
93
  getDisplayLabel: () => getDisplayLabel,
87
94
  getFirstMatchingOption: () => getFirstMatchingOption,
95
+ getFromSchema: () => getFromSchema,
88
96
  getInputProps: () => getInputProps,
89
- getMatchingOption: () => getMatchingOption,
90
97
  getOptionMatchingSimpleDiscriminator: () => getOptionMatchingSimpleDiscriminator,
91
98
  getSchemaType: () => getSchemaType,
92
99
  getSubmitButtonOptions: () => getSubmitButtonOptions,
93
100
  getTemplate: () => getTemplate,
101
+ getTestIds: () => getTestIds,
94
102
  getUiOptions: () => getUiOptions,
95
103
  getWidget: () => getWidget,
96
104
  guessType: () => guessType,
97
105
  hasWidget: () => hasWidget,
98
106
  hashForSchema: () => hashForSchema,
107
+ hashObject: () => hashObject,
108
+ hashString: () => hashString,
99
109
  helpId: () => helpId,
100
110
  isConstant: () => isConstant,
101
111
  isCustomWidget: () => isCustomWidget,
@@ -106,10 +116,10 @@ __export(src_exports, {
106
116
  isSelect: () => isSelect,
107
117
  labelValue: () => labelValue,
108
118
  localToUTC: () => localToUTC,
119
+ lookupFromFormContext: () => lookupFromFormContext,
109
120
  mergeDefaultsWithFormData: () => mergeDefaultsWithFormData,
110
121
  mergeObjects: () => mergeObjects,
111
122
  mergeSchemas: () => mergeSchemas,
112
- mergeValidationData: () => mergeValidationData,
113
123
  optionId: () => optionId,
114
124
  optionsList: () => optionsList,
115
125
  orderProperties: () => orderProperties,
@@ -122,6 +132,7 @@ __export(src_exports, {
122
132
  schemaParser: () => schemaParser,
123
133
  schemaRequiresTrueValue: () => schemaRequiresTrueValue,
124
134
  shouldRender: () => shouldRender,
135
+ sortedJSONStringify: () => sortedJSONStringify,
125
136
  titleId: () => titleId,
126
137
  toConstant: () => toConstant,
127
138
  toDateString: () => toDateString,
@@ -134,7 +145,7 @@ __export(src_exports, {
134
145
  validationDataMerge: () => validationDataMerge,
135
146
  withIdRefPrefix: () => withIdRefPrefix
136
147
  });
137
- module.exports = __toCommonJS(src_exports);
148
+ module.exports = __toCommonJS(index_exports);
138
149
 
139
150
  // src/isObject.ts
140
151
  function isObject(thing) {
@@ -197,11 +208,15 @@ var ITEMS_KEY = "items";
197
208
  var JUNK_OPTION_ID = "_$junk_option_schema_id$_";
198
209
  var NAME_KEY = "$name";
199
210
  var ONE_OF_KEY = "oneOf";
211
+ var PATTERN_PROPERTIES_KEY = "patternProperties";
200
212
  var PROPERTIES_KEY = "properties";
213
+ var READONLY_KEY = "readonly";
201
214
  var REQUIRED_KEY = "required";
202
215
  var SUBMIT_BTN_OPTIONS_KEY = "submitButtonOptions";
203
216
  var REF_KEY = "$ref";
204
- var RJSF_ADDITONAL_PROPERTIES_FLAG = "__rjsf_additionalProperties";
217
+ var DISCRIMINATOR_PATH = ["discriminator", "propertyName"];
218
+ var FORM_CONTEXT_NAME = "formContext";
219
+ var LOOKUP_MAP_NAME = "layoutGridLookupMap";
205
220
  var RJSF_ADDITIONAL_PROPERTIES_FLAG = "__rjsf_additionalProperties";
206
221
  var ROOT_SCHEMA_PREFIX = "__rjsf_rootSchema";
207
222
  var UI_FIELD_KEY = "ui:field";
@@ -229,7 +244,7 @@ function getUiOptions(uiSchema = {}, globalOptions = {}) {
229
244
 
230
245
  // src/canExpand.ts
231
246
  function canExpand(schema, uiSchema = {}, formData) {
232
- if (!schema.additionalProperties) {
247
+ if (!(schema.additionalProperties || schema.patternProperties)) {
233
248
  return false;
234
249
  }
235
250
  const { expandable = true } = getUiOptions(uiSchema);
@@ -243,7 +258,7 @@ function canExpand(schema, uiSchema = {}, formData) {
243
258
  }
244
259
 
245
260
  // src/createErrorHandler.ts
246
- var import_isPlainObject = __toESM(require("lodash/isPlainObject"));
261
+ var import_isPlainObject = __toESM(require("lodash/isPlainObject"), 1);
247
262
  function createErrorHandler(formData) {
248
263
  const handler = {
249
264
  // We store the list of errors for this node in a property named __errors
@@ -269,7 +284,7 @@ function createErrorHandler(formData) {
269
284
  }
270
285
 
271
286
  // src/deepEquals.ts
272
- var import_isEqualWith = __toESM(require("lodash/isEqualWith"));
287
+ var import_isEqualWith = __toESM(require("lodash/isEqualWith"), 1);
273
288
  function deepEquals(a, b) {
274
289
  return (0, import_isEqualWith.default)(a, b, (obj, other) => {
275
290
  if (typeof obj === "function" && typeof other === "function") {
@@ -279,13 +294,27 @@ function deepEquals(a, b) {
279
294
  });
280
295
  }
281
296
 
282
- // src/schema/getDefaultFormState.ts
283
- var import_get7 = __toESM(require("lodash/get"));
284
- var import_isEmpty = __toESM(require("lodash/isEmpty"));
297
+ // src/schema/findFieldInSchema.ts
298
+ var import_get7 = __toESM(require("lodash/get"), 1);
299
+ var import_has3 = __toESM(require("lodash/has"), 1);
300
+
301
+ // src/schema/findSelectedOptionInXxxOf.ts
302
+ var import_get5 = __toESM(require("lodash/get"), 1);
303
+ var import_isEqual = __toESM(require("lodash/isEqual"), 1);
304
+
305
+ // src/schema/retrieveSchema.ts
306
+ var import_get4 = __toESM(require("lodash/get"), 1);
307
+ var import_set = __toESM(require("lodash/set"), 1);
308
+ var import_times = __toESM(require("lodash/times"), 1);
309
+ var import_transform = __toESM(require("lodash/transform"), 1);
310
+ var import_merge = __toESM(require("lodash/merge"), 1);
311
+ var import_flattenDeep = __toESM(require("lodash/flattenDeep"), 1);
312
+ var import_uniq = __toESM(require("lodash/uniq"), 1);
313
+ var import_json_schema_merge_allof = __toESM(require("json-schema-merge-allof"), 1);
285
314
 
286
315
  // src/findSchemaDefinition.ts
287
- var import_jsonpointer = __toESM(require("jsonpointer"));
288
- var import_omit = __toESM(require("lodash/omit"));
316
+ var import_jsonpointer = __toESM(require("jsonpointer"), 1);
317
+ var import_omit = __toESM(require("lodash/omit"), 1);
289
318
  function splitKeyElementFromObject(key, object) {
290
319
  const value = object[key];
291
320
  const remaining = (0, import_omit.default)(object, [key]);
@@ -327,113 +356,12 @@ function findSchemaDefinition($ref, rootSchema = {}) {
327
356
  return findSchemaDefinitionRecursive($ref, rootSchema, recurseList);
328
357
  }
329
358
 
330
- // src/schema/getClosestMatchingOption.ts
331
- var import_get5 = __toESM(require("lodash/get"));
332
- var import_has2 = __toESM(require("lodash/has"));
333
- var import_isNumber2 = __toESM(require("lodash/isNumber"));
334
- var import_isObject5 = __toESM(require("lodash/isObject"));
335
- var import_isString2 = __toESM(require("lodash/isString"));
336
- var import_reduce = __toESM(require("lodash/reduce"));
337
- var import_times2 = __toESM(require("lodash/times"));
338
-
339
- // src/schema/getMatchingOption.ts
340
- var import_get2 = __toESM(require("lodash/get"));
341
- var import_has = __toESM(require("lodash/has"));
342
- var import_isNumber = __toESM(require("lodash/isNumber"));
343
-
344
- // src/getOptionMatchingSimpleDiscriminator.ts
345
- var import_get = __toESM(require("lodash/get"));
346
- function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField) {
347
- if (formData && discriminatorField) {
348
- const value = (0, import_get.default)(formData, discriminatorField);
349
- if (value === void 0) {
350
- return;
351
- }
352
- for (let i = 0; i < options.length; i++) {
353
- const option = options[i];
354
- const discriminator = (0, import_get.default)(option, [PROPERTIES_KEY, discriminatorField], {});
355
- if (discriminator.type === "object" || discriminator.type === "array") {
356
- continue;
357
- }
358
- if (discriminator.const === value) {
359
- return i;
360
- }
361
- if (discriminator.enum?.includes(value)) {
362
- return i;
363
- }
364
- }
365
- }
366
- return;
367
- }
368
-
369
- // src/schema/getMatchingOption.ts
370
- function getMatchingOption(validator, formData, options, rootSchema, discriminatorField) {
371
- if (formData === void 0) {
372
- return 0;
373
- }
374
- const simpleDiscriminatorMatch = getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField);
375
- if ((0, import_isNumber.default)(simpleDiscriminatorMatch)) {
376
- return simpleDiscriminatorMatch;
377
- }
378
- for (let i = 0; i < options.length; i++) {
379
- const option = options[i];
380
- if (discriminatorField && (0, import_has.default)(option, [PROPERTIES_KEY, discriminatorField])) {
381
- const value = (0, import_get2.default)(formData, discriminatorField);
382
- const discriminator = (0, import_get2.default)(option, [PROPERTIES_KEY, discriminatorField], {});
383
- if (validator.isValid(discriminator, value, rootSchema)) {
384
- return i;
385
- }
386
- } else if (option[PROPERTIES_KEY]) {
387
- const requiresAnyOf = {
388
- anyOf: Object.keys(option[PROPERTIES_KEY]).map((key) => ({
389
- required: [key]
390
- }))
391
- };
392
- let augmentedSchema;
393
- if (option.anyOf) {
394
- const { ...shallowClone } = option;
395
- if (!shallowClone.allOf) {
396
- shallowClone.allOf = [];
397
- } else {
398
- shallowClone.allOf = shallowClone.allOf.slice();
399
- }
400
- shallowClone.allOf.push(requiresAnyOf);
401
- augmentedSchema = shallowClone;
402
- } else {
403
- augmentedSchema = Object.assign({}, option, requiresAnyOf);
404
- }
405
- delete augmentedSchema.required;
406
- if (validator.isValid(augmentedSchema, formData, rootSchema)) {
407
- return i;
408
- }
409
- } else if (validator.isValid(option, formData, rootSchema)) {
410
- return i;
411
- }
412
- }
413
- return 0;
414
- }
415
-
416
- // src/schema/getFirstMatchingOption.ts
417
- function getFirstMatchingOption(validator, formData, options, rootSchema, discriminatorField) {
418
- return getMatchingOption(validator, formData, options, rootSchema, discriminatorField);
419
- }
420
-
421
- // src/schema/retrieveSchema.ts
422
- var import_get4 = __toESM(require("lodash/get"));
423
- var import_set = __toESM(require("lodash/set"));
424
- var import_times = __toESM(require("lodash/times"));
425
- var import_transform = __toESM(require("lodash/transform"));
426
- var import_merge = __toESM(require("lodash/merge"));
427
- var import_flattenDeep = __toESM(require("lodash/flattenDeep"));
428
- var import_uniq = __toESM(require("lodash/uniq"));
429
- var import_json_schema_merge_allof = __toESM(require("json-schema-merge-allof"));
430
-
431
359
  // src/getDiscriminatorFieldFromSchema.ts
432
- var import_get3 = __toESM(require("lodash/get"));
433
- var import_isString = __toESM(require("lodash/isString"));
360
+ var import_get = __toESM(require("lodash/get"), 1);
361
+ var import_isString = __toESM(require("lodash/isString"), 1);
434
362
  function getDiscriminatorFieldFromSchema(schema) {
435
363
  let discriminator;
436
- const maybeString = (0, import_get3.default)(schema, "discriminator.propertyName", void 0);
364
+ const maybeString = (0, import_get.default)(schema, DISCRIMINATOR_PATH);
437
365
  if ((0, import_isString.default)(maybeString)) {
438
366
  discriminator = maybeString;
439
367
  } else if (maybeString !== void 0) {
@@ -466,7 +394,7 @@ function guessType(value) {
466
394
  }
467
395
 
468
396
  // src/mergeSchemas.ts
469
- var import_union = __toESM(require("lodash/union"));
397
+ var import_union = __toESM(require("lodash/union"), 1);
470
398
 
471
399
  // src/getSchemaType.ts
472
400
  function getSchemaType(schema) {
@@ -477,7 +405,7 @@ function getSchemaType(schema) {
477
405
  if (!type && schema.enum) {
478
406
  return "string";
479
407
  }
480
- if (!type && (schema.properties || schema.additionalProperties)) {
408
+ if (!type && (schema.properties || schema.additionalProperties || schema.patternProperties)) {
481
409
  return "object";
482
410
  }
483
411
  if (Array.isArray(type)) {
@@ -506,7 +434,85 @@ function mergeSchemas(obj1, obj2) {
506
434
  }, acc);
507
435
  }
508
436
 
437
+ // src/schema/getFirstMatchingOption.ts
438
+ var import_get3 = __toESM(require("lodash/get"), 1);
439
+ var import_has = __toESM(require("lodash/has"), 1);
440
+ var import_isNumber = __toESM(require("lodash/isNumber"), 1);
441
+
442
+ // src/getOptionMatchingSimpleDiscriminator.ts
443
+ var import_get2 = __toESM(require("lodash/get"), 1);
444
+ function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField) {
445
+ if (formData && discriminatorField) {
446
+ const value = (0, import_get2.default)(formData, discriminatorField);
447
+ if (value === void 0) {
448
+ return;
449
+ }
450
+ for (let i = 0; i < options.length; i++) {
451
+ const option = options[i];
452
+ const discriminator = (0, import_get2.default)(option, [PROPERTIES_KEY, discriminatorField], {});
453
+ if (discriminator.type === "object" || discriminator.type === "array") {
454
+ continue;
455
+ }
456
+ if (discriminator.const === value) {
457
+ return i;
458
+ }
459
+ if (discriminator.enum?.includes(value)) {
460
+ return i;
461
+ }
462
+ }
463
+ }
464
+ return;
465
+ }
466
+
467
+ // src/schema/getFirstMatchingOption.ts
468
+ function getFirstMatchingOption(validator, formData, options, rootSchema, discriminatorField) {
469
+ if (formData === void 0) {
470
+ return 0;
471
+ }
472
+ const simpleDiscriminatorMatch = getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField);
473
+ if ((0, import_isNumber.default)(simpleDiscriminatorMatch)) {
474
+ return simpleDiscriminatorMatch;
475
+ }
476
+ for (let i = 0; i < options.length; i++) {
477
+ const option = options[i];
478
+ if (discriminatorField && (0, import_has.default)(option, [PROPERTIES_KEY, discriminatorField])) {
479
+ const value = (0, import_get3.default)(formData, discriminatorField);
480
+ const discriminator = (0, import_get3.default)(option, [PROPERTIES_KEY, discriminatorField], {});
481
+ if (validator.isValid(discriminator, value, rootSchema)) {
482
+ return i;
483
+ }
484
+ } else if (option[PROPERTIES_KEY]) {
485
+ const requiresAnyOf = {
486
+ anyOf: Object.keys(option[PROPERTIES_KEY]).map((key) => ({
487
+ required: [key]
488
+ }))
489
+ };
490
+ let augmentedSchema;
491
+ if (option.anyOf) {
492
+ const { ...shallowClone } = option;
493
+ if (!shallowClone.allOf) {
494
+ shallowClone.allOf = [];
495
+ } else {
496
+ shallowClone.allOf = shallowClone.allOf.slice();
497
+ }
498
+ shallowClone.allOf.push(requiresAnyOf);
499
+ augmentedSchema = shallowClone;
500
+ } else {
501
+ augmentedSchema = Object.assign({}, option, requiresAnyOf);
502
+ }
503
+ delete augmentedSchema.required;
504
+ if (validator.isValid(augmentedSchema, formData, rootSchema)) {
505
+ return i;
506
+ }
507
+ } else if (validator.isValid(option, formData, rootSchema)) {
508
+ return i;
509
+ }
510
+ }
511
+ return 0;
512
+ }
513
+
509
514
  // src/schema/retrieveSchema.ts
515
+ var import_isEmpty = __toESM(require("lodash/isEmpty"), 1);
510
516
  function retrieveSchema(validator, schema, rootSchema = {}, rawFormData, experimental_customMergeAllOf) {
511
517
  return retrieveSchemaInternal(
512
518
  validator,
@@ -595,6 +601,15 @@ function getAllPermutationsOfXxxOf(listOfLists) {
595
601
  );
596
602
  return allPermutations;
597
603
  }
604
+ function getMatchingPatternProperties(schema, key) {
605
+ return Object.keys(schema.patternProperties).filter((pattern) => RegExp(pattern).test(key)).reduce(
606
+ (obj, pattern) => {
607
+ (0, import_set.default)(obj, [pattern], schema.patternProperties[pattern]);
608
+ return obj;
609
+ },
610
+ {}
611
+ );
612
+ }
598
613
  function resolveSchema(validator, schema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
599
614
  const updatedSchemas = resolveReference(
600
615
  validator,
@@ -709,31 +724,50 @@ function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFor
709
724
  if (key in schema.properties) {
710
725
  return;
711
726
  }
712
- let additionalProperties = {};
713
- if (typeof schema.additionalProperties !== "boolean") {
714
- if (REF_KEY in schema.additionalProperties) {
715
- additionalProperties = retrieveSchema(
727
+ if (PATTERN_PROPERTIES_KEY in schema) {
728
+ const matchingProperties = getMatchingPatternProperties(schema, key);
729
+ if (!(0, import_isEmpty.default)(matchingProperties)) {
730
+ schema.properties[key] = retrieveSchema(
716
731
  validator,
717
- { $ref: (0, import_get4.default)(schema.additionalProperties, [REF_KEY]) },
732
+ { allOf: Object.values(matchingProperties) },
718
733
  rootSchema,
719
734
  formData,
720
735
  experimental_customMergeAllOf
721
736
  );
722
- } else if ("type" in schema.additionalProperties) {
723
- additionalProperties = { ...schema.additionalProperties };
724
- } else if (ANY_OF_KEY in schema.additionalProperties || ONE_OF_KEY in schema.additionalProperties) {
725
- additionalProperties = {
726
- type: "object",
727
- ...schema.additionalProperties
728
- };
737
+ (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
738
+ return;
739
+ }
740
+ }
741
+ if (ADDITIONAL_PROPERTIES_KEY in schema && schema.additionalProperties !== false) {
742
+ let additionalProperties = {};
743
+ if (typeof schema.additionalProperties !== "boolean") {
744
+ if (REF_KEY in schema.additionalProperties) {
745
+ additionalProperties = retrieveSchema(
746
+ validator,
747
+ { $ref: (0, import_get4.default)(schema.additionalProperties, [REF_KEY]) },
748
+ rootSchema,
749
+ formData,
750
+ experimental_customMergeAllOf
751
+ );
752
+ } else if ("type" in schema.additionalProperties) {
753
+ additionalProperties = { ...schema.additionalProperties };
754
+ } else if (ANY_OF_KEY in schema.additionalProperties || ONE_OF_KEY in schema.additionalProperties) {
755
+ additionalProperties = {
756
+ type: "object",
757
+ ...schema.additionalProperties
758
+ };
759
+ } else {
760
+ additionalProperties = { type: guessType((0, import_get4.default)(formData, [key])) };
761
+ }
729
762
  } else {
730
763
  additionalProperties = { type: guessType((0, import_get4.default)(formData, [key])) };
731
764
  }
765
+ schema.properties[key] = additionalProperties;
766
+ (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
732
767
  } else {
733
- additionalProperties = { type: guessType((0, import_get4.default)(formData, [key])) };
768
+ schema.properties[key] = { type: "null" };
769
+ (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
734
770
  }
735
- schema.properties[key] = additionalProperties;
736
- (0, import_set.default)(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
737
771
  });
738
772
  return schema;
739
773
  }
@@ -793,7 +827,28 @@ function retrieveSchemaInternal(validator, schema, rootSchema, rawFormData, expa
793
827
  return resolvedSchemaWithoutAllOf;
794
828
  }
795
829
  }
796
- const hasAdditionalProperties = ADDITIONAL_PROPERTIES_KEY in resolvedSchema && resolvedSchema.additionalProperties !== false;
830
+ if (PROPERTIES_KEY in resolvedSchema && PATTERN_PROPERTIES_KEY in resolvedSchema) {
831
+ resolvedSchema = Object.keys(resolvedSchema.properties).reduce(
832
+ (schema2, key) => {
833
+ const matchingProperties = getMatchingPatternProperties(schema2, key);
834
+ if (!(0, import_isEmpty.default)(matchingProperties)) {
835
+ schema2.properties[key] = retrieveSchema(
836
+ validator,
837
+ { allOf: [schema2.properties[key], ...Object.values(matchingProperties)] },
838
+ rootSchema,
839
+ rawFormData,
840
+ experimental_customMergeAllOf
841
+ );
842
+ }
843
+ return schema2;
844
+ },
845
+ {
846
+ ...resolvedSchema,
847
+ properties: { ...resolvedSchema.properties }
848
+ }
849
+ );
850
+ }
851
+ const hasAdditionalProperties = PATTERN_PROPERTIES_KEY in resolvedSchema || ADDITIONAL_PROPERTIES_KEY in resolvedSchema && resolvedSchema.additionalProperties !== false;
797
852
  if (hasAdditionalProperties) {
798
853
  return stubExistingAdditionalProperties(
799
854
  validator,
@@ -976,7 +1031,159 @@ function withExactlyOneSubschema(validator, schema, rootSchema, dependencyKey, o
976
1031
  });
977
1032
  }
978
1033
 
1034
+ // src/schema/findSelectedOptionInXxxOf.ts
1035
+ function findSelectedOptionInXxxOf(validator, rootSchema, schema, fallbackField, xxx, formData = {}, experimental_customMergeAllOf) {
1036
+ if (Array.isArray(schema[xxx])) {
1037
+ const discriminator = getDiscriminatorFieldFromSchema(schema);
1038
+ const selectorField = discriminator || fallbackField;
1039
+ const xxxOfs = schema[xxx].map(
1040
+ (xxxOf) => retrieveSchema(validator, xxxOf, rootSchema, formData, experimental_customMergeAllOf)
1041
+ );
1042
+ const data = (0, import_get5.default)(formData, selectorField);
1043
+ if (data !== void 0) {
1044
+ return xxxOfs.find((xxx2) => {
1045
+ return (0, import_isEqual.default)(
1046
+ (0, import_get5.default)(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], (0, import_get5.default)(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
1047
+ data
1048
+ );
1049
+ });
1050
+ }
1051
+ }
1052
+ return void 0;
1053
+ }
1054
+
1055
+ // src/schema/getFromSchema.ts
1056
+ var import_get6 = __toESM(require("lodash/get"), 1);
1057
+ var import_has2 = __toESM(require("lodash/has"), 1);
1058
+ var import_isEmpty2 = __toESM(require("lodash/isEmpty"), 1);
1059
+ function getFromSchemaInternal(validator, rootSchema, schema, path, experimental_customMergeAllOf) {
1060
+ let fieldSchema = schema;
1061
+ if ((0, import_has2.default)(schema, REF_KEY)) {
1062
+ fieldSchema = retrieveSchema(validator, schema, rootSchema, void 0, experimental_customMergeAllOf);
1063
+ }
1064
+ if ((0, import_isEmpty2.default)(path)) {
1065
+ return fieldSchema;
1066
+ }
1067
+ const pathList = Array.isArray(path) ? path : path.split(".");
1068
+ const [part, ...nestedPath] = pathList;
1069
+ if (part && (0, import_has2.default)(fieldSchema, part)) {
1070
+ fieldSchema = (0, import_get6.default)(fieldSchema, part);
1071
+ return getFromSchemaInternal(
1072
+ validator,
1073
+ rootSchema,
1074
+ fieldSchema,
1075
+ nestedPath,
1076
+ experimental_customMergeAllOf
1077
+ );
1078
+ }
1079
+ return void 0;
1080
+ }
1081
+ function getFromSchema(validator, rootSchema, schema, path, defaultValue, experimental_customMergeAllOf) {
1082
+ const result = getFromSchemaInternal(validator, rootSchema, schema, path, experimental_customMergeAllOf);
1083
+ if (result === void 0) {
1084
+ return defaultValue;
1085
+ }
1086
+ return result;
1087
+ }
1088
+
1089
+ // src/schema/findFieldInSchema.ts
1090
+ var NOT_FOUND_SCHEMA = { title: "!@#$_UNKNOWN_$#@!" };
1091
+ function findFieldInSchema(validator, rootSchema, schema, path, formData = {}, experimental_customMergeAllOf) {
1092
+ const pathList = Array.isArray(path) ? [...path] : path.split(".");
1093
+ let parentField = schema;
1094
+ const fieldName = pathList.pop();
1095
+ if (pathList.length) {
1096
+ pathList.forEach((subPath) => {
1097
+ parentField = getFromSchema(
1098
+ validator,
1099
+ rootSchema,
1100
+ parentField,
1101
+ [PROPERTIES_KEY, subPath],
1102
+ {},
1103
+ experimental_customMergeAllOf
1104
+ );
1105
+ if ((0, import_has3.default)(parentField, ONE_OF_KEY)) {
1106
+ parentField = findSelectedOptionInXxxOf(
1107
+ validator,
1108
+ rootSchema,
1109
+ parentField,
1110
+ fieldName,
1111
+ ONE_OF_KEY,
1112
+ (0, import_get7.default)(formData, subPath),
1113
+ experimental_customMergeAllOf
1114
+ );
1115
+ } else if ((0, import_has3.default)(parentField, ANY_OF_KEY)) {
1116
+ parentField = findSelectedOptionInXxxOf(
1117
+ validator,
1118
+ rootSchema,
1119
+ parentField,
1120
+ fieldName,
1121
+ ANY_OF_KEY,
1122
+ (0, import_get7.default)(formData, subPath),
1123
+ experimental_customMergeAllOf
1124
+ );
1125
+ }
1126
+ });
1127
+ }
1128
+ if ((0, import_has3.default)(parentField, ONE_OF_KEY)) {
1129
+ parentField = findSelectedOptionInXxxOf(
1130
+ validator,
1131
+ rootSchema,
1132
+ parentField,
1133
+ fieldName,
1134
+ ONE_OF_KEY,
1135
+ formData,
1136
+ experimental_customMergeAllOf
1137
+ );
1138
+ } else if ((0, import_has3.default)(parentField, ANY_OF_KEY)) {
1139
+ parentField = findSelectedOptionInXxxOf(
1140
+ validator,
1141
+ rootSchema,
1142
+ parentField,
1143
+ fieldName,
1144
+ ANY_OF_KEY,
1145
+ formData,
1146
+ experimental_customMergeAllOf
1147
+ );
1148
+ }
1149
+ let field = getFromSchema(
1150
+ validator,
1151
+ rootSchema,
1152
+ parentField,
1153
+ [PROPERTIES_KEY, fieldName],
1154
+ NOT_FOUND_SCHEMA,
1155
+ experimental_customMergeAllOf
1156
+ );
1157
+ if (field === NOT_FOUND_SCHEMA) {
1158
+ field = void 0;
1159
+ }
1160
+ const requiredArray = getFromSchema(
1161
+ validator,
1162
+ rootSchema,
1163
+ parentField,
1164
+ REQUIRED_KEY,
1165
+ [],
1166
+ experimental_customMergeAllOf
1167
+ );
1168
+ let isRequired;
1169
+ if (field && Array.isArray(requiredArray)) {
1170
+ isRequired = requiredArray.includes(fieldName);
1171
+ }
1172
+ return { field, isRequired };
1173
+ }
1174
+
1175
+ // src/schema/getDefaultFormState.ts
1176
+ var import_get11 = __toESM(require("lodash/get"), 1);
1177
+ var import_isEmpty3 = __toESM(require("lodash/isEmpty"), 1);
1178
+
979
1179
  // src/schema/getClosestMatchingOption.ts
1180
+ var import_get8 = __toESM(require("lodash/get"), 1);
1181
+ var import_has4 = __toESM(require("lodash/has"), 1);
1182
+ var import_isNumber2 = __toESM(require("lodash/isNumber"), 1);
1183
+ var import_isObject5 = __toESM(require("lodash/isObject"), 1);
1184
+ var import_isString2 = __toESM(require("lodash/isString"), 1);
1185
+ var import_reduce = __toESM(require("lodash/reduce"), 1);
1186
+ var import_times2 = __toESM(require("lodash/times"), 1);
980
1187
  var JUNK_OPTION = {
981
1188
  type: "object",
982
1189
  $id: JUNK_OPTION_ID,
@@ -993,11 +1200,11 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
993
1200
  totalScore += (0, import_reduce.default)(
994
1201
  schema.properties,
995
1202
  (score, value, key) => {
996
- const formValue = (0, import_get5.default)(formData, key);
1203
+ const formValue = (0, import_get8.default)(formData, key);
997
1204
  if (typeof value === "boolean") {
998
1205
  return score;
999
1206
  }
1000
- if ((0, import_has2.default)(value, REF_KEY)) {
1207
+ if ((0, import_has4.default)(value, REF_KEY)) {
1001
1208
  const newSchema = retrieveSchema(
1002
1209
  validator,
1003
1210
  value,
@@ -1013,14 +1220,14 @@ function calculateIndexScore(validator, rootSchema, schema, formData, experiment
1013
1220
  experimental_customMergeAllOf
1014
1221
  );
1015
1222
  }
1016
- if (((0, import_has2.default)(value, ONE_OF_KEY) || (0, import_has2.default)(value, ANY_OF_KEY)) && formValue) {
1017
- const key2 = (0, import_has2.default)(value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
1223
+ if (((0, import_has4.default)(value, ONE_OF_KEY) || (0, import_has4.default)(value, ANY_OF_KEY)) && formValue) {
1224
+ const key2 = (0, import_has4.default)(value, ONE_OF_KEY) ? ONE_OF_KEY : ANY_OF_KEY;
1018
1225
  const discriminator = getDiscriminatorFieldFromSchema(value);
1019
1226
  return score + getClosestMatchingOption(
1020
1227
  validator,
1021
1228
  rootSchema,
1022
1229
  formValue,
1023
- (0, import_get5.default)(value, key2),
1230
+ (0, import_get8.default)(value, key2),
1024
1231
  -1,
1025
1232
  discriminator,
1026
1233
  experimental_customMergeAllOf
@@ -1099,8 +1306,8 @@ function isFixedItems(schema) {
1099
1306
  }
1100
1307
 
1101
1308
  // src/mergeDefaultsWithFormData.ts
1102
- var import_get6 = __toESM(require("lodash/get"));
1103
- var import_isNil = __toESM(require("lodash/isNil"));
1309
+ var import_get9 = __toESM(require("lodash/get"), 1);
1310
+ var import_isNil = __toESM(require("lodash/isNil"), 1);
1104
1311
  function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false, defaultSupercedesUndefined = false, overrideFormDataWithDefaults = false) {
1105
1312
  if (Array.isArray(formData)) {
1106
1313
  const defaultsArray = Array.isArray(defaults) ? defaults : [];
@@ -1126,11 +1333,11 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1126
1333
  if (isObject(formData)) {
1127
1334
  const acc = Object.assign({}, defaults);
1128
1335
  return Object.keys(formData).reduce((acc2, key) => {
1129
- const keyValue = (0, import_get6.default)(formData, key);
1336
+ const keyValue = (0, import_get9.default)(formData, key);
1130
1337
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1131
1338
  const keyExistsInFormData = key in formData;
1132
1339
  acc2[key] = mergeDefaultsWithFormData(
1133
- defaults ? (0, import_get6.default)(defaults, key) : {},
1340
+ defaults ? (0, import_get9.default)(defaults, key) : {},
1134
1341
  keyValue,
1135
1342
  mergeExtraArrayDefaults,
1136
1343
  defaultSupercedesUndefined,
@@ -1149,26 +1356,29 @@ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults =
1149
1356
 
1150
1357
  // src/mergeObjects.ts
1151
1358
  function mergeObjects(obj1, obj2, concatArrays = false) {
1152
- return Object.keys(obj2).reduce((acc, key) => {
1153
- const left = obj1 ? obj1[key] : {}, right = obj2[key];
1154
- if (obj1 && key in obj1 && isObject(right)) {
1155
- acc[key] = mergeObjects(left, right, concatArrays);
1156
- } else if (concatArrays && Array.isArray(left) && Array.isArray(right)) {
1157
- let toMerge = right;
1158
- if (concatArrays === "preventDuplicates") {
1159
- toMerge = right.reduce((result, value) => {
1160
- if (!left.includes(value)) {
1161
- result.push(value);
1162
- }
1163
- return result;
1164
- }, []);
1359
+ return Object.keys(obj2).reduce(
1360
+ (acc, key) => {
1361
+ const left = obj1 ? obj1[key] : {}, right = obj2[key];
1362
+ if (obj1 && key in obj1 && isObject(right)) {
1363
+ acc[key] = mergeObjects(left, right, concatArrays);
1364
+ } else if (concatArrays && Array.isArray(left) && Array.isArray(right)) {
1365
+ let toMerge = right;
1366
+ if (concatArrays === "preventDuplicates") {
1367
+ toMerge = right.reduce((result, value) => {
1368
+ if (!left.includes(value)) {
1369
+ result.push(value);
1370
+ }
1371
+ return result;
1372
+ }, []);
1373
+ }
1374
+ acc[key] = left.concat(toMerge);
1375
+ } else {
1376
+ acc[key] = right;
1165
1377
  }
1166
- acc[key] = left.concat(toMerge);
1167
- } else {
1168
- acc[key] = right;
1169
- }
1170
- return acc;
1171
- }, Object.assign({}, obj1));
1378
+ return acc;
1379
+ },
1380
+ Object.assign({}, obj1)
1381
+ );
1172
1382
  }
1173
1383
 
1174
1384
  // src/isConstant.ts
@@ -1198,13 +1408,16 @@ function isMultiSelect(validator, schema, rootSchema, experimental_customMergeAl
1198
1408
  }
1199
1409
 
1200
1410
  // src/constIsAjvDataReference.ts
1201
- var import_isString3 = __toESM(require("lodash/isString"));
1411
+ var import_isString3 = __toESM(require("lodash/isString"), 1);
1202
1412
  function constIsAjvDataReference(schema) {
1203
1413
  const schemaConst = schema[CONST_KEY];
1204
1414
  const schemaType = getSchemaType(schema);
1205
1415
  return isObject(schemaConst) && (0, import_isString3.default)(schemaConst?.$data) && schemaType !== "object" && schemaType !== "array";
1206
1416
  }
1207
1417
 
1418
+ // src/optionsList.ts
1419
+ var import_get10 = __toESM(require("lodash/get"), 1);
1420
+
1208
1421
  // src/toConstant.ts
1209
1422
  function toConstant(schema) {
1210
1423
  if (ENUM_KEY in schema && Array.isArray(schema.enum) && schema.enum.length === 1) {
@@ -1218,21 +1431,12 @@ function toConstant(schema) {
1218
1431
 
1219
1432
  // src/optionsList.ts
1220
1433
  function optionsList(schema, uiSchema) {
1221
- const schemaWithEnumNames = schema;
1222
1434
  if (schema.enum) {
1223
1435
  let enumNames;
1224
1436
  if (uiSchema) {
1225
1437
  const { enumNames: uiEnumNames } = getUiOptions(uiSchema);
1226
1438
  enumNames = uiEnumNames;
1227
1439
  }
1228
- if (!enumNames && schemaWithEnumNames.enumNames) {
1229
- if (true) {
1230
- console.warn(
1231
- 'The "enumNames" property in the schema is deprecated and will be removed in a future major release. Use the "ui:enumNames" property in the uiSchema instead.'
1232
- );
1233
- }
1234
- enumNames = schemaWithEnumNames.enumNames;
1235
- }
1236
1440
  return schema.enum.map((value, i) => {
1237
1441
  const label = enumNames?.[i] || String(value);
1238
1442
  return { label, value };
@@ -1247,11 +1451,24 @@ function optionsList(schema, uiSchema) {
1247
1451
  altSchemas = schema.oneOf;
1248
1452
  altUiSchemas = uiSchema?.oneOf;
1249
1453
  }
1454
+ let selectorField = getDiscriminatorFieldFromSchema(schema);
1455
+ if (uiSchema) {
1456
+ const { optionsSchemaSelector = selectorField } = getUiOptions(uiSchema);
1457
+ selectorField = optionsSchemaSelector;
1458
+ }
1250
1459
  return altSchemas && altSchemas.map((aSchemaDef, index) => {
1251
1460
  const { title } = getUiOptions(altUiSchemas?.[index]);
1252
1461
  const aSchema = aSchemaDef;
1253
- const value = toConstant(aSchema);
1254
- const label = title || aSchema.title || String(value);
1462
+ let value;
1463
+ let label = title;
1464
+ if (selectorField) {
1465
+ const innerSchema = (0, import_get10.default)(aSchema, [PROPERTIES_KEY, selectorField], {});
1466
+ value = (0, import_get10.default)(innerSchema, DEFAULT_KEY, (0, import_get10.default)(innerSchema, CONST_KEY));
1467
+ label = label || innerSchema?.title || aSchema.title || String(value);
1468
+ } else {
1469
+ value = toConstant(aSchema);
1470
+ label = label || aSchema.title || String(value);
1471
+ }
1255
1472
  return {
1256
1473
  schema: aSchema,
1257
1474
  label,
@@ -1286,10 +1503,10 @@ function maybeAddDefaultToObject(obj, key, computedDefault, includeUndefinedValu
1286
1503
  const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1287
1504
  if (isObject(computedDefault)) {
1288
1505
  if (emptyObjectFields === "skipEmptyDefaults") {
1289
- if (!(0, import_isEmpty.default)(computedDefault)) {
1506
+ if (!(0, import_isEmpty3.default)(computedDefault)) {
1290
1507
  obj[key] = computedDefault;
1291
1508
  }
1292
- } else if ((!(0, import_isEmpty.default)(computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== "populateRequiredDefaults")) {
1509
+ } else if ((!(0, import_isEmpty3.default)(computedDefault) || requiredFields.includes(key)) && (isSelfOrParentRequired || emptyObjectFields !== "populateRequiredDefaults")) {
1293
1510
  obj[key] = computedDefault;
1294
1511
  }
1295
1512
  } else if (
@@ -1473,7 +1690,7 @@ function getObjectDefaults(validator, rawSchema, {
1473
1690
  const parentConst = retrievedSchema[CONST_KEY];
1474
1691
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
1475
1692
  (acc, key) => {
1476
- const propertySchema = (0, import_get7.default)(retrievedSchema, [PROPERTIES_KEY, key]);
1693
+ const propertySchema = (0, import_get11.default)(retrievedSchema, [PROPERTIES_KEY, key], {});
1477
1694
  const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1478
1695
  const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(propertySchema);
1479
1696
  const computedDefault = computeDefaults(validator, propertySchema, {
@@ -1482,8 +1699,8 @@ function getObjectDefaults(validator, rawSchema, {
1482
1699
  experimental_defaultFormStateBehavior,
1483
1700
  experimental_customMergeAllOf,
1484
1701
  includeUndefinedValues: includeUndefinedValues === true,
1485
- parentDefaults: (0, import_get7.default)(defaults, [key]),
1486
- rawFormData: (0, import_get7.default)(formData, [key]),
1702
+ parentDefaults: (0, import_get11.default)(defaults, [key]),
1703
+ rawFormData: (0, import_get11.default)(formData, [key]),
1487
1704
  required: retrievedSchema.required?.includes(key),
1488
1705
  shouldMergeDefaultsIntoFormData
1489
1706
  });
@@ -1519,8 +1736,8 @@ function getObjectDefaults(validator, rawSchema, {
1519
1736
  experimental_defaultFormStateBehavior,
1520
1737
  experimental_customMergeAllOf,
1521
1738
  includeUndefinedValues: includeUndefinedValues === true,
1522
- parentDefaults: (0, import_get7.default)(defaults, [key]),
1523
- rawFormData: (0, import_get7.default)(formData, [key]),
1739
+ parentDefaults: (0, import_get11.default)(defaults, [key]),
1740
+ rawFormData: (0, import_get11.default)(formData, [key]),
1524
1741
  required: retrievedSchema.required?.includes(key),
1525
1742
  shouldMergeDefaultsIntoFormData
1526
1743
  });
@@ -1581,7 +1798,7 @@ function getArrayDefaults(validator, rawSchema, {
1581
1798
  experimental_defaultFormStateBehavior,
1582
1799
  experimental_customMergeAllOf,
1583
1800
  rawFormData: item,
1584
- parentDefaults: (0, import_get7.default)(defaults, [idx]),
1801
+ parentDefaults: (0, import_get11.default)(defaults, [idx]),
1585
1802
  required,
1586
1803
  shouldMergeDefaultsIntoFormData
1587
1804
  });
@@ -1621,6 +1838,7 @@ function getArrayDefaults(validator, rawSchema, {
1621
1838
  }
1622
1839
  function getDefaultBasedOnSchemaType(validator, rawSchema, computeDefaultsProps = {}, defaults) {
1623
1840
  switch (getSchemaType(rawSchema)) {
1841
+ // We need to recurse for object schema inner default values.
1624
1842
  case "object": {
1625
1843
  return getObjectDefaults(validator, rawSchema, computeDefaultsProps, defaults);
1626
1844
  }
@@ -1707,45 +1925,29 @@ function getDisplayLabel(validator, schema, uiSchema = {}, rootSchema, globalOpt
1707
1925
  return displayLabel;
1708
1926
  }
1709
1927
 
1710
- // src/schema/mergeValidationData.ts
1711
- var import_isEmpty2 = __toESM(require("lodash/isEmpty"));
1712
- function mergeValidationData(validator, validationData, additionalErrorSchema) {
1713
- if (!additionalErrorSchema) {
1714
- return validationData;
1715
- }
1716
- const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
1717
- let errors = validator.toErrorList(additionalErrorSchema);
1718
- let errorSchema = additionalErrorSchema;
1719
- if (!(0, import_isEmpty2.default)(oldErrorSchema)) {
1720
- errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
1721
- errors = [...oldErrors].concat(errors);
1722
- }
1723
- return { errorSchema, errors };
1724
- }
1725
-
1726
1928
  // src/schema/sanitizeDataForNewSchema.ts
1727
- var import_get8 = __toESM(require("lodash/get"));
1728
- var import_has3 = __toESM(require("lodash/has"));
1929
+ var import_get12 = __toESM(require("lodash/get"), 1);
1930
+ var import_has5 = __toESM(require("lodash/has"), 1);
1729
1931
  var NO_VALUE = Symbol("no Value");
1730
1932
  function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, data = {}, experimental_customMergeAllOf) {
1731
1933
  let newFormData;
1732
- if ((0, import_has3.default)(newSchema, PROPERTIES_KEY)) {
1934
+ if ((0, import_has5.default)(newSchema, PROPERTIES_KEY)) {
1733
1935
  const removeOldSchemaData = {};
1734
- if ((0, import_has3.default)(oldSchema, PROPERTIES_KEY)) {
1735
- const properties = (0, import_get8.default)(oldSchema, PROPERTIES_KEY, {});
1936
+ if ((0, import_has5.default)(oldSchema, PROPERTIES_KEY)) {
1937
+ const properties = (0, import_get12.default)(oldSchema, PROPERTIES_KEY, {});
1736
1938
  Object.keys(properties).forEach((key) => {
1737
- if ((0, import_has3.default)(data, key)) {
1939
+ if ((0, import_has5.default)(data, key)) {
1738
1940
  removeOldSchemaData[key] = void 0;
1739
1941
  }
1740
1942
  });
1741
1943
  }
1742
- const keys2 = Object.keys((0, import_get8.default)(newSchema, PROPERTIES_KEY, {}));
1944
+ const keys2 = Object.keys((0, import_get12.default)(newSchema, PROPERTIES_KEY, {}));
1743
1945
  const nestedData = {};
1744
1946
  keys2.forEach((key) => {
1745
- const formValue = (0, import_get8.default)(data, key);
1746
- let oldKeyedSchema = (0, import_get8.default)(oldSchema, [PROPERTIES_KEY, key], {});
1747
- let newKeyedSchema = (0, import_get8.default)(newSchema, [PROPERTIES_KEY, key], {});
1748
- if ((0, import_has3.default)(oldKeyedSchema, REF_KEY)) {
1947
+ const formValue = (0, import_get12.default)(data, key);
1948
+ let oldKeyedSchema = (0, import_get12.default)(oldSchema, [PROPERTIES_KEY, key], {});
1949
+ let newKeyedSchema = (0, import_get12.default)(newSchema, [PROPERTIES_KEY, key], {});
1950
+ if ((0, import_has5.default)(oldKeyedSchema, REF_KEY)) {
1749
1951
  oldKeyedSchema = retrieveSchema(
1750
1952
  validator,
1751
1953
  oldKeyedSchema,
@@ -1754,7 +1956,7 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1754
1956
  experimental_customMergeAllOf
1755
1957
  );
1756
1958
  }
1757
- if ((0, import_has3.default)(newKeyedSchema, REF_KEY)) {
1959
+ if ((0, import_has5.default)(newKeyedSchema, REF_KEY)) {
1758
1960
  newKeyedSchema = retrieveSchema(
1759
1961
  validator,
1760
1962
  newKeyedSchema,
@@ -1763,10 +1965,10 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1763
1965
  experimental_customMergeAllOf
1764
1966
  );
1765
1967
  }
1766
- const oldSchemaTypeForKey = (0, import_get8.default)(oldKeyedSchema, "type");
1767
- const newSchemaTypeForKey = (0, import_get8.default)(newKeyedSchema, "type");
1968
+ const oldSchemaTypeForKey = (0, import_get12.default)(oldKeyedSchema, "type");
1969
+ const newSchemaTypeForKey = (0, import_get12.default)(newKeyedSchema, "type");
1768
1970
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
1769
- if ((0, import_has3.default)(removeOldSchemaData, key)) {
1971
+ if ((0, import_has5.default)(removeOldSchemaData, key)) {
1770
1972
  delete removeOldSchemaData[key];
1771
1973
  }
1772
1974
  if (newSchemaTypeForKey === "object" || newSchemaTypeForKey === "array" && Array.isArray(formValue)) {
@@ -1782,17 +1984,17 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1782
1984
  nestedData[key] = itemData;
1783
1985
  }
1784
1986
  } else {
1785
- const newOptionDefault = (0, import_get8.default)(newKeyedSchema, "default", NO_VALUE);
1786
- const oldOptionDefault = (0, import_get8.default)(oldKeyedSchema, "default", NO_VALUE);
1987
+ const newOptionDefault = (0, import_get12.default)(newKeyedSchema, "default", NO_VALUE);
1988
+ const oldOptionDefault = (0, import_get12.default)(oldKeyedSchema, "default", NO_VALUE);
1787
1989
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
1788
1990
  if (oldOptionDefault === formValue) {
1789
1991
  removeOldSchemaData[key] = newOptionDefault;
1790
- } else if ((0, import_get8.default)(newKeyedSchema, "readOnly") === true) {
1992
+ } else if ((0, import_get12.default)(newKeyedSchema, "readOnly") === true) {
1791
1993
  removeOldSchemaData[key] = void 0;
1792
1994
  }
1793
1995
  }
1794
- const newOptionConst = (0, import_get8.default)(newKeyedSchema, "const", NO_VALUE);
1795
- const oldOptionConst = (0, import_get8.default)(oldKeyedSchema, "const", NO_VALUE);
1996
+ const newOptionConst = (0, import_get12.default)(newKeyedSchema, "const", NO_VALUE);
1997
+ const oldOptionConst = (0, import_get12.default)(oldKeyedSchema, "const", NO_VALUE);
1796
1998
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
1797
1999
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
1798
2000
  }
@@ -1804,11 +2006,11 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1804
2006
  ...removeOldSchemaData,
1805
2007
  ...nestedData
1806
2008
  };
1807
- } else if ((0, import_get8.default)(oldSchema, "type") === "array" && (0, import_get8.default)(newSchema, "type") === "array" && Array.isArray(data)) {
1808
- let oldSchemaItems = (0, import_get8.default)(oldSchema, "items");
1809
- let newSchemaItems = (0, import_get8.default)(newSchema, "items");
2009
+ } else if ((0, import_get12.default)(oldSchema, "type") === "array" && (0, import_get12.default)(newSchema, "type") === "array" && Array.isArray(data)) {
2010
+ let oldSchemaItems = (0, import_get12.default)(oldSchema, "items");
2011
+ let newSchemaItems = (0, import_get12.default)(newSchema, "items");
1810
2012
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
1811
- if ((0, import_has3.default)(oldSchemaItems, REF_KEY)) {
2013
+ if ((0, import_has5.default)(oldSchemaItems, REF_KEY)) {
1812
2014
  oldSchemaItems = retrieveSchema(
1813
2015
  validator,
1814
2016
  oldSchemaItems,
@@ -1817,7 +2019,7 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1817
2019
  experimental_customMergeAllOf
1818
2020
  );
1819
2021
  }
1820
- if ((0, import_has3.default)(newSchemaItems, REF_KEY)) {
2022
+ if ((0, import_has5.default)(newSchemaItems, REF_KEY)) {
1821
2023
  newSchemaItems = retrieveSchema(
1822
2024
  validator,
1823
2025
  newSchemaItems,
@@ -1826,10 +2028,10 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1826
2028
  experimental_customMergeAllOf
1827
2029
  );
1828
2030
  }
1829
- const oldSchemaType = (0, import_get8.default)(oldSchemaItems, "type");
1830
- const newSchemaType = (0, import_get8.default)(newSchemaItems, "type");
2031
+ const oldSchemaType = (0, import_get12.default)(oldSchemaItems, "type");
2032
+ const newSchemaType = (0, import_get12.default)(newSchemaItems, "type");
1831
2033
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
1832
- const maxItems = (0, import_get8.default)(newSchema, "maxItems", -1);
2034
+ const maxItems = (0, import_get12.default)(newSchema, "maxItems", -1);
1833
2035
  if (newSchemaType === "object") {
1834
2036
  newFormData = data.reduce((newValue, aValue) => {
1835
2037
  const itemValue = sanitizeDataForNewSchema(
@@ -1857,58 +2059,60 @@ function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, d
1857
2059
  }
1858
2060
 
1859
2061
  // src/schema/toIdSchema.ts
1860
- var import_get9 = __toESM(require("lodash/get"));
2062
+ var import_get13 = __toESM(require("lodash/get"), 1);
1861
2063
  function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1862
- if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1863
- const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
1864
- const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
1865
- if (sameSchemaIndex === -1) {
2064
+ const $id = id || idPrefix;
2065
+ const idSchema = { $id };
2066
+ if (typeof schema === "object") {
2067
+ if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
2068
+ const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
2069
+ const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
2070
+ if (sameSchemaIndex === -1) {
2071
+ return toIdSchemaInternal(
2072
+ validator,
2073
+ _schema,
2074
+ idPrefix,
2075
+ idSeparator,
2076
+ id,
2077
+ rootSchema,
2078
+ formData,
2079
+ _recurseList.concat(_schema),
2080
+ experimental_customMergeAllOf
2081
+ );
2082
+ }
2083
+ }
2084
+ if (ITEMS_KEY in schema && !(0, import_get13.default)(schema, [ITEMS_KEY, REF_KEY])) {
1866
2085
  return toIdSchemaInternal(
1867
2086
  validator,
1868
- _schema,
2087
+ (0, import_get13.default)(schema, ITEMS_KEY),
1869
2088
  idPrefix,
1870
2089
  idSeparator,
1871
2090
  id,
1872
2091
  rootSchema,
1873
2092
  formData,
1874
- _recurseList.concat(_schema),
1875
- experimental_customMergeAllOf
1876
- );
1877
- }
1878
- }
1879
- if (ITEMS_KEY in schema && !(0, import_get9.default)(schema, [ITEMS_KEY, REF_KEY])) {
1880
- return toIdSchemaInternal(
1881
- validator,
1882
- (0, import_get9.default)(schema, ITEMS_KEY),
1883
- idPrefix,
1884
- idSeparator,
1885
- id,
1886
- rootSchema,
1887
- formData,
1888
- _recurseList,
1889
- experimental_customMergeAllOf
1890
- );
1891
- }
1892
- const $id = id || idPrefix;
1893
- const idSchema = { $id };
1894
- if (getSchemaType(schema) === "object" && PROPERTIES_KEY in schema) {
1895
- for (const name in schema.properties) {
1896
- const field = (0, import_get9.default)(schema, [PROPERTIES_KEY, name]);
1897
- const fieldId = idSchema[ID_KEY] + idSeparator + name;
1898
- idSchema[name] = toIdSchemaInternal(
1899
- validator,
1900
- isObject(field) ? field : {},
1901
- idPrefix,
1902
- idSeparator,
1903
- fieldId,
1904
- rootSchema,
1905
- // It's possible that formData is not an object -- this can happen if an
1906
- // array item has just been added, but not populated with data yet
1907
- (0, import_get9.default)(formData, [name]),
1908
2093
  _recurseList,
1909
2094
  experimental_customMergeAllOf
1910
2095
  );
1911
2096
  }
2097
+ if (getSchemaType(schema) === "object" && PROPERTIES_KEY in schema) {
2098
+ for (const name in schema.properties) {
2099
+ const field = schema[PROPERTIES_KEY][name];
2100
+ const fieldId = idSchema[ID_KEY] + idSeparator + name;
2101
+ idSchema[name] = toIdSchemaInternal(
2102
+ validator,
2103
+ field,
2104
+ idPrefix,
2105
+ idSeparator,
2106
+ fieldId,
2107
+ rootSchema,
2108
+ // It's possible that formData is not an object -- this can happen if an
2109
+ // array item has just been added, but not populated with data yet
2110
+ (0, import_get13.default)(formData, [name]),
2111
+ _recurseList,
2112
+ experimental_customMergeAllOf
2113
+ );
2114
+ }
2115
+ }
1912
2116
  }
1913
2117
  return idSchema;
1914
2118
  }
@@ -1927,8 +2131,8 @@ function toIdSchema(validator, schema, id, rootSchema, formData, idPrefix = "roo
1927
2131
  }
1928
2132
 
1929
2133
  // src/schema/toPathSchema.ts
1930
- var import_get10 = __toESM(require("lodash/get"));
1931
- var import_set2 = __toESM(require("lodash/set"));
2134
+ var import_get14 = __toESM(require("lodash/get"), 1);
2135
+ var import_set2 = __toESM(require("lodash/set"), 1);
1932
2136
  function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1933
2137
  if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1934
2138
  const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
@@ -2020,7 +2224,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2020
2224
  }
2021
2225
  } else if (PROPERTIES_KEY in schema) {
2022
2226
  for (const property in schema.properties) {
2023
- const field = (0, import_get10.default)(schema, [PROPERTIES_KEY, property]);
2227
+ const field = (0, import_get14.default)(schema, [PROPERTIES_KEY, property], {});
2024
2228
  pathSchema[property] = toPathSchemaInternal(
2025
2229
  validator,
2026
2230
  field,
@@ -2028,7 +2232,7 @@ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _re
2028
2232
  rootSchema,
2029
2233
  // It's possible that formData is not an object -- this can happen if an
2030
2234
  // array item has just been added, but not populated with data yet
2031
- (0, import_get10.default)(formData, [property]),
2235
+ (0, import_get14.default)(formData, [property]),
2032
2236
  _recurseList,
2033
2237
  experimental_customMergeAllOf
2034
2238
  );
@@ -2078,6 +2282,47 @@ var SchemaUtils = class {
2078
2282
  }
2079
2283
  return this.validator !== validator || !deepEquals(this.rootSchema, rootSchema) || !deepEquals(this.experimental_defaultFormStateBehavior, experimental_defaultFormStateBehavior) || this.experimental_customMergeAllOf !== experimental_customMergeAllOf;
2080
2284
  }
2285
+ /** Finds the field specified by the `path` within the root or recursed `schema`. If there is no field for the specified
2286
+ * `path`, then the default `{ field: undefined, isRequired: undefined }` is returned. It determines whether a leaf
2287
+ * field is in the `required` list for its parent and if so, it is marked as required on return.
2288
+ *
2289
+ * @param schema - The current node within the JSON schema
2290
+ * @param path - The remaining keys in the path to the desired field
2291
+ * @param [formData] - The form data that is used to determine which oneOf option
2292
+ * @returns - An object that contains the field and its required state. If no field can be found then
2293
+ * `{ field: undefined, isRequired: undefined }` is returned.
2294
+ */
2295
+ findFieldInSchema(schema, path, formData) {
2296
+ return findFieldInSchema(
2297
+ this.validator,
2298
+ this.rootSchema,
2299
+ schema,
2300
+ path,
2301
+ formData,
2302
+ this.experimental_customMergeAllOf
2303
+ );
2304
+ }
2305
+ /** Finds the oneOf option inside the `schema['any/oneOf']` list which has the `properties[selectorField].default` that
2306
+ * matches the `formData[selectorField]` value. For the purposes of this function, `selectorField` is either
2307
+ * `schema.discriminator.propertyName` or `fallbackField`.
2308
+ *
2309
+ * @param schema - The schema element in which to search for the selected oneOf option
2310
+ * @param fallbackField - The field to use as a backup selector field if the schema does not have a required field
2311
+ * @param xxx - Either `oneOf` or `anyOf`, defines which value is being sought
2312
+ * @param [formData={}] - The form data that is used to determine which oneOf option
2313
+ * @returns - The anyOf/oneOf option that matches the selector field in the schema or undefined if nothing is selected
2314
+ */
2315
+ findSelectedOptionInXxxOf(schema, fallbackField, xxx, formData) {
2316
+ return findSelectedOptionInXxxOf(
2317
+ this.validator,
2318
+ this.rootSchema,
2319
+ schema,
2320
+ fallbackField,
2321
+ xxx,
2322
+ formData,
2323
+ this.experimental_customMergeAllOf
2324
+ );
2325
+ }
2081
2326
  /** Returns the superset of `formData` that includes the given set updated to include any missing fields that have
2082
2327
  * computed to have defaults provided in the `schema`.
2083
2328
  *
@@ -2153,18 +2398,16 @@ var SchemaUtils = class {
2153
2398
  getFirstMatchingOption(formData, options, discriminatorField) {
2154
2399
  return getFirstMatchingOption(this.validator, formData, options, this.rootSchema, discriminatorField);
2155
2400
  }
2156
- /** Given the `formData` and list of `options`, attempts to find the index of the option that best matches the data.
2157
- * Deprecated, use `getFirstMatchingOption()` instead.
2158
- *
2159
- * @param formData - The current formData, if any, onto which to provide any missing defaults
2160
- * @param options - The list of options to find a matching options from
2161
- * @param [discriminatorField] - The optional name of the field within the options object whose value is used to
2162
- * determine which option is selected
2163
- * @returns - The index of the matched option or 0 if none is available
2164
- * @deprecated
2165
- */
2166
- getMatchingOption(formData, options, discriminatorField) {
2167
- return getMatchingOption(this.validator, formData, options, this.rootSchema, discriminatorField);
2401
+ getFromSchema(schema, path, defaultValue) {
2402
+ return getFromSchema(
2403
+ this.validator,
2404
+ this.rootSchema,
2405
+ schema,
2406
+ path,
2407
+ // @ts-expect-error TS2769: No overload matches this call
2408
+ defaultValue,
2409
+ this.experimental_customMergeAllOf
2410
+ );
2168
2411
  }
2169
2412
  /** Checks to see if the `schema` and `uiSchema` combination represents an array of files
2170
2413
  *
@@ -2191,20 +2434,6 @@ var SchemaUtils = class {
2191
2434
  isSelect(schema) {
2192
2435
  return isSelect(this.validator, schema, this.rootSchema, this.experimental_customMergeAllOf);
2193
2436
  }
2194
- /** Merges the errors in `additionalErrorSchema` into the existing `validationData` by combining the hierarchies in
2195
- * the two `ErrorSchema`s and then appending the error list from the `additionalErrorSchema` obtained by calling
2196
- * `getValidator().toErrorList()` onto the `errors` in the `validationData`. If no `additionalErrorSchema` is passed,
2197
- * then `validationData` is returned.
2198
- *
2199
- * @param validationData - The current `ValidationData` into which to merge the additional errors
2200
- * @param [additionalErrorSchema] - The additional set of errors
2201
- * @returns - The `validationData` with the additional errors from `additionalErrorSchema` merged into it, if provided.
2202
- * @deprecated - Use the `validationDataMerge()` function exported from `@rjsf/utils` instead. This function will be
2203
- * removed in the next major release.
2204
- */
2205
- mergeValidationData(validationData, additionalErrorSchema) {
2206
- return mergeValidationData(this.validator, validationData, additionalErrorSchema);
2207
- }
2208
2437
  /** Retrieves an expanded schema that has had all of its conditions, additional properties, references and
2209
2438
  * dependencies resolved and merged into the `schema` given a `rawFormData` that is used to do the potentially
2210
2439
  * recursive resolution.
@@ -2407,7 +2636,7 @@ function enumOptionsIndexForValue(value, allEnumOptions = [], multiple = false)
2407
2636
  }
2408
2637
 
2409
2638
  // src/enumOptionsSelectValue.ts
2410
- var import_isNil2 = __toESM(require("lodash/isNil"));
2639
+ var import_isNil2 = __toESM(require("lodash/isNil"), 1);
2411
2640
  function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2412
2641
  const value = enumOptionsValueForIndex(valueIndex, allEnumOptions);
2413
2642
  if (!(0, import_isNil2.default)(value)) {
@@ -2420,10 +2649,10 @@ function enumOptionsSelectValue(valueIndex, selected, allEnumOptions = []) {
2420
2649
  }
2421
2650
 
2422
2651
  // src/ErrorSchemaBuilder.ts
2423
- var import_cloneDeep = __toESM(require("lodash/cloneDeep"));
2424
- var import_get11 = __toESM(require("lodash/get"));
2425
- var import_set3 = __toESM(require("lodash/set"));
2426
- var import_setWith = __toESM(require("lodash/setWith"));
2652
+ var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
2653
+ var import_get15 = __toESM(require("lodash/get"), 1);
2654
+ var import_set3 = __toESM(require("lodash/set"), 1);
2655
+ var import_setWith = __toESM(require("lodash/setWith"), 1);
2427
2656
  var ErrorSchemaBuilder = class {
2428
2657
  /** Construct an `ErrorSchemaBuilder` with an optional initial set of errors in an `ErrorSchema`.
2429
2658
  *
@@ -2450,7 +2679,7 @@ var ErrorSchemaBuilder = class {
2450
2679
  */
2451
2680
  getOrCreateErrorBlock(pathOfError) {
2452
2681
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2453
- let errorBlock = hasPath ? (0, import_get11.default)(this.errorSchema, pathOfError) : this.errorSchema;
2682
+ let errorBlock = hasPath ? (0, import_get15.default)(this.errorSchema, pathOfError) : this.errorSchema;
2454
2683
  if (!errorBlock && pathOfError) {
2455
2684
  errorBlock = {};
2456
2685
  (0, import_setWith.default)(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2476,7 +2705,7 @@ var ErrorSchemaBuilder = class {
2476
2705
  */
2477
2706
  addErrors(errorOrList, pathOfError) {
2478
2707
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2479
- let errorsList = (0, import_get11.default)(errorBlock, ERRORS_KEY);
2708
+ let errorsList = (0, import_get15.default)(errorBlock, ERRORS_KEY);
2480
2709
  if (!Array.isArray(errorsList)) {
2481
2710
  errorsList = [];
2482
2711
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2612,6 +2841,10 @@ function getTemplate(name, registry, uiOptions = {}) {
2612
2841
  if (name === "ButtonTemplates") {
2613
2842
  return templates[name];
2614
2843
  }
2844
+ if (Object.hasOwn(uiOptions, name) && typeof uiOptions[name] === "string" && Object.hasOwn(templates, uiOptions[name])) {
2845
+ const key = uiOptions[name];
2846
+ return templates[key];
2847
+ }
2615
2848
  return (
2616
2849
  // Evaluating uiOptions[name] results in TS2590: Expression produces a union type that is too complex to represent
2617
2850
  // To avoid that, we cast uiOptions to `any` before accessing the name field
@@ -2619,11 +2852,32 @@ function getTemplate(name, registry, uiOptions = {}) {
2619
2852
  );
2620
2853
  }
2621
2854
 
2855
+ // src/getTestIds.ts
2856
+ var import_nanoid = require("nanoid");
2857
+ var import_get16 = __toESM(require("lodash/get"), 1);
2858
+ function getTestIds() {
2859
+ if (typeof process === "undefined" || (0, import_get16.default)(process, "env.NODE_ENV") !== "test") {
2860
+ return {};
2861
+ }
2862
+ const ids = /* @__PURE__ */ new Map();
2863
+ return new Proxy(
2864
+ {},
2865
+ {
2866
+ get(_obj, prop) {
2867
+ if (!ids.has(prop)) {
2868
+ ids.set(prop, (0, import_nanoid.nanoid)());
2869
+ }
2870
+ return ids.get(prop);
2871
+ }
2872
+ }
2873
+ );
2874
+ }
2875
+
2622
2876
  // src/getWidget.tsx
2623
2877
  var import_react = require("react");
2624
- var import_react_is = __toESM(require("react-is"));
2625
- var import_get12 = __toESM(require("lodash/get"));
2626
- var import_set4 = __toESM(require("lodash/set"));
2878
+ var import_react_is = __toESM(require("react-is"), 1);
2879
+ var import_get17 = __toESM(require("lodash/get"), 1);
2880
+ var import_set4 = __toESM(require("lodash/set"), 1);
2627
2881
  var import_jsx_runtime = require("react/jsx-runtime");
2628
2882
  var widgetMap = {
2629
2883
  boolean: {
@@ -2678,7 +2932,7 @@ var widgetMap = {
2678
2932
  }
2679
2933
  };
2680
2934
  function mergeWidgetOptions(AWidget) {
2681
- let MergedWidget = (0, import_get12.default)(AWidget, "MergedWidget");
2935
+ let MergedWidget = (0, import_get17.default)(AWidget, "MergedWidget");
2682
2936
  if (!MergedWidget) {
2683
2937
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
2684
2938
  MergedWidget = ({ options, ...props }) => {
@@ -2722,10 +2976,16 @@ function hashString(string) {
2722
2976
  }
2723
2977
  return hash.toString(16);
2724
2978
  }
2725
- function hashForSchema(schema) {
2979
+ function sortedJSONStringify(object) {
2726
2980
  const allKeys = /* @__PURE__ */ new Set();
2727
- JSON.stringify(schema, (key, value) => (allKeys.add(key), value));
2728
- return hashString(JSON.stringify(schema, Array.from(allKeys).sort()));
2981
+ JSON.stringify(object, (key, value) => (allKeys.add(key), value));
2982
+ return JSON.stringify(object, Array.from(allKeys).sort());
2983
+ }
2984
+ function hashObject(object) {
2985
+ return hashString(sortedJSONStringify(object));
2986
+ }
2987
+ function hashForSchema(schema) {
2988
+ return hashObject(schema);
2729
2989
  }
2730
2990
 
2731
2991
  // src/hasWidget.ts
@@ -2743,7 +3003,7 @@ function hasWidget(schema, widget, registeredWidgets = {}) {
2743
3003
  }
2744
3004
 
2745
3005
  // src/idGenerators.ts
2746
- var import_isString4 = __toESM(require("lodash/isString"));
3006
+ var import_isString4 = __toESM(require("lodash/isString"), 1);
2747
3007
  function idGenerator(id, suffix) {
2748
3008
  const theId = (0, import_isString4.default)(id) ? id : id[ID_KEY];
2749
3009
  return `${theId}__${suffix}`;
@@ -2770,6 +3030,9 @@ function ariaDescribedByIds(id, includeExamples = false) {
2770
3030
  function optionId(id, optionIndex) {
2771
3031
  return `${id}-${optionIndex}`;
2772
3032
  }
3033
+ function buttonId(id, btn) {
3034
+ return idGenerator(id, btn);
3035
+ }
2773
3036
 
2774
3037
  // src/labelValue.ts
2775
3038
  function labelValue(label, hideLabel, fallback) {
@@ -2781,6 +3044,17 @@ function localToUTC(dateString) {
2781
3044
  return dateString ? new Date(dateString).toJSON() : void 0;
2782
3045
  }
2783
3046
 
3047
+ // src/lookupFromFormContext.ts
3048
+ var import_get18 = __toESM(require("lodash/get"), 1);
3049
+ var import_has6 = __toESM(require("lodash/has"), 1);
3050
+ function lookupFromFormContext(regOrFc, toLookup, fallback) {
3051
+ const lookupPath = [LOOKUP_MAP_NAME];
3052
+ if ((0, import_has6.default)(regOrFc, FORM_CONTEXT_NAME)) {
3053
+ lookupPath.unshift(FORM_CONTEXT_NAME);
3054
+ }
3055
+ return (0, import_get18.default)(regOrFc, [...lookupPath, toLookup], fallback);
3056
+ }
3057
+
2784
3058
  // src/orderProperties.ts
2785
3059
  function orderProperties(properties, order) {
2786
3060
  if (!Array.isArray(order)) {
@@ -2873,7 +3147,7 @@ function toDateString(dateObject, time = true) {
2873
3147
  }
2874
3148
 
2875
3149
  // src/toErrorList.ts
2876
- var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"));
3150
+ var import_isPlainObject2 = __toESM(require("lodash/isPlainObject"), 1);
2877
3151
  function toErrorList(errorSchema, fieldPath = []) {
2878
3152
  if (!errorSchema) {
2879
3153
  return [];
@@ -2903,7 +3177,7 @@ function toErrorList(errorSchema, fieldPath = []) {
2903
3177
  }
2904
3178
 
2905
3179
  // src/toErrorSchema.ts
2906
- var import_toPath = __toESM(require("lodash/toPath"));
3180
+ var import_toPath = __toESM(require("lodash/toPath"), 1);
2907
3181
  function toErrorSchema(errors) {
2908
3182
  const builder = new ErrorSchemaBuilder();
2909
3183
  if (errors.length) {
@@ -2922,7 +3196,7 @@ function toErrorSchema(errors) {
2922
3196
  }
2923
3197
 
2924
3198
  // src/unwrapErrorHandler.ts
2925
- var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"));
3199
+ var import_isPlainObject3 = __toESM(require("lodash/isPlainObject"), 1);
2926
3200
  function unwrapErrorHandler(errorHandler) {
2927
3201
  return Object.keys(errorHandler).reduce((acc, key) => {
2928
3202
  if (key === "addError") {
@@ -2957,7 +3231,7 @@ function utcToLocal(jsonDate) {
2957
3231
  }
2958
3232
 
2959
3233
  // src/validationDataMerge.ts
2960
- var import_isEmpty3 = __toESM(require("lodash/isEmpty"));
3234
+ var import_isEmpty4 = __toESM(require("lodash/isEmpty"), 1);
2961
3235
  function validationDataMerge(validationData, additionalErrorSchema) {
2962
3236
  if (!additionalErrorSchema) {
2963
3237
  return validationData;
@@ -2965,7 +3239,7 @@ function validationDataMerge(validationData, additionalErrorSchema) {
2965
3239
  const { errors: oldErrors, errorSchema: oldErrorSchema } = validationData;
2966
3240
  let errors = toErrorList(additionalErrorSchema);
2967
3241
  let errorSchema = additionalErrorSchema;
2968
- if (!(0, import_isEmpty3.default)(oldErrorSchema)) {
3242
+ if (!(0, import_isEmpty4.default)(oldErrorSchema)) {
2969
3243
  errorSchema = mergeObjects(oldErrorSchema, additionalErrorSchema, true);
2970
3244
  errors = [...oldErrors].concat(errors);
2971
3245
  }
@@ -2973,7 +3247,7 @@ function validationDataMerge(validationData, additionalErrorSchema) {
2973
3247
  }
2974
3248
 
2975
3249
  // src/withIdRefPrefix.ts
2976
- var import_isObject11 = __toESM(require("lodash/isObject"));
3250
+ var import_isObject10 = __toESM(require("lodash/isObject"), 1);
2977
3251
  function withIdRefPrefixObject(node) {
2978
3252
  for (const key in node) {
2979
3253
  const realObj = node;
@@ -2996,18 +3270,18 @@ function withIdRefPrefix(schemaNode) {
2996
3270
  if (Array.isArray(schemaNode)) {
2997
3271
  return withIdRefPrefixArray([...schemaNode]);
2998
3272
  }
2999
- if ((0, import_isObject11.default)(schemaNode)) {
3273
+ if ((0, import_isObject10.default)(schemaNode)) {
3000
3274
  return withIdRefPrefixObject({ ...schemaNode });
3001
3275
  }
3002
3276
  return schemaNode;
3003
3277
  }
3004
3278
 
3005
3279
  // src/getChangedFields.ts
3006
- var import_keys = __toESM(require("lodash/keys"));
3007
- var import_pickBy = __toESM(require("lodash/pickBy"));
3008
- var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"));
3009
- var import_get13 = __toESM(require("lodash/get"));
3010
- var import_difference = __toESM(require("lodash/difference"));
3280
+ var import_keys = __toESM(require("lodash/keys"), 1);
3281
+ var import_pickBy = __toESM(require("lodash/pickBy"), 1);
3282
+ var import_isPlainObject4 = __toESM(require("lodash/isPlainObject"), 1);
3283
+ var import_get19 = __toESM(require("lodash/get"), 1);
3284
+ var import_difference = __toESM(require("lodash/difference"), 1);
3011
3285
  function getChangedFields(a, b) {
3012
3286
  const aIsPlainObject = (0, import_isPlainObject4.default)(a);
3013
3287
  const bIsPlainObject = (0, import_isPlainObject4.default)(b);
@@ -3019,7 +3293,7 @@ function getChangedFields(a, b) {
3019
3293
  } else if (!aIsPlainObject && bIsPlainObject) {
3020
3294
  return (0, import_keys.default)(b);
3021
3295
  } else {
3022
- const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get13.default)(b, key))));
3296
+ const unequalFields = (0, import_keys.default)((0, import_pickBy.default)(a, (value, key) => !deepEquals(value, (0, import_get19.default)(b, key))));
3023
3297
  const diffFields = (0, import_difference.default)((0, import_keys.default)(b), (0, import_keys.default)(a));
3024
3298
  return [...unequalFields, ...diffFields];
3025
3299
  }
@@ -3029,6 +3303,7 @@ function getChangedFields(a, b) {
3029
3303
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3030
3304
  TranslatableString2["ArrayItemTitle"] = "Item";
3031
3305
  TranslatableString2["MissingItems"] = "Missing items definition";
3306
+ TranslatableString2["EmptyArray"] = "No items yet. Use the button below to add some.";
3032
3307
  TranslatableString2["YesLabel"] = "Yes";
3033
3308
  TranslatableString2["NoLabel"] = "No";
3034
3309
  TranslatableString2["CloseLabel"] = "Close";
@@ -3060,10 +3335,10 @@ var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
3060
3335
  })(TranslatableString || {});
3061
3336
 
3062
3337
  // src/parser/schemaParser.ts
3063
- var import_forEach = __toESM(require("lodash/forEach"));
3338
+ var import_forEach = __toESM(require("lodash/forEach"), 1);
3064
3339
 
3065
3340
  // src/parser/ParserValidator.ts
3066
- var import_get14 = __toESM(require("lodash/get"));
3341
+ var import_get20 = __toESM(require("lodash/get"), 1);
3067
3342
  var ParserValidator = class {
3068
3343
  /** Construct the ParserValidator for the given `rootSchema`. This `rootSchema` will be stashed in the `schemaMap`
3069
3344
  * first.
@@ -3089,7 +3364,7 @@ var ParserValidator = class {
3089
3364
  * @param hash - The hash value at which to map the schema
3090
3365
  */
3091
3366
  addSchema(schema, hash) {
3092
- const key = (0, import_get14.default)(schema, ID_KEY, hash);
3367
+ const key = (0, import_get20.default)(schema, ID_KEY, hash);
3093
3368
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3094
3369
  const existing = this.schemaMap[key];
3095
3370
  if (!existing) {