Files
payload/src/fields/mergeBaseFields.ts
2022-08-06 13:12:47 -04:00

41 lines
1.1 KiB
TypeScript

import merge from 'deepmerge';
import { Field, fieldAffectsData, fieldHasSubFields, FieldWithSubFields } from './config/types';
const mergeBaseFields = (fields: Field[], baseFields: Field[]): Field[] => {
const mergedFields = [...fields || []];
baseFields.forEach((baseField) => {
let matchedIndex = null;
if (fieldAffectsData(baseField)) {
const match = mergedFields.find((field, i) => {
if (fieldAffectsData(field) && field.name === baseField.name) {
matchedIndex = i;
return true;
}
return false;
});
if (match) {
const matchCopy: Field = { ...match };
mergedFields.splice(matchedIndex, 1);
const mergedField = merge<Field>(baseField, matchCopy);
if (fieldHasSubFields(baseField) && fieldHasSubFields(matchCopy)) {
(mergedField as FieldWithSubFields).fields = mergeBaseFields(matchCopy.fields, baseField.fields);
}
mergedFields.push(mergedField);
} else {
mergedFields.push(baseField);
}
}
});
return mergedFields;
};
export default mergeBaseFields;