@payloadcms/plugin-import-export 4.0.0-internal.c7d5de4 → 4.0.0-internal.cb69780
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.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.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.d.ts.map +1 -1
- package/dist/components/ImportPreview/index.js +17 -1
- 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/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/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 +8 -8
- 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/import/getImportCollection.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionConfig } from 'payload'\n\nimport { FileRetrievalError } from 'payload'\n\nimport type { ImportConfig, ImportExportPluginConfig } from '../types.js'\nimport type { ImportTaskInput } from './getCreateImportCollectionTask.js'\n\nimport { getFileFromDoc } from '../utilities/getFileFromDoc.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createImport } from './createImport.js'\nimport { getFields } from './getFields.js'\nimport { handlePreview } from './handlePreview.js'\n\nconst FALLBACK_BATCH_SIZE = 100\nconst FALLBACK_VERSION_STATUS = 'published'\n\nexport const getImportCollection = ({\n collectionSlugs,\n importConfig,\n pluginConfig,\n}: {\n /**\n * Collection slugs that this import collection supports.\n */\n collectionSlugs: string[]\n importConfig?: ImportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const afterChange: CollectionAfterChangeHook[] = []\n\n const collection: CollectionConfig = {\n slug: 'imports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ImportSaveButton',\n },\n },\n custom: {\n 'plugin-import-export': {\n collectionSlugs,\n },\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'filename',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: handlePreview,\n method: 'post',\n path: '/preview-data',\n },\n ],\n fields: getFields({ collectionSlugs }),\n hooks: {\n afterChange,\n },\n lockDocuments: false,\n upload: {\n filesRequiredOnCreate: true,\n hideFileInputOnCreate: false,\n hideRemoveFile: true,\n mimeTypes: ['text/csv', 'application/json'],\n },\n }\n\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create' || doc.status !== 'pending') {\n return doc\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n\n const disableJobsQueue =\n targetPluginConfig?.importDisableJobsQueue ?? importConfig?.disableJobsQueue ?? false\n\n const debug = pluginConfig.debug || false\n\n if (debug) {\n req.payload.logger.info({\n collectionSlug: doc.collectionSlug,\n disableJobsQueue,\n docId: doc.id,\n msg: '[Import Sync Hook] Starting',\n transactionID: req.transactionID,\n })\n }\n\n if (!disableJobsQueue) {\n return doc\n }\n\n try {\n // Get file data from the uploaded document\n // First try req.file which is available during the same request (especially important for cloud storage)\n // Fall back to getFileFromDoc for cases where req.file isn't available\n let fileData: Buffer\n let fileMimetype: string\n\n if (req.file?.data) {\n fileData = req.file.data\n fileMimetype = req.file.mimetype || doc.mimeType\n\n if (!fileMimetype) {\n throw new FileRetrievalError(\n req.t,\n `Unable to determine mimetype for file: ${doc.filename}`,\n )\n }\n } else {\n const fileFromDoc = await getFileFromDoc({\n collectionConfig,\n doc: {\n filename: doc.filename,\n mimeType: doc.mimeType,\n url: doc.url,\n },\n req,\n })\n fileData = fileFromDoc.data\n fileMimetype = fileFromDoc.mimetype\n }\n\n const maxLimit = await resolveLimit({\n limit: targetPluginConfig?.importLimit,\n req,\n })\n const defaultVersionStatus =\n targetPluginConfig?.defaultVersionStatus ??\n importConfig?.defaultVersionStatus ??\n pluginConfig.defaultVersionStatus ??\n FALLBACK_VERSION_STATUS\n const batchSize =\n targetPluginConfig?.importBatchSize ??\n importConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n const result = await createImport({\n id: doc.id,\n name: doc.filename || 'import',\n batchSize,\n collectionSlug: doc.collectionSlug,\n debug,\n defaultVersionStatus,\n file: {\n name: doc.filename,\n data: fileData,\n mimetype: fileMimetype,\n },\n format: fileMimetype === 'text/csv' ? 'csv' : 'json',\n importMode: doc.importMode || 'create',\n matchField: doc.matchField,\n maxLimit,\n req,\n userCollection: req?.user?.collection,\n userID: req?.user?.id,\n })\n\n // Determine status\n let status: 'completed' | 'failed' | 'partial'\n if (result.errors.length === 0) {\n status = 'completed'\n } else if (result.imported + result.updated === 0) {\n status = 'failed'\n } else {\n status = 'partial'\n }\n\n const summary = {\n imported: result.imported,\n issueDetails:\n result.errors.length > 0\n ? result.errors.map((e) => ({\n data: e.doc,\n error: e.error,\n row: e.index + 1,\n }))\n : undefined,\n issues: result.errors.length,\n total: result.total,\n updated: result.updated,\n }\n\n // Try to update the document with results\n try {\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status,\n summary,\n },\n overrideAccess: true,\n req,\n })\n } catch (updateErr) {\n // Update may fail if document not yet committed\n if (debug) {\n req.payload.logger.error({\n err: updateErr,\n msg: `Failed to update import document ${doc.id} with results`,\n })\n }\n }\n\n // Return updated doc for immediate response\n return {\n ...doc,\n status,\n summary,\n }\n } catch (err) {\n const summary = {\n imported: 0,\n issueDetails: [\n {\n data: {},\n error: err instanceof Error ? err.message : String(err),\n row: 0,\n },\n ],\n issues: 1,\n total: 0,\n updated: 0,\n }\n\n if (debug) {\n req.payload.logger.error({\n docId: doc.id,\n err,\n msg: '[Import Sync Hook] Import processing failed, attempting to update status',\n transactionID: req.transactionID,\n })\n }\n\n // Try to update document with error status\n try {\n if (debug) {\n req.payload.logger.info({\n collectionSlug: collectionConfig.slug,\n docId: doc.id,\n msg: '[Import Sync Hook] About to update document with failed status',\n })\n }\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status: 'failed',\n summary,\n },\n overrideAccess: true,\n req,\n })\n if (debug) {\n req.payload.logger.info({\n docId: doc.id,\n msg: '[Import Sync Hook] Successfully updated document with failed status',\n })\n }\n } catch (updateErr) {\n // Update may fail if document not yet committed, log but continue\n // ALWAYS log this error to help debug Postgres issues\n req.payload.logger.error({\n err: updateErr,\n msg: `[Import Sync Hook] Failed to update import document ${doc.id} with error status`,\n transactionID: req.transactionID,\n })\n }\n\n if (debug) {\n req.payload.logger.info({\n docId: doc.id,\n msg: '[Import Sync Hook] Returning failed doc',\n status: 'failed',\n })\n }\n\n // Return error status for immediate response\n return {\n ...doc,\n status: 'failed',\n summary,\n }\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\n const disableJobsQueue =\n targetPluginConfig?.importDisableJobsQueue ?? importConfig?.disableJobsQueue ?? false\n\n if (pluginConfig.debug) {\n req.payload.logger.info({\n collectionSlug: doc.collectionSlug,\n disableJobsQueue,\n docId: doc.id,\n docStatus: doc.status,\n msg: '[Import Job Hook] Checking if should queue job',\n transactionID: req.transactionID,\n })\n }\n\n if (disableJobsQueue) {\n if (pluginConfig.debug) {\n req.payload.logger.info({\n docId: doc.id,\n msg: '[Import Job Hook] Skipping job queue (sync mode)',\n })\n }\n return\n }\n\n try {\n // Resolve maxLimit ahead of time since it may involve async config resolution\n const maxLimit = await resolveLimit({\n limit: targetPluginConfig?.importLimit,\n req,\n })\n const defaultVersionStatus =\n targetPluginConfig?.defaultVersionStatus ??\n importConfig?.defaultVersionStatus ??\n pluginConfig.defaultVersionStatus ??\n FALLBACK_VERSION_STATUS\n const batchSize =\n targetPluginConfig?.importBatchSize ??\n importConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n const input: ImportTaskInput = {\n batchSize,\n debug: pluginConfig.debug,\n defaultVersionStatus,\n importCollection: collectionConfig.slug,\n importId: doc.id,\n maxLimit,\n userCollection: req.user?.collection,\n userID: req?.user?.id,\n }\n\n await req.payload.jobs.queue({\n input,\n task: 'createCollectionImport',\n })\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to queue import job for document ${doc.id}`,\n })\n }\n })\n\n return collection\n}\n"],"names":["FileRetrievalError","getFileFromDoc","resolveLimit","createImport","getFields","handlePreview","FALLBACK_BATCH_SIZE","FALLBACK_VERSION_STATUS","getImportCollection","collectionSlugs","importConfig","pluginConfig","afterChange","collection","slug","access","update","admin","components","edit","SaveButton","custom","disableCopyToLocale","group","useAsTitle","disableDuplicate","endpoints","handler","method","path","fields","hooks","lockDocuments","upload","filesRequiredOnCreate","hideFileInputOnCreate","hideRemoveFile","mimeTypes","push","collectionConfig","doc","operation","req","status","targetCollection","payload","collections","collectionSlug","targetPluginConfig","config","disableJobsQueue","importDisableJobsQueue","debug","logger","info","docId","id","msg","transactionID","fileData","fileMimetype","file","data","mimetype","mimeType","t","filename","fileFromDoc","url","maxLimit","limit","importLimit","defaultVersionStatus","batchSize","importBatchSize","result","name","format","importMode","matchField","userCollection","user","userID","errors","length","imported","updated","summary","issueDetails","map","e","error","row","index","undefined","issues","total","overrideAccess","updateErr","err","Error","message","String","docStatus","input","importCollection","importId","jobs","queue","task"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/import/getImportCollection.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionConfig } from 'payload'\n\nimport { FileRetrievalError } from 'payload'\n\nimport type { ImportConfig, ImportExportPluginConfig } from '../types.js'\nimport type { ImportTaskInput } from './getCreateImportCollectionTask.js'\n\nimport { getFileFromDoc } from '../utilities/getFileFromDoc.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createImport } from './createImport.js'\nimport { getFields } from './getFields.js'\nimport { handlePreview } from './handlePreview.js'\n\nconst FALLBACK_BATCH_SIZE = 100\nconst FALLBACK_VERSION_STATUS = 'published'\n\nexport const getImportCollection = ({\n collectionSlugs,\n importConfig,\n pluginConfig,\n}: {\n /**\n * Collection slugs that this import collection supports.\n */\n collectionSlugs: string[]\n importConfig?: ImportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const afterChange: CollectionAfterChangeHook[] = []\n\n const collection: CollectionConfig = {\n slug: 'imports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ImportSaveButton',\n },\n },\n custom: {\n 'plugin-import-export': {\n collectionSlugs,\n },\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'filename',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: handlePreview,\n method: 'post',\n path: '/preview-data',\n },\n ],\n fields: getFields({ collectionSlugs }),\n hooks: {\n afterChange,\n },\n lockDocuments: false,\n upload: {\n filesRequiredOnCreate: true,\n hideFileInputOnCreate: false,\n hideRemoveFile: true,\n mimeTypes: ['text/csv', 'application/json'],\n },\n }\n\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create' || doc.status !== 'pending') {\n return doc\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n\n const disableJobsQueue =\n targetPluginConfig?.importDisableJobsQueue ?? importConfig?.disableJobsQueue ?? false\n\n const debug = pluginConfig.debug || false\n\n if (debug) {\n req.payload.logger.info({\n collectionSlug: doc.collectionSlug,\n disableJobsQueue,\n docId: doc.id,\n msg: '[Import Sync Hook] Starting',\n transactionID: req.transactionID,\n })\n }\n\n if (!disableJobsQueue) {\n return doc\n }\n\n try {\n // Get file data from the uploaded document\n // First try req.file which is available during the same request (especially important for cloud storage)\n // Fall back to getFileFromDoc for cases where req.file isn't available\n let fileData: Buffer\n let fileMimetype: string\n\n if (req.file?.data) {\n fileData = req.file.data\n fileMimetype = req.file.mimetype || doc.mimeType\n\n if (!fileMimetype) {\n throw new FileRetrievalError(\n req.t,\n `Unable to determine mimetype for file: ${doc.filename}`,\n )\n }\n } else {\n const fileFromDoc = await getFileFromDoc({\n collectionConfig,\n doc: {\n filename: doc.filename,\n mimeType: doc.mimeType,\n url: doc.url,\n },\n req,\n })\n fileData = fileFromDoc.data\n fileMimetype = fileFromDoc.mimetype\n }\n\n const maxLimit = await resolveLimit({\n limit: targetPluginConfig?.importLimit,\n req,\n })\n const defaultVersionStatus =\n targetPluginConfig?.defaultVersionStatus ??\n importConfig?.defaultVersionStatus ??\n pluginConfig.defaultVersionStatus ??\n FALLBACK_VERSION_STATUS\n const batchSize =\n targetPluginConfig?.importBatchSize ??\n importConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n const result = await createImport({\n id: doc.id,\n name: doc.filename || 'import',\n batchSize,\n collectionSlug: doc.collectionSlug,\n debug,\n defaultVersionStatus,\n file: {\n name: doc.filename,\n data: fileData,\n mimetype: fileMimetype,\n },\n format: fileMimetype === 'text/csv' ? 'csv' : 'json',\n importDoc: doc,\n importMode: doc.importMode || 'create',\n matchField: doc.matchField,\n maxLimit,\n req,\n userCollection: req?.user?.collection,\n userID: req?.user?.id,\n })\n\n // Determine status\n let status: 'completed' | 'failed' | 'partial'\n if (result.errors.length === 0) {\n status = 'completed'\n } else if (result.imported + result.updated === 0) {\n status = 'failed'\n } else {\n status = 'partial'\n }\n\n const summary = {\n imported: result.imported,\n issueDetails:\n result.errors.length > 0\n ? result.errors.map((e) => ({\n data: e.doc,\n error: e.error,\n row: e.index + 1,\n }))\n : undefined,\n issues: result.errors.length,\n total: result.total,\n updated: result.updated,\n }\n\n // Try to update the document with results\n try {\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status,\n summary,\n },\n overrideAccess: true,\n req,\n })\n } catch (updateErr) {\n // Update may fail if document not yet committed\n if (debug) {\n req.payload.logger.error({\n err: updateErr,\n msg: `Failed to update import document ${doc.id} with results`,\n })\n }\n }\n\n // Return updated doc for immediate response\n return {\n ...doc,\n status,\n summary,\n }\n } catch (err) {\n const summary = {\n imported: 0,\n issueDetails: [\n {\n data: {},\n error: err instanceof Error ? err.message : String(err),\n row: 0,\n },\n ],\n issues: 1,\n total: 0,\n updated: 0,\n }\n\n if (debug) {\n req.payload.logger.error({\n docId: doc.id,\n err,\n msg: '[Import Sync Hook] Import processing failed, attempting to update status',\n transactionID: req.transactionID,\n })\n }\n\n // Try to update document with error status\n try {\n if (debug) {\n req.payload.logger.info({\n collectionSlug: collectionConfig.slug,\n docId: doc.id,\n msg: '[Import Sync Hook] About to update document with failed status',\n })\n }\n await req.payload.update({\n id: doc.id,\n collection: collectionConfig.slug,\n data: {\n status: 'failed',\n summary,\n },\n overrideAccess: true,\n req,\n })\n if (debug) {\n req.payload.logger.info({\n docId: doc.id,\n msg: '[Import Sync Hook] Successfully updated document with failed status',\n })\n }\n } catch (updateErr) {\n // Update may fail if document not yet committed, log but continue\n // ALWAYS log this error to help debug Postgres issues\n req.payload.logger.error({\n err: updateErr,\n msg: `[Import Sync Hook] Failed to update import document ${doc.id} with error status`,\n transactionID: req.transactionID,\n })\n }\n\n if (debug) {\n req.payload.logger.info({\n docId: doc.id,\n msg: '[Import Sync Hook] Returning failed doc',\n status: 'failed',\n })\n }\n\n // Return error status for immediate response\n return {\n ...doc,\n status: 'failed',\n summary,\n }\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\n const disableJobsQueue =\n targetPluginConfig?.importDisableJobsQueue ?? importConfig?.disableJobsQueue ?? false\n\n if (pluginConfig.debug) {\n req.payload.logger.info({\n collectionSlug: doc.collectionSlug,\n disableJobsQueue,\n docId: doc.id,\n docStatus: doc.status,\n msg: '[Import Job Hook] Checking if should queue job',\n transactionID: req.transactionID,\n })\n }\n\n if (disableJobsQueue) {\n if (pluginConfig.debug) {\n req.payload.logger.info({\n docId: doc.id,\n msg: '[Import Job Hook] Skipping job queue (sync mode)',\n })\n }\n return\n }\n\n try {\n // Resolve maxLimit ahead of time since it may involve async config resolution\n const maxLimit = await resolveLimit({\n limit: targetPluginConfig?.importLimit,\n req,\n })\n const defaultVersionStatus =\n targetPluginConfig?.defaultVersionStatus ??\n importConfig?.defaultVersionStatus ??\n pluginConfig.defaultVersionStatus ??\n FALLBACK_VERSION_STATUS\n const batchSize =\n targetPluginConfig?.importBatchSize ??\n importConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n const input: ImportTaskInput = {\n batchSize,\n debug: pluginConfig.debug,\n defaultVersionStatus,\n importCollection: collectionConfig.slug,\n importId: doc.id,\n maxLimit,\n userCollection: req.user?.collection,\n userID: req?.user?.id,\n }\n\n await req.payload.jobs.queue({\n input,\n overrideAccess: true,\n task: 'createCollectionImport',\n })\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to queue import job for document ${doc.id}`,\n })\n }\n })\n\n return collection\n}\n"],"names":["FileRetrievalError","getFileFromDoc","resolveLimit","createImport","getFields","handlePreview","FALLBACK_BATCH_SIZE","FALLBACK_VERSION_STATUS","getImportCollection","collectionSlugs","importConfig","pluginConfig","afterChange","collection","slug","access","update","admin","components","edit","SaveButton","custom","disableCopyToLocale","group","useAsTitle","disableDuplicate","endpoints","handler","method","path","fields","hooks","lockDocuments","upload","filesRequiredOnCreate","hideFileInputOnCreate","hideRemoveFile","mimeTypes","push","collectionConfig","doc","operation","req","status","targetCollection","payload","collections","collectionSlug","targetPluginConfig","config","disableJobsQueue","importDisableJobsQueue","debug","logger","info","docId","id","msg","transactionID","fileData","fileMimetype","file","data","mimetype","mimeType","t","filename","fileFromDoc","url","maxLimit","limit","importLimit","defaultVersionStatus","batchSize","importBatchSize","result","name","format","importDoc","importMode","matchField","userCollection","user","userID","errors","length","imported","updated","summary","issueDetails","map","e","error","row","index","undefined","issues","total","overrideAccess","updateErr","err","Error","message","String","docStatus","input","importCollection","importId","jobs","queue","task"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/import/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/import/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAqB7C,eAAO,MAAM,aAAa,QAAe,cAAc,KAAG,OAAO,CAAC,QAAQ,CA4IzE,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { addDataAndFileToRequest } from 'payload';
|
|
|
2
2
|
import { DEFAULT_PREVIEW_LIMIT, MAX_PREVIEW_LIMIT, MIN_PREVIEW_LIMIT, MIN_PREVIEW_PAGE } from '../constants.js';
|
|
3
3
|
import { applyFieldHooks } from '../utilities/applyFieldHooks.js';
|
|
4
4
|
import { getImportFieldFunctions } from '../utilities/getImportFieldFunctions.js';
|
|
5
|
+
import { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js';
|
|
5
6
|
import { parseCSV } from '../utilities/parseCSV.js';
|
|
6
7
|
import { parseJSON } from '../utilities/parseJSON.js';
|
|
7
8
|
import { removeDisabledFields } from '../utilities/removeDisabledFields.js';
|
|
@@ -9,7 +10,7 @@ import { resolveLimit } from '../utilities/resolveLimit.js';
|
|
|
9
10
|
import { unflattenObject } from '../utilities/unflattenObject.js';
|
|
10
11
|
export const handlePreview = async (req)=>{
|
|
11
12
|
await addDataAndFileToRequest(req);
|
|
12
|
-
const { collectionSlug, fileData, format, previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT, previewPage: rawPreviewPage = 1 } = req.data;
|
|
13
|
+
const { collectionSlug, fileData, format, formData, previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT, previewPage: rawPreviewPage = 1 } = req.data;
|
|
13
14
|
// Validate and clamp pagination values to safe bounds
|
|
14
15
|
const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT));
|
|
15
16
|
const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage);
|
|
@@ -82,6 +83,9 @@ export const handlePreview = async (req)=>{
|
|
|
82
83
|
batchNumber: 1,
|
|
83
84
|
data: parsedData,
|
|
84
85
|
format: format ?? 'csv',
|
|
86
|
+
importDoc: getSubmittedFormValues({
|
|
87
|
+
formData: formData ?? {}
|
|
88
|
+
}),
|
|
85
89
|
originalData: originalDocs,
|
|
86
90
|
req,
|
|
87
91
|
totalBatches: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/import/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { ImportPreviewResponse } 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 { getImportFieldFunctions } from '../utilities/getImportFieldFunctions.js'\nimport { parseCSV } from '../utilities/parseCSV.js'\nimport { parseJSON } from '../utilities/parseJSON.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { unflattenObject } from '../utilities/unflattenObject.js'\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n fileData,\n format,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n } = req.data as {\n collectionSlug: string\n fileData?: string\n format?: 'csv' | 'json'\n previewLimit?: number\n previewPage?: number\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 // Resolve max limit from the collection config\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n const maxLimit = await resolveLimit({\n limit: pluginConfig?.importLimit,\n req,\n })\n\n if (!fileData) {\n return Response.json({ error: 'No file data provided' }, { status: 400 })\n }\n\n try {\n // Parse the file data\n let parsedData: Record<string, unknown>[]\n let originalDocs: Record<string, unknown>[] = []\n const buffer = Buffer.from(fileData, 'base64')\n\n const importFieldHooks = getImportFieldFunctions({\n fields: targetCollection.config.flattenedFields || [],\n })\n\n if (format === 'csv') {\n const rawData = await parseCSV({ data: buffer, req })\n originalDocs = rawData\n\n // Unflatten CSV data\n parsedData = rawData\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: targetCollection.config.flattenedFields ?? [],\n format: 'csv',\n importFieldHooks,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n } else {\n const parsedDocs = parseJSON({ data: buffer, req })\n originalDocs = parsedDocs\n // Apply field-level import hooks for JSON format\n parsedData = parsedDocs.map((doc) =>\n applyFieldHooks({\n type: 'beforeImport',\n data: doc,\n fieldHooks: importFieldHooks,\n fields: targetCollection.config.flattenedFields ?? [],\n format: 'json',\n operation: 'import',\n req,\n }),\n )\n }\n\n const importHooks = targetCollection.config.custom?.['plugin-import-export']?.importHooks\n if (importHooks?.before && parsedData.length > 0) {\n const result = await importHooks.before({\n batchNumber: 1,\n data: parsedData as unknown as Parameters<typeof importHooks.before>[0]['data'],\n format: format ?? 'csv',\n originalData: originalDocs,\n req,\n totalBatches: 1,\n })\n parsedData = result as unknown as Record<string, unknown>[]\n }\n\n // Remove disabled fields from the documents\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n if (disabledFields.length > 0) {\n parsedData = parsedData.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n // Calculate pagination\n const totalDocs = parsedData.length\n const totalPages = totalDocs === 0 ? 0 : Math.ceil(totalDocs / previewLimit)\n const startIndex = (previewPage - 1) * previewLimit\n const endIndex = startIndex + previewLimit\n const paginatedDocs = parsedData.slice(startIndex, endIndex)\n\n const hasNextPage = previewPage < totalPages\n const hasPrevPage = previewPage > 1\n\n // Check if the file exceeds the max limit\n const limitExceeded = typeof maxLimit === 'number' && maxLimit > 0 && totalDocs > maxLimit\n\n const response: ImportPreviewResponse = {\n docs: paginatedDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n limitExceeded,\n maxLimit,\n page: previewPage,\n totalDocs,\n totalPages,\n }\n\n return Response.json(response)\n } catch (error) {\n req.payload.logger.error({ err: error, msg: 'Error parsing import preview data' })\n return Response.json({ error: 'Failed to parse file data' }, { status: 500 })\n }\n}\n"],"names":["addDataAndFileToRequest","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","applyFieldHooks","getImportFieldFunctions","parseCSV","parseJSON","removeDisabledFields","resolveLimit","unflattenObject","handlePreview","req","collectionSlug","fileData","format","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","data","Math","max","min","targetCollection","payload","collections","Response","json","error","status","pluginConfig","config","custom","maxLimit","limit","importLimit","parsedData","originalDocs","buffer","Buffer","from","importFieldHooks","fields","flattenedFields","rawData","map","doc","unflattened","filter","Object","keys","length","parsedDocs","type","fieldHooks","operation","importHooks","before","result","batchNumber","originalData","totalBatches","disabledFields","admin","totalDocs","totalPages","ceil","startIndex","endIndex","paginatedDocs","slice","hasNextPage","hasPrevPage","limitExceeded","response","docs","page","logger","err","msg"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAIjD,SACEC,qBAAqB,EACrBC,iBAAiB,EACjBC,iBAAiB,EACjBC,gBAAgB,QACX,kBAAiB;AACxB,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,uBAAuB,QAAQ,0CAAyC;AACjF,SAASC,QAAQ,QAAQ,2BAA0B;AACnD,SAASC,SAAS,QAAQ,4BAA2B;AACrD,SAASC,oBAAoB,QAAQ,uCAAsC;AAC3E,SAASC,YAAY,QAAQ,+BAA8B;AAC3D,SAASC,eAAe,QAAQ,kCAAiC;AAEjE,OAAO,MAAMC,gBAAgB,OAAOC;IAClC,
|
|
1
|
+
{"version":3,"sources":["../../src/import/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { ImportDoc, ImportPreviewResponse } 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 { getImportFieldFunctions } from '../utilities/getImportFieldFunctions.js'\nimport { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js'\nimport { parseCSV } from '../utilities/parseCSV.js'\nimport { parseJSON } from '../utilities/parseJSON.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { unflattenObject } from '../utilities/unflattenObject.js'\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n fileData,\n format,\n formData,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n } = req.data as {\n collectionSlug: string\n fileData?: string\n format?: 'csv' | 'json'\n formData?: Record<string, unknown>\n previewLimit?: number\n previewPage?: number\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 // Resolve max limit from the collection config\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n const maxLimit = await resolveLimit({\n limit: pluginConfig?.importLimit,\n req,\n })\n\n if (!fileData) {\n return Response.json({ error: 'No file data provided' }, { status: 400 })\n }\n\n try {\n // Parse the file data\n let parsedData: Record<string, unknown>[]\n let originalDocs: Record<string, unknown>[] = []\n const buffer = Buffer.from(fileData, 'base64')\n\n const importFieldHooks = getImportFieldFunctions({\n fields: targetCollection.config.flattenedFields || [],\n })\n\n if (format === 'csv') {\n const rawData = await parseCSV({ data: buffer, req })\n originalDocs = rawData\n\n // Unflatten CSV data\n parsedData = rawData\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: targetCollection.config.flattenedFields ?? [],\n format: 'csv',\n importFieldHooks,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n } else {\n const parsedDocs = parseJSON({ data: buffer, req })\n originalDocs = parsedDocs\n // Apply field-level import hooks for JSON format\n parsedData = parsedDocs.map((doc) =>\n applyFieldHooks({\n type: 'beforeImport',\n data: doc,\n fieldHooks: importFieldHooks,\n fields: targetCollection.config.flattenedFields ?? [],\n format: 'json',\n operation: 'import',\n req,\n }),\n )\n }\n\n const importHooks = targetCollection.config.custom?.['plugin-import-export']?.importHooks\n if (importHooks?.before && parsedData.length > 0) {\n const result = await importHooks.before({\n batchNumber: 1,\n data: parsedData as unknown as Parameters<typeof importHooks.before>[0]['data'],\n format: format ?? 'csv',\n importDoc: getSubmittedFormValues({\n formData: formData ?? {},\n }) as ImportDoc,\n originalData: originalDocs,\n req,\n totalBatches: 1,\n })\n parsedData = result as unknown as Record<string, unknown>[]\n }\n\n // Remove disabled fields from the documents\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n if (disabledFields.length > 0) {\n parsedData = parsedData.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n // Calculate pagination\n const totalDocs = parsedData.length\n const totalPages = totalDocs === 0 ? 0 : Math.ceil(totalDocs / previewLimit)\n const startIndex = (previewPage - 1) * previewLimit\n const endIndex = startIndex + previewLimit\n const paginatedDocs = parsedData.slice(startIndex, endIndex)\n\n const hasNextPage = previewPage < totalPages\n const hasPrevPage = previewPage > 1\n\n // Check if the file exceeds the max limit\n const limitExceeded = typeof maxLimit === 'number' && maxLimit > 0 && totalDocs > maxLimit\n\n const response: ImportPreviewResponse = {\n docs: paginatedDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n limitExceeded,\n maxLimit,\n page: previewPage,\n totalDocs,\n totalPages,\n }\n\n return Response.json(response)\n } catch (error) {\n req.payload.logger.error({ err: error, msg: 'Error parsing import preview data' })\n return Response.json({ error: 'Failed to parse file data' }, { status: 500 })\n }\n}\n"],"names":["addDataAndFileToRequest","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","applyFieldHooks","getImportFieldFunctions","getSubmittedFormValues","parseCSV","parseJSON","removeDisabledFields","resolveLimit","unflattenObject","handlePreview","req","collectionSlug","fileData","format","formData","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","data","Math","max","min","targetCollection","payload","collections","Response","json","error","status","pluginConfig","config","custom","maxLimit","limit","importLimit","parsedData","originalDocs","buffer","Buffer","from","importFieldHooks","fields","flattenedFields","rawData","map","doc","unflattened","filter","Object","keys","length","parsedDocs","type","fieldHooks","operation","importHooks","before","result","batchNumber","importDoc","originalData","totalBatches","disabledFields","admin","totalDocs","totalPages","ceil","startIndex","endIndex","paginatedDocs","slice","hasNextPage","hasPrevPage","limitExceeded","response","docs","page","logger","err","msg"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CollectionConfig, CollectionSlug, DataFromCollectionSlug, PayloadRequest } from 'payload';
|
|
1
|
+
import type { CollectionConfig, CollectionSlug, DataFromCollectionSlug, JsonObject, PayloadRequest } from 'payload';
|
|
2
2
|
/**
|
|
3
3
|
* Function to dynamically determine the limit based on request context
|
|
4
4
|
*/
|
|
@@ -29,6 +29,14 @@ export type ImportResult = {
|
|
|
29
29
|
total: number;
|
|
30
30
|
updated: number;
|
|
31
31
|
};
|
|
32
|
+
/** Export document or unsaved form values. `id` indicates a saved document. Treat as read-only. */
|
|
33
|
+
export type ExportDoc = {
|
|
34
|
+
id?: number | string;
|
|
35
|
+
} & JsonObject;
|
|
36
|
+
/** Import document or unsaved preview form values. `id` indicates a saved document. Treat as read-only. */
|
|
37
|
+
export type ImportDoc = {
|
|
38
|
+
id?: number | string;
|
|
39
|
+
} & JsonObject;
|
|
32
40
|
/**
|
|
33
41
|
* Hook called before each export batch is written to file.
|
|
34
42
|
* Receives the transformed batch data and the original DB documents.
|
|
@@ -39,6 +47,8 @@ export type ExportBeforeHook<TSlug extends CollectionSlug = CollectionSlug> = (a
|
|
|
39
47
|
batchNumber: number;
|
|
40
48
|
/** Transformed batch — flat rows for CSV, nested docs for JSON. Modify and return this. */
|
|
41
49
|
data: Record<string, unknown>[];
|
|
50
|
+
/** See {@link ExportDoc}. */
|
|
51
|
+
exportDoc: ExportDoc;
|
|
42
52
|
/** Export format. Open-ended to support custom formats in the future. */
|
|
43
53
|
format: 'csv' | 'json' | ({} & string);
|
|
44
54
|
/**
|
|
@@ -63,6 +73,8 @@ export type ExportAfterHook = (args: {
|
|
|
63
73
|
batchNumber: number;
|
|
64
74
|
/** The batch data that was written */
|
|
65
75
|
data: Record<string, unknown>[];
|
|
76
|
+
/** See {@link ExportDoc}. */
|
|
77
|
+
exportDoc: ExportDoc;
|
|
66
78
|
/** Export format */
|
|
67
79
|
format: 'csv' | 'json' | ({} & string);
|
|
68
80
|
/** Raw DB documents before transformation */
|
|
@@ -88,6 +100,8 @@ export type ImportBeforeHook<TSlug extends CollectionSlug = CollectionSlug> = (a
|
|
|
88
100
|
data: Partial<DataFromCollectionSlug<TSlug>>[];
|
|
89
101
|
/** Import format. Open-ended to support custom formats in the future. */
|
|
90
102
|
format: 'csv' | 'json' | ({} & string);
|
|
103
|
+
/** See {@link ImportDoc}. */
|
|
104
|
+
importDoc: ImportDoc;
|
|
91
105
|
/** Raw parsed file rows before unflattening. Read-only reference. */
|
|
92
106
|
originalData: Record<string, unknown>[];
|
|
93
107
|
req: PayloadRequest;
|
|
@@ -103,6 +117,8 @@ export type ImportAfterHook = (args: {
|
|
|
103
117
|
batchNumber: number;
|
|
104
118
|
/** Import format */
|
|
105
119
|
format: 'csv' | 'json' | ({} & string);
|
|
120
|
+
/** See {@link ImportDoc}. */
|
|
121
|
+
importDoc: ImportDoc;
|
|
106
122
|
/**
|
|
107
123
|
* Raw parsed file rows for this batch before unflattening and before-hook
|
|
108
124
|
* transformation. For CSV this is the flat key/value row; for JSON this is
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,UAAU,EACV,cAAc,EACf,MAAM,SAAS,CAAA;AAEhB;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,cAAc,CAAA;CAAE,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAEvF;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,aAAa,GAAG,MAAM,CAAA;AAE1C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,EAChC,UAAU,GACX,EAAE;IACD,UAAU,EAAE,gBAAgB,CAAA;CAC7B,KAAK,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAElD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC5B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;IACF,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,mGAAmG;AACnG,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,UAAU,CAAA;AAE7D,2GAA2G;AAC3G,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,UAAU,CAAA;AAE7D;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc,IAAI,CAAC,IAAI,EAAE;IACnF,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,6BAA6B;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB,yEAAyE;IACzE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACtC;;;;;;;OAOG;IACH,YAAY,EAAE,sBAAsB,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACzE,GAAG,EAAE,cAAc,CAAA;IACnB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAA;CACrB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;AAEpE;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE;IACnC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,6BAA6B;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB,oBAAoB;IACpB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACtC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACvC,GAAG,EAAE,cAAc,CAAA;IACnB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAA;CACrB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE1B;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc,IAAI,CAAC,IAAI,EAAE;IACnF,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,IAAI,EAAE,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAA;IAC9C,yEAAyE;IACzE,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACtC,6BAA6B;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACvC,GAAG,EAAE,cAAc,CAAA;IACnB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAA;CACrB,KAAK,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;AAElG;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE;IACnC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,oBAAoB;IACpB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACtC,6BAA6B;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACvC,GAAG,EAAE,cAAc,CAAA;IACnB,0EAA0E;IAC1E,MAAM,EAAE,YAAY,CAAA;IACpB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAA;CACrB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAE1B;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc,IAAI;IACxE;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN;;;WAGG;QACH,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB;;;WAGG;QACH,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;KACjC,CAAA;IACD;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IACb;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc,IAAI;IACxE;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN;;;WAGG;QACH,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB;;;WAGG;QACH,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;KACjC,CAAA;IACD;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IACb;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc,IAAI;IAClF;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACtC;;OAEG;IACH,IAAI,EAAE,KAAK,CAAA;CACZ,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;;OAIG;IACH,WAAW,EAAE,sBAAsB,CAAC,cAAc,CAAC,EAAE,CAAA;IAErD;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAE5C;;;;OAIG;IACH,WAAW,CAAC,EAAE,KAAK,CAAA;IAEnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,KAAK,CAAA;IAEnB;;;;;;OAMG;IACH,wBAAwB,CAAC,EAAE,kBAAkB,CAAA;IAE7C;;;;;;OAMG;IACH,wBAAwB,CAAC,EAAE,kBAAkB,CAAA;CAC9C,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE;IACzC,+FAA+F;IAC/F,UAAU,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACtC,4GAA4G;IAC5G,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,KAAK,EAAE,OAAO,CAAA;CACf,KAAK,OAAO,CAAA;AAEb;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IACtC,+FAA+F;IAC/F,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,6FAA6F;IAC7F,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,KAAK,EAAE,OAAO,CAAA;CACf,KAAK,OAAO,CAAA;AAEb,gBAAgB;AAChB,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAA;AAEtF,gBAAgB;AAChB,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAA;AAEtF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,WAAW,EAAE,OAAO,CAAA;IACpB;;OAEG;IACH,WAAW,EAAE,OAAO,CAAA;IACpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;CACxB,GAAG,qBAAqB,CAAA;AAEzB;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GAAG,qBAAqB,CAAA"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type {\n CollectionConfig,\n CollectionSlug,\n DataFromCollectionSlug,\n PayloadRequest,\n} from 'payload'\n\n/**\n * Function to dynamically determine the limit based on request context\n */\nexport type LimitFunction = (args: { req: PayloadRequest }) => number | Promise<number>\n\n/**\n * Limit configuration - either a hard number or a function.\n * Set to 0 for unlimited (no restriction). Default is 0.\n */\nexport type Limit = LimitFunction | number\n\n/**\n * Type for overriding import/export collection configurations\n */\nexport type CollectionOverride = ({\n collection,\n}: {\n collection: CollectionConfig\n}) => CollectionConfig | Promise<CollectionConfig>\n\n/**\n * Result of a completed import operation (or a single batch within one)\n */\nexport type ImportResult = {\n errors: Array<{\n doc: Record<string, unknown>\n error: string\n index: number\n }>\n imported: number\n total: number\n updated: number\n}\n\n/**\n * Hook called before each export batch is written to file.\n * Receives the transformed batch data and the original DB documents.\n * Return the modified data array — it replaces `data` for the write step.\n */\nexport type ExportBeforeHook<TSlug extends CollectionSlug = CollectionSlug> = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /** Transformed batch — flat rows for CSV, nested docs for JSON. Modify and return this. */\n data: Record<string, unknown>[]\n /** Export format. Open-ended to support custom formats in the future. */\n format: 'csv' | 'json' | ({} & string)\n /**\n * Raw DB documents before format-specific transformation. Read-only reference.\n *\n * Typed as a union so call sites that don't know the collection slug at\n * compile time (e.g. job tasks) don't need `as any` casts. To get the\n * narrower typed shape, declare your hook with a slug:\n * `const hook: ExportBeforeHook<'posts'> = (args) => { ... }`.\n */\n originalData: DataFromCollectionSlug<TSlug>[] | Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches for this export operation */\n totalBatches: number\n}) => Promise<Record<string, unknown>[]> | Record<string, unknown>[]\n\n/**\n * Hook called after each export batch has been written to file.\n * For logging and observability only — return value is ignored.\n */\nexport type ExportAfterHook = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /** The batch data that was written */\n data: Record<string, unknown>[]\n /** Export format */\n format: 'csv' | 'json' | ({} & string)\n /** Raw DB documents before transformation */\n originalData: Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches for this export operation */\n totalBatches: number\n}) => Promise<void> | void\n\n/**\n * Hook called before each import batch is written to the database.\n * Receives the processed (unflattened) documents and the raw file rows.\n * Return the modified documents array — it replaces `data` for the DB write step.\n */\nexport type ImportBeforeHook<TSlug extends CollectionSlug = CollectionSlug> = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /**\n * Unflattened documents ready to be written to the database. Modify and\n * return this. Typed as `Partial<...>` because rows from a CSV or JSON\n * import are not guaranteed to include every required field of the\n * collection — required fields are validated at write time.\n */\n data: Partial<DataFromCollectionSlug<TSlug>>[]\n /** Import format. Open-ended to support custom formats in the future. */\n format: 'csv' | 'json' | ({} & string)\n /** Raw parsed file rows before unflattening. Read-only reference. */\n originalData: Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches for this import operation */\n totalBatches: number\n}) => Partial<DataFromCollectionSlug<TSlug>>[] | Promise<Partial<DataFromCollectionSlug<TSlug>>[]>\n\n/**\n * Hook called after each import batch has been written to the database.\n * For logging and observability only — return value is ignored.\n */\nexport type ImportAfterHook = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /** Import format */\n format: 'csv' | 'json' | ({} & string)\n /**\n * Raw parsed file rows for this batch before unflattening and before-hook\n * transformation. For CSV this is the flat key/value row; for JSON this is\n * the top-level parsed document. Read-only reference.\n */\n originalData: Record<string, unknown>[]\n req: PayloadRequest\n /** Result of this batch — counts and errors. Not the cumulative total. */\n result: ImportResult\n /** Total number of batches for this import operation */\n totalBatches: number\n}) => Promise<void> | void\n\n/**\n * Per-collection export configuration. Set on each entry of\n * ```\n * importExportPlugin({ collections: [{ slug, export: { ... } }] })\n * ```\n */\nexport type ExportConfig<TSlug extends CollectionSlug = CollectionSlug> = {\n /**\n * Number of documents to process in each batch during export. This config is applied to both jobs and synchronous exports.\n *\n * @default 100\n */\n batchSize?: number\n /**\n * If true, disables the download button in the export preview UI\n * @default false\n */\n disableDownload?: boolean\n /**\n * If true, disables the jobs queue for exports and runs them synchronously.\n * @default false\n */\n disableJobsQueue?: boolean\n /**\n * If true, disables the save button in the export preview UI\n * @default false\n */\n disableSave?: boolean\n /**\n * Forces a specific export format (`csv` or `json`) and hides the format dropdown from the UI.\n * When defined, this overrides the user's ability to choose a format manually.\n * If not set, the user can choose between CSV and JSON in the export UI.\n * @default undefined\n */\n format?: 'csv' | 'json'\n /**\n * Lifecycle hooks for export operations on this collection.\n * Hooks fire once per batch.\n */\n hooks?: {\n /**\n * Called after each batch is written to file. For logging/observability only.\n * Return value is ignored.\n */\n after?: ExportAfterHook\n /**\n * Called before each batch is written to file.\n * Return value replaces the batch data for the write step.\n */\n before?: ExportBeforeHook<TSlug>\n }\n /**\n * Maximum number of documents that can be exported in a single operation.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Overrides the global exportLimit if set.\n */\n limit?: Limit\n /**\n * Override the export collection for this collection.\n *\n * @default true\n */\n overrideCollection?: CollectionOverride\n}\n\n/**\n * Per-collection import configuration. Set on each entry of\n * ```\n * importExportPlugin({ collections: [{ slug, import: { ... } }] })\n * ```\n */\nexport type ImportConfig<TSlug extends CollectionSlug = CollectionSlug> = {\n /**\n * Number of documents to process in each batch during import. This config is applied to both jobs and synchronous imports.\n *\n * @default 100\n */\n batchSize?: number\n /**\n * Default version status for imported documents when _status field is not provided.\n * Only applies to collections with versions enabled.\n * @default 'published'\n */\n defaultVersionStatus?: 'draft' | 'published'\n /**\n * If true, disables the jobs queue for imports and runs them synchronously.\n * @default false\n */\n disableJobsQueue?: boolean\n /**\n * Lifecycle hooks for import operations on this collection.\n * Hooks fire once per batch.\n */\n hooks?: {\n /**\n * Called after each batch is written to the database. For logging/observability only.\n * Return value is ignored.\n */\n after?: ImportAfterHook\n /**\n * Called before each batch is written to the database.\n * Return value replaces the batch data for the DB write step.\n */\n before?: ImportBeforeHook<TSlug>\n }\n /**\n * Maximum number of documents that can be imported in a single operation.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Overrides the global importLimit if set.\n */\n limit?: Limit\n /**\n * Override the import collection for this collection.\n *\n * @default true\n */\n overrideCollection?: CollectionOverride\n}\n\n/**\n * Per-collection plugin entry. Identifies a target collection by `slug` and\n * configures its export/import behavior; either side can be disabled with `false`.\n */\nexport type PluginCollectionConfig<TSlug extends CollectionSlug = CollectionSlug> = {\n /**\n * Override the import collection for this collection or disable it entirely with `false`.\n *\n * @default true\n */\n export?: boolean | ExportConfig<TSlug>\n /**\n * Override the export collection for this collection or disable it entirely with `false`.\n *\n * @default true\n */\n import?: boolean | ImportConfig<TSlug>\n /**\n * Target collection's slug for import/export functionality\n */\n slug: TSlug\n}\n\n/**\n * Configuration options for the Import/Export plugin\n */\nexport type ImportExportPluginConfig = {\n /**\n * Global default batch size for both import and export operations.\n * Can be overridden at the collection level via `export.batchSize` or `import.batchSize`.\n * @default 100\n */\n batchSize?: number\n\n /**\n * Collections to include the Import/Export controls in.\n * If not specified, all collections will have import/export enabled.\n * @default undefined (all collections)\n */\n collections: PluginCollectionConfig<CollectionSlug>[]\n\n /**\n * Enable debug logging for troubleshooting import/export operations\n * @default false\n */\n debug?: boolean\n\n /**\n * Global default version status for imported documents when _status field is not provided.\n * Only applies to collections with versions enabled.\n * Can be overridden at the collection level via `import.defaultVersionStatus`.\n * @default 'published'\n */\n defaultVersionStatus?: 'draft' | 'published'\n\n /**\n * Global maximum for export operations.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Per-collection limits take precedence.\n */\n exportLimit?: Limit\n\n /**\n * Global maximum for import operations.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Per-collection limits take precedence.\n */\n importLimit?: Limit\n\n /**\n * Function to override the default export collection configuration.\n * Takes the default export collection and allows you to modify and return it.\n * Useful for adding access control, changing upload directory, etc.\n *\n * This can also be set at the collection level via `export` config.\n */\n overrideExportCollection?: CollectionOverride\n\n /**\n * Function to override the default import collection configuration.\n * Takes the default import collection and allows you to modify and return it.\n * Useful for adding access control, changing upload directory, etc.\n *\n * This can also be set at the collection level via `import` config.\n */\n overrideImportCollection?: CollectionOverride\n}\n\n/**\n * Field-level hook that runs before a field value is exported. Works for both\n * CSV and JSON. Return a value to replace the field, or `undefined` to fall\n * back to default behavior. Mutate `siblingData` to add or remove columns at\n * the same level.\n *\n * Return `null` (CSV only) when the hook has already written its replacement\n * columns to `siblingData` and default flattening should be skipped — used by\n * built-in handlers for polymorphic relationships to avoid duplicate columns.\n */\nexport type FieldBeforeExportHook = (args: {\n /** Runtime column path, underscore-separated (includes array indices, e.g. `items_0_note`). */\n columnName: string\n /** The top-level document being exported. */\n data: Record<string, unknown>\n format: 'csv' | 'json' | ({} & string)\n /** Writable output at the current level. CSV: the flat row accumulator. JSON: the sibling output object. */\n siblingData: Record<string, unknown>\n /** Read-only source at the current level, before any transformation. */\n siblingDoc: Record<string, unknown>\n value: unknown\n}) => unknown\n\n/**\n * Field-level hook that runs before a field value is imported. Works for both\n * CSV and JSON. Return the transformed value to use for this field.\n */\nexport type FieldBeforeImportHook = (args: {\n columnName: string\n /** Full flat row (CSV) or top-level parsed document (JSON). */\n data: Record<string, unknown>\n format: 'csv' | 'json' | ({} & string)\n /** Data at the current level. CSV: same reference as `data`. JSON: the parent-level object. */\n siblingData: Record<string, unknown>\n /** Read-only source at the current level, before any transformation. CSV: same as `data`. */\n siblingDoc: Record<string, unknown>\n value: unknown\n}) => unknown\n\n/** @internal */\nexport type ExportFieldHookEntry = { fn: FieldBeforeExportHook; type: 'beforeExport' }\n\n/** @internal */\nexport type ImportFieldHookEntry = { fn: FieldBeforeImportHook; type: 'beforeImport' }\n\n/**\n * Base pagination data returned from preview endpoints\n */\nexport type PreviewPaginationData = {\n /**\n * Whether there is a next page available\n */\n hasNextPage: boolean\n /**\n * Whether there is a previous page available\n */\n hasPrevPage: boolean\n /**\n * Number of documents per page\n */\n limit: number\n /**\n * The resolved max limit value (max documents allowed), if any\n */\n maxLimit?: number\n /**\n * Current page number (1-indexed)\n */\n page: number\n /**\n * Total number of documents\n */\n totalDocs: number\n /**\n * Total number of pages\n */\n totalPages: number\n}\n\n/**\n * Response from export preview endpoint\n */\nexport type ExportPreviewResponse = {\n /**\n * Column names for CSV format (undefined for JSON)\n */\n columns?: string[]\n /**\n * Preview documents (transformed for display)\n */\n docs: Record<string, unknown>[]\n /**\n * Actual count of docs that will be exported (respects export limit)\n */\n exportTotalDocs: number\n} & PreviewPaginationData\n\n/**\n * Response from import preview endpoint\n */\nexport type ImportPreviewResponse = {\n /**\n * Preview documents parsed from the import file\n */\n docs: Record<string, unknown>[]\n /**\n * Whether the file exceeds the max limit\n */\n limitExceeded?: boolean\n} & PreviewPaginationData\n"],"names":[],"mappings":"AAmbA;;CAEC,GACD,WASyB"}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type {\n CollectionConfig,\n CollectionSlug,\n DataFromCollectionSlug,\n JsonObject,\n PayloadRequest,\n} from 'payload'\n\n/**\n * Function to dynamically determine the limit based on request context\n */\nexport type LimitFunction = (args: { req: PayloadRequest }) => number | Promise<number>\n\n/**\n * Limit configuration - either a hard number or a function.\n * Set to 0 for unlimited (no restriction). Default is 0.\n */\nexport type Limit = LimitFunction | number\n\n/**\n * Type for overriding import/export collection configurations\n */\nexport type CollectionOverride = ({\n collection,\n}: {\n collection: CollectionConfig\n}) => CollectionConfig | Promise<CollectionConfig>\n\n/**\n * Result of a completed import operation (or a single batch within one)\n */\nexport type ImportResult = {\n errors: Array<{\n doc: Record<string, unknown>\n error: string\n index: number\n }>\n imported: number\n total: number\n updated: number\n}\n\n/** Export document or unsaved form values. `id` indicates a saved document. Treat as read-only. */\nexport type ExportDoc = { id?: number | string } & JsonObject\n\n/** Import document or unsaved preview form values. `id` indicates a saved document. Treat as read-only. */\nexport type ImportDoc = { id?: number | string } & JsonObject\n\n/**\n * Hook called before each export batch is written to file.\n * Receives the transformed batch data and the original DB documents.\n * Return the modified data array — it replaces `data` for the write step.\n */\nexport type ExportBeforeHook<TSlug extends CollectionSlug = CollectionSlug> = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /** Transformed batch — flat rows for CSV, nested docs for JSON. Modify and return this. */\n data: Record<string, unknown>[]\n /** See {@link ExportDoc}. */\n exportDoc: ExportDoc\n /** Export format. Open-ended to support custom formats in the future. */\n format: 'csv' | 'json' | ({} & string)\n /**\n * Raw DB documents before format-specific transformation. Read-only reference.\n *\n * Typed as a union so call sites that don't know the collection slug at\n * compile time (e.g. job tasks) don't need `as any` casts. To get the\n * narrower typed shape, declare your hook with a slug:\n * `const hook: ExportBeforeHook<'posts'> = (args) => { ... }`.\n */\n originalData: DataFromCollectionSlug<TSlug>[] | Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches for this export operation */\n totalBatches: number\n}) => Promise<Record<string, unknown>[]> | Record<string, unknown>[]\n\n/**\n * Hook called after each export batch has been written to file.\n * For logging and observability only — return value is ignored.\n */\nexport type ExportAfterHook = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /** The batch data that was written */\n data: Record<string, unknown>[]\n /** See {@link ExportDoc}. */\n exportDoc: ExportDoc\n /** Export format */\n format: 'csv' | 'json' | ({} & string)\n /** Raw DB documents before transformation */\n originalData: Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches for this export operation */\n totalBatches: number\n}) => Promise<void> | void\n\n/**\n * Hook called before each import batch is written to the database.\n * Receives the processed (unflattened) documents and the raw file rows.\n * Return the modified documents array — it replaces `data` for the DB write step.\n */\nexport type ImportBeforeHook<TSlug extends CollectionSlug = CollectionSlug> = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /**\n * Unflattened documents ready to be written to the database. Modify and\n * return this. Typed as `Partial<...>` because rows from a CSV or JSON\n * import are not guaranteed to include every required field of the\n * collection — required fields are validated at write time.\n */\n data: Partial<DataFromCollectionSlug<TSlug>>[]\n /** Import format. Open-ended to support custom formats in the future. */\n format: 'csv' | 'json' | ({} & string)\n /** See {@link ImportDoc}. */\n importDoc: ImportDoc\n /** Raw parsed file rows before unflattening. Read-only reference. */\n originalData: Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches for this import operation */\n totalBatches: number\n}) => Partial<DataFromCollectionSlug<TSlug>>[] | Promise<Partial<DataFromCollectionSlug<TSlug>>[]>\n\n/**\n * Hook called after each import batch has been written to the database.\n * For logging and observability only — return value is ignored.\n */\nexport type ImportAfterHook = (args: {\n /** Current batch number, starting at 1 */\n batchNumber: number\n /** Import format */\n format: 'csv' | 'json' | ({} & string)\n /** See {@link ImportDoc}. */\n importDoc: ImportDoc\n /**\n * Raw parsed file rows for this batch before unflattening and before-hook\n * transformation. For CSV this is the flat key/value row; for JSON this is\n * the top-level parsed document. Read-only reference.\n */\n originalData: Record<string, unknown>[]\n req: PayloadRequest\n /** Result of this batch — counts and errors. Not the cumulative total. */\n result: ImportResult\n /** Total number of batches for this import operation */\n totalBatches: number\n}) => Promise<void> | void\n\n/**\n * Per-collection export configuration. Set on each entry of\n * ```\n * importExportPlugin({ collections: [{ slug, export: { ... } }] })\n * ```\n */\nexport type ExportConfig<TSlug extends CollectionSlug = CollectionSlug> = {\n /**\n * Number of documents to process in each batch during export. This config is applied to both jobs and synchronous exports.\n *\n * @default 100\n */\n batchSize?: number\n /**\n * If true, disables the download button in the export preview UI\n * @default false\n */\n disableDownload?: boolean\n /**\n * If true, disables the jobs queue for exports and runs them synchronously.\n * @default false\n */\n disableJobsQueue?: boolean\n /**\n * If true, disables the save button in the export preview UI\n * @default false\n */\n disableSave?: boolean\n /**\n * Forces a specific export format (`csv` or `json`) and hides the format dropdown from the UI.\n * When defined, this overrides the user's ability to choose a format manually.\n * If not set, the user can choose between CSV and JSON in the export UI.\n * @default undefined\n */\n format?: 'csv' | 'json'\n /**\n * Lifecycle hooks for export operations on this collection.\n * Hooks fire once per batch.\n */\n hooks?: {\n /**\n * Called after each batch is written to file. For logging/observability only.\n * Return value is ignored.\n */\n after?: ExportAfterHook\n /**\n * Called before each batch is written to file.\n * Return value replaces the batch data for the write step.\n */\n before?: ExportBeforeHook<TSlug>\n }\n /**\n * Maximum number of documents that can be exported in a single operation.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Overrides the global exportLimit if set.\n */\n limit?: Limit\n /**\n * Override the export collection for this collection.\n *\n * @default true\n */\n overrideCollection?: CollectionOverride\n}\n\n/**\n * Per-collection import configuration. Set on each entry of\n * ```\n * importExportPlugin({ collections: [{ slug, import: { ... } }] })\n * ```\n */\nexport type ImportConfig<TSlug extends CollectionSlug = CollectionSlug> = {\n /**\n * Number of documents to process in each batch during import. This config is applied to both jobs and synchronous imports.\n *\n * @default 100\n */\n batchSize?: number\n /**\n * Default version status for imported documents when _status field is not provided.\n * Only applies to collections with versions enabled.\n * @default 'published'\n */\n defaultVersionStatus?: 'draft' | 'published'\n /**\n * If true, disables the jobs queue for imports and runs them synchronously.\n * @default false\n */\n disableJobsQueue?: boolean\n /**\n * Lifecycle hooks for import operations on this collection.\n * Hooks fire once per batch.\n */\n hooks?: {\n /**\n * Called after each batch is written to the database. For logging/observability only.\n * Return value is ignored.\n */\n after?: ImportAfterHook\n /**\n * Called before each batch is written to the database.\n * Return value replaces the batch data for the DB write step.\n */\n before?: ImportBeforeHook<TSlug>\n }\n /**\n * Maximum number of documents that can be imported in a single operation.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Overrides the global importLimit if set.\n */\n limit?: Limit\n /**\n * Override the import collection for this collection.\n *\n * @default true\n */\n overrideCollection?: CollectionOverride\n}\n\n/**\n * Per-collection plugin entry. Identifies a target collection by `slug` and\n * configures its export/import behavior; either side can be disabled with `false`.\n */\nexport type PluginCollectionConfig<TSlug extends CollectionSlug = CollectionSlug> = {\n /**\n * Override the import collection for this collection or disable it entirely with `false`.\n *\n * @default true\n */\n export?: boolean | ExportConfig<TSlug>\n /**\n * Override the export collection for this collection or disable it entirely with `false`.\n *\n * @default true\n */\n import?: boolean | ImportConfig<TSlug>\n /**\n * Target collection's slug for import/export functionality\n */\n slug: TSlug\n}\n\n/**\n * Configuration options for the Import/Export plugin\n */\nexport type ImportExportPluginConfig = {\n /**\n * Global default batch size for both import and export operations.\n * Can be overridden at the collection level via `export.batchSize` or `import.batchSize`.\n * @default 100\n */\n batchSize?: number\n\n /**\n * Collections to include the Import/Export controls in.\n * If not specified, all collections will have import/export enabled.\n * @default undefined (all collections)\n */\n collections: PluginCollectionConfig<CollectionSlug>[]\n\n /**\n * Enable debug logging for troubleshooting import/export operations\n * @default false\n */\n debug?: boolean\n\n /**\n * Global default version status for imported documents when _status field is not provided.\n * Only applies to collections with versions enabled.\n * Can be overridden at the collection level via `import.defaultVersionStatus`.\n * @default 'published'\n */\n defaultVersionStatus?: 'draft' | 'published'\n\n /**\n * Global maximum for export operations.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Per-collection limits take precedence.\n */\n exportLimit?: Limit\n\n /**\n * Global maximum for import operations.\n * Can be a number or a function that returns a number based on request context.\n * Set to 0 for unlimited (default). Per-collection limits take precedence.\n */\n importLimit?: Limit\n\n /**\n * Function to override the default export collection configuration.\n * Takes the default export collection and allows you to modify and return it.\n * Useful for adding access control, changing upload directory, etc.\n *\n * This can also be set at the collection level via `export` config.\n */\n overrideExportCollection?: CollectionOverride\n\n /**\n * Function to override the default import collection configuration.\n * Takes the default import collection and allows you to modify and return it.\n * Useful for adding access control, changing upload directory, etc.\n *\n * This can also be set at the collection level via `import` config.\n */\n overrideImportCollection?: CollectionOverride\n}\n\n/**\n * Field-level hook that runs before a field value is exported. Works for both\n * CSV and JSON. Return a value to replace the field, or `undefined` to fall\n * back to default behavior. Mutate `siblingData` to add or remove columns at\n * the same level.\n *\n * Return `null` (CSV only) when the hook has already written its replacement\n * columns to `siblingData` and default flattening should be skipped — used by\n * built-in handlers for polymorphic relationships to avoid duplicate columns.\n */\nexport type FieldBeforeExportHook = (args: {\n /** Runtime column path, underscore-separated (includes array indices, e.g. `items_0_note`). */\n columnName: string\n /** The top-level document being exported. */\n data: Record<string, unknown>\n format: 'csv' | 'json' | ({} & string)\n /** Writable output at the current level. CSV: the flat row accumulator. JSON: the sibling output object. */\n siblingData: Record<string, unknown>\n /** Read-only source at the current level, before any transformation. */\n siblingDoc: Record<string, unknown>\n value: unknown\n}) => unknown\n\n/**\n * Field-level hook that runs before a field value is imported. Works for both\n * CSV and JSON. Return the transformed value to use for this field.\n */\nexport type FieldBeforeImportHook = (args: {\n columnName: string\n /** Full flat row (CSV) or top-level parsed document (JSON). */\n data: Record<string, unknown>\n format: 'csv' | 'json' | ({} & string)\n /** Data at the current level. CSV: same reference as `data`. JSON: the parent-level object. */\n siblingData: Record<string, unknown>\n /** Read-only source at the current level, before any transformation. CSV: same as `data`. */\n siblingDoc: Record<string, unknown>\n value: unknown\n}) => unknown\n\n/** @internal */\nexport type ExportFieldHookEntry = { fn: FieldBeforeExportHook; type: 'beforeExport' }\n\n/** @internal */\nexport type ImportFieldHookEntry = { fn: FieldBeforeImportHook; type: 'beforeImport' }\n\n/**\n * Base pagination data returned from preview endpoints\n */\nexport type PreviewPaginationData = {\n /**\n * Whether there is a next page available\n */\n hasNextPage: boolean\n /**\n * Whether there is a previous page available\n */\n hasPrevPage: boolean\n /**\n * Number of documents per page\n */\n limit: number\n /**\n * The resolved max limit value (max documents allowed), if any\n */\n maxLimit?: number\n /**\n * Current page number (1-indexed)\n */\n page: number\n /**\n * Total number of documents\n */\n totalDocs: number\n /**\n * Total number of pages\n */\n totalPages: number\n}\n\n/**\n * Response from export preview endpoint\n */\nexport type ExportPreviewResponse = {\n /**\n * Column names for CSV format (undefined for JSON)\n */\n columns?: string[]\n /**\n * Preview documents (transformed for display)\n */\n docs: Record<string, unknown>[]\n /**\n * Actual count of docs that will be exported (respects export limit)\n */\n exportTotalDocs: number\n} & PreviewPaginationData\n\n/**\n * Response from import preview endpoint\n */\nexport type ImportPreviewResponse = {\n /**\n * Preview documents parsed from the import file\n */\n docs: Record<string, unknown>[]\n /**\n * Whether the file exceeds the max limit\n */\n limitExceeded?: boolean\n} & PreviewPaginationData\n"],"names":[],"mappings":"AAkcA;;CAEC,GACD,WASyB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FileRetrievalError, getFileByPath } from 'payload';
|
|
2
|
-
import {
|
|
2
|
+
import { downloadFileToBuffer } from 'payload/internal';
|
|
3
3
|
import { formatAdminURL } from 'payload/shared';
|
|
4
4
|
/**
|
|
5
5
|
* Retrieves file data from an uploaded document, handling both local storage
|
|
@@ -33,7 +33,7 @@ import { formatAdminURL } from 'payload/shared';
|
|
|
33
33
|
}
|
|
34
34
|
if (doc.filename && doc.url) {
|
|
35
35
|
// Cloud storage or external - fetch via Payload's file endpoint
|
|
36
|
-
//
|
|
36
|
+
// downloadFileToBuffer constructs full URL, includes cookies for auth, and
|
|
37
37
|
// the request goes through Payload's handler chain (including storage adapter)
|
|
38
38
|
// For relative URLs, construct a full URL using formatAdminURL which properly
|
|
39
39
|
// handles serverURL, basePath, and other config. This is important in job contexts
|
|
@@ -44,7 +44,7 @@ import { formatAdminURL } from 'payload/shared';
|
|
|
44
44
|
path: doc.url,
|
|
45
45
|
serverURL: serverURL || req.origin
|
|
46
46
|
});
|
|
47
|
-
const file = await
|
|
47
|
+
const file = await downloadFileToBuffer({
|
|
48
48
|
data: {
|
|
49
49
|
filename: doc.filename,
|
|
50
50
|
url: fileUrl
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getFileFromDoc.ts"],"sourcesContent":["import type { CollectionConfig, FileData, PayloadRequest, UploadConfig } from 'payload'\n\nimport { FileRetrievalError, getFileByPath } from 'payload'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getFileFromDoc.ts"],"sourcesContent":["import type { CollectionConfig, FileData, PayloadRequest, UploadConfig } from 'payload'\n\nimport { FileRetrievalError, getFileByPath } from 'payload'\nimport { downloadFileToBuffer } from 'payload/internal'\nimport { formatAdminURL } from 'payload/shared'\n\ntype Args = {\n collectionConfig: CollectionConfig\n doc: { filename: string; mimeType?: string; url?: string }\n req: PayloadRequest\n}\n\ntype Result = {\n data: Buffer\n mimetype: string\n}\n\n/**\n * Retrieves file data from an uploaded document, handling both local storage\n * and cloud storage (S3, Azure, GCS, etc.) scenarios correctly.\n *\n * This function uses the same pattern as Payload's internal file retrieval:\n * - For local storage: reads directly from disk (efficient, no HTTP roundtrip)\n * - For cloud storage: fetches via Payload's file endpoint, which triggers\n * the storage adapter's staticHandler to serve the file\n */\nexport const getFileFromDoc = async ({ collectionConfig, doc, req }: Args): Promise<Result> => {\n const uploadConfig: UploadConfig =\n typeof collectionConfig.upload === 'object' ? collectionConfig.upload : {}\n const disableLocalStorage = uploadConfig.disableLocalStorage ?? false\n const staticDir = uploadConfig.staticDir || collectionConfig.slug\n\n const serverURL = req.payload.config.serverURL\n const isLocalFile = (serverURL && doc.url?.startsWith(serverURL)) || doc.url?.startsWith('/')\n\n if (!disableLocalStorage && isLocalFile && doc.filename) {\n // Local storage enabled - read directly from disk (efficient, no HTTP roundtrip)\n const filePath = `${staticDir}/${doc.filename}`\n const file = await getFileByPath(filePath)\n\n if (!file) {\n throw new Error(`File not found at path: ${filePath}`)\n }\n\n const mimetype = file.mimetype || doc.mimeType\n\n if (!mimetype) {\n throw new FileRetrievalError(req.t, `Unable to determine mimetype for file: ${doc.filename}`)\n }\n\n return {\n data: file.data,\n mimetype,\n }\n }\n\n if (doc.filename && doc.url) {\n // Cloud storage or external - fetch via Payload's file endpoint\n // downloadFileToBuffer constructs full URL, includes cookies for auth, and\n // the request goes through Payload's handler chain (including storage adapter)\n\n // For relative URLs, construct a full URL using formatAdminURL which properly\n // handles serverURL, basePath, and other config. This is important in job contexts\n // where request headers may not be available for URL construction.\n // Use serverURL from config, falling back to req.origin for local/job requests.\n const fileUrl = doc.url.startsWith('http')\n ? doc.url\n : formatAdminURL({\n apiRoute: '',\n path: doc.url as `/${string}`,\n serverURL: serverURL || req.origin,\n })\n\n const file = await downloadFileToBuffer({\n data: { filename: doc.filename, url: fileUrl } as FileData,\n req,\n uploadConfig,\n })\n\n const mimetype = file.mimetype || doc.mimeType\n\n if (!mimetype) {\n throw new FileRetrievalError(req.t, `Unable to determine mimetype for file: ${doc.filename}`)\n }\n\n return {\n data: file.data,\n mimetype,\n }\n }\n\n throw new Error('Unable to retrieve file: missing filename or url')\n}\n"],"names":["FileRetrievalError","getFileByPath","downloadFileToBuffer","formatAdminURL","getFileFromDoc","collectionConfig","doc","req","uploadConfig","upload","disableLocalStorage","staticDir","slug","serverURL","payload","config","isLocalFile","url","startsWith","filename","filePath","file","Error","mimetype","mimeType","t","data","fileUrl","apiRoute","path","origin"],"mappings":"AAEA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,UAAS;AAC3D,SAASC,oBAAoB,QAAQ,mBAAkB;AACvD,SAASC,cAAc,QAAQ,iBAAgB;AAa/C;;;;;;;;CAQC,GACD,OAAO,MAAMC,iBAAiB,OAAO,EAAEC,gBAAgB,EAAEC,GAAG,EAAEC,GAAG,EAAQ;IACvE,MAAMC,eACJ,OAAOH,iBAAiBI,MAAM,KAAK,WAAWJ,iBAAiBI,MAAM,GAAG,CAAC;IAC3E,MAAMC,sBAAsBF,aAAaE,mBAAmB,IAAI;IAChE,MAAMC,YAAYH,aAAaG,SAAS,IAAIN,iBAAiBO,IAAI;IAEjE,MAAMC,YAAYN,IAAIO,OAAO,CAACC,MAAM,CAACF,SAAS;IAC9C,MAAMG,cAAc,AAACH,aAAaP,IAAIW,GAAG,EAAEC,WAAWL,cAAeP,IAAIW,GAAG,EAAEC,WAAW;IAEzF,IAAI,CAACR,uBAAuBM,eAAeV,IAAIa,QAAQ,EAAE;QACvD,iFAAiF;QACjF,MAAMC,WAAW,GAAGT,UAAU,CAAC,EAAEL,IAAIa,QAAQ,EAAE;QAC/C,MAAME,OAAO,MAAMpB,cAAcmB;QAEjC,IAAI,CAACC,MAAM;YACT,MAAM,IAAIC,MAAM,CAAC,wBAAwB,EAAEF,UAAU;QACvD;QAEA,MAAMG,WAAWF,KAAKE,QAAQ,IAAIjB,IAAIkB,QAAQ;QAE9C,IAAI,CAACD,UAAU;YACb,MAAM,IAAIvB,mBAAmBO,IAAIkB,CAAC,EAAE,CAAC,uCAAuC,EAAEnB,IAAIa,QAAQ,EAAE;QAC9F;QAEA,OAAO;YACLO,MAAML,KAAKK,IAAI;YACfH;QACF;IACF;IAEA,IAAIjB,IAAIa,QAAQ,IAAIb,IAAIW,GAAG,EAAE;QAC3B,gEAAgE;QAChE,2EAA2E;QAC3E,+EAA+E;QAE/E,8EAA8E;QAC9E,mFAAmF;QACnF,mEAAmE;QACnE,gFAAgF;QAChF,MAAMU,UAAUrB,IAAIW,GAAG,CAACC,UAAU,CAAC,UAC/BZ,IAAIW,GAAG,GACPd,eAAe;YACbyB,UAAU;YACVC,MAAMvB,IAAIW,GAAG;YACbJ,WAAWA,aAAaN,IAAIuB,MAAM;QACpC;QAEJ,MAAMT,OAAO,MAAMnB,qBAAqB;YACtCwB,MAAM;gBAAEP,UAAUb,IAAIa,QAAQ;gBAAEF,KAAKU;YAAQ;YAC7CpB;YACAC;QACF;QAEA,MAAMe,WAAWF,KAAKE,QAAQ,IAAIjB,IAAIkB,QAAQ;QAE9C,IAAI,CAACD,UAAU;YACb,MAAM,IAAIvB,mBAAmBO,IAAIkB,CAAC,EAAE,CAAC,uCAAuC,EAAEnB,IAAIa,QAAQ,EAAE;QAC9F;QAEA,OAAO;YACLO,MAAML,KAAKK,IAAI;YACfH;QACF;IACF;IAEA,MAAM,IAAID,MAAM;AAClB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"getSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAOhD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,WAAY,MAAM,EAAE,KAAG,iBAyB5C,CAAA"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { APIError } from 'payload';
|
|
2
|
+
import { hasUnsupportedFieldPathSegment } from 'payload/shared';
|
|
3
|
+
const createSelect = ()=>Object.create(null);
|
|
1
4
|
/**
|
|
2
5
|
* Takes an input of array of string paths in dot notation and returns a select object.
|
|
3
6
|
* Used for both export and import to build Payload's select query format.
|
|
@@ -6,16 +9,21 @@
|
|
|
6
9
|
* getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])
|
|
7
10
|
* // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }
|
|
8
11
|
*/ export const getSelect = (fields)=>{
|
|
9
|
-
const select =
|
|
12
|
+
const select = createSelect();
|
|
10
13
|
fields.forEach((field)=>{
|
|
11
14
|
const segments = field.split('.');
|
|
15
|
+
if (hasUnsupportedFieldPathSegment({
|
|
16
|
+
segments
|
|
17
|
+
})) {
|
|
18
|
+
throw new APIError('Invalid field path.', 400, null, true);
|
|
19
|
+
}
|
|
12
20
|
let selectRef = select;
|
|
13
21
|
segments.forEach((segment, i)=>{
|
|
14
22
|
if (i === segments.length - 1) {
|
|
15
23
|
selectRef[segment] = true;
|
|
16
24
|
} else {
|
|
17
|
-
if (!selectRef
|
|
18
|
-
selectRef[segment] =
|
|
25
|
+
if (!Object.prototype.hasOwnProperty.call(selectRef, segment)) {
|
|
26
|
+
selectRef[segment] = createSelect();
|
|
19
27
|
}
|
|
20
28
|
selectRef = selectRef[segment];
|
|
21
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getSelect.ts"],"sourcesContent":["import type { SelectIncludeType } from 'payload'\n\n/**\n * Takes an input of array of string paths in dot notation and returns a select object.\n * Used for both export and import to build Payload's select query format.\n *\n * @example\n * getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])\n * // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }\n */\nexport const getSelect = (fields: string[]): SelectIncludeType => {\n const select
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSelect.ts"],"sourcesContent":["import type { SelectIncludeType } from 'payload'\n\nimport { APIError } from 'payload'\nimport { hasUnsupportedFieldPathSegment } from 'payload/shared'\n\nconst createSelect = (): SelectIncludeType => Object.create(null) as SelectIncludeType\n\n/**\n * Takes an input of array of string paths in dot notation and returns a select object.\n * Used for both export and import to build Payload's select query format.\n *\n * @example\n * getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])\n * // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }\n */\nexport const getSelect = (fields: string[]): SelectIncludeType => {\n const select = createSelect()\n\n fields.forEach((field) => {\n const segments = field.split('.')\n\n if (hasUnsupportedFieldPathSegment({ segments })) {\n throw new APIError('Invalid field path.', 400, null, true)\n }\n\n let selectRef = select\n\n segments.forEach((segment, i) => {\n if (i === segments.length - 1) {\n selectRef[segment] = true\n } else {\n if (!Object.prototype.hasOwnProperty.call(selectRef, segment)) {\n selectRef[segment] = createSelect()\n }\n selectRef = selectRef[segment] as SelectIncludeType\n }\n })\n })\n\n return select\n}\n"],"names":["APIError","hasUnsupportedFieldPathSegment","createSelect","Object","create","getSelect","fields","select","forEach","field","segments","split","selectRef","segment","i","length","prototype","hasOwnProperty","call"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAClC,SAASC,8BAA8B,QAAQ,iBAAgB;AAE/D,MAAMC,eAAe,IAAyBC,OAAOC,MAAM,CAAC;AAE5D;;;;;;;CAOC,GACD,OAAO,MAAMC,YAAY,CAACC;IACxB,MAAMC,SAASL;IAEfI,OAAOE,OAAO,CAAC,CAACC;QACd,MAAMC,WAAWD,MAAME,KAAK,CAAC;QAE7B,IAAIV,+BAA+B;YAAES;QAAS,IAAI;YAChD,MAAM,IAAIV,SAAS,uBAAuB,KAAK,MAAM;QACvD;QAEA,IAAIY,YAAYL;QAEhBG,SAASF,OAAO,CAAC,CAACK,SAASC;YACzB,IAAIA,MAAMJ,SAASK,MAAM,GAAG,GAAG;gBAC7BH,SAAS,CAACC,QAAQ,GAAG;YACvB,OAAO;gBACL,IAAI,CAACV,OAAOa,SAAS,CAACC,cAAc,CAACC,IAAI,CAACN,WAAWC,UAAU;oBAC7DD,SAAS,CAACC,QAAQ,GAAGX;gBACvB;gBACAU,YAAYA,SAAS,CAACC,QAAQ;YAChC;QACF;IACF;IAEA,OAAON;AACT,EAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const getSubmittedFormValues: ({ formData, omit, }: {
|
|
2
|
+
formData: Record<string, unknown>;
|
|
3
|
+
omit?: string[];
|
|
4
|
+
}) => Record<string, unknown>;
|
|
5
|
+
/** Tracks value changes, including nested custom fields, without depending on field state identity. */
|
|
6
|
+
export declare const getFormStateSignature: ({ fields, omit, }: {
|
|
7
|
+
fields: Record<string, {
|
|
8
|
+
value?: unknown;
|
|
9
|
+
} | undefined>;
|
|
10
|
+
omit?: string[];
|
|
11
|
+
}) => string;
|
|
12
|
+
//# sourceMappingURL=getSubmittedFormValues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSubmittedFormValues.d.ts","sourceRoot":"","sources":["../../src/utilities/getSubmittedFormValues.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,wBAGhC;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAIzB,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,qBAAqB,sBAG/B;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;IACvD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,KAAG,MAQH,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Unsaved form values must not appear to come from a saved document. */ const serverOwnedFormKeys = new Set([
|
|
2
|
+
'createdAt',
|
|
3
|
+
'id',
|
|
4
|
+
'updatedAt'
|
|
5
|
+
]);
|
|
6
|
+
export const getSubmittedFormValues = ({ formData, omit = [] })=>{
|
|
7
|
+
const omitKeys = new Set([
|
|
8
|
+
...omit,
|
|
9
|
+
...serverOwnedFormKeys
|
|
10
|
+
]);
|
|
11
|
+
return Object.fromEntries(Object.entries(formData).filter(([key])=>!omitKeys.has(key)));
|
|
12
|
+
};
|
|
13
|
+
/** Tracks value changes, including nested custom fields, without depending on field state identity. */ export const getFormStateSignature = ({ fields, omit = [] })=>{
|
|
14
|
+
const omitKeys = new Set([
|
|
15
|
+
...omit,
|
|
16
|
+
...serverOwnedFormKeys
|
|
17
|
+
]);
|
|
18
|
+
return JSON.stringify(Object.entries(fields).filter(([path])=>!omitKeys.has(path)).map(([path, field])=>[
|
|
19
|
+
path,
|
|
20
|
+
field?.value
|
|
21
|
+
]));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=getSubmittedFormValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSubmittedFormValues.ts"],"sourcesContent":["/** Unsaved form values must not appear to come from a saved document. */\nconst serverOwnedFormKeys = new Set(['createdAt', 'id', 'updatedAt'])\n\nexport const getSubmittedFormValues = ({\n formData,\n omit = [],\n}: {\n formData: Record<string, unknown>\n omit?: string[]\n}): Record<string, unknown> => {\n const omitKeys = new Set([...omit, ...serverOwnedFormKeys])\n\n return Object.fromEntries(Object.entries(formData).filter(([key]) => !omitKeys.has(key)))\n}\n\n/** Tracks value changes, including nested custom fields, without depending on field state identity. */\nexport const getFormStateSignature = ({\n fields,\n omit = [],\n}: {\n fields: Record<string, { value?: unknown } | undefined>\n omit?: string[]\n}): string => {\n const omitKeys = new Set([...omit, ...serverOwnedFormKeys])\n\n return JSON.stringify(\n Object.entries(fields)\n .filter(([path]) => !omitKeys.has(path))\n .map(([path, field]) => [path, field?.value]),\n )\n}\n"],"names":["serverOwnedFormKeys","Set","getSubmittedFormValues","formData","omit","omitKeys","Object","fromEntries","entries","filter","key","has","getFormStateSignature","fields","JSON","stringify","path","map","field","value"],"mappings":"AAAA,uEAAuE,GACvE,MAAMA,sBAAsB,IAAIC,IAAI;IAAC;IAAa;IAAM;CAAY;AAEpE,OAAO,MAAMC,yBAAyB,CAAC,EACrCC,QAAQ,EACRC,OAAO,EAAE,EAIV;IACC,MAAMC,WAAW,IAAIJ,IAAI;WAAIG;WAASJ;KAAoB;IAE1D,OAAOM,OAAOC,WAAW,CAACD,OAAOE,OAAO,CAACL,UAAUM,MAAM,CAAC,CAAC,CAACC,IAAI,GAAK,CAACL,SAASM,GAAG,CAACD;AACrF,EAAC;AAED,qGAAqG,GACrG,OAAO,MAAME,wBAAwB,CAAC,EACpCC,MAAM,EACNT,OAAO,EAAE,EAIV;IACC,MAAMC,WAAW,IAAIJ,IAAI;WAAIG;WAASJ;KAAoB;IAE1D,OAAOc,KAAKC,SAAS,CACnBT,OAAOE,OAAO,CAACK,QACZJ,MAAM,CAAC,CAAC,CAACO,KAAK,GAAK,CAACX,SAASM,GAAG,CAACK,OACjCC,GAAG,CAAC,CAAC,CAACD,MAAME,MAAM,GAAK;YAACF;YAAME,OAAOC;SAAM;AAElD,EAAC"}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* @param obj - The target object to mutate.
|
|
15
15
|
* @param path - A dot-separated string path indicating where to assign the value.
|
|
16
16
|
* @param value - The value to set at the specified path.
|
|
17
|
+
* @param source - The source object used to validate array boundaries.
|
|
17
18
|
*/
|
|
18
|
-
export declare const setNestedValue: (obj: Record<string, unknown>, path: string, value: unknown) => void;
|
|
19
|
+
export declare const setNestedValue: (obj: Record<string, unknown>, path: string, value: unknown, source?: Record<string, unknown>) => void;
|
|
19
20
|
//# sourceMappingURL=setNestedValue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setNestedValue.d.ts","sourceRoot":"","sources":["../../src/utilities/setNestedValue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setNestedValue.d.ts","sourceRoot":"","sources":["../../src/utilities/setNestedValue.ts"],"names":[],"mappings":"AAoDA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,cAAc,QACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,SACL,OAAO,WACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,IAyCF,CAAA"}
|