diff --git a/src/collections/config/sanitize.ts b/src/collections/config/sanitize.ts index c2f0f3e4b9..4fed5c9065 100644 --- a/src/collections/config/sanitize.ts +++ b/src/collections/config/sanitize.ts @@ -44,12 +44,7 @@ const sanitizeCollection = (config: Config, collection: CollectionConfig): Sanit if (sanitized.versions.drafts.autosave === true) sanitized.versions.drafts.autosave = {}; - const versionFields = mergeBaseFields(sanitized.fields, baseVersionFields); - - sanitized.fields = [ - ...versionFields, - ...sanitized.fields, - ]; + sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields); } sanitized.versions = merge(versionCollectionDefaults, sanitized.versions); @@ -62,17 +57,12 @@ const sanitizeCollection = (config: Config, collection: CollectionConfig): Sanit sanitized.upload.staticURL = sanitized.upload.staticURL || `/${sanitized.slug}`; sanitized.admin.useAsTitle = (sanitized.admin.useAsTitle && sanitized.admin.useAsTitle !== 'id') ? sanitized.admin.useAsTitle : 'filename'; - let uploadFields = getBaseUploadFields({ + const uploadFields = getBaseUploadFields({ config, collection: sanitized, }); - uploadFields = mergeBaseFields(sanitized.fields, uploadFields); - - sanitized.fields = [ - ...uploadFields, - ...sanitized.fields, - ]; + sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields); } if (sanitized.auth) { @@ -103,12 +93,7 @@ const sanitizeCollection = (config: Config, collection: CollectionConfig): Sanit } } - authFields = mergeBaseFields(sanitized.fields, authFields); - - sanitized.fields = [ - ...authFields, - ...sanitized.fields, - ]; + sanitized.fields = mergeBaseFields(sanitized.fields, authFields); } // ///////////////////////////////// diff --git a/src/fields/mergeBaseFields.ts b/src/fields/mergeBaseFields.ts index 3a1fe39efe..ef2a43b210 100644 --- a/src/fields/mergeBaseFields.ts +++ b/src/fields/mergeBaseFields.ts @@ -1,14 +1,15 @@ import merge from 'deepmerge'; +import { Field, fieldAffectsData, fieldHasSubFields, FieldWithSubFields } from './config/types'; -const mergeBaseFields = (fields, baseFields) => { - const mergedFields = []; +const mergeBaseFields = (fields: Field[], baseFields: Field[]): Field[] => { + const mergedFields = [...fields || []]; - if (fields) { - baseFields.forEach((baseField) => { - let matchedIndex = null; + baseFields.forEach((baseField) => { + let matchedIndex = null; - const match = fields.find((field, i) => { - if (field.name === baseField.name) { + if (fieldAffectsData(baseField)) { + const match = mergedFields.find((field, i) => { + if (fieldAffectsData(field) && field.name === baseField.name) { matchedIndex = i; return true; } @@ -17,30 +18,23 @@ const mergeBaseFields = (fields, baseFields) => { }); if (match) { - const matchCopy = { ...match }; - fields.splice(matchedIndex, 1); + const matchCopy: Field = { ...match }; + mergedFields.splice(matchedIndex, 1); - let mergedField = { - ...baseField, - ...matchCopy, - }; + const mergedField = merge(baseField, matchCopy); - if (baseField.fields && matchCopy.fields) { - mergedField.fields = mergeBaseFields(matchCopy.fields, baseField.fields); - return mergedFields.push(mergedField); + if (fieldHasSubFields(baseField) && fieldHasSubFields(matchCopy)) { + (mergedField as FieldWithSubFields).fields = mergeBaseFields(matchCopy.fields, baseField.fields); } - mergedField = merge(mergedField, matchCopy, { arrayMerge: (_, source) => source }); - return mergedFields.push(mergedField); + mergedFields.push(mergedField); + } else { + mergedFields.push(baseField); } + } + }); - return mergedFields.push(baseField); - }); - - return mergedFields; - } - - return baseFields; + return mergedFields; }; export default mergeBaseFields; diff --git a/src/globals/config/sanitize.ts b/src/globals/config/sanitize.ts index 4e3af634a5..bd70787a50 100644 --- a/src/globals/config/sanitize.ts +++ b/src/globals/config/sanitize.ts @@ -44,12 +44,7 @@ const sanitizeGlobals = (collections: CollectionConfig[], globals: GlobalConfig[ if (sanitizedGlobal.versions.drafts.autosave === true) sanitizedGlobal.versions.drafts.autosave = {}; - const versionFields = mergeBaseFields(sanitizedGlobal.fields, baseVersionFields); - - sanitizedGlobal.fields = [ - ...versionFields, - ...sanitizedGlobal.fields, - ]; + sanitizedGlobal.fields = mergeBaseFields(sanitizedGlobal.fields, baseVersionFields); } sanitizedGlobal.versions = merge(versionGlobalDefaults, sanitizedGlobal.versions);