@payloadcms/plugin-import-export 3.75.0 → 3.76.0-canary.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 (235) hide show
  1. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  2. package/dist/components/ExportPreview/index.js +30 -12
  3. package/dist/components/ExportPreview/index.js.map +1 -1
  4. package/dist/components/ExportPreview/index.scss +12 -0
  5. package/dist/components/ImportPreview/index.js +3 -15
  6. package/dist/components/ImportPreview/index.js.map +1 -1
  7. package/dist/export/createExport.d.ts +5 -0
  8. package/dist/export/createExport.d.ts.map +1 -1
  9. package/dist/export/createExport.js +36 -12
  10. package/dist/export/createExport.js.map +1 -1
  11. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  12. package/dist/export/getCreateExportCollectionTask.js +3 -0
  13. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  14. package/dist/export/getExportCollection.d.ts.map +1 -1
  15. package/dist/export/getExportCollection.js +21 -1
  16. package/dist/export/getExportCollection.js.map +1 -1
  17. package/dist/export/getFields.d.ts.map +1 -1
  18. package/dist/export/getFields.js +7 -3
  19. package/dist/export/getFields.js.map +1 -1
  20. package/dist/export/handleDownload.d.ts.map +1 -1
  21. package/dist/export/handleDownload.js +18 -1
  22. package/dist/export/handleDownload.js.map +1 -1
  23. package/dist/export/handlePreview.d.ts.map +1 -1
  24. package/dist/export/handlePreview.js +32 -10
  25. package/dist/export/handlePreview.js.map +1 -1
  26. package/dist/exports/types.d.ts +1 -1
  27. package/dist/exports/types.d.ts.map +1 -1
  28. package/dist/exports/types.js.map +1 -1
  29. package/dist/import/batchProcessor.js +50 -53
  30. package/dist/import/batchProcessor.js.map +1 -1
  31. package/dist/import/createImport.d.ts +6 -1
  32. package/dist/import/createImport.d.ts.map +1 -1
  33. package/dist/import/createImport.js +5 -1
  34. package/dist/import/createImport.js.map +1 -1
  35. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
  36. package/dist/import/getCreateImportCollectionTask.js +3 -0
  37. package/dist/import/getCreateImportCollectionTask.js.map +1 -1
  38. package/dist/import/getImportCollection.d.ts.map +1 -1
  39. package/dist/import/getImportCollection.js +15 -0
  40. package/dist/import/getImportCollection.js.map +1 -1
  41. package/dist/import/handlePreview.d.ts.map +1 -1
  42. package/dist/import/handlePreview.js +11 -0
  43. package/dist/import/handlePreview.js.map +1 -1
  44. package/dist/index.d.ts +22 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +26 -2
  47. package/dist/index.js.map +1 -1
  48. package/dist/translations/languages/ar.d.ts.map +1 -1
  49. package/dist/translations/languages/ar.js +3 -0
  50. package/dist/translations/languages/ar.js.map +1 -1
  51. package/dist/translations/languages/az.d.ts.map +1 -1
  52. package/dist/translations/languages/az.js +3 -0
  53. package/dist/translations/languages/az.js.map +1 -1
  54. package/dist/translations/languages/bg.d.ts.map +1 -1
  55. package/dist/translations/languages/bg.js +3 -0
  56. package/dist/translations/languages/bg.js.map +1 -1
  57. package/dist/translations/languages/bnBd.d.ts.map +1 -1
  58. package/dist/translations/languages/bnBd.js +22 -19
  59. package/dist/translations/languages/bnBd.js.map +1 -1
  60. package/dist/translations/languages/bnIn.d.ts.map +1 -1
  61. package/dist/translations/languages/bnIn.js +22 -19
  62. package/dist/translations/languages/bnIn.js.map +1 -1
  63. package/dist/translations/languages/ca.d.ts.map +1 -1
  64. package/dist/translations/languages/ca.js +3 -0
  65. package/dist/translations/languages/ca.js.map +1 -1
  66. package/dist/translations/languages/cs.d.ts.map +1 -1
  67. package/dist/translations/languages/cs.js +3 -0
  68. package/dist/translations/languages/cs.js.map +1 -1
  69. package/dist/translations/languages/da.d.ts.map +1 -1
  70. package/dist/translations/languages/da.js +3 -0
  71. package/dist/translations/languages/da.js.map +1 -1
  72. package/dist/translations/languages/de.d.ts.map +1 -1
  73. package/dist/translations/languages/de.js +3 -0
  74. package/dist/translations/languages/de.js.map +1 -1
  75. package/dist/translations/languages/en.d.ts +3 -0
  76. package/dist/translations/languages/en.d.ts.map +1 -1
  77. package/dist/translations/languages/en.js +3 -0
  78. package/dist/translations/languages/en.js.map +1 -1
  79. package/dist/translations/languages/es.d.ts.map +1 -1
  80. package/dist/translations/languages/es.js +3 -0
  81. package/dist/translations/languages/es.js.map +1 -1
  82. package/dist/translations/languages/et.d.ts.map +1 -1
  83. package/dist/translations/languages/et.js +3 -0
  84. package/dist/translations/languages/et.js.map +1 -1
  85. package/dist/translations/languages/fa.d.ts.map +1 -1
  86. package/dist/translations/languages/fa.js +3 -0
  87. package/dist/translations/languages/fa.js.map +1 -1
  88. package/dist/translations/languages/fr.d.ts.map +1 -1
  89. package/dist/translations/languages/fr.js +3 -0
  90. package/dist/translations/languages/fr.js.map +1 -1
  91. package/dist/translations/languages/he.d.ts.map +1 -1
  92. package/dist/translations/languages/he.js +3 -0
  93. package/dist/translations/languages/he.js.map +1 -1
  94. package/dist/translations/languages/hr.d.ts.map +1 -1
  95. package/dist/translations/languages/hr.js +3 -0
  96. package/dist/translations/languages/hr.js.map +1 -1
  97. package/dist/translations/languages/hu.d.ts.map +1 -1
  98. package/dist/translations/languages/hu.js +3 -0
  99. package/dist/translations/languages/hu.js.map +1 -1
  100. package/dist/translations/languages/hy.d.ts.map +1 -1
  101. package/dist/translations/languages/hy.js +3 -0
  102. package/dist/translations/languages/hy.js.map +1 -1
  103. package/dist/translations/languages/id.d.ts.map +1 -1
  104. package/dist/translations/languages/id.js +13 -10
  105. package/dist/translations/languages/id.js.map +1 -1
  106. package/dist/translations/languages/is.d.ts.map +1 -1
  107. package/dist/translations/languages/is.js +3 -0
  108. package/dist/translations/languages/is.js.map +1 -1
  109. package/dist/translations/languages/it.d.ts.map +1 -1
  110. package/dist/translations/languages/it.js +3 -0
  111. package/dist/translations/languages/it.js.map +1 -1
  112. package/dist/translations/languages/ja.d.ts.map +1 -1
  113. package/dist/translations/languages/ja.js +3 -0
  114. package/dist/translations/languages/ja.js.map +1 -1
  115. package/dist/translations/languages/ko.d.ts.map +1 -1
  116. package/dist/translations/languages/ko.js +3 -0
  117. package/dist/translations/languages/ko.js.map +1 -1
  118. package/dist/translations/languages/lt.d.ts.map +1 -1
  119. package/dist/translations/languages/lt.js +3 -0
  120. package/dist/translations/languages/lt.js.map +1 -1
  121. package/dist/translations/languages/lv.d.ts.map +1 -1
  122. package/dist/translations/languages/lv.js +16 -13
  123. package/dist/translations/languages/lv.js.map +1 -1
  124. package/dist/translations/languages/my.d.ts.map +1 -1
  125. package/dist/translations/languages/my.js +3 -0
  126. package/dist/translations/languages/my.js.map +1 -1
  127. package/dist/translations/languages/nb.d.ts.map +1 -1
  128. package/dist/translations/languages/nb.js +3 -0
  129. package/dist/translations/languages/nb.js.map +1 -1
  130. package/dist/translations/languages/nl.d.ts.map +1 -1
  131. package/dist/translations/languages/nl.js +3 -0
  132. package/dist/translations/languages/nl.js.map +1 -1
  133. package/dist/translations/languages/pl.d.ts.map +1 -1
  134. package/dist/translations/languages/pl.js +3 -0
  135. package/dist/translations/languages/pl.js.map +1 -1
  136. package/dist/translations/languages/pt.d.ts.map +1 -1
  137. package/dist/translations/languages/pt.js +3 -0
  138. package/dist/translations/languages/pt.js.map +1 -1
  139. package/dist/translations/languages/ro.d.ts.map +1 -1
  140. package/dist/translations/languages/ro.js +3 -0
  141. package/dist/translations/languages/ro.js.map +1 -1
  142. package/dist/translations/languages/rs.d.ts.map +1 -1
  143. package/dist/translations/languages/rs.js +3 -0
  144. package/dist/translations/languages/rs.js.map +1 -1
  145. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  146. package/dist/translations/languages/rsLatin.js +3 -0
  147. package/dist/translations/languages/rsLatin.js.map +1 -1
  148. package/dist/translations/languages/ru.d.ts.map +1 -1
  149. package/dist/translations/languages/ru.js +3 -0
  150. package/dist/translations/languages/ru.js.map +1 -1
  151. package/dist/translations/languages/sk.d.ts.map +1 -1
  152. package/dist/translations/languages/sk.js +3 -0
  153. package/dist/translations/languages/sk.js.map +1 -1
  154. package/dist/translations/languages/sl.d.ts.map +1 -1
  155. package/dist/translations/languages/sl.js +3 -0
  156. package/dist/translations/languages/sl.js.map +1 -1
  157. package/dist/translations/languages/sv.d.ts.map +1 -1
  158. package/dist/translations/languages/sv.js +3 -0
  159. package/dist/translations/languages/sv.js.map +1 -1
  160. package/dist/translations/languages/ta.d.ts.map +1 -1
  161. package/dist/translations/languages/ta.js +3 -0
  162. package/dist/translations/languages/ta.js.map +1 -1
  163. package/dist/translations/languages/th.d.ts.map +1 -1
  164. package/dist/translations/languages/th.js +3 -0
  165. package/dist/translations/languages/th.js.map +1 -1
  166. package/dist/translations/languages/tr.d.ts.map +1 -1
  167. package/dist/translations/languages/tr.js +3 -0
  168. package/dist/translations/languages/tr.js.map +1 -1
  169. package/dist/translations/languages/uk.d.ts.map +1 -1
  170. package/dist/translations/languages/uk.js +3 -0
  171. package/dist/translations/languages/uk.js.map +1 -1
  172. package/dist/translations/languages/vi.d.ts.map +1 -1
  173. package/dist/translations/languages/vi.js +3 -0
  174. package/dist/translations/languages/vi.js.map +1 -1
  175. package/dist/translations/languages/zh.d.ts.map +1 -1
  176. package/dist/translations/languages/zh.js +3 -0
  177. package/dist/translations/languages/zh.js.map +1 -1
  178. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  179. package/dist/translations/languages/zhTw.js +3 -0
  180. package/dist/translations/languages/zhTw.js.map +1 -1
  181. package/dist/types.d.ts +44 -1
  182. package/dist/types.d.ts.map +1 -1
  183. package/dist/types.js.map +1 -1
  184. package/dist/utilities/buildDisabledFieldRegex.d.ts +11 -2
  185. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
  186. package/dist/utilities/buildDisabledFieldRegex.js +33 -7
  187. package/dist/utilities/buildDisabledFieldRegex.js.map +1 -1
  188. package/dist/utilities/buildDisabledFieldRegex.spec.js +64 -0
  189. package/dist/utilities/buildDisabledFieldRegex.spec.js.map +1 -0
  190. package/dist/utilities/collectTimezoneCompanionFields.d.ts +24 -0
  191. package/dist/utilities/collectTimezoneCompanionFields.d.ts.map +1 -0
  192. package/dist/utilities/collectTimezoneCompanionFields.js +89 -0
  193. package/dist/utilities/collectTimezoneCompanionFields.js.map +1 -0
  194. package/dist/utilities/collectTimezoneCompanionFields.spec.js +319 -0
  195. package/dist/utilities/collectTimezoneCompanionFields.spec.js.map +1 -0
  196. package/dist/utilities/fieldToRegex.d.ts +14 -0
  197. package/dist/utilities/fieldToRegex.d.ts.map +1 -0
  198. package/dist/utilities/fieldToRegex.js +34 -0
  199. package/dist/utilities/fieldToRegex.js.map +1 -0
  200. package/dist/utilities/fieldToRegex.spec.js +151 -0
  201. package/dist/utilities/fieldToRegex.spec.js.map +1 -0
  202. package/dist/utilities/flattenObject.d.ts +7 -1
  203. package/dist/utilities/flattenObject.d.ts.map +1 -1
  204. package/dist/utilities/flattenObject.js +30 -18
  205. package/dist/utilities/flattenObject.js.map +1 -1
  206. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
  207. package/dist/utilities/getExportFieldFunctions.js +7 -0
  208. package/dist/utilities/getExportFieldFunctions.js.map +1 -1
  209. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
  210. package/dist/utilities/getImportFieldFunctions.js +2 -16
  211. package/dist/utilities/getImportFieldFunctions.js.map +1 -1
  212. package/dist/utilities/getPluginCollections.d.ts +1 -0
  213. package/dist/utilities/getPluginCollections.d.ts.map +1 -1
  214. package/dist/utilities/getPluginCollections.js +43 -10
  215. package/dist/utilities/getPluginCollections.js.map +1 -1
  216. package/dist/utilities/getSchemaColumns.d.ts +8 -2
  217. package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
  218. package/dist/utilities/getSchemaColumns.js +61 -27
  219. package/dist/utilities/getSchemaColumns.js.map +1 -1
  220. package/dist/utilities/parseCSV.d.ts.map +1 -1
  221. package/dist/utilities/parseCSV.js +4 -10
  222. package/dist/utilities/parseCSV.js.map +1 -1
  223. package/dist/utilities/resolveLimit.d.ts +15 -0
  224. package/dist/utilities/resolveLimit.d.ts.map +1 -0
  225. package/dist/utilities/resolveLimit.js +21 -0
  226. package/dist/utilities/resolveLimit.js.map +1 -0
  227. package/dist/utilities/unflattenObject.d.ts +13 -0
  228. package/dist/utilities/unflattenObject.d.ts.map +1 -1
  229. package/dist/utilities/unflattenObject.js +64 -65
  230. package/dist/utilities/unflattenObject.js.map +1 -1
  231. package/package.json +8 -8
  232. package/dist/utilities/getvalueAtPath.d.ts +0 -15
  233. package/dist/utilities/getvalueAtPath.d.ts.map +0 -1
  234. package/dist/utilities/getvalueAtPath.js +0 -49
  235. package/dist/utilities/getvalueAtPath.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/fieldToRegex.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { fieldToRegex } from './fieldToRegex.js'\n\ndescribe('fieldToRegex', () => {\n describe('simple field paths', () => {\n it('should match exact field name', () => {\n const regex = fieldToRegex('title')\n\n expect(regex.test('title')).toBe(true)\n })\n\n it('should match field with array index', () => {\n const regex = fieldToRegex('items')\n\n expect(regex.test('items_0')).toBe(true)\n expect(regex.test('items_1')).toBe(true)\n expect(regex.test('items_99')).toBe(true)\n })\n\n it('should match nested fields under array items', () => {\n const regex = fieldToRegex('items')\n\n expect(regex.test('items_0_title')).toBe(true)\n expect(regex.test('items_1_description')).toBe(true)\n })\n\n it('should not match unrelated fields', () => {\n const regex = fieldToRegex('title')\n\n expect(regex.test('otherField')).toBe(false)\n expect(regex.test('titleExtra')).toBe(false)\n })\n })\n\n describe('dotted field paths', () => {\n it('should match nested field path without indices', () => {\n const regex = fieldToRegex('blocks.content')\n\n expect(regex.test('blocks_content')).toBe(true)\n })\n\n it('should match nested field path with array index in middle', () => {\n const regex = fieldToRegex('blocks.content')\n\n expect(regex.test('blocks_0_content')).toBe(true)\n expect(regex.test('blocks_1_content')).toBe(true)\n expect(regex.test('blocks_42_content')).toBe(true)\n })\n\n it('should match deeply nested paths with multiple indices', () => {\n const regex = fieldToRegex('blocks.content.items')\n\n expect(regex.test('blocks_0_content_items')).toBe(true)\n expect(regex.test('blocks_0_content_0_items')).toBe(true)\n expect(regex.test('blocks_1_content_2_items')).toBe(true)\n })\n\n it('should match nested fields under the matched path', () => {\n const regex = fieldToRegex('blocks.content')\n\n expect(regex.test('blocks_0_content_title')).toBe(true)\n expect(regex.test('blocks_0_content_richText')).toBe(true)\n expect(regex.test('blocks_1_content_0_value')).toBe(true)\n })\n })\n\n describe('complex nested structures', () => {\n it('should handle three-level nesting', () => {\n const regex = fieldToRegex('layout.sections.items')\n\n expect(regex.test('layout_sections_items')).toBe(true)\n expect(regex.test('layout_0_sections_items')).toBe(true)\n expect(regex.test('layout_0_sections_1_items')).toBe(true)\n expect(regex.test('layout_0_sections_1_items_2')).toBe(true)\n expect(regex.test('layout_0_sections_1_items_2_title')).toBe(true)\n })\n\n it('should not match partial field name matches', () => {\n const regex = fieldToRegex('block')\n\n expect(regex.test('blocks')).toBe(false)\n expect(regex.test('blocks_0_content')).toBe(false)\n expect(regex.test('blockType')).toBe(false)\n })\n\n it('should handle field names that look like array indices', () => {\n const regex = fieldToRegex('data.row')\n\n expect(regex.test('data_row')).toBe(true)\n expect(regex.test('data_0_row')).toBe(true)\n expect(regex.test('data_0_row_1')).toBe(true)\n })\n })\n\n describe('edge cases', () => {\n it('should handle single character field names', () => {\n const regex = fieldToRegex('a.b.c')\n\n expect(regex.test('a_b_c')).toBe(true)\n expect(regex.test('a_0_b_c')).toBe(true)\n expect(regex.test('a_0_b_1_c')).toBe(true)\n })\n\n it('should handle field names with numbers', () => {\n const regex = fieldToRegex('field1.field2')\n\n expect(regex.test('field1_field2')).toBe(true)\n expect(regex.test('field1_0_field2')).toBe(true)\n })\n\n it('should match field at end of key exactly', () => {\n const regex = fieldToRegex('meta.title')\n\n expect(regex.test('meta_title')).toBe(true)\n expect(regex.test('meta_0_title')).toBe(true)\n // Should not match if title is a prefix of another word\n expect(regex.test('meta_titleExtra')).toBe(false)\n })\n\n it('should handle field names starting with underscore', () => {\n const regex = fieldToRegex('_status')\n\n expect(regex.test('_status')).toBe(true)\n expect(regex.test('_status_0')).toBe(true)\n expect(regex.test('_statusExtra')).toBe(false)\n })\n\n it('should handle field names containing underscores', () => {\n const regex = fieldToRegex('my_field')\n\n expect(regex.test('my_field')).toBe(true)\n expect(regex.test('my_field_0')).toBe(true)\n expect(regex.test('my_fieldExtra')).toBe(false)\n })\n\n it('should handle nested paths with underscore fields', () => {\n const regex = fieldToRegex('group._status')\n\n expect(regex.test('group__status')).toBe(true)\n expect(regex.test('group_0__status')).toBe(true)\n })\n })\n\n describe('date fields with timezone companions', () => {\n it('should match date field and its _tz companion', () => {\n const regex = fieldToRegex('publishedDate')\n\n expect(regex.test('publishedDate')).toBe(true)\n expect(regex.test('publishedDate_tz')).toBe(true)\n })\n\n it('should match nested date field and its _tz companion', () => {\n const regex = fieldToRegex('meta.publishedDate')\n\n expect(regex.test('meta_publishedDate')).toBe(true)\n expect(regex.test('meta_publishedDate_tz')).toBe(true)\n expect(regex.test('meta_0_publishedDate')).toBe(true)\n expect(regex.test('meta_0_publishedDate_tz')).toBe(true)\n })\n\n it('should match date fields in arrays with _tz companions', () => {\n const regex = fieldToRegex('events.startDate')\n\n expect(regex.test('events_0_startDate')).toBe(true)\n expect(regex.test('events_0_startDate_tz')).toBe(true)\n expect(regex.test('events_1_startDate')).toBe(true)\n expect(regex.test('events_1_startDate_tz')).toBe(true)\n })\n\n it('should match deeply nested date fields with _tz companions', () => {\n const regex = fieldToRegex('blocks.content.scheduledAt')\n\n expect(regex.test('blocks_0_content_scheduledAt')).toBe(true)\n expect(regex.test('blocks_0_content_scheduledAt_tz')).toBe(true)\n expect(regex.test('blocks_0_content_0_scheduledAt')).toBe(true)\n expect(regex.test('blocks_0_content_0_scheduledAt_tz')).toBe(true)\n })\n\n it('should not match _tz suffix on unrelated fields', () => {\n const regex = fieldToRegex('title')\n\n expect(regex.test('title')).toBe(true)\n expect(regex.test('title_tz')).toBe(true) // _tz is treated as a nested field suffix\n expect(regex.test('publishedDate_tz')).toBe(false)\n })\n\n it('should handle date fields with underscores in name', () => {\n const regex = fieldToRegex('start_date')\n\n expect(regex.test('start_date')).toBe(true)\n expect(regex.test('start_date_tz')).toBe(true)\n expect(regex.test('start_date_0')).toBe(true)\n })\n })\n})\n"],"names":["describe","expect","it","fieldToRegex","regex","test","toBe"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,YAAY,QAAQ,oBAAmB;AAEhDH,SAAS,gBAAgB;IACvBA,SAAS,sBAAsB;QAC7BE,GAAG,iCAAiC;YAClC,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,UAAUC,IAAI,CAAC;QACnC;QAEAJ,GAAG,uCAAuC;YACxC,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,YAAYC,IAAI,CAAC;YACnCL,OAAOG,MAAMC,IAAI,CAAC,YAAYC,IAAI,CAAC;YACnCL,OAAOG,MAAMC,IAAI,CAAC,aAAaC,IAAI,CAAC;QACtC;QAEAJ,GAAG,gDAAgD;YACjD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,kBAAkBC,IAAI,CAAC;YACzCL,OAAOG,MAAMC,IAAI,CAAC,wBAAwBC,IAAI,CAAC;QACjD;QAEAJ,GAAG,qCAAqC;YACtC,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,eAAeC,IAAI,CAAC;YACtCL,OAAOG,MAAMC,IAAI,CAAC,eAAeC,IAAI,CAAC;QACxC;IACF;IAEAN,SAAS,sBAAsB;QAC7BE,GAAG,kDAAkD;YACnD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,mBAAmBC,IAAI,CAAC;QAC5C;QAEAJ,GAAG,6DAA6D;YAC9D,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,qBAAqBC,IAAI,CAAC;YAC5CL,OAAOG,MAAMC,IAAI,CAAC,qBAAqBC,IAAI,CAAC;YAC5CL,OAAOG,MAAMC,IAAI,CAAC,sBAAsBC,IAAI,CAAC;QAC/C;QAEAJ,GAAG,0DAA0D;YAC3D,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,2BAA2BC,IAAI,CAAC;YAClDL,OAAOG,MAAMC,IAAI,CAAC,6BAA6BC,IAAI,CAAC;YACpDL,OAAOG,MAAMC,IAAI,CAAC,6BAA6BC,IAAI,CAAC;QACtD;QAEAJ,GAAG,qDAAqD;YACtD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,2BAA2BC,IAAI,CAAC;YAClDL,OAAOG,MAAMC,IAAI,CAAC,8BAA8BC,IAAI,CAAC;YACrDL,OAAOG,MAAMC,IAAI,CAAC,6BAA6BC,IAAI,CAAC;QACtD;IACF;IAEAN,SAAS,6BAA6B;QACpCE,GAAG,qCAAqC;YACtC,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,0BAA0BC,IAAI,CAAC;YACjDL,OAAOG,MAAMC,IAAI,CAAC,4BAA4BC,IAAI,CAAC;YACnDL,OAAOG,MAAMC,IAAI,CAAC,8BAA8BC,IAAI,CAAC;YACrDL,OAAOG,MAAMC,IAAI,CAAC,gCAAgCC,IAAI,CAAC;YACvDL,OAAOG,MAAMC,IAAI,CAAC,sCAAsCC,IAAI,CAAC;QAC/D;QAEAJ,GAAG,+CAA+C;YAChD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,WAAWC,IAAI,CAAC;YAClCL,OAAOG,MAAMC,IAAI,CAAC,qBAAqBC,IAAI,CAAC;YAC5CL,OAAOG,MAAMC,IAAI,CAAC,cAAcC,IAAI,CAAC;QACvC;QAEAJ,GAAG,0DAA0D;YAC3D,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,aAAaC,IAAI,CAAC;YACpCL,OAAOG,MAAMC,IAAI,CAAC,eAAeC,IAAI,CAAC;YACtCL,OAAOG,MAAMC,IAAI,CAAC,iBAAiBC,IAAI,CAAC;QAC1C;IACF;IAEAN,SAAS,cAAc;QACrBE,GAAG,8CAA8C;YAC/C,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,UAAUC,IAAI,CAAC;YACjCL,OAAOG,MAAMC,IAAI,CAAC,YAAYC,IAAI,CAAC;YACnCL,OAAOG,MAAMC,IAAI,CAAC,cAAcC,IAAI,CAAC;QACvC;QAEAJ,GAAG,0CAA0C;YAC3C,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,kBAAkBC,IAAI,CAAC;YACzCL,OAAOG,MAAMC,IAAI,CAAC,oBAAoBC,IAAI,CAAC;QAC7C;QAEAJ,GAAG,4CAA4C;YAC7C,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,eAAeC,IAAI,CAAC;YACtCL,OAAOG,MAAMC,IAAI,CAAC,iBAAiBC,IAAI,CAAC;YACxC,wDAAwD;YACxDL,OAAOG,MAAMC,IAAI,CAAC,oBAAoBC,IAAI,CAAC;QAC7C;QAEAJ,GAAG,sDAAsD;YACvD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,YAAYC,IAAI,CAAC;YACnCL,OAAOG,MAAMC,IAAI,CAAC,cAAcC,IAAI,CAAC;YACrCL,OAAOG,MAAMC,IAAI,CAAC,iBAAiBC,IAAI,CAAC;QAC1C;QAEAJ,GAAG,oDAAoD;YACrD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,aAAaC,IAAI,CAAC;YACpCL,OAAOG,MAAMC,IAAI,CAAC,eAAeC,IAAI,CAAC;YACtCL,OAAOG,MAAMC,IAAI,CAAC,kBAAkBC,IAAI,CAAC;QAC3C;QAEAJ,GAAG,qDAAqD;YACtD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,kBAAkBC,IAAI,CAAC;YACzCL,OAAOG,MAAMC,IAAI,CAAC,oBAAoBC,IAAI,CAAC;QAC7C;IACF;IAEAN,SAAS,wCAAwC;QAC/CE,GAAG,iDAAiD;YAClD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,kBAAkBC,IAAI,CAAC;YACzCL,OAAOG,MAAMC,IAAI,CAAC,qBAAqBC,IAAI,CAAC;QAC9C;QAEAJ,GAAG,wDAAwD;YACzD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,uBAAuBC,IAAI,CAAC;YAC9CL,OAAOG,MAAMC,IAAI,CAAC,0BAA0BC,IAAI,CAAC;YACjDL,OAAOG,MAAMC,IAAI,CAAC,yBAAyBC,IAAI,CAAC;YAChDL,OAAOG,MAAMC,IAAI,CAAC,4BAA4BC,IAAI,CAAC;QACrD;QAEAJ,GAAG,0DAA0D;YAC3D,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,uBAAuBC,IAAI,CAAC;YAC9CL,OAAOG,MAAMC,IAAI,CAAC,0BAA0BC,IAAI,CAAC;YACjDL,OAAOG,MAAMC,IAAI,CAAC,uBAAuBC,IAAI,CAAC;YAC9CL,OAAOG,MAAMC,IAAI,CAAC,0BAA0BC,IAAI,CAAC;QACnD;QAEAJ,GAAG,8DAA8D;YAC/D,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,iCAAiCC,IAAI,CAAC;YACxDL,OAAOG,MAAMC,IAAI,CAAC,oCAAoCC,IAAI,CAAC;YAC3DL,OAAOG,MAAMC,IAAI,CAAC,mCAAmCC,IAAI,CAAC;YAC1DL,OAAOG,MAAMC,IAAI,CAAC,sCAAsCC,IAAI,CAAC;QAC/D;QAEAJ,GAAG,mDAAmD;YACpD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,UAAUC,IAAI,CAAC;YACjCL,OAAOG,MAAMC,IAAI,CAAC,aAAaC,IAAI,CAAC,OAAM,0CAA0C;YACpFL,OAAOG,MAAMC,IAAI,CAAC,qBAAqBC,IAAI,CAAC;QAC9C;QAEAJ,GAAG,sDAAsD;YACvD,MAAME,QAAQD,aAAa;YAE3BF,OAAOG,MAAMC,IAAI,CAAC,eAAeC,IAAI,CAAC;YACtCL,OAAOG,MAAMC,IAAI,CAAC,kBAAkBC,IAAI,CAAC;YACzCL,OAAOG,MAAMC,IAAI,CAAC,iBAAiBC,IAAI,CAAC;QAC1C;IACF;AACF"}
@@ -4,8 +4,14 @@ type Args = {
4
4
  doc: Document;
5
5
  fields?: string[];
6
6
  prefix?: string;
7
+ /**
8
+ * Set of auto-generated timezone companion field names (from collectTimezoneCompanionFields).
9
+ * These fields are excluded unless explicitly selected.
10
+ * If not provided, no timezone filtering is applied.
11
+ */
12
+ timezoneCompanionFields?: Set<string>;
7
13
  toCSVFunctions: Record<string, ToCSVFunction>;
8
14
  };
9
- export declare const flattenObject: ({ doc, fields, prefix, toCSVFunctions, }: Args) => Record<string, unknown>;
15
+ export declare const flattenObject: ({ doc, fields, prefix, timezoneCompanionFields, toCSVFunctions, }: Args) => Record<string, unknown>;
10
16
  export {};
11
17
  //# sourceMappingURL=flattenObject.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flattenObject.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,QAAQ,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;CAC9C,CAAA;AAED,eAAO,MAAM,aAAa,6CAKvB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA6J/B,CAAA"}
1
+ {"version":3,"file":"flattenObject.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAIhD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,QAAQ,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;CAC9C,CAAA;AAED,eAAO,MAAM,aAAa,sEAMvB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAgL/B,CAAA"}
@@ -1,4 +1,5 @@
1
- export const flattenObject = ({ doc, fields, prefix, toCSVFunctions })=>{
1
+ import { fieldToRegex } from './fieldToRegex.js';
2
+ export const flattenObject = ({ doc, fields, prefix, timezoneCompanionFields, toCSVFunctions })=>{
2
3
  const row = {};
3
4
  // Helper to get toCSV function by full path or base field name
4
5
  // This allows functions registered for field names (e.g., 'richText') to work
@@ -103,24 +104,35 @@ export const flattenObject = ({ doc, fields, prefix, toCSVFunctions })=>{
103
104
  flatten(doc, prefix);
104
105
  if (Array.isArray(fields) && fields.length > 0) {
105
106
  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
- });
107
+ // Build all field regexes once
108
+ const fieldPatterns = fields.map((field)=>({
109
+ field,
110
+ regex: fieldToRegex(field)
111
+ }));
112
+ // Track which timezone companion fields were explicitly selected
113
+ // Convert dotted notation to underscore for matching against flattened keys
114
+ const explicitlySelectedTimezoneFields = new Set(fields.filter((f)=>{
115
+ const underscored = f.replace(/\./g, '_');
116
+ return timezoneCompanionFields?.has(underscored);
117
+ }).map((f)=>f.replace(/\./g, '_')));
118
+ // Single pass through row keys - O(keys * fields) regex tests but only one iteration
119
+ const rowKeys = Object.keys(row);
120
+ // Process in field order to maintain user's specified ordering
121
+ for (const { regex } of fieldPatterns){
122
+ for (const key of rowKeys){
123
+ // Skip if already added (a key might match multiple field patterns)
124
+ if (key in orderedResult) {
125
+ continue;
126
+ }
127
+ // Skip auto-generated timezone companion fields unless explicitly selected
128
+ if (timezoneCompanionFields?.has(key) && !explicitlySelectedTimezoneFields.has(key)) {
129
+ continue;
130
+ }
131
+ if (regex.test(key)) {
132
+ orderedResult[key] = row[key];
133
+ }
122
134
  }
123
- });
135
+ }
124
136
  return orderedResult;
125
137
  }
126
138
  return row;
@@ -1 +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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"}
1
+ {"version":3,"sources":["../../src/utilities/flattenObject.ts"],"sourcesContent":["import type { Document } from 'payload'\n\nimport type { ToCSVFunction } from '../types.js'\n\nimport { fieldToRegex } from './fieldToRegex.js'\n\ntype Args = {\n doc: Document\n fields?: string[]\n prefix?: string\n /**\n * Set of auto-generated timezone companion field names (from collectTimezoneCompanionFields).\n * These fields are excluded unless explicitly selected.\n * If not provided, no timezone filtering is applied.\n */\n timezoneCompanionFields?: Set<string>\n toCSVFunctions: Record<string, ToCSVFunction>\n}\n\nexport const flattenObject = ({\n doc,\n fields,\n prefix,\n timezoneCompanionFields,\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 // Build all field regexes once\n const fieldPatterns = fields.map((field) => ({\n field,\n regex: fieldToRegex(field),\n }))\n\n // Track which timezone companion fields were explicitly selected\n // Convert dotted notation to underscore for matching against flattened keys\n const explicitlySelectedTimezoneFields = new Set(\n fields\n .filter((f) => {\n const underscored = f.replace(/\\./g, '_')\n return timezoneCompanionFields?.has(underscored)\n })\n .map((f) => f.replace(/\\./g, '_')),\n )\n\n // Single pass through row keys - O(keys * fields) regex tests but only one iteration\n const rowKeys = Object.keys(row)\n\n // Process in field order to maintain user's specified ordering\n for (const { regex } of fieldPatterns) {\n for (const key of rowKeys) {\n // Skip if already added (a key might match multiple field patterns)\n if (key in orderedResult) {\n continue\n }\n\n // Skip auto-generated timezone companion fields unless explicitly selected\n if (timezoneCompanionFields?.has(key) && !explicitlySelectedTimezoneFields.has(key)) {\n continue\n }\n\n if (regex.test(key)) {\n orderedResult[key] = row[key]\n }\n }\n }\n\n return orderedResult\n }\n\n return row\n}\n"],"names":["fieldToRegex","flattenObject","doc","fields","prefix","timezoneCompanionFields","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","fieldPatterns","map","field","regex","explicitlySelectedTimezoneFields","Set","filter","f","underscored","replace","has","rowKeys","keys","test"],"mappings":"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"}
@@ -1 +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"}
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,CAqHtF,CAAA"}
@@ -29,6 +29,13 @@ import { traverseFields } from 'payload';
29
29
  }
30
30
  return value;
31
31
  };
32
+ } else if (field.type === 'date') {
33
+ // Handle date fields - return value as-is (ISO string format)
34
+ // This prevents the flattener from treating the document as having
35
+ // nested sibling properties like _tz that shouldn't be auto-included
36
+ // @ts-expect-error ref is untyped
37
+ const fieldKey = `${ref.prefix}${field.name}`;
38
+ result[fieldKey] = ({ value })=>value;
32
39
  } else if (field.type === 'relationship' || field.type === 'upload') {
33
40
  if (field.hasMany !== true) {
34
41
  if (!Array.isArray(field.relationTo)) {
@@ -1 +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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"}
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 === 'date') {\n // Handle date fields - return value as-is (ISO string format)\n // This prevents the flattener from treating the document as having\n // nested sibling properties like _tz that shouldn't be auto-included\n // @ts-expect-error ref is untyped\n const fieldKey = `${ref.prefix}${field.name}`\n\n result[fieldKey] = ({ value }) => value\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","fieldKey","hasMany","Array","isArray","relationTo","id","data","relatedDoc","forEach","val","i","callback"],"mappings":"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"}
@@ -1 +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"}
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,CA8GxF,CAAA"}
@@ -30,35 +30,26 @@ import { traverseFields } from 'payload';
30
30
  return value;
31
31
  };
32
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
33
+ // Polymorphic single: handled in unflattenObject via _id/_relationTo columns
37
34
  }
38
35
  } else {
39
36
  if (!Array.isArray(field.relationTo)) {
40
37
  // @ts-expect-error ref is untyped
41
38
  result[`${ref.prefix}${field.name}`] = ({ value })=>{
42
- // If it's already an array (from JSON import), return as-is
43
39
  if (Array.isArray(value)) {
44
40
  return value;
45
41
  }
46
- // For CSV, this is handled by array unflattening in unflattenObject
47
42
  return value;
48
43
  };
49
44
  } else {
50
- // polymorphic many relationships
51
- // Similar to polymorphic single, handled in unflattenObject
45
+ // Polymorphic many: handled in unflattenObject
52
46
  }
53
47
  }
54
48
  } else if (field.type === 'number') {
55
- // For hasMany number fields, preserve comma-separated strings for later processing
56
49
  if (field.hasMany) {
57
- // Don't convert - let unflattenObject handle comma-separated values
58
50
  // @ts-expect-error ref is untyped
59
51
  result[`${ref.prefix}${field.name}`] = ({ value })=>value;
60
52
  } else {
61
- // Ensure single numbers are parsed correctly from CSV strings
62
53
  // @ts-expect-error ref is untyped
63
54
  result[`${ref.prefix}${field.name}`] = ({ value })=>{
64
55
  if (typeof value === 'number') {
@@ -72,7 +63,6 @@ import { traverseFields } from 'payload';
72
63
  };
73
64
  }
74
65
  } else if (field.type === 'checkbox') {
75
- // Convert string boolean values to actual booleans
76
66
  // @ts-expect-error ref is untyped
77
67
  result[`${ref.prefix}${field.name}`] = ({ value })=>{
78
68
  if (typeof value === 'boolean') {
@@ -84,17 +74,14 @@ import { traverseFields } from 'payload';
84
74
  return Boolean(value);
85
75
  };
86
76
  } else if (field.type === 'date') {
87
- // Ensure dates are in proper format
88
77
  // @ts-expect-error ref is untyped
89
78
  result[`${ref.prefix}${field.name}`] = ({ value })=>{
90
79
  if (!value) {
91
80
  return value;
92
81
  }
93
- // If it's already a valid date string, return as-is
94
82
  if (typeof value === 'string' && !isNaN(Date.parse(value))) {
95
83
  return value;
96
84
  }
97
- // Try to parse and format
98
85
  try {
99
86
  const date = new Date(value);
100
87
  return isNaN(date.getTime()) ? value : date.toISOString();
@@ -103,7 +90,6 @@ import { traverseFields } from 'payload';
103
90
  }
104
91
  };
105
92
  } else if (field.type === 'json' || field.type === 'richText') {
106
- // Parse JSON strings back to objects (both json and richText fields)
107
93
  // @ts-expect-error ref is untyped
108
94
  result[`${ref.prefix}${field.name}`] = ({ value })=>{
109
95
  if (typeof value === 'object') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getImportFieldFunctions.ts"],"sourcesContent":["import { type FlattenedField, traverseFields, type TraverseFieldsCallback } from 'payload'\n\nimport type { FromCSVFunction } from '../types.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Gets custom fromCSV field functions for import.\n * These functions transform field values when unflattening CSV data for import.\n */\nexport const getImportFieldFunctions = ({ fields }: Args): Record<string, FromCSVFunction> => {\n const result: Record<string, FromCSVFunction> = {}\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']?.fromCSV === 'function') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.fromCSV\n } else if (field.type === 'relationship' || field.type === 'upload') {\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n // monomorphic single relationship - simple ID to value conversion\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n // If it's already an object (from JSON import), return as-is\n if (typeof value === 'object' && value !== null) {\n return value\n }\n // Convert string/number ID to relationship value\n return value\n }\n } else {\n // polymorphic single relationship - needs special handling\n // The CSV has field_id and field_relationTo columns\n // We need to combine them back into { relationTo, value } format\n // This is handled in unflattenObject, so we don't need a fromCSV here\n }\n } else {\n if (!Array.isArray(field.relationTo)) {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n // If it's already an array (from JSON import), return as-is\n if (Array.isArray(value)) {\n return value\n }\n // For CSV, this is handled by array unflattening in unflattenObject\n return value\n }\n } else {\n // polymorphic many relationships\n // Similar to polymorphic single, handled in unflattenObject\n }\n }\n } else if (field.type === 'number') {\n // For hasMany number fields, preserve comma-separated strings for later processing\n if (field.hasMany) {\n // Don't convert - let unflattenObject handle comma-separated values\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => value\n } else {\n // Ensure single numbers are parsed correctly from CSV strings\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value)\n return isNaN(parsed) ? 0 : parsed\n }\n return value\n }\n }\n } else if (field.type === 'checkbox') {\n // Convert string boolean values to actual booleans\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (typeof value === 'boolean') {\n return value\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true' || value === '1'\n }\n return Boolean(value)\n }\n } else if (field.type === 'date') {\n // Ensure dates are in proper format\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (!value) {\n return value\n }\n // If it's already a valid date string, return as-is\n if (typeof value === 'string' && !isNaN(Date.parse(value))) {\n return value\n }\n // Try to parse and format\n try {\n const date = new Date(value as string)\n return isNaN(date.getTime()) ? value : date.toISOString()\n } catch {\n return value\n }\n }\n } else if (field.type === 'json' || field.type === 'richText') {\n // Parse JSON strings back to objects (both json and richText fields)\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (typeof value === 'object') {\n return value\n }\n if (typeof value === 'string') {\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n }\n return value\n }\n }\n }\n\n traverseFields({ callback: buildCustomFunctions, fields })\n\n return result\n}\n"],"names":["traverseFields","getImportFieldFunctions","fields","result","buildCustomFunctions","field","parentRef","ref","prefix","type","parentPrefix","name","custom","fromCSV","hasMany","Array","isArray","relationTo","value","parsed","parseFloat","isNaN","toLowerCase","Boolean","Date","parse","date","getTime","toISOString","JSON","callback"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/getImportFieldFunctions.ts"],"sourcesContent":["import { type FlattenedField, traverseFields, type TraverseFieldsCallback } from 'payload'\n\nimport type { FromCSVFunction } from '../types.js'\n\ntype Args = {\n fields: FlattenedField[]\n}\n\n/**\n * Gets custom fromCSV field functions for import.\n * These functions transform field values when unflattening CSV data for import.\n */\nexport const getImportFieldFunctions = ({ fields }: Args): Record<string, FromCSVFunction> => {\n const result: Record<string, FromCSVFunction> = {}\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']?.fromCSV === 'function') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = field.custom['plugin-import-export']?.fromCSV\n } else if (field.type === 'relationship' || field.type === 'upload') {\n if (field.hasMany !== true) {\n if (!Array.isArray(field.relationTo)) {\n // monomorphic single relationship - simple ID to value conversion\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n // If it's already an object (from JSON import), return as-is\n if (typeof value === 'object' && value !== null) {\n return value\n }\n // Convert string/number ID to relationship value\n return value\n }\n } else {\n // Polymorphic single: handled in unflattenObject via _id/_relationTo columns\n }\n } else {\n if (!Array.isArray(field.relationTo)) {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (Array.isArray(value)) {\n return value\n }\n return value\n }\n } else {\n // Polymorphic many: handled in unflattenObject\n }\n }\n } else if (field.type === 'number') {\n if (field.hasMany) {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => value\n } else {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value)\n return isNaN(parsed) ? 0 : parsed\n }\n return value\n }\n }\n } else if (field.type === 'checkbox') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (typeof value === 'boolean') {\n return value\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true' || value === '1'\n }\n return Boolean(value)\n }\n } else if (field.type === 'date') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (!value) {\n return value\n }\n if (typeof value === 'string' && !isNaN(Date.parse(value))) {\n return value\n }\n try {\n const date = new Date(value as string)\n return isNaN(date.getTime()) ? value : date.toISOString()\n } catch {\n return value\n }\n }\n } else if (field.type === 'json' || field.type === 'richText') {\n // @ts-expect-error ref is untyped\n result[`${ref.prefix}${field.name}`] = ({ value }) => {\n if (typeof value === 'object') {\n return value\n }\n if (typeof value === 'string') {\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n }\n return value\n }\n }\n }\n\n traverseFields({ callback: buildCustomFunctions, fields })\n\n return result\n}\n"],"names":["traverseFields","getImportFieldFunctions","fields","result","buildCustomFunctions","field","parentRef","ref","prefix","type","parentPrefix","name","custom","fromCSV","hasMany","Array","isArray","relationTo","value","parsed","parseFloat","isNaN","toLowerCase","Boolean","Date","parse","date","getTime","toISOString","JSON","callback"],"mappings":"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"}
@@ -27,6 +27,7 @@ export type PluginCollectionsResult = {
27
27
  * - Applies top-level overrideExportCollection/overrideImportCollection if provided
28
28
  * - For each collection in `pluginConfig.collections` that has a function override
29
29
  * for `export` or `import`, applies the override to create customized collections
30
+ * - Applies settings from collections without overrideCollection to the base collection
30
31
  *
31
32
  * @param config - The Payload config
32
33
  * @param pluginConfig - The import/export plugin config
@@ -1 +1 @@
1
- {"version":3,"file":"getPluginCollections.d.ts","sourceRoot":"","sources":["../../src/utilities/getPluginCollections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAA8B,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAKvF,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;CACtC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,8BAG9B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,OAAO,CAAC,uBAAuB,CA0GlC,CAAA"}
1
+ {"version":3,"file":"getPluginCollections.d.ts","sourceRoot":"","sources":["../../src/utilities/getPluginCollections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAA8B,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAKvF,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC;;OAEG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;CACtC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,8BAG9B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,OAAO,CAAC,uBAAuB,CA8IlC,CAAA"}
@@ -7,12 +7,12 @@ import { getImportCollection } from '../import/getImportCollection.js';
7
7
  * - Applies top-level overrideExportCollection/overrideImportCollection if provided
8
8
  * - For each collection in `pluginConfig.collections` that has a function override
9
9
  * for `export` or `import`, applies the override to create customized collections
10
+ * - Applies settings from collections without overrideCollection to the base collection
10
11
  *
11
12
  * @param config - The Payload config
12
13
  * @param pluginConfig - The import/export plugin config
13
14
  * @returns Object containing arrays of export and import collections
14
15
  */ export const getPluginCollections = async ({ config, pluginConfig })=>{
15
- // Get the base export and import collections with default configs (no per-collection settings)
16
16
  let baseExportCollection = getExportCollection({
17
17
  config,
18
18
  pluginConfig
@@ -21,7 +21,6 @@ import { getImportCollection } from '../import/getImportCollection.js';
21
21
  config,
22
22
  pluginConfig
23
23
  });
24
- // Apply top-level collection overrides if provided
25
24
  if (pluginConfig.overrideExportCollection && typeof pluginConfig.overrideExportCollection === 'function') {
26
25
  baseExportCollection = await pluginConfig.overrideExportCollection({
27
26
  collection: baseExportCollection
@@ -34,14 +33,11 @@ import { getImportCollection } from '../import/getImportCollection.js';
34
33
  }
35
34
  const exportCollections = [];
36
35
  const importCollections = [];
37
- // Maps from target collection slug to the export/import collection slug to use
38
36
  const customExportSlugMap = new Map();
39
37
  const customImportSlugMap = new Map();
40
38
  // Process each collection config for custom collection overrides
41
39
  if (pluginConfig.collections && pluginConfig.collections.length > 0) {
42
40
  for (const collectionConfig of pluginConfig.collections){
43
- // Handle export config - only process if overrideCollection is provided
44
- // Settings like disableJobsQueue require a custom slug to work properly
45
41
  const exportConfig = typeof collectionConfig.export === 'object' ? collectionConfig.export : undefined;
46
42
  if (exportConfig?.overrideCollection) {
47
43
  // Generate a collection with this export config's settings (like disableJobsQueue)
@@ -56,15 +52,11 @@ import { getImportCollection } from '../import/getImportCollection.js';
56
52
  // If the slug changed, this is a separate collection; otherwise it modifies the base
57
53
  if (customExport.slug !== baseExportCollection.slug) {
58
54
  exportCollections.push(customExport);
59
- // Map this target collection to its custom export collection
60
55
  customExportSlugMap.set(collectionConfig.slug, customExport.slug);
61
56
  } else {
62
- // Full override - replace the base
63
57
  baseExportCollection = customExport;
64
58
  }
65
59
  }
66
- // Handle import config - only process if overrideCollection is provided
67
- // Settings like disableJobsQueue require a custom slug to work properly
68
60
  const importConf = typeof collectionConfig.import === 'object' ? collectionConfig.import : undefined;
69
61
  if (importConf?.overrideCollection) {
70
62
  // Generate a collection with this import config's settings (like disableJobsQueue)
@@ -88,7 +80,48 @@ import { getImportCollection } from '../import/getImportCollection.js';
88
80
  }
89
81
  }
90
82
  }
91
- // Add base collections to the front of the arrays
83
+ // Apply settings from collections without overrideCollection to the base collection
84
+ // This is done AFTER all overrides so these settings take precedence
85
+ if (pluginConfig.collections && pluginConfig.collections.length > 0) {
86
+ let mergedExportSettings = {};
87
+ let mergedImportSettings = {};
88
+ for (const collectionConfig of pluginConfig.collections){
89
+ const exportConf = typeof collectionConfig.export === 'object' ? collectionConfig.export : undefined;
90
+ const importConf = typeof collectionConfig.import === 'object' ? collectionConfig.import : undefined;
91
+ if (exportConf && !exportConf.overrideCollection) {
92
+ mergedExportSettings = {
93
+ ...mergedExportSettings,
94
+ ...exportConf
95
+ };
96
+ }
97
+ if (importConf && !importConf.overrideCollection) {
98
+ mergedImportSettings = {
99
+ ...mergedImportSettings,
100
+ ...importConf
101
+ };
102
+ }
103
+ }
104
+ if (mergedExportSettings.format !== undefined || mergedExportSettings.disableSave !== undefined || mergedExportSettings.disableDownload !== undefined) {
105
+ baseExportCollection = {
106
+ ...baseExportCollection,
107
+ admin: {
108
+ ...baseExportCollection.admin,
109
+ custom: {
110
+ ...baseExportCollection.admin?.custom,
111
+ ...mergedExportSettings.disableDownload !== undefined && {
112
+ disableDownload: mergedExportSettings.disableDownload
113
+ },
114
+ ...mergedExportSettings.disableSave !== undefined && {
115
+ disableSave: mergedExportSettings.disableSave
116
+ },
117
+ ...mergedExportSettings.format !== undefined && {
118
+ format: mergedExportSettings.format
119
+ }
120
+ }
121
+ }
122
+ };
123
+ }
124
+ }
92
125
  exportCollections.unshift(baseExportCollection);
93
126
  importCollections.unshift(baseImportCollection);
94
127
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getPluginCollections.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport type { ExportConfig, ImportConfig, ImportExportPluginConfig } from '../types.js'\n\nimport { getExportCollection } from '../export/getExportCollection.js'\nimport { getImportCollection } from '../import/getImportCollection.js'\n\nexport type PluginCollectionsResult = {\n /**\n * Map from target collection slug to the export collection slug to use for it.\n * Only contains entries for collections with custom export collection overrides.\n */\n customExportSlugMap: Map<string, string>\n /**\n * Map from target collection slug to the import collection slug to use for it.\n * Only contains entries for collections with custom import collection overrides.\n */\n customImportSlugMap: Map<string, string>\n /**\n * All export collections (base + any per-collection overrides)\n */\n exportCollections: CollectionConfig[]\n /**\n * All import collections (base + any per-collection overrides)\n */\n importCollections: CollectionConfig[]\n}\n\n/**\n * Processes the plugin config and returns export/import collections.\n *\n * - Creates the base export and import collections\n * - Applies top-level overrideExportCollection/overrideImportCollection if provided\n * - For each collection in `pluginConfig.collections` that has a function override\n * for `export` or `import`, applies the override to create customized collections\n *\n * @param config - The Payload config\n * @param pluginConfig - The import/export plugin config\n * @returns Object containing arrays of export and import collections\n */\nexport const getPluginCollections = async ({\n config,\n pluginConfig,\n}: {\n config: Config\n pluginConfig: ImportExportPluginConfig\n}): Promise<PluginCollectionsResult> => {\n // Get the base export and import collections with default configs (no per-collection settings)\n let baseExportCollection = getExportCollection({\n config,\n pluginConfig,\n })\n let baseImportCollection = getImportCollection({\n config,\n pluginConfig,\n })\n\n // Apply top-level collection overrides if provided\n if (\n pluginConfig.overrideExportCollection &&\n typeof pluginConfig.overrideExportCollection === 'function'\n ) {\n baseExportCollection = await pluginConfig.overrideExportCollection({\n collection: baseExportCollection,\n })\n }\n\n if (\n pluginConfig.overrideImportCollection &&\n typeof pluginConfig.overrideImportCollection === 'function'\n ) {\n baseImportCollection = await pluginConfig.overrideImportCollection({\n collection: baseImportCollection,\n })\n }\n\n const exportCollections: CollectionConfig[] = []\n const importCollections: CollectionConfig[] = []\n\n // Maps from target collection slug to the export/import collection slug to use\n const customExportSlugMap = new Map<string, string>()\n const customImportSlugMap = new Map<string, string>()\n\n // Process each collection config for custom collection overrides\n if (pluginConfig.collections && pluginConfig.collections.length > 0) {\n for (const collectionConfig of pluginConfig.collections) {\n // Handle export config - only process if overrideCollection is provided\n // Settings like disableJobsQueue require a custom slug to work properly\n const exportConfig =\n typeof collectionConfig.export === 'object' ? collectionConfig.export : undefined\n if (exportConfig?.overrideCollection) {\n // Generate a collection with this export config's settings (like disableJobsQueue)\n const collectionWithSettings = getExportCollection({\n config,\n exportConfig,\n pluginConfig,\n })\n\n const customExport = await exportConfig.overrideCollection({\n collection: collectionWithSettings,\n })\n\n // If the slug changed, this is a separate collection; otherwise it modifies the base\n if (customExport.slug !== baseExportCollection.slug) {\n exportCollections.push(customExport)\n // Map this target collection to its custom export collection\n customExportSlugMap.set(collectionConfig.slug, customExport.slug)\n } else {\n // Full override - replace the base\n baseExportCollection = customExport\n }\n }\n\n // Handle import config - only process if overrideCollection is provided\n // Settings like disableJobsQueue require a custom slug to work properly\n const importConf =\n typeof collectionConfig.import === 'object' ? collectionConfig.import : undefined\n if (importConf?.overrideCollection) {\n // Generate a collection with this import config's settings (like disableJobsQueue)\n const collectionWithSettings = getImportCollection({\n config,\n importConfig: importConf,\n pluginConfig,\n })\n\n const customImport = await importConf.overrideCollection({\n collection: collectionWithSettings,\n })\n\n // If the slug changed, this is a separate collection; otherwise it modifies the base\n if (customImport.slug !== baseImportCollection.slug) {\n importCollections.push(customImport)\n // Map this target collection to its custom import collection\n customImportSlugMap.set(collectionConfig.slug, customImport.slug)\n } else {\n // Full override - replace the base\n baseImportCollection = customImport\n }\n }\n }\n }\n\n // Add base collections to the front of the arrays\n exportCollections.unshift(baseExportCollection)\n importCollections.unshift(baseImportCollection)\n\n return {\n customExportSlugMap,\n customImportSlugMap,\n exportCollections,\n importCollections,\n }\n}\n"],"names":["getExportCollection","getImportCollection","getPluginCollections","config","pluginConfig","baseExportCollection","baseImportCollection","overrideExportCollection","collection","overrideImportCollection","exportCollections","importCollections","customExportSlugMap","Map","customImportSlugMap","collections","length","collectionConfig","exportConfig","export","undefined","overrideCollection","collectionWithSettings","customExport","slug","push","set","importConf","import","importConfig","customImport","unshift"],"mappings":"AAIA,SAASA,mBAAmB,QAAQ,mCAAkC;AACtE,SAASC,mBAAmB,QAAQ,mCAAkC;AAuBtE;;;;;;;;;;;CAWC,GACD,OAAO,MAAMC,uBAAuB,OAAO,EACzCC,MAAM,EACNC,YAAY,EAIb;IACC,+FAA+F;IAC/F,IAAIC,uBAAuBL,oBAAoB;QAC7CG;QACAC;IACF;IACA,IAAIE,uBAAuBL,oBAAoB;QAC7CE;QACAC;IACF;IAEA,mDAAmD;IACnD,IACEA,aAAaG,wBAAwB,IACrC,OAAOH,aAAaG,wBAAwB,KAAK,YACjD;QACAF,uBAAuB,MAAMD,aAAaG,wBAAwB,CAAC;YACjEC,YAAYH;QACd;IACF;IAEA,IACED,aAAaK,wBAAwB,IACrC,OAAOL,aAAaK,wBAAwB,KAAK,YACjD;QACAH,uBAAuB,MAAMF,aAAaK,wBAAwB,CAAC;YACjED,YAAYF;QACd;IACF;IAEA,MAAMI,oBAAwC,EAAE;IAChD,MAAMC,oBAAwC,EAAE;IAEhD,+EAA+E;IAC/E,MAAMC,sBAAsB,IAAIC;IAChC,MAAMC,sBAAsB,IAAID;IAEhC,iEAAiE;IACjE,IAAIT,aAAaW,WAAW,IAAIX,aAAaW,WAAW,CAACC,MAAM,GAAG,GAAG;QACnE,KAAK,MAAMC,oBAAoBb,aAAaW,WAAW,CAAE;YACvD,wEAAwE;YACxE,wEAAwE;YACxE,MAAMG,eACJ,OAAOD,iBAAiBE,MAAM,KAAK,WAAWF,iBAAiBE,MAAM,GAAGC;YAC1E,IAAIF,cAAcG,oBAAoB;gBACpC,mFAAmF;gBACnF,MAAMC,yBAAyBtB,oBAAoB;oBACjDG;oBACAe;oBACAd;gBACF;gBAEA,MAAMmB,eAAe,MAAML,aAAaG,kBAAkB,CAAC;oBACzDb,YAAYc;gBACd;gBAEA,qFAAqF;gBACrF,IAAIC,aAAaC,IAAI,KAAKnB,qBAAqBmB,IAAI,EAAE;oBACnDd,kBAAkBe,IAAI,CAACF;oBACvB,6DAA6D;oBAC7DX,oBAAoBc,GAAG,CAACT,iBAAiBO,IAAI,EAAED,aAAaC,IAAI;gBAClE,OAAO;oBACL,mCAAmC;oBACnCnB,uBAAuBkB;gBACzB;YACF;YAEA,wEAAwE;YACxE,wEAAwE;YACxE,MAAMI,aACJ,OAAOV,iBAAiBW,MAAM,KAAK,WAAWX,iBAAiBW,MAAM,GAAGR;YAC1E,IAAIO,YAAYN,oBAAoB;gBAClC,mFAAmF;gBACnF,MAAMC,yBAAyBrB,oBAAoB;oBACjDE;oBACA0B,cAAcF;oBACdvB;gBACF;gBAEA,MAAM0B,eAAe,MAAMH,WAAWN,kBAAkB,CAAC;oBACvDb,YAAYc;gBACd;gBAEA,qFAAqF;gBACrF,IAAIQ,aAAaN,IAAI,KAAKlB,qBAAqBkB,IAAI,EAAE;oBACnDb,kBAAkBc,IAAI,CAACK;oBACvB,6DAA6D;oBAC7DhB,oBAAoBY,GAAG,CAACT,iBAAiBO,IAAI,EAAEM,aAAaN,IAAI;gBAClE,OAAO;oBACL,mCAAmC;oBACnClB,uBAAuBwB;gBACzB;YACF;QACF;IACF;IAEA,kDAAkD;IAClDpB,kBAAkBqB,OAAO,CAAC1B;IAC1BM,kBAAkBoB,OAAO,CAACzB;IAE1B,OAAO;QACLM;QACAE;QACAJ;QACAC;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getPluginCollections.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport type { ExportConfig, ImportConfig, ImportExportPluginConfig } from '../types.js'\n\nimport { getExportCollection } from '../export/getExportCollection.js'\nimport { getImportCollection } from '../import/getImportCollection.js'\n\nexport type PluginCollectionsResult = {\n /**\n * Map from target collection slug to the export collection slug to use for it.\n * Only contains entries for collections with custom export collection overrides.\n */\n customExportSlugMap: Map<string, string>\n /**\n * Map from target collection slug to the import collection slug to use for it.\n * Only contains entries for collections with custom import collection overrides.\n */\n customImportSlugMap: Map<string, string>\n /**\n * All export collections (base + any per-collection overrides)\n */\n exportCollections: CollectionConfig[]\n /**\n * All import collections (base + any per-collection overrides)\n */\n importCollections: CollectionConfig[]\n}\n\n/**\n * Processes the plugin config and returns export/import collections.\n *\n * - Creates the base export and import collections\n * - Applies top-level overrideExportCollection/overrideImportCollection if provided\n * - For each collection in `pluginConfig.collections` that has a function override\n * for `export` or `import`, applies the override to create customized collections\n * - Applies settings from collections without overrideCollection to the base collection\n *\n * @param config - The Payload config\n * @param pluginConfig - The import/export plugin config\n * @returns Object containing arrays of export and import collections\n */\nexport const getPluginCollections = async ({\n config,\n pluginConfig,\n}: {\n config: Config\n pluginConfig: ImportExportPluginConfig\n}): Promise<PluginCollectionsResult> => {\n let baseExportCollection = getExportCollection({\n config,\n pluginConfig,\n })\n let baseImportCollection = getImportCollection({\n config,\n pluginConfig,\n })\n\n if (\n pluginConfig.overrideExportCollection &&\n typeof pluginConfig.overrideExportCollection === 'function'\n ) {\n baseExportCollection = await pluginConfig.overrideExportCollection({\n collection: baseExportCollection,\n })\n }\n\n if (\n pluginConfig.overrideImportCollection &&\n typeof pluginConfig.overrideImportCollection === 'function'\n ) {\n baseImportCollection = await pluginConfig.overrideImportCollection({\n collection: baseImportCollection,\n })\n }\n\n const exportCollections: CollectionConfig[] = []\n const importCollections: CollectionConfig[] = []\n\n const customExportSlugMap = new Map<string, string>()\n const customImportSlugMap = new Map<string, string>()\n\n // Process each collection config for custom collection overrides\n if (pluginConfig.collections && pluginConfig.collections.length > 0) {\n for (const collectionConfig of pluginConfig.collections) {\n const exportConfig =\n typeof collectionConfig.export === 'object' ? collectionConfig.export : undefined\n if (exportConfig?.overrideCollection) {\n // Generate a collection with this export config's settings (like disableJobsQueue)\n const collectionWithSettings = getExportCollection({\n config,\n exportConfig,\n pluginConfig,\n })\n\n const customExport = await exportConfig.overrideCollection({\n collection: collectionWithSettings,\n })\n\n // If the slug changed, this is a separate collection; otherwise it modifies the base\n if (customExport.slug !== baseExportCollection.slug) {\n exportCollections.push(customExport)\n customExportSlugMap.set(collectionConfig.slug, customExport.slug)\n } else {\n baseExportCollection = customExport\n }\n }\n\n const importConf =\n typeof collectionConfig.import === 'object' ? collectionConfig.import : undefined\n if (importConf?.overrideCollection) {\n // Generate a collection with this import config's settings (like disableJobsQueue)\n const collectionWithSettings = getImportCollection({\n config,\n importConfig: importConf,\n pluginConfig,\n })\n\n const customImport = await importConf.overrideCollection({\n collection: collectionWithSettings,\n })\n\n // If the slug changed, this is a separate collection; otherwise it modifies the base\n if (customImport.slug !== baseImportCollection.slug) {\n importCollections.push(customImport)\n // Map this target collection to its custom import collection\n customImportSlugMap.set(collectionConfig.slug, customImport.slug)\n } else {\n // Full override - replace the base\n baseImportCollection = customImport\n }\n }\n }\n }\n\n // Apply settings from collections without overrideCollection to the base collection\n // This is done AFTER all overrides so these settings take precedence\n if (pluginConfig.collections && pluginConfig.collections.length > 0) {\n let mergedExportSettings: Partial<ExportConfig> = {}\n let mergedImportSettings: Partial<ImportConfig> = {}\n\n for (const collectionConfig of pluginConfig.collections) {\n const exportConf =\n typeof collectionConfig.export === 'object' ? collectionConfig.export : undefined\n const importConf =\n typeof collectionConfig.import === 'object' ? collectionConfig.import : undefined\n\n if (exportConf && !exportConf.overrideCollection) {\n mergedExportSettings = { ...mergedExportSettings, ...exportConf }\n }\n if (importConf && !importConf.overrideCollection) {\n mergedImportSettings = { ...mergedImportSettings, ...importConf }\n }\n }\n\n if (\n mergedExportSettings.format !== undefined ||\n mergedExportSettings.disableSave !== undefined ||\n mergedExportSettings.disableDownload !== undefined\n ) {\n baseExportCollection = {\n ...baseExportCollection,\n admin: {\n ...baseExportCollection.admin,\n custom: {\n ...baseExportCollection.admin?.custom,\n ...(mergedExportSettings.disableDownload !== undefined && {\n disableDownload: mergedExportSettings.disableDownload,\n }),\n ...(mergedExportSettings.disableSave !== undefined && {\n disableSave: mergedExportSettings.disableSave,\n }),\n ...(mergedExportSettings.format !== undefined && {\n format: mergedExportSettings.format,\n }),\n },\n },\n }\n }\n }\n\n exportCollections.unshift(baseExportCollection)\n importCollections.unshift(baseImportCollection)\n\n return {\n customExportSlugMap,\n customImportSlugMap,\n exportCollections,\n importCollections,\n }\n}\n"],"names":["getExportCollection","getImportCollection","getPluginCollections","config","pluginConfig","baseExportCollection","baseImportCollection","overrideExportCollection","collection","overrideImportCollection","exportCollections","importCollections","customExportSlugMap","Map","customImportSlugMap","collections","length","collectionConfig","exportConfig","export","undefined","overrideCollection","collectionWithSettings","customExport","slug","push","set","importConf","import","importConfig","customImport","mergedExportSettings","mergedImportSettings","exportConf","format","disableSave","disableDownload","admin","custom","unshift"],"mappings":"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"}
@@ -20,6 +20,12 @@ export type GetSchemaColumnsArgs = {
20
20
  * Available locale codes from config. Required when locale='all'.
21
21
  */
22
22
  localeCodes?: string[];
23
+ /**
24
+ * Set of auto-generated timezone companion field names (from collectTimezoneCompanionFields).
25
+ * These fields are excluded unless explicitly selected.
26
+ * If not provided, no timezone filtering is applied.
27
+ */
28
+ timezoneCompanionFields?: Set<string>;
23
29
  };
24
30
  /**
25
31
  * Derives CSV column names from the collection schema.
@@ -33,11 +39,11 @@ export type GetSchemaColumnsArgs = {
33
39
  * - Works for empty exports
34
40
  * - Ensures proper column ordering
35
41
  */
36
- export declare const getSchemaColumns: ({ collectionConfig, disabledFields, fields: selectedFields, locale, localeCodes, }: GetSchemaColumnsArgs) => string[];
42
+ export declare const getSchemaColumns: ({ collectionConfig, disabledFields, fields: selectedFields, locale, localeCodes, timezoneCompanionFields, }: GetSchemaColumnsArgs) => string[];
37
43
  /**
38
44
  * Merges schema-derived columns with data-discovered columns.
39
45
  * Schema columns provide the base ordering, data columns add any additional
40
- * columns (e.g., array indices beyond 0, dynamic fields).
46
+ * columns (e.g., array indices beyond 0, dynamic fields, derived columns from toCSV).
41
47
  */
42
48
  export declare const mergeColumns: (schemaColumns: string[], dataColumns: string[]) => string[];
43
49
  //# sourceMappingURL=getSchemaColumns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getSchemaColumns.d.ts","sourceRoot":"","sources":["../../src/utilities/getSchemaColumns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAIxD,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,uFAM1B,oBAAoB,KAAG,MAAM,EA4E/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,kBAAmB,MAAM,EAAE,eAAe,MAAM,EAAE,KAAG,MAAM,EAoCnF,CAAA"}
1
+ {"version":3,"file":"getSchemaColumns.d.ts","sourceRoot":"","sources":["../../src/utilities/getSchemaColumns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAIxD,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACtC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,gHAO1B,oBAAoB,KAAG,MAAM,EA4E/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,kBAAmB,MAAM,EAAE,eAAe,MAAM,EAAE,KAAG,MAAM,EA+DnF,CAAA"}