@payloadcms/plugin-import-export 3.77.0-canary.7 → 3.77.0-internal-debug.98d2e4d
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/components/CollectionField/index.d.ts +2 -2
- package/dist/components/CollectionField/index.d.ts.map +1 -1
- package/dist/components/CollectionField/index.js +5 -28
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/CollectionSelectField/index.d.ts +13 -0
- package/dist/components/CollectionSelectField/index.d.ts.map +1 -0
- package/dist/components/CollectionSelectField/index.js +159 -0
- package/dist/components/CollectionSelectField/index.js.map +1 -0
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +5 -1
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.d.ts.map +1 -1
- package/dist/components/ExportPreview/index.js.map +1 -1
- package/dist/components/FieldsToExport/index.js +1 -1
- package/dist/components/FieldsToExport/index.js.map +1 -1
- package/dist/components/ImportPreview/index.d.ts.map +1 -1
- package/dist/components/ImportPreview/index.js +50 -30
- package/dist/components/ImportPreview/index.js.map +1 -1
- package/dist/export/createExport.d.ts +1 -2
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +2 -1
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +12 -1
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts +5 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getExportCollection.js +20 -5
- package/dist/export/getExportCollection.js.map +1 -1
- package/dist/export/getFields.d.ts +7 -1
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +15 -3
- package/dist/export/getFields.js.map +1 -1
- package/dist/exports/rsc.d.ts +0 -1
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +0 -1
- package/dist/exports/rsc.js.map +1 -1
- package/dist/import/batchProcessor.d.ts.map +1 -1
- package/dist/import/batchProcessor.js +9 -3
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/getFields.d.ts +7 -3
- package/dist/import/getFields.d.ts.map +1 -1
- package/dist/import/getFields.js +12 -7
- package/dist/import/getFields.js.map +1 -1
- package/dist/import/getImportCollection.d.ts +6 -3
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/getImportCollection.js +7 -4
- package/dist/import/getImportCollection.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utilities/getFilename.d.ts +1 -1
- package/dist/utilities/getFilename.js +3 -3
- package/dist/utilities/getFilename.js.map +1 -1
- package/dist/utilities/getPluginCollections.d.ts.map +1 -1
- package/dist/utilities/getPluginCollections.js +106 -34
- package/dist/utilities/getPluginCollections.js.map +1 -1
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
- package/dist/utilities/getSchemaColumns.js +9 -56
- package/dist/utilities/getSchemaColumns.js.map +1 -1
- package/dist/utilities/getSchemaColumns.spec.js +157 -0
- package/dist/utilities/getSchemaColumns.spec.js.map +1 -0
- package/dist/utilities/parseCSV.d.ts.map +1 -1
- package/dist/utilities/parseCSV.js +1 -0
- package/dist/utilities/parseCSV.js.map +1 -1
- package/dist/utilities/parseCSV.spec.js +26 -0
- package/dist/utilities/parseCSV.spec.js.map +1 -1
- package/package.json +7 -7
- package/dist/components/ImportCollectionField/index.d.ts +0 -3
- package/dist/components/ImportCollectionField/index.d.ts.map +0 -1
- package/dist/components/ImportCollectionField/index.js +0 -17
- package/dist/components/ImportCollectionField/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ImportPreview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField, ConditionalDateProps, PaginatedDocs } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Pagination,\n PerPage,\n Table,\n Translation,\n useConfig,\n useDebouncedEffect,\n useDocumentInfo,\n useField,\n useFormFields,\n useTranslation,\n} from '@payloadcms/ui'\nimport { formatDocTitle } from '@payloadcms/ui/shared'\nimport { fieldAffectsData, getObjectDotNotation } from 'payload/shared'\nimport React, { useState, useTransition } from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\nimport type { ImportPreviewResponse } from '../../types.js'\n\nimport { DEFAULT_PREVIEW_LIMIT, PREVIEW_LIMIT_OPTIONS } from '../../constants.js'\nimport './index.scss'\n\nconst baseClass = 'import-preview'\n\nexport const ImportPreview: React.FC = () => {\n const [isPending, startTransition] = useTransition()\n const {\n config,\n config: { routes },\n } = useConfig()\n const { collectionSlug } = useDocumentInfo()\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const { value: targetCollectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { value: importMode } = useField<string>({ path: 'importMode' })\n const { value: matchField } = useField<string>({ path: 'matchField' })\n const { value: filename } = useField<string>({ path: 'filename' })\n const { value: url } = useField<string>({ path: 'url' })\n const { value: mimeType } = useField<string>({ path: 'mimeType' })\n const { value: status } = useField<string>({ path: 'status' })\n const { value: summary } = useField<any>({ path: 'summary' })\n\n // Access the file field directly from form fields\n const fileField = useFormFields(([fields]) => fields?.file || null)\n\n const [dataToRender, setDataToRender] = useState<Record<string, unknown>[]>([])\n const [columns, setColumns] = useState<Column[]>([])\n const [totalDocs, setTotalDocs] = useState<number>(0)\n const [error, setError] = useState<null | string>(null)\n\n // Preview pagination state\n const [previewPage, setPreviewPage] = useState(1)\n const [previewLimit, setPreviewLimit] = useState(DEFAULT_PREVIEW_LIMIT)\n const [paginationData, setPaginationData] = useState<null | Pick<\n PaginatedDocs,\n 'hasNextPage' | 'hasPrevPage' | 'limit' | 'nextPage' | 'page' | 'prevPage' | 'totalPages'\n >>(null)\n\n const collectionConfig = React.useMemo(\n () => config.collections.find((c) => c.slug === targetCollectionSlug),\n [targetCollectionSlug, config.collections],\n )\n\n useDebouncedEffect(\n () => {\n if (!collectionSlug || !targetCollectionSlug) {\n return\n }\n\n if (!targetCollectionSlug || (!url && !fileField?.value)) {\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n return\n }\n\n if (!collectionConfig) {\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n return\n }\n\n const abortController = new AbortController()\n\n const processFileData = async () => {\n setError(null)\n\n try {\n // Determine format from file\n let format: 'csv' | 'json' = 'json'\n if (fileField?.value && fileField.value instanceof File) {\n const file = fileField.value\n format = file.type === 'text/csv' || file.name?.endsWith('.csv') ? 'csv' : 'json'\n } else if (mimeType === 'text/csv' || filename?.endsWith('.csv')) {\n format = 'csv'\n }\n\n // Get file data as base64\n let fileData: string | undefined\n\n if (fileField?.value && fileField.value instanceof File) {\n // File is being uploaded, read its contents\n const arrayBuffer = await fileField.value.arrayBuffer()\n const base64 = Buffer.from(arrayBuffer).toString('base64')\n fileData = base64\n } else if (url) {\n // File has been saved, fetch from URL\n const response = await fetch(url, { signal: abortController.signal })\n if (!response.ok) {\n throw new Error('Failed to fetch file')\n }\n const arrayBuffer = await response.arrayBuffer()\n const base64 = Buffer.from(arrayBuffer).toString('base64')\n fileData = base64\n }\n\n if (!fileData) {\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n return\n }\n\n // Fetch transformed data from the server\n const res = await fetch(`${routes.api}/${collectionSlug}/preview-data`, {\n body: JSON.stringify({\n collectionSlug: targetCollectionSlug,\n fileData,\n format,\n previewLimit,\n previewPage,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n signal: abortController.signal,\n })\n\n if (!res.ok) {\n throw new Error('Failed to process file')\n }\n\n const {\n docs,\n hasNextPage,\n hasPrevPage,\n limit: responseLimit,\n page: responsePage,\n totalDocs: serverTotalDocs,\n totalPages,\n }: ImportPreviewResponse = await res.json()\n\n setTotalDocs(serverTotalDocs)\n setPaginationData({\n hasNextPage,\n hasPrevPage,\n limit: responseLimit,\n nextPage: responsePage + 1,\n page: responsePage,\n prevPage: responsePage - 1,\n totalPages,\n })\n\n if (!Array.isArray(docs) || docs.length === 0) {\n setDataToRender([])\n setColumns([])\n return\n }\n\n // Build columns from collection fields without traverseFields\n const buildColumnsFromFields = (\n fields: ClientField[],\n parentPath = '',\n parentLabel = '',\n ): Column[] => {\n const cols: Column[] = []\n\n fields.forEach((field) => {\n if (!fieldAffectsData(field) || field.admin?.disabled) {\n return\n }\n\n // Build the field path\n const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name\n\n // Get the field label\n let label = field.name\n if ('label' in field && field.label) {\n label = getTranslation(field.label, i18n)\n }\n\n // Add parent label prefix if in a group\n if (parentLabel) {\n label = `${parentLabel} > ${label}`\n }\n\n // Skip if this field doesn't exist in any document\n const hasData = docs.some((doc) => {\n const value = getObjectDotNotation(doc, fieldPath)\n return value !== undefined && value !== null\n })\n\n if (!hasData && field.type !== 'relationship') {\n return\n }\n\n cols.push({\n accessor: fieldPath,\n active: true,\n field,\n Heading: label,\n renderedCells: docs.map((doc) => {\n const value = getObjectDotNotation(doc, fieldPath)\n\n if (value === undefined || value === null) {\n return null\n }\n\n // Format based on field type\n if (field.type === 'relationship' || field.type === 'upload') {\n // Handle relationships\n if (typeof value === 'object' && !Array.isArray(value)) {\n // Single relationship\n const relationTo = Array.isArray(field.relationTo)\n ? (value as any).relationTo\n : field.relationTo\n\n const relatedConfig = config.collections.find((c) => c.slug === relationTo)\n if (relatedConfig && relatedConfig.admin?.useAsTitle) {\n const titleValue = (value as any)[relatedConfig.admin.useAsTitle]\n if (titleValue) {\n return formatDocTitle({\n collectionConfig: relatedConfig,\n data: value as any,\n dateFormat: config.admin.dateFormat,\n i18n,\n })\n }\n }\n\n // Fallback to ID\n const id = (value as any).id || value\n return `${getTranslation(relatedConfig?.labels?.singular || relationTo, i18n)}: ${id}`\n } else if (Array.isArray(value)) {\n // Multiple relationships\n return value\n .map((item) => {\n if (typeof item === 'object') {\n const relationTo = Array.isArray(field.relationTo)\n ? item.relationTo\n : field.relationTo\n const relatedConfig = config.collections.find(\n (c) => c.slug === relationTo,\n )\n\n if (relatedConfig && relatedConfig.admin?.useAsTitle) {\n const titleValue = item[relatedConfig.admin.useAsTitle]\n if (titleValue) {\n return formatDocTitle({\n collectionConfig: relatedConfig,\n data: item,\n dateFormat: config.admin.dateFormat,\n i18n,\n })\n }\n }\n\n return item.id || item\n }\n return item\n })\n .join(', ')\n }\n\n // Just an ID\n return String(value)\n } else if (field.type === 'date') {\n // Format dates\n const dateFormat =\n (field.admin &&\n 'date' in field.admin &&\n (field.admin.date as ConditionalDateProps)?.displayFormat) ||\n config.admin.dateFormat\n\n return new Date(value as string).toLocaleString(i18n.language, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n } else if (field.type === 'checkbox') {\n return value ? '✓' : '✗'\n } else if (field.type === 'select' || field.type === 'radio') {\n // Show the label for select/radio options\n const option = field.options?.find((opt) => {\n if (typeof opt === 'string') {\n return opt === value\n }\n return opt.value === value\n })\n\n if (option && typeof option === 'object') {\n return getTranslation(option.label, i18n)\n }\n return String(value)\n } else if (field.type === 'number') {\n return String(value)\n } else if (Array.isArray(value)) {\n // Handle arrays\n if (field.type === 'blocks') {\n return value.map((block: any) => `${block.blockType || 'Block'}`).join(', ')\n }\n return `[${value.length} items]`\n } else if (typeof value === 'object') {\n // Handle objects\n if (field.type === 'group') {\n return '{...}'\n }\n return JSON.stringify(value)\n }\n\n return String(value)\n }),\n })\n\n // For groups, add nested fields with parent label\n if (field.type === 'group' && 'fields' in field) {\n const groupLabel =\n 'label' in field && field.label ? getTranslation(field.label, i18n) : field.name\n\n const nestedCols = buildColumnsFromFields(\n field.fields,\n fieldPath,\n parentLabel ? `${parentLabel} > ${groupLabel}` : groupLabel,\n )\n cols.push(...nestedCols)\n }\n\n // For tabs, process the fields within\n if ('tabs' in field && Array.isArray(field.tabs)) {\n field.tabs.forEach((tab) => {\n if ('name' in tab && tab.name) {\n // Named tab\n const tabPath = parentPath ? `${parentPath}.${tab.name}` : tab.name\n const tabLabel =\n 'label' in tab && tab.label ? getTranslation(tab.label, i18n) : tab.name\n\n const tabCols = buildColumnsFromFields(\n tab.fields,\n tabPath,\n parentLabel ? `${parentLabel} > ${tabLabel}` : tabLabel,\n )\n cols.push(...tabCols)\n } else {\n // Unnamed tab - fields go directly under parent\n const tabLabel =\n 'label' in tab && tab.label ? getTranslation(tab.label, i18n) : ''\n\n const tabCols = buildColumnsFromFields(\n tab.fields,\n parentPath,\n tabLabel && typeof tabLabel === 'string' && parentLabel\n ? `${parentLabel} > ${tabLabel}`\n : typeof tabLabel === 'string'\n ? tabLabel\n : parentLabel,\n )\n cols.push(...tabCols)\n }\n })\n }\n })\n\n return cols\n }\n\n // Add default meta fields at the end\n const fieldColumns = buildColumnsFromFields(collectionConfig.fields)\n const metaFields = ['id', 'createdAt', 'updatedAt', '_status']\n\n metaFields.forEach((metaField) => {\n const hasData = docs.some((doc) => doc[metaField] !== undefined)\n if (!hasData) {\n return\n }\n\n fieldColumns.push({\n accessor: metaField,\n active: true,\n field: { name: metaField } as ClientField,\n Heading: getTranslation(metaField, i18n),\n renderedCells: docs.map((doc) => {\n const value = doc[metaField]\n if (value === undefined || value === null) {\n return null\n }\n\n if (metaField === 'createdAt' || metaField === 'updatedAt') {\n return new Date(value as string).toLocaleString(i18n.language, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n }\n\n return String(value)\n }),\n })\n })\n\n setColumns(fieldColumns)\n setDataToRender(docs)\n } catch (err) {\n console.error('Error processing file data:', err)\n setError(err instanceof Error ? err.message : 'Failed to load preview')\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n }\n }\n\n startTransition(async () => await processFileData())\n\n return () => {\n if (!abortController.signal.aborted) {\n abortController.abort('Component unmounted')\n }\n }\n },\n [\n collectionSlug,\n targetCollectionSlug,\n url,\n filename,\n mimeType,\n fileField?.value,\n collectionConfig,\n config,\n i18n,\n previewLimit,\n previewPage,\n routes.api,\n ],\n 500,\n )\n\n // If import has been processed, show results instead of preview\n if (status !== 'pending' && summary) {\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:importResults\" t={t} />\n </h3>\n </div>\n <div className={`${baseClass}__results`}>\n <p>\n <strong>Status:</strong> {status}\n </p>\n <p>\n <strong>Imported:</strong> {summary.imported || 0}\n </p>\n <p>\n <strong>Updated:</strong> {summary.updated || 0}\n </p>\n <p>\n <strong>Total:</strong> {summary.total || 0}\n </p>\n {summary.issues > 0 && (\n <p>\n <strong>Issues:</strong> {summary.issues}\n </p>\n )}\n {summary.issueDetails && summary.issueDetails.length > 0 && (\n <div style={{ marginTop: '1rem' }}>\n <strong>Issue Details:</strong>\n <ul style={{ marginTop: '0.5rem' }}>\n {summary.issueDetails.slice(0, 10).map((issue: any, index: number) => (\n <li key={index}>\n Row {issue.row}: {issue.error}\n </li>\n ))}\n {summary.issueDetails.length > 10 && (\n <li>... and {summary.issueDetails.length - 10} more issues</li>\n )}\n </ul>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n if (!targetCollectionSlug) {\n return (\n <div className={baseClass}>\n <p style={{ opacity: 0.6 }}>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:collectionRequired\" t={t} />\n </p>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={baseClass}>\n <p style={{ color: 'red' }}>\n <Translation i18nKey=\"general:error\" t={t} />: {error}\n </p>\n </div>\n )\n }\n\n if (!url && !fileField?.value) {\n return (\n <div className={baseClass}>\n <p style={{ opacity: 0.6 }}>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:uploadFileToSeePreview\" t={t} />\n </p>\n </div>\n )\n }\n\n const handlePageChange = (page: number) => {\n setPreviewPage(page)\n }\n\n const handlePerPageChange = (newLimit: number) => {\n setPreviewLimit(newLimit)\n setPreviewPage(1)\n }\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n <Translation i18nKey=\"version:preview\" t={t} />\n </h3>\n {totalDocs > 0 && !isPending && (\n <div className={`${baseClass}__info`}>\n <span className={`${baseClass}__import-count`}>\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:documentsToImport\"\n t={t}\n variables={{\n count: totalDocs,\n }}\n />\n </span>\n {' | '}\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:mode\" t={t} />: {importMode || 'create'}\n {importMode !== 'create' && (\n <>\n {' | '}\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:matchBy\" t={t} />: {matchField || 'id'}\n </>\n )}\n </div>\n )}\n </div>\n {isPending && !dataToRender.length && (\n <div className={`${baseClass}__loading`}>\n <Translation i18nKey=\"general:loading\" t={t} />\n </div>\n )}\n {dataToRender.length > 0 && <Table columns={columns} data={dataToRender} />}\n {!isPending && dataToRender.length === 0 && targetCollectionSlug && (\n <p>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:noDataToPreview\" t={t} />\n </p>\n )}\n {paginationData && totalDocs > 0 && (\n <div className={`${baseClass}__pagination`}>\n {paginationData.totalPages > 1 && (\n <Pagination\n hasNextPage={paginationData.hasNextPage}\n hasPrevPage={paginationData.hasPrevPage}\n nextPage={paginationData.nextPage ?? undefined}\n numberOfNeighbors={1}\n onChange={handlePageChange}\n page={paginationData.page}\n prevPage={paginationData.prevPage ?? undefined}\n totalPages={paginationData.totalPages}\n />\n )}\n <span className={`${baseClass}__page-info`}>\n <Translation\n // @ts-expect-error - plugin translations not typed\n i18nKey=\"plugin-import-export:previewPageInfo\"\n t={t}\n variables={{\n end: Math.min((paginationData.page ?? 1) * previewLimit, totalDocs),\n start: ((paginationData.page ?? 1) - 1) * previewLimit + 1,\n total: totalDocs,\n }}\n />\n </span>\n <PerPage\n handleChange={handlePerPageChange}\n limit={previewLimit}\n limits={PREVIEW_LIMIT_OPTIONS}\n />\n </div>\n )}\n </div>\n )\n}\n"],"names":["getTranslation","Pagination","PerPage","Table","Translation","useConfig","useDebouncedEffect","useDocumentInfo","useField","useFormFields","useTranslation","formatDocTitle","fieldAffectsData","getObjectDotNotation","React","useState","useTransition","DEFAULT_PREVIEW_LIMIT","PREVIEW_LIMIT_OPTIONS","baseClass","ImportPreview","isPending","startTransition","config","routes","collectionSlug","i18n","t","value","targetCollectionSlug","path","importMode","matchField","filename","url","mimeType","status","summary","fileField","fields","file","dataToRender","setDataToRender","columns","setColumns","totalDocs","setTotalDocs","error","setError","previewPage","setPreviewPage","previewLimit","setPreviewLimit","paginationData","setPaginationData","collectionConfig","useMemo","collections","find","c","slug","abortController","AbortController","processFileData","format","File","type","name","endsWith","fileData","arrayBuffer","base64","Buffer","from","toString","response","fetch","signal","ok","Error","res","api","body","JSON","stringify","credentials","headers","method","docs","hasNextPage","hasPrevPage","limit","responseLimit","page","responsePage","serverTotalDocs","totalPages","json","nextPage","prevPage","Array","isArray","length","buildColumnsFromFields","parentPath","parentLabel","cols","forEach","field","admin","disabled","fieldPath","label","hasData","some","doc","undefined","push","accessor","active","Heading","renderedCells","map","relationTo","relatedConfig","useAsTitle","titleValue","data","dateFormat","id","labels","singular","item","join","String","date","displayFormat","Date","toLocaleString","language","dateStyle","timeStyle","option","options","opt","block","blockType","groupLabel","nestedCols","tabs","tab","tabPath","tabLabel","tabCols","fieldColumns","metaFields","metaField","err","console","message","aborted","abort","div","className","h3","i18nKey","p","strong","imported","updated","total","issues","issueDetails","style","marginTop","ul","slice","issue","index","li","row","opacity","color","handlePageChange","handlePerPageChange","newLimit","span","variables","count","numberOfNeighbors","onChange","end","Math","min","start","handleChange","limits"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ImportPreview/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientField, Column, PaginatedDocs } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Pagination,\n PerPage,\n Table,\n Translation,\n useConfig,\n useDebouncedEffect,\n useDocumentInfo,\n useField,\n useFormFields,\n useTranslation,\n} from '@payloadcms/ui'\nimport { formatDocTitle } from '@payloadcms/ui/shared'\nimport { fieldAffectsData, getObjectDotNotation } from 'payload/shared'\nimport React, { useState, useTransition } from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\nimport type { ImportPreviewResponse } from '../../types.js'\n\nimport { DEFAULT_PREVIEW_LIMIT, PREVIEW_LIMIT_OPTIONS } from '../../constants.js'\nimport './index.scss'\n\nconst baseClass = 'import-preview'\n\nexport const ImportPreview: React.FC = () => {\n const [isPending, startTransition] = useTransition()\n const {\n config,\n config: { routes },\n } = useConfig()\n const { collectionSlug } = useDocumentInfo()\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const { value: targetCollectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { value: importMode } = useField<string>({ path: 'importMode' })\n const { value: matchField } = useField<string>({ path: 'matchField' })\n const { value: filename } = useField<string>({ path: 'filename' })\n const { value: url } = useField<string>({ path: 'url' })\n const { value: mimeType } = useField<string>({ path: 'mimeType' })\n const { value: status } = useField<string>({ path: 'status' })\n const { value: summary } = useField<any>({ path: 'summary' })\n\n // Access the file field directly from form fields\n const fileField = useFormFields(([fields]) => fields?.file || null)\n\n const [dataToRender, setDataToRender] = useState<Record<string, unknown>[]>([])\n const [columns, setColumns] = useState<Column[]>([])\n const [totalDocs, setTotalDocs] = useState<number>(0)\n const [error, setError] = useState<null | string>(null)\n\n // Preview pagination state\n const [previewPage, setPreviewPage] = useState(1)\n const [previewLimit, setPreviewLimit] = useState(DEFAULT_PREVIEW_LIMIT)\n const [paginationData, setPaginationData] = useState<null | Pick<\n PaginatedDocs,\n 'hasNextPage' | 'hasPrevPage' | 'limit' | 'nextPage' | 'page' | 'prevPage' | 'totalPages'\n >>(null)\n\n const collectionConfig = React.useMemo(\n () => config.collections.find((c) => c.slug === targetCollectionSlug),\n [targetCollectionSlug, config.collections],\n )\n\n useDebouncedEffect(\n () => {\n if (!collectionSlug || !targetCollectionSlug) {\n return\n }\n\n if (!targetCollectionSlug || (!url && !fileField?.value)) {\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n return\n }\n\n if (!collectionConfig) {\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n return\n }\n\n const abortController = new AbortController()\n\n const processFileData = async () => {\n setError(null)\n\n try {\n // Determine format from file\n let format: 'csv' | 'json' = 'json'\n if (fileField?.value && fileField.value instanceof File) {\n const file = fileField.value\n format = file.type === 'text/csv' || file.name?.endsWith('.csv') ? 'csv' : 'json'\n } else if (mimeType === 'text/csv' || filename?.endsWith('.csv')) {\n format = 'csv'\n }\n\n // Get file data as base64\n let fileData: string | undefined\n\n if (fileField?.value && fileField.value instanceof File) {\n // File is being uploaded, read its contents\n const arrayBuffer = await fileField.value.arrayBuffer()\n const base64 = Buffer.from(arrayBuffer).toString('base64')\n fileData = base64\n } else if (url) {\n // File has been saved, fetch from URL\n const response = await fetch(url, { signal: abortController.signal })\n if (!response.ok) {\n throw new Error('Failed to fetch file')\n }\n const arrayBuffer = await response.arrayBuffer()\n const base64 = Buffer.from(arrayBuffer).toString('base64')\n fileData = base64\n }\n\n if (!fileData) {\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n return\n }\n\n // Fetch transformed data from the server\n const res = await fetch(`${routes.api}/${collectionSlug}/preview-data`, {\n body: JSON.stringify({\n collectionSlug: targetCollectionSlug,\n fileData,\n format,\n previewLimit,\n previewPage,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n signal: abortController.signal,\n })\n\n if (!res.ok) {\n throw new Error('Failed to process file')\n }\n\n const {\n docs,\n hasNextPage,\n hasPrevPage,\n limit: responseLimit,\n page: responsePage,\n totalDocs: serverTotalDocs,\n totalPages,\n }: ImportPreviewResponse = await res.json()\n\n setTotalDocs(serverTotalDocs)\n setPaginationData({\n hasNextPage,\n hasPrevPage,\n limit: responseLimit,\n nextPage: responsePage + 1,\n page: responsePage,\n prevPage: responsePage - 1,\n totalPages,\n })\n\n if (!Array.isArray(docs) || docs.length === 0) {\n setDataToRender([])\n setColumns([])\n return\n }\n\n // Build columns from collection fields without traverseFields\n const buildColumnsFromFields = (\n fields: ClientField[],\n parentPath = '',\n parentLabel = '',\n ): Column[] => {\n const cols: Column[] = []\n\n fields.forEach((field) => {\n if (!fieldAffectsData(field) || field.admin?.disabled) {\n return\n }\n\n // Build the field path\n const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name\n\n // Get the field label\n let label = field.name\n if ('label' in field && field.label) {\n label = getTranslation(field.label, i18n)\n }\n\n // Add parent label prefix if in a group\n if (parentLabel) {\n label = `${parentLabel} > ${label}`\n }\n\n // Skip if this field doesn't exist in any document\n const hasData = docs.some((doc) => {\n const value = getObjectDotNotation(doc, fieldPath)\n return value !== undefined && value !== null\n })\n\n if (!hasData && field.type !== 'relationship') {\n return\n }\n\n cols.push({\n accessor: fieldPath,\n active: true,\n field,\n Heading: label,\n renderedCells: docs.map((doc) => {\n const value = getObjectDotNotation(doc, fieldPath)\n\n if (value === undefined || value === null) {\n return null\n }\n\n // Format based on field type\n if (field.type === 'relationship' || field.type === 'upload') {\n // Handle relationships\n if (typeof value === 'object' && !Array.isArray(value)) {\n // Single relationship\n const relationTo = Array.isArray(field.relationTo)\n ? (value as any).relationTo\n : field.relationTo\n\n const relatedConfig = config.collections.find((c) => c.slug === relationTo)\n if (relatedConfig && relatedConfig.admin?.useAsTitle) {\n const titleValue = (value as any)[relatedConfig.admin.useAsTitle]\n if (titleValue) {\n return formatDocTitle({\n collectionConfig: relatedConfig,\n data: value as any,\n dateFormat: config.admin.dateFormat,\n i18n,\n })\n }\n }\n\n // Fallback to ID\n const id = (value as any).id || value\n return `${getTranslation(relatedConfig?.labels?.singular || relationTo, i18n)}: ${id}`\n } else if (Array.isArray(value)) {\n // Multiple relationships\n return value\n .map((item) => {\n if (typeof item === 'object') {\n const relationTo = Array.isArray(field.relationTo)\n ? item.relationTo\n : field.relationTo\n const relatedConfig = config.collections.find(\n (c) => c.slug === relationTo,\n )\n\n if (relatedConfig && relatedConfig.admin?.useAsTitle) {\n const titleValue = item[relatedConfig.admin.useAsTitle]\n if (titleValue) {\n return formatDocTitle({\n collectionConfig: relatedConfig,\n data: item,\n dateFormat: config.admin.dateFormat,\n i18n,\n })\n }\n }\n\n return item.id || item\n }\n return item\n })\n .join(', ')\n }\n\n // Just an ID\n return String(value)\n } else if (field.type === 'date') {\n // Display date as string to avoid wrong locale/timezone conversion\n return String(value)\n } else if (field.type === 'checkbox') {\n return value ? '✓' : '✗'\n } else if (field.type === 'select' || field.type === 'radio') {\n // Show the label for select/radio options\n const option = field.options?.find((opt) => {\n if (typeof opt === 'string') {\n return opt === value\n }\n return opt.value === value\n })\n\n if (option && typeof option === 'object') {\n return getTranslation(option.label, i18n)\n }\n return String(value)\n } else if (field.type === 'number') {\n return String(value)\n } else if (Array.isArray(value)) {\n // Handle arrays\n if (field.type === 'blocks') {\n return value.map((block: any) => `${block.blockType || 'Block'}`).join(', ')\n }\n return `[${value.length} items]`\n } else if (typeof value === 'object') {\n // Handle objects\n if (field.type === 'group') {\n return '{...}'\n }\n return JSON.stringify(value)\n }\n\n return String(value)\n }),\n })\n\n // For groups, add nested fields with parent label\n if (field.type === 'group' && 'fields' in field) {\n const groupLabel =\n 'label' in field && field.label ? getTranslation(field.label, i18n) : field.name\n\n const nestedCols = buildColumnsFromFields(\n field.fields,\n fieldPath,\n parentLabel ? `${parentLabel} > ${groupLabel}` : groupLabel,\n )\n cols.push(...nestedCols)\n }\n\n // For tabs, process the fields within\n if ('tabs' in field && Array.isArray(field.tabs)) {\n field.tabs.forEach((tab) => {\n if ('name' in tab && tab.name) {\n // Named tab\n const tabPath = parentPath ? `${parentPath}.${tab.name}` : tab.name\n const tabLabel =\n 'label' in tab && tab.label ? getTranslation(tab.label, i18n) : tab.name\n\n const tabCols = buildColumnsFromFields(\n tab.fields,\n tabPath,\n parentLabel ? `${parentLabel} > ${tabLabel}` : tabLabel,\n )\n cols.push(...tabCols)\n } else {\n // Unnamed tab - fields go directly under parent\n const tabLabel =\n 'label' in tab && tab.label ? getTranslation(tab.label, i18n) : ''\n\n const tabCols = buildColumnsFromFields(\n tab.fields,\n parentPath,\n tabLabel && typeof tabLabel === 'string' && parentLabel\n ? `${parentLabel} > ${tabLabel}`\n : typeof tabLabel === 'string'\n ? tabLabel\n : parentLabel,\n )\n cols.push(...tabCols)\n }\n })\n }\n })\n\n return cols\n }\n\n const fieldColumns = buildColumnsFromFields(collectionConfig.fields)\n\n const existingAccessors = new Set(fieldColumns.map((column) => column.accessor))\n\n // Discover all fields from document data to determine column order\n // Respect the order fields appear in the data (e.g., CSV column order)\n const dataFieldOrder: string[] = []\n const dataFieldsSet = new Set<string>()\n\n // Collect all fields from all docs to get comprehensive field list\n docs.forEach((doc) => {\n Object.keys(doc).forEach((key) => {\n if (!dataFieldsSet.has(key) && doc[key] !== undefined && doc[key] !== null) {\n dataFieldsSet.add(key)\n dataFieldOrder.push(key)\n }\n })\n })\n\n // Helper to create a column for a field\n const createColumnForField = (fieldName: string): Column => ({\n accessor: fieldName,\n active: true,\n field: { name: fieldName } as ClientField,\n Heading: getTranslation(fieldName, i18n),\n renderedCells: docs.map((doc) => {\n const value = doc[fieldName]\n if (value === undefined || value === null) {\n return null\n }\n\n return String(value)\n }),\n })\n\n // Build columns respecting data order for fields not in config\n // For fields in config, use their natural order from fieldColumns\n const finalColumns: Column[] = []\n const addedAccessors = new Set<string>()\n\n // Process fields in the order they appear in the data\n dataFieldOrder.forEach((fieldName) => {\n if (existingAccessors.has(fieldName)) {\n // This field is from the collection config\n const configColumn = fieldColumns.find((col) => col.accessor === fieldName)\n if (configColumn && !addedAccessors.has(fieldName)) {\n finalColumns.push(configColumn)\n addedAccessors.add(fieldName)\n }\n } else {\n // This is an additional field (system field or extra data field)\n if (!addedAccessors.has(fieldName)) {\n finalColumns.push(createColumnForField(fieldName))\n addedAccessors.add(fieldName)\n }\n }\n })\n\n // Add any remaining config fields that weren't in the data\n fieldColumns.forEach((col) => {\n if (!addedAccessors.has(col.accessor)) {\n finalColumns.push(col)\n addedAccessors.add(col.accessor)\n }\n })\n\n setColumns(finalColumns)\n setDataToRender(docs)\n } catch (err) {\n console.error('Error processing file data:', err)\n setError(err instanceof Error ? err.message : 'Failed to load preview')\n setDataToRender([])\n setColumns([])\n setTotalDocs(0)\n setPaginationData(null)\n }\n }\n\n startTransition(async () => await processFileData())\n\n return () => {\n if (!abortController.signal.aborted) {\n abortController.abort('Component unmounted')\n }\n }\n },\n [\n collectionSlug,\n targetCollectionSlug,\n url,\n filename,\n mimeType,\n fileField?.value,\n collectionConfig,\n config,\n i18n,\n previewLimit,\n previewPage,\n routes.api,\n ],\n 500,\n )\n\n // If import has been processed, show results instead of preview\n if (status !== 'pending' && summary) {\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:importResults\" t={t} />\n </h3>\n </div>\n <div className={`${baseClass}__results`}>\n <p>\n <strong>Status:</strong> {status}\n </p>\n <p>\n <strong>Imported:</strong> {summary.imported || 0}\n </p>\n <p>\n <strong>Updated:</strong> {summary.updated || 0}\n </p>\n <p>\n <strong>Total:</strong> {summary.total || 0}\n </p>\n {summary.issues > 0 && (\n <p>\n <strong>Issues:</strong> {summary.issues}\n </p>\n )}\n {summary.issueDetails && summary.issueDetails.length > 0 && (\n <div style={{ marginTop: '1rem' }}>\n <strong>Issue Details:</strong>\n <ul style={{ marginTop: '0.5rem' }}>\n {summary.issueDetails.slice(0, 10).map((issue: any, index: number) => (\n <li key={index}>\n Row {issue.row}: {issue.error}\n </li>\n ))}\n {summary.issueDetails.length > 10 && (\n <li>... and {summary.issueDetails.length - 10} more issues</li>\n )}\n </ul>\n </div>\n )}\n </div>\n </div>\n )\n }\n\n if (!targetCollectionSlug) {\n return (\n <div className={baseClass}>\n <p style={{ opacity: 0.6 }}>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:collectionRequired\" t={t} />\n </p>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={baseClass}>\n <p style={{ color: 'red' }}>\n <Translation i18nKey=\"general:error\" t={t} />: {error}\n </p>\n </div>\n )\n }\n\n if (!url && !fileField?.value) {\n return (\n <div className={baseClass}>\n <p style={{ opacity: 0.6 }}>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:uploadFileToSeePreview\" t={t} />\n </p>\n </div>\n )\n }\n\n const handlePageChange = (page: number) => {\n setPreviewPage(page)\n }\n\n const handlePerPageChange = (newLimit: number) => {\n setPreviewLimit(newLimit)\n setPreviewPage(1)\n }\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n <Translation i18nKey=\"version:preview\" t={t} />\n </h3>\n {totalDocs > 0 && !isPending && (\n <div className={`${baseClass}__info`}>\n <span className={`${baseClass}__import-count`}>\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:documentsToImport\"\n t={t}\n variables={{\n count: totalDocs,\n }}\n />\n </span>\n {' | '}\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:mode\" t={t} />: {importMode || 'create'}\n {importMode !== 'create' && (\n <>\n {' | '}\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:matchBy\" t={t} />: {matchField || 'id'}\n </>\n )}\n </div>\n )}\n </div>\n {isPending && !dataToRender.length && (\n <div className={`${baseClass}__loading`}>\n <Translation i18nKey=\"general:loading\" t={t} />\n </div>\n )}\n {dataToRender.length > 0 && <Table columns={columns} data={dataToRender} />}\n {!isPending && dataToRender.length === 0 && targetCollectionSlug && (\n <p>\n {/* @ts-expect-error - translations are not typed in plugins */}\n <Translation i18nKey=\"plugin-import-export:noDataToPreview\" t={t} />\n </p>\n )}\n {paginationData && totalDocs > 0 && (\n <div className={`${baseClass}__pagination`}>\n {paginationData.totalPages > 1 && (\n <Pagination\n hasNextPage={paginationData.hasNextPage}\n hasPrevPage={paginationData.hasPrevPage}\n nextPage={paginationData.nextPage ?? undefined}\n numberOfNeighbors={1}\n onChange={handlePageChange}\n page={paginationData.page}\n prevPage={paginationData.prevPage ?? undefined}\n totalPages={paginationData.totalPages}\n />\n )}\n <span className={`${baseClass}__page-info`}>\n <Translation\n // @ts-expect-error - plugin translations not typed\n i18nKey=\"plugin-import-export:previewPageInfo\"\n t={t}\n variables={{\n end: Math.min((paginationData.page ?? 1) * previewLimit, totalDocs),\n start: ((paginationData.page ?? 1) - 1) * previewLimit + 1,\n total: totalDocs,\n }}\n />\n </span>\n <PerPage\n handleChange={handlePerPageChange}\n limit={previewLimit}\n limits={PREVIEW_LIMIT_OPTIONS}\n />\n </div>\n )}\n </div>\n )\n}\n"],"names":["getTranslation","Pagination","PerPage","Table","Translation","useConfig","useDebouncedEffect","useDocumentInfo","useField","useFormFields","useTranslation","formatDocTitle","fieldAffectsData","getObjectDotNotation","React","useState","useTransition","DEFAULT_PREVIEW_LIMIT","PREVIEW_LIMIT_OPTIONS","baseClass","ImportPreview","isPending","startTransition","config","routes","collectionSlug","i18n","t","value","targetCollectionSlug","path","importMode","matchField","filename","url","mimeType","status","summary","fileField","fields","file","dataToRender","setDataToRender","columns","setColumns","totalDocs","setTotalDocs","error","setError","previewPage","setPreviewPage","previewLimit","setPreviewLimit","paginationData","setPaginationData","collectionConfig","useMemo","collections","find","c","slug","abortController","AbortController","processFileData","format","File","type","name","endsWith","fileData","arrayBuffer","base64","Buffer","from","toString","response","fetch","signal","ok","Error","res","api","body","JSON","stringify","credentials","headers","method","docs","hasNextPage","hasPrevPage","limit","responseLimit","page","responsePage","serverTotalDocs","totalPages","json","nextPage","prevPage","Array","isArray","length","buildColumnsFromFields","parentPath","parentLabel","cols","forEach","field","admin","disabled","fieldPath","label","hasData","some","doc","undefined","push","accessor","active","Heading","renderedCells","map","relationTo","relatedConfig","useAsTitle","titleValue","data","dateFormat","id","labels","singular","item","join","String","option","options","opt","block","blockType","groupLabel","nestedCols","tabs","tab","tabPath","tabLabel","tabCols","fieldColumns","existingAccessors","Set","column","dataFieldOrder","dataFieldsSet","Object","keys","key","has","add","createColumnForField","fieldName","finalColumns","addedAccessors","configColumn","col","err","console","message","aborted","abort","div","className","h3","i18nKey","p","strong","imported","updated","total","issues","issueDetails","style","marginTop","ul","slice","issue","index","li","row","opacity","color","handlePageChange","handlePerPageChange","newLimit","span","variables","count","numberOfNeighbors","onChange","end","Math","min","start","handleChange","limits"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAa,KAAK,EAAE,MAAM,SAAS,CAAA;AAerE,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,
|
|
1
|
+
{"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAa,KAAK,EAAE,MAAM,SAAS,CAAA;AAerE,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,YAAY,SAAgB,gBAAgB,kCA+dxD,CAAA"}
|
|
@@ -54,7 +54,8 @@ export const createExport = async (args)=>{
|
|
|
54
54
|
draft ? {} : publishedWhere
|
|
55
55
|
]
|
|
56
56
|
};
|
|
57
|
-
const
|
|
57
|
+
const baseName = nameArg ?? getFilename();
|
|
58
|
+
const name = `${baseName}-${collectionSlug}.${format}`;
|
|
58
59
|
const isCSV = format === 'csv';
|
|
59
60
|
const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined;
|
|
60
61
|
if (debug) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, TypedUser, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFilename } from '../utilities/getFilename.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { validateLimitValue } from '../utilities/validateLimitValue.js'\nimport { createExportBatchProcessor, type ExportFindArgs } from './batchProcessor.js'\n\nexport type Export = {\n /**\n * Number of documents to process in each batch during export\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n limit?: number\n locale?: string\n /**\n * Maximum number of documents that can be exported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n page?: number\n slug: string\n sort: Sort\n userCollection: string\n userID: number | string\n where?: Where\n}\n\nexport type CreateExportArgs = {\n /**\n * If true, stream the file instead of saving it\n */\n download?: boolean\n req: PayloadRequest\n} & Export\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n id,\n name: nameArg,\n batchSize = 100,\n collectionSlug,\n debug = false,\n download,\n drafts: draftsFromInput,\n exportCollection,\n fields,\n format,\n limit: incomingLimit,\n maxLimit,\n locale: localeFromInput,\n page,\n req,\n sort,\n userCollection,\n userID,\n where: whereFromInput = {},\n } = args\n const { locale: localeFromReq, payload } = req\n\n if (debug) {\n req.payload.logger.debug({\n message: 'Starting export process with args:',\n collectionSlug,\n draft: draftsFromInput,\n fields,\n format,\n })\n }\n\n const locale = localeFromInput ?? localeFromReq\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found.`)\n }\n\n let user: TypedUser | undefined\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n overrideAccess: true,\n })) as TypedUser\n }\n\n if (!user && req.user) {\n user = req?.user?.id ? req.user : req?.user?.user\n }\n\n if (!user) {\n throw new APIError('User authentication is required to create exports.')\n }\n\n const draft = draftsFromInput === 'yes'\n const hasVersions = Boolean(collectionConfig.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = hasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromInput, draft ? {} : publishedWhere],\n }\n\n const name = `${nameArg ?? `${getFilename()}-${collectionSlug}`}.${format}`\n const isCSV = format === 'csv'\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n if (debug) {\n req.payload.logger.debug({ message: 'Export configuration:', name, isCSV, locale })\n }\n\n // Determine maximum export documents:\n // 1. If maxLimit is defined, it sets the absolute ceiling\n // 2. User's limit is applied but clamped to maxLimit if it exceeds it\n let maxExportDocuments: number | undefined\n\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n if (typeof incomingLimit === 'number' && incomingLimit > 0) {\n // User provided a limit - clamp it to maxLimit\n maxExportDocuments = Math.min(incomingLimit, maxLimit)\n } else {\n // No user limit - use maxLimit as the ceiling\n maxExportDocuments = maxLimit\n }\n } else {\n // No maxLimit - use user's limit if provided\n maxExportDocuments =\n typeof incomingLimit === 'number' && incomingLimit > 0 ? incomingLimit : undefined\n }\n\n // Try to count documents - if access is denied, treat as 0 documents\n let totalDocs = 0\n let accessDenied = false\n try {\n const countResult = await payload.count({\n collection: collectionSlug,\n user,\n locale,\n overrideAccess: false,\n })\n totalDocs = countResult.totalDocs\n } catch (error) {\n // Access denied - user can't read from this collection\n // We'll create an empty export file\n accessDenied = true\n if (debug) {\n req.payload.logger.debug({\n message: 'Access denied for collection, creating empty export',\n collectionSlug,\n })\n }\n }\n\n const totalPages = Math.max(1, Math.ceil(totalDocs / batchSize))\n const requestedPage = page || 1\n const adjustedPage = requestedPage > totalPages ? 1 : requestedPage\n\n const findArgs = {\n collection: collectionSlug,\n depth: 1,\n draft,\n limit: batchSize,\n locale,\n overrideAccess: false,\n page: 0,\n select,\n sort,\n user,\n where,\n }\n\n if (debug) {\n req.payload.logger.debug({ message: 'Find arguments:', findArgs })\n }\n\n const toCSVFunctions = getExportFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledMatchers = disabledFields.map(buildDisabledFieldRegex)\n\n const filterDisabledCSV = (row: Record<string, unknown>): Record<string, unknown> => {\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n const isDisabled = disabledMatchers.some((matcher) => matcher.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n const filterDisabledJSON = (doc: any, parentPath = ''): any => {\n if (Array.isArray(doc)) {\n return doc.map((item) => filterDisabledJSON(item, parentPath))\n }\n\n if (typeof doc !== 'object' || doc === null) {\n return doc\n }\n\n const filtered: Record<string, any> = {}\n for (const [key, value] of Object.entries(doc)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key\n\n // Only remove if this exact path is disabled\n const isDisabled = disabledFields.includes(currentPath)\n\n if (!isDisabled) {\n filtered[key] = filterDisabledJSON(value, currentPath)\n }\n }\n\n return filtered\n }\n\n if (download) {\n const limitErrorMsg = validateLimitValue(incomingLimit, req.t)\n if (limitErrorMsg) {\n throw new APIError(limitErrorMsg)\n }\n\n // Get schema-based columns first (provides base ordering and handles empty exports)\n let schemaColumns: string[] = []\n if (isCSV) {\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n if (debug) {\n req.payload.logger.debug({\n columnCount: schemaColumns.length,\n msg: 'Schema-based column inference complete',\n })\n }\n }\n\n // allColumns will be finalized after first batch (schema + data columns merged)\n let allColumns: string[] = []\n let columnsFinalized = false\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let currentBatchPage = adjustedPage\n let fetched = 0\n const maxDocs =\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY\n\n const stream = new Readable({\n async read() {\n const remaining = Math.max(0, maxDocs - fetched)\n\n if (remaining === 0) {\n if (!isCSV) {\n // If first batch with no remaining, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n const result = await payload.find({\n ...findArgs,\n page: currentBatchPage,\n limit: Math.min(batchSize, remaining),\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Streaming batch ${currentBatchPage} with ${result.docs.length} docs`,\n )\n }\n\n if (result.docs.length === 0) {\n // Close JSON array properly if JSON\n if (!isCSV) {\n // If first batch with no docs, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(\n flattenObject({\n doc,\n fields,\n toCSVFunctions,\n }),\n ),\n )\n\n // On first batch, discover additional columns from data and merge with schema\n if (!columnsFinalized) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of batchRows) {\n for (const key of Object.keys(row)) {\n if (!seenCols.has(key)) {\n seenCols.add(key)\n dataColumns.push(key)\n }\n }\n }\n // Merge schema columns with data-discovered columns\n allColumns = mergeColumns(schemaColumns, dataColumns)\n columnsFinalized = true\n\n if (debug) {\n req.payload.logger.debug({\n dataColumnsCount: dataColumns.length,\n finalColumnsCount: allColumns.length,\n msg: 'Merged schema and data columns',\n })\n }\n }\n\n const paddedRows = batchRows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of allColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n const csvString = stringify(paddedRows, {\n bom: isFirstBatch,\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRows.map((row) => JSON.stringify(row)).join(',')\n\n if (isFirstBatch) {\n this.push(encoder.encode('[' + batchJSON))\n } else {\n this.push(encoder.encode(',' + batchJSON))\n }\n }\n\n fetched += result.docs.length\n isFirstBatch = false\n currentBatchPage += 1\n\n if (!result.hasNextPage || fetched >= maxDocs) {\n if (debug) {\n req.payload.logger.debug('Stream complete - no more pages')\n }\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null) // End the stream\n }\n },\n })\n\n return new Response(Readable.toWeb(stream) as ReadableStream, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv' : 'application/json',\n },\n })\n }\n\n // Non-download path (buffered export)\n if (debug) {\n req.payload.logger.debug('Starting file generation')\n }\n\n // Create export batch processor\n const processor = createExportBatchProcessor({ batchSize, debug })\n\n // Transform function based on format\n const transformDoc = (doc: unknown) =>\n isCSV\n ? filterDisabledCSV(\n flattenObject({\n doc,\n fields,\n toCSVFunctions,\n }),\n )\n : filterDisabledJSON(doc)\n\n // Skip fetching if access was denied - we'll create an empty export\n let exportResult = {\n columns: [] as string[],\n docs: [] as Record<string, unknown>[],\n fetchedCount: 0,\n }\n\n if (!accessDenied) {\n exportResult = await processor.processExport({\n collectionSlug,\n findArgs: findArgs as ExportFindArgs,\n format,\n maxDocs:\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY,\n req,\n startPage: adjustedPage,\n transformDoc,\n })\n }\n\n const { columns: dataColumns, docs: rows } = exportResult\n const outputData: string[] = []\n\n // Prepare final output\n if (isCSV) {\n // Get schema-based columns for consistent ordering\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n const schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n // Merge schema columns with data-discovered columns\n // Schema provides ordering, data provides additional columns (e.g., array indices > 0)\n const finalColumns = mergeColumns(schemaColumns, dataColumns)\n\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of finalColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n // Always output CSV with header, even if empty\n outputData.push(\n stringify(paddedRows, {\n bom: true,\n header: true,\n columns: finalColumns,\n }),\n )\n } else {\n // JSON format\n outputData.push(rows.map((doc) => JSON.stringify(doc)).join(',\\n'))\n }\n\n // Ensure we always have valid content for the file\n // For JSON, empty exports produce \"[]\"\n // For CSV, if completely empty (no columns, no rows), produce at least a newline to ensure file creation\n const content = format === 'json' ? `[${outputData.join(',')}]` : outputData.join('')\n const buffer = Buffer.from(content.length > 0 ? content : '\\n')\n if (debug) {\n req.payload.logger.debug(`${format} file generation complete`)\n }\n\n if (!id) {\n if (debug) {\n req.payload.logger.debug('Creating new export file')\n }\n req.file = {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug(`Updating existing export with id: ${id}`)\n }\n await req.payload.update({\n id,\n collection: exportCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n },\n // Override access only here so that we can be sure the export collection itself is updated as expected\n overrideAccess: true,\n req,\n })\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","buildDisabledFieldRegex","flattenObject","getExportFieldFunctions","getFilename","getSchemaColumns","mergeColumns","getSelect","validateLimitValue","createExportBatchProcessor","createExport","args","id","name","nameArg","batchSize","collectionSlug","debug","download","drafts","draftsFromInput","exportCollection","fields","format","limit","incomingLimit","maxLimit","locale","localeFromInput","page","req","sort","userCollection","userID","where","whereFromInput","localeFromReq","payload","logger","message","draft","collectionConfig","config","collections","find","slug","user","findByID","collection","overrideAccess","hasVersions","Boolean","versions","publishedWhere","_status","equals","and","isCSV","select","Array","isArray","length","undefined","maxExportDocuments","Math","min","totalDocs","accessDenied","countResult","count","error","totalPages","max","ceil","requestedPage","adjustedPage","findArgs","depth","toCSVFunctions","flattenedFields","disabledFields","admin","custom","disabledMatchers","map","filterDisabledCSV","row","filtered","key","value","Object","entries","isDisabled","some","matcher","test","filterDisabledJSON","doc","parentPath","item","currentPath","includes","limitErrorMsg","t","schemaColumns","localeCodes","localization","columnCount","msg","allColumns","columnsFinalized","encoder","TextEncoder","isFirstBatch","currentBatchPage","fetched","maxDocs","Number","POSITIVE_INFINITY","stream","read","remaining","push","encode","result","docs","batchRows","dataColumns","seenCols","Set","keys","has","add","dataColumnsCount","finalColumnsCount","paddedRows","fullRow","col","csvString","bom","header","columns","batchJSON","JSON","join","hasNextPage","Response","toWeb","headers","processor","transformDoc","exportResult","fetchedCount","processExport","startPage","rows","outputData","finalColumns","content","buffer","Buffer","from","file","data","mimetype","size","update"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, TypedUser, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFilename } from '../utilities/getFilename.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { validateLimitValue } from '../utilities/validateLimitValue.js'\nimport { createExportBatchProcessor, type ExportFindArgs } from './batchProcessor.js'\n\nexport type Export = {\n /**\n * Number of documents to process in each batch during export\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n limit?: number\n locale?: string\n /**\n * Maximum number of documents that can be exported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n page?: number\n sort?: Sort\n userCollection: string\n userID: number | string\n where?: Where\n}\n\nexport type CreateExportArgs = {\n /**\n * If true, stream the file instead of saving it\n */\n download?: boolean\n req: PayloadRequest\n} & Export\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n id,\n name: nameArg,\n batchSize = 100,\n collectionSlug,\n debug = false,\n download,\n drafts: draftsFromInput,\n exportCollection,\n fields,\n format,\n limit: incomingLimit,\n maxLimit,\n locale: localeFromInput,\n page,\n req,\n sort,\n userCollection,\n userID,\n where: whereFromInput = {},\n } = args\n const { locale: localeFromReq, payload } = req\n\n if (debug) {\n req.payload.logger.debug({\n message: 'Starting export process with args:',\n collectionSlug,\n draft: draftsFromInput,\n fields,\n format,\n })\n }\n\n const locale = localeFromInput ?? localeFromReq\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found.`)\n }\n\n let user: TypedUser | undefined\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n overrideAccess: true,\n })) as TypedUser\n }\n\n if (!user && req.user) {\n user = req?.user?.id ? req.user : req?.user?.user\n }\n\n if (!user) {\n throw new APIError('User authentication is required to create exports.')\n }\n\n const draft = draftsFromInput === 'yes'\n const hasVersions = Boolean(collectionConfig.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = hasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromInput, draft ? {} : publishedWhere],\n }\n\n const baseName = nameArg ?? getFilename()\n const name = `${baseName}-${collectionSlug}.${format}`\n const isCSV = format === 'csv'\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n if (debug) {\n req.payload.logger.debug({ message: 'Export configuration:', name, isCSV, locale })\n }\n\n // Determine maximum export documents:\n // 1. If maxLimit is defined, it sets the absolute ceiling\n // 2. User's limit is applied but clamped to maxLimit if it exceeds it\n let maxExportDocuments: number | undefined\n\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n if (typeof incomingLimit === 'number' && incomingLimit > 0) {\n // User provided a limit - clamp it to maxLimit\n maxExportDocuments = Math.min(incomingLimit, maxLimit)\n } else {\n // No user limit - use maxLimit as the ceiling\n maxExportDocuments = maxLimit\n }\n } else {\n // No maxLimit - use user's limit if provided\n maxExportDocuments =\n typeof incomingLimit === 'number' && incomingLimit > 0 ? incomingLimit : undefined\n }\n\n // Try to count documents - if access is denied, treat as 0 documents\n let totalDocs = 0\n let accessDenied = false\n try {\n const countResult = await payload.count({\n collection: collectionSlug,\n user,\n locale,\n overrideAccess: false,\n })\n totalDocs = countResult.totalDocs\n } catch (error) {\n // Access denied - user can't read from this collection\n // We'll create an empty export file\n accessDenied = true\n if (debug) {\n req.payload.logger.debug({\n message: 'Access denied for collection, creating empty export',\n collectionSlug,\n })\n }\n }\n\n const totalPages = Math.max(1, Math.ceil(totalDocs / batchSize))\n const requestedPage = page || 1\n const adjustedPage = requestedPage > totalPages ? 1 : requestedPage\n\n const findArgs = {\n collection: collectionSlug,\n depth: 1,\n draft,\n limit: batchSize,\n locale,\n overrideAccess: false,\n page: 0,\n select,\n sort,\n user,\n where,\n }\n\n if (debug) {\n req.payload.logger.debug({ message: 'Find arguments:', findArgs })\n }\n\n const toCSVFunctions = getExportFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledMatchers = disabledFields.map(buildDisabledFieldRegex)\n\n const filterDisabledCSV = (row: Record<string, unknown>): Record<string, unknown> => {\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n const isDisabled = disabledMatchers.some((matcher) => matcher.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n const filterDisabledJSON = (doc: any, parentPath = ''): any => {\n if (Array.isArray(doc)) {\n return doc.map((item) => filterDisabledJSON(item, parentPath))\n }\n\n if (typeof doc !== 'object' || doc === null) {\n return doc\n }\n\n const filtered: Record<string, any> = {}\n for (const [key, value] of Object.entries(doc)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key\n\n // Only remove if this exact path is disabled\n const isDisabled = disabledFields.includes(currentPath)\n\n if (!isDisabled) {\n filtered[key] = filterDisabledJSON(value, currentPath)\n }\n }\n\n return filtered\n }\n\n if (download) {\n const limitErrorMsg = validateLimitValue(incomingLimit, req.t)\n if (limitErrorMsg) {\n throw new APIError(limitErrorMsg)\n }\n\n // Get schema-based columns first (provides base ordering and handles empty exports)\n let schemaColumns: string[] = []\n if (isCSV) {\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n if (debug) {\n req.payload.logger.debug({\n columnCount: schemaColumns.length,\n msg: 'Schema-based column inference complete',\n })\n }\n }\n\n // allColumns will be finalized after first batch (schema + data columns merged)\n let allColumns: string[] = []\n let columnsFinalized = false\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let currentBatchPage = adjustedPage\n let fetched = 0\n const maxDocs =\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY\n\n const stream = new Readable({\n async read() {\n const remaining = Math.max(0, maxDocs - fetched)\n\n if (remaining === 0) {\n if (!isCSV) {\n // If first batch with no remaining, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n const result = await payload.find({\n ...findArgs,\n page: currentBatchPage,\n limit: Math.min(batchSize, remaining),\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Streaming batch ${currentBatchPage} with ${result.docs.length} docs`,\n )\n }\n\n if (result.docs.length === 0) {\n // Close JSON array properly if JSON\n if (!isCSV) {\n // If first batch with no docs, output empty array; otherwise just close\n this.push(encoder.encode(isFirstBatch ? '[]' : ']'))\n }\n this.push(null)\n return\n }\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(\n flattenObject({\n doc,\n fields,\n toCSVFunctions,\n }),\n ),\n )\n\n // On first batch, discover additional columns from data and merge with schema\n if (!columnsFinalized) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of batchRows) {\n for (const key of Object.keys(row)) {\n if (!seenCols.has(key)) {\n seenCols.add(key)\n dataColumns.push(key)\n }\n }\n }\n // Merge schema columns with data-discovered columns\n allColumns = mergeColumns(schemaColumns, dataColumns)\n columnsFinalized = true\n\n if (debug) {\n req.payload.logger.debug({\n dataColumnsCount: dataColumns.length,\n finalColumnsCount: allColumns.length,\n msg: 'Merged schema and data columns',\n })\n }\n }\n\n const paddedRows = batchRows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of allColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n const csvString = stringify(paddedRows, {\n bom: isFirstBatch,\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRows.map((row) => JSON.stringify(row)).join(',')\n\n if (isFirstBatch) {\n this.push(encoder.encode('[' + batchJSON))\n } else {\n this.push(encoder.encode(',' + batchJSON))\n }\n }\n\n fetched += result.docs.length\n isFirstBatch = false\n currentBatchPage += 1\n\n if (!result.hasNextPage || fetched >= maxDocs) {\n if (debug) {\n req.payload.logger.debug('Stream complete - no more pages')\n }\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null) // End the stream\n }\n },\n })\n\n return new Response(Readable.toWeb(stream) as ReadableStream, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv' : 'application/json',\n },\n })\n }\n\n // Non-download path (buffered export)\n if (debug) {\n req.payload.logger.debug('Starting file generation')\n }\n\n // Create export batch processor\n const processor = createExportBatchProcessor({ batchSize, debug })\n\n // Transform function based on format\n const transformDoc = (doc: unknown) =>\n isCSV\n ? filterDisabledCSV(\n flattenObject({\n doc,\n fields,\n toCSVFunctions,\n }),\n )\n : filterDisabledJSON(doc)\n\n // Skip fetching if access was denied - we'll create an empty export\n let exportResult = {\n columns: [] as string[],\n docs: [] as Record<string, unknown>[],\n fetchedCount: 0,\n }\n\n if (!accessDenied) {\n exportResult = await processor.processExport({\n collectionSlug,\n findArgs: findArgs as ExportFindArgs,\n format,\n maxDocs:\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY,\n req,\n startPage: adjustedPage,\n transformDoc,\n })\n }\n\n const { columns: dataColumns, docs: rows } = exportResult\n const outputData: string[] = []\n\n // Prepare final output\n if (isCSV) {\n // Get schema-based columns for consistent ordering\n const localeCodes =\n locale === 'all' && payload.config.localization\n ? payload.config.localization.localeCodes\n : undefined\n\n const schemaColumns = getSchemaColumns({\n collectionConfig,\n disabledFields,\n fields,\n locale,\n localeCodes,\n })\n\n // Merge schema columns with data-discovered columns\n // Schema provides ordering, data provides additional columns (e.g., array indices > 0)\n const finalColumns = mergeColumns(schemaColumns, dataColumns)\n\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of finalColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n // Always output CSV with header, even if empty\n outputData.push(\n stringify(paddedRows, {\n bom: true,\n header: true,\n columns: finalColumns,\n }),\n )\n } else {\n // JSON format\n outputData.push(rows.map((doc) => JSON.stringify(doc)).join(',\\n'))\n }\n\n // Ensure we always have valid content for the file\n // For JSON, empty exports produce \"[]\"\n // For CSV, if completely empty (no columns, no rows), produce at least a newline to ensure file creation\n const content = format === 'json' ? `[${outputData.join(',')}]` : outputData.join('')\n const buffer = Buffer.from(content.length > 0 ? content : '\\n')\n if (debug) {\n req.payload.logger.debug(`${format} file generation complete`)\n }\n\n if (!id) {\n if (debug) {\n req.payload.logger.debug('Creating new export file')\n }\n req.file = {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug(`Updating existing export with id: ${id}`)\n }\n await req.payload.update({\n id,\n collection: exportCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n },\n // Override access only here so that we can be sure the export collection itself is updated as expected\n overrideAccess: true,\n req,\n })\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","buildDisabledFieldRegex","flattenObject","getExportFieldFunctions","getFilename","getSchemaColumns","mergeColumns","getSelect","validateLimitValue","createExportBatchProcessor","createExport","args","id","name","nameArg","batchSize","collectionSlug","debug","download","drafts","draftsFromInput","exportCollection","fields","format","limit","incomingLimit","maxLimit","locale","localeFromInput","page","req","sort","userCollection","userID","where","whereFromInput","localeFromReq","payload","logger","message","draft","collectionConfig","config","collections","find","slug","user","findByID","collection","overrideAccess","hasVersions","Boolean","versions","publishedWhere","_status","equals","and","baseName","isCSV","select","Array","isArray","length","undefined","maxExportDocuments","Math","min","totalDocs","accessDenied","countResult","count","error","totalPages","max","ceil","requestedPage","adjustedPage","findArgs","depth","toCSVFunctions","flattenedFields","disabledFields","admin","custom","disabledMatchers","map","filterDisabledCSV","row","filtered","key","value","Object","entries","isDisabled","some","matcher","test","filterDisabledJSON","doc","parentPath","item","currentPath","includes","limitErrorMsg","t","schemaColumns","localeCodes","localization","columnCount","msg","allColumns","columnsFinalized","encoder","TextEncoder","isFirstBatch","currentBatchPage","fetched","maxDocs","Number","POSITIVE_INFINITY","stream","read","remaining","push","encode","result","docs","batchRows","dataColumns","seenCols","Set","keys","has","add","dataColumnsCount","finalColumnsCount","paddedRows","fullRow","col","csvString","bom","header","columns","batchJSON","JSON","join","hasNextPage","Response","toWeb","headers","processor","transformDoc","exportResult","fetchedCount","processExport","startPage","rows","outputData","finalColumns","content","buffer","Buffer","from","file","data","mimetype","size","update"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCreateExportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/export/getCreateExportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,6BAA6B,WAChC,MAAM,KACb,UAAU,CAAC;IACZ,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf,
|
|
1
|
+
{"version":3,"file":"getCreateExportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/export/getCreateExportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,6BAA6B,WAChC,MAAM,KACb,UAAU,CAAC;IACZ,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf,CAkDA,CAAA"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import { createExport } from './createExport.js';
|
|
2
2
|
import { getFields } from './getFields.js';
|
|
3
3
|
export const getCreateCollectionExportTask = (config)=>{
|
|
4
|
-
|
|
4
|
+
// Job queue task needs all collection slugs since it can handle exports for any collection
|
|
5
|
+
const allCollectionSlugs = config.collections?.map((c)=>c.slug) || [];
|
|
6
|
+
const inputSchema = getFields({
|
|
7
|
+
collectionSlugs: allCollectionSlugs,
|
|
8
|
+
config
|
|
9
|
+
}).concat({
|
|
10
|
+
name: 'id',
|
|
11
|
+
type: 'text'
|
|
12
|
+
}, {
|
|
13
|
+
name: 'batchSize',
|
|
14
|
+
type: 'number'
|
|
15
|
+
}, {
|
|
5
16
|
name: 'userID',
|
|
6
17
|
type: 'text'
|
|
7
18
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export/getCreateExportCollectionTask.ts"],"sourcesContent":["import type { Config, TaskConfig } from 'payload'\n\nimport type { Export } from './createExport.js'\n\nimport { createExport } from './createExport.js'\nimport { getFields } from './getFields.js'\n\n/**\n * Export input type for job queue serialization.\n * When exports are queued as jobs, the user must be serialized as an ID string or number\n * along with the collection name so it can be rehydrated when the job runs.\n */\nexport type ExportJobInput = {\n user: number | string\n userCollection: string\n} & Export\n\nexport const getCreateCollectionExportTask = (\n config: Config,\n): TaskConfig<{\n input: ExportJobInput\n output: object\n}> => {\n const inputSchema = getFields(config).concat(\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'exportCollection',\n type: 'text',\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n )\n\n return {\n slug: 'createCollectionExport',\n handler: async ({ input, req }) => {\n if (!input) {\n req.payload.logger.error('No input provided to createCollectionExport task')\n\n return { output: {} }\n }\n\n await createExport({\n ...input,\n req,\n })\n\n return {\n output: {},\n }\n },\n inputSchema,\n }\n}\n"],"names":["createExport","getFields","getCreateCollectionExportTask","config","inputSchema","concat","name","type","
|
|
1
|
+
{"version":3,"sources":["../../src/export/getCreateExportCollectionTask.ts"],"sourcesContent":["import type { Config, TaskConfig } from 'payload'\n\nimport type { Export } from './createExport.js'\n\nimport { createExport } from './createExport.js'\nimport { getFields } from './getFields.js'\n\n/**\n * Export input type for job queue serialization.\n * When exports are queued as jobs, the user must be serialized as an ID string or number\n * along with the collection name so it can be rehydrated when the job runs.\n */\nexport type ExportJobInput = {\n user: number | string\n userCollection: string\n} & Export\n\nexport const getCreateCollectionExportTask = (\n config: Config,\n): TaskConfig<{\n input: ExportJobInput\n output: object\n}> => {\n // Job queue task needs all collection slugs since it can handle exports for any collection\n const allCollectionSlugs = config.collections?.map((c) => c.slug) || []\n const inputSchema = getFields({ collectionSlugs: allCollectionSlugs, config }).concat(\n {\n name: 'id',\n type: 'text',\n },\n {\n name: 'batchSize',\n type: 'number',\n },\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'exportCollection',\n type: 'text',\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n )\n\n return {\n slug: 'createCollectionExport',\n handler: async ({ input, req }) => {\n if (!input) {\n req.payload.logger.error('No input provided to createCollectionExport task')\n\n return { output: {} }\n }\n\n await createExport({\n ...input,\n req,\n })\n\n return {\n output: {},\n }\n },\n inputSchema,\n }\n}\n"],"names":["createExport","getFields","getCreateCollectionExportTask","config","allCollectionSlugs","collections","map","c","slug","inputSchema","collectionSlugs","concat","name","type","handler","input","req","payload","logger","error","output"],"mappings":"AAIA,SAASA,YAAY,QAAQ,oBAAmB;AAChD,SAASC,SAAS,QAAQ,iBAAgB;AAY1C,OAAO,MAAMC,gCAAgC,CAC3CC;IAKA,2FAA2F;IAC3F,MAAMC,qBAAqBD,OAAOE,WAAW,EAAEC,IAAI,CAACC,IAAMA,EAAEC,IAAI,KAAK,EAAE;IACvE,MAAMC,cAAcR,UAAU;QAAES,iBAAiBN;QAAoBD;IAAO,GAAGQ,MAAM,CACnF;QACEC,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR,GACA;QACED,MAAM;QACNC,MAAM;IACR;IAGF,OAAO;QACLL,MAAM;QACNM,SAAS,OAAO,EAAEC,KAAK,EAAEC,GAAG,EAAE;YAC5B,IAAI,CAACD,OAAO;gBACVC,IAAIC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;gBAEzB,OAAO;oBAAEC,QAAQ,CAAC;gBAAE;YACtB;YAEA,MAAMpB,aAAa;gBACjB,GAAGe,KAAK;gBACRC;YACF;YAEA,OAAO;gBACLI,QAAQ,CAAC;YACX;QACF;QACAX;IACF;AACF,EAAC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { CollectionConfig, Config } from 'payload';
|
|
2
2
|
import type { ExportConfig, ImportExportPluginConfig } from '../types.js';
|
|
3
|
-
export declare const getExportCollection: ({ config, exportConfig, pluginConfig, }: {
|
|
3
|
+
export declare const getExportCollection: ({ collectionSlugs, config, exportConfig, pluginConfig, }: {
|
|
4
|
+
/**
|
|
5
|
+
* Collection slugs that this export collection supports.
|
|
6
|
+
*/
|
|
7
|
+
collectionSlugs: string[];
|
|
4
8
|
config: Config;
|
|
5
9
|
exportConfig?: ExportConfig;
|
|
6
10
|
pluginConfig: ImportExportPluginConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getExportCollection.d.ts","sourceRoot":"","sources":["../../src/export/getExportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,MAAM,EACP,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAS,MAAM,aAAa,CAAA;AAShF,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"getExportCollection.d.ts","sourceRoot":"","sources":["../../src/export/getExportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,MAAM,EACP,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAS,MAAM,aAAa,CAAA;AAShF,eAAO,MAAM,mBAAmB,6DAK7B;IACD;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBAuIH,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { createExport } from './createExport.js';
|
|
|
3
3
|
import { getFields } from './getFields.js';
|
|
4
4
|
import { handleDownload } from './handleDownload.js';
|
|
5
5
|
import { handlePreview } from './handlePreview.js';
|
|
6
|
-
export const getExportCollection = ({ config, exportConfig, pluginConfig })=>{
|
|
6
|
+
export const getExportCollection = ({ collectionSlugs, config, exportConfig, pluginConfig })=>{
|
|
7
7
|
const beforeOperation = [];
|
|
8
8
|
const afterChange = [];
|
|
9
9
|
// Extract export-specific settings
|
|
@@ -26,7 +26,10 @@ export const getExportCollection = ({ config, exportConfig, pluginConfig })=>{
|
|
|
26
26
|
custom: {
|
|
27
27
|
disableDownload,
|
|
28
28
|
disableSave,
|
|
29
|
-
format
|
|
29
|
+
format,
|
|
30
|
+
'plugin-import-export': {
|
|
31
|
+
collectionSlugs
|
|
32
|
+
}
|
|
30
33
|
},
|
|
31
34
|
disableCopyToLocale: true,
|
|
32
35
|
group: false,
|
|
@@ -45,7 +48,9 @@ export const getExportCollection = ({ config, exportConfig, pluginConfig })=>{
|
|
|
45
48
|
path: '/export-preview'
|
|
46
49
|
}
|
|
47
50
|
],
|
|
48
|
-
fields: getFields(
|
|
51
|
+
fields: getFields({
|
|
52
|
+
collectionSlugs,
|
|
53
|
+
config,
|
|
49
54
|
format
|
|
50
55
|
}),
|
|
51
56
|
hooks: {
|
|
@@ -101,12 +106,22 @@ export const getExportCollection = ({ config, exportConfig, pluginConfig })=>{
|
|
|
101
106
|
req
|
|
102
107
|
});
|
|
103
108
|
const input = {
|
|
104
|
-
|
|
109
|
+
id: doc.id,
|
|
110
|
+
name: doc.name,
|
|
105
111
|
batchSize,
|
|
112
|
+
collectionSlug: doc.collectionSlug,
|
|
113
|
+
drafts: doc.drafts,
|
|
106
114
|
exportCollection: collectionConfig.slug,
|
|
115
|
+
fields: doc.fields,
|
|
116
|
+
format: doc.format,
|
|
117
|
+
limit: doc.limit,
|
|
118
|
+
locale: doc.locale,
|
|
107
119
|
maxLimit,
|
|
120
|
+
page: doc.page,
|
|
121
|
+
sort: doc.sort,
|
|
108
122
|
userCollection: user?.collection || user?.user?.collection,
|
|
109
|
-
userID: user?.id || user?.user?.id
|
|
123
|
+
userID: user?.id || user?.user?.id,
|
|
124
|
+
where: doc.where
|
|
110
125
|
};
|
|
111
126
|
await req.payload.jobs.queue({
|
|
112
127
|
input,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export/getExportCollection.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionBeforeOperationHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport type { ExportConfig, ImportExportPluginConfig, Limit } from '../types.js'\nimport type { Export } from './createExport.js'\n\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\nimport { getFields } from './getFields.js'\nimport { handleDownload } from './handleDownload.js'\nimport { handlePreview } from './handlePreview.js'\n\nexport const getExportCollection = ({\n config,\n exportConfig,\n pluginConfig,\n}: {\n config: Config\n exportConfig?: ExportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const beforeOperation: CollectionBeforeOperationHook[] = []\n const afterChange: CollectionAfterChangeHook[] = []\n\n // Extract export-specific settings\n const disableDownload = exportConfig?.disableDownload ?? false\n const disableSave = exportConfig?.disableSave ?? false\n const disableJobsQueue = exportConfig?.disableJobsQueue ?? false\n const batchSize = exportConfig?.batchSize ?? 100\n const format = exportConfig?.format\n\n const collection: CollectionConfig = {\n slug: 'exports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ExportSaveButton',\n },\n },\n custom: {\n disableDownload,\n disableSave,\n format,\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'name',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: (req) => handleDownload(req, pluginConfig.debug),\n method: 'post',\n path: '/download',\n },\n {\n handler: handlePreview,\n method: 'post',\n path: '/export-preview',\n },\n ],\n fields: getFields(config,
|
|
1
|
+
{"version":3,"sources":["../../src/export/getExportCollection.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionBeforeOperationHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport type { ExportConfig, ImportExportPluginConfig, Limit } from '../types.js'\nimport type { Export } from './createExport.js'\n\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\nimport { getFields } from './getFields.js'\nimport { handleDownload } from './handleDownload.js'\nimport { handlePreview } from './handlePreview.js'\n\nexport const getExportCollection = ({\n collectionSlugs,\n config,\n exportConfig,\n pluginConfig,\n}: {\n /**\n * Collection slugs that this export collection supports.\n */\n collectionSlugs: string[]\n config: Config\n exportConfig?: ExportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const beforeOperation: CollectionBeforeOperationHook[] = []\n const afterChange: CollectionAfterChangeHook[] = []\n\n // Extract export-specific settings\n const disableDownload = exportConfig?.disableDownload ?? false\n const disableSave = exportConfig?.disableSave ?? false\n const disableJobsQueue = exportConfig?.disableJobsQueue ?? false\n const batchSize = exportConfig?.batchSize ?? 100\n const format = exportConfig?.format\n\n const collection: CollectionConfig = {\n slug: 'exports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ExportSaveButton',\n },\n },\n custom: {\n disableDownload,\n disableSave,\n format,\n 'plugin-import-export': {\n collectionSlugs,\n },\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'name',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: (req) => handleDownload(req, pluginConfig.debug),\n method: 'post',\n path: '/download',\n },\n {\n handler: handlePreview,\n method: 'post',\n path: '/export-preview',\n },\n ],\n fields: getFields({ collectionSlugs, config, format }),\n hooks: {\n afterChange,\n beforeOperation,\n },\n lockDocuments: false,\n upload: {\n filesRequiredOnCreate: false,\n hideFileInputOnCreate: true,\n hideRemoveFile: true,\n },\n }\n\n if (disableJobsQueue) {\n beforeOperation.push(async ({ args, collection: collectionConfig, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n const { user } = req\n const debug = pluginConfig.debug\n\n // Get max limit from the target collection's config\n const exportData = args.data as Export\n const targetCollection = req.payload.collections[exportData.collectionSlug]\n const exportLimitConfig: Limit | undefined =\n targetCollection?.config.custom?.['plugin-import-export']?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n await createExport({\n ...exportData,\n batchSize,\n debug,\n exportCollection: collectionConfig.slug,\n maxLimit,\n req,\n userCollection: user?.collection || user?.user?.collection,\n userID: user?.id || user?.user?.id,\n })\n })\n } else {\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const { user } = req\n\n // Get max limit from the target collection's config\n // For job-based exports, we resolve the limit now since function limits\n // cannot be serialized. This means dynamic limits are resolved at queue time.\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const exportLimitConfig: Limit | undefined =\n targetCollection?.config.custom?.['plugin-import-export']?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const input: Export = {\n id: doc.id,\n name: doc.name,\n batchSize,\n collectionSlug: doc.collectionSlug,\n drafts: doc.drafts,\n exportCollection: collectionConfig.slug,\n fields: doc.fields,\n format: doc.format,\n limit: doc.limit,\n locale: doc.locale,\n maxLimit,\n page: doc.page,\n sort: doc.sort,\n userCollection: user?.collection || user?.user?.collection,\n userID: user?.id || user?.user?.id,\n where: doc.where,\n }\n\n await req.payload.jobs.queue({\n input,\n task: 'createCollectionExport',\n })\n })\n }\n\n return collection\n}\n"],"names":["resolveLimit","createExport","getFields","handleDownload","handlePreview","getExportCollection","collectionSlugs","config","exportConfig","pluginConfig","beforeOperation","afterChange","disableDownload","disableSave","disableJobsQueue","batchSize","format","collection","slug","access","update","admin","components","edit","SaveButton","custom","disableCopyToLocale","group","useAsTitle","disableDuplicate","endpoints","handler","req","debug","method","path","fields","hooks","lockDocuments","upload","filesRequiredOnCreate","hideFileInputOnCreate","hideRemoveFile","push","args","collectionConfig","operation","user","exportData","data","targetCollection","payload","collections","collectionSlug","exportLimitConfig","exportLimit","maxLimit","limit","exportCollection","userCollection","userID","id","doc","input","name","drafts","locale","page","sort","where","jobs","queue","task"],"mappings":"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"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import type { Config, Field } from 'payload';
|
|
2
2
|
type GetFieldsOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Collection slugs that this export collection supports.
|
|
5
|
+
* Used for schema/types and as the options in the select field.
|
|
6
|
+
*/
|
|
7
|
+
collectionSlugs: string[];
|
|
8
|
+
config: Config;
|
|
3
9
|
/**
|
|
4
10
|
* Force a specific format, hiding the format dropdown
|
|
5
11
|
*/
|
|
6
12
|
format?: 'csv' | 'json';
|
|
7
13
|
};
|
|
8
|
-
export declare const getFields: (
|
|
14
|
+
export declare const getFields: (options: GetFieldsOptions) => Field[];
|
|
9
15
|
export {};
|
|
10
16
|
//# sourceMappingURL=getFields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/export/getFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/export/getFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAA+B,MAAM,SAAS,CAAA;AAKzE,KAAK,gBAAgB,GAAG;IACtB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,gBAAgB,KAAG,KAAK,EA4Q1D,CAAA"}
|
package/dist/export/getFields.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getFilename } from '../utilities/getFilename.js';
|
|
2
2
|
import { validateLimitValue } from '../utilities/validateLimitValue.js';
|
|
3
|
-
export const getFields = (
|
|
4
|
-
const format = options
|
|
3
|
+
export const getFields = (options)=>{
|
|
4
|
+
const { collectionSlugs, config, format } = options;
|
|
5
5
|
let localeField;
|
|
6
6
|
if (config.localization) {
|
|
7
7
|
localeField = {
|
|
@@ -212,7 +212,19 @@ export const getFields = (config, options)=>{
|
|
|
212
212
|
Field: '@payloadcms/plugin-import-export/rsc#CollectionField'
|
|
213
213
|
}
|
|
214
214
|
},
|
|
215
|
-
|
|
215
|
+
defaultValue: collectionSlugs[0],
|
|
216
|
+
required: true,
|
|
217
|
+
validate: (value, { req })=>{
|
|
218
|
+
if (!value) {
|
|
219
|
+
return 'Collection is required';
|
|
220
|
+
}
|
|
221
|
+
// Validate that the collection exists
|
|
222
|
+
const collectionExists = req?.payload?.collections?.[value];
|
|
223
|
+
if (!collectionExists) {
|
|
224
|
+
return `Collection "${value}" does not exist`;
|
|
225
|
+
}
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
216
228
|
},
|
|
217
229
|
{
|
|
218
230
|
name: 'where',
|