@payloadcms/plugin-import-export 4.0.0-internal.43ccea7 → 4.0.0-internal.442e8b6

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.
Files changed (163) hide show
  1. package/dist/components/CollectionField/index.d.ts +3 -2
  2. package/dist/components/CollectionField/index.d.ts.map +1 -1
  3. package/dist/components/CollectionField/index.js.map +1 -1
  4. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
  5. package/dist/components/ExportListMenuItem/index.js +14 -12
  6. package/dist/components/ExportListMenuItem/index.js.map +1 -1
  7. package/dist/components/ExportPreview/index.css +0 -3
  8. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  9. package/dist/components/ExportPreview/index.js +11 -1
  10. package/dist/components/ExportPreview/index.js.map +1 -1
  11. package/dist/components/FieldsToExport/index.d.ts +3 -2
  12. package/dist/components/FieldsToExport/index.d.ts.map +1 -1
  13. package/dist/components/FieldsToExport/index.js.map +1 -1
  14. package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
  15. package/dist/components/FormatField/index.d.ts +3 -2
  16. package/dist/components/FormatField/index.d.ts.map +1 -1
  17. package/dist/components/FormatField/index.js.map +1 -1
  18. package/dist/components/ImportListMenuItem/index.d.ts.map +1 -1
  19. package/dist/components/ImportListMenuItem/index.js +14 -12
  20. package/dist/components/ImportListMenuItem/index.js.map +1 -1
  21. package/dist/components/ImportPreview/index.css +0 -3
  22. package/dist/components/ImportPreview/index.d.ts.map +1 -1
  23. package/dist/components/ImportPreview/index.js +27 -8
  24. package/dist/components/ImportPreview/index.js.map +1 -1
  25. package/dist/components/LimitField/index.d.ts +3 -2
  26. package/dist/components/LimitField/index.d.ts.map +1 -1
  27. package/dist/components/LimitField/index.js.map +1 -1
  28. package/dist/components/LocaleField/index.d.ts +3 -2
  29. package/dist/components/LocaleField/index.d.ts.map +1 -1
  30. package/dist/components/LocaleField/index.js.map +1 -1
  31. package/dist/components/Page/index.d.ts +3 -2
  32. package/dist/components/Page/index.d.ts.map +1 -1
  33. package/dist/components/Page/index.js.map +1 -1
  34. package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts +7 -0
  35. package/dist/components/RelationshipCell/getRelationshipGroupKey.d.ts.map +1 -0
  36. package/dist/components/RelationshipCell/getRelationshipGroupKey.js +3 -0
  37. package/dist/components/RelationshipCell/getRelationshipGroupKey.js.map +1 -0
  38. package/dist/components/RelationshipCell/getRelationshipGroups.d.ts +43 -0
  39. package/dist/components/RelationshipCell/getRelationshipGroups.d.ts.map +1 -0
  40. package/dist/components/RelationshipCell/getRelationshipGroups.js +109 -0
  41. package/dist/components/RelationshipCell/getRelationshipGroups.js.map +1 -0
  42. package/dist/components/RelationshipCell/index.css +30 -0
  43. package/dist/components/RelationshipCell/index.d.ts +15 -0
  44. package/dist/components/RelationshipCell/index.d.ts.map +1 -0
  45. package/dist/components/RelationshipCell/index.js +57 -0
  46. package/dist/components/RelationshipCell/index.js.map +1 -0
  47. package/dist/components/SortBy/index.d.ts +3 -2
  48. package/dist/components/SortBy/index.d.ts.map +1 -1
  49. package/dist/components/SortBy/index.js.map +1 -1
  50. package/dist/components/SortOrder/index.d.ts +3 -2
  51. package/dist/components/SortOrder/index.d.ts.map +1 -1
  52. package/dist/components/SortOrder/index.js.map +1 -1
  53. package/dist/export/batchProcessor.d.ts +2 -1
  54. package/dist/export/batchProcessor.d.ts.map +1 -1
  55. package/dist/export/batchProcessor.js +6 -2
  56. package/dist/export/batchProcessor.js.map +1 -1
  57. package/dist/export/createExport.d.ts +2 -0
  58. package/dist/export/createExport.d.ts.map +1 -1
  59. package/dist/export/createExport.js +6 -1
  60. package/dist/export/createExport.js.map +1 -1
  61. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  62. package/dist/export/getCreateExportCollectionTask.js +11 -0
  63. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  64. package/dist/export/getExportCollection.d.ts.map +1 -1
  65. package/dist/export/getExportCollection.js +5 -0
  66. package/dist/export/getExportCollection.js.map +1 -1
  67. package/dist/export/getFields.d.ts.map +1 -1
  68. package/dist/export/handleDownload.d.ts.map +1 -1
  69. package/dist/export/handleDownload.js +7 -3
  70. package/dist/export/handleDownload.js.map +1 -1
  71. package/dist/export/handlePreview.d.ts.map +1 -1
  72. package/dist/export/handlePreview.js +24 -5
  73. package/dist/export/handlePreview.js.map +1 -1
  74. package/dist/exports/types.d.ts +1 -1
  75. package/dist/exports/types.d.ts.map +1 -1
  76. package/dist/exports/types.js.map +1 -1
  77. package/dist/import/batchProcessor.d.ts +2 -1
  78. package/dist/import/batchProcessor.d.ts.map +1 -1
  79. package/dist/import/batchProcessor.js +15 -8
  80. package/dist/import/batchProcessor.js.map +1 -1
  81. package/dist/import/createImport.d.ts +3 -2
  82. package/dist/import/createImport.d.ts.map +1 -1
  83. package/dist/import/createImport.js +8 -1
  84. package/dist/import/createImport.js.map +1 -1
  85. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
  86. package/dist/import/getCreateImportCollectionTask.js +5 -2
  87. package/dist/import/getCreateImportCollectionTask.js.map +1 -1
  88. package/dist/import/getFields.d.ts.map +1 -1
  89. package/dist/import/getImportCollection.d.ts.map +1 -1
  90. package/dist/import/getImportCollection.js +2 -0
  91. package/dist/import/getImportCollection.js.map +1 -1
  92. package/dist/import/handlePreview.d.ts.map +1 -1
  93. package/dist/import/handlePreview.js +5 -1
  94. package/dist/import/handlePreview.js.map +1 -1
  95. package/dist/translations/languages/en.d.ts.map +1 -1
  96. package/dist/types.d.ts +17 -1
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/types.js.map +1 -1
  99. package/dist/utilities/applyFieldHooks.d.ts.map +1 -1
  100. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
  101. package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -1
  102. package/dist/utilities/fieldToRegex.d.ts.map +1 -1
  103. package/dist/utilities/flattenObject.d.ts.map +1 -1
  104. package/dist/utilities/flattenedFields.d.ts.map +1 -1
  105. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
  106. package/dist/utilities/getExportFieldFunctions.js +64 -27
  107. package/dist/utilities/getExportFieldFunctions.js.map +1 -1
  108. package/dist/utilities/getFileFromDoc.d.ts.map +1 -1
  109. package/dist/utilities/getFileFromDoc.js +3 -3
  110. package/dist/utilities/getFileFromDoc.js.map +1 -1
  111. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
  112. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
  113. package/dist/utilities/getPluginCollections.d.ts.map +1 -1
  114. package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
  115. package/dist/utilities/getSelect.d.ts.map +1 -1
  116. package/dist/utilities/getSelect.js +11 -3
  117. package/dist/utilities/getSelect.js.map +1 -1
  118. package/dist/utilities/getSubmittedFormValues.d.ts +12 -0
  119. package/dist/utilities/getSubmittedFormValues.d.ts.map +1 -0
  120. package/dist/utilities/getSubmittedFormValues.js +24 -0
  121. package/dist/utilities/getSubmittedFormValues.js.map +1 -0
  122. package/dist/utilities/isPlainObject.d.ts.map +1 -1
  123. package/dist/utilities/parseCSV.d.ts.map +1 -1
  124. package/dist/utilities/parseJSON.d.ts.map +1 -1
  125. package/dist/utilities/polymorphicRel.d.ts.map +1 -1
  126. package/dist/utilities/processRichTextField.d.ts.map +1 -1
  127. package/dist/utilities/removeDisabledFields.d.ts.map +1 -1
  128. package/dist/utilities/setNestedValue.d.ts +2 -1
  129. package/dist/utilities/setNestedValue.d.ts.map +1 -1
  130. package/dist/utilities/setNestedValue.js +65 -34
  131. package/dist/utilities/setNestedValue.js.map +1 -1
  132. package/dist/utilities/sortHelpers.d.ts +1 -1
  133. package/dist/utilities/sortHelpers.d.ts.map +1 -1
  134. package/dist/utilities/unflattenObject.d.ts.map +1 -1
  135. package/dist/utilities/unflattenPostProcess.d.ts.map +1 -1
  136. package/dist/utilities/validateLimitValue.d.ts.map +1 -1
  137. package/package.json +9 -9
  138. package/dist/components/FieldsToExport/reduceFields.spec.js +0 -239
  139. package/dist/components/FieldsToExport/reduceFields.spec.js.map +0 -1
  140. package/dist/utilities/applyFieldHooks.spec.js +0 -205
  141. package/dist/utilities/applyFieldHooks.spec.js.map +0 -1
  142. package/dist/utilities/buildDisabledFieldRegex.spec.js +0 -64
  143. package/dist/utilities/buildDisabledFieldRegex.spec.js.map +0 -1
  144. package/dist/utilities/fieldToRegex.spec.js +0 -151
  145. package/dist/utilities/fieldToRegex.spec.js.map +0 -1
  146. package/dist/utilities/filterToSelectedFields.spec.js +0 -204
  147. package/dist/utilities/filterToSelectedFields.spec.js.map +0 -1
  148. package/dist/utilities/flattenObject.spec.js +0 -158
  149. package/dist/utilities/flattenObject.spec.js.map +0 -1
  150. package/dist/utilities/getExportFieldFunctions.spec.js +0 -50
  151. package/dist/utilities/getExportFieldFunctions.spec.js.map +0 -1
  152. package/dist/utilities/getImportFieldFunctions.spec.js +0 -167
  153. package/dist/utilities/getImportFieldFunctions.spec.js.map +0 -1
  154. package/dist/utilities/getSchemaColumns.spec.js +0 -157
  155. package/dist/utilities/getSchemaColumns.spec.js.map +0 -1
  156. package/dist/utilities/parseCSV.spec.js +0 -195
  157. package/dist/utilities/parseCSV.spec.js.map +0 -1
  158. package/dist/utilities/processRichTextField.spec.js +0 -308
  159. package/dist/utilities/processRichTextField.spec.js.map +0 -1
  160. package/dist/utilities/siblingDoc.spec.js +0 -278
  161. package/dist/utilities/siblingDoc.spec.js.map +0 -1
  162. package/dist/utilities/unflattenObject.spec.js +0 -819
  163. package/dist/utilities/unflattenObject.spec.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"getExportCollection.d.ts","sourceRoot":"","sources":["../../src/export/getExportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,MAAM,EACP,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAS,MAAM,aAAa,CAAA;AAWhF,eAAO,MAAM,mBAAmB,GAAI,0DAKjC;IACD;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBA8JH,CAAA"}
1
+ {"version":3,"file":"getExportCollection.d.ts","sourceRoot":"","sources":["../../src/export/getExportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,MAAM,EACP,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAS,MAAM,aAAa,CAAA;AAYhF,eAAO,MAAM,mBAAmB,6DAK7B;IACD;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBAgKH,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js';
1
2
  import { resolveLimit } from '../utilities/resolveLimit.js';
2
3
  import { createExport } from './createExport.js';
3
4
  import { getFields } from './getFields.js';
@@ -89,6 +90,9 @@ export const getExportCollection = ({ collectionSlugs, config, exportConfig, plu
89
90
  batchSize,
90
91
  debug,
91
92
  exportCollection: collectionConfig.slug,
93
+ exportDoc: getSubmittedFormValues({
94
+ formData: exportData
95
+ }),
92
96
  maxLimit,
93
97
  req,
94
98
  userCollection: user?.collection,
@@ -135,6 +139,7 @@ export const getExportCollection = ({ collectionSlugs, config, exportConfig, plu
135
139
  };
136
140
  await req.payload.jobs.queue({
137
141
  input,
142
+ overrideAccess: true,
138
143
  task: 'createCollectionExport'
139
144
  });
140
145
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/getExportCollection.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionBeforeOperationHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport type { ExportConfig, ImportExportPluginConfig, Limit } from '../types.js'\nimport type { Export } from './createExport.js'\n\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\nimport { getFields } from './getFields.js'\nimport { handleDownload } from './handleDownload.js'\nimport { handlePreview } from './handlePreview.js'\n\nconst FALLBACK_BATCH_SIZE = 100\n\nexport const getExportCollection = ({\n collectionSlugs,\n config,\n exportConfig,\n pluginConfig,\n}: {\n /**\n * Collection slugs that this export collection supports.\n */\n collectionSlugs: string[]\n config: Config\n exportConfig?: ExportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const beforeOperation: CollectionBeforeOperationHook[] = []\n const afterChange: CollectionAfterChangeHook[] = []\n\n const disableDownload = exportConfig?.disableDownload ?? false\n const disableSave = exportConfig?.disableSave ?? false\n const format = exportConfig?.format\n\n const collection: CollectionConfig = {\n slug: 'exports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ExportSaveButton',\n },\n },\n custom: {\n disableDownload,\n disableSave,\n format,\n 'plugin-import-export': {\n collectionSlugs,\n },\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'name',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: (req) => handleDownload(req, pluginConfig.debug),\n method: 'post',\n path: '/download',\n },\n {\n handler: handlePreview,\n method: 'post',\n path: '/export-preview',\n },\n ],\n fields: getFields({ collectionSlugs, config, format }),\n hooks: {\n afterChange,\n beforeOperation,\n },\n lockDocuments: false,\n upload: {\n filesRequiredOnCreate: false,\n hideFileInputOnCreate: true,\n hideRemoveFile: true,\n },\n }\n\n // Synchronous export hook - runs when target collection has disableJobsQueue enabled\n beforeOperation.push(async ({ args, collection: collectionConfig, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const exportData = args.data as Export\n const targetCollection = req.payload.collections[exportData.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n\n // Check if this target collection should use sync mode\n // Fall back to exportConfig (for custom collections with overrideCollection)\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (!disableJobsQueue) {\n return\n }\n\n const { user } = req\n const debug = pluginConfig.debug\n\n const exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n await createExport({\n ...exportData,\n batchSize,\n debug,\n exportCollection: collectionConfig.slug,\n maxLimit,\n req,\n userCollection: user?.collection,\n userID: user?.id,\n })\n })\n\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (disableJobsQueue) {\n return\n }\n\n const { user } = req\n\n // Get max limit from the target collection's config\n // For job-based exports, we resolve the limit now since function limits\n // cannot be serialized. This means dynamic limits are resolved at queue time.\n const exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n const input: Export = {\n id: doc.id,\n name: doc.name,\n batchSize,\n collectionSlug: doc.collectionSlug,\n drafts: doc.drafts,\n exportCollection: collectionConfig.slug,\n fields: doc.fields,\n format: doc.format,\n limit: doc.limit,\n locale: doc.locale,\n maxLimit,\n page: doc.page,\n sort: doc.sort,\n userCollection: user?.collection,\n userID: user?.id,\n where: doc.where,\n }\n\n await req.payload.jobs.queue({\n input,\n task: 'createCollectionExport',\n })\n })\n\n return collection\n}\n"],"names":["resolveLimit","createExport","getFields","handleDownload","handlePreview","FALLBACK_BATCH_SIZE","getExportCollection","collectionSlugs","config","exportConfig","pluginConfig","beforeOperation","afterChange","disableDownload","disableSave","format","collection","slug","access","update","admin","components","edit","SaveButton","custom","disableCopyToLocale","group","useAsTitle","disableDuplicate","endpoints","handler","req","debug","method","path","fields","hooks","lockDocuments","upload","filesRequiredOnCreate","hideFileInputOnCreate","hideRemoveFile","push","args","collectionConfig","operation","exportData","data","targetCollection","payload","collections","collectionSlug","targetPluginConfig","disableJobsQueue","exportDisableJobsQueue","user","exportLimitConfig","exportLimit","maxLimit","limit","batchSize","exportBatchSize","exportCollection","userCollection","userID","id","doc","input","name","drafts","locale","page","sort","where","jobs","queue","task"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/getExportCollection.ts"],"sourcesContent":["import type {\n CollectionAfterChangeHook,\n CollectionBeforeOperationHook,\n CollectionConfig,\n Config,\n} from 'payload'\n\nimport type { ExportConfig, ImportExportPluginConfig, Limit } from '../types.js'\nimport type { Export } from './createExport.js'\n\nimport { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\nimport { getFields } from './getFields.js'\nimport { handleDownload } from './handleDownload.js'\nimport { handlePreview } from './handlePreview.js'\n\nconst FALLBACK_BATCH_SIZE = 100\n\nexport const getExportCollection = ({\n collectionSlugs,\n config,\n exportConfig,\n pluginConfig,\n}: {\n /**\n * Collection slugs that this export collection supports.\n */\n collectionSlugs: string[]\n config: Config\n exportConfig?: ExportConfig\n pluginConfig: ImportExportPluginConfig\n}): CollectionConfig => {\n const beforeOperation: CollectionBeforeOperationHook[] = []\n const afterChange: CollectionAfterChangeHook[] = []\n\n const disableDownload = exportConfig?.disableDownload ?? false\n const disableSave = exportConfig?.disableSave ?? false\n const format = exportConfig?.format\n\n const collection: CollectionConfig = {\n slug: 'exports',\n access: {\n update: () => false,\n },\n admin: {\n components: {\n edit: {\n SaveButton: '@payloadcms/plugin-import-export/rsc#ExportSaveButton',\n },\n },\n custom: {\n disableDownload,\n disableSave,\n format,\n 'plugin-import-export': {\n collectionSlugs,\n },\n },\n disableCopyToLocale: true,\n group: false,\n useAsTitle: 'name',\n },\n disableDuplicate: true,\n endpoints: [\n {\n handler: (req) => handleDownload(req, pluginConfig.debug),\n method: 'post',\n path: '/download',\n },\n {\n handler: handlePreview,\n method: 'post',\n path: '/export-preview',\n },\n ],\n fields: getFields({ collectionSlugs, config, format }),\n hooks: {\n afterChange,\n beforeOperation,\n },\n lockDocuments: false,\n upload: {\n filesRequiredOnCreate: false,\n hideFileInputOnCreate: true,\n hideRemoveFile: true,\n },\n }\n\n // Synchronous export hook - runs when target collection has disableJobsQueue enabled\n beforeOperation.push(async ({ args, collection: collectionConfig, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const exportData = args.data as Export\n const targetCollection = req.payload.collections[exportData.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n\n // Check if this target collection should use sync mode\n // Fall back to exportConfig (for custom collections with overrideCollection)\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (!disableJobsQueue) {\n return\n }\n\n const { user } = req\n const debug = pluginConfig.debug\n\n const exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n await createExport({\n ...exportData,\n batchSize,\n debug,\n exportCollection: collectionConfig.slug,\n exportDoc: getSubmittedFormValues({ formData: exportData }),\n maxLimit,\n req,\n userCollection: user?.collection,\n userID: user?.id,\n })\n })\n\n afterChange.push(async ({ collection: collectionConfig, doc, operation, req }) => {\n if (operation !== 'create') {\n return\n }\n\n const targetCollection = req.payload.collections[doc.collectionSlug]\n const targetPluginConfig = targetCollection?.config.custom?.['plugin-import-export']\n const disableJobsQueue =\n targetPluginConfig?.exportDisableJobsQueue ?? exportConfig?.disableJobsQueue ?? false\n if (disableJobsQueue) {\n return\n }\n\n const { user } = req\n\n // Get max limit from the target collection's config\n // For job-based exports, we resolve the limit now since function limits\n // cannot be serialized. This means dynamic limits are resolved at queue time.\n const exportLimitConfig: Limit | undefined = targetPluginConfig?.exportLimit\n const maxLimit = await resolveLimit({\n limit: exportLimitConfig,\n req,\n })\n\n const batchSize =\n targetPluginConfig?.exportBatchSize ??\n exportConfig?.batchSize ??\n pluginConfig.batchSize ??\n FALLBACK_BATCH_SIZE\n\n const input: Export = {\n id: doc.id,\n name: doc.name,\n batchSize,\n collectionSlug: doc.collectionSlug,\n drafts: doc.drafts,\n exportCollection: collectionConfig.slug,\n fields: doc.fields,\n format: doc.format,\n limit: doc.limit,\n locale: doc.locale,\n maxLimit,\n page: doc.page,\n sort: doc.sort,\n userCollection: user?.collection,\n userID: user?.id,\n where: doc.where,\n }\n\n await req.payload.jobs.queue({\n input,\n overrideAccess: true,\n task: 'createCollectionExport',\n })\n })\n\n return collection\n}\n"],"names":["getSubmittedFormValues","resolveLimit","createExport","getFields","handleDownload","handlePreview","FALLBACK_BATCH_SIZE","getExportCollection","collectionSlugs","config","exportConfig","pluginConfig","beforeOperation","afterChange","disableDownload","disableSave","format","collection","slug","access","update","admin","components","edit","SaveButton","custom","disableCopyToLocale","group","useAsTitle","disableDuplicate","endpoints","handler","req","debug","method","path","fields","hooks","lockDocuments","upload","filesRequiredOnCreate","hideFileInputOnCreate","hideRemoveFile","push","args","collectionConfig","operation","exportData","data","targetCollection","payload","collections","collectionSlug","targetPluginConfig","disableJobsQueue","exportDisableJobsQueue","user","exportLimitConfig","exportLimit","maxLimit","limit","batchSize","exportBatchSize","exportCollection","exportDoc","formData","userCollection","userID","id","doc","input","name","drafts","locale","page","sort","where","jobs","queue","overrideAccess","task"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/export/getFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAA+B,MAAM,SAAS,CAAA;AAKzE,KAAK,gBAAgB,GAAG;IACtB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,SAAS,gBAAgB,KAAG,KAAK,EA6Q1D,CAAA"}
1
+ {"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/export/getFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAA+B,MAAM,SAAS,CAAA;AAKzE,KAAK,gBAAgB,GAAG;IACtB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,gBAAgB,KAAG,KAAK,EA6Q1D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"handleDownload.d.ts","sourceRoot":"","sources":["../../src/export/handleDownload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAO7C,eAAO,MAAM,cAAc,GAAU,KAAK,cAAc,EAAE,eAAa,sBA2DtE,CAAA"}
1
+ {"version":3,"file":"handleDownload.d.ts","sourceRoot":"","sources":["../../src/export/handleDownload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C,eAAO,MAAM,cAAc,QAAe,cAAc,uCA6DvD,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { APIError } from 'payload';
2
+ import { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js';
2
3
  import { resolveLimit } from '../utilities/resolveLimit.js';
3
4
  import { createExport } from './createExport.js';
4
5
  export const handleDownload = async (req, debug = false)=>{
@@ -28,15 +29,18 @@ export const handleDownload = async (req, debug = false)=>{
28
29
  });
29
30
  }
30
31
  const { user } = req;
31
- body.data.userID = user?.id;
32
- body.data.userCollection = user?.collection;
32
+ const exportDoc = getSubmittedFormValues({
33
+ formData: body.data
34
+ });
33
35
  const res = await createExport({
34
36
  ...body.data,
35
37
  debug,
36
38
  download: true,
39
+ exportDoc,
37
40
  maxLimit,
38
41
  req,
39
- user: req.user
42
+ userCollection: user?.collection,
43
+ userID: user?.id
40
44
  });
41
45
  return res;
42
46
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/handleDownload.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\n\nexport const handleDownload = async (req: PayloadRequest, debug = false) => {\n try {\n let body\n\n if (typeof req?.json === 'function') {\n body = await req.json()\n }\n\n if (!body || !body.data) {\n throw new APIError('Request data is required.')\n }\n\n const { collectionSlug, format } = body.data || {}\n\n req.payload.logger.info(`Download request received ${collectionSlug}`)\n\n const targetCollection = req.payload.collections[collectionSlug]\n let maxLimit: number | undefined\n\n if (targetCollection) {\n const adminPluginConfig = targetCollection.config.admin?.custom?.['plugin-import-export']\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n\n const forcedFormat = adminPluginConfig?.exportFormat\n if (forcedFormat && format && format !== forcedFormat) {\n throw new APIError(\n `Export format '${format}' is not supported for collection '${collectionSlug}'. Only '${forcedFormat}' format is allowed.`,\n )\n }\n\n // Resolve max limit from the collection config\n maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n }\n\n const { user } = req\n\n body.data.userID = user?.id\n body.data.userCollection = user?.collection\n\n const res = await createExport({\n ...body.data,\n debug,\n download: true,\n maxLimit,\n req,\n user: req.user,\n })\n\n return res as Response\n } catch (err) {\n // Return JSON for front-end toast\n return new Response(\n JSON.stringify({ errors: [{ message: (err as Error).message || 'Something went wrong' }] }),\n { headers: { 'Content-Type': 'application/json' }, status: 400 },\n )\n }\n}\n"],"names":["APIError","resolveLimit","createExport","handleDownload","req","debug","body","json","data","collectionSlug","format","payload","logger","info","targetCollection","collections","maxLimit","adminPluginConfig","config","admin","custom","pluginConfig","forcedFormat","exportFormat","limit","exportLimit","user","userID","id","userCollection","collection","res","download","err","Response","JSON","stringify","errors","message","headers","status"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,YAAY,QAAQ,+BAA8B;AAC3D,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,OAAO,MAAMC,iBAAiB,OAAOC,KAAqBC,QAAQ,KAAK;IACrE,IAAI;QACF,IAAIC;QAEJ,IAAI,OAAOF,KAAKG,SAAS,YAAY;YACnCD,OAAO,MAAMF,IAAIG,IAAI;QACvB;QAEA,IAAI,CAACD,QAAQ,CAACA,KAAKE,IAAI,EAAE;YACvB,MAAM,IAAIR,SAAS;QACrB;QAEA,MAAM,EAAES,cAAc,EAAEC,MAAM,EAAE,GAAGJ,KAAKE,IAAI,IAAI,CAAC;QAEjDJ,IAAIO,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,0BAA0B,EAAEJ,gBAAgB;QAErE,MAAMK,mBAAmBV,IAAIO,OAAO,CAACI,WAAW,CAACN,eAAe;QAChE,IAAIO;QAEJ,IAAIF,kBAAkB;YACpB,MAAMG,oBAAoBH,iBAAiBI,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,uBAAuB;YACzF,MAAMC,eAAeP,iBAAiBI,MAAM,CAACE,MAAM,EAAE,CAAC,uBAAuB;YAE7E,MAAME,eAAeL,mBAAmBM;YACxC,IAAID,gBAAgBZ,UAAUA,WAAWY,cAAc;gBACrD,MAAM,IAAItB,SACR,CAAC,eAAe,EAAEU,OAAO,mCAAmC,EAAED,eAAe,SAAS,EAAEa,aAAa,oBAAoB,CAAC;YAE9H;YAEA,+CAA+C;YAC/CN,WAAW,MAAMf,aAAa;gBAC5BuB,OAAOH,cAAcI;gBACrBrB;YACF;QACF;QAEA,MAAM,EAAEsB,IAAI,EAAE,GAAGtB;QAEjBE,KAAKE,IAAI,CAACmB,MAAM,GAAGD,MAAME;QACzBtB,KAAKE,IAAI,CAACqB,cAAc,GAAGH,MAAMI;QAEjC,MAAMC,MAAM,MAAM7B,aAAa;YAC7B,GAAGI,KAAKE,IAAI;YACZH;YACA2B,UAAU;YACVhB;YACAZ;YACAsB,MAAMtB,IAAIsB,IAAI;QAChB;QAEA,OAAOK;IACT,EAAE,OAAOE,KAAK;QACZ,kCAAkC;QAClC,OAAO,IAAIC,SACTC,KAAKC,SAAS,CAAC;YAAEC,QAAQ;gBAAC;oBAAEC,SAAS,AAACL,IAAcK,OAAO,IAAI;gBAAuB;aAAE;QAAC,IACzF;YAAEC,SAAS;gBAAE,gBAAgB;YAAmB;YAAGC,QAAQ;QAAI;IAEnE;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/export/handleDownload.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport type { ExportDoc } from '../types.js'\n\nimport { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { createExport } from './createExport.js'\n\nexport const handleDownload = async (req: PayloadRequest, debug = false) => {\n try {\n let body\n\n if (typeof req?.json === 'function') {\n body = await req.json()\n }\n\n if (!body || !body.data) {\n throw new APIError('Request data is required.')\n }\n\n const { collectionSlug, format } = body.data || {}\n\n req.payload.logger.info(`Download request received ${collectionSlug}`)\n\n const targetCollection = req.payload.collections[collectionSlug]\n let maxLimit: number | undefined\n\n if (targetCollection) {\n const adminPluginConfig = targetCollection.config.admin?.custom?.['plugin-import-export']\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n\n const forcedFormat = adminPluginConfig?.exportFormat\n if (forcedFormat && format && format !== forcedFormat) {\n throw new APIError(\n `Export format '${format}' is not supported for collection '${collectionSlug}'. Only '${forcedFormat}' format is allowed.`,\n )\n }\n\n // Resolve max limit from the collection config\n maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n }\n\n const { user } = req\n const exportDoc = getSubmittedFormValues({\n formData: body.data as Record<string, unknown>,\n }) as ExportDoc\n\n const res = await createExport({\n ...body.data,\n debug,\n download: true,\n exportDoc,\n maxLimit,\n req,\n userCollection: user?.collection,\n userID: user?.id,\n })\n\n return res as Response\n } catch (err) {\n // Return JSON for front-end toast\n return new Response(\n JSON.stringify({ errors: [{ message: (err as Error).message || 'Something went wrong' }] }),\n { headers: { 'Content-Type': 'application/json' }, status: 400 },\n )\n }\n}\n"],"names":["APIError","getSubmittedFormValues","resolveLimit","createExport","handleDownload","req","debug","body","json","data","collectionSlug","format","payload","logger","info","targetCollection","collections","maxLimit","adminPluginConfig","config","admin","custom","pluginConfig","forcedFormat","exportFormat","limit","exportLimit","user","exportDoc","formData","res","download","userCollection","collection","userID","id","err","Response","JSON","stringify","errors","message","headers","status"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAIlC,SAASC,sBAAsB,QAAQ,yCAAwC;AAC/E,SAASC,YAAY,QAAQ,+BAA8B;AAC3D,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,OAAO,MAAMC,iBAAiB,OAAOC,KAAqBC,QAAQ,KAAK;IACrE,IAAI;QACF,IAAIC;QAEJ,IAAI,OAAOF,KAAKG,SAAS,YAAY;YACnCD,OAAO,MAAMF,IAAIG,IAAI;QACvB;QAEA,IAAI,CAACD,QAAQ,CAACA,KAAKE,IAAI,EAAE;YACvB,MAAM,IAAIT,SAAS;QACrB;QAEA,MAAM,EAAEU,cAAc,EAAEC,MAAM,EAAE,GAAGJ,KAAKE,IAAI,IAAI,CAAC;QAEjDJ,IAAIO,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,0BAA0B,EAAEJ,gBAAgB;QAErE,MAAMK,mBAAmBV,IAAIO,OAAO,CAACI,WAAW,CAACN,eAAe;QAChE,IAAIO;QAEJ,IAAIF,kBAAkB;YACpB,MAAMG,oBAAoBH,iBAAiBI,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,uBAAuB;YACzF,MAAMC,eAAeP,iBAAiBI,MAAM,CAACE,MAAM,EAAE,CAAC,uBAAuB;YAE7E,MAAME,eAAeL,mBAAmBM;YACxC,IAAID,gBAAgBZ,UAAUA,WAAWY,cAAc;gBACrD,MAAM,IAAIvB,SACR,CAAC,eAAe,EAAEW,OAAO,mCAAmC,EAAED,eAAe,SAAS,EAAEa,aAAa,oBAAoB,CAAC;YAE9H;YAEA,+CAA+C;YAC/CN,WAAW,MAAMf,aAAa;gBAC5BuB,OAAOH,cAAcI;gBACrBrB;YACF;QACF;QAEA,MAAM,EAAEsB,IAAI,EAAE,GAAGtB;QACjB,MAAMuB,YAAY3B,uBAAuB;YACvC4B,UAAUtB,KAAKE,IAAI;QACrB;QAEA,MAAMqB,MAAM,MAAM3B,aAAa;YAC7B,GAAGI,KAAKE,IAAI;YACZH;YACAyB,UAAU;YACVH;YACAX;YACAZ;YACA2B,gBAAgBL,MAAMM;YACtBC,QAAQP,MAAMQ;QAChB;QAEA,OAAOL;IACT,EAAE,OAAOM,KAAK;QACZ,kCAAkC;QAClC,OAAO,IAAIC,SACTC,KAAKC,SAAS,CAAC;YAAEC,QAAQ;gBAAC;oBAAEC,SAAS,AAACL,IAAcK,OAAO,IAAI;gBAAuB;aAAE;QAAC,IACzF;YAAEC,SAAS;gBAAE,gBAAgB;YAAmB;YAAGC,QAAQ;QAAI;IAEnE;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/export/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,SAAS,CAAA;AA2C1D,eAAO,MAAM,aAAa,GAAU,KAAK,cAAc,KAAG,OAAO,CAAC,QAAQ,CAuQzE,CAAA"}
1
+ {"version":3,"file":"handlePreview.d.ts","sourceRoot":"","sources":["../../src/export/handlePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,SAAS,CAAA;AAqD1D,eAAO,MAAM,aAAa,QAAe,cAAc,KAAG,OAAO,CAAC,QAAQ,CA2RzE,CAAA"}
@@ -7,16 +7,18 @@ import { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js
7
7
  import { getFlattenedFieldKeys } from '../utilities/getFlattenedFieldKeys.js';
8
8
  import { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js';
9
9
  import { getSelect } from '../utilities/getSelect.js';
10
+ import { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js';
10
11
  import { removeDisabledFields } from '../utilities/removeDisabledFields.js';
11
12
  import { resolveLimit } from '../utilities/resolveLimit.js';
12
13
  import { setNestedValue } from '../utilities/setNestedValue.js';
13
- const applyExportBeforeHook = async (hook, data, originalDocs, format, req)=>{
14
+ const applyExportBeforeHook = async ({ data, exportDoc, format, hook, originalDocs, req })=>{
14
15
  if (!hook || data.length === 0) {
15
16
  return data;
16
17
  }
17
18
  return hook({
18
19
  batchNumber: 1,
19
20
  data,
21
+ exportDoc,
20
22
  format,
21
23
  originalData: originalDocs,
22
24
  req,
@@ -25,10 +27,13 @@ const applyExportBeforeHook = async (hook, data, originalDocs, format, req)=>{
25
27
  };
26
28
  export const handlePreview = async (req)=>{
27
29
  await addDataAndFileToRequest(req);
28
- const { collectionSlug, draft: draftFromReq, fields, limit: exportLimit, locale, previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT, previewPage: rawPreviewPage = 1, sort, where: whereFromReq = {} } = req.data;
30
+ const { collectionSlug, draft: draftFromReq, fields, formData, limit: exportLimit, locale, previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT, previewPage: rawPreviewPage = 1, sort, where: whereFromReq = {} } = req.data;
29
31
  // Validate and clamp pagination values to safe bounds
30
32
  const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT));
31
33
  const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage);
34
+ const exportDoc = getSubmittedFormValues({
35
+ formData: formData ?? {}
36
+ });
32
37
  const targetCollection = req.payload.collections[collectionSlug];
33
38
  if (!targetCollection) {
34
39
  return Response.json({
@@ -154,7 +159,14 @@ export const handlePreview = async (req)=>{
154
159
  format: 'csv',
155
160
  req
156
161
  }));
157
- transformed = await applyExportBeforeHook(exportHooks?.before, transformed, docs, 'csv', req);
162
+ transformed = await applyExportBeforeHook({
163
+ data: transformed,
164
+ exportDoc,
165
+ format: 'csv',
166
+ hook: exportHooks?.before,
167
+ originalDocs: docs,
168
+ req
169
+ });
158
170
  if (schemaColumns && transformed.length > 0) {
159
171
  const dataColumns = [];
160
172
  const seenCols = new Set();
@@ -199,13 +211,20 @@ export const handlePreview = async (req)=>{
199
211
  const trimmed = {};
200
212
  for (const key of fields){
201
213
  const value = getObjectDotNotation(output, key);
202
- setNestedValue(trimmed, key, value ?? null);
214
+ setNestedValue(trimmed, key, value ?? null, output);
203
215
  }
204
216
  output = trimmed;
205
217
  }
206
218
  return output;
207
219
  });
208
- transformed = await applyExportBeforeHook(exportHooks?.before, transformed, docs, 'json', req);
220
+ transformed = await applyExportBeforeHook({
221
+ data: transformed,
222
+ exportDoc,
223
+ format: 'json',
224
+ hook: exportHooks?.before,
225
+ originalDocs: docs,
226
+ req
227
+ });
209
228
  }
210
229
  const hasNextPage = previewPage < previewTotalPages;
211
230
  const hasPrevPage = previewPage > 1;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest, Sort, Where } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\nimport { getObjectDotNotation } from 'payload/shared'\n\nimport type { ExportBeforeHook, ExportPreviewResponse } from '../types.js'\n\nimport {\n DEFAULT_PREVIEW_LIMIT,\n MAX_PREVIEW_LIMIT,\n MIN_PREVIEW_LIMIT,\n MIN_PREVIEW_PAGE,\n} from '../constants.js'\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFlattenedFieldKeys } from '../utilities/getFlattenedFieldKeys.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { setNestedValue } from '../utilities/setNestedValue.js'\n\nconst applyExportBeforeHook = async (\n hook: ExportBeforeHook | undefined,\n data: Record<string, unknown>[],\n originalDocs: unknown[],\n format: 'csv' | 'json' | ({} & string),\n req: PayloadRequest,\n): Promise<Record<string, unknown>[]> => {\n if (!hook || data.length === 0) {\n return data\n }\n return hook({\n batchNumber: 1,\n data,\n format,\n originalData: originalDocs as Record<string, unknown>[],\n req,\n totalBatches: 1,\n })\n}\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n draft: draftFromReq,\n fields,\n limit: exportLimit,\n locale,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n sort,\n where: whereFromReq = {},\n } = req.data as {\n collectionSlug: string\n draft?: 'no' | 'yes'\n fields?: string[]\n format?: 'csv' | 'json'\n limit?: number\n locale?: string\n previewLimit?: number\n previewPage?: number\n sort?: Sort\n where?: Where\n }\n\n // Validate and clamp pagination values to safe bounds\n const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT))\n const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage)\n\n const targetCollection = req.payload.collections[collectionSlug]\n if (!targetCollection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n const maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n const draft = draftFromReq === 'yes'\n const collectionHasVersions = Boolean(targetCollection.config.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = collectionHasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromReq, draft ? {} : publishedWhere],\n }\n\n // Count total docs matching export criteria\n const countResult = await req.payload.count({\n collection: collectionSlug,\n overrideAccess: false,\n req,\n where,\n })\n\n const totalMatchingDocs = countResult.totalDocs\n\n // Calculate actual export count (respecting both export limit and max limit)\n let effectiveLimit = totalMatchingDocs\n\n // Apply user's export limit if provided\n if (exportLimit && exportLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, exportLimit)\n }\n\n // Apply max limit if configured\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, maxLimit)\n }\n\n const exportTotalDocs = effectiveLimit\n\n // Calculate preview pagination that respects export limit\n // Preview should only show docs that will actually be exported\n const previewStartIndex = (previewPage - 1) * previewLimit\n\n // Calculate pagination info based on export limit (not raw DB results)\n const previewTotalPages = exportTotalDocs === 0 ? 0 : Math.ceil(exportTotalDocs / previewLimit)\n\n const isCSV = req?.data?.format === 'csv'\n\n // Get locale codes for locale expansion when locale='all'\n const localeCodes =\n locale === 'all' && req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n // Get disabled fields configuration\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n // Compute schema-based columns for CSV (provides base ordering and handles empty exports)\n const schemaColumns = isCSV\n ? getSchemaColumns({\n collectionConfig: targetCollection.config,\n disabledFields,\n fields,\n locale: locale ?? undefined,\n localeCodes,\n })\n : undefined\n\n // columns will be finalized after data is available (merged with data-discovered columns)\n let columns = schemaColumns\n\n // If we're beyond the effective limit (considering both user limit and maxLimit), return empty docs\n if (exportTotalDocs > 0 && previewStartIndex >= exportTotalDocs) {\n const response: ExportPreviewResponse = {\n columns,\n docs: [],\n exportTotalDocs,\n hasNextPage: false,\n hasPrevPage: previewPage > 1,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n return Response.json(response)\n }\n\n // Fetch preview page with full previewLimit to maintain consistent pagination offsets\n // We'll trim the results afterwards if needed to respect export limit\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n draft,\n limit: previewLimit,\n locale,\n overrideAccess: false,\n page: previewPage,\n req,\n select,\n sort,\n where,\n })\n\n // Trim docs to respect effective limit boundary (user limit clamped by maxLimit)\n let docs = result.docs\n if (exportTotalDocs > 0) {\n const remainingInExport = exportTotalDocs - previewStartIndex\n if (remainingInExport < docs.length) {\n docs = docs.slice(0, remainingInExport)\n }\n }\n\n // Transform docs based on format\n let transformed: Record<string, unknown>[]\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: targetCollection.config.flattenedFields,\n })\n\n const exportHooks = targetCollection.config.custom?.['plugin-import-export']?.exportHooks\n\n if (isCSV) {\n const possibleKeys = getFlattenedFieldKeys(targetCollection.config.flattenedFields, '', {\n localeCodes,\n })\n\n // Flatten docs without padding yet. This preserves the exact keys produced by beforeExport hooks,\n // allowing mergeColumns to detect which schema columns were replaced with derived ones.\n transformed = docs.map((doc) =>\n flattenObject({\n data: doc,\n exportFieldHooks,\n fields,\n format: 'csv',\n req,\n }),\n )\n\n transformed = await applyExportBeforeHook(exportHooks?.before, transformed, docs, 'csv', req)\n\n if (schemaColumns && transformed.length > 0) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of transformed) {\n for (const key of Object.keys(row)) {\n if (!seenCols.has(key)) {\n seenCols.add(key)\n dataColumns.push(key)\n }\n }\n }\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n columns =\n Boolean(exportHooks?.before) && transformed.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n }\n\n // Pad rows with null for missing columns (uses merged columns, not raw schema)\n if (!fields || fields.length === 0) {\n const paddingKeys = columns ?? possibleKeys\n for (const row of transformed) {\n for (const key of paddingKeys) {\n if (!(key in row)) {\n row[key] = null\n }\n }\n }\n }\n } else {\n transformed = docs.map((doc) => {\n // Apply field-level export hooks for JSON format\n let output: Record<string, unknown> = applyFieldHooks({\n type: 'beforeExport',\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: targetCollection.config.flattenedFields,\n format: 'json',\n operation: 'export',\n req,\n })\n\n // Remove disabled fields\n output = removeDisabledFields(output, disabledFields)\n\n // Then trim to selected fields only (if fields are provided)\n if (Array.isArray(fields) && fields.length > 0) {\n const trimmed: Record<string, unknown> = {}\n\n for (const key of fields) {\n const value = getObjectDotNotation(output, key)\n setNestedValue(trimmed, key, value ?? null)\n }\n\n output = trimmed\n }\n\n return output\n })\n\n transformed = await applyExportBeforeHook(exportHooks?.before, transformed, docs, 'json', req)\n }\n\n const hasNextPage = previewPage < previewTotalPages\n const hasPrevPage = previewPage > 1\n\n const response: ExportPreviewResponse = {\n columns,\n docs: transformed,\n exportTotalDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n\n return Response.json(response)\n}\n"],"names":["addDataAndFileToRequest","getObjectDotNotation","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","applyFieldHooks","flattenObject","getExportFieldFunctions","getFlattenedFieldKeys","getSchemaColumns","mergeColumns","getSelect","removeDisabledFields","resolveLimit","setNestedValue","applyExportBeforeHook","hook","data","originalDocs","format","req","length","batchNumber","originalData","totalBatches","handlePreview","collectionSlug","draft","draftFromReq","fields","limit","exportLimit","locale","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","sort","where","whereFromReq","Math","max","min","targetCollection","payload","collections","Response","json","error","status","pluginConfig","config","custom","maxLimit","select","Array","isArray","undefined","collectionHasVersions","Boolean","versions","publishedWhere","_status","equals","and","countResult","count","collection","overrideAccess","totalMatchingDocs","totalDocs","effectiveLimit","exportTotalDocs","previewStartIndex","previewTotalPages","ceil","isCSV","localeCodes","localization","disabledFields","admin","schemaColumns","collectionConfig","columns","response","docs","hasNextPage","hasPrevPage","page","totalPages","result","find","depth","remainingInExport","slice","transformed","exportFieldHooks","flattenedFields","exportHooks","possibleKeys","map","doc","before","dataColumns","seenCols","Set","row","key","Object","keys","has","add","push","mergedColumns","filter","col","includes","paddingKeys","output","type","fieldHooks","operation","trimmed","value"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/handlePreview.ts"],"sourcesContent":["import type { PayloadRequest, Sort, Where } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\nimport { getObjectDotNotation } from 'payload/shared'\n\nimport type { ExportBeforeHook, ExportDoc, ExportPreviewResponse } from '../types.js'\n\nimport {\n DEFAULT_PREVIEW_LIMIT,\n MAX_PREVIEW_LIMIT,\n MIN_PREVIEW_LIMIT,\n MIN_PREVIEW_PAGE,\n} from '../constants.js'\nimport { applyFieldHooks } from '../utilities/applyFieldHooks.js'\nimport { flattenObject } from '../utilities/flattenObject.js'\nimport { getExportFieldFunctions } from '../utilities/getExportFieldFunctions.js'\nimport { getFlattenedFieldKeys } from '../utilities/getFlattenedFieldKeys.js'\nimport { getSchemaColumns, mergeColumns } from '../utilities/getSchemaColumns.js'\nimport { getSelect } from '../utilities/getSelect.js'\nimport { getSubmittedFormValues } from '../utilities/getSubmittedFormValues.js'\nimport { removeDisabledFields } from '../utilities/removeDisabledFields.js'\nimport { resolveLimit } from '../utilities/resolveLimit.js'\nimport { setNestedValue } from '../utilities/setNestedValue.js'\n\nconst applyExportBeforeHook = async ({\n data,\n exportDoc,\n format,\n hook,\n originalDocs,\n req,\n}: {\n data: Record<string, unknown>[]\n exportDoc: ExportDoc\n format: 'csv' | 'json' | ({} & string)\n hook: ExportBeforeHook | undefined\n originalDocs: unknown[]\n req: PayloadRequest\n}): Promise<Record<string, unknown>[]> => {\n if (!hook || data.length === 0) {\n return data\n }\n return hook({\n batchNumber: 1,\n data,\n exportDoc,\n format,\n originalData: originalDocs as Record<string, unknown>[],\n req,\n totalBatches: 1,\n })\n}\n\nexport const handlePreview = async (req: PayloadRequest): Promise<Response> => {\n await addDataAndFileToRequest(req)\n\n const {\n collectionSlug,\n draft: draftFromReq,\n fields,\n formData,\n limit: exportLimit,\n locale,\n previewLimit: rawPreviewLimit = DEFAULT_PREVIEW_LIMIT,\n previewPage: rawPreviewPage = 1,\n sort,\n where: whereFromReq = {},\n } = req.data as {\n collectionSlug: string\n draft?: 'no' | 'yes'\n fields?: string[]\n format?: 'csv' | 'json'\n formData?: Record<string, unknown>\n limit?: number\n locale?: string\n previewLimit?: number\n previewPage?: number\n sort?: Sort\n where?: Where\n }\n\n // Validate and clamp pagination values to safe bounds\n const previewLimit = Math.max(MIN_PREVIEW_LIMIT, Math.min(rawPreviewLimit, MAX_PREVIEW_LIMIT))\n const previewPage = Math.max(MIN_PREVIEW_PAGE, rawPreviewPage)\n\n const exportDoc = getSubmittedFormValues({\n formData: formData ?? {},\n }) as ExportDoc\n\n const targetCollection = req.payload.collections[collectionSlug]\n if (!targetCollection) {\n return Response.json(\n { error: `Collection with slug ${collectionSlug} not found` },\n { status: 400 },\n )\n }\n\n const pluginConfig = targetCollection.config.custom?.['plugin-import-export']\n const maxLimit = await resolveLimit({\n limit: pluginConfig?.exportLimit,\n req,\n })\n\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n const draft = draftFromReq === 'yes'\n const collectionHasVersions = Boolean(targetCollection.config.versions)\n\n // Only filter by _status for versioned collections\n const publishedWhere: Where = collectionHasVersions ? { _status: { equals: 'published' } } : {}\n\n const where: Where = {\n and: [whereFromReq, draft ? {} : publishedWhere],\n }\n\n // Count total docs matching export criteria\n const countResult = await req.payload.count({\n collection: collectionSlug,\n overrideAccess: false,\n req,\n where,\n })\n\n const totalMatchingDocs = countResult.totalDocs\n\n // Calculate actual export count (respecting both export limit and max limit)\n let effectiveLimit = totalMatchingDocs\n\n // Apply user's export limit if provided\n if (exportLimit && exportLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, exportLimit)\n }\n\n // Apply max limit if configured\n if (typeof maxLimit === 'number' && maxLimit > 0) {\n effectiveLimit = Math.min(effectiveLimit, maxLimit)\n }\n\n const exportTotalDocs = effectiveLimit\n\n // Calculate preview pagination that respects export limit\n // Preview should only show docs that will actually be exported\n const previewStartIndex = (previewPage - 1) * previewLimit\n\n // Calculate pagination info based on export limit (not raw DB results)\n const previewTotalPages = exportTotalDocs === 0 ? 0 : Math.ceil(exportTotalDocs / previewLimit)\n\n const isCSV = req?.data?.format === 'csv'\n\n // Get locale codes for locale expansion when locale='all'\n const localeCodes =\n locale === 'all' && req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n // Get disabled fields configuration\n const disabledFields =\n targetCollection.config.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n // Compute schema-based columns for CSV (provides base ordering and handles empty exports)\n const schemaColumns = isCSV\n ? getSchemaColumns({\n collectionConfig: targetCollection.config,\n disabledFields,\n fields,\n locale: locale ?? undefined,\n localeCodes,\n })\n : undefined\n\n // columns will be finalized after data is available (merged with data-discovered columns)\n let columns = schemaColumns\n\n // If we're beyond the effective limit (considering both user limit and maxLimit), return empty docs\n if (exportTotalDocs > 0 && previewStartIndex >= exportTotalDocs) {\n const response: ExportPreviewResponse = {\n columns,\n docs: [],\n exportTotalDocs,\n hasNextPage: false,\n hasPrevPage: previewPage > 1,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n return Response.json(response)\n }\n\n // Fetch preview page with full previewLimit to maintain consistent pagination offsets\n // We'll trim the results afterwards if needed to respect export limit\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n draft,\n limit: previewLimit,\n locale,\n overrideAccess: false,\n page: previewPage,\n req,\n select,\n sort,\n where,\n })\n\n // Trim docs to respect effective limit boundary (user limit clamped by maxLimit)\n let docs = result.docs\n if (exportTotalDocs > 0) {\n const remainingInExport = exportTotalDocs - previewStartIndex\n if (remainingInExport < docs.length) {\n docs = docs.slice(0, remainingInExport)\n }\n }\n\n // Transform docs based on format\n let transformed: Record<string, unknown>[]\n\n const exportFieldHooks = getExportFieldFunctions({\n fields: targetCollection.config.flattenedFields,\n })\n\n const exportHooks = targetCollection.config.custom?.['plugin-import-export']?.exportHooks\n\n if (isCSV) {\n const possibleKeys = getFlattenedFieldKeys(targetCollection.config.flattenedFields, '', {\n localeCodes,\n })\n\n // Flatten docs without padding yet. This preserves the exact keys produced by beforeExport hooks,\n // allowing mergeColumns to detect which schema columns were replaced with derived ones.\n transformed = docs.map((doc) =>\n flattenObject({\n data: doc,\n exportFieldHooks,\n fields,\n format: 'csv',\n req,\n }),\n )\n\n transformed = await applyExportBeforeHook({\n data: transformed,\n exportDoc,\n format: 'csv',\n hook: exportHooks?.before,\n originalDocs: docs,\n req,\n })\n\n if (schemaColumns && transformed.length > 0) {\n const dataColumns: string[] = []\n const seenCols = new Set<string>()\n for (const row of transformed) {\n for (const key of Object.keys(row)) {\n if (!seenCols.has(key)) {\n seenCols.add(key)\n dataColumns.push(key)\n }\n }\n }\n const mergedColumns = mergeColumns(schemaColumns, dataColumns)\n columns =\n Boolean(exportHooks?.before) && transformed.length > 0\n ? mergedColumns.filter((col) => dataColumns.includes(col))\n : mergedColumns\n }\n\n // Pad rows with null for missing columns (uses merged columns, not raw schema)\n if (!fields || fields.length === 0) {\n const paddingKeys = columns ?? possibleKeys\n for (const row of transformed) {\n for (const key of paddingKeys) {\n if (!(key in row)) {\n row[key] = null\n }\n }\n }\n }\n } else {\n transformed = docs.map((doc) => {\n // Apply field-level export hooks for JSON format\n let output: Record<string, unknown> = applyFieldHooks({\n type: 'beforeExport',\n data: doc as Record<string, unknown>,\n fieldHooks: exportFieldHooks,\n fields: targetCollection.config.flattenedFields,\n format: 'json',\n operation: 'export',\n req,\n })\n\n // Remove disabled fields\n output = removeDisabledFields(output, disabledFields)\n\n // Then trim to selected fields only (if fields are provided)\n if (Array.isArray(fields) && fields.length > 0) {\n const trimmed: Record<string, unknown> = {}\n\n for (const key of fields) {\n const value = getObjectDotNotation(output, key)\n setNestedValue(trimmed, key, value ?? null, output)\n }\n\n output = trimmed\n }\n\n return output\n })\n\n transformed = await applyExportBeforeHook({\n data: transformed,\n exportDoc,\n format: 'json',\n hook: exportHooks?.before,\n originalDocs: docs,\n req,\n })\n }\n\n const hasNextPage = previewPage < previewTotalPages\n const hasPrevPage = previewPage > 1\n\n const response: ExportPreviewResponse = {\n columns,\n docs: transformed,\n exportTotalDocs,\n hasNextPage,\n hasPrevPage,\n limit: previewLimit,\n maxLimit,\n page: previewPage,\n totalDocs: exportTotalDocs,\n totalPages: previewTotalPages,\n }\n\n return Response.json(response)\n}\n"],"names":["addDataAndFileToRequest","getObjectDotNotation","DEFAULT_PREVIEW_LIMIT","MAX_PREVIEW_LIMIT","MIN_PREVIEW_LIMIT","MIN_PREVIEW_PAGE","applyFieldHooks","flattenObject","getExportFieldFunctions","getFlattenedFieldKeys","getSchemaColumns","mergeColumns","getSelect","getSubmittedFormValues","removeDisabledFields","resolveLimit","setNestedValue","applyExportBeforeHook","data","exportDoc","format","hook","originalDocs","req","length","batchNumber","originalData","totalBatches","handlePreview","collectionSlug","draft","draftFromReq","fields","formData","limit","exportLimit","locale","previewLimit","rawPreviewLimit","previewPage","rawPreviewPage","sort","where","whereFromReq","Math","max","min","targetCollection","payload","collections","Response","json","error","status","pluginConfig","config","custom","maxLimit","select","Array","isArray","undefined","collectionHasVersions","Boolean","versions","publishedWhere","_status","equals","and","countResult","count","collection","overrideAccess","totalMatchingDocs","totalDocs","effectiveLimit","exportTotalDocs","previewStartIndex","previewTotalPages","ceil","isCSV","localeCodes","localization","disabledFields","admin","schemaColumns","collectionConfig","columns","response","docs","hasNextPage","hasPrevPage","page","totalPages","result","find","depth","remainingInExport","slice","transformed","exportFieldHooks","flattenedFields","exportHooks","possibleKeys","map","doc","before","dataColumns","seenCols","Set","row","key","Object","keys","has","add","push","mergedColumns","filter","col","includes","paddingKeys","output","type","fieldHooks","operation","trimmed","value"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export type { ExportAfterHook, ExportBeforeHook, FieldBeforeExportHook, FieldBeforeImportHook, ImportAfterHook, ImportBeforeHook, ImportExportPluginConfig, ImportResult, Limit, LimitFunction, } from '../types.js';
1
+ export type { ExportAfterHook, ExportBeforeHook, ExportDoc, FieldBeforeExportHook, FieldBeforeImportHook, ImportAfterHook, ImportBeforeHook, ImportDoc, ImportExportPluginConfig, ImportResult, Limit, LimitFunction, } from '../types.js';
2
2
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,aAAa,GACd,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,aAAa,GACd,MAAM,aAAa,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type {\n ExportAfterHook,\n ExportBeforeHook,\n FieldBeforeExportHook,\n FieldBeforeImportHook,\n ImportAfterHook,\n ImportBeforeHook,\n ImportExportPluginConfig,\n ImportResult,\n Limit,\n LimitFunction,\n} from '../types.js'\n"],"names":[],"mappings":"AAAA,WAWoB"}
1
+ {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type {\n ExportAfterHook,\n ExportBeforeHook,\n ExportDoc,\n FieldBeforeExportHook,\n FieldBeforeImportHook,\n ImportAfterHook,\n ImportBeforeHook,\n ImportDoc,\n ImportExportPluginConfig,\n ImportResult,\n Limit,\n LimitFunction,\n} from '../types.js'\n"],"names":[],"mappings":"AAAA,WAaoB"}
@@ -1,5 +1,5 @@
1
1
  import type { PayloadRequest, User } from 'payload';
2
- import type { ImportAfterHook, ImportBeforeHook, ImportResult } from '../types.js';
2
+ import type { ImportAfterHook, ImportBeforeHook, ImportDoc, ImportResult } from '../types.js';
3
3
  import type { ImportMode } from './createImport.js';
4
4
  import { type BatchError } from '../utilities/useBatchProcessor.js';
5
5
  /**
@@ -43,6 +43,7 @@ export interface ImportProcessOptions {
43
43
  after?: ImportAfterHook;
44
44
  before?: ImportBeforeHook;
45
45
  };
46
+ importDoc: ImportDoc;
46
47
  importMode: ImportMode;
47
48
  matchField?: string;
48
49
  /** Raw parsed rows before unflattening — used as originalData in hooks */
@@ -1 +1 @@
1
- {"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/import/batchProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAInD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EACL,KAAK,UAAU,EAIhB,MAAM,mCAAmC,CAAA;AAE1C;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1B,UAAU,EAAE,KAAK,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAChC,CAAC,CAAA;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,kDAAkD;IAClD,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAC1B,CAAA;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACxC,GAAG,EAAE,cAAc,CAAA;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AA4hBD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;oCAMrC,oBAAoB,KAAG,OAAO,CAAC,YAAY,CAAC;EAgH1F"}
1
+ {"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/import/batchProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAInD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EACL,KAAK,UAAU,EAIhB,MAAM,mCAAmC,CAAA;AAE1C;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1B,UAAU,EAAE,KAAK,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAChC,CAAC,CAAA;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,kDAAkD;IAClD,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAC1B,CAAA;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACxC,GAAG,EAAE,cAAc,CAAA;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AA8hBD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;oCAMrC,oBAAoB,KAAG,OAAO,CAAC,YAAY,CAAC;EAmH1F"}
@@ -1,4 +1,4 @@
1
- import { isolateObjectProperty } from 'payload';
1
+ import { getDataLoader, isolateObjectProperty } from 'payload';
2
2
  import { categorizeError, createBatches, extractErrorMessage } from '../utilities/useBatchProcessor.js';
3
3
  /**
4
4
  * Separates multi-locale data from a document for sequential locale updates.
@@ -71,13 +71,18 @@ import { categorizeError, createBatches, extractErrorMessage } from '../utilitie
71
71
  failed: [],
72
72
  successful: []
73
73
  };
74
- // Create a request proxy that isolates the transactionID property, then clear it.
75
- // This is critical because if a nested operation fails (e.g., Forbidden due to access control),
76
- // Payload's error handling calls killTransaction(req), which would kill the parent's transaction
77
- // if we shared the same transaction. By isolating and clearing transactionID, each nested
78
- // operation either uses no transaction or starts its own, independent of the parent.
79
- const req = isolateObjectProperty(reqFromArgs, 'transactionID');
74
+ // Isolate + clear `transactionID` so a failing nested op (e.g. Forbidden) kills its own
75
+ // transaction, not the parent's, on `killTransaction`.
76
+ // Also isolate `payloadDataLoader`: the shared loader mutates the parent's `req.transactionID`
77
+ // while batching relationship population (`batchAndLoadDocs`), so populating a nested doc's
78
+ // relationship (e.g. authorship `createdBy`/`updatedBy`) would leak the nested transaction onto
79
+ // the parent. A fresh loader keeps each request's transaction isolated.
80
+ const req = isolateObjectProperty(reqFromArgs, [
81
+ 'payloadDataLoader',
82
+ 'transactionID'
83
+ ]);
80
84
  req.transactionID = undefined;
85
+ req.payloadDataLoader = getDataLoader(req);
81
86
  const collectionEntry = req.payload.collections[collectionSlug];
82
87
  const collectionConfig = collectionEntry?.config;
83
88
  const collectionHasVersions = Boolean(collectionConfig?.versions);
@@ -486,7 +491,7 @@ export function createImportBatchProcessor(options = {}) {
486
491
  defaultVersionStatus: options.defaultVersionStatus ?? 'published'
487
492
  };
488
493
  const processImport = async (processOptions)=>{
489
- const { collectionSlug, docs: documents, format = 'csv', hooks, importMode, matchField, originalDocs: originalDocs, req, totalBatches: totalBatchesFromOptions, user } = processOptions;
494
+ const { collectionSlug, docs: documents, format = 'csv', hooks, importDoc, importMode, matchField, originalDocs: originalDocs, req, totalBatches: totalBatchesFromOptions, user } = processOptions;
490
495
  const batches = createBatches(documents, processorOptions.batchSize);
491
496
  const totalBatches = totalBatchesFromOptions ?? batches.length;
492
497
  const result = {
@@ -507,6 +512,7 @@ export function createImportBatchProcessor(options = {}) {
507
512
  batchNumber,
508
513
  data: currentBatch,
509
514
  format,
515
+ importDoc,
510
516
  originalData: originalBatch,
511
517
  req,
512
518
  totalBatches
@@ -558,6 +564,7 @@ export function createImportBatchProcessor(options = {}) {
558
564
  await hooks.after({
559
565
  batchNumber,
560
566
  format,
567
+ importDoc,
561
568
  originalData: originalBatch,
562
569
  req,
563
570
  result: batchHookResult,