@payloadcms/plugin-import-export 4.0.0-internal.567a487 → 4.0.0-internal.58473b9
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 +3 -2
- package/dist/components/CollectionField/index.d.ts.map +1 -1
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +14 -12
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.css +0 -3
- package/dist/components/ExportPreview/index.d.ts.map +1 -1
- package/dist/components/ExportPreview/index.js +11 -1
- package/dist/components/ExportPreview/index.js.map +1 -1
- package/dist/components/FieldsToExport/index.d.ts +3 -2
- package/dist/components/FieldsToExport/index.d.ts.map +1 -1
- package/dist/components/FieldsToExport/index.js +18 -15
- package/dist/components/FieldsToExport/index.js.map +1 -1
- package/dist/components/FieldsToExport/reduceFields.d.ts +6 -0
- package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
- package/dist/components/FieldsToExport/reduceFields.js +4 -0
- package/dist/components/FieldsToExport/reduceFields.js.map +1 -1
- package/dist/components/FormatField/index.d.ts +3 -2
- package/dist/components/FormatField/index.d.ts.map +1 -1
- package/dist/components/FormatField/index.js.map +1 -1
- package/dist/components/ImportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ImportListMenuItem/index.js +14 -12
- package/dist/components/ImportListMenuItem/index.js.map +1 -1
- package/dist/components/ImportPreview/index.css +0 -3
- package/dist/components/ImportPreview/index.d.ts.map +1 -1
- package/dist/components/ImportPreview/index.js +27 -8
- package/dist/components/ImportPreview/index.js.map +1 -1
- package/dist/components/LimitField/index.d.ts +3 -2
- package/dist/components/LimitField/index.d.ts.map +1 -1
- package/dist/components/LimitField/index.js.map +1 -1
- package/dist/components/LocaleField/index.d.ts +3 -2
- package/dist/components/LocaleField/index.d.ts.map +1 -1
- package/dist/components/LocaleField/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +3 -2
- package/dist/components/Page/index.d.ts.map +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts +7 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.js +3 -0
- package/dist/components/RelationshipCell/getRelationshipGroupKey.js.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.d.ts +43 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.d.ts.map +1 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.js +109 -0
- package/dist/components/RelationshipCell/getRelationshipGroups.js.map +1 -0
- package/dist/components/RelationshipCell/index.css +30 -0
- package/dist/components/RelationshipCell/index.d.ts +15 -0
- package/dist/components/RelationshipCell/index.d.ts.map +1 -0
- package/dist/components/RelationshipCell/index.js +57 -0
- package/dist/components/RelationshipCell/index.js.map +1 -0
- package/dist/components/SortBy/index.d.ts +3 -2
- package/dist/components/SortBy/index.d.ts.map +1 -1
- package/dist/components/SortBy/index.js.map +1 -1
- package/dist/components/SortOrder/index.d.ts +3 -2
- package/dist/components/SortOrder/index.d.ts.map +1 -1
- package/dist/components/SortOrder/index.js.map +1 -1
- package/dist/export/batchProcessor.d.ts +2 -1
- package/dist/export/batchProcessor.d.ts.map +1 -1
- package/dist/export/batchProcessor.js +6 -2
- package/dist/export/batchProcessor.js.map +1 -1
- package/dist/export/createExport.d.ts +2 -0
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +6 -1
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +11 -0
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getExportCollection.js +5 -0
- package/dist/export/getExportCollection.js.map +1 -1
- package/dist/export/handleDownload.d.ts.map +1 -1
- package/dist/export/handleDownload.js +7 -3
- package/dist/export/handleDownload.js.map +1 -1
- package/dist/export/handlePreview.d.ts.map +1 -1
- package/dist/export/handlePreview.js +24 -5
- package/dist/export/handlePreview.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/import/batchProcessor.d.ts +2 -1
- package/dist/import/batchProcessor.d.ts.map +1 -1
- package/dist/import/batchProcessor.js +15 -8
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/createImport.d.ts +3 -2
- package/dist/import/createImport.d.ts.map +1 -1
- package/dist/import/createImport.js +8 -1
- package/dist/import/createImport.js.map +1 -1
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
- package/dist/import/getCreateImportCollectionTask.js +5 -2
- package/dist/import/getCreateImportCollectionTask.js.map +1 -1
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/getImportCollection.js +2 -0
- package/dist/import/getImportCollection.js.map +1 -1
- package/dist/import/handlePreview.d.ts.map +1 -1
- package/dist/import/handlePreview.js +5 -1
- package/dist/import/handlePreview.js.map +1 -1
- package/dist/types.d.ts +17 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/getExportFieldFunctions.js +64 -27
- package/dist/utilities/getExportFieldFunctions.js.map +1 -1
- package/dist/utilities/getFileFromDoc.js +3 -3
- package/dist/utilities/getFileFromDoc.js.map +1 -1
- package/dist/utilities/getSelect.d.ts.map +1 -1
- package/dist/utilities/getSelect.js +11 -3
- package/dist/utilities/getSelect.js.map +1 -1
- package/dist/utilities/getSubmittedFormValues.d.ts +12 -0
- package/dist/utilities/getSubmittedFormValues.d.ts.map +1 -0
- package/dist/utilities/getSubmittedFormValues.js +24 -0
- package/dist/utilities/getSubmittedFormValues.js.map +1 -0
- package/dist/utilities/setNestedValue.d.ts +2 -1
- package/dist/utilities/setNestedValue.d.ts.map +1 -1
- package/dist/utilities/setNestedValue.js +65 -34
- package/dist/utilities/setNestedValue.js.map +1 -1
- package/package.json +10 -10
- package/dist/components/FieldsToExport/reduceFields.spec.js +0 -239
- package/dist/components/FieldsToExport/reduceFields.spec.js.map +0 -1
- package/dist/utilities/applyFieldHooks.spec.js +0 -205
- package/dist/utilities/applyFieldHooks.spec.js.map +0 -1
- package/dist/utilities/buildDisabledFieldRegex.spec.js +0 -64
- package/dist/utilities/buildDisabledFieldRegex.spec.js.map +0 -1
- package/dist/utilities/fieldToRegex.spec.js +0 -151
- package/dist/utilities/fieldToRegex.spec.js.map +0 -1
- package/dist/utilities/filterToSelectedFields.spec.js +0 -204
- package/dist/utilities/filterToSelectedFields.spec.js.map +0 -1
- package/dist/utilities/flattenObject.spec.js +0 -158
- package/dist/utilities/flattenObject.spec.js.map +0 -1
- package/dist/utilities/getExportFieldFunctions.spec.js +0 -50
- package/dist/utilities/getExportFieldFunctions.spec.js.map +0 -1
- package/dist/utilities/getImportFieldFunctions.spec.js +0 -167
- package/dist/utilities/getImportFieldFunctions.spec.js.map +0 -1
- package/dist/utilities/getSchemaColumns.spec.js +0 -157
- package/dist/utilities/getSchemaColumns.spec.js.map +0 -1
- package/dist/utilities/parseCSV.spec.js +0 -195
- package/dist/utilities/parseCSV.spec.js.map +0 -1
- package/dist/utilities/processRichTextField.spec.js +0 -308
- package/dist/utilities/processRichTextField.spec.js.map +0 -1
- package/dist/utilities/siblingDoc.spec.js +0 -278
- package/dist/utilities/siblingDoc.spec.js.map +0 -1
- package/dist/utilities/unflattenObject.spec.js +0 -819
- package/dist/utilities/unflattenObject.spec.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, User, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\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 msg: '[createExport] Starting export process',\n exportDocId: id,\n exportName: nameArg,\n collectionSlug,\n exportCollection,\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: undefined | User\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n overrideAccess: true,\n })) as User\n }\n\n if (!user && req.user) {\n user = req.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({ isCSV, locale, msg: 'Export configuration:', name })\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 collectionSlug,\n msg: 'Access denied for collection, creating empty export',\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({ findArgs, msg: 'Find arguments:' })\n }\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const exportHooks = collectionConfig.custom?.['plugin-import-export']?.exportHooks\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: unknown, parentPath = ''): unknown => {\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, unknown> = {}\n for (const [key, value] of Object.entries(doc as Record<string, unknown>)) {\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 effectiveStreamDocs =\n typeof maxExportDocuments === 'number' ? Math.min(totalDocs, maxExportDocuments) : totalDocs\n const totalBatches = effectiveStreamDocs > 0 ? Math.ceil(effectiveStreamDocs / batchSize) : 1\n let streamBatchNumber = 0\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 streamBatchNumber++\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(\n flattenObject({\n data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n ),\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\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 batchRowsToWrite) {\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 // When a before hook is active and rows exist, restrict to columns actually present\n // in the data so that the hook can remove fields by not returning them.\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n allColumns =\n Boolean(exportHooks?.before) && batchRowsToWrite.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\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 = batchRowsToWrite.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\n if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map(\n (doc) =>\n filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>,\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRowsToWrite.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 if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\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; charset=utf-8' : '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 data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n )\n : (filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>)\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 hooks: exportHooks,\n maxDocs:\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY,\n req,\n startPage: adjustedPage,\n totalDocs,\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 // When a before hook is active and rows exist, restrict to columns actually present in the data\n // so that the hook can remove fields by not returning them\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n const finalColumns =\n Boolean(exportHooks?.before) && rows.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\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; charset=utf-8' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug({\n msg: '[createExport] Updating export document with file',\n exportDocId: id,\n exportCollection,\n fileName: name,\n fileSize: buffer.length,\n mimeType: isCSV ? 'text/csv; charset=utf-8' : 'application/json',\n })\n }\n try {\n await req.payload.update({\n id,\n collection: exportCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv; charset=utf-8' : '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 } catch (error) {\n const errorDetails =\n error instanceof Error\n ? {\n message: error.message,\n name: error.name,\n stack: error.stack,\n // @ts-expect-error - data might exist on Payload errors\n data: error.data,\n }\n : error\n req.payload.logger.error({\n msg: '[createExport] Failed to update export document with file',\n err: errorDetails,\n exportDocId: id,\n exportCollection,\n fileName: name,\n })\n throw error\n }\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","applyFieldHooks","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","msg","exportDocId","exportName","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","exportFieldHooks","flattenedFields","exportHooks","custom","disabledFields","admin","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","allColumns","columnsFinalized","encoder","TextEncoder","isFirstBatch","currentBatchPage","fetched","maxDocs","Number","POSITIVE_INFINITY","effectiveStreamDocs","totalBatches","streamBatchNumber","stream","read","remaining","push","encode","result","docs","batchRows","data","originalDocs","batchRowsToWrite","before","batchNumber","originalData","dataColumns","seenCols","Set","keys","has","add","mergedColumns","filter","col","dataColumnsCount","finalColumnsCount","paddedRows","fullRow","csvString","bom","header","columns","after","fieldHooks","operation","type","batchJSON","JSON","join","hasNextPage","Response","toWeb","headers","processor","transformDoc","exportResult","fetchedCount","processExport","hooks","startPage","rows","outputData","finalColumns","content","buffer","Buffer","from","file","mimetype","size","fileName","fileSize","mimeType","update","errorDetails","Error","message","stack","err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, User, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport type { ExportDoc } from '../types.js'\n\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\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 exportDoc: ExportDoc\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 exportDoc,\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 msg: '[createExport] Starting export process',\n exportDocId: id,\n exportName: nameArg,\n collectionSlug,\n exportCollection,\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: undefined | User\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n overrideAccess: true,\n })) as User\n }\n\n if (!user && req.user) {\n user = req.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({ isCSV, locale, msg: 'Export configuration:', name })\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 collectionSlug,\n msg: 'Access denied for collection, creating empty export',\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({ findArgs, msg: 'Find arguments:' })\n }\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const exportHooks = collectionConfig.custom?.['plugin-import-export']?.exportHooks\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: unknown, parentPath = ''): unknown => {\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, unknown> = {}\n for (const [key, value] of Object.entries(doc as Record<string, unknown>)) {\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 effectiveStreamDocs =\n typeof maxExportDocuments === 'number' ? Math.min(totalDocs, maxExportDocuments) : totalDocs\n const totalBatches = effectiveStreamDocs > 0 ? Math.ceil(effectiveStreamDocs / batchSize) : 1\n let streamBatchNumber = 0\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 streamBatchNumber++\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(\n flattenObject({\n data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n ),\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\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 batchRowsToWrite) {\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 // When a before hook is active and rows exist, restrict to columns actually present\n // in the data so that the hook can remove fields by not returning them.\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n allColumns =\n Boolean(exportHooks?.before) && batchRowsToWrite.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\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 = batchRowsToWrite.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\n if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map(\n (doc) =>\n filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>,\n )\n\n const originalDocs = result.docs as Record<string, unknown>[]\n let batchRowsToWrite = batchRows\n if (exportHooks?.before && batchRows.length > 0) {\n batchRowsToWrite = await exportHooks.before({\n batchNumber: streamBatchNumber,\n data: batchRows,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\n }\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRowsToWrite.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 if (exportHooks?.after && batchRowsToWrite.length > 0) {\n await exportHooks.after({\n batchNumber: streamBatchNumber,\n data: batchRowsToWrite,\n exportDoc,\n format,\n originalData: originalDocs,\n req,\n totalBatches,\n })\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; charset=utf-8' : '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 data: doc as Record<string, unknown>,\n fields,\n format,\n exportFieldHooks,\n req,\n }),\n )\n : (filterDisabledJSON(\n applyFieldHooks({\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: collectionConfig.flattenedFields,\n format,\n operation: 'export',\n req,\n type: 'beforeExport',\n }),\n ) as Record<string, unknown>)\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 exportDoc,\n findArgs: findArgs as ExportFindArgs,\n format,\n hooks: exportHooks,\n maxDocs:\n typeof maxExportDocuments === 'number' ? maxExportDocuments : Number.POSITIVE_INFINITY,\n req,\n startPage: adjustedPage,\n totalDocs,\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 // When a before hook is active and rows exist, restrict to columns actually present in the data\n // so that the hook can remove fields by not returning them\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n const finalColumns =\n Boolean(exportHooks?.before) && rows.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\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; charset=utf-8' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug({\n msg: '[createExport] Updating export document with file',\n exportDocId: id,\n exportCollection,\n fileName: name,\n fileSize: buffer.length,\n mimeType: isCSV ? 'text/csv; charset=utf-8' : 'application/json',\n })\n }\n try {\n await req.payload.update({\n id,\n collection: exportCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv; charset=utf-8' : '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 } catch (error) {\n const errorDetails =\n error instanceof Error\n ? {\n message: error.message,\n name: error.name,\n stack: error.stack,\n // @ts-expect-error - data might exist on Payload errors\n data: error.data,\n }\n : error\n req.payload.logger.error({\n msg: '[createExport] Failed to update export document with file',\n err: errorDetails,\n exportDocId: id,\n exportCollection,\n fileName: name,\n })\n throw error\n }\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","applyFieldHooks","buildDisabledFieldRegex","flattenObject","getExportFieldFunctions","getFilename","getSchemaColumns","mergeColumns","getSelect","validateLimitValue","createExportBatchProcessor","createExport","args","id","name","nameArg","batchSize","collectionSlug","debug","download","drafts","draftsFromInput","exportCollection","exportDoc","fields","format","limit","incomingLimit","maxLimit","locale","localeFromInput","page","req","sort","userCollection","userID","where","whereFromInput","localeFromReq","payload","logger","msg","exportDocId","exportName","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","exportFieldHooks","flattenedFields","exportHooks","custom","disabledFields","admin","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","allColumns","columnsFinalized","encoder","TextEncoder","isFirstBatch","currentBatchPage","fetched","maxDocs","Number","POSITIVE_INFINITY","effectiveStreamDocs","totalBatches","streamBatchNumber","stream","read","remaining","push","encode","result","docs","batchRows","data","originalDocs","batchRowsToWrite","before","batchNumber","originalData","dataColumns","seenCols","Set","keys","has","add","mergedColumns","filter","col","dataColumnsCount","finalColumnsCount","paddedRows","fullRow","csvString","bom","header","columns","after","fieldHooks","operation","type","batchJSON","JSON","join","hasNextPage","Response","toWeb","headers","processor","transformDoc","exportResult","fetchedCount","processExport","hooks","startPage","rows","outputData","finalColumns","content","buffer","Buffer","from","file","mimetype","size","fileName","fileSize","mimeType","update","errorDetails","Error","message","stack","err"],"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,EAAS,UAAU,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAAA;AAmGV,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,EAAS,UAAU,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,MAAM,CAAA;AAmGV,eAAO,MAAM,6BAA6B,WAChC,MAAM,KACb,UAAU,CAAC;IACZ,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf,CAoCA,CAAA"}
|
|
@@ -115,8 +115,19 @@ export const getCreateCollectionExportTask = (config)=>{
|
|
|
115
115
|
output: {}
|
|
116
116
|
};
|
|
117
117
|
}
|
|
118
|
+
// The job input omits custom fields, so read the export document once for the hooks.
|
|
119
|
+
const exportDoc = await req.payload.findByID({
|
|
120
|
+
id: input.id,
|
|
121
|
+
collection: input.exportCollection,
|
|
122
|
+
overrideAccess: true,
|
|
123
|
+
req
|
|
124
|
+
});
|
|
125
|
+
if (!exportDoc) {
|
|
126
|
+
throw new Error(`Export document not found: ${input.id}`);
|
|
127
|
+
}
|
|
118
128
|
await createExport({
|
|
119
129
|
...input,
|
|
130
|
+
exportDoc,
|
|
120
131
|
req
|
|
121
132
|
});
|
|
122
133
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export/getCreateExportCollectionTask.ts"],"sourcesContent":["import type { Config, Field, TaskConfig } from 'payload'\n\nimport type { Export } from './createExport.js'\n\nimport { createExport } from './createExport.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\n/**\n * Creates a minimal inputSchema for the job queue task.\n */\nconst getJobInputSchema = (config: Config): Field[] => {\n const allCollectionSlugs = config.collections?.map((c) => c.slug) || []\n\n const collectionOptions = allCollectionSlugs.map((slug) => {\n const collectionConfig = config.collections?.find((c) => c.slug === slug)\n return {\n label: collectionConfig?.labels?.singular || slug,\n value: slug,\n }\n })\n\n return [\n {\n name: 'id',\n type: 'text',\n required: true,\n },\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'batchSize',\n type: 'number',\n },\n {\n name: 'collectionSlug',\n type: 'select',\n options: collectionOptions,\n required: true,\n },\n {\n name: 'drafts',\n type: 'select',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n },\n {\n name: 'exportCollection',\n type: 'text',\n required: true,\n },\n {\n name: 'fields',\n type: 'text',\n hasMany: true,\n },\n {\n name: 'format',\n type: 'select',\n options: [\n { label: 'CSV', value: 'csv' },\n { label: 'JSON', value: 'json' },\n ],\n required: true,\n },\n {\n name: 'limit',\n type: 'number',\n },\n {\n name: 'locale',\n type: 'text',\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n {\n name: 'page',\n type: 'number',\n },\n {\n name: 'sort',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'where',\n type: 'json',\n },\n ]\n}\n\nexport const getCreateCollectionExportTask = (\n config: Config,\n): TaskConfig<{\n input: ExportJobInput\n output: object\n}> => {\n const inputSchema = getJobInputSchema(config)\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","getJobInputSchema","config","allCollectionSlugs","collections","map","c","slug","collectionOptions","collectionConfig","find","label","labels","singular","value","name","type","required","options","hasMany","getCreateCollectionExportTask","inputSchema","handler","input","req","payload","logger","error","output"],"mappings":"AAIA,SAASA,YAAY,QAAQ,oBAAmB;AAYhD;;CAEC,GACD,MAAMC,oBAAoB,CAACC;IACzB,MAAMC,qBAAqBD,OAAOE,WAAW,EAAEC,IAAI,CAACC,IAAMA,EAAEC,IAAI,KAAK,EAAE;IAEvE,MAAMC,oBAAoBL,mBAAmBE,GAAG,CAAC,CAACE;QAChD,MAAME,mBAAmBP,OAAOE,WAAW,EAAEM,KAAK,CAACJ,IAAMA,EAAEC,IAAI,KAAKA;QACpE,OAAO;YACLI,OAAOF,kBAAkBG,QAAQC,YAAYN;YAC7CO,OAAOP;QACT;IACF;IAEA,OAAO;QACL;YACEQ,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;YACNE,SAASV;YACTS,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAMG,OAAO;gBAAK;aAC5B;QACH;QACA;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNG,SAAS;QACX;QACA;YACEJ,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAQG,OAAO;gBAAO;aAChC;YACDG,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;KACD;AACH;AAEA,OAAO,MAAMI,gCAAgC,CAC3ClB;IAKA,MAAMmB,cAAcpB,kBAAkBC;IAEtC,OAAO;QACLK,MAAM;QACNe,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,
|
|
1
|
+
{"version":3,"sources":["../../src/export/getCreateExportCollectionTask.ts"],"sourcesContent":["import type { Config, Field, TaskConfig } from 'payload'\n\nimport type { Export } from './createExport.js'\n\nimport { createExport } from './createExport.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\n/**\n * Creates a minimal inputSchema for the job queue task.\n */\nconst getJobInputSchema = (config: Config): Field[] => {\n const allCollectionSlugs = config.collections?.map((c) => c.slug) || []\n\n const collectionOptions = allCollectionSlugs.map((slug) => {\n const collectionConfig = config.collections?.find((c) => c.slug === slug)\n return {\n label: collectionConfig?.labels?.singular || slug,\n value: slug,\n }\n })\n\n return [\n {\n name: 'id',\n type: 'text',\n required: true,\n },\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'batchSize',\n type: 'number',\n },\n {\n name: 'collectionSlug',\n type: 'select',\n options: collectionOptions,\n required: true,\n },\n {\n name: 'drafts',\n type: 'select',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ],\n },\n {\n name: 'exportCollection',\n type: 'text',\n required: true,\n },\n {\n name: 'fields',\n type: 'text',\n hasMany: true,\n },\n {\n name: 'format',\n type: 'select',\n options: [\n { label: 'CSV', value: 'csv' },\n { label: 'JSON', value: 'json' },\n ],\n required: true,\n },\n {\n name: 'limit',\n type: 'number',\n },\n {\n name: 'locale',\n type: 'text',\n },\n {\n name: 'maxLimit',\n type: 'number',\n },\n {\n name: 'page',\n type: 'number',\n },\n {\n name: 'sort',\n type: 'text',\n },\n {\n name: 'userCollection',\n type: 'text',\n },\n {\n name: 'userID',\n type: 'text',\n },\n {\n name: 'where',\n type: 'json',\n },\n ]\n}\n\nexport const getCreateCollectionExportTask = (\n config: Config,\n): TaskConfig<{\n input: ExportJobInput\n output: object\n}> => {\n const inputSchema = getJobInputSchema(config)\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 // The job input omits custom fields, so read the export document once for the hooks.\n const exportDoc = await req.payload.findByID({\n id: input.id,\n collection: input.exportCollection,\n overrideAccess: true,\n req,\n })\n\n if (!exportDoc) {\n throw new Error(`Export document not found: ${input.id}`)\n }\n\n await createExport({\n ...input,\n exportDoc,\n req,\n })\n\n return {\n output: {},\n }\n },\n inputSchema,\n }\n}\n"],"names":["createExport","getJobInputSchema","config","allCollectionSlugs","collections","map","c","slug","collectionOptions","collectionConfig","find","label","labels","singular","value","name","type","required","options","hasMany","getCreateCollectionExportTask","inputSchema","handler","input","req","payload","logger","error","output","exportDoc","findByID","id","collection","exportCollection","overrideAccess","Error"],"mappings":"AAIA,SAASA,YAAY,QAAQ,oBAAmB;AAYhD;;CAEC,GACD,MAAMC,oBAAoB,CAACC;IACzB,MAAMC,qBAAqBD,OAAOE,WAAW,EAAEC,IAAI,CAACC,IAAMA,EAAEC,IAAI,KAAK,EAAE;IAEvE,MAAMC,oBAAoBL,mBAAmBE,GAAG,CAAC,CAACE;QAChD,MAAME,mBAAmBP,OAAOE,WAAW,EAAEM,KAAK,CAACJ,IAAMA,EAAEC,IAAI,KAAKA;QACpE,OAAO;YACLI,OAAOF,kBAAkBG,QAAQC,YAAYN;YAC7CO,OAAOP;QACT;IACF;IAEA,OAAO;QACL;YACEQ,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;YACNE,SAASV;YACTS,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAMG,OAAO;gBAAK;aAC5B;QACH;QACA;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;YACNG,SAAS;QACX;QACA;YACEJ,MAAM;YACNC,MAAM;YACNE,SAAS;gBACP;oBAAEP,OAAO;oBAAOG,OAAO;gBAAM;gBAC7B;oBAAEH,OAAO;oBAAQG,OAAO;gBAAO;aAChC;YACDG,UAAU;QACZ;QACA;YACEF,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;QACA;YACED,MAAM;YACNC,MAAM;QACR;KACD;AACH;AAEA,OAAO,MAAMI,gCAAgC,CAC3ClB;IAKA,MAAMmB,cAAcpB,kBAAkBC;IAEtC,OAAO;QACLK,MAAM;QACNe,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,qFAAqF;YACrF,MAAMC,YAAY,MAAML,IAAIC,OAAO,CAACK,QAAQ,CAAC;gBAC3CC,IAAIR,MAAMQ,EAAE;gBACZC,YAAYT,MAAMU,gBAAgB;gBAClCC,gBAAgB;gBAChBV;YACF;YAEA,IAAI,CAACK,WAAW;gBACd,MAAM,IAAIM,MAAM,CAAC,2BAA2B,EAAEZ,MAAMQ,EAAE,EAAE;YAC1D;YAEA,MAAM/B,aAAa;gBACjB,GAAGuB,KAAK;gBACRM;gBACAL;YACF;YAEA,OAAO;gBACLI,QAAQ,CAAC;YACX;QACF;QACAP;IACF;AACF,EAAC"}
|
|
@@ -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;
|
|
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;AAYhF,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,gBAgKH,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js';
|
|
1
2
|
import { resolveLimit } from '../utilities/resolveLimit.js';
|
|
2
3
|
import { createExport } from './createExport.js';
|
|
3
4
|
import { getFields } from './getFields.js';
|
|
@@ -89,6 +90,9 @@ export const getExportCollection = ({ collectionSlugs, config, exportConfig, plu
|
|
|
89
90
|
batchSize,
|
|
90
91
|
debug,
|
|
91
92
|
exportCollection: collectionConfig.slug,
|
|
93
|
+
exportDoc: getSubmittedFormValues({
|
|
94
|
+
formData: exportData
|
|
95
|
+
}),
|
|
92
96
|
maxLimit,
|
|
93
97
|
req,
|
|
94
98
|
userCollection: user?.collection,
|
|
@@ -135,6 +139,7 @@ export const getExportCollection = ({ collectionSlugs, config, exportConfig, plu
|
|
|
135
139
|
};
|
|
136
140
|
await req.payload.jobs.queue({
|
|
137
141
|
input,
|
|
142
|
+
overrideAccess: true,
|
|
138
143
|
task: 'createCollectionExport'
|
|
139
144
|
});
|
|
140
145
|
});
|
|
@@ -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\nconst FALLBACK_BATCH_SIZE = 100\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 const disableDownload = exportConfig?.disableDownload ?? false\n const disableSave = exportConfig?.disableSave ?? false\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 // Synchronous export hook - runs when target collection has disableJobsQueue enabled\n beforeOperation.push(async ({ args, collection: collectionConfig, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const exportData = args.data as Export\n const targetCollection = req.payload.collections[exportData.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n\n // Check if this target collection should use sync mode\n // Fall back to exportConfig (for custom collections with overrideCollection)\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (!disableJobsQueue) {\n return\n }\n\n const { user } = req\n const debug = pluginConfig.debug\n\n const exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n await createExport({\n ...exportData,\n batchSize,\n debug,\n exportCollection: collectionConfig.slug,\n maxLimit,\n req,\n userCollection: user?.collection,\n userID: user?.id,\n })\n })\n\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (disableJobsQueue) {\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 exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\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,\n userID: user?.id,\n where: doc.where,\n }\n\n await req.payload.jobs.queue({\n input,\n task: 'createCollectionExport',\n })\n })\n\n return collection\n}\n"],"names":["resolveLimit","createExport","getFields","handleDownload","handlePreview","FALLBACK_BATCH_SIZE","getExportCollection","collectionSlugs","config","exportConfig","pluginConfig","beforeOperation","afterChange","disableDownload","disableSave","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","exportData","data","targetCollection","payload","collections","collectionSlug","targetPluginConfig","disableJobsQueue","exportDisableJobsQueue","user","exportLimitConfig","exportLimit","maxLimit","limit","batchSize","exportBatchSize","exportCollection","userCollection","userID","id","doc","input","name","drafts","locale","page","sort","where","jobs","queue","task"],"mappings":"AAUA,SAASA,YAAY,QAAQ,+BAA8B;AAC3D,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,aAAa,QAAQ,qBAAoB;AAElD,MAAMC,sBAAsB;AAE5B,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,eAAe,EACfC,MAAM,EACNC,YAAY,EACZC,YAAY,EASb;IACC,MAAMC,kBAAmD,EAAE;IAC3D,MAAMC,cAA2C,EAAE;IAEnD,MAAMC,kBAAkBJ,cAAcI,mBAAmB;IACzD,MAAMC,cAAcL,cAAcK,eAAe;IACjD,MAAMC,SAASN,cAAcM;IAE7B,MAAMC,aAA+B;QACnCC,MAAM;QACNC,QAAQ;YACNC,QAAQ,IAAM;QAChB;QACAC,OAAO;YACLC,YAAY;gBACVC,MAAM;oBACJC,YAAY;gBACd;YACF;YACAC,QAAQ;gBACNX;gBACAC;gBACAC;gBACA,wBAAwB;oBACtBR;gBACF;YACF;YACAkB,qBAAqB;YACrBC,OAAO;YACPC,YAAY;QACd;QACAC,kBAAkB;QAClBC,WAAW;YACT;gBACEC,SAAS,CAACC,MAAQ5B,eAAe4B,KAAKrB,aAAasB,KAAK;gBACxDC,QAAQ;gBACRC,MAAM;YACR;YACA;gBACEJ,SAAS1B;gBACT6B,QAAQ;gBACRC,MAAM;YACR;SACD;QACDC,QAAQjC,UAAU;YAAEK;YAAiBC;YAAQO;QAAO;QACpDqB,OAAO;YACLxB;YACAD;QACF;QACA0B,eAAe;QACfC,QAAQ;YACNC,uBAAuB;YACvBC,uBAAuB;YACvBC,gBAAgB;QAClB;IACF;IAEA,qFAAqF;IACrF9B,gBAAgB+B,IAAI,CAAC,OAAO,EAAEC,IAAI,EAAE3B,YAAY4B,gBAAgB,EAAEC,SAAS,EAAEd,GAAG,EAAE;QAChF,IAAIc,cAAc,UAAU;YAC1B;QACF;QAEA,MAAMC,aAAaH,KAAKI,IAAI;QAC5B,MAAMC,mBAAmBjB,IAAIkB,OAAO,CAACC,WAAW,CAACJ,WAAWK,cAAc,CAAC;QAC3E,MAAMC,qBAAqBJ,kBAAkBxC,OAAOgB,QAAQ,CAAC,uBAAuB;QAEpF,uDAAuD;QACvD,6EAA6E;QAC7E,MAAM6B,mBACJD,oBAAoBE,0BAA0B7C,cAAc4C,oBAAoB;QAClF,IAAI,CAACA,kBAAkB;YACrB;QACF;QAEA,MAAM,EAAEE,IAAI,EAAE,GAAGxB;QACjB,MAAMC,QAAQtB,aAAasB,KAAK;QAEhC,MAAMwB,oBAAuCJ,oBAAoBK;QACjE,MAAMC,WAAW,MAAM1D,aAAa;YAClC2D,OAAOH;YACPzB;QACF;QAEA,MAAM6B,YACJR,oBAAoBS,mBACpBpD,cAAcmD,aACdlD,aAAakD,SAAS,IACtBvD;QAEF,MAAMJ,aAAa;YACjB,GAAG6C,UAAU;YACbc;YACA5B;YACA8B,kBAAkBlB,iBAAiB3B,IAAI;
|
|
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 { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js'\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\nconst FALLBACK_BATCH_SIZE = 100\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 const disableDownload = exportConfig?.disableDownload ?? false\n const disableSave = exportConfig?.disableSave ?? false\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 // Synchronous export hook - runs when target collection has disableJobsQueue enabled\n beforeOperation.push(async ({ args, collection: collectionConfig, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const exportData = args.data as Export\n const targetCollection = req.payload.collections[exportData.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n\n // Check if this target collection should use sync mode\n // Fall back to exportConfig (for custom collections with overrideCollection)\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (!disableJobsQueue) {\n return\n }\n\n const { user } = req\n const debug = pluginConfig.debug\n\n const exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n await createExport({\n ...exportData,\n batchSize,\n debug,\n exportCollection: collectionConfig.slug,\n exportDoc: getSubmittedFormValues({ formData: exportData }),\n maxLimit,\n req,\n userCollection: user?.collection,\n userID: user?.id,\n })\n })\n\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (disableJobsQueue) {\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 exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\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,\n userID: user?.id,\n where: doc.where,\n }\n\n await req.payload.jobs.queue({\n input,\n overrideAccess: true,\n task: 'createCollectionExport',\n })\n })\n\n return collection\n}\n"],"names":["getSubmittedFormValues","resolveLimit","createExport","getFields","handleDownload","handlePreview","FALLBACK_BATCH_SIZE","getExportCollection","collectionSlugs","config","exportConfig","pluginConfig","beforeOperation","afterChange","disableDownload","disableSave","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","exportData","data","targetCollection","payload","collections","collectionSlug","targetPluginConfig","disableJobsQueue","exportDisableJobsQueue","user","exportLimitConfig","exportLimit","maxLimit","limit","batchSize","exportBatchSize","exportCollection","exportDoc","formData","userCollection","userID","id","doc","input","name","drafts","locale","page","sort","where","jobs","queue","overrideAccess","task"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleDownload.d.ts","sourceRoot":"","sources":["../../src/export/handleDownload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"handleDownload.d.ts","sourceRoot":"","sources":["../../src/export/handleDownload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C,eAAO,MAAM,cAAc,QAAe,cAAc,uCA6DvD,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { APIError } from 'payload';
|
|
2
|
+
import { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js';
|
|
2
3
|
import { resolveLimit } from '../utilities/resolveLimit.js';
|
|
3
4
|
import { createExport } from './createExport.js';
|
|
4
5
|
export const handleDownload = async (req, debug = false)=>{
|
|
@@ -28,15 +29,18 @@ export const handleDownload = async (req, debug = false)=>{
|
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
31
|
const { user } = req;
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
const exportDoc = getSubmittedFormValues({
|
|
33
|
+
formData: body.data
|
|
34
|
+
});
|
|
33
35
|
const res = await createExport({
|
|
34
36
|
...body.data,
|
|
35
37
|
debug,
|
|
36
38
|
download: true,
|
|
39
|
+
exportDoc,
|
|
37
40
|
maxLimit,
|
|
38
41
|
req,
|
|
39
|
-
|
|
42
|
+
userCollection: user?.collection,
|
|
43
|
+
userID: user?.id
|
|
40
44
|
});
|
|
41
45
|
return res;
|
|
42
46
|
} catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export/handleDownload.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\n\nexport const handleDownload = async (req: PayloadRequest, debug = false) => {\n try {\n let body\n\n if (typeof req?.json === 'function') {\n body = await req.json()\n }\n\n if (!body || !body.data) {\n throw new APIError('Request data is required.')\n }\n\n const { collectionSlug, format } = body.data || {}\n\n req.payload.logger.info(`Download request received ${collectionSlug}`)\n\n const targetCollection = req.payload.collections[collectionSlug]\n let maxLimit: number | undefined\n\n if (targetCollection) {\n const adminPluginConfig = targetCollection.config.admin?.custom?.['plugin-import-export']\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n\n const forcedFormat = adminPluginConfig?.exportFormat\n if (forcedFormat && format && format !== forcedFormat) {\n throw new APIError(\n `Export format '${format}' is not supported for collection '${collectionSlug}'. Only '${forcedFormat}' format is allowed.`,\n )\n }\n\n // Resolve max limit from the collection config\n maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n }\n\n const { user } = req\n
|
|
1
|
+
{"version":3,"sources":["../../src/export/handleDownload.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport type { ExportDoc } from '../types.js'\n\nimport { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\n\nexport const handleDownload = async (req: PayloadRequest, debug = false) => {\n try {\n let body\n\n if (typeof req?.json === 'function') {\n body = await req.json()\n }\n\n if (!body || !body.data) {\n throw new APIError('Request data is required.')\n }\n\n const { collectionSlug, format } = body.data || {}\n\n req.payload.logger.info(`Download request received ${collectionSlug}`)\n\n const targetCollection = req.payload.collections[collectionSlug]\n let maxLimit: number | undefined\n\n if (targetCollection) {\n const adminPluginConfig = targetCollection.config.admin?.custom?.['plugin-import-export']\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n\n const forcedFormat = adminPluginConfig?.exportFormat\n if (forcedFormat && format && format !== forcedFormat) {\n throw new APIError(\n `Export format '${format}' is not supported for collection '${collectionSlug}'. Only '${forcedFormat}' format is allowed.`,\n )\n }\n\n // Resolve max limit from the collection config\n maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n }\n\n const { user } = req\n const exportDoc = getSubmittedFormValues({\n formData: body.data as Record<string, unknown>,\n }) as ExportDoc\n\n const res = await createExport({\n ...body.data,\n debug,\n download: true,\n exportDoc,\n maxLimit,\n req,\n userCollection: user?.collection,\n userID: user?.id,\n })\n\n return res as Response\n } catch (err) {\n // Return JSON for front-end toast\n return new Response(\n JSON.stringify({ errors: [{ message: (err as Error).message || 'Something went wrong' }] }),\n { headers: { 'Content-Type': 'application/json' }, status: 400 },\n )\n }\n}\n"],"names":["APIError","getSubmittedFormValues","resolveLimit","createExport","handleDownload","req","debug","body","json","data","collectionSlug","format","payload","logger","info","targetCollection","collections","maxLimit","adminPluginConfig","config","admin","custom","pluginConfig","forcedFormat","exportFormat","limit","exportLimit","user","exportDoc","formData","res","download","userCollection","collection","userID","id","err","Response","JSON","stringify","errors","message","headers","status"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAIlC,SAASC,sBAAsB,QAAQ,yCAAwC;AAC/E,SAASC,YAAY,QAAQ,+BAA8B;AAC3D,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,OAAO,MAAMC,iBAAiB,OAAOC,KAAqBC,QAAQ,KAAK;IACrE,IAAI;QACF,IAAIC;QAEJ,IAAI,OAAOF,KAAKG,SAAS,YAAY;YACnCD,OAAO,MAAMF,IAAIG,IAAI;QACvB;QAEA,IAAI,CAACD,QAAQ,CAACA,KAAKE,IAAI,EAAE;YACvB,MAAM,IAAIT,SAAS;QACrB;QAEA,MAAM,EAAEU,cAAc,EAAEC,MAAM,EAAE,GAAGJ,KAAKE,IAAI,IAAI,CAAC;QAEjDJ,IAAIO,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,0BAA0B,EAAEJ,gBAAgB;QAErE,MAAMK,mBAAmBV,IAAIO,OAAO,CAACI,WAAW,CAACN,eAAe;QAChE,IAAIO;QAEJ,IAAIF,kBAAkB;YACpB,MAAMG,oBAAoBH,iBAAiBI,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,uBAAuB;YACzF,MAAMC,eAAeP,iBAAiBI,MAAM,CAACE,MAAM,EAAE,CAAC,uBAAuB;YAE7E,MAAME,eAAeL,mBAAmBM;YACxC,IAAID,gBAAgBZ,UAAUA,WAAWY,cAAc;gBACrD,MAAM,IAAIvB,SACR,CAAC,eAAe,EAAEW,OAAO,mCAAmC,EAAED,eAAe,SAAS,EAAEa,aAAa,oBAAoB,CAAC;YAE9H;YAEA,+CAA+C;YAC/CN,WAAW,MAAMf,aAAa;gBAC5BuB,OAAOH,cAAcI;gBACrBrB;YACF;QACF;QAEA,MAAM,EAAEsB,IAAI,EAAE,GAAGtB;QACjB,MAAMuB,YAAY3B,uBAAuB;YACvC4B,UAAUtB,KAAKE,IAAI;QACrB;QAEA,MAAMqB,MAAM,MAAM3B,aAAa;YAC7B,GAAGI,KAAKE,IAAI;YACZH;YACAyB,UAAU;YACVH;YACAX;YACAZ;YACA2B,gBAAgBL,MAAMM;YACtBC,QAAQP,MAAMQ;QAChB;QAEA,OAAOL;IACT,EAAE,OAAOM,KAAK;QACZ,kCAAkC;QAClC,OAAO,IAAIC,SACTC,KAAKC,SAAS,CAAC;YAAEC,QAAQ;gBAAC;oBAAEC,SAAS,AAACL,IAAcK,OAAO,IAAI;gBAAuB;aAAE;QAAC,IACzF;YAAEC,SAAS;gBAAE,gBAAgB;YAAmB;YAAGC,QAAQ;QAAI;IAEnE;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/export/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/export/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,SAAS,CAAA;AAqD1D,eAAO,MAAM,aAAa,QAAe,cAAc,KAAG,OAAO,CAAC,QAAQ,CA2RzE,CAAA"}
|
|
@@ -7,16 +7,18 @@ import { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js
|
|
|
7
7
|
import { getFlattenedFieldKeys } from '../utilities/getFlattenedFieldKeys.js';
|
|
8
8
|
import { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js';
|
|
9
9
|
import { getSelect } from '../utilities/getSelect.js';
|
|
10
|
+
import { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js';
|
|
10
11
|
import { removeDisabledFields } from '../utilities/removeDisabledFields.js';
|
|
11
12
|
import { resolveLimit } from '../utilities/resolveLimit.js';
|
|
12
13
|
import { setNestedValue } from '../utilities/setNestedValue.js';
|
|
13
|
-
const applyExportBeforeHook = async (
|
|
14
|
+
const applyExportBeforeHook = async ({ data, exportDoc, format, hook, originalDocs, req })=>{
|
|
14
15
|
if (!hook || data.length === 0) {
|
|
15
16
|
return data;
|
|
16
17
|
}
|
|
17
18
|
return hook({
|
|
18
19
|
batchNumber: 1,
|
|
19
20
|
data,
|
|
21
|
+
exportDoc,
|
|
20
22
|
format,
|
|
21
23
|
originalData: originalDocs,
|
|
22
24
|
req,
|
|
@@ -25,10 +27,13 @@ const applyExportBeforeHook = async (hook, data, originalDocs, format, req)=>{
|
|
|
25
27
|
};
|
|
26
28
|
export const handlePreview = async (req)=>{
|
|
27
29
|
await addDataAndFileToRequest(req);
|
|
28
|
-
const { collectionSlug, draft: draftFromReq, fields, limit: exportLimit, locale, previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT, previewPage: rawPreviewPage = 1, sort, where: whereFromReq = {} } = req.data;
|
|
30
|
+
const { collectionSlug, draft: draftFromReq, fields, formData, limit: exportLimit, locale, previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT, previewPage: rawPreviewPage = 1, sort, where: whereFromReq = {} } = req.data;
|
|
29
31
|
// Validate and clamp pagination values to safe bounds
|
|
30
32
|
const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT));
|
|
31
33
|
const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage);
|
|
34
|
+
const exportDoc = getSubmittedFormValues({
|
|
35
|
+
formData: formData ?? {}
|
|
36
|
+
});
|
|
32
37
|
const targetCollection = req.payload.collections[collectionSlug];
|
|
33
38
|
if (!targetCollection) {
|
|
34
39
|
return Response.json({
|
|
@@ -154,7 +159,14 @@ export const handlePreview = async (req)=>{
|
|
|
154
159
|
format: 'csv',
|
|
155
160
|
req
|
|
156
161
|
}));
|
|
157
|
-
transformed = await applyExportBeforeHook(
|
|
162
|
+
transformed = await applyExportBeforeHook({
|
|
163
|
+
data: transformed,
|
|
164
|
+
exportDoc,
|
|
165
|
+
format: 'csv',
|
|
166
|
+
hook: exportHooks?.before,
|
|
167
|
+
originalDocs: docs,
|
|
168
|
+
req
|
|
169
|
+
});
|
|
158
170
|
if (schemaColumns && transformed.length > 0) {
|
|
159
171
|
const dataColumns = [];
|
|
160
172
|
const seenCols = new Set();
|
|
@@ -199,13 +211,20 @@ export const handlePreview = async (req)=>{
|
|
|
199
211
|
const trimmed = {};
|
|
200
212
|
for (const key of fields){
|
|
201
213
|
const value = getObjectDotNotation(output, key);
|
|
202
|
-
setNestedValue(trimmed, key, value ?? null);
|
|
214
|
+
setNestedValue(trimmed, key, value ?? null, output);
|
|
203
215
|
}
|
|
204
216
|
output = trimmed;
|
|
205
217
|
}
|
|
206
218
|
return output;
|
|
207
219
|
});
|
|
208
|
-
transformed = await applyExportBeforeHook(
|
|
220
|
+
transformed = await applyExportBeforeHook({
|
|
221
|
+
data: transformed,
|
|
222
|
+
exportDoc,
|
|
223
|
+
format: 'json',
|
|
224
|
+
hook: exportHooks?.before,
|
|
225
|
+
originalDocs: docs,
|
|
226
|
+
req
|
|
227
|
+
});
|
|
209
228
|
}
|
|
210
229
|
const hasNextPage = previewPage < previewTotalPages;
|
|
211
230
|
const hasPrevPage = previewPage > 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest, Sort, Where } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\nimport { getObjectDotNotation } from 'payload/shared'\n\nimport type { ExportBeforeHook, ExportPreviewResponse } from '../types.js'\n\nimport {\n DEFAULT_PREVIEW_LIMIT,\n MAX_PREVIEW_LIMIT,\n MIN_PREVIEW_LIMIT,\n MIN_PREVIEW_PAGE,\n} from '../constants.js'\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFlattenedFieldKeys } from '../utilities/getFlattenedFieldKeys.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { setNestedValue } from '../utilities/setNestedValue.js'\n\nconst applyExportBeforeHook = async (\n hook: ExportBeforeHook | undefined,\n data: Record<string, unknown>[],\n originalDocs: unknown[],\n format: 'csv' | 'json' | ({} & string),\n req: PayloadRequest,\n): Promise<Record<string, unknown>[]> => {\n if (!hook || data.length === 0) {\n return data\n }\n return hook({\n batchNumber: 1,\n data,\n format,\n originalData: originalDocs as Record<string, unknown>[],\n req,\n totalBatches: 1,\n })\n}\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n draft: draftFromReq,\n fields,\n limit: exportLimit,\n locale,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n sort,\n where: whereFromReq = {},\n } = req.data as {\n collectionSlug: string\n draft?: 'no' | 'yes'\n fields?: string[]\n format?: 'csv' | 'json'\n limit?: number\n locale?: string\n previewLimit?: number\n previewPage?: number\n sort?: Sort\n where?: Where\n }\n\n // Validate and clamp pagination values to safe bounds\n const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT))\n const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage)\n\n const targetCollection = req.payload.collections[collectionSlug]\n if (!targetCollection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n const maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n const draft = draftFromReq === 'yes'\n const collectionHasVersions = Boolean(targetCollection.config.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = collectionHasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromReq, draft ? {} : publishedWhere],\n }\n\n // Count total docs matching export criteria\n const countResult = await req.payload.count({\n collection: collectionSlug,\n overrideAccess: false,\n req,\n where,\n })\n\n const totalMatchingDocs = countResult.totalDocs\n\n // Calculate actual export count (respecting both export limit and max limit)\n let effectiveLimit = totalMatchingDocs\n\n // Apply user's export limit if provided\n if (exportLimit && exportLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, exportLimit)\n }\n\n // Apply max limit if configured\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, maxLimit)\n }\n\n const exportTotalDocs = effectiveLimit\n\n // Calculate preview pagination that respects export limit\n // Preview should only show docs that will actually be exported\n const previewStartIndex = (previewPage - 1) * previewLimit\n\n // Calculate pagination info based on export limit (not raw DB results)\n const previewTotalPages = exportTotalDocs === 0 ? 0 : Math.ceil(exportTotalDocs / previewLimit)\n\n const isCSV = req?.data?.format === 'csv'\n\n // Get locale codes for locale expansion when locale='all'\n const localeCodes =\n locale === 'all' && req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n // Get disabled fields configuration\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n // Compute schema-based columns for CSV (provides base ordering and handles empty exports)\n const schemaColumns = isCSV\n ? getSchemaColumns({\n collectionConfig: targetCollection.config,\n disabledFields,\n fields,\n locale: locale ?? undefined,\n localeCodes,\n })\n : undefined\n\n // columns will be finalized after data is available (merged with data-discovered columns)\n let columns = schemaColumns\n\n // If we're beyond the effective limit (considering both user limit and maxLimit), return empty docs\n if (exportTotalDocs > 0 && previewStartIndex >= exportTotalDocs) {\n const response: ExportPreviewResponse = {\n columns,\n docs: [],\n exportTotalDocs,\n hasNextPage: false,\n hasPrevPage: previewPage > 1,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n return Response.json(response)\n }\n\n // Fetch preview page with full previewLimit to maintain consistent pagination offsets\n // We'll trim the results afterwards if needed to respect export limit\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n draft,\n limit: previewLimit,\n locale,\n overrideAccess: false,\n page: previewPage,\n req,\n select,\n sort,\n where,\n })\n\n // Trim docs to respect effective limit boundary (user limit clamped by maxLimit)\n let docs = result.docs\n if (exportTotalDocs > 0) {\n const remainingInExport = exportTotalDocs - previewStartIndex\n if (remainingInExport < docs.length) {\n docs = docs.slice(0, remainingInExport)\n }\n }\n\n // Transform docs based on format\n let transformed: Record<string, unknown>[]\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: targetCollection.config.flattenedFields,\n })\n\n const exportHooks = targetCollection.config.custom?.['plugin-import-export']?.exportHooks\n\n if (isCSV) {\n const possibleKeys = getFlattenedFieldKeys(targetCollection.config.flattenedFields, '', {\n localeCodes,\n })\n\n // Flatten docs without padding yet. This preserves the exact keys produced by beforeExport hooks,\n // allowing mergeColumns to detect which schema columns were replaced with derived ones.\n transformed = docs.map((doc) =>\n flattenObject({\n data: doc,\n exportFieldHooks,\n fields,\n format: 'csv',\n req,\n }),\n )\n\n transformed = await applyExportBeforeHook(exportHooks?.before, transformed, docs, 'csv', req)\n\n if (schemaColumns && transformed.length > 0) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of transformed) {\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 const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n columns =\n Boolean(exportHooks?.before) && transformed.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n }\n\n // Pad rows with null for missing columns (uses merged columns, not raw schema)\n if (!fields || fields.length === 0) {\n const paddingKeys = columns ?? possibleKeys\n for (const row of transformed) {\n for (const key of paddingKeys) {\n if (!(key in row)) {\n row[key] = null\n }\n }\n }\n }\n } else {\n transformed = docs.map((doc) => {\n // Apply field-level export hooks for JSON format\n let output: Record<string, unknown> = applyFieldHooks({\n type: 'beforeExport',\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: targetCollection.config.flattenedFields,\n format: 'json',\n operation: 'export',\n req,\n })\n\n // Remove disabled fields\n output = removeDisabledFields(output, disabledFields)\n\n // Then trim to selected fields only (if fields are provided)\n if (Array.isArray(fields) && fields.length > 0) {\n const trimmed: Record<string, unknown> = {}\n\n for (const key of fields) {\n const value = getObjectDotNotation(output, key)\n setNestedValue(trimmed, key, value ?? null)\n }\n\n output = trimmed\n }\n\n return output\n })\n\n transformed = await applyExportBeforeHook(exportHooks?.before, transformed, docs, 'json', req)\n }\n\n const hasNextPage = previewPage < previewTotalPages\n const hasPrevPage = previewPage > 1\n\n const response: ExportPreviewResponse = {\n columns,\n docs: transformed,\n exportTotalDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n\n return Response.json(response)\n}\n"],"names":["addDataAndFileToRequest","getObjectDotNotation","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","applyFieldHooks","flattenObject","getExportFieldFunctions","getFlattenedFieldKeys","getSchemaColumns","mergeColumns","getSelect","removeDisabledFields","resolveLimit","setNestedValue","applyExportBeforeHook","hook","data","originalDocs","format","req","length","batchNumber","originalData","totalBatches","handlePreview","collectionSlug","draft","draftFromReq","fields","limit","exportLimit","locale","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","sort","where","whereFromReq","Math","max","min","targetCollection","payload","collections","Response","json","error","status","pluginConfig","config","custom","maxLimit","select","Array","isArray","undefined","collectionHasVersions","Boolean","versions","publishedWhere","_status","equals","and","countResult","count","collection","overrideAccess","totalMatchingDocs","totalDocs","effectiveLimit","exportTotalDocs","previewStartIndex","previewTotalPages","ceil","isCSV","localeCodes","localization","disabledFields","admin","schemaColumns","collectionConfig","columns","response","docs","hasNextPage","hasPrevPage","page","totalPages","result","find","depth","remainingInExport","slice","transformed","exportFieldHooks","flattenedFields","exportHooks","possibleKeys","map","doc","before","dataColumns","seenCols","Set","row","key","Object","keys","has","add","push","mergedColumns","filter","col","includes","paddingKeys","output","type","fieldHooks","operation","trimmed","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/export/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest, Sort, Where } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\nimport { getObjectDotNotation } from 'payload/shared'\n\nimport type { ExportBeforeHook, ExportDoc, ExportPreviewResponse } from '../types.js'\n\nimport {\n DEFAULT_PREVIEW_LIMIT,\n MAX_PREVIEW_LIMIT,\n MIN_PREVIEW_LIMIT,\n MIN_PREVIEW_PAGE,\n} from '../constants.js'\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFlattenedFieldKeys } from '../utilities/getFlattenedFieldKeys.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { setNestedValue } from '../utilities/setNestedValue.js'\n\nconst applyExportBeforeHook = async ({\n data,\n exportDoc,\n format,\n hook,\n originalDocs,\n req,\n}: {\n data: Record<string, unknown>[]\n exportDoc: ExportDoc\n format: 'csv' | 'json' | ({} & string)\n hook: ExportBeforeHook | undefined\n originalDocs: unknown[]\n req: PayloadRequest\n}): Promise<Record<string, unknown>[]> => {\n if (!hook || data.length === 0) {\n return data\n }\n return hook({\n batchNumber: 1,\n data,\n exportDoc,\n format,\n originalData: originalDocs as Record<string, unknown>[],\n req,\n totalBatches: 1,\n })\n}\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n draft: draftFromReq,\n fields,\n formData,\n limit: exportLimit,\n locale,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n sort,\n where: whereFromReq = {},\n } = req.data as {\n collectionSlug: string\n draft?: 'no' | 'yes'\n fields?: string[]\n format?: 'csv' | 'json'\n formData?: Record<string, unknown>\n limit?: number\n locale?: string\n previewLimit?: number\n previewPage?: number\n sort?: Sort\n where?: Where\n }\n\n // Validate and clamp pagination values to safe bounds\n const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT))\n const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage)\n\n const exportDoc = getSubmittedFormValues({\n formData: formData ?? {},\n }) as ExportDoc\n\n const targetCollection = req.payload.collections[collectionSlug]\n if (!targetCollection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n const maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n const draft = draftFromReq === 'yes'\n const collectionHasVersions = Boolean(targetCollection.config.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = collectionHasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromReq, draft ? {} : publishedWhere],\n }\n\n // Count total docs matching export criteria\n const countResult = await req.payload.count({\n collection: collectionSlug,\n overrideAccess: false,\n req,\n where,\n })\n\n const totalMatchingDocs = countResult.totalDocs\n\n // Calculate actual export count (respecting both export limit and max limit)\n let effectiveLimit = totalMatchingDocs\n\n // Apply user's export limit if provided\n if (exportLimit && exportLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, exportLimit)\n }\n\n // Apply max limit if configured\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, maxLimit)\n }\n\n const exportTotalDocs = effectiveLimit\n\n // Calculate preview pagination that respects export limit\n // Preview should only show docs that will actually be exported\n const previewStartIndex = (previewPage - 1) * previewLimit\n\n // Calculate pagination info based on export limit (not raw DB results)\n const previewTotalPages = exportTotalDocs === 0 ? 0 : Math.ceil(exportTotalDocs / previewLimit)\n\n const isCSV = req?.data?.format === 'csv'\n\n // Get locale codes for locale expansion when locale='all'\n const localeCodes =\n locale === 'all' && req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n // Get disabled fields configuration\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n // Compute schema-based columns for CSV (provides base ordering and handles empty exports)\n const schemaColumns = isCSV\n ? getSchemaColumns({\n collectionConfig: targetCollection.config,\n disabledFields,\n fields,\n locale: locale ?? undefined,\n localeCodes,\n })\n : undefined\n\n // columns will be finalized after data is available (merged with data-discovered columns)\n let columns = schemaColumns\n\n // If we're beyond the effective limit (considering both user limit and maxLimit), return empty docs\n if (exportTotalDocs > 0 && previewStartIndex >= exportTotalDocs) {\n const response: ExportPreviewResponse = {\n columns,\n docs: [],\n exportTotalDocs,\n hasNextPage: false,\n hasPrevPage: previewPage > 1,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n return Response.json(response)\n }\n\n // Fetch preview page with full previewLimit to maintain consistent pagination offsets\n // We'll trim the results afterwards if needed to respect export limit\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n draft,\n limit: previewLimit,\n locale,\n overrideAccess: false,\n page: previewPage,\n req,\n select,\n sort,\n where,\n })\n\n // Trim docs to respect effective limit boundary (user limit clamped by maxLimit)\n let docs = result.docs\n if (exportTotalDocs > 0) {\n const remainingInExport = exportTotalDocs - previewStartIndex\n if (remainingInExport < docs.length) {\n docs = docs.slice(0, remainingInExport)\n }\n }\n\n // Transform docs based on format\n let transformed: Record<string, unknown>[]\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: targetCollection.config.flattenedFields,\n })\n\n const exportHooks = targetCollection.config.custom?.['plugin-import-export']?.exportHooks\n\n if (isCSV) {\n const possibleKeys = getFlattenedFieldKeys(targetCollection.config.flattenedFields, '', {\n localeCodes,\n })\n\n // Flatten docs without padding yet. This preserves the exact keys produced by beforeExport hooks,\n // allowing mergeColumns to detect which schema columns were replaced with derived ones.\n transformed = docs.map((doc) =>\n flattenObject({\n data: doc,\n exportFieldHooks,\n fields,\n format: 'csv',\n req,\n }),\n )\n\n transformed = await applyExportBeforeHook({\n data: transformed,\n exportDoc,\n format: 'csv',\n hook: exportHooks?.before,\n originalDocs: docs,\n req,\n })\n\n if (schemaColumns && transformed.length > 0) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of transformed) {\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 const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n columns =\n Boolean(exportHooks?.before) && transformed.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n }\n\n // Pad rows with null for missing columns (uses merged columns, not raw schema)\n if (!fields || fields.length === 0) {\n const paddingKeys = columns ?? possibleKeys\n for (const row of transformed) {\n for (const key of paddingKeys) {\n if (!(key in row)) {\n row[key] = null\n }\n }\n }\n }\n } else {\n transformed = docs.map((doc) => {\n // Apply field-level export hooks for JSON format\n let output: Record<string, unknown> = applyFieldHooks({\n type: 'beforeExport',\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: targetCollection.config.flattenedFields,\n format: 'json',\n operation: 'export',\n req,\n })\n\n // Remove disabled fields\n output = removeDisabledFields(output, disabledFields)\n\n // Then trim to selected fields only (if fields are provided)\n if (Array.isArray(fields) && fields.length > 0) {\n const trimmed: Record<string, unknown> = {}\n\n for (const key of fields) {\n const value = getObjectDotNotation(output, key)\n setNestedValue(trimmed, key, value ?? null, output)\n }\n\n output = trimmed\n }\n\n return output\n })\n\n transformed = await applyExportBeforeHook({\n data: transformed,\n exportDoc,\n format: 'json',\n hook: exportHooks?.before,\n originalDocs: docs,\n req,\n })\n }\n\n const hasNextPage = previewPage < previewTotalPages\n const hasPrevPage = previewPage > 1\n\n const response: ExportPreviewResponse = {\n columns,\n docs: transformed,\n exportTotalDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n\n return Response.json(response)\n}\n"],"names":["addDataAndFileToRequest","getObjectDotNotation","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","applyFieldHooks","flattenObject","getExportFieldFunctions","getFlattenedFieldKeys","getSchemaColumns","mergeColumns","getSelect","getSubmittedFormValues","removeDisabledFields","resolveLimit","setNestedValue","applyExportBeforeHook","data","exportDoc","format","hook","originalDocs","req","length","batchNumber","originalData","totalBatches","handlePreview","collectionSlug","draft","draftFromReq","fields","formData","limit","exportLimit","locale","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","sort","where","whereFromReq","Math","max","min","targetCollection","payload","collections","Response","json","error","status","pluginConfig","config","custom","maxLimit","select","Array","isArray","undefined","collectionHasVersions","Boolean","versions","publishedWhere","_status","equals","and","countResult","count","collection","overrideAccess","totalMatchingDocs","totalDocs","effectiveLimit","exportTotalDocs","previewStartIndex","previewTotalPages","ceil","isCSV","localeCodes","localization","disabledFields","admin","schemaColumns","collectionConfig","columns","response","docs","hasNextPage","hasPrevPage","page","totalPages","result","find","depth","remainingInExport","slice","transformed","exportFieldHooks","flattenedFields","exportHooks","possibleKeys","map","doc","before","dataColumns","seenCols","Set","row","key","Object","keys","has","add","push","mergedColumns","filter","col","includes","paddingKeys","output","type","fieldHooks","operation","trimmed","value"],"mappings":"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"}
|
package/dist/exports/types.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type { ExportAfterHook, ExportBeforeHook, FieldBeforeExportHook, FieldBeforeImportHook, ImportAfterHook, ImportBeforeHook, ImportExportPluginConfig, ImportResult, Limit, LimitFunction, } from '../types.js';
|
|
1
|
+
export type { ExportAfterHook, ExportBeforeHook, ExportDoc, FieldBeforeExportHook, FieldBeforeImportHook, ImportAfterHook, ImportBeforeHook, ImportDoc, ImportExportPluginConfig, ImportResult, Limit, LimitFunction, } from '../types.js';
|
|
2
2
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,aAAa,GACd,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,aAAa,GACd,MAAM,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type {\n ExportAfterHook,\n ExportBeforeHook,\n FieldBeforeExportHook,\n FieldBeforeImportHook,\n ImportAfterHook,\n ImportBeforeHook,\n ImportExportPluginConfig,\n ImportResult,\n Limit,\n LimitFunction,\n} from '../types.js'\n"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type {\n ExportAfterHook,\n ExportBeforeHook,\n ExportDoc,\n FieldBeforeExportHook,\n FieldBeforeImportHook,\n ImportAfterHook,\n ImportBeforeHook,\n ImportDoc,\n ImportExportPluginConfig,\n ImportResult,\n Limit,\n LimitFunction,\n} from '../types.js'\n"],"names":[],"mappings":"AAAA,WAaoB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PayloadRequest, User } from 'payload';
|
|
2
|
-
import type { ImportAfterHook, ImportBeforeHook, ImportResult } from '../types.js';
|
|
2
|
+
import type { ImportAfterHook, ImportBeforeHook, ImportDoc, ImportResult } from '../types.js';
|
|
3
3
|
import type { ImportMode } from './createImport.js';
|
|
4
4
|
import { type BatchError } from '../utilities/useBatchProcessor.js';
|
|
5
5
|
/**
|
|
@@ -43,6 +43,7 @@ export interface ImportProcessOptions {
|
|
|
43
43
|
after?: ImportAfterHook;
|
|
44
44
|
before?: ImportBeforeHook;
|
|
45
45
|
};
|
|
46
|
+
importDoc: ImportDoc;
|
|
46
47
|
importMode: ImportMode;
|
|
47
48
|
matchField?: string;
|
|
48
49
|
/** Raw parsed rows before unflattening — used as originalData in hooks */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/import/batchProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAInD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/import/batchProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAInD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EACL,KAAK,UAAU,EAIhB,MAAM,mCAAmC,CAAA;AAE1C;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1B,UAAU,EAAE,KAAK,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAChC,CAAC,CAAA;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,kDAAkD;IAClD,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAC1B,CAAA;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACxC,GAAG,EAAE,cAAc,CAAA;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AA8hBD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;oCAMrC,oBAAoB,KAAG,OAAO,CAAC,YAAY,CAAC;EAmH1F"}
|