@payloadcms/plugin-import-export 3.71.0-internal.ef75fa0 → 3.71.0
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.map +1 -1
- package/dist/components/CollectionField/index.js +8 -3
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/ExportListMenuItem/index.d.ts +0 -1
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +0 -1
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.d.ts +4 -0
- package/dist/components/ExportPreview/index.d.ts.map +1 -0
- package/dist/components/ExportPreview/index.js +252 -0
- package/dist/components/ExportPreview/index.js.map +1 -0
- package/dist/components/ExportPreview/index.scss +36 -0
- package/dist/components/ImportCollectionField/index.d.ts +3 -0
- package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
- package/dist/components/ImportCollectionField/index.js +17 -0
- package/dist/components/ImportCollectionField/index.js.map +1 -0
- package/dist/components/ImportListMenuItem/index.d.ts +6 -0
- package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
- package/dist/components/ImportListMenuItem/index.js +48 -0
- package/dist/components/ImportListMenuItem/index.js.map +1 -0
- package/dist/components/ImportPreview/index.d.ts +4 -0
- package/dist/components/ImportPreview/index.d.ts.map +1 -0
- package/dist/components/ImportPreview/index.js +624 -0
- package/dist/components/ImportPreview/index.js.map +1 -0
- package/dist/components/ImportPreview/index.scss +41 -0
- package/dist/components/ImportSaveButton/index.d.ts +2 -0
- package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
- package/dist/components/ImportSaveButton/index.js +18 -0
- package/dist/components/ImportSaveButton/index.js.map +1 -0
- package/dist/components/Page/index.scss +4 -2
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/export/batchProcessor.d.ts +107 -0
- package/dist/export/batchProcessor.d.ts.map +1 -0
- package/dist/export/batchProcessor.js +187 -0
- package/dist/export/batchProcessor.js.map +1 -0
- package/dist/export/createExport.d.ts +9 -4
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +163 -111
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts +1 -2
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +10 -18
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts +8 -0
- package/dist/export/getExportCollection.d.ts.map +1 -0
- package/dist/export/getExportCollection.js +100 -0
- package/dist/export/getExportCollection.js.map +1 -0
- package/dist/export/getFields.d.ts +8 -2
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +7 -9
- package/dist/export/getFields.js.map +1 -1
- package/dist/export/handleDownload.d.ts +3 -0
- package/dist/export/handleDownload.d.ts.map +1 -0
- package/dist/export/handleDownload.js +42 -0
- package/dist/export/handleDownload.js.map +1 -0
- package/dist/export/handlePreview.d.ts +3 -0
- package/dist/export/handlePreview.d.ts.map +1 -0
- package/dist/export/handlePreview.js +163 -0
- package/dist/export/handlePreview.js.map +1 -0
- package/dist/exports/rsc.d.ts +5 -1
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +5 -1
- package/dist/exports/rsc.js.map +1 -1
- package/dist/import/batchProcessor.d.ts +46 -0
- package/dist/import/batchProcessor.d.ts.map +1 -0
- package/dist/import/batchProcessor.js +529 -0
- package/dist/import/batchProcessor.js.map +1 -0
- package/dist/import/createImport.d.ts +45 -0
- package/dist/import/createImport.d.ts.map +1 -0
- package/dist/import/createImport.js +175 -0
- package/dist/import/createImport.js.map +1 -0
- package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
- package/dist/import/getCreateImportCollectionTask.js +81 -0
- package/dist/import/getCreateImportCollectionTask.js.map +1 -0
- package/dist/import/getFields.d.ts +7 -0
- package/dist/import/getFields.d.ts.map +1 -0
- package/dist/import/getFields.js +150 -0
- package/dist/import/getFields.js.map +1 -0
- package/dist/import/getImportCollection.d.ts +8 -0
- package/dist/import/getImportCollection.d.ts.map +1 -0
- package/dist/import/getImportCollection.js +258 -0
- package/dist/import/getImportCollection.js.map +1 -0
- package/dist/import/handlePreview.d.ts +3 -0
- package/dist/import/handlePreview.d.ts.map +1 -0
- package/dist/import/handlePreview.js +94 -0
- package/dist/import/handlePreview.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -110
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/ar.js +21 -1
- package/dist/translations/languages/ar.js.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/az.js +21 -1
- package/dist/translations/languages/az.js.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/bg.js +21 -1
- package/dist/translations/languages/bg.js.map +1 -1
- package/dist/translations/languages/bnBd.d.ts +4 -0
- package/dist/translations/languages/bnBd.d.ts.map +1 -0
- package/dist/translations/languages/bnBd.js +48 -0
- package/dist/translations/languages/bnBd.js.map +1 -0
- package/dist/translations/languages/bnIn.d.ts +4 -0
- package/dist/translations/languages/bnIn.d.ts.map +1 -0
- package/dist/translations/languages/bnIn.js +48 -0
- package/dist/translations/languages/bnIn.js.map +1 -0
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/ca.js +21 -1
- package/dist/translations/languages/ca.js.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/cs.js +21 -1
- package/dist/translations/languages/cs.js.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/da.js +21 -1
- package/dist/translations/languages/da.js.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/de.js +21 -1
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +20 -0
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +21 -1
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/es.js +21 -1
- package/dist/translations/languages/es.js.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/et.js +21 -1
- package/dist/translations/languages/et.js.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fa.js +21 -1
- package/dist/translations/languages/fa.js.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/fr.js +21 -1
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/he.js +21 -1
- package/dist/translations/languages/he.js.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hr.js +21 -1
- package/dist/translations/languages/hr.js.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hu.js +21 -1
- package/dist/translations/languages/hu.js.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/hy.js +21 -1
- package/dist/translations/languages/hy.js.map +1 -1
- package/dist/translations/languages/id.d.ts +4 -0
- package/dist/translations/languages/id.d.ts.map +1 -0
- package/dist/translations/languages/id.js +48 -0
- package/dist/translations/languages/id.js.map +1 -0
- package/dist/translations/languages/is.d.ts.map +1 -1
- package/dist/translations/languages/is.js +21 -1
- package/dist/translations/languages/is.js.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/it.js +21 -1
- package/dist/translations/languages/it.js.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ja.js +21 -1
- package/dist/translations/languages/ja.js.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/ko.js +21 -1
- package/dist/translations/languages/ko.js.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/lt.js +21 -1
- package/dist/translations/languages/lt.js.map +1 -1
- package/dist/translations/languages/lv.d.ts.map +1 -1
- package/dist/translations/languages/lv.js +26 -6
- package/dist/translations/languages/lv.js.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/my.js +21 -1
- package/dist/translations/languages/my.js.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nb.js +21 -1
- package/dist/translations/languages/nb.js.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/nl.js +21 -1
- package/dist/translations/languages/nl.js.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pl.js +21 -1
- package/dist/translations/languages/pl.js.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/pt.js +21 -1
- package/dist/translations/languages/pt.js.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/ro.js +21 -1
- package/dist/translations/languages/ro.js.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rs.js +21 -1
- package/dist/translations/languages/rs.js.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.js +21 -1
- package/dist/translations/languages/rsLatin.js.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/ru.js +21 -1
- package/dist/translations/languages/ru.js.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sk.js +21 -1
- package/dist/translations/languages/sk.js.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sl.js +21 -1
- package/dist/translations/languages/sl.js.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/sv.js +21 -1
- package/dist/translations/languages/sv.js.map +1 -1
- package/dist/translations/languages/ta.d.ts.map +1 -1
- package/dist/translations/languages/ta.js +21 -1
- package/dist/translations/languages/ta.js.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/th.js +21 -1
- package/dist/translations/languages/th.js.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/tr.js +21 -1
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +21 -1
- package/dist/translations/languages/uk.js.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/vi.js +21 -1
- package/dist/translations/languages/vi.js.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zh.js +21 -1
- package/dist/translations/languages/zh.js.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.js +21 -1
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/translations/types.d.ts +13 -0
- package/dist/translations/types.d.ts.map +1 -1
- package/dist/translations/types.js.map +1 -1
- package/dist/types.d.ts +166 -22
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/flattenObject.d.ts +11 -0
- package/dist/utilities/flattenObject.d.ts.map +1 -0
- package/dist/utilities/flattenObject.js +129 -0
- package/dist/utilities/flattenObject.js.map +1 -0
- package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getExportFieldFunctions.js +102 -0
- package/dist/utilities/getExportFieldFunctions.js.map +1 -0
- package/dist/utilities/getFilename.d.ts +6 -0
- package/dist/utilities/getFilename.d.ts.map +1 -0
- package/dist/utilities/getFilename.js +13 -0
- package/dist/utilities/getFilename.js.map +1 -0
- package/dist/utilities/getFlattenedFieldKeys.d.ts +12 -1
- package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
- package/dist/utilities/getFlattenedFieldKeys.js +35 -10
- package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getImportFieldFunctions.js +130 -0
- package/dist/utilities/getImportFieldFunctions.js.map +1 -0
- package/dist/utilities/getPluginCollections.d.ts +39 -0
- package/dist/utilities/getPluginCollections.d.ts.map +1 -0
- package/dist/utilities/getPluginCollections.js +102 -0
- package/dist/utilities/getPluginCollections.js.map +1 -0
- package/dist/utilities/getSchemaColumns.d.ts +43 -0
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
- package/dist/utilities/getSchemaColumns.js +163 -0
- package/dist/utilities/getSchemaColumns.js.map +1 -0
- package/dist/utilities/getSelect.d.ts +11 -0
- package/dist/utilities/getSelect.d.ts.map +1 -0
- package/dist/utilities/getSelect.js +27 -0
- package/dist/utilities/getSelect.js.map +1 -0
- package/dist/utilities/parseCSV.d.ts +11 -0
- package/dist/utilities/parseCSV.d.ts.map +1 -0
- package/dist/utilities/parseCSV.js +67 -0
- package/dist/utilities/parseCSV.js.map +1 -0
- package/dist/utilities/parseCSV.spec.js +169 -0
- package/dist/utilities/parseCSV.spec.js.map +1 -0
- package/dist/utilities/parseJSON.d.ts +11 -0
- package/dist/utilities/parseJSON.d.ts.map +1 -0
- package/dist/utilities/parseJSON.js +25 -0
- package/dist/utilities/parseJSON.js.map +1 -0
- package/dist/utilities/processRichTextField.d.ts +6 -0
- package/dist/utilities/processRichTextField.d.ts.map +1 -0
- package/dist/utilities/processRichTextField.js +45 -0
- package/dist/utilities/processRichTextField.js.map +1 -0
- package/dist/utilities/unflattenObject.d.ts +11 -0
- package/dist/utilities/unflattenObject.d.ts.map +1 -0
- package/dist/utilities/unflattenObject.js +431 -0
- package/dist/utilities/unflattenObject.js.map +1 -0
- package/dist/utilities/unflattenObject.spec.js +680 -0
- package/dist/utilities/unflattenObject.spec.js.map +1 -0
- package/dist/utilities/useBatchProcessor.d.ts +103 -0
- package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
- package/dist/utilities/useBatchProcessor.js +88 -0
- package/dist/utilities/useBatchProcessor.js.map +1 -0
- package/dist/utilities/validateLimitValue.d.ts +1 -1
- package/dist/utilities/validateLimitValue.d.ts.map +1 -1
- package/dist/utilities/validateLimitValue.js +1 -4
- package/dist/utilities/validateLimitValue.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +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 } 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 = getValueAtPath(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 = getValueAtPath(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\n// Helper function to get nested values\nconst getValueAtPath = (obj: Record<string, unknown>, path: string): unknown => {\n const segments = path.split('.')\n let current: any = obj\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined\n }\n current = current[segment]\n }\n\n return current\n}\n"],"names":["getTranslation","Pagination","PerPage","Table","Translation","useConfig","useDebouncedEffect","useDocumentInfo","useField","useFormFields","useTranslation","formatDocTitle","fieldAffectsData","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","getValueAtPath","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","obj","segments","split","current","segment"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
@layer payload-default {
|
|
2
|
+
.import-preview {
|
|
3
|
+
&__header {
|
|
4
|
+
display: flex;
|
|
5
|
+
justify-content: space-between;
|
|
6
|
+
align-items: flex-end;
|
|
7
|
+
margin-bottom: 10px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
&__info {
|
|
11
|
+
font-size: var(--font-size-small);
|
|
12
|
+
color: var(--theme-elevation-500);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
&__import-count {
|
|
16
|
+
font-size: var(--font-size-small);
|
|
17
|
+
color: var(--theme-elevation-500);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&__pagination {
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: space-between;
|
|
24
|
+
gap: var(--base);
|
|
25
|
+
margin-top: var(--base);
|
|
26
|
+
padding-top: var(--base);
|
|
27
|
+
border-top: 1px solid var(--theme-elevation-100);
|
|
28
|
+
|
|
29
|
+
// When only PerPage is present (no Pagination), keep it on the right
|
|
30
|
+
.per-page:only-child {
|
|
31
|
+
margin-left: auto;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
&__page-info {
|
|
36
|
+
font-size: var(--font-size-small);
|
|
37
|
+
color: var(--theme-elevation-500);
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ImportSaveButton/index.tsx"],"names":[],"mappings":"AASA,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAUpC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { SaveButton, useField, useTranslation } from '@payloadcms/ui';
|
|
4
|
+
export const ImportSaveButton = ()=>{
|
|
5
|
+
const { t } = useTranslation();
|
|
6
|
+
const { value: status } = useField({
|
|
7
|
+
path: 'status'
|
|
8
|
+
});
|
|
9
|
+
// Only show the button if status is pending
|
|
10
|
+
if (status !== 'pending') {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return /*#__PURE__*/ _jsx(SaveButton, {
|
|
14
|
+
label: t('plugin-import-export:startImport')
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ImportSaveButton/index.tsx"],"sourcesContent":["'use client'\n\nimport { SaveButton, useField, useTranslation } from '@payloadcms/ui'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nexport const ImportSaveButton: React.FC = () => {\n const { t } = useTranslation<PluginImportExportTranslations, PluginImportExportTranslationKeys>()\n const { value: status } = useField<string>({ path: 'status' })\n\n // Only show the button if status is pending\n if (status !== 'pending') {\n return null\n }\n\n return <SaveButton label={t('plugin-import-export:startImport')} />\n}\n"],"names":["SaveButton","useField","useTranslation","ImportSaveButton","t","value","status","path","label"],"mappings":"AAAA;;AAEA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,iBAAgB;AAOrE,OAAO,MAAMC,mBAA6B;IACxC,MAAM,EAAEC,CAAC,EAAE,GAAGF;IACd,MAAM,EAAEG,OAAOC,MAAM,EAAE,GAAGL,SAAiB;QAAEM,MAAM;IAAS;IAE5D,4CAA4C;IAC5C,IAAID,WAAW,WAAW;QACxB,OAAO;IACT;IAEA,qBAAO,KAACN;QAAWQ,OAAOJ,EAAE;;AAC9B,EAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default number of documents to show per page in preview
|
|
3
|
+
*/
|
|
4
|
+
export declare const DEFAULT_PREVIEW_LIMIT = 10;
|
|
5
|
+
/**
|
|
6
|
+
* Available options for preview per-page selector
|
|
7
|
+
*/
|
|
8
|
+
export declare const PREVIEW_LIMIT_OPTIONS: number[];
|
|
9
|
+
/**
|
|
10
|
+
* Maximum allowed preview limit to prevent performance issues
|
|
11
|
+
*/
|
|
12
|
+
export declare const MAX_PREVIEW_LIMIT = 100;
|
|
13
|
+
/**
|
|
14
|
+
* Minimum allowed preview limit
|
|
15
|
+
*/
|
|
16
|
+
export declare const MIN_PREVIEW_LIMIT = 1;
|
|
17
|
+
/**
|
|
18
|
+
* Minimum allowed preview page
|
|
19
|
+
*/
|
|
20
|
+
export declare const MIN_PREVIEW_PAGE = 1;
|
|
21
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAEvC;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAAiB,CAAA;AAE3D;;GAEG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAElC;;GAEG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default number of documents to show per page in preview
|
|
3
|
+
*/ export const DEFAULT_PREVIEW_LIMIT = 10;
|
|
4
|
+
/**
|
|
5
|
+
* Available options for preview per-page selector
|
|
6
|
+
*/ export const PREVIEW_LIMIT_OPTIONS = [
|
|
7
|
+
10,
|
|
8
|
+
25,
|
|
9
|
+
50
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Maximum allowed preview limit to prevent performance issues
|
|
13
|
+
*/ export const MAX_PREVIEW_LIMIT = 100;
|
|
14
|
+
/**
|
|
15
|
+
* Minimum allowed preview limit
|
|
16
|
+
*/ export const MIN_PREVIEW_LIMIT = 1;
|
|
17
|
+
/**
|
|
18
|
+
* Minimum allowed preview page
|
|
19
|
+
*/ export const MIN_PREVIEW_PAGE = 1;
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/**\n * Default number of documents to show per page in preview\n */\nexport const DEFAULT_PREVIEW_LIMIT = 10\n\n/**\n * Available options for preview per-page selector\n */\nexport const PREVIEW_LIMIT_OPTIONS: number[] = [10, 25, 50]\n\n/**\n * Maximum allowed preview limit to prevent performance issues\n */\nexport const MAX_PREVIEW_LIMIT = 100\n\n/**\n * Minimum allowed preview limit\n */\nexport const MIN_PREVIEW_LIMIT = 1\n\n/**\n * Minimum allowed preview page\n */\nexport const MIN_PREVIEW_PAGE = 1\n"],"names":["DEFAULT_PREVIEW_LIMIT","PREVIEW_LIMIT_OPTIONS","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE"],"mappings":"AAAA;;CAEC,GACD,OAAO,MAAMA,wBAAwB,GAAE;AAEvC;;CAEC,GACD,OAAO,MAAMC,wBAAkC;IAAC;IAAI;IAAI;CAAG,CAAA;AAE3D;;CAEC,GACD,OAAO,MAAMC,oBAAoB,IAAG;AAEpC;;CAEC,GACD,OAAO,MAAMC,oBAAoB,EAAC;AAElC;;CAEC,GACD,OAAO,MAAMC,mBAAmB,EAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export-specific batch processor for processing documents in batches during export.
|
|
3
|
+
* Uses the generic batch processing utilities from useBatchProcessor.
|
|
4
|
+
*/
|
|
5
|
+
import type { PayloadRequest, SelectType, Sort, TypedUser, Where } from 'payload';
|
|
6
|
+
import { type BatchProcessorOptions } from '../utilities/useBatchProcessor.js';
|
|
7
|
+
/**
|
|
8
|
+
* Export-specific batch processor options
|
|
9
|
+
*/
|
|
10
|
+
export interface ExportBatchProcessorOptions extends BatchProcessorOptions {
|
|
11
|
+
debug?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Find arguments for querying documents during export
|
|
15
|
+
*/
|
|
16
|
+
export interface ExportFindArgs {
|
|
17
|
+
collection: string;
|
|
18
|
+
depth: number;
|
|
19
|
+
draft: boolean;
|
|
20
|
+
limit: number;
|
|
21
|
+
locale?: string;
|
|
22
|
+
overrideAccess: boolean;
|
|
23
|
+
page?: number;
|
|
24
|
+
select?: SelectType;
|
|
25
|
+
sort?: Sort;
|
|
26
|
+
user?: TypedUser;
|
|
27
|
+
where?: Where;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Options for processing an export operation
|
|
31
|
+
*/
|
|
32
|
+
export interface ExportProcessOptions<TDoc = unknown> {
|
|
33
|
+
/**
|
|
34
|
+
* The slug of the collection to export
|
|
35
|
+
*/
|
|
36
|
+
collectionSlug: string;
|
|
37
|
+
/**
|
|
38
|
+
* Arguments to pass to payload.find()
|
|
39
|
+
*/
|
|
40
|
+
findArgs: ExportFindArgs;
|
|
41
|
+
/**
|
|
42
|
+
* The export format - affects column tracking for CSV
|
|
43
|
+
*/
|
|
44
|
+
format: 'csv' | 'json';
|
|
45
|
+
/**
|
|
46
|
+
* Maximum number of documents to export
|
|
47
|
+
*/
|
|
48
|
+
maxDocs: number;
|
|
49
|
+
/**
|
|
50
|
+
* The Payload request object
|
|
51
|
+
*/
|
|
52
|
+
req: PayloadRequest;
|
|
53
|
+
/**
|
|
54
|
+
* Starting page for pagination (default: 1)
|
|
55
|
+
*/
|
|
56
|
+
startPage?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Transform function to apply to each document
|
|
59
|
+
*/
|
|
60
|
+
transformDoc: (doc: TDoc) => Record<string, unknown>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Result from processing an export operation
|
|
64
|
+
*/
|
|
65
|
+
export interface ExportResult {
|
|
66
|
+
/**
|
|
67
|
+
* Discovered column names (for CSV exports)
|
|
68
|
+
*/
|
|
69
|
+
columns: string[];
|
|
70
|
+
/**
|
|
71
|
+
* Transformed documents ready for output
|
|
72
|
+
*/
|
|
73
|
+
docs: Record<string, unknown>[];
|
|
74
|
+
/**
|
|
75
|
+
* Total number of documents fetched
|
|
76
|
+
*/
|
|
77
|
+
fetchedCount: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Creates an export batch processor with the specified options.
|
|
81
|
+
*
|
|
82
|
+
* @param options - Configuration options for the batch processor
|
|
83
|
+
* @returns An object containing the processExport method
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* const processor = createExportBatchProcessor({ batchSize: 100, debug: true })
|
|
88
|
+
*
|
|
89
|
+
* const result = await processor.processExport({
|
|
90
|
+
* collectionSlug: 'posts',
|
|
91
|
+
* findArgs: { collection: 'posts', depth: 1, draft: false, limit: 100, overrideAccess: false },
|
|
92
|
+
* format: 'csv',
|
|
93
|
+
* maxDocs: 1000,
|
|
94
|
+
* req,
|
|
95
|
+
* transformDoc: (doc) => flattenObject({ doc }),
|
|
96
|
+
* })
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export declare function createExportBatchProcessor(options?: ExportBatchProcessorOptions): {
|
|
100
|
+
discoverColumns: <TDoc>(processOptions: ExportProcessOptions<TDoc>) => Promise<string[]>;
|
|
101
|
+
processExport: <TDoc>(processOptions: ExportProcessOptions<TDoc>) => Promise<ExportResult>;
|
|
102
|
+
streamExport: <TDoc>(processOptions: ExportProcessOptions<TDoc>) => AsyncGenerator<{
|
|
103
|
+
columns: string[];
|
|
104
|
+
docs: Record<string, unknown>[];
|
|
105
|
+
}>;
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=batchProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/export/batchProcessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEjF,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AAE9E;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,IAAI,GAAG,OAAO;IAClD;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAA;IACxB;;OAEG;IACH,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,GAAG,EAAE,cAAc,CAAA;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;sBAiJnD,IAAI,kBACjB,oBAAoB,CAAC,IAAI,CAAC,KACzC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAzIS,IAAI,kBACf,oBAAoB,CAAC,IAAI,CAAC,KACzC,OAAO,CAAC,YAAY,CAAC;mBAsEK,IAAI,kBACf,oBAAoB,CAAC,IAAI,CAAC,KACzC,cAAc,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC;EAwH1E"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export-specific batch processor for processing documents in batches during export.
|
|
3
|
+
* Uses the generic batch processing utilities from useBatchProcessor.
|
|
4
|
+
*/ /**
|
|
5
|
+
* Creates an export batch processor with the specified options.
|
|
6
|
+
*
|
|
7
|
+
* @param options - Configuration options for the batch processor
|
|
8
|
+
* @returns An object containing the processExport method
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const processor = createExportBatchProcessor({ batchSize: 100, debug: true })
|
|
13
|
+
*
|
|
14
|
+
* const result = await processor.processExport({
|
|
15
|
+
* collectionSlug: 'posts',
|
|
16
|
+
* findArgs: { collection: 'posts', depth: 1, draft: false, limit: 100, overrideAccess: false },
|
|
17
|
+
* format: 'csv',
|
|
18
|
+
* maxDocs: 1000,
|
|
19
|
+
* req,
|
|
20
|
+
* transformDoc: (doc) => flattenObject({ doc }),
|
|
21
|
+
* })
|
|
22
|
+
* ```
|
|
23
|
+
*/ export function createExportBatchProcessor(options = {}) {
|
|
24
|
+
const batchSize = options.batchSize ?? 100;
|
|
25
|
+
const debug = options.debug ?? false;
|
|
26
|
+
/**
|
|
27
|
+
* Process an export operation by fetching and transforming documents in batches.
|
|
28
|
+
*
|
|
29
|
+
* @param processOptions - Options for the export operation
|
|
30
|
+
* @returns The export result containing transformed documents and column info
|
|
31
|
+
*/ const processExport = async (processOptions)=>{
|
|
32
|
+
const { findArgs, format, maxDocs, req, startPage = 1, transformDoc } = processOptions;
|
|
33
|
+
const docs = [];
|
|
34
|
+
const columnsSet = new Set();
|
|
35
|
+
const columns = [];
|
|
36
|
+
let currentPage = startPage;
|
|
37
|
+
let fetched = 0;
|
|
38
|
+
let hasNextPage = true;
|
|
39
|
+
while(hasNextPage){
|
|
40
|
+
const remaining = Math.max(0, maxDocs - fetched);
|
|
41
|
+
if (remaining === 0) {
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
const result = await req.payload.find({
|
|
45
|
+
...findArgs,
|
|
46
|
+
limit: Math.min(batchSize, remaining),
|
|
47
|
+
page: currentPage
|
|
48
|
+
});
|
|
49
|
+
if (debug) {
|
|
50
|
+
req.payload.logger.debug(`Processing export batch ${currentPage} with ${result.docs.length} documents`);
|
|
51
|
+
}
|
|
52
|
+
for (const doc of result.docs){
|
|
53
|
+
const transformedDoc = transformDoc(doc);
|
|
54
|
+
docs.push(transformedDoc);
|
|
55
|
+
// Track columns for CSV format
|
|
56
|
+
if (format === 'csv') {
|
|
57
|
+
for (const key of Object.keys(transformedDoc)){
|
|
58
|
+
if (!columnsSet.has(key)) {
|
|
59
|
+
columnsSet.add(key);
|
|
60
|
+
columns.push(key);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
fetched += result.docs.length;
|
|
66
|
+
hasNextPage = result.hasNextPage && fetched < maxDocs;
|
|
67
|
+
currentPage++;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
columns,
|
|
71
|
+
docs,
|
|
72
|
+
fetchedCount: fetched
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Async generator for streaming export - yields batches instead of collecting all.
|
|
77
|
+
* Useful for streaming exports where you want to process batches as they're fetched.
|
|
78
|
+
*
|
|
79
|
+
* @param processOptions - Options for the export operation
|
|
80
|
+
* @yields Batch results containing transformed documents and discovered columns
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* const processor = createExportBatchProcessor({ batchSize: 100 })
|
|
85
|
+
*
|
|
86
|
+
* for await (const batch of processor.streamExport({ ... })) {
|
|
87
|
+
* // Process each batch as it's yielded
|
|
88
|
+
* console.log(`Got ${batch.docs.length} documents`)
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/ async function* streamExport(processOptions) {
|
|
92
|
+
const { findArgs, format, maxDocs, req, startPage = 1, transformDoc } = processOptions;
|
|
93
|
+
const columnsSet = new Set();
|
|
94
|
+
const columns = [];
|
|
95
|
+
let currentPage = startPage;
|
|
96
|
+
let fetched = 0;
|
|
97
|
+
let hasNextPage = true;
|
|
98
|
+
while(hasNextPage){
|
|
99
|
+
const remaining = Math.max(0, maxDocs - fetched);
|
|
100
|
+
if (remaining === 0) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
const result = await req.payload.find({
|
|
104
|
+
...findArgs,
|
|
105
|
+
limit: Math.min(batchSize, remaining),
|
|
106
|
+
page: currentPage
|
|
107
|
+
});
|
|
108
|
+
if (debug) {
|
|
109
|
+
req.payload.logger.debug(`Streaming export batch ${currentPage} with ${result.docs.length} documents`);
|
|
110
|
+
}
|
|
111
|
+
const batchDocs = [];
|
|
112
|
+
for (const doc of result.docs){
|
|
113
|
+
const transformedDoc = transformDoc(doc);
|
|
114
|
+
batchDocs.push(transformedDoc);
|
|
115
|
+
// Track columns for CSV format
|
|
116
|
+
if (format === 'csv') {
|
|
117
|
+
for (const key of Object.keys(transformedDoc)){
|
|
118
|
+
if (!columnsSet.has(key)) {
|
|
119
|
+
columnsSet.add(key);
|
|
120
|
+
columns.push(key);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
yield {
|
|
126
|
+
columns: [
|
|
127
|
+
...columns
|
|
128
|
+
],
|
|
129
|
+
docs: batchDocs
|
|
130
|
+
};
|
|
131
|
+
fetched += result.docs.length;
|
|
132
|
+
hasNextPage = result.hasNextPage && fetched < maxDocs;
|
|
133
|
+
currentPage++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Discover all columns from the dataset by scanning through all batches.
|
|
138
|
+
* Useful for CSV exports where you need to know all columns before streaming.
|
|
139
|
+
*
|
|
140
|
+
* @param processOptions - Options for the export operation
|
|
141
|
+
* @returns Array of discovered column names
|
|
142
|
+
*/ const discoverColumns = async (processOptions)=>{
|
|
143
|
+
const { findArgs, maxDocs, req, startPage = 1, transformDoc } = processOptions;
|
|
144
|
+
const columnsSet = new Set();
|
|
145
|
+
const columns = [];
|
|
146
|
+
let currentPage = startPage;
|
|
147
|
+
let fetched = 0;
|
|
148
|
+
let hasNextPage = true;
|
|
149
|
+
while(hasNextPage){
|
|
150
|
+
const remaining = Math.max(0, maxDocs - fetched);
|
|
151
|
+
if (remaining === 0) {
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
const result = await req.payload.find({
|
|
155
|
+
...findArgs,
|
|
156
|
+
limit: Math.min(batchSize, remaining),
|
|
157
|
+
page: currentPage
|
|
158
|
+
});
|
|
159
|
+
if (debug) {
|
|
160
|
+
req.payload.logger.debug(`Scanning columns from batch ${currentPage} with ${result.docs.length} documents`);
|
|
161
|
+
}
|
|
162
|
+
for (const doc of result.docs){
|
|
163
|
+
const transformedDoc = transformDoc(doc);
|
|
164
|
+
for (const key of Object.keys(transformedDoc)){
|
|
165
|
+
if (!columnsSet.has(key)) {
|
|
166
|
+
columnsSet.add(key);
|
|
167
|
+
columns.push(key);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
fetched += result.docs.length;
|
|
172
|
+
hasNextPage = result.hasNextPage && fetched < maxDocs;
|
|
173
|
+
currentPage++;
|
|
174
|
+
}
|
|
175
|
+
if (debug) {
|
|
176
|
+
req.payload.logger.debug(`Discovered ${columns.length} columns`);
|
|
177
|
+
}
|
|
178
|
+
return columns;
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
discoverColumns,
|
|
182
|
+
processExport,
|
|
183
|
+
streamExport
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
//# sourceMappingURL=batchProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/export/batchProcessor.ts"],"sourcesContent":["/**\n * Export-specific batch processor for processing documents in batches during export.\n * Uses the generic batch processing utilities from useBatchProcessor.\n */\nimport type { PayloadRequest, SelectType, Sort, TypedUser, Where } from 'payload'\n\nimport { type BatchProcessorOptions } from '../utilities/useBatchProcessor.js'\n\n/**\n * Export-specific batch processor options\n */\nexport interface ExportBatchProcessorOptions extends BatchProcessorOptions {\n debug?: boolean\n}\n\n/**\n * Find arguments for querying documents during export\n */\nexport interface ExportFindArgs {\n collection: string\n depth: number\n draft: boolean\n limit: number\n locale?: string\n overrideAccess: boolean\n page?: number\n select?: SelectType\n sort?: Sort\n user?: TypedUser\n where?: Where\n}\n\n/**\n * Options for processing an export operation\n */\nexport interface ExportProcessOptions<TDoc = unknown> {\n /**\n * The slug of the collection to export\n */\n collectionSlug: string\n /**\n * Arguments to pass to payload.find()\n */\n findArgs: ExportFindArgs\n /**\n * The export format - affects column tracking for CSV\n */\n format: 'csv' | 'json'\n /**\n * Maximum number of documents to export\n */\n maxDocs: number\n /**\n * The Payload request object\n */\n req: PayloadRequest\n /**\n * Starting page for pagination (default: 1)\n */\n startPage?: number\n /**\n * Transform function to apply to each document\n */\n transformDoc: (doc: TDoc) => Record<string, unknown>\n}\n\n/**\n * Result from processing an export operation\n */\nexport interface ExportResult {\n /**\n * Discovered column names (for CSV exports)\n */\n columns: string[]\n /**\n * Transformed documents ready for output\n */\n docs: Record<string, unknown>[]\n /**\n * Total number of documents fetched\n */\n fetchedCount: number\n}\n\n/**\n * Creates an export batch processor with the specified options.\n *\n * @param options - Configuration options for the batch processor\n * @returns An object containing the processExport method\n *\n * @example\n * ```ts\n * const processor = createExportBatchProcessor({ batchSize: 100, debug: true })\n *\n * const result = await processor.processExport({\n * collectionSlug: 'posts',\n * findArgs: { collection: 'posts', depth: 1, draft: false, limit: 100, overrideAccess: false },\n * format: 'csv',\n * maxDocs: 1000,\n * req,\n * transformDoc: (doc) => flattenObject({ doc }),\n * })\n * ```\n */\nexport function createExportBatchProcessor(options: ExportBatchProcessorOptions = {}) {\n const batchSize = options.batchSize ?? 100\n const debug = options.debug ?? false\n\n /**\n * Process an export operation by fetching and transforming documents in batches.\n *\n * @param processOptions - Options for the export operation\n * @returns The export result containing transformed documents and column info\n */\n const processExport = async <TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): Promise<ExportResult> => {\n const { findArgs, format, maxDocs, req, startPage = 1, transformDoc } = processOptions\n\n const docs: Record<string, unknown>[] = []\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\n\n while (hasNextPage) {\n const remaining = Math.max(0, maxDocs - fetched)\n\n if (remaining === 0) {\n break\n }\n\n const result = await req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Processing export batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n for (const doc of result.docs) {\n const transformedDoc = transformDoc(doc as TDoc)\n docs.push(transformedDoc)\n\n // Track columns for CSV format\n if (format === 'csv') {\n for (const key of Object.keys(transformedDoc)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n\n return { columns, docs, fetchedCount: fetched }\n }\n\n /**\n * Async generator for streaming export - yields batches instead of collecting all.\n * Useful for streaming exports where you want to process batches as they're fetched.\n *\n * @param processOptions - Options for the export operation\n * @yields Batch results containing transformed documents and discovered columns\n *\n * @example\n * ```ts\n * const processor = createExportBatchProcessor({ batchSize: 100 })\n *\n * for await (const batch of processor.streamExport({ ... })) {\n * // Process each batch as it's yielded\n * console.log(`Got ${batch.docs.length} documents`)\n * }\n * ```\n */\n async function* streamExport<TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): AsyncGenerator<{ columns: string[]; docs: Record<string, unknown>[] }> {\n const { findArgs, format, maxDocs, req, startPage = 1, transformDoc } = processOptions\n\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\n\n while (hasNextPage) {\n const remaining = Math.max(0, maxDocs - fetched)\n\n if (remaining === 0) {\n break\n }\n\n const result = await req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Streaming export batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n const batchDocs: Record<string, unknown>[] = []\n\n for (const doc of result.docs) {\n const transformedDoc = transformDoc(doc as TDoc)\n batchDocs.push(transformedDoc)\n\n // Track columns for CSV format\n if (format === 'csv') {\n for (const key of Object.keys(transformedDoc)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n }\n\n yield { columns: [...columns], docs: batchDocs }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n }\n\n /**\n * Discover all columns from the dataset by scanning through all batches.\n * Useful for CSV exports where you need to know all columns before streaming.\n *\n * @param processOptions - Options for the export operation\n * @returns Array of discovered column names\n */\n const discoverColumns = async <TDoc>(\n processOptions: ExportProcessOptions<TDoc>,\n ): Promise<string[]> => {\n const { findArgs, maxDocs, req, startPage = 1, transformDoc } = processOptions\n\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n let currentPage = startPage\n let fetched = 0\n let hasNextPage = true\n\n while (hasNextPage) {\n const remaining = Math.max(0, maxDocs - fetched)\n\n if (remaining === 0) {\n break\n }\n\n const result = await req.payload.find({\n ...findArgs,\n limit: Math.min(batchSize, remaining),\n page: currentPage,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Scanning columns from batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n for (const doc of result.docs) {\n const transformedDoc = transformDoc(doc as TDoc)\n\n for (const key of Object.keys(transformedDoc)) {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n }\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage++\n }\n\n if (debug) {\n req.payload.logger.debug(`Discovered ${columns.length} columns`)\n }\n\n return columns\n }\n\n return {\n discoverColumns,\n processExport,\n streamExport,\n }\n}\n"],"names":["createExportBatchProcessor","options","batchSize","debug","processExport","processOptions","findArgs","format","maxDocs","req","startPage","transformDoc","docs","columnsSet","Set","columns","currentPage","fetched","hasNextPage","remaining","Math","max","result","payload","find","limit","min","page","logger","length","doc","transformedDoc","push","key","Object","keys","has","add","fetchedCount","streamExport","batchDocs","discoverColumns"],"mappings":"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"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import type { PayloadRequest, Sort,
|
|
1
|
+
import type { PayloadRequest, Sort, Where } from 'payload';
|
|
2
2
|
export type Export = {
|
|
3
|
+
/**
|
|
4
|
+
* Number of documents to process in each batch during export
|
|
5
|
+
* @default 100
|
|
6
|
+
*/
|
|
7
|
+
batchSize?: number;
|
|
3
8
|
collectionSlug: string;
|
|
4
9
|
/**
|
|
5
10
|
* If true, enables debug logging
|
|
@@ -17,6 +22,8 @@ export type Export = {
|
|
|
17
22
|
page?: number;
|
|
18
23
|
slug: string;
|
|
19
24
|
sort: Sort;
|
|
25
|
+
userCollection: string;
|
|
26
|
+
userID: number | string;
|
|
20
27
|
where?: Where;
|
|
21
28
|
};
|
|
22
29
|
export type CreateExportArgs = {
|
|
@@ -24,9 +31,7 @@ export type CreateExportArgs = {
|
|
|
24
31
|
* If true, stream the file instead of saving it
|
|
25
32
|
*/
|
|
26
33
|
download?: boolean;
|
|
27
|
-
input: Export;
|
|
28
34
|
req: PayloadRequest;
|
|
29
|
-
|
|
30
|
-
};
|
|
35
|
+
} & Export;
|
|
31
36
|
export declare const createExport: (args: CreateExportArgs) => Promise<Response | undefined>;
|
|
32
37
|
//# sourceMappingURL=createExport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,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,iBAAiB,EAAE,MAAM,CAAA;IACzB,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,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,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,kCA2bxD,CAAA"}
|