@r1tsu/payload
Version:
130 lines (129 loc) • 5.48 kB
JavaScript
import merge from 'deepmerge';
import baseAccountLockFields from '../../auth/baseFields/accountLock.js';
import baseAPIKeyFields from '../../auth/baseFields/apiKey.js';
import baseAuthFields from '../../auth/baseFields/auth.js';
import baseVerificationFields from '../../auth/baseFields/verification.js';
import TimestampsRequired from '../../errors/TimestampsRequired.js';
import { sanitizeFields } from '../../fields/config/sanitize.js';
import { fieldAffectsData } from '../../fields/config/types.js';
import mergeBaseFields from '../../fields/mergeBaseFields.js';
import { getBaseUploadFields } from '../../uploads/getBaseFields.js';
import { formatLabels } from '../../utilities/formatLabels.js';
import { isPlainObject } from '../../utilities/isPlainObject.js';
import baseVersionFields from '../../versions/baseFields.js';
import { authDefaults, defaults } from './defaults.js';
const sanitizeCollection = (config, collection)=>{
// /////////////////////////////////
// Make copy of collection config
// /////////////////////////////////
const sanitized = merge(defaults, collection, {
isMergeableObject: isPlainObject
});
if (sanitized.timestamps !== false) {
// add default timestamps fields only as needed
let hasUpdatedAt = null;
let hasCreatedAt = null;
sanitized.fields.some((field)=>{
if (fieldAffectsData(field)) {
if (field.name === 'updatedAt') hasUpdatedAt = true;
if (field.name === 'createdAt') hasCreatedAt = true;
}
return hasCreatedAt && hasUpdatedAt;
});
if (!hasUpdatedAt) {
sanitized.fields.push({
name: 'updatedAt',
type: 'date',
admin: {
disableBulkEdit: true,
hidden: true
},
label: ({ t })=>t('general:updatedAt')
});
}
if (!hasCreatedAt) {
sanitized.fields.push({
name: 'createdAt',
admin: {
disableBulkEdit: true,
hidden: true
},
// The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.
type: 'date',
index: true,
label: ({ t })=>t('general:createdAt')
});
}
}
sanitized.labels = sanitized.labels || formatLabels(sanitized.slug);
if (sanitized.versions) {
if (sanitized.versions === true) sanitized.versions = {
drafts: false
};
if (sanitized.timestamps === false) {
throw new TimestampsRequired(collection);
}
if (sanitized.versions.drafts) {
if (sanitized.versions.drafts === true) {
sanitized.versions.drafts = {
autosave: false
};
}
if (sanitized.versions.drafts.autosave === true) {
sanitized.versions.drafts.autosave = {
interval: 2000
};
}
sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields);
}
}
if (sanitized.upload) {
if (sanitized.upload === true) sanitized.upload = {};
// disable duplicate for uploads by default
sanitized.disableDuplicate = sanitized.disableDuplicate || true;
sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug;
sanitized.admin.useAsTitle = sanitized.admin.useAsTitle && sanitized.admin.useAsTitle !== 'id' ? sanitized.admin.useAsTitle : 'filename';
const uploadFields = getBaseUploadFields({
collection: sanitized,
config
});
sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields);
}
if (sanitized.auth) {
sanitized.auth = merge(authDefaults, typeof sanitized.auth === 'object' ? sanitized.auth : {}, {
isMergeableObject: isPlainObject
});
let authFields = [];
if (sanitized.auth.useAPIKey) {
authFields = authFields.concat(baseAPIKeyFields);
}
if (!sanitized.auth.disableLocalStrategy) {
authFields = authFields.concat(baseAuthFields);
if (sanitized.auth.verify) {
if (sanitized.auth.verify === true) sanitized.auth.verify = {};
authFields = authFields.concat(baseVerificationFields);
}
if (sanitized.auth.maxLoginAttempts > 0) {
authFields = authFields.concat(baseAccountLockFields);
}
}
// disable duplicate for auth enabled collections by default
sanitized.disableDuplicate = sanitized.disableDuplicate || true;
if (!sanitized.auth.strategies) {
sanitized.auth.strategies = [];
}
sanitized.fields = mergeBaseFields(sanitized.fields, authFields);
}
// /////////////////////////////////
// Sanitize fields
// /////////////////////////////////
const validRelationships = config.collections.map((c)=>c.slug) || [];
sanitized.fields = sanitizeFields({
config,
fields: sanitized.fields,
validRelationships
});
return sanitized;
};
export default sanitizeCollection;
//# sourceMappingURL=sanitize.js.map