@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.
- package/dist/index.js +217 -130
- package/dist/index.js.map +4 -4
- package/dist/utils.esm.js +217 -130
- package/dist/utils.esm.js.map +4 -4
- package/dist/utils.umd.js +209 -122
- package/lib/constIsAjvDataReference.d.ts +9 -0
- package/lib/constIsAjvDataReference.js +15 -0
- package/lib/constIsAjvDataReference.js.map +1 -0
- package/lib/enumOptionsDeselectValue.js +3 -3
- package/lib/enumOptionsDeselectValue.js.map +1 -1
- package/lib/enumOptionsIsSelected.js +3 -3
- package/lib/enumOptionsIsSelected.js.map +1 -1
- package/lib/getChangedFields.d.ts +17 -0
- package/lib/getChangedFields.js +42 -0
- package/lib/getChangedFields.js.map +1 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/mergeDefaultsWithFormData.d.ts +5 -1
- package/lib/mergeDefaultsWithFormData.js +31 -8
- package/lib/mergeDefaultsWithFormData.js.map +1 -1
- package/lib/parser/ParserValidator.js +3 -3
- package/lib/parser/ParserValidator.js.map +1 -1
- package/lib/parser/schemaParser.js +4 -4
- package/lib/parser/schemaParser.js.map +1 -1
- package/lib/schema/getDefaultFormState.d.ts +17 -2
- package/lib/schema/getDefaultFormState.js +85 -31
- package/lib/schema/getDefaultFormState.js.map +1 -1
- package/lib/schema/retrieveSchema.js +7 -4
- package/lib/schema/retrieveSchema.js.map +1 -1
- package/lib/schema/toIdSchema.js +2 -2
- package/lib/schema/toIdSchema.js.map +1 -1
- package/lib/schema/toPathSchema.js +3 -3
- package/lib/schema/toPathSchema.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/constIsAjvDataReference.ts +17 -0
- package/src/enumOptionsDeselectValue.ts +3 -4
- package/src/enumOptionsIsSelected.ts +3 -4
- package/src/getChangedFields.ts +40 -0
- package/src/index.ts +2 -0
- package/src/mergeDefaultsWithFormData.ts +42 -10
- package/src/parser/ParserValidator.ts +3 -3
- package/src/parser/schemaParser.ts +4 -4
- package/src/schema/getDefaultFormState.ts +126 -31
- package/src/schema/retrieveSchema.ts +8 -5
- package/src/schema/toIdSchema.ts +2 -2
- 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/
|
|
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/
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@rjsf/utils"] = {}, global.
|
|
5
|
-
})(this, (function (exports,
|
|
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 (
|
|
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) => ({
|
|
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
|
|
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
|
|
921
|
-
|
|
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
|
-
|
|
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 <
|
|
932
|
-
mapped.push(...
|
|
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
|
-
|
|
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 ===
|
|
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)
|
|
1040
|
-
|
|
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
|
|
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 = {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1318
|
+
const keys2 = /* @__PURE__ */ new Set();
|
|
1204
1319
|
if (isObject(defaults)) {
|
|
1205
|
-
Object.keys(defaults).filter((key) => !retrievedSchema.properties || !retrievedSchema.properties[key]).forEach((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
|
-
|
|
1324
|
+
keys2.add(key);
|
|
1210
1325
|
formDataRequired.push(key);
|
|
1211
1326
|
});
|
|
1212
|
-
|
|
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
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
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
|
|
1471
|
+
return defaults;
|
|
1349
1472
|
}
|
|
1350
1473
|
|
|
1351
1474
|
// src/isCustomWidget.ts
|
|
@@ -1421,9 +1544,9 @@
|
|
|
1421
1544
|
}
|
|
1422
1545
|
});
|
|
1423
1546
|
}
|
|
1424
|
-
const
|
|
1547
|
+
const keys2 = Object.keys(get8(newSchema, PROPERTIES_KEY, {}));
|
|
1425
1548
|
const nestedData = {};
|
|
1426
|
-
|
|
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) =>
|
|
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) =>
|
|
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) => !
|
|
2185
|
+
return selected.filter((v) => !deepEquals(v, value));
|
|
2063
2186
|
}
|
|
2064
|
-
return
|
|
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) =>
|
|
2193
|
+
return selected.some((sel) => deepEquals(sel, value));
|
|
2069
2194
|
}
|
|
2070
|
-
return
|
|
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 (
|
|
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 (
|
|
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 (!
|
|
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 (!
|
|
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) =>
|
|
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"}
|