@payloadcms/plugin-import-export
Version:
Import-Export plugin for Payload
162 lines (161 loc) • 7.38 kB
JavaScript
import { addDataAndFileToRequest, deepMergeSimple } from 'payload';
import { flattenObject } from './export/flattenObject.js';
import { getCreateCollectionExportTask } from './export/getCreateExportCollectionTask.js';
import { getCustomFieldFunctions } from './export/getCustomFieldFunctions.js';
import { getSelect } from './export/getSelect.js';
import { getExportCollection } from './getExportCollection.js';
import { translations } from './translations/index.js';
import { collectDisabledFieldPaths } from './utilities/collectDisabledFieldPaths.js';
import { getFlattenedFieldKeys } from './utilities/getFlattenedFieldKeys.js';
import { getValueAtPath } from './utilities/getvalueAtPath.js';
import { removeDisabledFields } from './utilities/removeDisabledFields.js';
import { setNestedValue } from './utilities/setNestedValue.js';
export const importExportPlugin = (pluginConfig)=>(config)=>{
const exportCollection = getExportCollection({
config,
pluginConfig
});
if (config.collections) {
config.collections.push(exportCollection);
} else {
config.collections = [
exportCollection
];
}
// inject custom import export provider
config.admin = config.admin || {};
config.admin.components = config.admin.components || {};
config.admin.components.providers = config.admin.components.providers || [];
config.admin.components.providers.push('@payloadcms/plugin-import-export/rsc#ImportExportProvider');
((config.jobs ??= {}).tasks ??= []).push(getCreateCollectionExportTask(config, pluginConfig));
let collectionsToUpdate = config.collections;
const usePluginCollections = pluginConfig.collections && pluginConfig.collections?.length > 0;
if (usePluginCollections) {
collectionsToUpdate = config.collections?.filter((collection)=>{
return pluginConfig.collections?.includes(collection.slug);
});
}
collectionsToUpdate.forEach((collection)=>{
if (!collection.admin) {
collection.admin = {
components: {
listMenuItems: []
}
};
}
const components = collection.admin.components || {};
if (!components.listMenuItems) {
components.listMenuItems = [];
}
components.listMenuItems.push({
clientProps: {
exportCollectionSlug: exportCollection.slug
},
path: '@payloadcms/plugin-import-export/rsc#ExportListMenuItem'
});
// Find fields explicitly marked as disabled for import/export
const disabledFieldAccessors = collectDisabledFieldPaths(collection.fields);
// Store disabled field accessors in the admin config for use in the UI
collection.admin.custom = {
...collection.admin.custom || {},
'plugin-import-export': {
...collection.admin.custom?.['plugin-import-export'] || {},
disabledFields: disabledFieldAccessors
}
};
collection.admin.components = components;
});
if (!config.i18n) {
config.i18n = {};
}
// config.i18n.translations = deepMergeSimple(translations, config.i18n?.translations ?? {})
// Inject custom REST endpoints into the config
config.endpoints = config.endpoints || [];
config.endpoints.push({
handler: async (req)=>{
await addDataAndFileToRequest(req);
const { collectionSlug, draft, fields, limit, locale, page, sort, where } = req.data;
const collection = req.payload.collections[collectionSlug];
if (!collection) {
return Response.json({
error: `Collection with slug ${collectionSlug} not found`
}, {
status: 400
});
}
const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined;
const result = await req.payload.find({
collection: collectionSlug,
depth: 1,
draft: draft === 'yes',
limit: limit && limit > 10 ? 10 : limit,
locale,
overrideAccess: false,
page,
req,
select,
sort,
where
});
const isCSV = req?.data?.format === 'csv';
const docs = result.docs;
let transformed = [];
if (isCSV) {
const toCSVFunctions = getCustomFieldFunctions({
fields: collection.config.fields
});
const possibleKeys = getFlattenedFieldKeys(collection.config.fields);
transformed = docs.map((doc)=>{
const row = flattenObject({
doc,
fields,
toCSVFunctions
});
for (const key of possibleKeys){
if (!(key in row)) {
row[key] = null;
}
}
return row;
});
} else {
const disabledFields = collection.config.admin.custom?.['plugin-import-export']?.disabledFields;
transformed = docs.map((doc)=>{
let output = {
...doc
};
// Remove disabled fields first
output = removeDisabledFields(output, disabledFields);
// Then trim to selected fields only (if fields are provided)
if (Array.isArray(fields) && fields.length > 0) {
const trimmed = {};
for (const key of fields){
const value = getValueAtPath(output, key);
setNestedValue(trimmed, key, value ?? null);
}
output = trimmed;
}
return output;
});
}
return Response.json({
docs: transformed,
totalDocs: result.totalDocs
});
},
method: 'post',
path: '/preview-data'
});
/**
* Merge plugin translations
*/ const simplifiedTranslations = Object.entries(translations).reduce((acc, [key, value])=>{
acc[key] = value.translations;
return acc;
}, {});
config.i18n = {
...config.i18n,
translations: deepMergeSimple(simplifiedTranslations, config.i18n?.translations ?? {})
};
return config;
};
//# sourceMappingURL=index.js.map