@payloadcms/plugin-import-export 4.0.0-internal.d28e9fb → 4.0.0-internal.fa345ef

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 (126) hide show
  1. package/dist/components/ExportPreview/index.css +55 -0
  2. package/dist/components/ExportPreview/index.d.ts +1 -1
  3. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  4. package/dist/components/ExportPreview/index.js +1 -1
  5. package/dist/components/ExportPreview/index.js.map +1 -1
  6. package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -1
  7. package/dist/components/FormatField/index.d.ts.map +1 -1
  8. package/dist/components/FormatField/index.js +6 -3
  9. package/dist/components/FormatField/index.js.map +1 -1
  10. package/dist/components/ImportPreview/index.css +48 -0
  11. package/dist/components/ImportPreview/index.d.ts +1 -1
  12. package/dist/components/ImportPreview/index.d.ts.map +1 -1
  13. package/dist/components/ImportPreview/index.js +17 -3
  14. package/dist/components/ImportPreview/index.js.map +1 -1
  15. package/dist/components/Page/index.d.ts +1 -1
  16. package/dist/components/Page/index.d.ts.map +1 -1
  17. package/dist/components/Page/index.js +1 -1
  18. package/dist/components/Page/index.js.map +1 -1
  19. package/dist/components/SortBy/index.css +9 -0
  20. package/dist/components/SortBy/index.d.ts +1 -1
  21. package/dist/components/SortBy/index.d.ts.map +1 -1
  22. package/dist/components/SortBy/index.js +1 -2
  23. package/dist/components/SortBy/index.js.map +1 -1
  24. package/dist/components/SortOrder/index.css +9 -0
  25. package/dist/components/SortOrder/index.d.ts +1 -1
  26. package/dist/components/SortOrder/index.d.ts.map +1 -1
  27. package/dist/components/SortOrder/index.js +1 -2
  28. package/dist/components/SortOrder/index.js.map +1 -1
  29. package/dist/export/batchProcessor.d.ts +2 -2
  30. package/dist/export/batchProcessor.d.ts.map +1 -1
  31. package/dist/export/batchProcessor.js.map +1 -1
  32. package/dist/export/createExport.d.ts +2 -2
  33. package/dist/export/createExport.d.ts.map +1 -1
  34. package/dist/export/createExport.js +1 -1
  35. package/dist/export/createExport.js.map +1 -1
  36. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  37. package/dist/export/getExportCollection.d.ts.map +1 -1
  38. package/dist/export/getExportCollection.js +4 -4
  39. package/dist/export/getExportCollection.js.map +1 -1
  40. package/dist/export/getFields.d.ts.map +1 -1
  41. package/dist/export/handleDownload.d.ts.map +1 -1
  42. package/dist/export/handleDownload.js +2 -2
  43. package/dist/export/handleDownload.js.map +1 -1
  44. package/dist/export/handlePreview.d.ts.map +1 -1
  45. package/dist/export/handlePreview.js +1 -1
  46. package/dist/export/handlePreview.js.map +1 -1
  47. package/dist/exports/types.d.ts +1 -1
  48. package/dist/exports/types.d.ts.map +1 -1
  49. package/dist/exports/types.js.map +1 -1
  50. package/dist/import/batchProcessor.d.ts +2 -2
  51. package/dist/import/batchProcessor.d.ts.map +1 -1
  52. package/dist/import/batchProcessor.js.map +1 -1
  53. package/dist/import/createImport.d.ts.map +1 -1
  54. package/dist/import/createImport.js +1 -1
  55. package/dist/import/createImport.js.map +1 -1
  56. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
  57. package/dist/import/getFields.d.ts.map +1 -1
  58. package/dist/import/getImportCollection.d.ts.map +1 -1
  59. package/dist/import/getImportCollection.js +4 -4
  60. package/dist/import/getImportCollection.js.map +1 -1
  61. package/dist/import/handlePreview.d.ts.map +1 -1
  62. package/dist/index.d.ts +2 -13
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +19 -8
  65. package/dist/index.js.map +1 -1
  66. package/dist/types.d.ts +0 -32
  67. package/dist/types.d.ts.map +1 -1
  68. package/dist/types.js.map +1 -1
  69. package/dist/utilities/applyFieldHooks.d.ts +1 -2
  70. package/dist/utilities/applyFieldHooks.d.ts.map +1 -1
  71. package/dist/utilities/applyFieldHooks.js +2 -3
  72. package/dist/utilities/applyFieldHooks.js.map +1 -1
  73. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
  74. package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -1
  75. package/dist/utilities/fieldToRegex.d.ts.map +1 -1
  76. package/dist/utilities/flattenObject.d.ts.map +1 -1
  77. package/dist/utilities/flattenObject.js +3 -13
  78. package/dist/utilities/flattenObject.js.map +1 -1
  79. package/dist/utilities/flattenedFields.d.ts.map +1 -1
  80. package/dist/utilities/flattenedFields.js +3 -0
  81. package/dist/utilities/flattenedFields.js.map +1 -1
  82. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
  83. package/dist/utilities/getExportFieldFunctions.js +0 -8
  84. package/dist/utilities/getExportFieldFunctions.js.map +1 -1
  85. package/dist/utilities/getFileFromDoc.d.ts.map +1 -1
  86. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
  87. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
  88. package/dist/utilities/getImportFieldFunctions.js +0 -8
  89. package/dist/utilities/getImportFieldFunctions.js.map +1 -1
  90. package/dist/utilities/getPluginCollections.d.ts.map +1 -1
  91. package/dist/utilities/getSchemaColumns.d.ts +1 -1
  92. package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
  93. package/dist/utilities/getSchemaColumns.js +2 -2
  94. package/dist/utilities/getSchemaColumns.js.map +1 -1
  95. package/dist/utilities/getSelect.d.ts.map +1 -1
  96. package/dist/utilities/isPlainObject.d.ts.map +1 -1
  97. package/dist/utilities/parseCSV.d.ts.map +1 -1
  98. package/dist/utilities/parseJSON.d.ts.map +1 -1
  99. package/dist/utilities/polymorphicRel.d.ts.map +1 -1
  100. package/dist/utilities/processRichTextField.d.ts.map +1 -1
  101. package/dist/utilities/processRichTextField.js +7 -0
  102. package/dist/utilities/processRichTextField.js.map +1 -1
  103. package/dist/utilities/processRichTextField.spec.js +308 -0
  104. package/dist/utilities/processRichTextField.spec.js.map +1 -0
  105. package/dist/utilities/removeDisabledFields.d.ts.map +1 -1
  106. package/dist/utilities/setNestedValue.d.ts.map +1 -1
  107. package/dist/utilities/sortHelpers.d.ts.map +1 -1
  108. package/dist/utilities/unflattenObject.d.ts.map +1 -1
  109. package/dist/utilities/unflattenObject.js +29 -18
  110. package/dist/utilities/unflattenObject.js.map +1 -1
  111. package/dist/utilities/unflattenObject.spec.js +106 -0
  112. package/dist/utilities/unflattenObject.spec.js.map +1 -1
  113. package/dist/utilities/unflattenPostProcess.d.ts.map +1 -1
  114. package/dist/utilities/unflattenPostProcess.js +39 -13
  115. package/dist/utilities/unflattenPostProcess.js.map +1 -1
  116. package/dist/utilities/validateLimitValue.d.ts.map +1 -1
  117. package/license.md +1 -1
  118. package/package.json +7 -7
  119. package/dist/components/ExportPreview/index.scss +0 -48
  120. package/dist/components/FieldsToExport/index.scss +0 -0
  121. package/dist/components/ImportPreview/index.scss +0 -41
  122. package/dist/components/SortBy/index.scss +0 -3
  123. package/dist/components/SortOrder/index.scss +0 -3
  124. package/dist/utilities/legacyHookDispatch.spec.js +0 -227
  125. package/dist/utilities/legacyHookDispatch.spec.js.map +0 -1
  126. /package/dist/components/Page/{index.scss → index.css} +0 -0
@@ -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 || user?.user?.id\n body.data.userCollection = user?.collection || user?.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,MAAMF,MAAMA,MAAME;QAC3CtB,KAAKE,IAAI,CAACqB,cAAc,GAAGH,MAAMI,cAAcJ,MAAMA,MAAMI;QAE3D,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 { 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 +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,QAAe,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;AA2C1D,eAAO,MAAM,aAAa,GAAU,KAAK,cAAc,KAAG,OAAO,CAAC,QAAQ,CAuQzE,CAAA"}
@@ -145,7 +145,7 @@ export const handlePreview = async (req)=>{
145
145
  const possibleKeys = getFlattenedFieldKeys(targetCollection.config.flattenedFields, '', {
146
146
  localeCodes
147
147
  });
148
- // Flatten docs without padding yet. This preserves the exact keys produced by toCSV hooks,
148
+ // Flatten docs without padding yet. This preserves the exact keys produced by beforeExport hooks,
149
149
  // allowing mergeColumns to detect which schema columns were replaced with derived ones.
150
150
  transformed = docs.map((doc)=>flattenObject({
151
151
  data: doc,
@@ -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 toCSV 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, 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,2 +1,2 @@
1
- export type { ExportAfterHook, ExportBeforeHook, FieldBeforeExportHook, FieldBeforeImportHook, FromCSVFunction, ImportAfterHook, ImportBeforeHook, ImportExportPluginConfig, ImportResult, Limit, LimitFunction, ToCSVFunction, } from '../types.js';
1
+ export type { ExportAfterHook, ExportBeforeHook, FieldBeforeExportHook, FieldBeforeImportHook, ImportAfterHook, ImportBeforeHook, 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,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,aAAa,EACb,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,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,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 FromCSVFunction,\n ImportAfterHook,\n ImportBeforeHook,\n ImportExportPluginConfig,\n ImportResult,\n Limit,\n LimitFunction,\n ToCSVFunction,\n} from '../types.js'\n"],"names":[],"mappings":"AAAA,WAaoB"}
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,4 +1,4 @@
1
- import type { PayloadRequest, TypedUser } from 'payload';
1
+ import type { PayloadRequest, User } from 'payload';
2
2
  import type { ImportAfterHook, ImportBeforeHook, ImportResult } from '../types.js';
3
3
  import type { ImportMode } from './createImport.js';
4
4
  import { type BatchError } from '../utilities/useBatchProcessor.js';
@@ -50,7 +50,7 @@ export interface ImportProcessOptions {
50
50
  req: PayloadRequest;
51
51
  /** Total number of batches (pre-computed for hook args) */
52
52
  totalBatches?: number;
53
- user?: TypedUser;
53
+ user?: User;
54
54
  }
55
55
  export declare function createImportBatchProcessor(options?: ImportBatchProcessorOptions): {
56
56
  processImport: (processOptions: ImportProcessOptions) => Promise<ImportResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"batchProcessor.d.ts","sourceRoot":"","sources":["../../src/import/batchProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxD,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,SAAS,CAAA;CACjB;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,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 +1 @@
1
- {"version":3,"sources":["../../src/import/batchProcessor.ts"],"sourcesContent":["import type { PayloadRequest, TypedUser } from 'payload'\n\nimport { isolateObjectProperty } from 'payload'\n\nimport type { ImportAfterHook, ImportBeforeHook, ImportResult } from '../types.js'\nimport type { ImportMode } from './createImport.js'\n\nimport {\n type BatchError,\n categorizeError,\n createBatches,\n extractErrorMessage,\n} from '../utilities/useBatchProcessor.js'\n\n/**\n * Import-specific batch processor options\n */\nexport interface ImportBatchProcessorOptions {\n batchSize?: number\n defaultVersionStatus?: 'draft' | 'published'\n}\n\n/**\n * Import-specific error type extending the generic BatchError\n */\nexport interface ImportError extends BatchError<Record<string, unknown>> {\n documentData: Record<string, unknown>\n field?: string\n fieldLabel?: string\n rowNumber: number // 1-indexed for user clarity\n}\n\n/**\n * Result from processing a single import batch\n */\nexport interface ImportBatchResult {\n failed: Array<ImportError>\n successful: Array<{\n document: Record<string, unknown>\n index: number\n operation?: 'created' | 'updated'\n result: Record<string, unknown>\n }>\n}\n\n/**\n * Options for processing an import operation\n */\nexport interface ImportProcessOptions {\n collectionSlug: string\n docs: Record<string, unknown>[]\n /** Export format — passed through to hook args */\n format?: 'csv' | 'json'\n /** Lifecycle hooks for this import operation */\n hooks?: {\n after?: ImportAfterHook\n before?: ImportBeforeHook\n }\n importMode: ImportMode\n matchField?: string\n /** Raw parsed rows before unflattening — used as originalData in hooks */\n originalDocs?: Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches (pre-computed for hook args) */\n totalBatches?: number\n user?: TypedUser\n}\n\n/**\n * Separates multi-locale data from a document for sequential locale updates.\n *\n * When a field has locale-keyed values (e.g., { title: { en: 'Hello', es: 'Hola' } }),\n * this extracts the default locale's data for initial create/update, and stores\n * remaining locales for subsequent update calls.\n *\n * @returns\n * - flatData: Document with default locale values extracted (for initial operation)\n * - hasMultiLocale: Whether any multi-locale fields were found\n * - localeUpdates: Map of locale -> field data for follow-up updates\n */\nfunction extractMultiLocaleData(\n data: Record<string, unknown>,\n configuredLocales?: string[],\n defaultLocale?: string,\n): {\n flatData: Record<string, unknown>\n hasMultiLocale: boolean\n localeUpdates: Record<string, Record<string, unknown>>\n} {\n const flatData: Record<string, unknown> = {}\n const localeUpdates: Record<string, Record<string, unknown>> = {}\n let hasMultiLocale = false\n\n if (!configuredLocales || configuredLocales.length === 0) {\n return { flatData: { ...data }, hasMultiLocale: false, localeUpdates: {} }\n }\n\n const localeSet = new Set(configuredLocales)\n\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueObj = value as Record<string, unknown>\n const localeKeys = Object.keys(valueObj).filter((k) => localeSet.has(k))\n\n if (localeKeys.length > 0) {\n hasMultiLocale = true\n const baseLocale =\n defaultLocale && localeKeys.includes(defaultLocale) ? defaultLocale : localeKeys[0]\n if (baseLocale) {\n flatData[key] = valueObj[baseLocale]\n for (const locale of localeKeys) {\n if (locale !== baseLocale) {\n if (!localeUpdates[locale]) {\n localeUpdates[locale] = {}\n }\n localeUpdates[locale][key] = valueObj[locale]\n }\n }\n }\n } else {\n flatData[key] = value\n }\n } else {\n flatData[key] = value\n }\n }\n\n return { flatData, hasMultiLocale, localeUpdates }\n}\n\ntype ProcessImportBatchOptions = {\n batch: Record<string, unknown>[]\n batchIndex: number\n collectionSlug: string\n importMode: ImportMode\n matchField: string | undefined\n options: { batchSize: number; defaultVersionStatus: 'draft' | 'published' }\n req: PayloadRequest\n user?: TypedUser\n}\n\n/**\n * Processes a batch of documents for import based on the import mode.\n *\n * For each document in the batch:\n * - create: Creates a new document (removes any existing ID)\n * - update: Finds existing document by matchField and updates it\n * - upsert: Updates if found, creates if not found\n *\n * Handles versioned collections, multi-locale data, and MongoDB ObjectID validation.\n * Continues processing remaining documents even if individual imports fail.\n */\nasync function processImportBatch({\n batch,\n batchIndex,\n collectionSlug,\n importMode,\n matchField,\n options,\n req: reqFromArgs,\n user,\n}: ProcessImportBatchOptions): Promise<ImportBatchResult> {\n const result: ImportBatchResult = {\n failed: [],\n successful: [],\n }\n // Create a request proxy that isolates the transactionID property, then clear it.\n // This is critical because if a nested operation fails (e.g., Forbidden due to access control),\n // Payload's error handling calls killTransaction(req), which would kill the parent's transaction\n // if we shared the same transaction. By isolating and clearing transactionID, each nested\n // operation either uses no transaction or starts its own, independent of the parent.\n const req = isolateObjectProperty(reqFromArgs, 'transactionID')\n req.transactionID = undefined\n\n const collectionEntry = req.payload.collections[collectionSlug]\n\n const collectionConfig = collectionEntry?.config\n const collectionHasVersions = Boolean(collectionConfig?.versions)\n const hasCustomIdField = Boolean(collectionEntry?.customIDType)\n\n const configuredLocales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n const defaultLocale = req.payload.config.localization\n ? req.payload.config.localization.defaultLocale\n : undefined\n\n const startingRowNumber = batchIndex * options.batchSize\n\n for (let i = 0; i < batch.length; i++) {\n const document = batch[i]\n if (!document) {\n continue\n }\n const rowNumber = startingRowNumber + i + 1\n\n try {\n let savedDocument: Record<string, unknown> | undefined\n let existingDocResult: { docs: Array<Record<string, unknown>> } | undefined\n\n if (importMode === 'create') {\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n _status: createData._status,\n isPublished,\n msg: 'Status handling in create',\n willSetDraft: draftOption,\n })\n }\n }\n\n if (req.payload.config.debug && 'title' in createData) {\n req.payload.logger.info({\n msg: 'Creating document',\n title: createData.title,\n titleIsNull: createData.title === null,\n titleType: typeof createData.title,\n })\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else if (importMode === 'update' || importMode === 'upsert') {\n const matchValue = document[matchField || 'id']\n if (!matchValue) {\n throw new Error(`Match field \"${matchField || 'id'}\" not found in document`)\n }\n\n // Special handling for ID field with MongoDB\n // If matching by 'id' and it's not a valid ObjectID format, handle specially\n const isMatchingById = (matchField || 'id') === 'id'\n\n // Check if it's a valid MongoDB ObjectID format (24 hex chars)\n // Note: matchValue could be string, number, or ObjectID object\n let matchValueStr: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueStr = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueStr = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueStr = matchValue.toString()\n } else {\n // For other types, use JSON.stringify\n matchValueStr = JSON.stringify(matchValue)\n }\n const isValidObjectIdFormat = /^[0-9a-f]{24}$/i.test(matchValueStr)\n\n try {\n existingDocResult = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n user,\n where: {\n [matchField || 'id']: {\n equals: matchValue,\n },\n },\n })\n } catch (error) {\n // MongoDB may throw for invalid ObjectID format - handle gracefully for upsert\n if (isMatchingById && importMode === 'upsert' && !isValidObjectIdFormat) {\n existingDocResult = { docs: [] }\n } else if (isMatchingById && importMode === 'update' && !isValidObjectIdFormat) {\n throw new Error(`Invalid ID format for update: ${matchValueStr}`)\n } else {\n throw error\n }\n }\n\n if (existingDocResult.docs.length > 0) {\n const existingDoc = existingDocResult.docs[0]\n if (!existingDoc) {\n throw new Error(`Document not found`)\n }\n\n // Debug: log what we found\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingStatus: existingDoc._status,\n existingTitle: existingDoc.title,\n incomingDocument: document,\n mode: importMode,\n msg: 'Found existing document for update',\n })\n }\n\n const updateData = { ...document }\n // Remove ID and internal fields from update data\n delete updateData.id\n delete updateData._id\n delete updateData.createdAt\n delete updateData.updatedAt\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n updateData,\n configuredLocales,\n defaultLocale,\n )\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n hasMultiLocale,\n mode: importMode,\n msg: 'Updating document in upsert/update mode',\n updateData: Object.keys(hasMultiLocale ? flatData : updateData).reduce(\n (acc, key) => {\n const val = (hasMultiLocale ? flatData : updateData)[key]\n acc[key] =\n typeof val === 'string' && val.length > 50 ? val.substring(0, 50) + '...' : val\n return acc\n },\n {} as Record<string, unknown>,\n ),\n })\n }\n\n if (hasMultiLocale) {\n // Update with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: flatData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: localeData,\n depth: 0,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(existingDoc.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, update normally\n try {\n // Extra debug: log before update\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingTitle: existingDoc.title,\n msg: 'About to update document',\n newData: updateData,\n })\n }\n\n // Update the document - don't specify draft to let Payload handle versions properly\n // This will create a new draft version for collections with versions enabled\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: updateData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req,\n user,\n })\n\n if (req.payload.config.debug && savedDocument) {\n req.payload.logger.info({\n id: savedDocument.id,\n msg: 'Update completed',\n status: savedDocument._status,\n title: savedDocument.title,\n })\n }\n } catch (updateError) {\n req.payload.logger.error({\n id: existingDoc.id,\n err: updateError,\n msg: 'Update failed',\n })\n throw updateError\n }\n }\n } else if (importMode === 'upsert') {\n // Create new in upsert mode\n if (req.payload.config.debug) {\n req.payload.logger.info({\n document,\n matchField: matchField || 'id',\n matchValue: document[matchField || 'id'],\n msg: 'No existing document found, creating new in upsert mode',\n })\n }\n\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n // Only handle _status for versioned collections\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n // Use defaultVersionStatus from config if _status not provided\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else {\n // Update mode but document not found\n let matchValueDisplay: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueDisplay = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueDisplay = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueDisplay = matchValue.toString()\n } else {\n // For other types, use JSON.stringify to avoid [object Object]\n matchValueDisplay = JSON.stringify(matchValue)\n }\n throw new Error(`Document with ${matchField || 'id'}=\"${matchValueDisplay}\" not found`)\n }\n } else {\n throw new Error(`Unknown import mode: ${String(importMode)}`)\n }\n\n if (savedDocument) {\n // Determine operation type for proper counting\n let operation: 'created' | 'updated' | undefined\n if (importMode === 'create') {\n operation = 'created'\n } else if (importMode === 'update') {\n operation = 'updated'\n } else if (importMode === 'upsert') {\n if (existingDocResult && existingDocResult.docs.length > 0) {\n operation = 'updated'\n } else {\n operation = 'created'\n }\n }\n\n result.successful.push({\n document,\n index: rowNumber - 1, // Store as 0-indexed\n operation,\n result: savedDocument,\n })\n }\n } catch (error) {\n const importError: ImportError = {\n type: categorizeError(error),\n documentData: document || {},\n error: extractErrorMessage(error),\n item: document || {},\n itemIndex: rowNumber - 1,\n rowNumber,\n }\n\n // Try to extract field information from validation errors\n if (error && typeof error === 'object' && 'data' in error) {\n const errorData = error as { data?: { errors?: Array<{ path?: string }> } }\n if (errorData.data?.errors && Array.isArray(errorData.data.errors)) {\n const firstError = errorData.data.errors[0]\n if (firstError?.path) {\n importError.field = firstError.path\n }\n }\n }\n\n result.failed.push(importError)\n // Always continue processing all rows\n }\n }\n\n return result\n}\n\nexport function createImportBatchProcessor(options: ImportBatchProcessorOptions = {}) {\n const processorOptions = {\n batchSize: options.batchSize ?? 100,\n defaultVersionStatus: options.defaultVersionStatus ?? 'published',\n }\n\n const processImport = async (processOptions: ImportProcessOptions): Promise<ImportResult> => {\n const {\n collectionSlug,\n docs: documents,\n format = 'csv',\n hooks,\n importMode,\n matchField,\n originalDocs: originalDocs,\n req,\n totalBatches: totalBatchesFromOptions,\n user,\n } = processOptions\n const batches = createBatches(documents, processorOptions.batchSize)\n const totalBatches = totalBatchesFromOptions ?? batches.length\n\n const result: ImportResult = {\n errors: [],\n imported: 0,\n total: documents.length,\n updated: 0,\n }\n\n for (let i = 0; i < batches.length; i++) {\n const currentBatch = batches[i]\n if (!currentBatch) {\n continue\n }\n\n const batchNumber = i + 1\n const batchStart = i * processorOptions.batchSize\n const originalBatch = originalDocs\n ? originalDocs.slice(batchStart, batchStart + currentBatch.length)\n : currentBatch\n\n const batchToProcess: Record<string, unknown>[] =\n hooks?.before && currentBatch.length > 0\n ? ((await hooks.before({\n batchNumber,\n data: currentBatch as Parameters<ImportBeforeHook>[0]['data'],\n format,\n originalData: originalBatch,\n req,\n totalBatches,\n })) as Record<string, unknown>[])\n : currentBatch\n\n const batchResult = await processImportBatch({\n batch: batchToProcess,\n batchIndex: i,\n collectionSlug,\n importMode,\n matchField,\n options: processorOptions,\n req,\n user,\n })\n\n let batchImported = 0\n let batchUpdated = 0\n for (const success of batchResult.successful) {\n if (success.operation === 'created') {\n result.imported++\n batchImported++\n } else if (success.operation === 'updated') {\n result.updated++\n batchUpdated++\n } else {\n // Fallback\n if (importMode === 'create') {\n result.imported++\n batchImported++\n } else {\n result.updated++\n batchUpdated++\n }\n }\n }\n\n for (const error of batchResult.failed) {\n result.errors.push({\n doc: error.documentData,\n error: error.error,\n index: error.rowNumber - 1, // Convert back to 0-indexed\n })\n }\n\n if (hooks?.after) {\n const batchHookResult: ImportResult = {\n errors:\n batchResult.failed.length > 0 ? result.errors.slice(-batchResult.failed.length) : [],\n imported: batchImported,\n total: batchToProcess.length,\n updated: batchUpdated,\n }\n await hooks.after({\n batchNumber,\n format,\n originalData: originalBatch,\n req,\n result: batchHookResult,\n totalBatches,\n })\n }\n }\n\n return result\n }\n\n return {\n processImport,\n }\n}\n"],"names":["isolateObjectProperty","categorizeError","createBatches","extractErrorMessage","extractMultiLocaleData","data","configuredLocales","defaultLocale","flatData","localeUpdates","hasMultiLocale","length","localeSet","Set","key","value","Object","entries","Array","isArray","valueObj","localeKeys","keys","filter","k","has","baseLocale","includes","locale","processImportBatch","batch","batchIndex","collectionSlug","importMode","matchField","options","req","reqFromArgs","user","result","failed","successful","transactionID","undefined","collectionEntry","payload","collections","collectionConfig","config","collectionHasVersions","Boolean","versions","hasCustomIdField","customIDType","localization","localeCodes","startingRowNumber","batchSize","i","document","rowNumber","savedDocument","existingDocResult","createData","id","draftOption","statusValue","_status","defaultVersionStatus","isPublished","debug","logger","info","msg","willSetDraft","title","titleIsNull","titleType","defaultLocaleReq","create","collection","draft","overrideAccess","localeData","update","error","err","String","matchValue","Error","isMatchingById","matchValueStr","JSON","stringify","toString","isValidObjectIdFormat","test","find","depth","limit","where","equals","docs","existingDoc","existingId","existingStatus","existingTitle","incomingDocument","mode","updateData","_id","createdAt","updatedAt","reduce","acc","val","substring","newData","status","updateError","matchValueDisplay","operation","push","index","importError","type","documentData","item","itemIndex","errorData","errors","firstError","path","field","createImportBatchProcessor","processorOptions","processImport","processOptions","documents","format","hooks","originalDocs","totalBatches","totalBatchesFromOptions","batches","imported","total","updated","currentBatch","batchNumber","batchStart","originalBatch","slice","batchToProcess","before","originalData","batchResult","batchImported","batchUpdated","success","doc","after","batchHookResult"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/import/batchProcessor.ts"],"sourcesContent":["import type { PayloadRequest, User } from 'payload'\n\nimport { isolateObjectProperty } from 'payload'\n\nimport type { ImportAfterHook, ImportBeforeHook, ImportResult } from '../types.js'\nimport type { ImportMode } from './createImport.js'\n\nimport {\n type BatchError,\n categorizeError,\n createBatches,\n extractErrorMessage,\n} from '../utilities/useBatchProcessor.js'\n\n/**\n * Import-specific batch processor options\n */\nexport interface ImportBatchProcessorOptions {\n batchSize?: number\n defaultVersionStatus?: 'draft' | 'published'\n}\n\n/**\n * Import-specific error type extending the generic BatchError\n */\nexport interface ImportError extends BatchError<Record<string, unknown>> {\n documentData: Record<string, unknown>\n field?: string\n fieldLabel?: string\n rowNumber: number // 1-indexed for user clarity\n}\n\n/**\n * Result from processing a single import batch\n */\nexport interface ImportBatchResult {\n failed: Array<ImportError>\n successful: Array<{\n document: Record<string, unknown>\n index: number\n operation?: 'created' | 'updated'\n result: Record<string, unknown>\n }>\n}\n\n/**\n * Options for processing an import operation\n */\nexport interface ImportProcessOptions {\n collectionSlug: string\n docs: Record<string, unknown>[]\n /** Export format — passed through to hook args */\n format?: 'csv' | 'json'\n /** Lifecycle hooks for this import operation */\n hooks?: {\n after?: ImportAfterHook\n before?: ImportBeforeHook\n }\n importMode: ImportMode\n matchField?: string\n /** Raw parsed rows before unflattening — used as originalData in hooks */\n originalDocs?: Record<string, unknown>[]\n req: PayloadRequest\n /** Total number of batches (pre-computed for hook args) */\n totalBatches?: number\n user?: User\n}\n\n/**\n * Separates multi-locale data from a document for sequential locale updates.\n *\n * When a field has locale-keyed values (e.g., { title: { en: 'Hello', es: 'Hola' } }),\n * this extracts the default locale's data for initial create/update, and stores\n * remaining locales for subsequent update calls.\n *\n * @returns\n * - flatData: Document with default locale values extracted (for initial operation)\n * - hasMultiLocale: Whether any multi-locale fields were found\n * - localeUpdates: Map of locale -> field data for follow-up updates\n */\nfunction extractMultiLocaleData(\n data: Record<string, unknown>,\n configuredLocales?: string[],\n defaultLocale?: string,\n): {\n flatData: Record<string, unknown>\n hasMultiLocale: boolean\n localeUpdates: Record<string, Record<string, unknown>>\n} {\n const flatData: Record<string, unknown> = {}\n const localeUpdates: Record<string, Record<string, unknown>> = {}\n let hasMultiLocale = false\n\n if (!configuredLocales || configuredLocales.length === 0) {\n return { flatData: { ...data }, hasMultiLocale: false, localeUpdates: {} }\n }\n\n const localeSet = new Set(configuredLocales)\n\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueObj = value as Record<string, unknown>\n const localeKeys = Object.keys(valueObj).filter((k) => localeSet.has(k))\n\n if (localeKeys.length > 0) {\n hasMultiLocale = true\n const baseLocale =\n defaultLocale && localeKeys.includes(defaultLocale) ? defaultLocale : localeKeys[0]\n if (baseLocale) {\n flatData[key] = valueObj[baseLocale]\n for (const locale of localeKeys) {\n if (locale !== baseLocale) {\n if (!localeUpdates[locale]) {\n localeUpdates[locale] = {}\n }\n localeUpdates[locale][key] = valueObj[locale]\n }\n }\n }\n } else {\n flatData[key] = value\n }\n } else {\n flatData[key] = value\n }\n }\n\n return { flatData, hasMultiLocale, localeUpdates }\n}\n\ntype ProcessImportBatchOptions = {\n batch: Record<string, unknown>[]\n batchIndex: number\n collectionSlug: string\n importMode: ImportMode\n matchField: string | undefined\n options: { batchSize: number; defaultVersionStatus: 'draft' | 'published' }\n req: PayloadRequest\n user?: User\n}\n\n/**\n * Processes a batch of documents for import based on the import mode.\n *\n * For each document in the batch:\n * - create: Creates a new document (removes any existing ID)\n * - update: Finds existing document by matchField and updates it\n * - upsert: Updates if found, creates if not found\n *\n * Handles versioned collections, multi-locale data, and MongoDB ObjectID validation.\n * Continues processing remaining documents even if individual imports fail.\n */\nasync function processImportBatch({\n batch,\n batchIndex,\n collectionSlug,\n importMode,\n matchField,\n options,\n req: reqFromArgs,\n user,\n}: ProcessImportBatchOptions): Promise<ImportBatchResult> {\n const result: ImportBatchResult = {\n failed: [],\n successful: [],\n }\n // Create a request proxy that isolates the transactionID property, then clear it.\n // This is critical because if a nested operation fails (e.g., Forbidden due to access control),\n // Payload's error handling calls killTransaction(req), which would kill the parent's transaction\n // if we shared the same transaction. By isolating and clearing transactionID, each nested\n // operation either uses no transaction or starts its own, independent of the parent.\n const req = isolateObjectProperty(reqFromArgs, 'transactionID')\n req.transactionID = undefined\n\n const collectionEntry = req.payload.collections[collectionSlug]\n\n const collectionConfig = collectionEntry?.config\n const collectionHasVersions = Boolean(collectionConfig?.versions)\n const hasCustomIdField = Boolean(collectionEntry?.customIDType)\n\n const configuredLocales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n const defaultLocale = req.payload.config.localization\n ? req.payload.config.localization.defaultLocale\n : undefined\n\n const startingRowNumber = batchIndex * options.batchSize\n\n for (let i = 0; i < batch.length; i++) {\n const document = batch[i]\n if (!document) {\n continue\n }\n const rowNumber = startingRowNumber + i + 1\n\n try {\n let savedDocument: Record<string, unknown> | undefined\n let existingDocResult: { docs: Array<Record<string, unknown>> } | undefined\n\n if (importMode === 'create') {\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n _status: createData._status,\n isPublished,\n msg: 'Status handling in create',\n willSetDraft: draftOption,\n })\n }\n }\n\n if (req.payload.config.debug && 'title' in createData) {\n req.payload.logger.info({\n msg: 'Creating document',\n title: createData.title,\n titleIsNull: createData.title === null,\n titleType: typeof createData.title,\n })\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else if (importMode === 'update' || importMode === 'upsert') {\n const matchValue = document[matchField || 'id']\n if (!matchValue) {\n throw new Error(`Match field \"${matchField || 'id'}\" not found in document`)\n }\n\n // Special handling for ID field with MongoDB\n // If matching by 'id' and it's not a valid ObjectID format, handle specially\n const isMatchingById = (matchField || 'id') === 'id'\n\n // Check if it's a valid MongoDB ObjectID format (24 hex chars)\n // Note: matchValue could be string, number, or ObjectID object\n let matchValueStr: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueStr = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueStr = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueStr = matchValue.toString()\n } else {\n // For other types, use JSON.stringify\n matchValueStr = JSON.stringify(matchValue)\n }\n const isValidObjectIdFormat = /^[0-9a-f]{24}$/i.test(matchValueStr)\n\n try {\n existingDocResult = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n user,\n where: {\n [matchField || 'id']: {\n equals: matchValue,\n },\n },\n })\n } catch (error) {\n // MongoDB may throw for invalid ObjectID format - handle gracefully for upsert\n if (isMatchingById && importMode === 'upsert' && !isValidObjectIdFormat) {\n existingDocResult = { docs: [] }\n } else if (isMatchingById && importMode === 'update' && !isValidObjectIdFormat) {\n throw new Error(`Invalid ID format for update: ${matchValueStr}`)\n } else {\n throw error\n }\n }\n\n if (existingDocResult.docs.length > 0) {\n const existingDoc = existingDocResult.docs[0]\n if (!existingDoc) {\n throw new Error(`Document not found`)\n }\n\n // Debug: log what we found\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingStatus: existingDoc._status,\n existingTitle: existingDoc.title,\n incomingDocument: document,\n mode: importMode,\n msg: 'Found existing document for update',\n })\n }\n\n const updateData = { ...document }\n // Remove ID and internal fields from update data\n delete updateData.id\n delete updateData._id\n delete updateData.createdAt\n delete updateData.updatedAt\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n updateData,\n configuredLocales,\n defaultLocale,\n )\n\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n hasMultiLocale,\n mode: importMode,\n msg: 'Updating document in upsert/update mode',\n updateData: Object.keys(hasMultiLocale ? flatData : updateData).reduce(\n (acc, key) => {\n const val = (hasMultiLocale ? flatData : updateData)[key]\n acc[key] =\n typeof val === 'string' && val.length > 50 ? val.substring(0, 50) + '...' : val\n return acc\n },\n {} as Record<string, unknown>,\n ),\n })\n }\n\n if (hasMultiLocale) {\n // Update with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: flatData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: localeData,\n depth: 0,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(existingDoc.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, update normally\n try {\n // Extra debug: log before update\n if (req.payload.config.debug) {\n req.payload.logger.info({\n existingId: existingDoc.id,\n existingTitle: existingDoc.title,\n msg: 'About to update document',\n newData: updateData,\n })\n }\n\n // Update the document - don't specify draft to let Payload handle versions properly\n // This will create a new draft version for collections with versions enabled\n savedDocument = await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: updateData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req,\n user,\n })\n\n if (req.payload.config.debug && savedDocument) {\n req.payload.logger.info({\n id: savedDocument.id,\n msg: 'Update completed',\n status: savedDocument._status,\n title: savedDocument.title,\n })\n }\n } catch (updateError) {\n req.payload.logger.error({\n id: existingDoc.id,\n err: updateError,\n msg: 'Update failed',\n })\n throw updateError\n }\n }\n } else if (importMode === 'upsert') {\n // Create new in upsert mode\n if (req.payload.config.debug) {\n req.payload.logger.info({\n document,\n matchField: matchField || 'id',\n matchValue: document[matchField || 'id'],\n msg: 'No existing document found, creating new in upsert mode',\n })\n }\n\n const createData = { ...document }\n if (!hasCustomIdField) {\n delete createData.id\n }\n\n // Only handle _status for versioned collections\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n // Use defaultVersionStatus from config if _status not provided\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n createData._status = statusValue\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n defaultLocale,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n const defaultLocaleReq = defaultLocale ? { ...req, locale: defaultLocale } : req\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req: defaultLocaleReq,\n user,\n })\n\n if (savedDocument && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n await req.payload.update({\n id: savedDocument.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: { ...req, locale },\n user,\n })\n } catch (error) {\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(savedDocument.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n savedDocument = await req.payload.create({\n collection: collectionSlug,\n data: createData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n }\n } else {\n // Update mode but document not found\n let matchValueDisplay: string\n if (typeof matchValue === 'object' && matchValue !== null) {\n matchValueDisplay = JSON.stringify(matchValue)\n } else if (typeof matchValue === 'string') {\n matchValueDisplay = matchValue\n } else if (typeof matchValue === 'number') {\n matchValueDisplay = matchValue.toString()\n } else {\n // For other types, use JSON.stringify to avoid [object Object]\n matchValueDisplay = JSON.stringify(matchValue)\n }\n throw new Error(`Document with ${matchField || 'id'}=\"${matchValueDisplay}\" not found`)\n }\n } else {\n throw new Error(`Unknown import mode: ${String(importMode)}`)\n }\n\n if (savedDocument) {\n // Determine operation type for proper counting\n let operation: 'created' | 'updated' | undefined\n if (importMode === 'create') {\n operation = 'created'\n } else if (importMode === 'update') {\n operation = 'updated'\n } else if (importMode === 'upsert') {\n if (existingDocResult && existingDocResult.docs.length > 0) {\n operation = 'updated'\n } else {\n operation = 'created'\n }\n }\n\n result.successful.push({\n document,\n index: rowNumber - 1, // Store as 0-indexed\n operation,\n result: savedDocument,\n })\n }\n } catch (error) {\n const importError: ImportError = {\n type: categorizeError(error),\n documentData: document || {},\n error: extractErrorMessage(error),\n item: document || {},\n itemIndex: rowNumber - 1,\n rowNumber,\n }\n\n // Try to extract field information from validation errors\n if (error && typeof error === 'object' && 'data' in error) {\n const errorData = error as { data?: { errors?: Array<{ path?: string }> } }\n if (errorData.data?.errors && Array.isArray(errorData.data.errors)) {\n const firstError = errorData.data.errors[0]\n if (firstError?.path) {\n importError.field = firstError.path\n }\n }\n }\n\n result.failed.push(importError)\n // Always continue processing all rows\n }\n }\n\n return result\n}\n\nexport function createImportBatchProcessor(options: ImportBatchProcessorOptions = {}) {\n const processorOptions = {\n batchSize: options.batchSize ?? 100,\n defaultVersionStatus: options.defaultVersionStatus ?? 'published',\n }\n\n const processImport = async (processOptions: ImportProcessOptions): Promise<ImportResult> => {\n const {\n collectionSlug,\n docs: documents,\n format = 'csv',\n hooks,\n importMode,\n matchField,\n originalDocs: originalDocs,\n req,\n totalBatches: totalBatchesFromOptions,\n user,\n } = processOptions\n const batches = createBatches(documents, processorOptions.batchSize)\n const totalBatches = totalBatchesFromOptions ?? batches.length\n\n const result: ImportResult = {\n errors: [],\n imported: 0,\n total: documents.length,\n updated: 0,\n }\n\n for (let i = 0; i < batches.length; i++) {\n const currentBatch = batches[i]\n if (!currentBatch) {\n continue\n }\n\n const batchNumber = i + 1\n const batchStart = i * processorOptions.batchSize\n const originalBatch = originalDocs\n ? originalDocs.slice(batchStart, batchStart + currentBatch.length)\n : currentBatch\n\n const batchToProcess: Record<string, unknown>[] =\n hooks?.before && currentBatch.length > 0\n ? ((await hooks.before({\n batchNumber,\n data: currentBatch as Parameters<ImportBeforeHook>[0]['data'],\n format,\n originalData: originalBatch,\n req,\n totalBatches,\n })) as Record<string, unknown>[])\n : currentBatch\n\n const batchResult = await processImportBatch({\n batch: batchToProcess,\n batchIndex: i,\n collectionSlug,\n importMode,\n matchField,\n options: processorOptions,\n req,\n user,\n })\n\n let batchImported = 0\n let batchUpdated = 0\n for (const success of batchResult.successful) {\n if (success.operation === 'created') {\n result.imported++\n batchImported++\n } else if (success.operation === 'updated') {\n result.updated++\n batchUpdated++\n } else {\n // Fallback\n if (importMode === 'create') {\n result.imported++\n batchImported++\n } else {\n result.updated++\n batchUpdated++\n }\n }\n }\n\n for (const error of batchResult.failed) {\n result.errors.push({\n doc: error.documentData,\n error: error.error,\n index: error.rowNumber - 1, // Convert back to 0-indexed\n })\n }\n\n if (hooks?.after) {\n const batchHookResult: ImportResult = {\n errors:\n batchResult.failed.length > 0 ? result.errors.slice(-batchResult.failed.length) : [],\n imported: batchImported,\n total: batchToProcess.length,\n updated: batchUpdated,\n }\n await hooks.after({\n batchNumber,\n format,\n originalData: originalBatch,\n req,\n result: batchHookResult,\n totalBatches,\n })\n }\n }\n\n return result\n }\n\n return {\n processImport,\n }\n}\n"],"names":["isolateObjectProperty","categorizeError","createBatches","extractErrorMessage","extractMultiLocaleData","data","configuredLocales","defaultLocale","flatData","localeUpdates","hasMultiLocale","length","localeSet","Set","key","value","Object","entries","Array","isArray","valueObj","localeKeys","keys","filter","k","has","baseLocale","includes","locale","processImportBatch","batch","batchIndex","collectionSlug","importMode","matchField","options","req","reqFromArgs","user","result","failed","successful","transactionID","undefined","collectionEntry","payload","collections","collectionConfig","config","collectionHasVersions","Boolean","versions","hasCustomIdField","customIDType","localization","localeCodes","startingRowNumber","batchSize","i","document","rowNumber","savedDocument","existingDocResult","createData","id","draftOption","statusValue","_status","defaultVersionStatus","isPublished","debug","logger","info","msg","willSetDraft","title","titleIsNull","titleType","defaultLocaleReq","create","collection","draft","overrideAccess","localeData","update","error","err","String","matchValue","Error","isMatchingById","matchValueStr","JSON","stringify","toString","isValidObjectIdFormat","test","find","depth","limit","where","equals","docs","existingDoc","existingId","existingStatus","existingTitle","incomingDocument","mode","updateData","_id","createdAt","updatedAt","reduce","acc","val","substring","newData","status","updateError","matchValueDisplay","operation","push","index","importError","type","documentData","item","itemIndex","errorData","errors","firstError","path","field","createImportBatchProcessor","processorOptions","processImport","processOptions","documents","format","hooks","originalDocs","totalBatches","totalBatchesFromOptions","batches","imported","total","updated","currentBatch","batchNumber","batchStart","originalBatch","slice","batchToProcess","before","originalData","batchResult","batchImported","batchUpdated","success","doc","after","batchHookResult"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createImport.d.ts","sourceRoot":"","sources":["../../src/import/createImport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,SAAS,CAAA;AAIxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEvD,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,YAAY,6IAatB,gBAAgB,KAAG,OAAO,CAAC,YAAY,CAuLzC,CAAA"}
1
+ {"version":3,"file":"createImport.d.ts","sourceRoot":"","sources":["../../src/import/createImport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAQ,MAAM,SAAS,CAAA;AAInD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEvD,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,MAAM,CAAA;AAEV,eAAO,MAAM,YAAY,GAAU,0IAahC,gBAAgB,KAAG,OAAO,CAAC,YAAY,CAuLzC,CAAA"}
@@ -52,7 +52,7 @@ export const createImport = async ({ batchSize = 100, collectionSlug, debug = fa
52
52
  // Get disabled fields configuration
53
53
  const disabledFields = collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? [];
54
54
  const importHooks = collectionConfig.custom?.['plugin-import-export']?.importHooks;
55
- // Get fromCSV functions for field transformations
55
+ // Get beforeImport functions for field transformations
56
56
  const importFieldHooks = getImportFieldFunctions({
57
57
  fields: collectionConfig.flattenedFields || []
58
58
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/import/createImport.ts"],"sourcesContent":["import type { PayloadRequest, TypedUser } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport type { ImportResult } from '../types.js'\n\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 { unflattenObject } from '../utilities/unflattenObject.js'\nimport { createImportBatchProcessor } from './batchProcessor.js'\n\nexport type ImportMode = 'create' | 'update' | 'upsert'\n\nexport type Import = {\n /**\n * Number of documents to process in each batch during import\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enabled debug logging\n */\n debug?: boolean\n file?: {\n data: Buffer\n mimetype: string\n name: string\n }\n format: 'csv' | 'json'\n id?: number | string\n /**\n * Import mode: create, update or upset\n */\n importMode: ImportMode\n matchField?: string\n /**\n * Maximum number of documents that can be imported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n userCollection?: string\n userID?: number | string\n}\n\nexport type CreateImportArgs = {\n defaultVersionStatus?: 'draft' | 'published'\n req: PayloadRequest\n} & Import\n\nexport const createImport = async ({\n batchSize = 100,\n collectionSlug,\n debug = false,\n defaultVersionStatus = 'published',\n file,\n format,\n importMode = 'create',\n matchField = 'id',\n maxLimit,\n req,\n userCollection,\n userID,\n}: CreateImportArgs): Promise<ImportResult> => {\n let user: TypedUser | undefined\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n req,\n })) as TypedUser\n }\n\n if (!user) {\n throw new APIError('User is required for import operations', 401, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n collectionSlug,\n format,\n importMode,\n matchField,\n msg: 'Starting import process with args:',\n transactionID: req.transactionID, // Log transaction ID to verify we're in same transaction\n })\n }\n\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n\n if (!file || !file?.data) {\n throw new APIError('No file data provided for import', 400, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n fileName: file.name,\n fileSize: file.data.length,\n mimeType: file.mimetype,\n msg: 'File info',\n })\n }\n\n const collectionConfig = req.payload.config.collections.find(\n ({ slug }) => slug === collectionSlug,\n )\n\n if (!collectionConfig) {\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n throw new APIError(`Collection with slug ${collectionSlug} not found`, 400, null, true)\n }\n\n // Get disabled fields configuration\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const importHooks = collectionConfig.custom?.['plugin-import-export']?.importHooks\n\n // Get fromCSV functions for field transformations\n const importFieldHooks = getImportFieldFunctions({\n fields: collectionConfig.flattenedFields || [],\n })\n\n // Parse the file data\n let originalDocs: Record<string, unknown>[] | undefined\n let documents: Record<string, unknown>[]\n if (format === 'csv') {\n const rawData = await parseCSV({\n data: file.data,\n req,\n })\n\n originalDocs = rawData\n documents = rawData\n\n // Unflatten CSV data\n documents = documents\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: collectionConfig.flattenedFields ?? [],\n format,\n importFieldHooks,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n\n if (debug) {\n req.payload.logger.debug({\n documentCount: documents.length,\n msg: 'After unflattening CSV',\n rawDataCount: rawData.length,\n })\n }\n } else {\n const parsedDocs = parseJSON({ data: file.data, req })\n originalDocs = parsedDocs\n // Apply field-level import hooks for JSON format\n documents = parsedDocs.map((doc) =>\n applyFieldHooks({\n type: 'beforeImport',\n data: doc,\n fieldHooks: importFieldHooks,\n fields: collectionConfig.flattenedFields ?? [],\n format,\n operation: 'import',\n req,\n }),\n )\n }\n\n if (debug) {\n req.payload.logger.debug({\n msg: `Parsed ${documents.length} documents from ${format} file`,\n })\n if (documents.length > 0) {\n req.payload.logger.debug({\n doc: documents[0],\n msg: 'First document sample:',\n })\n }\n }\n\n // Enforce maxLimit before processing to save memory/time\n if (typeof maxLimit === 'number' && maxLimit > 0 && documents.length > maxLimit) {\n throw new APIError(\n `Import file contains ${documents.length} documents but limit is ${maxLimit}`,\n 400,\n null,\n true,\n )\n }\n\n // Remove disabled fields from all documents\n if (disabledFields.length > 0) {\n documents = documents.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n if (debug) {\n req.payload.logger.debug({\n batchSize,\n documentCount: documents.length,\n msg: 'Processing import in batches',\n })\n }\n\n // Create batch processor\n const processor = createImportBatchProcessor({\n batchSize,\n defaultVersionStatus,\n })\n\n const totalBatches = documents.length > 0 ? Math.ceil(documents.length / batchSize) : 1\n\n // Process import with batch processor\n const result = await processor.processImport({\n collectionSlug,\n docs: documents,\n format,\n hooks: importHooks,\n importMode,\n matchField,\n originalDocs,\n req,\n totalBatches,\n user,\n })\n\n if (debug) {\n req.payload.logger.info({\n errors: result.errors.length,\n imported: result.imported,\n msg: 'Import completed',\n total: result.total,\n updated: result.updated,\n })\n }\n\n return result\n}\n"],"names":["APIError","applyFieldHooks","getImportFieldFunctions","parseCSV","parseJSON","removeDisabledFields","unflattenObject","createImportBatchProcessor","createImport","batchSize","collectionSlug","debug","defaultVersionStatus","file","format","importMode","matchField","maxLimit","req","userCollection","userID","user","payload","findByID","id","collection","logger","msg","transactionID","data","fileName","name","fileSize","length","mimeType","mimetype","collectionConfig","config","collections","find","slug","disabledFields","admin","custom","importHooks","importFieldHooks","fields","flattenedFields","originalDocs","documents","rawData","map","doc","unflattened","filter","Object","keys","documentCount","rawDataCount","parsedDocs","type","fieldHooks","operation","processor","totalBatches","Math","ceil","result","processImport","docs","hooks","info","errors","imported","total","updated"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/import/createImport.ts"],"sourcesContent":["import type { PayloadRequest, User } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport type { ImportResult } from '../types.js'\n\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 { unflattenObject } from '../utilities/unflattenObject.js'\nimport { createImportBatchProcessor } from './batchProcessor.js'\n\nexport type ImportMode = 'create' | 'update' | 'upsert'\n\nexport type Import = {\n /**\n * Number of documents to process in each batch during import\n * @default 100\n */\n batchSize?: number\n collectionSlug: string\n /**\n * If true, enabled debug logging\n */\n debug?: boolean\n file?: {\n data: Buffer\n mimetype: string\n name: string\n }\n format: 'csv' | 'json'\n id?: number | string\n /**\n * Import mode: create, update or upset\n */\n importMode: ImportMode\n matchField?: string\n /**\n * Maximum number of documents that can be imported in a single operation.\n * This value has already been resolved from the plugin config.\n */\n maxLimit?: number\n name: string\n userCollection?: string\n userID?: number | string\n}\n\nexport type CreateImportArgs = {\n defaultVersionStatus?: 'draft' | 'published'\n req: PayloadRequest\n} & Import\n\nexport const createImport = async ({\n batchSize = 100,\n collectionSlug,\n debug = false,\n defaultVersionStatus = 'published',\n file,\n format,\n importMode = 'create',\n matchField = 'id',\n maxLimit,\n req,\n userCollection,\n userID,\n}: CreateImportArgs): Promise<ImportResult> => {\n let user: undefined | User\n\n if (userCollection && userID) {\n user = (await req.payload.findByID({\n id: userID,\n collection: userCollection,\n req,\n })) as User\n }\n\n if (!user) {\n throw new APIError('User is required for import operations', 401, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n collectionSlug,\n format,\n importMode,\n matchField,\n msg: 'Starting import process with args:',\n transactionID: req.transactionID, // Log transaction ID to verify we're in same transaction\n })\n }\n\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n\n if (!file || !file?.data) {\n throw new APIError('No file data provided for import', 400, null, true)\n }\n\n if (debug) {\n req.payload.logger.debug({\n fileName: file.name,\n fileSize: file.data.length,\n mimeType: file.mimetype,\n msg: 'File info',\n })\n }\n\n const collectionConfig = req.payload.config.collections.find(\n ({ slug }) => slug === collectionSlug,\n )\n\n if (!collectionConfig) {\n if (!collectionSlug) {\n throw new APIError('Collection slug is required', 400, null, true)\n }\n throw new APIError(`Collection with slug ${collectionSlug} not found`, 400, null, true)\n }\n\n // Get disabled fields configuration\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const importHooks = collectionConfig.custom?.['plugin-import-export']?.importHooks\n\n // Get beforeImport functions for field transformations\n const importFieldHooks = getImportFieldFunctions({\n fields: collectionConfig.flattenedFields || [],\n })\n\n // Parse the file data\n let originalDocs: Record<string, unknown>[] | undefined\n let documents: Record<string, unknown>[]\n if (format === 'csv') {\n const rawData = await parseCSV({\n data: file.data,\n req,\n })\n\n originalDocs = rawData\n documents = rawData\n\n // Unflatten CSV data\n documents = documents\n .map((doc) => {\n const unflattened = unflattenObject({\n data: doc,\n fields: collectionConfig.flattenedFields ?? [],\n format,\n importFieldHooks,\n req,\n })\n return unflattened ?? {}\n })\n .filter((doc) => doc && Object.keys(doc).length > 0)\n\n if (debug) {\n req.payload.logger.debug({\n documentCount: documents.length,\n msg: 'After unflattening CSV',\n rawDataCount: rawData.length,\n })\n }\n } else {\n const parsedDocs = parseJSON({ data: file.data, req })\n originalDocs = parsedDocs\n // Apply field-level import hooks for JSON format\n documents = parsedDocs.map((doc) =>\n applyFieldHooks({\n type: 'beforeImport',\n data: doc,\n fieldHooks: importFieldHooks,\n fields: collectionConfig.flattenedFields ?? [],\n format,\n operation: 'import',\n req,\n }),\n )\n }\n\n if (debug) {\n req.payload.logger.debug({\n msg: `Parsed ${documents.length} documents from ${format} file`,\n })\n if (documents.length > 0) {\n req.payload.logger.debug({\n doc: documents[0],\n msg: 'First document sample:',\n })\n }\n }\n\n // Enforce maxLimit before processing to save memory/time\n if (typeof maxLimit === 'number' && maxLimit > 0 && documents.length > maxLimit) {\n throw new APIError(\n `Import file contains ${documents.length} documents but limit is ${maxLimit}`,\n 400,\n null,\n true,\n )\n }\n\n // Remove disabled fields from all documents\n if (disabledFields.length > 0) {\n documents = documents.map((doc) => removeDisabledFields(doc, disabledFields))\n }\n\n if (debug) {\n req.payload.logger.debug({\n batchSize,\n documentCount: documents.length,\n msg: 'Processing import in batches',\n })\n }\n\n // Create batch processor\n const processor = createImportBatchProcessor({\n batchSize,\n defaultVersionStatus,\n })\n\n const totalBatches = documents.length > 0 ? Math.ceil(documents.length / batchSize) : 1\n\n // Process import with batch processor\n const result = await processor.processImport({\n collectionSlug,\n docs: documents,\n format,\n hooks: importHooks,\n importMode,\n matchField,\n originalDocs,\n req,\n totalBatches,\n user,\n })\n\n if (debug) {\n req.payload.logger.info({\n errors: result.errors.length,\n imported: result.imported,\n msg: 'Import completed',\n total: result.total,\n updated: result.updated,\n })\n }\n\n return result\n}\n"],"names":["APIError","applyFieldHooks","getImportFieldFunctions","parseCSV","parseJSON","removeDisabledFields","unflattenObject","createImportBatchProcessor","createImport","batchSize","collectionSlug","debug","defaultVersionStatus","file","format","importMode","matchField","maxLimit","req","userCollection","userID","user","payload","findByID","id","collection","logger","msg","transactionID","data","fileName","name","fileSize","length","mimeType","mimetype","collectionConfig","config","collections","find","slug","disabledFields","admin","custom","importHooks","importFieldHooks","fields","flattenedFields","originalDocs","documents","rawData","map","doc","unflattened","filter","Object","keys","documentCount","rawDataCount","parsedDocs","type","fieldHooks","operation","processor","totalBatches","Math","ceil","result","processImport","docs","hooks","info","errors","imported","total","updated"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getCreateImportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/import/getCreateImportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAOjD,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,6BAA6B,YAC/B,MAAM,KACd,UAAU,CAAC;IACZ,KAAK,EAAE,eAAe,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf,CAgJA,CAAA"}
1
+ {"version":3,"file":"getCreateImportCollectionTask.d.ts","sourceRoot":"","sources":["../../src/import/getCreateImportCollectionTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAOjD,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IAC5C,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,6BAA6B,GACxC,SAAS,MAAM,KACd,UAAU,CAAC;IACZ,KAAK,EAAE,eAAe,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf,CAgJA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/import/getFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAA;AAEpD,KAAK,gBAAgB,GAAG;IACtB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,gBAAgB,KAAG,KAAK,EA0J1D,CAAA"}
1
+ {"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/import/getFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAA;AAEpD,KAAK,gBAAgB,GAAG;IACtB;;;OAGG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,SAAS,gBAAgB,KAAG,KAAK,EA0J1D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getImportCollection.d.ts","sourceRoot":"","sources":["../../src/import/getImportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI1E,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAYzE,eAAO,MAAM,mBAAmB,qDAI7B;IACD;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBAoVH,CAAA"}
1
+ {"version":3,"file":"getImportCollection.d.ts","sourceRoot":"","sources":["../../src/import/getImportCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI1E,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAYzE,eAAO,MAAM,mBAAmB,GAAI,kDAIjC;IACD;;OAEG;IACH,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBAoVH,CAAA"}
@@ -121,8 +121,8 @@ export const getImportCollection = ({ collectionSlugs, importConfig, pluginConfi
121
121
  matchField: doc.matchField,
122
122
  maxLimit,
123
123
  req,
124
- userCollection: req?.user?.collection || req?.user?.user?.collection,
125
- userID: req?.user?.id || req?.user?.user?.id
124
+ userCollection: req?.user?.collection,
125
+ userID: req?.user?.id
126
126
  });
127
127
  // Determine status
128
128
  let status;
@@ -283,8 +283,8 @@ export const getImportCollection = ({ collectionSlugs, importConfig, pluginConfi
283
283
  importCollection: collectionConfig.slug,
284
284
  importId: doc.id,
285
285
  maxLimit,
286
- userCollection: req.user?.collection || req?.user?.user?.collection,
287
- userID: req?.user?.id || req?.user?.user?.id
286
+ userCollection: req.user?.collection,
287
+ userID: req?.user?.id
288
288
  };
289
289
  await req.payload.jobs.queue({
290
290
  input,
@@ -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 || req?.user?.user?.collection,\n userID: req?.user?.id || req?.user?.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 || req?.user?.user?.collection,\n userID: req?.user?.id || req?.user?.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 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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"}