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

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 (298) 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/handleDownload.js +42 -0
  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 +11 -0
  239. package/dist/utilities/flattenObject.d.ts.map +1 -0
  240. package/dist/utilities/flattenObject.js +129 -0
  241. package/dist/utilities/flattenObject.js.map +1 -0
  242. package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
  243. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
  244. package/dist/utilities/getExportFieldFunctions.js +102 -0
  245. package/dist/utilities/getExportFieldFunctions.js.map +1 -0
  246. package/dist/utilities/getFilename.d.ts +6 -0
  247. package/dist/utilities/getFilename.d.ts.map +1 -0
  248. package/dist/utilities/getFilename.js +13 -0
  249. package/dist/utilities/getFilename.js.map +1 -0
  250. package/dist/utilities/getFlattenedFieldKeys.d.ts +12 -1
  251. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
  252. package/dist/utilities/getFlattenedFieldKeys.js +35 -10
  253. package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
  254. package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
  255. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
  256. package/dist/utilities/getImportFieldFunctions.js +130 -0
  257. package/dist/utilities/getImportFieldFunctions.js.map +1 -0
  258. package/dist/utilities/getPluginCollections.d.ts +39 -0
  259. package/dist/utilities/getPluginCollections.d.ts.map +1 -0
  260. package/dist/utilities/getPluginCollections.js +102 -0
  261. package/dist/utilities/getPluginCollections.js.map +1 -0
  262. package/dist/utilities/getSchemaColumns.d.ts +43 -0
  263. package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
  264. package/dist/utilities/getSchemaColumns.js +163 -0
  265. package/dist/utilities/getSchemaColumns.js.map +1 -0
  266. package/dist/utilities/getSelect.d.ts +11 -0
  267. package/dist/utilities/getSelect.d.ts.map +1 -0
  268. package/dist/utilities/getSelect.js +27 -0
  269. package/dist/utilities/getSelect.js.map +1 -0
  270. package/dist/utilities/parseCSV.d.ts +11 -0
  271. package/dist/utilities/parseCSV.d.ts.map +1 -0
  272. package/dist/utilities/parseCSV.js +67 -0
  273. package/dist/utilities/parseCSV.js.map +1 -0
  274. package/dist/utilities/parseCSV.spec.js +169 -0
  275. package/dist/utilities/parseCSV.spec.js.map +1 -0
  276. package/dist/utilities/parseJSON.d.ts +11 -0
  277. package/dist/utilities/parseJSON.d.ts.map +1 -0
  278. package/dist/utilities/parseJSON.js +25 -0
  279. package/dist/utilities/parseJSON.js.map +1 -0
  280. package/dist/utilities/processRichTextField.d.ts +6 -0
  281. package/dist/utilities/processRichTextField.d.ts.map +1 -0
  282. package/dist/utilities/processRichTextField.js +45 -0
  283. package/dist/utilities/processRichTextField.js.map +1 -0
  284. package/dist/utilities/unflattenObject.d.ts +11 -0
  285. package/dist/utilities/unflattenObject.d.ts.map +1 -0
  286. package/dist/utilities/unflattenObject.js +431 -0
  287. package/dist/utilities/unflattenObject.js.map +1 -0
  288. package/dist/utilities/unflattenObject.spec.js +680 -0
  289. package/dist/utilities/unflattenObject.spec.js.map +1 -0
  290. package/dist/utilities/useBatchProcessor.d.ts +103 -0
  291. package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
  292. package/dist/utilities/useBatchProcessor.js +88 -0
  293. package/dist/utilities/useBatchProcessor.js.map +1 -0
  294. package/dist/utilities/validateLimitValue.d.ts +1 -1
  295. package/dist/utilities/validateLimitValue.d.ts.map +1 -1
  296. package/dist/utilities/validateLimitValue.js +1 -4
  297. package/dist/utilities/validateLimitValue.js.map +1 -1
  298. package/package.json +9 -9
@@ -0,0 +1,129 @@
1
+ export const flattenObject = ({ doc, fields, prefix, toCSVFunctions })=>{
2
+ const row = {};
3
+ // Helper to get toCSV function by full path or base field name
4
+ // This allows functions registered for field names (e.g., 'richText') to work
5
+ // even when the field is nested in arrays/blocks (e.g., 'blocks_0_content_richText')
6
+ const getToCSVFunction = (fullPath, baseFieldName)=>{
7
+ return toCSVFunctions?.[fullPath] ?? toCSVFunctions?.[baseFieldName];
8
+ };
9
+ const flatten = (siblingDoc, prefix)=>{
10
+ Object.entries(siblingDoc).forEach(([key, value])=>{
11
+ const newKey = prefix ? `${prefix}_${key}` : key;
12
+ const toCSVFn = getToCSVFunction(newKey, key);
13
+ if (Array.isArray(value)) {
14
+ // If a custom toCSV function exists for this array field, run it first.
15
+ // If it produces output, skip per-item handling; otherwise, fall back.
16
+ if (toCSVFn) {
17
+ try {
18
+ const result = toCSVFn({
19
+ columnName: newKey,
20
+ data: row,
21
+ doc,
22
+ row,
23
+ siblingDoc,
24
+ value
25
+ });
26
+ if (typeof result !== 'undefined') {
27
+ // Custom function returned a single value for this array field.
28
+ row[newKey] = result;
29
+ return;
30
+ }
31
+ // If the custom function wrote any keys for this field, consider it handled.
32
+ for(const k in row){
33
+ if (k === newKey || k.startsWith(`${newKey}_`)) {
34
+ return;
35
+ }
36
+ }
37
+ // Otherwise, fall through to per-item handling.
38
+ } catch (error) {
39
+ throw new Error(`Error in toCSVFunction for array "${newKey}": ${JSON.stringify(value)}\n${error.message}`);
40
+ }
41
+ }
42
+ value.forEach((item, index)=>{
43
+ if (typeof item === 'object' && item !== null) {
44
+ const blockType = typeof item.blockType === 'string' ? item.blockType : undefined;
45
+ const itemPrefix = blockType ? `${newKey}_${index}_${blockType}` : `${newKey}_${index}`;
46
+ // Case: hasMany polymorphic relationships
47
+ if ('relationTo' in item && 'value' in item && typeof item.value === 'object' && item.value !== null) {
48
+ row[`${itemPrefix}_relationTo`] = item.relationTo;
49
+ row[`${itemPrefix}_id`] = item.value.id;
50
+ return;
51
+ }
52
+ // Fallback: deep-flatten nested objects
53
+ flatten(item, itemPrefix);
54
+ } else {
55
+ // Primitive array item.
56
+ row[`${newKey}_${index}`] = item;
57
+ }
58
+ });
59
+ } else if (typeof value === 'object' && value !== null) {
60
+ // Object field: use custom toCSV if present, else recurse.
61
+ if (!toCSVFn) {
62
+ flatten(value, newKey);
63
+ } else {
64
+ try {
65
+ const result = toCSVFn({
66
+ columnName: newKey,
67
+ data: row,
68
+ doc,
69
+ row,
70
+ siblingDoc,
71
+ value
72
+ });
73
+ if (typeof result !== 'undefined') {
74
+ row[newKey] = result;
75
+ }
76
+ } catch (error) {
77
+ throw new Error(`Error in toCSVFunction for nested object "${newKey}": ${JSON.stringify(value)}\n${error.message}`);
78
+ }
79
+ }
80
+ } else {
81
+ if (toCSVFn) {
82
+ try {
83
+ const result = toCSVFn({
84
+ columnName: newKey,
85
+ data: row,
86
+ doc,
87
+ row,
88
+ siblingDoc,
89
+ value
90
+ });
91
+ if (typeof result !== 'undefined') {
92
+ row[newKey] = result;
93
+ }
94
+ } catch (error) {
95
+ throw new Error(`Error in toCSVFunction for field "${newKey}": ${JSON.stringify(value)}\n${error.message}`);
96
+ }
97
+ } else {
98
+ row[newKey] = value;
99
+ }
100
+ }
101
+ });
102
+ };
103
+ flatten(doc, prefix);
104
+ if (Array.isArray(fields) && fields.length > 0) {
105
+ const orderedResult = {};
106
+ const fieldToRegex = (field)=>{
107
+ const parts = field.split('.').map((part)=>`${part}(?:_\\d+)?`);
108
+ const pattern = `^${parts.join('_')}`;
109
+ return new RegExp(pattern);
110
+ };
111
+ fields.forEach((field)=>{
112
+ if (row[field.replace(/\./g, '_')]) {
113
+ const sanitizedField = field.replace(/\./g, '_');
114
+ orderedResult[sanitizedField] = row[sanitizedField];
115
+ } else {
116
+ const regex = fieldToRegex(field);
117
+ Object.keys(row).forEach((key)=>{
118
+ if (regex.test(key)) {
119
+ orderedResult[key] = row[key];
120
+ }
121
+ });
122
+ }
123
+ });
124
+ return orderedResult;
125
+ }
126
+ return row;
127
+ };
128
+
129
+ //# sourceMappingURL=flattenObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/flattenObject.ts"],"sourcesContent":["import type { Document } from 'payload'\n\nimport type { ToCSVFunction } from '../types.js'\n\ntype Args = {\n doc: Document\n fields?: string[]\n prefix?: string\n toCSVFunctions: Record<string, ToCSVFunction>\n}\n\nexport const flattenObject = ({\n doc,\n fields,\n prefix,\n toCSVFunctions,\n}: Args): Record<string, unknown> => {\n const row: Record<string, unknown> = {}\n\n // Helper to get toCSV function by full path or base field name\n // This allows functions registered for field names (e.g., 'richText') to work\n // even when the field is nested in arrays/blocks (e.g., 'blocks_0_content_richText')\n const getToCSVFunction = (fullPath: string, baseFieldName: string): ToCSVFunction | undefined => {\n return toCSVFunctions?.[fullPath] ?? toCSVFunctions?.[baseFieldName]\n }\n\n const flatten = (siblingDoc: Document, prefix?: string) => {\n Object.entries(siblingDoc).forEach(([key, value]) => {\n const newKey = prefix ? `${prefix}_${key}` : key\n const toCSVFn = getToCSVFunction(newKey, key)\n\n if (Array.isArray(value)) {\n // If a custom toCSV function exists for this array field, run it first.\n // If it produces output, skip per-item handling; otherwise, fall back.\n if (toCSVFn) {\n try {\n const result = toCSVFn({\n columnName: newKey,\n data: row,\n doc,\n row,\n siblingDoc,\n value, // whole array\n })\n\n if (typeof result !== 'undefined') {\n // Custom function returned a single value for this array field.\n row[newKey] = result\n return\n }\n\n // If the custom function wrote any keys for this field, consider it handled.\n for (const k in row) {\n if (k === newKey || k.startsWith(`${newKey}_`)) {\n return\n }\n }\n // Otherwise, fall through to per-item handling.\n } catch (error) {\n throw new Error(\n `Error in toCSVFunction for array \"${newKey}\": ${JSON.stringify(value)}\\n${\n (error as Error).message\n }`,\n )\n }\n }\n\n value.forEach((item, index) => {\n if (typeof item === 'object' && item !== null) {\n const blockType = typeof item.blockType === 'string' ? item.blockType : undefined\n const itemPrefix = blockType ? `${newKey}_${index}_${blockType}` : `${newKey}_${index}`\n\n // Case: hasMany polymorphic relationships\n if (\n 'relationTo' in item &&\n 'value' in item &&\n typeof item.value === 'object' &&\n item.value !== null\n ) {\n row[`${itemPrefix}_relationTo`] = item.relationTo\n row[`${itemPrefix}_id`] = item.value.id\n return\n }\n\n // Fallback: deep-flatten nested objects\n flatten(item, itemPrefix)\n } else {\n // Primitive array item.\n row[`${newKey}_${index}`] = item\n }\n })\n } else if (typeof value === 'object' && value !== null) {\n // Object field: use custom toCSV if present, else recurse.\n if (!toCSVFn) {\n flatten(value, newKey)\n } else {\n try {\n const result = toCSVFn({\n columnName: newKey,\n data: row,\n doc,\n row,\n siblingDoc,\n value,\n })\n if (typeof result !== 'undefined') {\n row[newKey] = result\n }\n } catch (error) {\n throw new Error(\n `Error in toCSVFunction for nested object \"${newKey}\": ${JSON.stringify(value)}\\n${\n (error as Error).message\n }`,\n )\n }\n }\n } else {\n if (toCSVFn) {\n try {\n const result = toCSVFn({\n columnName: newKey,\n data: row,\n doc,\n row,\n siblingDoc,\n value,\n })\n if (typeof result !== 'undefined') {\n row[newKey] = result\n }\n } catch (error) {\n throw new Error(\n `Error in toCSVFunction for field \"${newKey}\": ${JSON.stringify(value)}\\n${\n (error as Error).message\n }`,\n )\n }\n } else {\n row[newKey] = value\n }\n }\n })\n }\n\n flatten(doc, prefix)\n\n if (Array.isArray(fields) && fields.length > 0) {\n const orderedResult: Record<string, unknown> = {}\n\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n const pattern = `^${parts.join('_')}`\n return new RegExp(pattern)\n }\n\n fields.forEach((field) => {\n if (row[field.replace(/\\./g, '_')]) {\n const sanitizedField = field.replace(/\\./g, '_')\n orderedResult[sanitizedField] = row[sanitizedField]\n } else {\n const regex = fieldToRegex(field)\n Object.keys(row).forEach((key) => {\n if (regex.test(key)) {\n orderedResult[key] = row[key]\n }\n })\n }\n })\n\n return orderedResult\n }\n\n return row\n}\n"],"names":["flattenObject","doc","fields","prefix","toCSVFunctions","row","getToCSVFunction","fullPath","baseFieldName","flatten","siblingDoc","Object","entries","forEach","key","value","newKey","toCSVFn","Array","isArray","result","columnName","data","k","startsWith","error","Error","JSON","stringify","message","item","index","blockType","undefined","itemPrefix","relationTo","id","length","orderedResult","fieldToRegex","field","parts","split","map","part","pattern","join","RegExp","replace","sanitizedField","regex","keys","test"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type FlattenedField } from 'payload';
2
+ import type { ToCSVFunction } from '../types.js';
3
+ type Args = {
4
+ fields: FlattenedField[];
5
+ };
6
+ /**
7
+ * Gets custom toCSV field functions for export.
8
+ * These functions transform field values when flattening documents for CSV export.
9
+ */
10
+ export declare const getExportFieldFunctions: ({ fields }: Args) => Record<string, ToCSVFunction>;
11
+ export {};
12
+ //# sourceMappingURL=getExportFieldFunctions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getExportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getExportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA+C,MAAM,SAAS,CAAA;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CA6GtF,CAAA"}
@@ -0,0 +1,102 @@
1
+ import { traverseFields } from 'payload';
2
+ /**
3
+ * Gets custom toCSV field functions for export.
4
+ * These functions transform field values when flattening documents for CSV export.
5
+ */ export const getExportFieldFunctions = ({ fields })=>{
6
+ const result = {};
7
+ const buildCustomFunctions = ({ field, parentRef, ref })=>{
8
+ // @ts-expect-error ref is untyped
9
+ ref.prefix = parentRef.prefix || '';
10
+ if (field.type === 'group' || field.type === 'tab') {
11
+ // @ts-expect-error ref is untyped
12
+ const parentPrefix = parentRef?.prefix ? `${parentRef.prefix}_` : '';
13
+ // @ts-expect-error ref is untyped
14
+ ref.prefix = `${parentPrefix}${field.name}_`;
15
+ }
16
+ if (typeof field.custom?.['plugin-import-export']?.toCSV === 'function') {
17
+ // @ts-expect-error ref is untyped
18
+ result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.toCSV;
19
+ } else if (field.type === 'json' || field.type === 'richText') {
20
+ // Serialize JSON and richText fields as JSON strings in a single column
21
+ // This prevents them from being flattened into multiple columns
22
+ // @ts-expect-error ref is untyped
23
+ result[`${ref.prefix}${field.name}`] = ({ value })=>{
24
+ if (value === null || value === undefined) {
25
+ return value;
26
+ }
27
+ if (typeof value === 'object') {
28
+ return JSON.stringify(value);
29
+ }
30
+ return value;
31
+ };
32
+ } else if (field.type === 'relationship' || field.type === 'upload') {
33
+ if (field.hasMany !== true) {
34
+ if (!Array.isArray(field.relationTo)) {
35
+ // monomorphic single
36
+ // @ts-expect-error ref is untyped
37
+ result[`${ref.prefix}${field.name}`] = ({ value })=>typeof value === 'object' && value && 'id' in value ? value.id : value;
38
+ } else {
39
+ // polymorphic single
40
+ // @ts-expect-error ref is untyped
41
+ result[`${ref.prefix}${field.name}`] = ({ data, value })=>{
42
+ if (value && typeof value === 'object' && 'relationTo' in value && 'value' in value) {
43
+ const relationTo = value.relationTo;
44
+ const relatedDoc = value.value;
45
+ if (relatedDoc && typeof relatedDoc === 'object') {
46
+ // @ts-expect-error ref is untyped
47
+ data[`${ref.prefix}${field.name}_id`] = relatedDoc.id;
48
+ // @ts-expect-error ref is untyped
49
+ data[`${ref.prefix}${field.name}_relationTo`] = relationTo;
50
+ }
51
+ }
52
+ return undefined // prevents further flattening
53
+ ;
54
+ };
55
+ }
56
+ } else {
57
+ if (!Array.isArray(field.relationTo)) {
58
+ // monomorphic many
59
+ // @ts-expect-error ref is untyped
60
+ result[`${ref.prefix}${field.name}`] = ({ data, value })=>{
61
+ if (Array.isArray(value)) {
62
+ value.forEach((val, i)=>{
63
+ const id = typeof val === 'object' && val ? val.id : val;
64
+ // @ts-expect-error ref is untyped
65
+ data[`${ref.prefix}${field.name}_${i}_id`] = id;
66
+ });
67
+ }
68
+ return undefined // prevents further flattening
69
+ ;
70
+ };
71
+ } else {
72
+ // polymorphic many
73
+ // @ts-expect-error ref is untyped
74
+ result[`${ref.prefix}${field.name}`] = ({ data, value })=>{
75
+ if (Array.isArray(value)) {
76
+ value.forEach((val, i)=>{
77
+ if (val && typeof val === 'object') {
78
+ const relationTo = val.relationTo;
79
+ const relatedDoc = val.value;
80
+ if (relationTo && relatedDoc && typeof relatedDoc === 'object') {
81
+ // @ts-expect-error ref is untyped
82
+ data[`${ref.prefix}${field.name}_${i}_id`] = relatedDoc.id;
83
+ // @ts-expect-error ref is untyped
84
+ data[`${ref.prefix}${field.name}_${i}_relationTo`] = relationTo;
85
+ }
86
+ }
87
+ });
88
+ }
89
+ return undefined;
90
+ };
91
+ }
92
+ }
93
+ }
94
+ };
95
+ traverseFields({
96
+ callback: buildCustomFunctions,
97
+ fields
98
+ });
99
+ return result;
100
+ };
101
+
102
+ //# sourceMappingURL=getExportFieldFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getExportFieldFunctions.ts"],"sourcesContent":["import { type FlattenedField, traverseFields, type TraverseFieldsCallback } from 'payload'\n\nimport type { ToCSVFunction } from '../types.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Gets custom toCSV field functions for export.\n * These functions transform field values when flattening documents for CSV export.\n */\nexport const getExportFieldFunctions = ({ fields }: Args): Record<string, ToCSVFunction> => {\n const result: Record<string, ToCSVFunction> = {}\n\n const buildCustomFunctions: TraverseFieldsCallback = ({ field, parentRef, ref }) => {\n // @ts-expect-error ref is untyped\n ref.prefix = parentRef.prefix || ''\n if (field.type === 'group' || field.type === 'tab') {\n // @ts-expect-error ref is untyped\n const parentPrefix = parentRef?.prefix ? `${parentRef.prefix}_` : ''\n // @ts-expect-error ref is untyped\n ref.prefix = `${parentPrefix}${field.name}_`\n }\n\n if (typeof field.custom?.['plugin-import-export']?.toCSV === 'function') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.toCSV\n } else if (field.type === 'json' || field.type === 'richText') {\n // Serialize JSON and richText fields as JSON strings in a single column\n // This prevents them from being flattened into multiple columns\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (value === null || value === undefined) {\n return value\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return value\n }\n } else if (field.type === 'relationship' || field.type === 'upload') {\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n // monomorphic single\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) =>\n typeof value === 'object' && value && 'id' in value ? value.id : value\n } else {\n // polymorphic single\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ data, value }) => {\n if (value && typeof value === 'object' && 'relationTo' in value && 'value' in value) {\n const relationTo = (value as { relationTo: string; value: { id: number | string } })\n .relationTo\n const relatedDoc = (value as { relationTo: string; value: { id: number | string } })\n .value\n if (relatedDoc && typeof relatedDoc === 'object') {\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_id`] = relatedDoc.id\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_relationTo`] = relationTo\n }\n }\n return undefined // prevents further flattening\n }\n }\n } else {\n if (!Array.isArray(field.relationTo)) {\n // monomorphic many\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({\n data,\n value,\n }: {\n data: Record<string, unknown>\n value: Array<number | Record<string, any> | string> | undefined\n }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n const id = typeof val === 'object' && val ? val.id : val\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_${i}_id`] = id\n })\n }\n return undefined // prevents further flattening\n }\n } else {\n // polymorphic many\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({\n data,\n value,\n }: {\n data: Record<string, unknown>\n value: Array<Record<string, any>> | undefined\n }) => {\n if (Array.isArray(value)) {\n value.forEach((val, i) => {\n if (val && typeof val === 'object') {\n const relationTo = val.relationTo\n const relatedDoc = val.value\n if (relationTo && relatedDoc && typeof relatedDoc === 'object') {\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_${i}_id`] = relatedDoc.id\n // @ts-expect-error ref is untyped\n data[`${ref.prefix}${field.name}_${i}_relationTo`] = relationTo\n }\n }\n })\n }\n return undefined\n }\n }\n }\n }\n }\n\n traverseFields({ callback: buildCustomFunctions, fields })\n\n return result\n}\n"],"names":["traverseFields","getExportFieldFunctions","fields","result","buildCustomFunctions","field","parentRef","ref","prefix","type","parentPrefix","name","custom","toCSV","value","undefined","JSON","stringify","hasMany","Array","isArray","relationTo","id","data","relatedDoc","forEach","val","i","callback"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generates a filename based on current date and time.
3
+ * Format: "YYYY-MM-DD HH:MM:SS"
4
+ */
5
+ export declare const getFilename: () => string;
6
+ //# sourceMappingURL=getFilename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFilename.d.ts","sourceRoot":"","sources":["../../src/utilities/getFilename.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,WAAW,cAMvB,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generates a filename based on current date and time.
3
+ * Format: "YYYY-MM-DD HH:MM:SS"
4
+ */ export const getFilename = ()=>{
5
+ const now = new Date();
6
+ const yyymmdd = now.toISOString().split('T')[0] // "YYYY-MM-DD"
7
+ ;
8
+ const hhmmss = now.toTimeString().split(' ')[0] // "HH:MM:SS"
9
+ ;
10
+ return `${yyymmdd} ${hhmmss}`;
11
+ };
12
+
13
+ //# sourceMappingURL=getFilename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getFilename.ts"],"sourcesContent":["/**\n * Generates a filename based on current date and time.\n * Format: \"YYYY-MM-DD HH:MM:SS\"\n */\nexport const getFilename = () => {\n const now = new Date()\n const yyymmdd = now.toISOString().split('T')[0] // \"YYYY-MM-DD\"\n const hhmmss = now.toTimeString().split(' ')[0] // \"HH:MM:SS\"\n\n return `${yyymmdd} ${hhmmss}`\n}\n"],"names":["getFilename","now","Date","yyymmdd","toISOString","split","hhmmss","toTimeString"],"mappings":"AAAA;;;CAGC,GACD,OAAO,MAAMA,cAAc;IACzB,MAAMC,MAAM,IAAIC;IAChB,MAAMC,UAAUF,IAAIG,WAAW,GAAGC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe;;IAC/D,MAAMC,SAASL,IAAIM,YAAY,GAAGF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa;;IAE7D,OAAO,GAAGF,QAAQ,CAAC,EAAEG,QAAQ;AAC/B,EAAC"}
@@ -8,6 +8,17 @@ type FieldWithPresentational = {
8
8
  }[];
9
9
  type: 'collapsible' | 'row' | 'tabs';
10
10
  } | FlattenedField;
11
- export declare const getFlattenedFieldKeys: (fields: FieldWithPresentational[], prefix?: string) => string[];
11
+ export type GetFlattenedFieldKeysOptions = {
12
+ /**
13
+ * When provided, localized fields will be expanded to include locale suffixes.
14
+ * e.g., 'title' (localized) -> ['title_en', 'title_es']
15
+ */
16
+ localeCodes?: string[];
17
+ };
18
+ /**
19
+ * Recursively traverses fields and generates flattened CSV column keys.
20
+ * This is schema-based - it derives columns from field definitions, not data.
21
+ */
22
+ export declare const getFlattenedFieldKeys: (fields: FieldWithPresentational[], prefix?: string, options?: GetFlattenedFieldKeysOptions) => string[];
12
23
  export {};
13
24
  //# sourceMappingURL=getFlattenedFieldKeys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getFlattenedFieldKeys.d.ts","sourceRoot":"","sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,KAAK,uBAAuB,GACxB;IACE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;IACH,IAAI,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;CACrC,GACD,cAAc,CAAA;AAElB,eAAO,MAAM,qBAAqB,WAAY,uBAAuB,EAAE,sBAAgB,MAAM,EAyE5F,CAAA"}
1
+ {"version":3,"file":"getFlattenedFieldKeys.d.ts","sourceRoot":"","sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,KAAK,uBAAuB,GACxB;IACE,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;IACH,IAAI,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;CACrC,GACD,cAAc,CAAA;AAElB,MAAM,MAAM,4BAA4B,GAAG;IACzC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,WACxB,uBAAuB,EAAE,6BAExB,4BAA4B,KACpC,MAAM,EAuGR,CAAA"}
@@ -1,39 +1,64 @@
1
- export const getFlattenedFieldKeys = (fields, prefix = '')=>{
1
+ /**
2
+ * Recursively traverses fields and generates flattened CSV column keys.
3
+ * This is schema-based - it derives columns from field definitions, not data.
4
+ */ export const getFlattenedFieldKeys = (fields, prefix = '', options = {})=>{
5
+ const { localeCodes } = options;
2
6
  const keys = [];
3
7
  fields.forEach((field)=>{
4
- const fieldHasToCSVFunction = 'custom' in field && typeof field.custom === 'object' && 'plugin-import-export' in field.custom && field.custom['plugin-import-export']?.toCSV;
8
+ // Skip disabled fields
9
+ const isDisabled = 'custom' in field && typeof field.custom === 'object' && field.custom?.['plugin-import-export']?.disabled === true;
10
+ if (isDisabled) {
11
+ return;
12
+ }
5
13
  const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined;
6
14
  const fullKey = name && prefix ? `${prefix}_${name}` : name ?? prefix;
15
+ // Check if field is localized
16
+ const isLocalized = 'localized' in field && field.localized === true;
17
+ // Helper to add keys with locale expansion if needed
18
+ const addKey = (key, fieldIsLocalized)=>{
19
+ if (fieldIsLocalized && localeCodes && localeCodes.length > 0) {
20
+ // Expand to locale-specific keys
21
+ for (const locale of localeCodes){
22
+ keys.push(`${key}_${locale}`);
23
+ }
24
+ } else {
25
+ keys.push(key);
26
+ }
27
+ };
7
28
  switch(field.type){
8
29
  case 'array':
9
30
  {
10
- const subKeys = getFlattenedFieldKeys(field.fields, `${fullKey}_0`);
31
+ const subKeys = getFlattenedFieldKeys(field.fields, `${fullKey}_0`, options);
11
32
  keys.push(...subKeys);
12
33
  break;
13
34
  }
14
35
  case 'blocks':
15
36
  {
16
37
  field.blocks.forEach((block)=>{
38
+ if (typeof block === 'string') {
39
+ return; // Skip block references
40
+ }
17
41
  const blockPrefix = `${fullKey}_0_${block.slug}`;
18
42
  keys.push(`${blockPrefix}_blockType`);
19
43
  keys.push(`${blockPrefix}_id`);
20
- keys.push(...getFlattenedFieldKeys(block.fields, blockPrefix));
44
+ keys.push(...getFlattenedFieldKeys(block.flattenedFields ?? block.fields, blockPrefix, options));
21
45
  });
22
46
  break;
23
47
  }
24
48
  case 'collapsible':
25
49
  case 'group':
26
50
  case 'row':
27
- keys.push(...getFlattenedFieldKeys(field.fields, fullKey));
51
+ keys.push(...getFlattenedFieldKeys(field.fields, fullKey, options));
28
52
  break;
29
53
  case 'relationship':
54
+ case 'upload':
30
55
  if (field.hasMany) {
31
56
  if (Array.isArray(field.relationTo)) {
32
57
  // hasMany polymorphic
33
58
  keys.push(`${fullKey}_0_relationTo`, `${fullKey}_0_id`);
34
59
  } else {
35
60
  // hasMany monomorphic
36
- keys.push(`${fullKey}_0_id`);
61
+ keys.push(`${fullKey}_0`);
37
62
  }
38
63
  } else {
39
64
  if (Array.isArray(field.relationTo)) {
@@ -41,25 +66,25 @@ export const getFlattenedFieldKeys = (fields, prefix = '')=>{
41
66
  keys.push(`${fullKey}_relationTo`, `${fullKey}_id`);
42
67
  } else {
43
68
  // hasOne monomorphic
44
- keys.push(fullKey);
69
+ addKey(fullKey, isLocalized);
45
70
  }
46
71
  }
47
72
  break;
48
73
  case 'tabs':
49
74
  field.tabs?.forEach((tab)=>{
50
75
  const tabPrefix = tab.name ? `${fullKey}_${tab.name}` : fullKey;
51
- keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix));
76
+ keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix, options));
52
77
  });
53
78
  break;
54
79
  default:
55
- if (!name || fieldHasToCSVFunction) {
80
+ if (!name) {
56
81
  break;
57
82
  }
58
83
  if ('hasMany' in field && field.hasMany) {
59
84
  // Push placeholder for first index
60
85
  keys.push(`${fullKey}_0`);
61
86
  } else {
62
- keys.push(fullKey);
87
+ addKey(fullKey, isLocalized);
63
88
  }
64
89
  break;
65
90
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"sourcesContent":["import { type FlattenedField } from 'payload'\n\ntype FieldWithPresentational =\n | {\n fields?: FlattenedField[]\n name?: string\n tabs?: {\n fields: FlattenedField[]\n name?: string\n }[]\n type: 'collapsible' | 'row' | 'tabs'\n }\n | FlattenedField\n\nexport const getFlattenedFieldKeys = (fields: FieldWithPresentational[], prefix = ''): string[] => {\n const keys: string[] = []\n\n fields.forEach((field) => {\n const fieldHasToCSVFunction =\n 'custom' in field &&\n typeof field.custom === 'object' &&\n 'plugin-import-export' in field.custom &&\n field.custom['plugin-import-export']?.toCSV\n\n const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined\n const fullKey = name && prefix ? `${prefix}_${name}` : (name ?? prefix)\n\n switch (field.type) {\n case 'array': {\n const subKeys = getFlattenedFieldKeys(field.fields as FlattenedField[], `${fullKey}_0`)\n keys.push(...subKeys)\n break\n }\n case 'blocks': {\n field.blocks.forEach((block) => {\n const blockPrefix = `${fullKey}_0_${block.slug}`\n keys.push(`${blockPrefix}_blockType`)\n keys.push(`${blockPrefix}_id`)\n keys.push(...getFlattenedFieldKeys(block.fields as FlattenedField[], blockPrefix))\n })\n break\n }\n case 'collapsible':\n case 'group':\n case 'row':\n keys.push(...getFlattenedFieldKeys(field.fields as FlattenedField[], fullKey))\n break\n case 'relationship':\n if (field.hasMany) {\n if (Array.isArray(field.relationTo)) {\n // hasMany polymorphic\n keys.push(`${fullKey}_0_relationTo`, `${fullKey}_0_id`)\n } else {\n // hasMany monomorphic\n keys.push(`${fullKey}_0_id`)\n }\n } else {\n if (Array.isArray(field.relationTo)) {\n // hasOne polymorphic\n keys.push(`${fullKey}_relationTo`, `${fullKey}_id`)\n } else {\n // hasOne monomorphic\n keys.push(fullKey)\n }\n }\n break\n case 'tabs':\n field.tabs?.forEach((tab) => {\n const tabPrefix = tab.name ? `${fullKey}_${tab.name}` : fullKey\n keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix))\n })\n break\n default:\n if (!name || fieldHasToCSVFunction) {\n break\n }\n if ('hasMany' in field && field.hasMany) {\n // Push placeholder for first index\n keys.push(`${fullKey}_0`)\n } else {\n keys.push(fullKey)\n }\n break\n }\n })\n\n return keys\n}\n"],"names":["getFlattenedFieldKeys","fields","prefix","keys","forEach","field","fieldHasToCSVFunction","custom","toCSV","name","undefined","fullKey","type","subKeys","push","blocks","block","blockPrefix","slug","hasMany","Array","isArray","relationTo","tabs","tab","tabPrefix"],"mappings":"AAcA,OAAO,MAAMA,wBAAwB,CAACC,QAAmCC,SAAS,EAAE;IAClF,MAAMC,OAAiB,EAAE;IAEzBF,OAAOG,OAAO,CAAC,CAACC;QACd,MAAMC,wBACJ,YAAYD,SACZ,OAAOA,MAAME,MAAM,KAAK,YACxB,0BAA0BF,MAAME,MAAM,IACtCF,MAAME,MAAM,CAAC,uBAAuB,EAAEC;QAExC,MAAMC,OAAO,UAAUJ,SAAS,OAAOA,MAAMI,IAAI,KAAK,WAAWJ,MAAMI,IAAI,GAAGC;QAC9E,MAAMC,UAAUF,QAAQP,SAAS,GAAGA,OAAO,CAAC,EAAEO,MAAM,GAAIA,QAAQP;QAEhE,OAAQG,MAAMO,IAAI;YAChB,KAAK;gBAAS;oBACZ,MAAMC,UAAUb,sBAAsBK,MAAMJ,MAAM,EAAsB,GAAGU,QAAQ,EAAE,CAAC;oBACtFR,KAAKW,IAAI,IAAID;oBACb;gBACF;YACA,KAAK;gBAAU;oBACbR,MAAMU,MAAM,CAACX,OAAO,CAAC,CAACY;wBACpB,MAAMC,cAAc,GAAGN,QAAQ,GAAG,EAAEK,MAAME,IAAI,EAAE;wBAChDf,KAAKW,IAAI,CAAC,GAAGG,YAAY,UAAU,CAAC;wBACpCd,KAAKW,IAAI,CAAC,GAAGG,YAAY,GAAG,CAAC;wBAC7Bd,KAAKW,IAAI,IAAId,sBAAsBgB,MAAMf,MAAM,EAAsBgB;oBACvE;oBACA;gBACF;YACA,KAAK;YACL,KAAK;YACL,KAAK;gBACHd,KAAKW,IAAI,IAAId,sBAAsBK,MAAMJ,MAAM,EAAsBU;gBACrE;YACF,KAAK;gBACH,IAAIN,MAAMc,OAAO,EAAE;oBACjB,IAAIC,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,GAAG;wBACnC,sBAAsB;wBACtBnB,KAAKW,IAAI,CAAC,GAAGH,QAAQ,aAAa,CAAC,EAAE,GAAGA,QAAQ,KAAK,CAAC;oBACxD,OAAO;wBACL,sBAAsB;wBACtBR,KAAKW,IAAI,CAAC,GAAGH,QAAQ,KAAK,CAAC;oBAC7B;gBACF,OAAO;oBACL,IAAIS,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,GAAG;wBACnC,qBAAqB;wBACrBnB,KAAKW,IAAI,CAAC,GAAGH,QAAQ,WAAW,CAAC,EAAE,GAAGA,QAAQ,GAAG,CAAC;oBACpD,OAAO;wBACL,qBAAqB;wBACrBR,KAAKW,IAAI,CAACH;oBACZ;gBACF;gBACA;YACF,KAAK;gBACHN,MAAMkB,IAAI,EAAEnB,QAAQ,CAACoB;oBACnB,MAAMC,YAAYD,IAAIf,IAAI,GAAG,GAAGE,QAAQ,CAAC,EAAEa,IAAIf,IAAI,EAAE,GAAGE;oBACxDR,KAAKW,IAAI,IAAId,sBAAsBwB,IAAIvB,MAAM,IAAI,EAAE,EAAEwB;gBACvD;gBACA;YACF;gBACE,IAAI,CAAChB,QAAQH,uBAAuB;oBAClC;gBACF;gBACA,IAAI,aAAaD,SAASA,MAAMc,OAAO,EAAE;oBACvC,mCAAmC;oBACnChB,KAAKW,IAAI,CAAC,GAAGH,QAAQ,EAAE,CAAC;gBAC1B,OAAO;oBACLR,KAAKW,IAAI,CAACH;gBACZ;gBACA;QACJ;IACF;IAEA,OAAOR;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getFlattenedFieldKeys.ts"],"sourcesContent":["import { type FlattenedField } from 'payload'\n\ntype FieldWithPresentational =\n | {\n fields?: FlattenedField[]\n name?: string\n tabs?: {\n fields: FlattenedField[]\n name?: string\n }[]\n type: 'collapsible' | 'row' | 'tabs'\n }\n | FlattenedField\n\nexport type GetFlattenedFieldKeysOptions = {\n /**\n * When provided, localized fields will be expanded to include locale suffixes.\n * e.g., 'title' (localized) -> ['title_en', 'title_es']\n */\n localeCodes?: string[]\n}\n\n/**\n * Recursively traverses fields and generates flattened CSV column keys.\n * This is schema-based - it derives columns from field definitions, not data.\n */\nexport const getFlattenedFieldKeys = (\n fields: FieldWithPresentational[],\n prefix = '',\n options: GetFlattenedFieldKeysOptions = {},\n): string[] => {\n const { localeCodes } = options\n const keys: string[] = []\n\n fields.forEach((field) => {\n // Skip disabled fields\n const isDisabled =\n 'custom' in field &&\n typeof field.custom === 'object' &&\n field.custom?.['plugin-import-export']?.disabled === true\n\n if (isDisabled) {\n return\n }\n\n const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined\n const fullKey = name && prefix ? `${prefix}_${name}` : (name ?? prefix)\n\n // Check if field is localized\n const isLocalized = 'localized' in field && field.localized === true\n\n // Helper to add keys with locale expansion if needed\n const addKey = (key: string, fieldIsLocalized: boolean) => {\n if (fieldIsLocalized && localeCodes && localeCodes.length > 0) {\n // Expand to locale-specific keys\n for (const locale of localeCodes) {\n keys.push(`${key}_${locale}`)\n }\n } else {\n keys.push(key)\n }\n }\n\n switch (field.type) {\n case 'array': {\n const subKeys = getFlattenedFieldKeys(\n field.fields as FlattenedField[],\n `${fullKey}_0`,\n options,\n )\n keys.push(...subKeys)\n break\n }\n case 'blocks': {\n field.blocks.forEach((block) => {\n if (typeof block === 'string') {\n return // Skip block references\n }\n const blockPrefix = `${fullKey}_0_${block.slug}`\n keys.push(`${blockPrefix}_blockType`)\n keys.push(`${blockPrefix}_id`)\n keys.push(\n ...getFlattenedFieldKeys(block.flattenedFields ?? block.fields, blockPrefix, options),\n )\n })\n break\n }\n case 'collapsible':\n case 'group':\n case 'row':\n keys.push(...getFlattenedFieldKeys(field.fields as FlattenedField[], fullKey, options))\n break\n case 'relationship':\n case 'upload':\n if (field.hasMany) {\n if (Array.isArray(field.relationTo)) {\n // hasMany polymorphic\n keys.push(`${fullKey}_0_relationTo`, `${fullKey}_0_id`)\n } else {\n // hasMany monomorphic\n keys.push(`${fullKey}_0`)\n }\n } else {\n if (Array.isArray(field.relationTo)) {\n // hasOne polymorphic\n keys.push(`${fullKey}_relationTo`, `${fullKey}_id`)\n } else {\n // hasOne monomorphic\n addKey(fullKey, isLocalized)\n }\n }\n break\n case 'tabs':\n field.tabs?.forEach((tab) => {\n const tabPrefix = tab.name ? `${fullKey}_${tab.name}` : fullKey\n keys.push(...getFlattenedFieldKeys(tab.fields || [], tabPrefix, options))\n })\n break\n default:\n if (!name) {\n break\n }\n if ('hasMany' in field && field.hasMany) {\n // Push placeholder for first index\n keys.push(`${fullKey}_0`)\n } else {\n addKey(fullKey, isLocalized)\n }\n break\n }\n })\n\n return keys\n}\n"],"names":["getFlattenedFieldKeys","fields","prefix","options","localeCodes","keys","forEach","field","isDisabled","custom","disabled","name","undefined","fullKey","isLocalized","localized","addKey","key","fieldIsLocalized","length","locale","push","type","subKeys","blocks","block","blockPrefix","slug","flattenedFields","hasMany","Array","isArray","relationTo","tabs","tab","tabPrefix"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type FlattenedField } from 'payload';
2
+ import type { FromCSVFunction } from '../types.js';
3
+ type Args = {
4
+ fields: FlattenedField[];
5
+ };
6
+ /**
7
+ * Gets custom fromCSV field functions for import.
8
+ * These functions transform field values when unflattening CSV data for import.
9
+ */
10
+ export declare const getImportFieldFunctions: ({ fields }: Args) => Record<string, FromCSVFunction>;
11
+ export {};
12
+ //# sourceMappingURL=getImportFieldFunctions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getImportFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/getImportFieldFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA+C,MAAM,SAAS,CAAA;AAE1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CA4HxF,CAAA"}
@@ -0,0 +1,130 @@
1
+ import { traverseFields } from 'payload';
2
+ /**
3
+ * Gets custom fromCSV field functions for import.
4
+ * These functions transform field values when unflattening CSV data for import.
5
+ */ export const getImportFieldFunctions = ({ fields })=>{
6
+ const result = {};
7
+ const buildCustomFunctions = ({ field, parentRef, ref })=>{
8
+ // @ts-expect-error ref is untyped
9
+ ref.prefix = parentRef.prefix || '';
10
+ if (field.type === 'group' || field.type === 'tab') {
11
+ // @ts-expect-error ref is untyped
12
+ const parentPrefix = parentRef?.prefix ? `${parentRef.prefix}_` : '';
13
+ // @ts-expect-error ref is untyped
14
+ ref.prefix = `${parentPrefix}${field.name}_`;
15
+ }
16
+ if (typeof field.custom?.['plugin-import-export']?.fromCSV === 'function') {
17
+ // @ts-expect-error ref is untyped
18
+ result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.fromCSV;
19
+ } else if (field.type === 'relationship' || field.type === 'upload') {
20
+ if (field.hasMany !== true) {
21
+ if (!Array.isArray(field.relationTo)) {
22
+ // monomorphic single relationship - simple ID to value conversion
23
+ // @ts-expect-error ref is untyped
24
+ result[`${ref.prefix}${field.name}`] = ({ value })=>{
25
+ // If it's already an object (from JSON import), return as-is
26
+ if (typeof value === 'object' && value !== null) {
27
+ return value;
28
+ }
29
+ // Convert string/number ID to relationship value
30
+ return value;
31
+ };
32
+ } else {
33
+ // polymorphic single relationship - needs special handling
34
+ // The CSV has field_id and field_relationTo columns
35
+ // We need to combine them back into { relationTo, value } format
36
+ // This is handled in unflattenObject, so we don't need a fromCSV here
37
+ }
38
+ } else {
39
+ if (!Array.isArray(field.relationTo)) {
40
+ // @ts-expect-error ref is untyped
41
+ result[`${ref.prefix}${field.name}`] = ({ value })=>{
42
+ // If it's already an array (from JSON import), return as-is
43
+ if (Array.isArray(value)) {
44
+ return value;
45
+ }
46
+ // For CSV, this is handled by array unflattening in unflattenObject
47
+ return value;
48
+ };
49
+ } else {
50
+ // polymorphic many relationships
51
+ // Similar to polymorphic single, handled in unflattenObject
52
+ }
53
+ }
54
+ } else if (field.type === 'number') {
55
+ // For hasMany number fields, preserve comma-separated strings for later processing
56
+ if (field.hasMany) {
57
+ // Don't convert - let unflattenObject handle comma-separated values
58
+ // @ts-expect-error ref is untyped
59
+ result[`${ref.prefix}${field.name}`] = ({ value })=>value;
60
+ } else {
61
+ // Ensure single numbers are parsed correctly from CSV strings
62
+ // @ts-expect-error ref is untyped
63
+ result[`${ref.prefix}${field.name}`] = ({ value })=>{
64
+ if (typeof value === 'number') {
65
+ return value;
66
+ }
67
+ if (typeof value === 'string') {
68
+ const parsed = parseFloat(value);
69
+ return isNaN(parsed) ? 0 : parsed;
70
+ }
71
+ return value;
72
+ };
73
+ }
74
+ } else if (field.type === 'checkbox') {
75
+ // Convert string boolean values to actual booleans
76
+ // @ts-expect-error ref is untyped
77
+ result[`${ref.prefix}${field.name}`] = ({ value })=>{
78
+ if (typeof value === 'boolean') {
79
+ return value;
80
+ }
81
+ if (typeof value === 'string') {
82
+ return value.toLowerCase() === 'true' || value === '1';
83
+ }
84
+ return Boolean(value);
85
+ };
86
+ } else if (field.type === 'date') {
87
+ // Ensure dates are in proper format
88
+ // @ts-expect-error ref is untyped
89
+ result[`${ref.prefix}${field.name}`] = ({ value })=>{
90
+ if (!value) {
91
+ return value;
92
+ }
93
+ // If it's already a valid date string, return as-is
94
+ if (typeof value === 'string' && !isNaN(Date.parse(value))) {
95
+ return value;
96
+ }
97
+ // Try to parse and format
98
+ try {
99
+ const date = new Date(value);
100
+ return isNaN(date.getTime()) ? value : date.toISOString();
101
+ } catch {
102
+ return value;
103
+ }
104
+ };
105
+ } else if (field.type === 'json' || field.type === 'richText') {
106
+ // Parse JSON strings back to objects (both json and richText fields)
107
+ // @ts-expect-error ref is untyped
108
+ result[`${ref.prefix}${field.name}`] = ({ value })=>{
109
+ if (typeof value === 'object') {
110
+ return value;
111
+ }
112
+ if (typeof value === 'string') {
113
+ try {
114
+ return JSON.parse(value);
115
+ } catch {
116
+ return value;
117
+ }
118
+ }
119
+ return value;
120
+ };
121
+ }
122
+ };
123
+ traverseFields({
124
+ callback: buildCustomFunctions,
125
+ fields
126
+ });
127
+ return result;
128
+ };
129
+
130
+ //# sourceMappingURL=getImportFieldFunctions.js.map