@payloadcms/plugin-import-export 3.71.0-internal.ef75fa0 → 3.71.1

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 (322) hide show
  1. package/dist/components/CollectionField/index.d.ts.map +1 -1
  2. package/dist/components/CollectionField/index.js +8 -3
  3. package/dist/components/CollectionField/index.js.map +1 -1
  4. package/dist/components/ExportListMenuItem/index.d.ts +0 -1
  5. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
  6. package/dist/components/ExportListMenuItem/index.js +0 -1
  7. package/dist/components/ExportListMenuItem/index.js.map +1 -1
  8. package/dist/components/ExportPreview/index.d.ts +4 -0
  9. package/dist/components/ExportPreview/index.d.ts.map +1 -0
  10. package/dist/components/ExportPreview/index.js +252 -0
  11. package/dist/components/ExportPreview/index.js.map +1 -0
  12. package/dist/components/ExportPreview/index.scss +36 -0
  13. package/dist/components/ImportCollectionField/index.d.ts +3 -0
  14. package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
  15. package/dist/components/ImportCollectionField/index.js +17 -0
  16. package/dist/components/ImportCollectionField/index.js.map +1 -0
  17. package/dist/components/ImportListMenuItem/index.d.ts +6 -0
  18. package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
  19. package/dist/components/ImportListMenuItem/index.js +48 -0
  20. package/dist/components/ImportListMenuItem/index.js.map +1 -0
  21. package/dist/components/ImportPreview/index.d.ts +4 -0
  22. package/dist/components/ImportPreview/index.d.ts.map +1 -0
  23. package/dist/components/ImportPreview/index.js +624 -0
  24. package/dist/components/ImportPreview/index.js.map +1 -0
  25. package/dist/components/ImportPreview/index.scss +41 -0
  26. package/dist/components/ImportSaveButton/index.d.ts +2 -0
  27. package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
  28. package/dist/components/ImportSaveButton/index.js +18 -0
  29. package/dist/components/ImportSaveButton/index.js.map +1 -0
  30. package/dist/components/Page/index.scss +4 -2
  31. package/dist/constants.d.ts +21 -0
  32. package/dist/constants.d.ts.map +1 -0
  33. package/dist/constants.js +21 -0
  34. package/dist/constants.js.map +1 -0
  35. package/dist/export/batchProcessor.d.ts +107 -0
  36. package/dist/export/batchProcessor.d.ts.map +1 -0
  37. package/dist/export/batchProcessor.js +187 -0
  38. package/dist/export/batchProcessor.js.map +1 -0
  39. package/dist/export/createExport.d.ts +9 -4
  40. package/dist/export/createExport.d.ts.map +1 -1
  41. package/dist/export/createExport.js +163 -111
  42. package/dist/export/createExport.js.map +1 -1
  43. package/dist/export/getCreateExportCollectionTask.d.ts +1 -2
  44. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  45. package/dist/export/getCreateExportCollectionTask.js +10 -18
  46. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  47. package/dist/export/getExportCollection.d.ts +8 -0
  48. package/dist/export/getExportCollection.d.ts.map +1 -0
  49. package/dist/export/getExportCollection.js +100 -0
  50. package/dist/export/getExportCollection.js.map +1 -0
  51. package/dist/export/getFields.d.ts +8 -2
  52. package/dist/export/getFields.d.ts.map +1 -1
  53. package/dist/export/getFields.js +7 -9
  54. package/dist/export/getFields.js.map +1 -1
  55. package/dist/export/handleDownload.d.ts +3 -0
  56. package/dist/export/handleDownload.d.ts.map +1 -0
  57. package/dist/export/{download.js → handleDownload.js} +7 -6
  58. package/dist/export/handleDownload.js.map +1 -0
  59. package/dist/export/handlePreview.d.ts +3 -0
  60. package/dist/export/handlePreview.d.ts.map +1 -0
  61. package/dist/export/handlePreview.js +163 -0
  62. package/dist/export/handlePreview.js.map +1 -0
  63. package/dist/exports/rsc.d.ts +5 -1
  64. package/dist/exports/rsc.d.ts.map +1 -1
  65. package/dist/exports/rsc.js +5 -1
  66. package/dist/exports/rsc.js.map +1 -1
  67. package/dist/import/batchProcessor.d.ts +46 -0
  68. package/dist/import/batchProcessor.d.ts.map +1 -0
  69. package/dist/import/batchProcessor.js +529 -0
  70. package/dist/import/batchProcessor.js.map +1 -0
  71. package/dist/import/createImport.d.ts +45 -0
  72. package/dist/import/createImport.d.ts.map +1 -0
  73. package/dist/import/createImport.js +175 -0
  74. package/dist/import/createImport.js.map +1 -0
  75. package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
  76. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
  77. package/dist/import/getCreateImportCollectionTask.js +81 -0
  78. package/dist/import/getCreateImportCollectionTask.js.map +1 -0
  79. package/dist/import/getFields.d.ts +7 -0
  80. package/dist/import/getFields.d.ts.map +1 -0
  81. package/dist/import/getFields.js +150 -0
  82. package/dist/import/getFields.js.map +1 -0
  83. package/dist/import/getImportCollection.d.ts +8 -0
  84. package/dist/import/getImportCollection.d.ts.map +1 -0
  85. package/dist/import/getImportCollection.js +258 -0
  86. package/dist/import/getImportCollection.js.map +1 -0
  87. package/dist/import/handlePreview.d.ts +3 -0
  88. package/dist/import/handlePreview.d.ts.map +1 -0
  89. package/dist/import/handlePreview.js +94 -0
  90. package/dist/import/handlePreview.js.map +1 -0
  91. package/dist/index.d.ts +3 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +68 -110
  94. package/dist/index.js.map +1 -1
  95. package/dist/translations/languages/ar.d.ts.map +1 -1
  96. package/dist/translations/languages/ar.js +21 -1
  97. package/dist/translations/languages/ar.js.map +1 -1
  98. package/dist/translations/languages/az.d.ts.map +1 -1
  99. package/dist/translations/languages/az.js +21 -1
  100. package/dist/translations/languages/az.js.map +1 -1
  101. package/dist/translations/languages/bg.d.ts.map +1 -1
  102. package/dist/translations/languages/bg.js +21 -1
  103. package/dist/translations/languages/bg.js.map +1 -1
  104. package/dist/translations/languages/bnBd.d.ts +4 -0
  105. package/dist/translations/languages/bnBd.d.ts.map +1 -0
  106. package/dist/translations/languages/bnBd.js +48 -0
  107. package/dist/translations/languages/bnBd.js.map +1 -0
  108. package/dist/translations/languages/bnIn.d.ts +4 -0
  109. package/dist/translations/languages/bnIn.d.ts.map +1 -0
  110. package/dist/translations/languages/bnIn.js +48 -0
  111. package/dist/translations/languages/bnIn.js.map +1 -0
  112. package/dist/translations/languages/ca.d.ts.map +1 -1
  113. package/dist/translations/languages/ca.js +21 -1
  114. package/dist/translations/languages/ca.js.map +1 -1
  115. package/dist/translations/languages/cs.d.ts.map +1 -1
  116. package/dist/translations/languages/cs.js +21 -1
  117. package/dist/translations/languages/cs.js.map +1 -1
  118. package/dist/translations/languages/da.d.ts.map +1 -1
  119. package/dist/translations/languages/da.js +21 -1
  120. package/dist/translations/languages/da.js.map +1 -1
  121. package/dist/translations/languages/de.d.ts.map +1 -1
  122. package/dist/translations/languages/de.js +21 -1
  123. package/dist/translations/languages/de.js.map +1 -1
  124. package/dist/translations/languages/en.d.ts +20 -0
  125. package/dist/translations/languages/en.d.ts.map +1 -1
  126. package/dist/translations/languages/en.js +21 -1
  127. package/dist/translations/languages/en.js.map +1 -1
  128. package/dist/translations/languages/es.d.ts.map +1 -1
  129. package/dist/translations/languages/es.js +21 -1
  130. package/dist/translations/languages/es.js.map +1 -1
  131. package/dist/translations/languages/et.d.ts.map +1 -1
  132. package/dist/translations/languages/et.js +21 -1
  133. package/dist/translations/languages/et.js.map +1 -1
  134. package/dist/translations/languages/fa.d.ts.map +1 -1
  135. package/dist/translations/languages/fa.js +21 -1
  136. package/dist/translations/languages/fa.js.map +1 -1
  137. package/dist/translations/languages/fr.d.ts.map +1 -1
  138. package/dist/translations/languages/fr.js +21 -1
  139. package/dist/translations/languages/fr.js.map +1 -1
  140. package/dist/translations/languages/he.d.ts.map +1 -1
  141. package/dist/translations/languages/he.js +21 -1
  142. package/dist/translations/languages/he.js.map +1 -1
  143. package/dist/translations/languages/hr.d.ts.map +1 -1
  144. package/dist/translations/languages/hr.js +21 -1
  145. package/dist/translations/languages/hr.js.map +1 -1
  146. package/dist/translations/languages/hu.d.ts.map +1 -1
  147. package/dist/translations/languages/hu.js +21 -1
  148. package/dist/translations/languages/hu.js.map +1 -1
  149. package/dist/translations/languages/hy.d.ts.map +1 -1
  150. package/dist/translations/languages/hy.js +21 -1
  151. package/dist/translations/languages/hy.js.map +1 -1
  152. package/dist/translations/languages/id.d.ts +4 -0
  153. package/dist/translations/languages/id.d.ts.map +1 -0
  154. package/dist/translations/languages/id.js +48 -0
  155. package/dist/translations/languages/id.js.map +1 -0
  156. package/dist/translations/languages/is.d.ts.map +1 -1
  157. package/dist/translations/languages/is.js +21 -1
  158. package/dist/translations/languages/is.js.map +1 -1
  159. package/dist/translations/languages/it.d.ts.map +1 -1
  160. package/dist/translations/languages/it.js +21 -1
  161. package/dist/translations/languages/it.js.map +1 -1
  162. package/dist/translations/languages/ja.d.ts.map +1 -1
  163. package/dist/translations/languages/ja.js +21 -1
  164. package/dist/translations/languages/ja.js.map +1 -1
  165. package/dist/translations/languages/ko.d.ts.map +1 -1
  166. package/dist/translations/languages/ko.js +21 -1
  167. package/dist/translations/languages/ko.js.map +1 -1
  168. package/dist/translations/languages/lt.d.ts.map +1 -1
  169. package/dist/translations/languages/lt.js +21 -1
  170. package/dist/translations/languages/lt.js.map +1 -1
  171. package/dist/translations/languages/lv.d.ts.map +1 -1
  172. package/dist/translations/languages/lv.js +26 -6
  173. package/dist/translations/languages/lv.js.map +1 -1
  174. package/dist/translations/languages/my.d.ts.map +1 -1
  175. package/dist/translations/languages/my.js +21 -1
  176. package/dist/translations/languages/my.js.map +1 -1
  177. package/dist/translations/languages/nb.d.ts.map +1 -1
  178. package/dist/translations/languages/nb.js +21 -1
  179. package/dist/translations/languages/nb.js.map +1 -1
  180. package/dist/translations/languages/nl.d.ts.map +1 -1
  181. package/dist/translations/languages/nl.js +21 -1
  182. package/dist/translations/languages/nl.js.map +1 -1
  183. package/dist/translations/languages/pl.d.ts.map +1 -1
  184. package/dist/translations/languages/pl.js +21 -1
  185. package/dist/translations/languages/pl.js.map +1 -1
  186. package/dist/translations/languages/pt.d.ts.map +1 -1
  187. package/dist/translations/languages/pt.js +21 -1
  188. package/dist/translations/languages/pt.js.map +1 -1
  189. package/dist/translations/languages/ro.d.ts.map +1 -1
  190. package/dist/translations/languages/ro.js +21 -1
  191. package/dist/translations/languages/ro.js.map +1 -1
  192. package/dist/translations/languages/rs.d.ts.map +1 -1
  193. package/dist/translations/languages/rs.js +21 -1
  194. package/dist/translations/languages/rs.js.map +1 -1
  195. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  196. package/dist/translations/languages/rsLatin.js +21 -1
  197. package/dist/translations/languages/rsLatin.js.map +1 -1
  198. package/dist/translations/languages/ru.d.ts.map +1 -1
  199. package/dist/translations/languages/ru.js +21 -1
  200. package/dist/translations/languages/ru.js.map +1 -1
  201. package/dist/translations/languages/sk.d.ts.map +1 -1
  202. package/dist/translations/languages/sk.js +21 -1
  203. package/dist/translations/languages/sk.js.map +1 -1
  204. package/dist/translations/languages/sl.d.ts.map +1 -1
  205. package/dist/translations/languages/sl.js +21 -1
  206. package/dist/translations/languages/sl.js.map +1 -1
  207. package/dist/translations/languages/sv.d.ts.map +1 -1
  208. package/dist/translations/languages/sv.js +21 -1
  209. package/dist/translations/languages/sv.js.map +1 -1
  210. package/dist/translations/languages/ta.d.ts.map +1 -1
  211. package/dist/translations/languages/ta.js +21 -1
  212. package/dist/translations/languages/ta.js.map +1 -1
  213. package/dist/translations/languages/th.d.ts.map +1 -1
  214. package/dist/translations/languages/th.js +21 -1
  215. package/dist/translations/languages/th.js.map +1 -1
  216. package/dist/translations/languages/tr.d.ts.map +1 -1
  217. package/dist/translations/languages/tr.js +21 -1
  218. package/dist/translations/languages/tr.js.map +1 -1
  219. package/dist/translations/languages/uk.d.ts.map +1 -1
  220. package/dist/translations/languages/uk.js +21 -1
  221. package/dist/translations/languages/uk.js.map +1 -1
  222. package/dist/translations/languages/vi.d.ts.map +1 -1
  223. package/dist/translations/languages/vi.js +21 -1
  224. package/dist/translations/languages/vi.js.map +1 -1
  225. package/dist/translations/languages/zh.d.ts.map +1 -1
  226. package/dist/translations/languages/zh.js +21 -1
  227. package/dist/translations/languages/zh.js.map +1 -1
  228. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  229. package/dist/translations/languages/zhTw.js +21 -1
  230. package/dist/translations/languages/zhTw.js.map +1 -1
  231. package/dist/translations/types.d.ts +13 -0
  232. package/dist/translations/types.d.ts.map +1 -1
  233. package/dist/translations/types.js.map +1 -1
  234. package/dist/types.d.ts +166 -22
  235. package/dist/types.d.ts.map +1 -1
  236. package/dist/types.js +1 -1
  237. package/dist/types.js.map +1 -1
  238. package/dist/utilities/flattenObject.d.ts.map +1 -0
  239. package/dist/{export → utilities}/flattenObject.js +13 -6
  240. package/dist/utilities/flattenObject.js.map +1 -0
  241. package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
  242. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
  243. package/dist/{export/getCustomFieldFunctions.js → utilities/getExportFieldFunctions.js} +18 -2
  244. package/dist/utilities/getExportFieldFunctions.js.map +1 -0
  245. package/dist/utilities/getFilename.d.ts +6 -0
  246. package/dist/utilities/getFilename.d.ts.map +1 -0
  247. package/dist/{export → utilities}/getFilename.js +4 -1
  248. package/dist/utilities/getFilename.js.map +1 -0
  249. package/dist/utilities/getFlattenedFieldKeys.d.ts +12 -1
  250. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
  251. package/dist/utilities/getFlattenedFieldKeys.js +35 -10
  252. package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
  253. package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
  254. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
  255. package/dist/utilities/getImportFieldFunctions.js +130 -0
  256. package/dist/utilities/getImportFieldFunctions.js.map +1 -0
  257. package/dist/utilities/getPluginCollections.d.ts +39 -0
  258. package/dist/utilities/getPluginCollections.d.ts.map +1 -0
  259. package/dist/utilities/getPluginCollections.js +102 -0
  260. package/dist/utilities/getPluginCollections.js.map +1 -0
  261. package/dist/utilities/getSchemaColumns.d.ts +43 -0
  262. package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
  263. package/dist/utilities/getSchemaColumns.js +163 -0
  264. package/dist/utilities/getSchemaColumns.js.map +1 -0
  265. package/dist/utilities/getSelect.d.ts +11 -0
  266. package/dist/utilities/getSelect.d.ts.map +1 -0
  267. package/dist/{export → utilities}/getSelect.js +6 -2
  268. package/dist/utilities/getSelect.js.map +1 -0
  269. package/dist/utilities/parseCSV.d.ts +11 -0
  270. package/dist/utilities/parseCSV.d.ts.map +1 -0
  271. package/dist/utilities/parseCSV.js +67 -0
  272. package/dist/utilities/parseCSV.js.map +1 -0
  273. package/dist/utilities/parseCSV.spec.js +169 -0
  274. package/dist/utilities/parseCSV.spec.js.map +1 -0
  275. package/dist/utilities/parseJSON.d.ts +11 -0
  276. package/dist/utilities/parseJSON.d.ts.map +1 -0
  277. package/dist/utilities/parseJSON.js +25 -0
  278. package/dist/utilities/parseJSON.js.map +1 -0
  279. package/dist/utilities/processRichTextField.d.ts +6 -0
  280. package/dist/utilities/processRichTextField.d.ts.map +1 -0
  281. package/dist/utilities/processRichTextField.js +45 -0
  282. package/dist/utilities/processRichTextField.js.map +1 -0
  283. package/dist/utilities/unflattenObject.d.ts +11 -0
  284. package/dist/utilities/unflattenObject.d.ts.map +1 -0
  285. package/dist/utilities/unflattenObject.js +431 -0
  286. package/dist/utilities/unflattenObject.js.map +1 -0
  287. package/dist/utilities/unflattenObject.spec.js +680 -0
  288. package/dist/utilities/unflattenObject.spec.js.map +1 -0
  289. package/dist/utilities/useBatchProcessor.d.ts +103 -0
  290. package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
  291. package/dist/utilities/useBatchProcessor.js +88 -0
  292. package/dist/utilities/useBatchProcessor.js.map +1 -0
  293. package/dist/utilities/validateLimitValue.d.ts +1 -1
  294. package/dist/utilities/validateLimitValue.d.ts.map +1 -1
  295. package/dist/utilities/validateLimitValue.js +1 -4
  296. package/dist/utilities/validateLimitValue.js.map +1 -1
  297. package/package.json +9 -9
  298. package/dist/components/ExportListMenuItem/index.scss +0 -52
  299. package/dist/components/Preview/index.d.ts +0 -4
  300. package/dist/components/Preview/index.d.ts.map +0 -1
  301. package/dist/components/Preview/index.js +0 -180
  302. package/dist/components/Preview/index.js.map +0 -1
  303. package/dist/components/Preview/index.scss +0 -8
  304. package/dist/export/download.d.ts +0 -3
  305. package/dist/export/download.d.ts.map +0 -1
  306. package/dist/export/download.js.map +0 -1
  307. package/dist/export/flattenObject.d.ts.map +0 -1
  308. package/dist/export/flattenObject.js.map +0 -1
  309. package/dist/export/getCustomFieldFunctions.d.ts +0 -8
  310. package/dist/export/getCustomFieldFunctions.d.ts.map +0 -1
  311. package/dist/export/getCustomFieldFunctions.js.map +0 -1
  312. package/dist/export/getFilename.d.ts +0 -2
  313. package/dist/export/getFilename.d.ts.map +0 -1
  314. package/dist/export/getFilename.js.map +0 -1
  315. package/dist/export/getSelect.d.ts +0 -7
  316. package/dist/export/getSelect.d.ts.map +0 -1
  317. package/dist/export/getSelect.js.map +0 -1
  318. package/dist/getExportCollection.d.ts +0 -7
  319. package/dist/getExportCollection.d.ts.map +0 -1
  320. package/dist/getExportCollection.js +0 -86
  321. package/dist/getExportCollection.js.map +0 -1
  322. /package/dist/{export → utilities}/flattenObject.d.ts +0 -0
@@ -0,0 +1,529 @@
1
+ import { categorizeError, createBatches, extractErrorMessage } from '../utilities/useBatchProcessor.js';
2
+ // Helper function to handle multi-locale data
3
+ function extractMultiLocaleData(data, configuredLocales) {
4
+ const flatData = {};
5
+ const localeUpdates = {};
6
+ let hasMultiLocale = false;
7
+ // If no locales configured, skip multi-locale processing
8
+ if (!configuredLocales || configuredLocales.length === 0) {
9
+ return {
10
+ flatData: {
11
+ ...data
12
+ },
13
+ hasMultiLocale: false,
14
+ localeUpdates: {}
15
+ };
16
+ }
17
+ const localeSet = new Set(configuredLocales);
18
+ for (const [key, value] of Object.entries(data)){
19
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
20
+ const valueObj = value;
21
+ // Check if this object has keys matching configured locales
22
+ const localeKeys = Object.keys(valueObj).filter((k)=>localeSet.has(k));
23
+ if (localeKeys.length > 0) {
24
+ hasMultiLocale = true;
25
+ // This is a localized field with explicit locale keys
26
+ // Use the first locale for initial creation, then update others
27
+ const firstLocale = localeKeys[0];
28
+ if (firstLocale) {
29
+ flatData[key] = valueObj[firstLocale];
30
+ // Store other locales for later update
31
+ for (const locale of localeKeys){
32
+ if (locale !== firstLocale) {
33
+ if (!localeUpdates[locale]) {
34
+ localeUpdates[locale] = {};
35
+ }
36
+ localeUpdates[locale][key] = valueObj[locale];
37
+ }
38
+ }
39
+ }
40
+ } else {
41
+ // Not locale data, keep as is
42
+ flatData[key] = value;
43
+ }
44
+ } else {
45
+ // Not an object, keep as is. this includes localized fields without locale suffix; ie default locale
46
+ flatData[key] = value;
47
+ }
48
+ }
49
+ return {
50
+ flatData,
51
+ hasMultiLocale,
52
+ localeUpdates
53
+ };
54
+ }
55
+ async function processImportBatch({ batch, batchIndex, collectionSlug, importMode, matchField, options, req, user }) {
56
+ const result = {
57
+ failed: [],
58
+ successful: []
59
+ };
60
+ // Check if the collection has versions enabled
61
+ const collectionConfig = req.payload.collections[collectionSlug]?.config;
62
+ const collectionHasVersions = Boolean(collectionConfig?.versions);
63
+ // Get configured locales for multi-locale data detection
64
+ const configuredLocales = req.payload.config.localization ? req.payload.config.localization.localeCodes : undefined;
65
+ // Calculate the starting row number for this batch
66
+ const startingRowNumber = batchIndex * options.batchSize;
67
+ for(let i = 0; i < batch.length; i++){
68
+ const document = batch[i];
69
+ if (!document) {
70
+ continue;
71
+ }
72
+ const rowNumber = startingRowNumber + i + 1;
73
+ try {
74
+ let processedDoc;
75
+ let existing;
76
+ if (importMode === 'create') {
77
+ // Remove ID field when creating new document
78
+ const createData = {
79
+ ...document
80
+ };
81
+ delete createData.id;
82
+ // Only handle _status for versioned collections
83
+ let draftOption;
84
+ if (collectionHasVersions) {
85
+ // Check if _status is set - use defaultVersionStatus from config
86
+ // If no _status field provided, use the configured default
87
+ const statusValue = createData._status || options.defaultVersionStatus;
88
+ const isPublished = statusValue !== 'draft';
89
+ draftOption = !isPublished;
90
+ // Debug: log status handling
91
+ if (req.payload.config.debug) {
92
+ req.payload.logger.info({
93
+ _status: createData._status,
94
+ isPublished,
95
+ msg: 'Status handling in create',
96
+ willSetDraft: draftOption
97
+ });
98
+ }
99
+ delete createData._status; // Remove _status from data - it's controlled via draft option
100
+ }
101
+ // Debug: log what we're about to create
102
+ if (req.payload.config.debug && 'title' in createData) {
103
+ req.payload.logger.info({
104
+ msg: 'Creating document',
105
+ title: createData.title,
106
+ titleIsNull: createData.title === null,
107
+ titleType: typeof createData.title
108
+ });
109
+ }
110
+ // Check if we have multi-locale data and extract it
111
+ const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(createData, configuredLocales);
112
+ if (hasMultiLocale) {
113
+ // Create with default locale data
114
+ processedDoc = await req.payload.create({
115
+ collection: collectionSlug,
116
+ data: flatData,
117
+ draft: draftOption,
118
+ overrideAccess: false,
119
+ req,
120
+ user
121
+ });
122
+ // Update for other locales
123
+ if (processedDoc && Object.keys(localeUpdates).length > 0) {
124
+ for (const [locale, localeData] of Object.entries(localeUpdates)){
125
+ try {
126
+ const localeReq = {
127
+ ...req,
128
+ locale
129
+ };
130
+ await req.payload.update({
131
+ id: processedDoc.id,
132
+ collection: collectionSlug,
133
+ data: localeData,
134
+ draft: collectionHasVersions ? false : undefined,
135
+ overrideAccess: false,
136
+ req: localeReq,
137
+ user
138
+ });
139
+ } catch (error) {
140
+ // Log but don't fail the entire import if a locale update fails
141
+ req.payload.logger.error({
142
+ err: error,
143
+ msg: `Failed to update locale ${locale} for document ${String(processedDoc.id)}`
144
+ });
145
+ }
146
+ }
147
+ }
148
+ } else {
149
+ // No multi-locale data, create normally
150
+ processedDoc = await req.payload.create({
151
+ collection: collectionSlug,
152
+ data: createData,
153
+ draft: draftOption,
154
+ overrideAccess: false,
155
+ req,
156
+ user
157
+ });
158
+ }
159
+ } else if (importMode === 'update' || importMode === 'upsert') {
160
+ const matchValue = document[matchField || 'id'];
161
+ if (!matchValue) {
162
+ throw new Error(`Match field "${matchField || 'id'}" not found in document`);
163
+ }
164
+ // Special handling for ID field with MongoDB
165
+ // If matching by 'id' and it's not a valid ObjectID format, handle specially
166
+ const isMatchingById = (matchField || 'id') === 'id';
167
+ // Check if it's a valid MongoDB ObjectID format (24 hex chars)
168
+ // Note: matchValue could be string, number, or ObjectID object
169
+ let matchValueStr;
170
+ if (typeof matchValue === 'object' && matchValue !== null) {
171
+ matchValueStr = JSON.stringify(matchValue);
172
+ } else if (typeof matchValue === 'string') {
173
+ matchValueStr = matchValue;
174
+ } else if (typeof matchValue === 'number') {
175
+ matchValueStr = matchValue.toString();
176
+ } else {
177
+ // For other types, use JSON.stringify
178
+ matchValueStr = JSON.stringify(matchValue);
179
+ }
180
+ const isValidObjectIdFormat = /^[0-9a-f]{24}$/i.test(matchValueStr);
181
+ // Try to search normally first, catch errors for invalid IDs
182
+ try {
183
+ existing = await req.payload.find({
184
+ collection: collectionSlug,
185
+ depth: 0,
186
+ limit: 1,
187
+ overrideAccess: false,
188
+ req,
189
+ user,
190
+ where: {
191
+ [matchField || 'id']: {
192
+ equals: matchValue
193
+ }
194
+ }
195
+ });
196
+ } catch (error) {
197
+ // If we get an error when searching by ID (e.g., invalid ObjectID format)
198
+ // and we're in upsert mode, treat as non-existent
199
+ if (isMatchingById && importMode === 'upsert' && !isValidObjectIdFormat) {
200
+ existing = {
201
+ docs: []
202
+ };
203
+ } else if (isMatchingById && importMode === 'update' && !isValidObjectIdFormat) {
204
+ // For update mode with invalid ID, this should fail
205
+ throw new Error(`Invalid ID format for update: ${matchValueStr}`);
206
+ } else {
207
+ // Re-throw other errors
208
+ throw error;
209
+ }
210
+ }
211
+ if (existing.docs.length > 0) {
212
+ // Update existing
213
+ const existingDoc = existing.docs[0];
214
+ if (!existingDoc) {
215
+ throw new Error(`Document not found`);
216
+ }
217
+ // Debug: log what we found
218
+ if (req.payload.config.debug) {
219
+ req.payload.logger.info({
220
+ existingId: existingDoc.id,
221
+ existingStatus: existingDoc._status,
222
+ existingTitle: existingDoc.title,
223
+ incomingDocument: document,
224
+ mode: importMode,
225
+ msg: 'Found existing document for update'
226
+ });
227
+ }
228
+ const updateData = {
229
+ ...document
230
+ };
231
+ // Remove ID and internal fields from update data
232
+ delete updateData.id;
233
+ delete updateData._id;
234
+ delete updateData.createdAt;
235
+ delete updateData.updatedAt;
236
+ // Check if we have multi-locale data and extract it
237
+ const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(updateData, configuredLocales);
238
+ if (req.payload.config.debug) {
239
+ req.payload.logger.info({
240
+ existingId: existingDoc.id,
241
+ hasMultiLocale,
242
+ mode: importMode,
243
+ msg: 'Updating document in upsert/update mode',
244
+ updateData: Object.keys(hasMultiLocale ? flatData : updateData).reduce((acc, key)=>{
245
+ const val = (hasMultiLocale ? flatData : updateData)[key];
246
+ acc[key] = typeof val === 'string' && val.length > 50 ? val.substring(0, 50) + '...' : val;
247
+ return acc;
248
+ }, {})
249
+ });
250
+ }
251
+ if (hasMultiLocale) {
252
+ // Update with default locale data
253
+ processedDoc = await req.payload.update({
254
+ id: existingDoc.id,
255
+ collection: collectionSlug,
256
+ data: flatData,
257
+ depth: 0,
258
+ // Don't specify draft - this creates a new draft for versioned collections
259
+ overrideAccess: false,
260
+ req,
261
+ user
262
+ });
263
+ // Update for other locales
264
+ if (processedDoc && Object.keys(localeUpdates).length > 0) {
265
+ for (const [locale, localeData] of Object.entries(localeUpdates)){
266
+ try {
267
+ // Clone the request with the specific locale
268
+ const localeReq = {
269
+ ...req,
270
+ locale
271
+ };
272
+ await req.payload.update({
273
+ id: existingDoc.id,
274
+ collection: collectionSlug,
275
+ data: localeData,
276
+ depth: 0,
277
+ // Don't specify draft - this creates a new draft for versioned collections
278
+ overrideAccess: false,
279
+ req: localeReq,
280
+ user
281
+ });
282
+ } catch (error) {
283
+ // Log but don't fail the entire import if a locale update fails
284
+ req.payload.logger.error({
285
+ err: error,
286
+ msg: `Failed to update locale ${locale} for document ${String(existingDoc.id)}`
287
+ });
288
+ }
289
+ }
290
+ }
291
+ } else {
292
+ // No multi-locale data, update normally
293
+ try {
294
+ // Extra debug: log before update
295
+ if (req.payload.config.debug) {
296
+ req.payload.logger.info({
297
+ existingId: existingDoc.id,
298
+ existingTitle: existingDoc.title,
299
+ msg: 'About to update document',
300
+ newData: updateData
301
+ });
302
+ }
303
+ // Update the document - don't specify draft to let Payload handle versions properly
304
+ // This will create a new draft version for collections with versions enabled
305
+ processedDoc = await req.payload.update({
306
+ id: existingDoc.id,
307
+ collection: collectionSlug,
308
+ data: updateData,
309
+ depth: 0,
310
+ // Don't specify draft - this creates a new draft for versioned collections
311
+ overrideAccess: false,
312
+ req,
313
+ user
314
+ });
315
+ // Debug: log what was returned
316
+ if (req.payload.config.debug && processedDoc) {
317
+ req.payload.logger.info({
318
+ id: processedDoc.id,
319
+ msg: 'Update completed',
320
+ status: processedDoc._status,
321
+ title: processedDoc.title
322
+ });
323
+ }
324
+ } catch (updateError) {
325
+ req.payload.logger.error({
326
+ id: existingDoc.id,
327
+ err: updateError,
328
+ msg: 'Update failed'
329
+ });
330
+ throw updateError;
331
+ }
332
+ }
333
+ } else if (importMode === 'upsert') {
334
+ // Create new in upsert mode
335
+ if (req.payload.config.debug) {
336
+ req.payload.logger.info({
337
+ document,
338
+ matchField: matchField || 'id',
339
+ matchValue: document[matchField || 'id'],
340
+ msg: 'No existing document found, creating new in upsert mode'
341
+ });
342
+ }
343
+ const createData = {
344
+ ...document
345
+ };
346
+ delete createData.id;
347
+ // Only handle _status for versioned collections
348
+ let draftOption;
349
+ if (collectionHasVersions) {
350
+ // Use defaultVersionStatus from config if _status not provided
351
+ const statusValue = createData._status || options.defaultVersionStatus;
352
+ const isPublished = statusValue !== 'draft';
353
+ draftOption = !isPublished;
354
+ delete createData._status; // Remove _status from data - it's controlled via draft option
355
+ }
356
+ // Check if we have multi-locale data and extract it
357
+ const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(createData, configuredLocales);
358
+ if (hasMultiLocale) {
359
+ // Create with default locale data
360
+ processedDoc = await req.payload.create({
361
+ collection: collectionSlug,
362
+ data: flatData,
363
+ draft: draftOption,
364
+ overrideAccess: false,
365
+ req,
366
+ user
367
+ });
368
+ // Update for other locales
369
+ if (processedDoc && Object.keys(localeUpdates).length > 0) {
370
+ for (const [locale, localeData] of Object.entries(localeUpdates)){
371
+ try {
372
+ // Clone the request with the specific locale
373
+ const localeReq = {
374
+ ...req,
375
+ locale
376
+ };
377
+ await req.payload.update({
378
+ id: processedDoc.id,
379
+ collection: collectionSlug,
380
+ data: localeData,
381
+ draft: collectionHasVersions ? false : undefined,
382
+ overrideAccess: false,
383
+ req: localeReq
384
+ });
385
+ } catch (error) {
386
+ // Log but don't fail the entire import if a locale update fails
387
+ req.payload.logger.error({
388
+ err: error,
389
+ msg: `Failed to update locale ${locale} for document ${String(processedDoc.id)}`
390
+ });
391
+ }
392
+ }
393
+ }
394
+ } else {
395
+ // No multi-locale data, create normally
396
+ processedDoc = await req.payload.create({
397
+ collection: collectionSlug,
398
+ data: createData,
399
+ draft: draftOption,
400
+ overrideAccess: false,
401
+ req,
402
+ user
403
+ });
404
+ }
405
+ } else {
406
+ // Update mode but document not found
407
+ let matchValueDisplay;
408
+ if (typeof matchValue === 'object' && matchValue !== null) {
409
+ matchValueDisplay = JSON.stringify(matchValue);
410
+ } else if (typeof matchValue === 'string') {
411
+ matchValueDisplay = matchValue;
412
+ } else if (typeof matchValue === 'number') {
413
+ matchValueDisplay = matchValue.toString();
414
+ } else {
415
+ // For other types, use JSON.stringify to avoid [object Object]
416
+ matchValueDisplay = JSON.stringify(matchValue);
417
+ }
418
+ throw new Error(`Document with ${matchField || 'id'}="${matchValueDisplay}" not found`);
419
+ }
420
+ } else {
421
+ throw new Error(`Unknown import mode: ${String(importMode)}`);
422
+ }
423
+ if (processedDoc) {
424
+ // Determine operation type for proper counting
425
+ let operation;
426
+ if (importMode === 'create') {
427
+ operation = 'created';
428
+ } else if (importMode === 'update') {
429
+ operation = 'updated';
430
+ } else if (importMode === 'upsert') {
431
+ // In upsert mode, check if we found an existing document
432
+ if (existing && existing.docs.length > 0) {
433
+ operation = 'updated';
434
+ } else {
435
+ operation = 'created';
436
+ }
437
+ }
438
+ result.successful.push({
439
+ document,
440
+ index: rowNumber - 1,
441
+ operation,
442
+ result: processedDoc
443
+ });
444
+ }
445
+ } catch (error) {
446
+ const importError = {
447
+ type: categorizeError(error),
448
+ documentData: document || {},
449
+ error: extractErrorMessage(error),
450
+ item: document || {},
451
+ itemIndex: rowNumber - 1,
452
+ rowNumber
453
+ };
454
+ // Try to extract field information from validation errors
455
+ if (error && typeof error === 'object' && 'data' in error) {
456
+ const errorData = error;
457
+ if (errorData.data?.errors && Array.isArray(errorData.data.errors)) {
458
+ const firstError = errorData.data.errors[0];
459
+ if (firstError?.path) {
460
+ importError.field = firstError.path;
461
+ }
462
+ }
463
+ }
464
+ result.failed.push(importError);
465
+ // Always continue processing all rows
466
+ }
467
+ }
468
+ return result;
469
+ }
470
+ export function createImportBatchProcessor(options = {}) {
471
+ const processorOptions = {
472
+ batchSize: options.batchSize ?? 100,
473
+ defaultVersionStatus: options.defaultVersionStatus ?? 'published'
474
+ };
475
+ const processImport = async (processOptions)=>{
476
+ const { collectionSlug, documents, importMode, matchField, req, user } = processOptions;
477
+ const batches = createBatches(documents, processorOptions.batchSize);
478
+ const result = {
479
+ errors: [],
480
+ imported: 0,
481
+ total: documents.length,
482
+ updated: 0
483
+ };
484
+ for(let i = 0; i < batches.length; i++){
485
+ const currentBatch = batches[i];
486
+ if (!currentBatch) {
487
+ continue;
488
+ }
489
+ const batchResult = await processImportBatch({
490
+ batch: currentBatch,
491
+ batchIndex: i,
492
+ collectionSlug,
493
+ importMode,
494
+ matchField,
495
+ options: processorOptions,
496
+ req,
497
+ user
498
+ });
499
+ // Update results
500
+ for (const success of batchResult.successful){
501
+ if (success.operation === 'created') {
502
+ result.imported++;
503
+ } else if (success.operation === 'updated') {
504
+ result.updated++;
505
+ } else {
506
+ // Fallback
507
+ if (importMode === 'create') {
508
+ result.imported++;
509
+ } else {
510
+ result.updated++;
511
+ }
512
+ }
513
+ }
514
+ for (const error of batchResult.failed){
515
+ result.errors.push({
516
+ doc: error.documentData,
517
+ error: error.error,
518
+ index: error.rowNumber - 1
519
+ });
520
+ }
521
+ }
522
+ return result;
523
+ };
524
+ return {
525
+ processImport
526
+ };
527
+ }
528
+
529
+ //# sourceMappingURL=batchProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/import/batchProcessor.ts"],"sourcesContent":["import type { PayloadRequest, TypedUser } from 'payload'\n\nimport type { ImportMode, ImportResult } 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 documents: Record<string, unknown>[]\n importMode: ImportMode\n matchField?: string\n req: PayloadRequest\n user?: TypedUser\n}\n\n// Helper function to handle multi-locale data\nfunction extractMultiLocaleData(\n data: Record<string, unknown>,\n configuredLocales?: 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 no locales configured, skip multi-locale processing\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 // Check if this object has keys matching configured locales\n const localeKeys = Object.keys(valueObj).filter((k) => localeSet.has(k))\n if (localeKeys.length > 0) {\n hasMultiLocale = true\n // This is a localized field with explicit locale keys\n // Use the first locale for initial creation, then update others\n const firstLocale = localeKeys[0]\n if (firstLocale) {\n flatData[key] = valueObj[firstLocale]\n // Store other locales for later update\n for (const locale of localeKeys) {\n if (locale !== firstLocale) {\n if (!localeUpdates[locale]) {\n localeUpdates[locale] = {}\n }\n localeUpdates[locale][key] = valueObj[locale]\n }\n }\n }\n } else {\n // Not locale data, keep as is\n flatData[key] = value\n }\n } else {\n // Not an object, keep as is. this includes localized fields without locale suffix; ie default locale\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\nasync function processImportBatch({\n batch,\n batchIndex,\n collectionSlug,\n importMode,\n matchField,\n options,\n req,\n user,\n}: ProcessImportBatchOptions): Promise<ImportBatchResult> {\n const result: ImportBatchResult = {\n failed: [],\n successful: [],\n }\n\n // Check if the collection has versions enabled\n const collectionConfig = req.payload.collections[collectionSlug]?.config\n const collectionHasVersions = Boolean(collectionConfig?.versions)\n\n // Get configured locales for multi-locale data detection\n const configuredLocales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : undefined\n\n // Calculate the starting row number for this batch\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 processedDoc: Record<string, unknown> | undefined\n let existing: { docs: Array<Record<string, unknown>> } | undefined\n\n if (importMode === 'create') {\n // Remove ID field when creating new document\n const createData = { ...document }\n delete createData.id\n\n // Only handle _status for versioned collections\n let draftOption: boolean | undefined\n if (collectionHasVersions) {\n // Check if _status is set - use defaultVersionStatus from config\n // If no _status field provided, use the configured default\n const statusValue = createData._status || options.defaultVersionStatus\n const isPublished = statusValue !== 'draft'\n draftOption = !isPublished\n\n // Debug: log status handling\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 delete createData._status // Remove _status from data - it's controlled via draft option\n }\n\n // Debug: log what we're about to create\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 )\n\n if (hasMultiLocale) {\n // Create with default locale data\n processedDoc = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n\n // Update for other locales\n if (processedDoc && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n const localeReq = { ...req, locale }\n await req.payload.update({\n id: processedDoc.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: localeReq,\n user,\n })\n } catch (error) {\n // Log but don't fail the entire import if a locale update fails\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(processedDoc.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n processedDoc = 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 to search normally first, catch errors for invalid IDs\n try {\n existing = 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 // If we get an error when searching by ID (e.g., invalid ObjectID format)\n // and we're in upsert mode, treat as non-existent\n if (isMatchingById && importMode === 'upsert' && !isValidObjectIdFormat) {\n existing = { docs: [] }\n } else if (isMatchingById && importMode === 'update' && !isValidObjectIdFormat) {\n // For update mode with invalid ID, this should fail\n throw new Error(`Invalid ID format for update: ${matchValueStr}`)\n } else {\n // Re-throw other errors\n throw error\n }\n }\n\n if (existing.docs.length > 0) {\n // Update existing\n const existingDoc = existing.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 )\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 processedDoc = 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,\n user,\n })\n\n // Update for other locales\n if (processedDoc && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n // Clone the request with the specific locale\n const localeReq = { ...req, locale }\n await req.payload.update({\n id: existingDoc.id as number | string,\n collection: collectionSlug,\n data: localeData,\n depth: 0,\n // Don't specify draft - this creates a new draft for versioned collections\n overrideAccess: false,\n req: localeReq,\n user,\n })\n } catch (error) {\n // Log but don't fail the entire import if a locale update fails\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 processedDoc = 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 // Debug: log what was returned\n if (req.payload.config.debug && processedDoc) {\n req.payload.logger.info({\n id: processedDoc.id,\n msg: 'Update completed',\n status: processedDoc._status,\n title: processedDoc.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 delete createData.id\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 delete createData._status // Remove _status from data - it's controlled via draft option\n }\n\n // Check if we have multi-locale data and extract it\n const { flatData, hasMultiLocale, localeUpdates } = extractMultiLocaleData(\n createData,\n configuredLocales,\n )\n\n if (hasMultiLocale) {\n // Create with default locale data\n processedDoc = await req.payload.create({\n collection: collectionSlug,\n data: flatData,\n draft: draftOption,\n overrideAccess: false,\n req,\n user,\n })\n\n // Update for other locales\n if (processedDoc && Object.keys(localeUpdates).length > 0) {\n for (const [locale, localeData] of Object.entries(localeUpdates)) {\n try {\n // Clone the request with the specific locale\n const localeReq = { ...req, locale }\n await req.payload.update({\n id: processedDoc.id as number | string,\n collection: collectionSlug,\n data: localeData,\n draft: collectionHasVersions ? false : undefined,\n overrideAccess: false,\n req: localeReq,\n })\n } catch (error) {\n // Log but don't fail the entire import if a locale update fails\n req.payload.logger.error({\n err: error,\n msg: `Failed to update locale ${locale} for document ${String(processedDoc.id)}`,\n })\n }\n }\n }\n } else {\n // No multi-locale data, create normally\n processedDoc = 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 (processedDoc) {\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 // In upsert mode, check if we found an existing document\n if (existing && existing.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: processedDoc,\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 { collectionSlug, documents, importMode, matchField, req, user } = processOptions\n const batches = createBatches(documents, processorOptions.batchSize)\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 batchResult = await processImportBatch({\n batch: currentBatch,\n batchIndex: i,\n collectionSlug,\n importMode,\n matchField,\n options: processorOptions,\n req,\n user,\n })\n\n // Update results\n for (const success of batchResult.successful) {\n if (success.operation === 'created') {\n result.imported++\n } else if (success.operation === 'updated') {\n result.updated++\n } else {\n // Fallback\n if (importMode === 'create') {\n result.imported++\n } else {\n result.updated++\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\n return result\n }\n\n return {\n processImport,\n }\n}\n"],"names":["categorizeError","createBatches","extractErrorMessage","extractMultiLocaleData","data","configuredLocales","flatData","localeUpdates","hasMultiLocale","length","localeSet","Set","key","value","Object","entries","Array","isArray","valueObj","localeKeys","keys","filter","k","has","firstLocale","locale","processImportBatch","batch","batchIndex","collectionSlug","importMode","matchField","options","req","user","result","failed","successful","collectionConfig","payload","collections","config","collectionHasVersions","Boolean","versions","localization","localeCodes","undefined","startingRowNumber","batchSize","i","document","rowNumber","processedDoc","existing","createData","id","draftOption","statusValue","_status","defaultVersionStatus","isPublished","debug","logger","info","msg","willSetDraft","title","titleIsNull","titleType","create","collection","draft","overrideAccess","localeData","localeReq","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","batches","imported","total","updated","currentBatch","batchResult","success","doc"],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { PayloadRequest } from 'payload';
2
+ export type ImportMode = 'create' | 'update' | 'upsert';
3
+ export type Import = {
4
+ /**
5
+ * Number of documents to process in each batch during import
6
+ * @default 100
7
+ */
8
+ batchSize?: number;
9
+ collectionSlug: string;
10
+ /**
11
+ * If true, enabled debug logging
12
+ */
13
+ debug?: boolean;
14
+ file?: {
15
+ data: Buffer;
16
+ mimetype: string;
17
+ name: string;
18
+ };
19
+ format: 'csv' | 'json';
20
+ id?: number | string;
21
+ /**
22
+ * Import mode: create, update or upset
23
+ */
24
+ importMode: ImportMode;
25
+ matchField?: string;
26
+ name: string;
27
+ userCollection?: string;
28
+ userID?: number | string;
29
+ };
30
+ export type CreateImportArgs = {
31
+ defaultVersionStatus?: 'draft' | 'published';
32
+ req: PayloadRequest;
33
+ } & Import;
34
+ export type ImportResult = {
35
+ errors: Array<{
36
+ doc: Record<string, unknown>;
37
+ error: string;
38
+ index: number;
39
+ }>;
40
+ imported: number;
41
+ total: number;
42
+ updated: number;
43
+ };
44
+ export declare const createImport: ({ batchSize, collectionSlug, debug, defaultVersionStatus, file, format, importMode, matchField, req, userCollection, userID, }: CreateImportArgs) => Promise<ImportResult>;
45
+ //# sourceMappingURL=createImport.d.ts.map
@@ -0,0 +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;AAWxD,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,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,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC5B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;IACF,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,YAAY,mIAYtB,gBAAgB,KAAG,OAAO,CAAC,YAAY,CA+LzC,CAAA"}