@rjsf/utils 6.1.2 → 6.2.3

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.
package/dist/utils.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('lodash/isPlainObject'), require('lodash/isEqualWith'), require('lodash/get'), require('lodash/has'), require('lodash/isEqual'), require('lodash/set'), require('lodash/times'), require('lodash/transform'), require('lodash/merge'), require('lodash/flattenDeep'), require('lodash/uniq'), require('lodash/isEmpty'), require('@x0k/json-schema-merge'), require('@x0k/json-schema-merge/lib/array'), require('jsonpointer'), require('lodash/omit'), require('lodash/isObject'), require('fast-uri'), require('lodash/isString'), require('lodash/union'), require('lodash/isNumber'), require('lodash/reduce'), require('lodash/isNil'), require('lodash/cloneDeep'), require('lodash/setWith'), require('lodash/keys'), require('lodash/pickBy'), require('lodash/difference'), require('lodash/uniqueId'), require('react'), require('react-is'), require('react/jsx-runtime'), require('lodash/toPath'), require('lodash/forEach')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'lodash/isPlainObject', 'lodash/isEqualWith', 'lodash/get', 'lodash/has', 'lodash/isEqual', 'lodash/set', 'lodash/times', 'lodash/transform', 'lodash/merge', 'lodash/flattenDeep', 'lodash/uniq', 'lodash/isEmpty', '@x0k/json-schema-merge', '@x0k/json-schema-merge/lib/array', 'jsonpointer', 'lodash/omit', 'lodash/isObject', 'fast-uri', 'lodash/isString', 'lodash/union', 'lodash/isNumber', 'lodash/reduce', 'lodash/isNil', 'lodash/cloneDeep', 'lodash/setWith', 'lodash/keys', 'lodash/pickBy', 'lodash/difference', 'lodash/uniqueId', 'react', 'react-is', 'react/jsx-runtime', 'lodash/toPath', 'lodash/forEach'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@rjsf/utils"] = {}, global.isPlainObject2, global.isEqualWith, global.get14, global.has5, global.isEqual2, global.set, global.times, global.transform, global.merge, global.flattenDeep, global.uniq, global.isEmpty4, global.jsonSchemaMerge, global.array, global.jsonpointer, global.omit, global.isObject2, global.UriResolver, global.isString, global.union, global.isNumber, global.reduce, global.isNil, global.cloneDeep, global.setWith, global.keys, global.pickBy, global.difference, global.uniqueId, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.forEach));
5
- })(this, (function (exports, isPlainObject2, isEqualWith, get14, has5, isEqual2, set, times, transform, merge, flattenDeep, uniq, isEmpty4, jsonSchemaMerge, array, jsonpointer, omit, isObject2, UriResolver, isString, union, isNumber, reduce, isNil, cloneDeep, setWith, keys, pickBy, difference, uniqueId, 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/has'), require('lodash/isEqual'), require('lodash/set'), require('lodash/times'), require('lodash/transform'), require('lodash/merge'), require('lodash/flattenDeep'), require('lodash/uniq'), require('lodash/isEmpty'), require('@x0k/json-schema-merge'), require('@x0k/json-schema-merge/lib/array'), require('jsonpointer'), require('lodash/omit'), require('lodash/isObject'), require('fast-uri'), require('lodash/isString'), require('lodash/union'), require('lodash/isNumber'), require('lodash/reduce'), require('lodash/isNil'), require('lodash/pick'), require('lodash/cloneDeep'), require('lodash/setWith'), require('lodash/keys'), require('lodash/pickBy'), require('lodash/difference'), require('lodash/uniqueId'), require('react'), require('react-is'), require('react/jsx-runtime'), require('lodash/toPath'), require('lodash/forEach')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'lodash/isPlainObject', 'lodash/isEqualWith', 'lodash/get', 'lodash/has', 'lodash/isEqual', 'lodash/set', 'lodash/times', 'lodash/transform', 'lodash/merge', 'lodash/flattenDeep', 'lodash/uniq', 'lodash/isEmpty', '@x0k/json-schema-merge', '@x0k/json-schema-merge/lib/array', 'jsonpointer', 'lodash/omit', 'lodash/isObject', 'fast-uri', 'lodash/isString', 'lodash/union', 'lodash/isNumber', 'lodash/reduce', 'lodash/isNil', 'lodash/pick', 'lodash/cloneDeep', 'lodash/setWith', 'lodash/keys', 'lodash/pickBy', 'lodash/difference', 'lodash/uniqueId', 'react', 'react-is', 'react/jsx-runtime', 'lodash/toPath', 'lodash/forEach'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@rjsf/utils"] = {}, global.isPlainObject2, global.isEqualWith, global.get16, global.has5, global.isEqual2, global.set, global.times, global.transform, global.merge, global.flattenDeep, global.uniq, global.isEmpty4, global.jsonSchemaMerge, global.array, global.jsonpointer, global.omit, global.isObject2, global.UriResolver, global.isString, global.union, global.isNumber, global.reduce, global.isNil, global.pick, global.cloneDeep, global.setWith, global.keys, global.pickBy, global.difference, global.uniqueId, global.react, global.ReactIs, global.jsxRuntime, global.toPath, global.forEach));
5
+ })(this, (function (exports, isPlainObject2, isEqualWith, get16, has5, isEqual2, set, times, transform, merge, flattenDeep, uniq, isEmpty4, jsonSchemaMerge, array, jsonpointer, omit, isObject2, UriResolver, isString, union, isNumber, reduce, isNil, pick, cloneDeep, setWith, keys, pickBy, difference, uniqueId, react, ReactIs, jsxRuntime, toPath, forEach) { 'use strict';
6
6
 
7
7
  // src/isObject.ts
8
8
  function isObject(thing) {
@@ -176,7 +176,7 @@
176
176
  return void 0;
177
177
  }
178
178
  function makeAllReferencesAbsolute(schema, baseURI) {
179
- const currentURI = get14(schema, ID_KEY, baseURI);
179
+ const currentURI = get16(schema, ID_KEY, baseURI);
180
180
  if (REF_KEY in schema) {
181
181
  schema = { ...schema, [REF_KEY]: UriResolver.resolve(currentURI, schema[REF_KEY]) };
182
182
  }
@@ -197,7 +197,7 @@
197
197
  const remaining = omit(object, [key]);
198
198
  return [remaining, value];
199
199
  }
200
- function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = get14(rootSchema, [ID_KEY])) {
200
+ function findSchemaDefinitionRecursive($ref, rootSchema = {}, recurseList = [], baseURI = get16(rootSchema, [ID_KEY])) {
201
201
  const ref = $ref || "";
202
202
  let current = void 0;
203
203
  if (ref.startsWith("#")) {
@@ -247,13 +247,13 @@
247
247
  }
248
248
  return current;
249
249
  }
250
- function findSchemaDefinition($ref, rootSchema = {}, baseURI = get14(rootSchema, [ID_KEY])) {
250
+ function findSchemaDefinition($ref, rootSchema = {}, baseURI = get16(rootSchema, [ID_KEY])) {
251
251
  const recurseList = [];
252
252
  return findSchemaDefinitionRecursive($ref, rootSchema, recurseList, baseURI);
253
253
  }
254
254
  function getDiscriminatorFieldFromSchema(schema) {
255
255
  let discriminator;
256
- const maybeString = get14(schema, DISCRIMINATOR_PATH);
256
+ const maybeString = get16(schema, DISCRIMINATOR_PATH);
257
257
  if (isString(maybeString)) {
258
258
  discriminator = maybeString;
259
259
  } else if (maybeString !== void 0) {
@@ -324,13 +324,13 @@
324
324
  }
325
325
  function getOptionMatchingSimpleDiscriminator(formData, options, discriminatorField) {
326
326
  if (formData && discriminatorField) {
327
- const value = get14(formData, discriminatorField);
327
+ const value = get16(formData, discriminatorField);
328
328
  if (value === void 0) {
329
329
  return;
330
330
  }
331
331
  for (let i = 0; i < options.length; i++) {
332
332
  const option = options[i];
333
- const discriminator = get14(option, [PROPERTIES_KEY, discriminatorField], {});
333
+ const discriminator = get16(option, [PROPERTIES_KEY, discriminatorField], {});
334
334
  if (discriminator.type === "object" || discriminator.type === "array") {
335
335
  continue;
336
336
  }
@@ -357,8 +357,8 @@
357
357
  for (let i = 0; i < options.length; i++) {
358
358
  const option = options[i];
359
359
  if (discriminatorField && has5(option, [PROPERTIES_KEY, discriminatorField])) {
360
- const value = get14(formData, discriminatorField);
361
- const discriminator = get14(option, [PROPERTIES_KEY, discriminatorField], {});
360
+ const value = get16(formData, discriminatorField);
361
+ const discriminator = get16(option, [PROPERTIES_KEY, discriminatorField], {});
362
362
  if (validator.isValid(discriminator, value, rootSchema)) {
363
363
  return i;
364
364
  }
@@ -638,7 +638,7 @@
638
638
  validator,
639
639
  { [ALL_OF_KEY]: Object.values(matchingProperties) },
640
640
  rootSchema,
641
- get14(formData, [key]),
641
+ get16(formData, [key]),
642
642
  experimental_customMergeAllOf
643
643
  );
644
644
  set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -651,7 +651,7 @@
651
651
  if (REF_KEY in schema.additionalProperties) {
652
652
  additionalProperties = retrieveSchema(
653
653
  validator,
654
- { [REF_KEY]: get14(schema.additionalProperties, [REF_KEY]) },
654
+ { [REF_KEY]: get16(schema.additionalProperties, [REF_KEY]) },
655
655
  rootSchema,
656
656
  formData,
657
657
  experimental_customMergeAllOf
@@ -664,10 +664,10 @@
664
664
  ...schema.additionalProperties
665
665
  };
666
666
  } else {
667
- additionalProperties = { type: guessType(get14(formData, [key])) };
667
+ additionalProperties = { type: guessType(get16(formData, [key])) };
668
668
  }
669
669
  } else {
670
- additionalProperties = { type: guessType(get14(formData, [key])) };
670
+ additionalProperties = { type: guessType(get16(formData, [key])) };
671
671
  }
672
672
  schema.properties[key] = additionalProperties;
673
673
  set(schema.properties, [key, ADDITIONAL_PROPERTY_FLAG], true);
@@ -751,7 +751,7 @@
751
751
  validator,
752
752
  { allOf: [schema2.properties[key], ...Object.values(matchingProperties)] },
753
753
  rootSchema,
754
- get14(rawFormData, [key]),
754
+ get16(rawFormData, [key]),
755
755
  experimental_customMergeAllOf
756
756
  );
757
757
  }
@@ -823,7 +823,7 @@
823
823
  function processDependencies(validator, dependencies, resolvedSchema, rootSchema, expandAllBranches, recurseList, formData, experimental_customMergeAllOf) {
824
824
  let schemas = [resolvedSchema];
825
825
  for (const dependencyKey in dependencies) {
826
- if (!expandAllBranches && get14(formData, [dependencyKey]) === void 0) {
826
+ if (!expandAllBranches && get16(formData, [dependencyKey]) === void 0) {
827
827
  continue;
828
828
  }
829
829
  if (resolvedSchema.properties && !(dependencyKey in resolvedSchema.properties)) {
@@ -954,11 +954,11 @@
954
954
  const xxxOfs = schema[xxx].map(
955
955
  (xxxOf) => retrieveSchema(validator, xxxOf, rootSchema, formData, experimental_customMergeAllOf)
956
956
  );
957
- const data = get14(formData, selectorField);
957
+ const data = get16(formData, selectorField);
958
958
  if (data !== void 0) {
959
959
  return xxxOfs.find((xxx2) => {
960
960
  return isEqual2(
961
- get14(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], get14(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
961
+ get16(xxx2, [PROPERTIES_KEY, selectorField, DEFAULT_KEY], get16(xxx2, [PROPERTIES_KEY, selectorField, CONST_KEY])),
962
962
  data
963
963
  );
964
964
  });
@@ -977,7 +977,7 @@
977
977
  const pathList = Array.isArray(path) ? path : path.split(".");
978
978
  const [part, ...nestedPath] = pathList;
979
979
  if (part && has5(fieldSchema, part)) {
980
- fieldSchema = get14(fieldSchema, part);
980
+ fieldSchema = get16(fieldSchema, part);
981
981
  return getFromSchemaInternal(
982
982
  validator,
983
983
  rootSchema,
@@ -1019,7 +1019,7 @@
1019
1019
  parentField,
1020
1020
  fieldName,
1021
1021
  ONE_OF_KEY,
1022
- get14(formData, subPath),
1022
+ get16(formData, subPath),
1023
1023
  experimental_customMergeAllOf
1024
1024
  );
1025
1025
  } else if (has5(parentField, ANY_OF_KEY)) {
@@ -1029,7 +1029,7 @@
1029
1029
  parentField,
1030
1030
  fieldName,
1031
1031
  ANY_OF_KEY,
1032
- get14(formData, subPath),
1032
+ get16(formData, subPath),
1033
1033
  experimental_customMergeAllOf
1034
1034
  );
1035
1035
  }
@@ -1097,7 +1097,7 @@
1097
1097
  totalScore += reduce(
1098
1098
  schema.properties,
1099
1099
  (score, value, key) => {
1100
- const formValue = get14(formData, key);
1100
+ const formValue = get16(formData, key);
1101
1101
  if (typeof value === "boolean") {
1102
1102
  return score;
1103
1103
  }
@@ -1124,7 +1124,7 @@
1124
1124
  validator,
1125
1125
  rootSchema,
1126
1126
  formValue,
1127
- get14(value, key2),
1127
+ get16(value, key2),
1128
1128
  -1,
1129
1129
  discriminator,
1130
1130
  experimental_customMergeAllOf
@@ -1226,22 +1226,22 @@
1226
1226
  if (isObject(formData)) {
1227
1227
  const acc = Object.assign({}, defaults);
1228
1228
  return Object.keys(formData).reduce((acc2, key) => {
1229
- const keyValue = get14(formData, key);
1229
+ const keyValue = get16(formData, key);
1230
1230
  const keyExistsInDefaults = isObject(defaults) && key in defaults;
1231
1231
  const keyExistsInFormData = key in formData;
1232
- const keyDefault = get14(defaults, key) ?? {};
1232
+ const keyDefault = get16(defaults, key) ?? {};
1233
1233
  const defaultValueIsNestedObject = keyExistsInDefaults && Object.entries(keyDefault).some(([, v]) => isObject(v));
1234
- const keyDefaultIsObject = keyExistsInDefaults && isObject(get14(defaults, key));
1234
+ const keyDefaultIsObject = keyExistsInDefaults && isObject(get16(defaults, key));
1235
1235
  const keyHasFormDataObject = keyExistsInFormData && isObject(keyValue);
1236
1236
  if (keyDefaultIsObject && keyHasFormDataObject && !defaultValueIsNestedObject) {
1237
1237
  acc2[key] = {
1238
- ...get14(defaults, key),
1238
+ ...get16(defaults, key),
1239
1239
  ...keyValue
1240
1240
  };
1241
1241
  return acc2;
1242
1242
  }
1243
1243
  acc2[key] = mergeDefaultsWithFormData(
1244
- get14(defaults, key),
1244
+ get16(defaults, key),
1245
1245
  keyValue,
1246
1246
  mergeExtraArrayDefaults,
1247
1247
  defaultSupercedesUndefined,
@@ -1360,8 +1360,8 @@
1360
1360
  let value;
1361
1361
  let label = title;
1362
1362
  if (selectorField) {
1363
- const innerSchema = get14(aSchema, [PROPERTIES_KEY, selectorField], {});
1364
- value = get14(innerSchema, DEFAULT_KEY, get14(innerSchema, CONST_KEY));
1363
+ const innerSchema = get16(aSchema, [PROPERTIES_KEY, selectorField], {});
1364
+ value = get16(innerSchema, DEFAULT_KEY, get16(innerSchema, CONST_KEY));
1365
1365
  label = label || innerSchema?.title || aSchema.title || String(value);
1366
1366
  } else {
1367
1367
  value = toConstant(aSchema);
@@ -1448,7 +1448,7 @@
1448
1448
  let updatedRecurseList = _recurseList;
1449
1449
  if (schema[CONST_KEY] !== void 0 && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(schema)) {
1450
1450
  defaults = schema[CONST_KEY];
1451
- } else if (isObject(defaults) && isObject(schema.default)) {
1451
+ } else if (isObject(defaults) && isObject(schema.default) && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1452
1452
  defaults = mergeObjects(defaults, schema.default);
1453
1453
  } else if (DEFAULT_KEY in schema && !schema[ANY_OF_KEY] && !schema[ONE_OF_KEY] && !schema[REF_KEY]) {
1454
1454
  defaults = schema.default;
@@ -1458,7 +1458,8 @@
1458
1458
  updatedRecurseList = _recurseList.concat(refName);
1459
1459
  schemaToCompute = findSchemaDefinition(refName, rootSchema);
1460
1460
  }
1461
- if (schemaToCompute && !defaults) {
1461
+ const hasNoExistingData = rawFormData === void 0 || isObject(rawFormData) && isEmpty4(rawFormData);
1462
+ if (schemaToCompute && !defaults && hasNoExistingData) {
1462
1463
  defaults = schema.default;
1463
1464
  }
1464
1465
  if (shouldMergeDefaultsIntoFormData && schemaToCompute && !isObject(rawFormData)) {
@@ -1602,11 +1603,12 @@
1602
1603
  {
1603
1604
  const formData = isObject(rawFormData) ? rawFormData : {};
1604
1605
  const schema = rawSchema;
1605
- const retrievedSchema = experimental_defaultFormStateBehavior?.allOf === "populateDefaults" && ALL_OF_KEY in schema ? retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf) : schema;
1606
+ const shouldRetrieveSchema = experimental_defaultFormStateBehavior?.allOf === "populateDefaults" && ALL_OF_KEY in schema || experimental_defaultFormStateBehavior?.emptyObjectFields !== "skipEmptyDefaults" && IF_KEY in schema;
1607
+ const retrievedSchema = shouldRetrieveSchema ? retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf) : schema;
1606
1608
  const parentConst = retrievedSchema[CONST_KEY];
1607
1609
  const objectDefaults = Object.keys(retrievedSchema.properties || {}).reduce(
1608
1610
  (acc, key) => {
1609
- const propertySchema = get14(retrievedSchema, [PROPERTIES_KEY, key], {});
1611
+ const propertySchema = get16(retrievedSchema, [PROPERTIES_KEY, key], {});
1610
1612
  const hasParentConst = isObject(parentConst) && parentConst[key] !== void 0;
1611
1613
  const hasConst = (isObject(propertySchema) && CONST_KEY in propertySchema || hasParentConst) && experimental_defaultFormStateBehavior?.constAsDefaults !== "never" && !constIsAjvDataReference(propertySchema);
1612
1614
  const computedDefault = computeDefaults(validator, propertySchema, {
@@ -1615,8 +1617,8 @@
1615
1617
  experimental_defaultFormStateBehavior,
1616
1618
  experimental_customMergeAllOf,
1617
1619
  includeUndefinedValues: includeUndefinedValues === true,
1618
- parentDefaults: get14(defaults, [key]),
1619
- rawFormData: get14(formData, [key]),
1620
+ parentDefaults: get16(defaults, [key]),
1621
+ rawFormData: get16(formData, [key]),
1620
1622
  required: retrievedSchema.required?.includes(key),
1621
1623
  shouldMergeDefaultsIntoFormData,
1622
1624
  initialDefaultsGenerated
@@ -1654,8 +1656,8 @@
1654
1656
  experimental_defaultFormStateBehavior,
1655
1657
  experimental_customMergeAllOf,
1656
1658
  includeUndefinedValues: includeUndefinedValues === true,
1657
- parentDefaults: get14(defaults, [key]),
1658
- rawFormData: get14(formData, [key]),
1659
+ parentDefaults: get16(defaults, [key]),
1660
+ rawFormData: get16(formData, [key]),
1659
1661
  required: retrievedSchema.required?.includes(key),
1660
1662
  shouldMergeDefaultsIntoFormData,
1661
1663
  initialDefaultsGenerated
@@ -1696,12 +1698,14 @@
1696
1698
  if (Array.isArray(defaults)) {
1697
1699
  defaults = defaults.map((item, idx) => {
1698
1700
  const schemaItem = getInnerSchemaForArrayItem(schema, 2 /* Fallback */, idx);
1701
+ const itemFormData = Array.isArray(rawFormData) ? rawFormData[idx] : void 0;
1699
1702
  return computeDefaults(validator, schemaItem, {
1700
1703
  rootSchema,
1701
1704
  _recurseList,
1702
1705
  experimental_defaultFormStateBehavior,
1703
1706
  experimental_customMergeAllOf,
1704
1707
  parentDefaults: item,
1708
+ rawFormData: itemFormData,
1705
1709
  required,
1706
1710
  shouldMergeDefaultsIntoFormData,
1707
1711
  initialDefaultsGenerated
@@ -1720,7 +1724,7 @@
1720
1724
  experimental_defaultFormStateBehavior,
1721
1725
  experimental_customMergeAllOf,
1722
1726
  rawFormData: item,
1723
- parentDefaults: get14(defaults, [idx]),
1727
+ parentDefaults: get16(defaults, [idx]),
1724
1728
  required,
1725
1729
  shouldMergeDefaultsIntoFormData,
1726
1730
  initialDefaultsGenerated
@@ -1846,7 +1850,7 @@
1846
1850
  let displayLabel = Boolean(label);
1847
1851
  if (displayLabel) {
1848
1852
  const schemaType = getSchemaType(schema);
1849
- const addedByAdditionalProperty = get14(schema, ADDITIONAL_PROPERTY_FLAG, false);
1853
+ const addedByAdditionalProperty = get16(schema, ADDITIONAL_PROPERTY_FLAG, false);
1850
1854
  if (schemaType === "array") {
1851
1855
  displayLabel = addedByAdditionalProperty || isMultiSelect(validator, schema, rootSchema, experimental_customMergeAllOf) || isFilesArray(validator, schema, uiSchema, rootSchema, experimental_customMergeAllOf) || isCustomWidget(uiSchema);
1852
1856
  }
@@ -1862,25 +1866,183 @@
1862
1866
  }
1863
1867
  return displayLabel;
1864
1868
  }
1869
+ function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1870
+ if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema || IF_KEY in schema) {
1871
+ const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
1872
+ const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
1873
+ if (sameSchemaIndex === -1) {
1874
+ return toPathSchemaInternal(
1875
+ validator,
1876
+ _schema,
1877
+ name,
1878
+ rootSchema,
1879
+ formData,
1880
+ _recurseList.concat(_schema),
1881
+ experimental_customMergeAllOf
1882
+ );
1883
+ }
1884
+ }
1885
+ let pathSchema = {
1886
+ [NAME_KEY]: name.replace(/^\./, "")
1887
+ };
1888
+ if (ONE_OF_KEY in schema || ANY_OF_KEY in schema) {
1889
+ const xxxOf = ONE_OF_KEY in schema ? schema.oneOf : schema.anyOf;
1890
+ const discriminator = getDiscriminatorFieldFromSchema(schema);
1891
+ const index = getClosestMatchingOption(
1892
+ validator,
1893
+ rootSchema,
1894
+ formData,
1895
+ xxxOf,
1896
+ 0,
1897
+ discriminator,
1898
+ experimental_customMergeAllOf
1899
+ );
1900
+ const _schema = xxxOf[index];
1901
+ pathSchema = {
1902
+ ...pathSchema,
1903
+ ...toPathSchemaInternal(
1904
+ validator,
1905
+ _schema,
1906
+ name,
1907
+ rootSchema,
1908
+ formData,
1909
+ _recurseList,
1910
+ experimental_customMergeAllOf
1911
+ )
1912
+ };
1913
+ }
1914
+ if (ADDITIONAL_PROPERTIES_KEY in schema && schema[ADDITIONAL_PROPERTIES_KEY] !== false) {
1915
+ set(pathSchema, RJSF_ADDITIONAL_PROPERTIES_FLAG, true);
1916
+ }
1917
+ if (ITEMS_KEY in schema && Array.isArray(formData)) {
1918
+ const { items: schemaItems, additionalItems: schemaAdditionalItems } = schema;
1919
+ if (Array.isArray(schemaItems)) {
1920
+ formData.forEach((element, i) => {
1921
+ if (schemaItems[i]) {
1922
+ pathSchema[i] = toPathSchemaInternal(
1923
+ validator,
1924
+ schemaItems[i],
1925
+ `${name}.${i}`,
1926
+ rootSchema,
1927
+ element,
1928
+ _recurseList,
1929
+ experimental_customMergeAllOf
1930
+ );
1931
+ } else if (schemaAdditionalItems) {
1932
+ pathSchema[i] = toPathSchemaInternal(
1933
+ validator,
1934
+ schemaAdditionalItems,
1935
+ `${name}.${i}`,
1936
+ rootSchema,
1937
+ element,
1938
+ _recurseList,
1939
+ experimental_customMergeAllOf
1940
+ );
1941
+ } else {
1942
+ console.warn(`Unable to generate path schema for "${name}.${i}". No schema defined for it`);
1943
+ }
1944
+ });
1945
+ } else {
1946
+ formData.forEach((element, i) => {
1947
+ pathSchema[i] = toPathSchemaInternal(
1948
+ validator,
1949
+ schemaItems,
1950
+ `${name}.${i}`,
1951
+ rootSchema,
1952
+ element,
1953
+ _recurseList,
1954
+ experimental_customMergeAllOf
1955
+ );
1956
+ });
1957
+ }
1958
+ } else if (PROPERTIES_KEY in schema) {
1959
+ for (const property in schema.properties) {
1960
+ const field = get16(schema, [PROPERTIES_KEY, property], {});
1961
+ pathSchema[property] = toPathSchemaInternal(
1962
+ validator,
1963
+ field,
1964
+ `${name}.${property}`,
1965
+ rootSchema,
1966
+ // It's possible that formData is not an object -- this can happen if an
1967
+ // array item has just been added, but not populated with data yet
1968
+ get16(formData, [property]),
1969
+ _recurseList,
1970
+ experimental_customMergeAllOf
1971
+ );
1972
+ }
1973
+ }
1974
+ return pathSchema;
1975
+ }
1976
+ function toPathSchema(validator, schema, name = "", rootSchema, formData, experimental_customMergeAllOf) {
1977
+ return toPathSchemaInternal(validator, schema, name, rootSchema, formData, void 0, experimental_customMergeAllOf);
1978
+ }
1979
+
1980
+ // src/schema/omitExtraData.ts
1981
+ function getUsedFormData(formData, fields) {
1982
+ if (fields.length === 0 && typeof formData !== "object") {
1983
+ return formData;
1984
+ }
1985
+ const data = pick(formData, fields);
1986
+ if (Array.isArray(formData)) {
1987
+ return Object.keys(data).map((key) => data[key]);
1988
+ }
1989
+ return data;
1990
+ }
1991
+ function getFieldNames(pathSchema, formData) {
1992
+ const formValueHasData = (value, isLeaf) => typeof value !== "object" || isEmpty4(value) || isLeaf && !isEmpty4(value);
1993
+ const getAllPaths = (_obj, acc = [], paths = [[]]) => {
1994
+ const objKeys = Object.keys(_obj);
1995
+ objKeys.forEach((key) => {
1996
+ const data = _obj[key];
1997
+ if (typeof data === "object") {
1998
+ const newPaths = paths.map((path) => [...path, key]);
1999
+ if (data[RJSF_ADDITIONAL_PROPERTIES_FLAG] && data[NAME_KEY] !== "") {
2000
+ acc.push(data[NAME_KEY]);
2001
+ } else {
2002
+ getAllPaths(data, acc, newPaths);
2003
+ }
2004
+ } else if (key === NAME_KEY && data !== "") {
2005
+ paths.forEach((path) => {
2006
+ const formValue = get16(formData, path);
2007
+ const isLeaf = objKeys.length === 1;
2008
+ if (formValueHasData(formValue, isLeaf) || Array.isArray(formValue) && formValue.every((val) => formValueHasData(val, isLeaf))) {
2009
+ acc.push(path);
2010
+ }
2011
+ });
2012
+ }
2013
+ });
2014
+ return acc;
2015
+ };
2016
+ return getAllPaths(pathSchema);
2017
+ }
2018
+ function omitExtraData(validator, schema, rootSchema = {}, formData) {
2019
+ const retrievedSchema = retrieveSchema(validator, schema, rootSchema, formData);
2020
+ const pathSchema = toPathSchema(validator, retrievedSchema, "", rootSchema, formData);
2021
+ const fieldNames = getFieldNames(pathSchema, formData);
2022
+ const lodashFieldNames = fieldNames.map(
2023
+ (fieldPaths) => Array.isArray(fieldPaths) ? fieldPaths.join(".") : fieldPaths
2024
+ );
2025
+ return getUsedFormData(formData, lodashFieldNames);
2026
+ }
1865
2027
  var NO_VALUE = Symbol("no Value");
1866
2028
  function sanitizeDataForNewSchema(validator, rootSchema, newSchema, oldSchema, data = {}, experimental_customMergeAllOf) {
1867
2029
  let newFormData;
1868
2030
  if (has5(newSchema, PROPERTIES_KEY)) {
1869
2031
  const removeOldSchemaData = {};
1870
2032
  if (has5(oldSchema, PROPERTIES_KEY)) {
1871
- const properties = get14(oldSchema, PROPERTIES_KEY, {});
2033
+ const properties = get16(oldSchema, PROPERTIES_KEY, {});
1872
2034
  Object.keys(properties).forEach((key) => {
1873
2035
  if (has5(data, key)) {
1874
2036
  removeOldSchemaData[key] = void 0;
1875
2037
  }
1876
2038
  });
1877
2039
  }
1878
- const keys2 = Object.keys(get14(newSchema, PROPERTIES_KEY, {}));
2040
+ const keys2 = Object.keys(get16(newSchema, PROPERTIES_KEY, {}));
1879
2041
  const nestedData = {};
1880
2042
  keys2.forEach((key) => {
1881
- const formValue = get14(data, key);
1882
- let oldKeyedSchema = get14(oldSchema, [PROPERTIES_KEY, key], {});
1883
- let newKeyedSchema = get14(newSchema, [PROPERTIES_KEY, key], {});
2043
+ const formValue = get16(data, key);
2044
+ let oldKeyedSchema = get16(oldSchema, [PROPERTIES_KEY, key], {});
2045
+ let newKeyedSchema = get16(newSchema, [PROPERTIES_KEY, key], {});
1884
2046
  if (has5(oldKeyedSchema, REF_KEY)) {
1885
2047
  oldKeyedSchema = retrieveSchema(
1886
2048
  validator,
@@ -1899,8 +2061,8 @@
1899
2061
  experimental_customMergeAllOf
1900
2062
  );
1901
2063
  }
1902
- const oldSchemaTypeForKey = get14(oldKeyedSchema, "type");
1903
- const newSchemaTypeForKey = get14(newKeyedSchema, "type");
2064
+ const oldSchemaTypeForKey = get16(oldKeyedSchema, "type");
2065
+ const newSchemaTypeForKey = get16(newKeyedSchema, "type");
1904
2066
  if (!oldSchemaTypeForKey || oldSchemaTypeForKey === newSchemaTypeForKey) {
1905
2067
  if (has5(removeOldSchemaData, key)) {
1906
2068
  delete removeOldSchemaData[key];
@@ -1918,17 +2080,17 @@
1918
2080
  nestedData[key] = itemData;
1919
2081
  }
1920
2082
  } else {
1921
- const newOptionDefault = get14(newKeyedSchema, "default", NO_VALUE);
1922
- const oldOptionDefault = get14(oldKeyedSchema, "default", NO_VALUE);
2083
+ const newOptionDefault = get16(newKeyedSchema, "default", NO_VALUE);
2084
+ const oldOptionDefault = get16(oldKeyedSchema, "default", NO_VALUE);
1923
2085
  if (newOptionDefault !== NO_VALUE && newOptionDefault !== formValue) {
1924
2086
  if (oldOptionDefault === formValue) {
1925
2087
  removeOldSchemaData[key] = newOptionDefault;
1926
- } else if (get14(newKeyedSchema, "readOnly") === true) {
2088
+ } else if (get16(newKeyedSchema, "readOnly") === true) {
1927
2089
  removeOldSchemaData[key] = void 0;
1928
2090
  }
1929
2091
  }
1930
- const newOptionConst = get14(newKeyedSchema, "const", NO_VALUE);
1931
- const oldOptionConst = get14(oldKeyedSchema, "const", NO_VALUE);
2092
+ const newOptionConst = get16(newKeyedSchema, "const", NO_VALUE);
2093
+ const oldOptionConst = get16(oldKeyedSchema, "const", NO_VALUE);
1932
2094
  if (newOptionConst !== NO_VALUE && newOptionConst !== formValue) {
1933
2095
  removeOldSchemaData[key] = oldOptionConst === formValue ? newOptionConst : void 0;
1934
2096
  }
@@ -1940,9 +2102,9 @@
1940
2102
  ...removeOldSchemaData,
1941
2103
  ...nestedData
1942
2104
  };
1943
- } else if (get14(oldSchema, "type") === "array" && get14(newSchema, "type") === "array" && Array.isArray(data)) {
1944
- let oldSchemaItems = get14(oldSchema, "items");
1945
- let newSchemaItems = get14(newSchema, "items");
2105
+ } else if (get16(oldSchema, "type") === "array" && get16(newSchema, "type") === "array" && Array.isArray(data)) {
2106
+ let oldSchemaItems = get16(oldSchema, "items");
2107
+ let newSchemaItems = get16(newSchema, "items");
1946
2108
  if (typeof oldSchemaItems === "object" && typeof newSchemaItems === "object" && !Array.isArray(oldSchemaItems) && !Array.isArray(newSchemaItems)) {
1947
2109
  if (has5(oldSchemaItems, REF_KEY)) {
1948
2110
  oldSchemaItems = retrieveSchema(
@@ -1962,10 +2124,10 @@
1962
2124
  experimental_customMergeAllOf
1963
2125
  );
1964
2126
  }
1965
- const oldSchemaType = get14(oldSchemaItems, "type");
1966
- const newSchemaType = get14(newSchemaItems, "type");
2127
+ const oldSchemaType = get16(oldSchemaItems, "type");
2128
+ const newSchemaType = get16(newSchemaItems, "type");
1967
2129
  if (!oldSchemaType || oldSchemaType === newSchemaType) {
1968
- const maxItems = get14(newSchema, "maxItems", -1);
2130
+ const maxItems = get16(newSchema, "maxItems", -1);
1969
2131
  if (newSchemaType === "object") {
1970
2132
  newFormData = data.reduce((newValue, aValue) => {
1971
2133
  const itemValue = sanitizeDataForNewSchema(
@@ -1991,116 +2153,6 @@
1991
2153
  }
1992
2154
  return newFormData;
1993
2155
  }
1994
- function toPathSchemaInternal(validator, schema, name, rootSchema, formData, _recurseList = [], experimental_customMergeAllOf) {
1995
- if (REF_KEY in schema || DEPENDENCIES_KEY in schema || ALL_OF_KEY in schema) {
1996
- const _schema = retrieveSchema(validator, schema, rootSchema, formData, experimental_customMergeAllOf);
1997
- const sameSchemaIndex = _recurseList.findIndex((item) => deepEquals(item, _schema));
1998
- if (sameSchemaIndex === -1) {
1999
- return toPathSchemaInternal(
2000
- validator,
2001
- _schema,
2002
- name,
2003
- rootSchema,
2004
- formData,
2005
- _recurseList.concat(_schema),
2006
- experimental_customMergeAllOf
2007
- );
2008
- }
2009
- }
2010
- let pathSchema = {
2011
- [NAME_KEY]: name.replace(/^\./, "")
2012
- };
2013
- if (ONE_OF_KEY in schema || ANY_OF_KEY in schema) {
2014
- const xxxOf = ONE_OF_KEY in schema ? schema.oneOf : schema.anyOf;
2015
- const discriminator = getDiscriminatorFieldFromSchema(schema);
2016
- const index = getClosestMatchingOption(
2017
- validator,
2018
- rootSchema,
2019
- formData,
2020
- xxxOf,
2021
- 0,
2022
- discriminator,
2023
- experimental_customMergeAllOf
2024
- );
2025
- const _schema = xxxOf[index];
2026
- pathSchema = {
2027
- ...pathSchema,
2028
- ...toPathSchemaInternal(
2029
- validator,
2030
- _schema,
2031
- name,
2032
- rootSchema,
2033
- formData,
2034
- _recurseList,
2035
- experimental_customMergeAllOf
2036
- )
2037
- };
2038
- }
2039
- if (ADDITIONAL_PROPERTIES_KEY in schema && schema[ADDITIONAL_PROPERTIES_KEY] !== false) {
2040
- set(pathSchema, RJSF_ADDITIONAL_PROPERTIES_FLAG, true);
2041
- }
2042
- if (ITEMS_KEY in schema && Array.isArray(formData)) {
2043
- const { items: schemaItems, additionalItems: schemaAdditionalItems } = schema;
2044
- if (Array.isArray(schemaItems)) {
2045
- formData.forEach((element, i) => {
2046
- if (schemaItems[i]) {
2047
- pathSchema[i] = toPathSchemaInternal(
2048
- validator,
2049
- schemaItems[i],
2050
- `${name}.${i}`,
2051
- rootSchema,
2052
- element,
2053
- _recurseList,
2054
- experimental_customMergeAllOf
2055
- );
2056
- } else if (schemaAdditionalItems) {
2057
- pathSchema[i] = toPathSchemaInternal(
2058
- validator,
2059
- schemaAdditionalItems,
2060
- `${name}.${i}`,
2061
- rootSchema,
2062
- element,
2063
- _recurseList,
2064
- experimental_customMergeAllOf
2065
- );
2066
- } else {
2067
- console.warn(`Unable to generate path schema for "${name}.${i}". No schema defined for it`);
2068
- }
2069
- });
2070
- } else {
2071
- formData.forEach((element, i) => {
2072
- pathSchema[i] = toPathSchemaInternal(
2073
- validator,
2074
- schemaItems,
2075
- `${name}.${i}`,
2076
- rootSchema,
2077
- element,
2078
- _recurseList,
2079
- experimental_customMergeAllOf
2080
- );
2081
- });
2082
- }
2083
- } else if (PROPERTIES_KEY in schema) {
2084
- for (const property in schema.properties) {
2085
- const field = get14(schema, [PROPERTIES_KEY, property], {});
2086
- pathSchema[property] = toPathSchemaInternal(
2087
- validator,
2088
- field,
2089
- `${name}.${property}`,
2090
- rootSchema,
2091
- // It's possible that formData is not an object -- this can happen if an
2092
- // array item has just been added, but not populated with data yet
2093
- get14(formData, [property]),
2094
- _recurseList,
2095
- experimental_customMergeAllOf
2096
- );
2097
- }
2098
- }
2099
- return pathSchema;
2100
- }
2101
- function toPathSchema(validator, schema, name = "", rootSchema, formData, experimental_customMergeAllOf) {
2102
- return toPathSchemaInternal(validator, schema, name, rootSchema, formData, void 0, experimental_customMergeAllOf);
2103
- }
2104
2156
  var SchemaUtils = class {
2105
2157
  /** Constructs the `SchemaUtils` instance with the given `validator` and `rootSchema` stored as instance variables
2106
2158
  *
@@ -2111,7 +2163,7 @@
2111
2163
  */
2112
2164
  constructor(validator, rootSchema, experimental_defaultFormStateBehavior, experimental_customMergeAllOf) {
2113
2165
  if (rootSchema && rootSchema[SCHEMA_KEY] === JSON_SCHEMA_DRAFT_2020_12) {
2114
- this.rootSchema = makeAllReferencesAbsolute(rootSchema, get14(rootSchema, ID_KEY, "#"));
2166
+ this.rootSchema = makeAllReferencesAbsolute(rootSchema, get16(rootSchema, ID_KEY, "#"));
2115
2167
  } else {
2116
2168
  this.rootSchema = rootSchema;
2117
2169
  }
@@ -2303,6 +2355,18 @@
2303
2355
  isSelect(schema) {
2304
2356
  return isSelect(this.validator, schema, this.rootSchema, this.experimental_customMergeAllOf);
2305
2357
  }
2358
+ /**
2359
+ * The function takes a `schema` and `formData` and returns a copy of the formData with any fields not defined in the schema removed.
2360
+ * This is useful for ensuring that only data that is relevant to the schema is preserved. Objects with `additionalProperties`
2361
+ * keyword set to `true` will not have their extra fields removed.
2362
+ *
2363
+ * @param schema - The schema to use for filtering the `formData`
2364
+ * @param [formData] - The formData to filter
2365
+ * @returns The new form data, with any fields not defined in the schema removed
2366
+ */
2367
+ omitExtraData(schema, formData) {
2368
+ return omitExtraData(this.validator, schema, this.rootSchema, formData);
2369
+ }
2306
2370
  /** Retrieves an expanded schema that has had all of its conditions, additional properties, references and
2307
2371
  * dependencies resolved and merged into the `schema` given a `rawFormData` that is used to do the potentially
2308
2372
  * recursive resolution.
@@ -2545,7 +2609,7 @@
2545
2609
  */
2546
2610
  getOrCreateErrorBlock(pathOfError) {
2547
2611
  const hasPath = Array.isArray(pathOfError) && pathOfError.length > 0 || typeof pathOfError === "string";
2548
- let errorBlock = hasPath ? get14(this.errorSchema, pathOfError) : this.errorSchema;
2612
+ let errorBlock = hasPath ? get16(this.errorSchema, pathOfError) : this.errorSchema;
2549
2613
  if (!errorBlock && pathOfError) {
2550
2614
  errorBlock = {};
2551
2615
  setWith(this.errorSchema, pathOfError, errorBlock, Object);
@@ -2571,7 +2635,7 @@
2571
2635
  */
2572
2636
  addErrors(errorOrList, pathOfError) {
2573
2637
  const errorBlock = this.getOrCreateErrorBlock(pathOfError);
2574
- let errorsList = get14(errorBlock, ERRORS_KEY);
2638
+ let errorsList = get16(errorBlock, ERRORS_KEY);
2575
2639
  if (!Array.isArray(errorsList)) {
2576
2640
  errorsList = [];
2577
2641
  errorBlock[ERRORS_KEY] = errorsList;
@@ -2621,7 +2685,7 @@
2621
2685
  } else if (!aIsPlainObject && bIsPlainObject) {
2622
2686
  return keys(b);
2623
2687
  } else {
2624
- const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get14(b, key))));
2688
+ const unequalFields = keys(pickBy(a, (value, key) => !deepEquals(value, get16(b, key))));
2625
2689
  const diffFields = difference(keys(b), keys(a));
2626
2690
  return [...unequalFields, ...diffFields];
2627
2691
  }
@@ -2734,7 +2798,7 @@
2734
2798
  );
2735
2799
  }
2736
2800
  function getTestIds() {
2737
- if (typeof process === "undefined" || get14(process, "env.NODE_ENV") !== "test") {
2801
+ if (typeof process === "undefined" || get16(process, "env.NODE_ENV") !== "test") {
2738
2802
  return {};
2739
2803
  }
2740
2804
  const ids = /* @__PURE__ */ new Map();
@@ -2803,7 +2867,7 @@
2803
2867
  }
2804
2868
  };
2805
2869
  function mergeWidgetOptions(AWidget) {
2806
- let MergedWidget = get14(AWidget, "MergedWidget");
2870
+ let MergedWidget = get16(AWidget, "MergedWidget");
2807
2871
  if (!MergedWidget) {
2808
2872
  const defaultOptions = AWidget.defaultProps && AWidget.defaultProps.options || {};
2809
2873
  MergedWidget = ({ options, ...props }) => {
@@ -2933,7 +2997,7 @@
2933
2997
  if (has5(regOrFc, FORM_CONTEXT_NAME)) {
2934
2998
  lookupPath.unshift(FORM_CONTEXT_NAME);
2935
2999
  }
2936
- return get14(regOrFc, [...lookupPath, toLookup], fallback);
3000
+ return get16(regOrFc, [...lookupPath, toLookup], fallback);
2937
3001
  }
2938
3002
 
2939
3003
  // src/orderProperties.ts
@@ -3423,6 +3487,7 @@
3423
3487
  TranslatableString2["OptionalObjectEmptyMsg"] = "No data for optional field";
3424
3488
  TranslatableString2["Type"] = "Type";
3425
3489
  TranslatableString2["Value"] = "Value";
3490
+ TranslatableString2["ClearButton"] = "clear input";
3426
3491
  TranslatableString2["UnknownFieldType"] = "Unknown field type %1";
3427
3492
  TranslatableString2["OptionPrefix"] = "Option %1";
3428
3493
  TranslatableString2["TitleOptionPrefix"] = "%1 option %2";
@@ -3460,7 +3525,7 @@
3460
3525
  * @param hash - The hash value at which to map the schema
3461
3526
  */
3462
3527
  addSchema(schema, hash) {
3463
- const key = get14(schema, ID_KEY, hash);
3528
+ const key = get16(schema, ID_KEY, hash);
3464
3529
  const identifiedSchema = { ...schema, [ID_KEY]: key };
3465
3530
  const existing = this.schemaMap[key];
3466
3531
  if (!existing) {
@@ -3620,6 +3685,7 @@
3620
3685
  exports.getDefaultFormState = getDefaultFormState;
3621
3686
  exports.getDiscriminatorFieldFromSchema = getDiscriminatorFieldFromSchema;
3622
3687
  exports.getDisplayLabel = getDisplayLabel;
3688
+ exports.getFieldNames = getFieldNames;
3623
3689
  exports.getFirstMatchingOption = getFirstMatchingOption;
3624
3690
  exports.getFromSchema = getFromSchema;
3625
3691
  exports.getInputProps = getInputProps;
@@ -3629,6 +3695,7 @@
3629
3695
  exports.getTemplate = getTemplate;
3630
3696
  exports.getTestIds = getTestIds;
3631
3697
  exports.getUiOptions = getUiOptions;
3698
+ exports.getUsedFormData = getUsedFormData;
3632
3699
  exports.getWidget = getWidget;
3633
3700
  exports.guessType = guessType;
3634
3701
  exports.hasWidget = hasWidget;
@@ -3651,6 +3718,7 @@
3651
3718
  exports.mergeDefaultsWithFormData = mergeDefaultsWithFormData;
3652
3719
  exports.mergeObjects = mergeObjects;
3653
3720
  exports.mergeSchemas = mergeSchemas;
3721
+ exports.omitExtraData = omitExtraData;
3654
3722
  exports.optionId = optionId;
3655
3723
  exports.optionalControlsId = optionalControlsId;
3656
3724
  exports.optionsList = optionsList;