@rjsf/utils 5.23.2 → 5.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/index.js +217 -130
  2. package/dist/index.js.map +4 -4
  3. package/dist/utils.esm.js +217 -130
  4. package/dist/utils.esm.js.map +4 -4
  5. package/dist/utils.umd.js +209 -122
  6. package/lib/constIsAjvDataReference.d.ts +9 -0
  7. package/lib/constIsAjvDataReference.js +15 -0
  8. package/lib/constIsAjvDataReference.js.map +1 -0
  9. package/lib/enumOptionsDeselectValue.js +3 -3
  10. package/lib/enumOptionsDeselectValue.js.map +1 -1
  11. package/lib/enumOptionsIsSelected.js +3 -3
  12. package/lib/enumOptionsIsSelected.js.map +1 -1
  13. package/lib/getChangedFields.d.ts +17 -0
  14. package/lib/getChangedFields.js +42 -0
  15. package/lib/getChangedFields.js.map +1 -0
  16. package/lib/index.d.ts +2 -1
  17. package/lib/index.js +2 -1
  18. package/lib/index.js.map +1 -1
  19. package/lib/mergeDefaultsWithFormData.d.ts +5 -1
  20. package/lib/mergeDefaultsWithFormData.js +31 -8
  21. package/lib/mergeDefaultsWithFormData.js.map +1 -1
  22. package/lib/parser/ParserValidator.js +3 -3
  23. package/lib/parser/ParserValidator.js.map +1 -1
  24. package/lib/parser/schemaParser.js +4 -4
  25. package/lib/parser/schemaParser.js.map +1 -1
  26. package/lib/schema/getDefaultFormState.d.ts +17 -2
  27. package/lib/schema/getDefaultFormState.js +85 -31
  28. package/lib/schema/getDefaultFormState.js.map +1 -1
  29. package/lib/schema/retrieveSchema.js +7 -4
  30. package/lib/schema/retrieveSchema.js.map +1 -1
  31. package/lib/schema/toIdSchema.js +2 -2
  32. package/lib/schema/toIdSchema.js.map +1 -1
  33. package/lib/schema/toPathSchema.js +3 -3
  34. package/lib/schema/toPathSchema.js.map +1 -1
  35. package/lib/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +2 -2
  37. package/src/constIsAjvDataReference.ts +17 -0
  38. package/src/enumOptionsDeselectValue.ts +3 -4
  39. package/src/enumOptionsIsSelected.ts +3 -4
  40. package/src/getChangedFields.ts +40 -0
  41. package/src/index.ts +2 -0
  42. package/src/mergeDefaultsWithFormData.ts +42 -10
  43. package/src/parser/ParserValidator.ts +3 -3
  44. package/src/parser/schemaParser.ts +4 -4
  45. package/src/schema/getDefaultFormState.ts +126 -31
  46. package/src/schema/retrieveSchema.ts +8 -5
  47. package/src/schema/toIdSchema.ts +2 -2
  48. package/src/schema/toPathSchema.ts +3 -3
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/isEmpty'), require('jsonpointer'), require('lodash/omit'), require('lodash/has'), require('lodash/isNumber'), require('lodash/isObject'), require('lodash/isString'), require('lodash/reduce'), require('lodash/times'), require('lodash/isEqual'), require('lodash/set'), require('lodash/transform'), require('lodash/merge'), require('lodash/flattenDeep'), require('lodash/uniq'), require('json-schema-merge-allof'), require('lodash/union'), require('lodash/isNil'), require('lodash/cloneDeep'), require('lodash/setWith'), 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/isEmpty', 'jsonpointer', 'lodash/omit', 'lodash/has', 'lodash/isNumber', 'lodash/isObject', 'lodash/isString', 'lodash/reduce', 'lodash/times', 'lodash/isEqual', 'lodash/set', 'lodash/transform', 'lodash/merge', 'lodash/flattenDeep', 'lodash/uniq', 'json-schema-merge-allof', 'lodash/union', 'lodash/isNil', 'lodash/cloneDeep', 'lodash/setWith', 'react', 'react-is', 'react/jsx-runtime', 'lodash/toPath', 'lodash/forEach'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@rjsf/utils"] = {}, global.isPlainObject, global.isEqualWith, global.get8, global.isEmpty, global.jsonpointer, global.omit, global.has3, global.isNumber, global.isObject2, global.isString, global.reduce, global.times, global.isEqual4, global.set3, global.transform, global.merge, global.flattenDeep, global.uniq, global.mergeAllOf, global.union, global.isNil, global.cloneDeep, global.setWith, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.forEach));
5
- })(this, (function (exports, isPlainObject, isEqualWith, get8, isEmpty, jsonpointer, omit, has3, isNumber, isObject2, isString, reduce, times, isEqual4, set3, transform, merge, flattenDeep, uniq, mergeAllOf, union, isNil, cloneDeep, setWith, react, ReactIs, jsxRuntime, toPath, forEach) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('lodash/isPlainObject'), require('lodash/isEqualWith'), require('lodash/get'), require('lodash/isEmpty'), require('jsonpointer'), require('lodash/omit'), require('lodash/has'), require('lodash/isNumber'), require('lodash/isObject'), require('lodash/isString'), require('lodash/reduce'), require('lodash/times'), require('lodash/set'), require('lodash/transform'), require('lodash/merge'), require('lodash/flattenDeep'), require('lodash/uniq'), require('json-schema-merge-allof'), require('lodash/union'), require('lodash/isNil'), require('lodash/cloneDeep'), require('lodash/setWith'), 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/isEmpty', 'jsonpointer', 'lodash/omit', 'lodash/has', 'lodash/isNumber', 'lodash/isObject', 'lodash/isString', 'lodash/reduce', 'lodash/times', 'lodash/set', 'lodash/transform', 'lodash/merge', 'lodash/flattenDeep', 'lodash/uniq', 'json-schema-merge-allof', 'lodash/union', 'lodash/isNil', 'lodash/cloneDeep', 'lodash/setWith', '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.get8, global.isEmpty, global.jsonpointer, global.omit, global.has3, global.isNumber, global.isObject2, global.isString, global.reduce, global.times, global.set3, global.transform, global.merge, global.flattenDeep, global.uniq, global.mergeAllOf, global.union, global.isNil, global.cloneDeep, global.setWith, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.keys, global.pickBy, global.difference, global.forEach));
5
+ })(this, (function (exports, isPlainObject4, isEqualWith, get8, isEmpty, jsonpointer, omit, has3, isNumber, isObject2, isString, reduce, times, set3, transform, merge, flattenDeep, uniq, mergeAllOf, union, isNil, cloneDeep, setWith, react, ReactIs, jsxRuntime, toPath, keys, pickBy, difference, forEach) { 'use strict';
6
6
 
7
7
  // src/isObject.ts
8
8
  function isObject(thing) {
@@ -124,7 +124,7 @@
124
124
  return { ...acc, [key]: createErrorHandler(value) };
125
125
  }, handler);
126
126
  }
127
- if (isPlainObject(formData)) {
127
+ if (isPlainObject4(formData)) {
128
128
  const formObject = formData;
129
129
  return Object.keys(formObject).reduce((acc, key) => {
130
130
  return { ...acc, [key]: createErrorHandler(formObject[key]) };
@@ -461,7 +461,10 @@
461
461
  )
462
462
  );
463
463
  const allPermutations = getAllPermutationsOfXxxOf(allOfSchemaElements);
464
- return allPermutations.map((permutation) => ({ ...schema, allOf: permutation }));
464
+ return allPermutations.map((permutation) => ({
465
+ ...schema,
466
+ allOf: permutation
467
+ }));
465
468
  }
466
469
  return [schema];
467
470
  }
@@ -514,7 +517,7 @@
514
517
  items: resolveAllReferences(resolvedSchema.items, rootSchema, recurseList)
515
518
  };
516
519
  }
517
- return isEqual4(schema, resolvedSchema) ? schema : resolvedSchema;
520
+ return deepEquals(schema, resolvedSchema) ? schema : resolvedSchema;
518
521
  }
519
522
  function stubExistingAdditionalProperties(validator, theSchema, rootSchema, aFormData, experimental_customMergeAllOf) {
520
523
  const schema = {
@@ -914,38 +917,47 @@
914
917
  function isFixedItems(schema) {
915
918
  return Array.isArray(schema.items) && schema.items.length > 0 && schema.items.every((item) => isObject(item));
916
919
  }
917
- function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false, defaultSupercedesUndefined = false) {
920
+ function mergeDefaultsWithFormData(defaults, formData, mergeExtraArrayDefaults = false, defaultSupercedesUndefined = false, overrideFormDataWithDefaults = false) {
918
921
  if (Array.isArray(formData)) {
919
922
  const defaultsArray = Array.isArray(defaults) ? defaults : [];
920
- const mapped = formData.map((value, idx) => {
921
- if (defaultsArray[idx]) {
923
+ const overrideArray = overrideFormDataWithDefaults ? defaultsArray : formData;
924
+ const overrideOppositeArray = overrideFormDataWithDefaults ? formData : defaultsArray;
925
+ const mapped = overrideArray.map((value, idx) => {
926
+ if (overrideOppositeArray[idx]) {
922
927
  return mergeDefaultsWithFormData(
923
928
  defaultsArray[idx],
924
- value,
929
+ formData[idx],
925
930
  mergeExtraArrayDefaults,
926
- defaultSupercedesUndefined
931
+ defaultSupercedesUndefined,
932
+ overrideFormDataWithDefaults
927
933
  );
928
934
  }
929
935
  return value;
930
936
  });
931
- if (mergeExtraArrayDefaults && mapped.length < defaultsArray.length) {
932
- mapped.push(...defaultsArray.slice(mapped.length));
937
+ if ((mergeExtraArrayDefaults || overrideFormDataWithDefaults) && mapped.length < overrideOppositeArray.length) {
938
+ mapped.push(...overrideOppositeArray.slice(mapped.length));
933
939
  }
934
940
  return mapped;
935
941
  }
936
942
  if (isObject(formData)) {
937
943
  const acc = Object.assign({}, defaults);
938
944
  return Object.keys(formData).reduce((acc2, key) => {
945
+ const keyValue = get8(formData, key);
946
+ const keyExistsInDefaults = isObject(defaults) && key in defaults;
947
+ const keyExistsInFormData = key in formData;
939
948
  acc2[key] = mergeDefaultsWithFormData(
940
949
  defaults ? get8(defaults, key) : {},
941
- get8(formData, key),
950
+ keyValue,
942
951
  mergeExtraArrayDefaults,
943
- defaultSupercedesUndefined
952
+ defaultSupercedesUndefined,
953
+ // overrideFormDataWithDefaults can be true only when the key value exists in defaults
954
+ // Or if the key value doesn't exist in formData
955
+ overrideFormDataWithDefaults && (keyExistsInDefaults || !keyExistsInFormData)
944
956
  );
945
957
  return acc2;
946
958
  }, acc);
947
959
  }
948
- if (defaultSupercedesUndefined && formData === void 0) {
960
+ if (defaultSupercedesUndefined && (!isNil(defaults) && isNil(formData) || typeof formData === "number" && isNaN(formData)) || overrideFormDataWithDefaults && !isNil(formData)) {
949
961
  return defaults;
950
962
  }
951
963
  return formData;
@@ -1000,6 +1012,66 @@
1000
1012
  }
1001
1013
  return isSelect(validator, schema.items, rootSchema, experimental_customMergeAllOf);
1002
1014
  }
1015
+ function constIsAjvDataReference(schema) {
1016
+ const schemaConst = schema[CONST_KEY];
1017
+ const schemaType = getSchemaType(schema);
1018
+ return isObject(schemaConst) && isString(schemaConst?.$data) && schemaType !== "object" && schemaType !== "array";
1019
+ }
1020
+
1021
+ // src/toConstant.ts
1022
+ function toConstant(schema) {
1023
+ if (ENUM_KEY in schema && Array.isArray(schema.enum) && schema.enum.length === 1) {
1024
+ return schema.enum[0];
1025
+ }
1026
+ if (CONST_KEY in schema) {
1027
+ return schema.const;
1028
+ }
1029
+ throw new Error("schema cannot be inferred as a constant");
1030
+ }
1031
+
1032
+ // src/optionsList.ts
1033
+ function optionsList(schema, uiSchema) {
1034
+ const schemaWithEnumNames = schema;
1035
+ if (schema.enum) {
1036
+ let enumNames;
1037
+ if (uiSchema) {
1038
+ const { enumNames: uiEnumNames } = getUiOptions(uiSchema);
1039
+ enumNames = uiEnumNames;
1040
+ }
1041
+ if (!enumNames && schemaWithEnumNames.enumNames) {
1042
+ {
1043
+ console.warn(
1044
+ '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.'
1045
+ );
1046
+ }
1047
+ enumNames = schemaWithEnumNames.enumNames;
1048
+ }
1049
+ return schema.enum.map((value, i) => {
1050
+ const label = enumNames?.[i] || String(value);
1051
+ return { label, value };
1052
+ });
1053
+ }
1054
+ let altSchemas = void 0;
1055
+ let altUiSchemas = void 0;
1056
+ if (schema.anyOf) {
1057
+ altSchemas = schema.anyOf;
1058
+ altUiSchemas = uiSchema?.anyOf;
1059
+ } else if (schema.oneOf) {
1060
+ altSchemas = schema.oneOf;
1061
+ altUiSchemas = uiSchema?.oneOf;
1062
+ }
1063
+ return altSchemas && altSchemas.map((aSchemaDef, index) => {
1064
+ const { title } = getUiOptions(altUiSchemas?.[index]);
1065
+ const aSchema = aSchemaDef;
1066
+ const value = toConstant(aSchema);
1067
+ const label = title || aSchema.title || String(value);
1068
+ return {
1069
+ schema: aSchema,
1070
+ label,
1071
+ value
1072
+ };
1073
+ });
1074
+ }
1003
1075
 
1004
1076
  // src/schema/getDefaultFormState.ts
1005
1077
  var PRIMITIVE_TYPES = ["string", "number", "integer", "boolean", "null"];
@@ -1024,8 +1096,8 @@
1024
1096
  if (includeUndefinedValues || isConst) {
1025
1097
  obj[key] = computedDefault;
1026
1098
  } else if (emptyObjectFields !== "skipDefaults") {
1099
+ const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1027
1100
  if (isObject(computedDefault)) {
1028
- const isSelfOrParentRequired = isParentRequired === void 0 ? requiredFields.includes(key) : isParentRequired;
1029
1101
  if (emptyObjectFields === "skipEmptyDefaults") {
1030
1102
  if (!isEmpty(computedDefault)) {
1031
1103
  obj[key] = computedDefault;
@@ -1036,8 +1108,9 @@
1036
1108
  } else if (
1037
1109
  // Store computedDefault if it's a defined primitive (e.g., true) and satisfies certain conditions
1038
1110
  // Condition 1: computedDefault is not undefined
1039
- // Condition 2: If emptyObjectFields is 'populateAllDefaults' or 'skipEmptyDefaults) or if the key is a required field
1040
- computedDefault !== void 0 && (emptyObjectFields === "populateAllDefaults" || emptyObjectFields === "skipEmptyDefaults" || requiredFields.includes(key))
1111
+ // Condition 2: If emptyObjectFields is 'populateAllDefaults' or 'skipEmptyDefaults)
1112
+ // Or if isSelfOrParentRequired is 'true' and the key is a required field
1113
+ computedDefault !== void 0 && (emptyObjectFields === "populateAllDefaults" || emptyObjectFields === "skipEmptyDefaults" || isSelfOrParentRequired && requiredFields.includes(key))
1041
1114
  ) {
1042
1115
  obj[key] = computedDefault;
1043
1116
  }
@@ -1052,7 +1125,8 @@
1052
1125
  _recurseList = [],
1053
1126
  experimental_defaultFormStateBehavior = void 0,
1054
1127
  experimental_customMergeAllOf = void 0,
1055
- required
1128
+ required,
1129
+ shouldMergeDefaultsIntoFormData = false
1056
1130
  } = computeDefaultsProps;
1057
1131
  const formData = isObject(rawFormData) ? rawFormData : {};
1058
1132
  const schema = isObject(rawSchema) ? rawSchema : {};
@@ -1060,8 +1134,8 @@
1060
1134
  let schemaToCompute = null;
1061
1135
  let experimental_dfsb_to_compute = experimental_defaultFormStateBehavior;
1062
1136
  let updatedRecurseList = _recurseList;
1063
- if (schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults !== "never") {
1064
- defaults = schema.const;
1137
+ if (schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1138
+ defaults = schema[CONST_KEY];
1065
1139
  } else if (isObject(defaults) && isObject(schema.default)) {
1066
1140
  defaults = mergeObjects(defaults, schema.default);
1067
1141
  } else if (DEFAULT_KEY in schema) {
@@ -1097,7 +1171,8 @@
1097
1171
  experimental_customMergeAllOf,
1098
1172
  parentDefaults: Array.isArray(parentDefaults) ? parentDefaults[idx] : void 0,
1099
1173
  rawFormData: formData,
1100
- required
1174
+ required,
1175
+ shouldMergeDefaultsIntoFormData
1101
1176
  })
1102
1177
  );
1103
1178
  } else if (ONE_OF_KEY in schema) {
@@ -1108,12 +1183,15 @@
1108
1183
  const discriminator = getDiscriminatorFieldFromSchema(schema);
1109
1184
  const { type = "null" } = remaining;
1110
1185
  if (!Array.isArray(type) && PRIMITIVE_TYPES.includes(type) && experimental_dfsb_to_compute?.constAsDefaults === "skipOneOf") {
1111
- experimental_dfsb_to_compute = { ...experimental_dfsb_to_compute, constAsDefaults: "never" };
1186
+ experimental_dfsb_to_compute = {
1187
+ ...experimental_dfsb_to_compute,
1188
+ constAsDefaults: "never"
1189
+ };
1112
1190
  }
1113
1191
  schemaToCompute = oneOf[getClosestMatchingOption(
1114
1192
  validator,
1115
1193
  rootSchema,
1116
- isEmpty(formData) ? void 0 : formData,
1194
+ rawFormData,
1117
1195
  oneOf,
1118
1196
  0,
1119
1197
  discriminator,
@@ -1129,7 +1207,7 @@
1129
1207
  schemaToCompute = anyOf[getClosestMatchingOption(
1130
1208
  validator,
1131
1209
  rootSchema,
1132
- isEmpty(formData) ? void 0 : formData,
1210
+ rawFormData,
1133
1211
  anyOf,
1134
1212
  0,
1135
1213
  discriminator,
@@ -1146,14 +1224,49 @@
1146
1224
  experimental_customMergeAllOf,
1147
1225
  parentDefaults: defaults,
1148
1226
  rawFormData: formData,
1149
- required
1227
+ required,
1228
+ shouldMergeDefaultsIntoFormData
1150
1229
  });
1151
1230
  }
1152
1231
  if (defaults === void 0) {
1153
1232
  defaults = schema.default;
1154
1233
  }
1155
1234
  const defaultBasedOnSchemaType = getDefaultBasedOnSchemaType(validator, schema, computeDefaultsProps, defaults);
1156
- return defaultBasedOnSchemaType ?? defaults;
1235
+ let defaultsWithFormData = defaultBasedOnSchemaType ?? defaults;
1236
+ if (shouldMergeDefaultsIntoFormData) {
1237
+ const { arrayMinItems = {} } = experimental_defaultFormStateBehavior || {};
1238
+ const { mergeExtraDefaults } = arrayMinItems;
1239
+ const matchingFormData = ensureFormDataMatchingSchema(
1240
+ validator,
1241
+ schema,
1242
+ rootSchema,
1243
+ rawFormData,
1244
+ experimental_defaultFormStateBehavior
1245
+ );
1246
+ if (!isObject(rawFormData)) {
1247
+ defaultsWithFormData = mergeDefaultsWithFormData(
1248
+ defaultsWithFormData,
1249
+ matchingFormData,
1250
+ mergeExtraDefaults,
1251
+ true
1252
+ );
1253
+ }
1254
+ }
1255
+ return defaultsWithFormData;
1256
+ }
1257
+ function ensureFormDataMatchingSchema(validator, schema, rootSchema, formData, experimental_defaultFormStateBehavior) {
1258
+ const isSelectField = !isConstant(schema) && isSelect(validator, schema, rootSchema);
1259
+ let validFormData = formData;
1260
+ if (isSelectField) {
1261
+ const getOptionsList = optionsList(schema);
1262
+ const isValid = getOptionsList?.some((option) => deepEquals(option.value, formData));
1263
+ validFormData = isValid ? formData : void 0;
1264
+ }
1265
+ const constTakesPrecedence = schema[CONST_KEY] && experimental_defaultFormStateBehavior?.constAsDefaults === "always";
1266
+ if (constTakesPrecedence) {
1267
+ validFormData = schema.const;
1268
+ }
1269
+ return validFormData;
1157
1270
  }
1158
1271
  function getObjectDefaults(validator, rawSchema, {
1159
1272
  rawFormData,
@@ -1162,7 +1275,8 @@
1162
1275
  _recurseList = [],
1163
1276
  experimental_defaultFormStateBehavior = void 0,
1164
1277
  experimental_customMergeAllOf = void 0,
1165
- required
1278
+ required,
1279
+ shouldMergeDefaultsIntoFormData
1166
1280
  } = {}, defaults) {
1167
1281
  {
1168
1282
  const formData = isObject(rawFormData) ? rawFormData : {};
@@ -1173,7 +1287,7 @@
1173
1287
  (acc, key) => {
1174
1288
  const propertySchema = get8(retrievedSchema, [PROPERTIES_KEY, key]);
1175
1289
  const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1176
- const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never";
1290
+ const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(propertySchema);
1177
1291
  const computedDefault = computeDefaults(validator, propertySchema, {
1178
1292
  rootSchema,
1179
1293
  _recurseList,
@@ -1182,7 +1296,8 @@
1182
1296
  includeUndefinedValues: includeUndefinedValues === true,
1183
1297
  parentDefaults: get8(defaults, [key]),
1184
1298
  rawFormData: get8(formData, [key]),
1185
- required: retrievedSchema.required?.includes(key)
1299
+ required: retrievedSchema.required?.includes(key),
1300
+ shouldMergeDefaultsIntoFormData
1186
1301
  });
1187
1302
  maybeAddDefaultToObject(
1188
1303
  acc,
@@ -1200,16 +1315,16 @@
1200
1315
  );
1201
1316
  if (retrievedSchema.additionalProperties) {
1202
1317
  const additionalPropertiesSchema = isObject(retrievedSchema.additionalProperties) ? retrievedSchema.additionalProperties : {};
1203
- const keys = /* @__PURE__ */ new Set();
1318
+ const keys2 = /* @__PURE__ */ new Set();
1204
1319
  if (isObject(defaults)) {
1205
- Object.keys(defaults).filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key]).forEach((key) => keys.add(key));
1320
+ Object.keys(defaults).filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key]).forEach((key) => keys2.add(key));
1206
1321
  }
1207
1322
  const formDataRequired = [];
1208
1323
  Object.keys(formData).filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key]).forEach((key) => {
1209
- keys.add(key);
1324
+ keys2.add(key);
1210
1325
  formDataRequired.push(key);
1211
1326
  });
1212
- keys.forEach((key) => {
1327
+ keys2.forEach((key) => {
1213
1328
  const computedDefault = computeDefaults(validator, additionalPropertiesSchema, {
1214
1329
  rootSchema,
1215
1330
  _recurseList,
@@ -1218,7 +1333,8 @@
1218
1333
  includeUndefinedValues: includeUndefinedValues === true,
1219
1334
  parentDefaults: get8(defaults, [key]),
1220
1335
  rawFormData: get8(formData, [key]),
1221
- required: retrievedSchema.required?.includes(key)
1336
+ required: retrievedSchema.required?.includes(key),
1337
+ shouldMergeDefaultsIntoFormData
1222
1338
  });
1223
1339
  maybeAddDefaultToObject(
1224
1340
  objectDefaults,
@@ -1239,7 +1355,8 @@
1239
1355
  _recurseList = [],
1240
1356
  experimental_defaultFormStateBehavior = void 0,
1241
1357
  experimental_customMergeAllOf = void 0,
1242
- required
1358
+ required,
1359
+ shouldMergeDefaultsIntoFormData
1243
1360
  } = {}, defaults) {
1244
1361
  const schema = rawSchema;
1245
1362
  const arrayMinItemsStateBehavior = experimental_defaultFormStateBehavior?.arrayMinItems ?? {};
@@ -1259,7 +1376,8 @@
1259
1376
  experimental_defaultFormStateBehavior,
1260
1377
  experimental_customMergeAllOf,
1261
1378
  parentDefaults: item,
1262
- required
1379
+ required,
1380
+ shouldMergeDefaultsIntoFormData
1263
1381
  });
1264
1382
  });
1265
1383
  }
@@ -1276,7 +1394,8 @@
1276
1394
  experimental_customMergeAllOf,
1277
1395
  rawFormData: item,
1278
1396
  parentDefaults: get8(defaults, [idx]),
1279
- required
1397
+ required,
1398
+ shouldMergeDefaultsIntoFormData
1280
1399
  });
1281
1400
  });
1282
1401
  const mergeExtraDefaults = (ignoreMinItemsFlagSet && required || isPopulateAll) && arrayMergeExtraDefaults;
@@ -1306,7 +1425,8 @@
1306
1425
  _recurseList,
1307
1426
  experimental_defaultFormStateBehavior,
1308
1427
  experimental_customMergeAllOf,
1309
- required
1428
+ required,
1429
+ shouldMergeDefaultsIntoFormData
1310
1430
  })
1311
1431
  );
1312
1432
  return defaultEntries.concat(fillerEntries);
@@ -1331,21 +1451,24 @@
1331
1451
  includeUndefinedValues,
1332
1452
  experimental_defaultFormStateBehavior,
1333
1453
  experimental_customMergeAllOf,
1334
- rawFormData: formData
1454
+ rawFormData: formData,
1455
+ shouldMergeDefaultsIntoFormData: true
1335
1456
  });
1336
- if (formData === void 0 || formData === null || typeof formData === "number" && isNaN(formData)) {
1337
- return defaults;
1338
- }
1339
- const { mergeDefaultsIntoFormData, arrayMinItems = {} } = experimental_defaultFormStateBehavior || {};
1340
- const { mergeExtraDefaults } = arrayMinItems;
1341
- const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
1342
- if (isObject(formData)) {
1343
- return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults, defaultSupercedesUndefined);
1344
- }
1345
- if (Array.isArray(formData)) {
1346
- return mergeDefaultsWithFormData(defaults, formData, mergeExtraDefaults, defaultSupercedesUndefined);
1457
+ if (isObject(formData) || Array.isArray(formData)) {
1458
+ const { mergeDefaultsIntoFormData } = experimental_defaultFormStateBehavior || {};
1459
+ const defaultSupercedesUndefined = mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined";
1460
+ const result = mergeDefaultsWithFormData(
1461
+ defaults,
1462
+ formData,
1463
+ true,
1464
+ // set to true to add any additional default array entries.
1465
+ defaultSupercedesUndefined,
1466
+ true
1467
+ // set to true to override formData with defaults if they exist.
1468
+ );
1469
+ return result;
1347
1470
  }
1348
- return formData;
1471
+ return defaults;
1349
1472
  }
1350
1473
 
1351
1474
  // src/isCustomWidget.ts
@@ -1421,9 +1544,9 @@
1421
1544
  }
1422
1545
  });
1423
1546
  }
1424
- const keys = Object.keys(get8(newSchema, PROPERTIES_KEY, {}));
1547
+ const keys2 = Object.keys(get8(newSchema, PROPERTIES_KEY, {}));
1425
1548
  const nestedData = {};
1426
- keys.forEach((key) => {
1549
+ keys2.forEach((key) => {
1427
1550
  const formValue = get8(data, key);
1428
1551
  let oldKeyedSchema = get8(oldSchema, [PROPERTIES_KEY, key], {});
1429
1552
  let newKeyedSchema = get8(newSchema, [PROPERTIES_KEY, key], {});
@@ -1540,7 +1663,7 @@
1540
1663
  function toIdSchemaInternal(validator, schema, idPrefix, idSeparator, id, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1541
1664
  if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1542
1665
  const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
1543
- const sameSchemaIndex = _recurseList.findIndex((item) => isEqual4(item, _schema));
1666
+ const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
1544
1667
  if (sameSchemaIndex === -1) {
1545
1668
  return toIdSchemaInternal(
1546
1669
  validator,
@@ -1607,7 +1730,7 @@
1607
1730
  function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1608
1731
  if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1609
1732
  const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
1610
- const sameSchemaIndex = _recurseList.findIndex((item) => isEqual4(item, _schema));
1733
+ const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
1611
1734
  if (sameSchemaIndex === -1) {
1612
1735
  return toPathSchemaInternal(
1613
1736
  validator,
@@ -2059,15 +2182,17 @@
2059
2182
  function enumOptionsDeselectValue(valueIndex, selected, allEnumOptions = []) {
2060
2183
  const value = enumOptionsValueForIndex(valueIndex, allEnumOptions);
2061
2184
  if (Array.isArray(selected)) {
2062
- return selected.filter((v) => !isEqual4(v, value));
2185
+ return selected.filter((v) => !deepEquals(v, value));
2063
2186
  }
2064
- return isEqual4(value, selected) ? void 0 : selected;
2187
+ return deepEquals(value, selected) ? void 0 : selected;
2065
2188
  }
2189
+
2190
+ // src/enumOptionsIsSelected.ts
2066
2191
  function enumOptionsIsSelected(value, selected) {
2067
2192
  if (Array.isArray(selected)) {
2068
- return selected.some((sel) => isEqual4(sel, value));
2193
+ return selected.some((sel) => deepEquals(sel, value));
2069
2194
  }
2070
- return isEqual4(selected, value);
2195
+ return deepEquals(selected, value);
2071
2196
  }
2072
2197
 
2073
2198
  // src/enumOptionsIndexForValue.ts
@@ -2432,61 +2557,6 @@
2432
2557
  return dateString ? new Date(dateString).toJSON() : void 0;
2433
2558
  }
2434
2559
 
2435
- // src/toConstant.ts
2436
- function toConstant(schema) {
2437
- if (ENUM_KEY in schema && Array.isArray(schema.enum) && schema.enum.length === 1) {
2438
- return schema.enum[0];
2439
- }
2440
- if (CONST_KEY in schema) {
2441
- return schema.const;
2442
- }
2443
- throw new Error("schema cannot be inferred as a constant");
2444
- }
2445
-
2446
- // src/optionsList.ts
2447
- function optionsList(schema, uiSchema) {
2448
- const schemaWithEnumNames = schema;
2449
- if (schema.enum) {
2450
- let enumNames;
2451
- if (uiSchema) {
2452
- const { enumNames: uiEnumNames } = getUiOptions(uiSchema);
2453
- enumNames = uiEnumNames;
2454
- }
2455
- if (!enumNames && schemaWithEnumNames.enumNames) {
2456
- {
2457
- console.warn(
2458
- '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.'
2459
- );
2460
- }
2461
- enumNames = schemaWithEnumNames.enumNames;
2462
- }
2463
- return schema.enum.map((value, i) => {
2464
- const label = enumNames?.[i] || String(value);
2465
- return { label, value };
2466
- });
2467
- }
2468
- let altSchemas = void 0;
2469
- let altUiSchemas = void 0;
2470
- if (schema.anyOf) {
2471
- altSchemas = schema.anyOf;
2472
- altUiSchemas = uiSchema?.anyOf;
2473
- } else if (schema.oneOf) {
2474
- altSchemas = schema.oneOf;
2475
- altUiSchemas = uiSchema?.oneOf;
2476
- }
2477
- return altSchemas && altSchemas.map((aSchemaDef, index) => {
2478
- const { title } = getUiOptions(altUiSchemas?.[index]);
2479
- const aSchema = aSchemaDef;
2480
- const value = toConstant(aSchema);
2481
- const label = title || aSchema.title || String(value);
2482
- return {
2483
- schema: aSchema,
2484
- label,
2485
- value
2486
- };
2487
- });
2488
- }
2489
-
2490
2560
  // src/orderProperties.ts
2491
2561
  function orderProperties(properties, order) {
2492
2562
  if (!Array.isArray(order)) {
@@ -2597,7 +2667,7 @@
2597
2667
  return Object.keys(errorSchema).reduce((acc, key) => {
2598
2668
  if (key !== ERRORS_KEY) {
2599
2669
  const childSchema = errorSchema[key];
2600
- if (isPlainObject(childSchema)) {
2670
+ if (isPlainObject4(childSchema)) {
2601
2671
  acc = acc.concat(toErrorList(childSchema, [...fieldPath, key]));
2602
2672
  }
2603
2673
  }
@@ -2626,7 +2696,7 @@
2626
2696
  return acc;
2627
2697
  } else {
2628
2698
  const childSchema = errorHandler[key];
2629
- if (isPlainObject(childSchema)) {
2699
+ if (isPlainObject4(childSchema)) {
2630
2700
  return {
2631
2701
  ...acc,
2632
2702
  [key]: unwrapErrorHandler(childSchema)
@@ -2692,6 +2762,22 @@
2692
2762
  }
2693
2763
  return schemaNode;
2694
2764
  }
2765
+ function getChangedFields(a, b) {
2766
+ const aIsPlainObject = isPlainObject4(a);
2767
+ const bIsPlainObject = isPlainObject4(b);
2768
+ if (a === b || !aIsPlainObject && !bIsPlainObject) {
2769
+ return [];
2770
+ }
2771
+ if (aIsPlainObject && !bIsPlainObject) {
2772
+ return keys(a);
2773
+ } else if (!aIsPlainObject && bIsPlainObject) {
2774
+ return keys(b);
2775
+ } else {
2776
+ const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get8(b, key))));
2777
+ const diffFields = difference(keys(b), keys(a));
2778
+ return [...unequalFields, ...diffFields];
2779
+ }
2780
+ }
2695
2781
 
2696
2782
  // src/enums.ts
2697
2783
  var TranslatableString = /* @__PURE__ */ ((TranslatableString2) => {
@@ -2756,7 +2842,7 @@
2756
2842
  const existing = this.schemaMap[key];
2757
2843
  if (!existing) {
2758
2844
  this.schemaMap[key] = identifiedSchema;
2759
- } else if (!isEqual4(existing, identifiedSchema)) {
2845
+ } else if (!deepEquals(existing, identifiedSchema)) {
2760
2846
  console.error("existing schema:", JSON.stringify(existing, null, 2));
2761
2847
  console.error("new schema:", JSON.stringify(identifiedSchema, null, 2));
2762
2848
  throw new Error(
@@ -2778,7 +2864,7 @@
2778
2864
  * @throws - Error when the given `rootSchema` differs from the root schema provided during construction
2779
2865
  */
2780
2866
  isValid(schema, _formData, rootSchema) {
2781
- if (!isEqual4(rootSchema, this.rootSchema)) {
2867
+ if (!deepEquals(rootSchema, this.rootSchema)) {
2782
2868
  throw new Error("Unexpectedly calling isValid() with a rootSchema that differs from the construction rootSchema");
2783
2869
  }
2784
2870
  this.addSchema(schema, hashForSchema(schema));
@@ -2818,7 +2904,7 @@
2818
2904
  function parseSchema(validator, recurseList, rootSchema, schema) {
2819
2905
  const schemas = retrieveSchemaInternal(validator, schema, rootSchema, void 0, true);
2820
2906
  schemas.forEach((schema2) => {
2821
- const sameSchemaIndex = recurseList.findIndex((item) => isEqual4(item, schema2));
2907
+ const sameSchemaIndex = recurseList.findIndex((item) => deepEquals(item, schema2));
2822
2908
  if (sameSchemaIndex === -1) {
2823
2909
  recurseList.push(schema2);
2824
2910
  const allOptions = resolveAnyOrOneOfSchemas(validator, schema2, rootSchema, true);
@@ -2890,6 +2976,7 @@
2890
2976
  exports.errorId = errorId;
2891
2977
  exports.examplesId = examplesId;
2892
2978
  exports.findSchemaDefinition = findSchemaDefinition;
2979
+ exports.getChangedFields = getChangedFields;
2893
2980
  exports.getClosestMatchingOption = getClosestMatchingOption;
2894
2981
  exports.getDateElementProps = getDateElementProps;
2895
2982
  exports.getDefaultFormState = getDefaultFormState;
@@ -0,0 +1,9 @@
1
+ import { RJSFSchema, StrictRJSFSchema } from './types';
2
+ /**
3
+ * Checks if the schema const property value is an AJV $data reference
4
+ * and the current schema is not an object or array
5
+ *
6
+ * @param schema - The schema to check if the const is an AJV $data reference
7
+ * @returns - true if the schema const property value is an AJV $data reference otherwise false.
8
+ */
9
+ export default function constIsAjvDataReference<S extends StrictRJSFSchema = RJSFSchema>(schema: S): boolean;
@@ -0,0 +1,15 @@
1
+ import { CONST_KEY, getSchemaType, isObject } from './';
2
+ import isString from 'lodash/isString';
3
+ /**
4
+ * Checks if the schema const property value is an AJV $data reference
5
+ * and the current schema is not an object or array
6
+ *
7
+ * @param schema - The schema to check if the const is an AJV $data reference
8
+ * @returns - true if the schema const property value is an AJV $data reference otherwise false.
9
+ */
10
+ export default function constIsAjvDataReference(schema) {
11
+ const schemaConst = schema[CONST_KEY];
12
+ const schemaType = getSchemaType(schema);
13
+ return isObject(schemaConst) && isString(schemaConst === null || schemaConst === void 0 ? void 0 : schemaConst.$data) && schemaType !== 'object' && schemaType !== 'array';
14
+ }
15
+ //# sourceMappingURL=constIsAjvDataReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constIsAjvDataReference.js","sourceRoot":"","sources":["../src/constIsAjvDataReference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAGxD,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAA0C,MAAS;IAChG,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAwC,CAAC;IAC7E,MAAM,UAAU,GAAG,aAAa,CAAI,MAAM,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,OAAO,CAAC;AACpH,CAAC"}