@payloadcms/plugin-import-export 3.52.0-internal.8a9caef → 3.53.0-internal.2dadf5b

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 (177) hide show
  1. package/dist/components/ExportSaveButton/index.d.ts.map +1 -1
  2. package/dist/components/ExportSaveButton/index.js +12 -3
  3. package/dist/components/ExportSaveButton/index.js.map +1 -1
  4. package/dist/components/Page/index.d.ts +4 -0
  5. package/dist/components/Page/index.d.ts.map +1 -0
  6. package/dist/components/Page/index.js +41 -0
  7. package/dist/components/Page/index.js.map +1 -0
  8. package/dist/components/Page/index.scss +3 -0
  9. package/dist/components/Preview/index.d.ts.map +1 -1
  10. package/dist/components/Preview/index.js +5 -0
  11. package/dist/components/Preview/index.js.map +1 -1
  12. package/dist/components/SortBy/index.d.ts +1 -0
  13. package/dist/components/SortBy/index.d.ts.map +1 -1
  14. package/dist/components/SortBy/index.js +64 -22
  15. package/dist/components/SortBy/index.js.map +1 -1
  16. package/dist/components/SortBy/index.scss +1 -2
  17. package/dist/components/SortOrder/index.d.ts +4 -0
  18. package/dist/components/SortOrder/index.d.ts.map +1 -0
  19. package/dist/components/SortOrder/index.js +123 -0
  20. package/dist/components/SortOrder/index.js.map +1 -0
  21. package/dist/components/SortOrder/index.scss +3 -0
  22. package/dist/export/createExport.d.ts +2 -0
  23. package/dist/export/createExport.d.ts.map +1 -1
  24. package/dist/export/createExport.js +66 -15
  25. package/dist/export/createExport.js.map +1 -1
  26. package/dist/export/download.d.ts.map +1 -1
  27. package/dist/export/download.js +34 -16
  28. package/dist/export/download.js.map +1 -1
  29. package/dist/export/flattenObject.d.ts.map +1 -1
  30. package/dist/export/flattenObject.js +32 -20
  31. package/dist/export/flattenObject.js.map +1 -1
  32. package/dist/export/getCustomFieldFunctions.d.ts.map +1 -1
  33. package/dist/export/getCustomFieldFunctions.js +11 -1
  34. package/dist/export/getCustomFieldFunctions.js.map +1 -1
  35. package/dist/export/getFields.d.ts.map +1 -1
  36. package/dist/export/getFields.js +56 -10
  37. package/dist/export/getFields.js.map +1 -1
  38. package/dist/exports/rsc.d.ts +2 -0
  39. package/dist/exports/rsc.d.ts.map +1 -1
  40. package/dist/exports/rsc.js +2 -0
  41. package/dist/exports/rsc.js.map +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +3 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/translations/languages/ar.d.ts.map +1 -1
  46. package/dist/translations/languages/ar.js +2 -0
  47. package/dist/translations/languages/ar.js.map +1 -1
  48. package/dist/translations/languages/az.d.ts.map +1 -1
  49. package/dist/translations/languages/az.js +2 -0
  50. package/dist/translations/languages/az.js.map +1 -1
  51. package/dist/translations/languages/bg.d.ts.map +1 -1
  52. package/dist/translations/languages/bg.js +2 -0
  53. package/dist/translations/languages/bg.js.map +1 -1
  54. package/dist/translations/languages/ca.d.ts.map +1 -1
  55. package/dist/translations/languages/ca.js +2 -0
  56. package/dist/translations/languages/ca.js.map +1 -1
  57. package/dist/translations/languages/cs.d.ts.map +1 -1
  58. package/dist/translations/languages/cs.js +2 -0
  59. package/dist/translations/languages/cs.js.map +1 -1
  60. package/dist/translations/languages/da.d.ts.map +1 -1
  61. package/dist/translations/languages/da.js +2 -0
  62. package/dist/translations/languages/da.js.map +1 -1
  63. package/dist/translations/languages/de.d.ts.map +1 -1
  64. package/dist/translations/languages/de.js +2 -0
  65. package/dist/translations/languages/de.js.map +1 -1
  66. package/dist/translations/languages/en.d.ts +2 -0
  67. package/dist/translations/languages/en.d.ts.map +1 -1
  68. package/dist/translations/languages/en.js +2 -0
  69. package/dist/translations/languages/en.js.map +1 -1
  70. package/dist/translations/languages/es.d.ts.map +1 -1
  71. package/dist/translations/languages/es.js +2 -0
  72. package/dist/translations/languages/es.js.map +1 -1
  73. package/dist/translations/languages/et.d.ts.map +1 -1
  74. package/dist/translations/languages/et.js +2 -0
  75. package/dist/translations/languages/et.js.map +1 -1
  76. package/dist/translations/languages/fa.d.ts.map +1 -1
  77. package/dist/translations/languages/fa.js +2 -0
  78. package/dist/translations/languages/fa.js.map +1 -1
  79. package/dist/translations/languages/fr.d.ts.map +1 -1
  80. package/dist/translations/languages/fr.js +2 -0
  81. package/dist/translations/languages/fr.js.map +1 -1
  82. package/dist/translations/languages/he.d.ts.map +1 -1
  83. package/dist/translations/languages/he.js +2 -0
  84. package/dist/translations/languages/he.js.map +1 -1
  85. package/dist/translations/languages/hr.d.ts.map +1 -1
  86. package/dist/translations/languages/hr.js +2 -0
  87. package/dist/translations/languages/hr.js.map +1 -1
  88. package/dist/translations/languages/hu.d.ts.map +1 -1
  89. package/dist/translations/languages/hu.js +2 -0
  90. package/dist/translations/languages/hu.js.map +1 -1
  91. package/dist/translations/languages/hy.d.ts.map +1 -1
  92. package/dist/translations/languages/hy.js +2 -0
  93. package/dist/translations/languages/hy.js.map +1 -1
  94. package/dist/translations/languages/it.d.ts.map +1 -1
  95. package/dist/translations/languages/it.js +2 -0
  96. package/dist/translations/languages/it.js.map +1 -1
  97. package/dist/translations/languages/ja.d.ts.map +1 -1
  98. package/dist/translations/languages/ja.js +2 -0
  99. package/dist/translations/languages/ja.js.map +1 -1
  100. package/dist/translations/languages/ko.d.ts.map +1 -1
  101. package/dist/translations/languages/ko.js +2 -0
  102. package/dist/translations/languages/ko.js.map +1 -1
  103. package/dist/translations/languages/lt.d.ts.map +1 -1
  104. package/dist/translations/languages/lt.js +2 -0
  105. package/dist/translations/languages/lt.js.map +1 -1
  106. package/dist/translations/languages/lv.d.ts.map +1 -1
  107. package/dist/translations/languages/lv.js +2 -0
  108. package/dist/translations/languages/lv.js.map +1 -1
  109. package/dist/translations/languages/my.d.ts.map +1 -1
  110. package/dist/translations/languages/my.js +2 -0
  111. package/dist/translations/languages/my.js.map +1 -1
  112. package/dist/translations/languages/nb.d.ts.map +1 -1
  113. package/dist/translations/languages/nb.js +2 -0
  114. package/dist/translations/languages/nb.js.map +1 -1
  115. package/dist/translations/languages/nl.d.ts.map +1 -1
  116. package/dist/translations/languages/nl.js +2 -0
  117. package/dist/translations/languages/nl.js.map +1 -1
  118. package/dist/translations/languages/pl.d.ts.map +1 -1
  119. package/dist/translations/languages/pl.js +2 -0
  120. package/dist/translations/languages/pl.js.map +1 -1
  121. package/dist/translations/languages/pt.d.ts.map +1 -1
  122. package/dist/translations/languages/pt.js +2 -0
  123. package/dist/translations/languages/pt.js.map +1 -1
  124. package/dist/translations/languages/ro.d.ts.map +1 -1
  125. package/dist/translations/languages/ro.js +2 -0
  126. package/dist/translations/languages/ro.js.map +1 -1
  127. package/dist/translations/languages/rs.d.ts.map +1 -1
  128. package/dist/translations/languages/rs.js +2 -0
  129. package/dist/translations/languages/rs.js.map +1 -1
  130. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  131. package/dist/translations/languages/rsLatin.js +2 -0
  132. package/dist/translations/languages/rsLatin.js.map +1 -1
  133. package/dist/translations/languages/ru.d.ts.map +1 -1
  134. package/dist/translations/languages/ru.js +2 -0
  135. package/dist/translations/languages/ru.js.map +1 -1
  136. package/dist/translations/languages/sk.d.ts.map +1 -1
  137. package/dist/translations/languages/sk.js +2 -0
  138. package/dist/translations/languages/sk.js.map +1 -1
  139. package/dist/translations/languages/sl.d.ts.map +1 -1
  140. package/dist/translations/languages/sl.js +2 -0
  141. package/dist/translations/languages/sl.js.map +1 -1
  142. package/dist/translations/languages/sv.d.ts.map +1 -1
  143. package/dist/translations/languages/sv.js +2 -0
  144. package/dist/translations/languages/sv.js.map +1 -1
  145. package/dist/translations/languages/th.d.ts.map +1 -1
  146. package/dist/translations/languages/th.js +2 -0
  147. package/dist/translations/languages/th.js.map +1 -1
  148. package/dist/translations/languages/tr.d.ts.map +1 -1
  149. package/dist/translations/languages/tr.js +2 -0
  150. package/dist/translations/languages/tr.js.map +1 -1
  151. package/dist/translations/languages/translation-schema.json +7 -0
  152. package/dist/translations/languages/uk.d.ts.map +1 -1
  153. package/dist/translations/languages/uk.js +2 -0
  154. package/dist/translations/languages/uk.js.map +1 -1
  155. package/dist/translations/languages/vi.d.ts.map +1 -1
  156. package/dist/translations/languages/vi.js +2 -0
  157. package/dist/translations/languages/vi.js.map +1 -1
  158. package/dist/translations/languages/zh.d.ts.map +1 -1
  159. package/dist/translations/languages/zh.js +2 -0
  160. package/dist/translations/languages/zh.js.map +1 -1
  161. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  162. package/dist/translations/languages/zhTw.js +2 -0
  163. package/dist/translations/languages/zhTw.js.map +1 -1
  164. package/dist/translations/types.d.ts +2 -0
  165. package/dist/translations/types.d.ts.map +1 -1
  166. package/dist/translations/types.js.map +1 -1
  167. package/dist/utilities/getFlattenedFieldKeys.js +1 -1
  168. package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
  169. package/dist/utilities/sortHelpers.d.ts +6 -0
  170. package/dist/utilities/sortHelpers.d.ts.map +1 -0
  171. package/dist/utilities/sortHelpers.js +14 -0
  172. package/dist/utilities/sortHelpers.js.map +1 -0
  173. package/dist/utilities/validateLimitValue.d.ts +3 -0
  174. package/dist/utilities/validateLimitValue.d.ts.map +1 -0
  175. package/dist/utilities/validateLimitValue.js +15 -0
  176. package/dist/utilities/validateLimitValue.js.map +1 -0
  177. package/package.json +8 -8
@@ -2,12 +2,13 @@
2
2
  import { APIError } from 'payload';
3
3
  import { Readable } from 'stream';
4
4
  import { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js';
5
+ import { validateLimitValue } from '../utilities/validateLimitValue.js';
5
6
  import { flattenObject } from './flattenObject.js';
6
7
  import { getCustomFieldFunctions } from './getCustomFieldFunctions.js';
7
8
  import { getFilename } from './getFilename.js';
8
9
  import { getSelect } from './getSelect.js';
9
10
  export const createExport = async (args)=>{
10
- const { download, input: { id, name: nameArg, collectionSlug, debug = false, drafts, exportsCollection, fields, format, locale: localeInput, sort, user, where }, req: { locale: localeArg, payload }, req } = args;
11
+ const { download, input: { id, name: nameArg, collectionSlug, debug = false, drafts, exportsCollection, fields, format, locale: localeInput, sort, user, page, limit: incomingLimit, where }, req: { locale: localeArg, payload }, req } = args;
11
12
  if (debug) {
12
13
  req.payload.logger.debug({
13
14
  message: 'Starting export process with args:',
@@ -33,11 +34,23 @@ export const createExport = async (args)=>{
33
34
  locale
34
35
  });
35
36
  }
37
+ const batchSize = 100 // fixed per request
38
+ ;
39
+ const hardLimit = typeof incomingLimit === 'number' && incomingLimit > 0 ? incomingLimit : undefined;
40
+ const { totalDocs } = await payload.count({
41
+ collection: collectionSlug,
42
+ user,
43
+ locale,
44
+ overrideAccess: false
45
+ });
46
+ const totalPages = Math.max(1, Math.ceil(totalDocs / batchSize));
47
+ const requestedPage = page || 1;
48
+ const adjustedPage = requestedPage > totalPages ? 1 : requestedPage;
36
49
  const findArgs = {
37
50
  collection: collectionSlug,
38
51
  depth: 1,
39
52
  draft: drafts === 'yes',
40
- limit: 100,
53
+ limit: batchSize,
41
54
  locale,
42
55
  overrideAccess: false,
43
56
  page: 0,
@@ -89,15 +102,27 @@ export const createExport = async (args)=>{
89
102
  if (debug) {
90
103
  req.payload.logger.debug('Pre-scanning all columns before streaming');
91
104
  }
105
+ const limitErrorMsg = validateLimitValue(incomingLimit, req.t, batchSize);
106
+ if (limitErrorMsg) {
107
+ throw new APIError(limitErrorMsg);
108
+ }
92
109
  const allColumns = [];
93
110
  if (isCSV) {
94
111
  const allColumnsSet = new Set();
95
- let scanPage = 1;
112
+ // Use the incoming page value here, defaulting to 1 if undefined
113
+ let scanPage = adjustedPage;
96
114
  let hasMore = true;
115
+ let fetched = 0;
116
+ const maxDocs = typeof hardLimit === 'number' ? hardLimit : Number.POSITIVE_INFINITY;
97
117
  while(hasMore){
118
+ const remaining = Math.max(0, maxDocs - fetched);
119
+ if (remaining === 0) {
120
+ break;
121
+ }
98
122
  const result = await payload.find({
99
123
  ...findArgs,
100
- page: scanPage
124
+ page: scanPage,
125
+ limit: Math.min(batchSize, remaining)
101
126
  });
102
127
  result.docs.forEach((doc)=>{
103
128
  const flat = filterDisabledCSV(flattenObject({
@@ -112,8 +137,10 @@ export const createExport = async (args)=>{
112
137
  }
113
138
  });
114
139
  });
115
- hasMore = result.hasNextPage;
116
- scanPage += 1;
140
+ fetched += result.docs.length;
141
+ scanPage += 1 // Increment page for next batch
142
+ ;
143
+ hasMore = result.hasNextPage && fetched < maxDocs;
117
144
  }
118
145
  if (debug) {
119
146
  req.payload.logger.debug(`Discovered ${allColumns.length} columns`);
@@ -121,12 +148,23 @@ export const createExport = async (args)=>{
121
148
  }
122
149
  const encoder = new TextEncoder();
123
150
  let isFirstBatch = true;
124
- let streamPage = 1;
151
+ let streamPage = adjustedPage;
152
+ let fetched = 0;
153
+ const maxDocs = typeof hardLimit === 'number' ? hardLimit : Number.POSITIVE_INFINITY;
125
154
  const stream = new Readable({
126
155
  async read () {
156
+ const remaining = Math.max(0, maxDocs - fetched);
157
+ if (remaining === 0) {
158
+ if (!isCSV) {
159
+ this.push(encoder.encode(']'));
160
+ }
161
+ this.push(null);
162
+ return;
163
+ }
127
164
  const result = await payload.find({
128
165
  ...findArgs,
129
- page: streamPage
166
+ page: streamPage,
167
+ limit: Math.min(batchSize, remaining)
130
168
  });
131
169
  if (debug) {
132
170
  req.payload.logger.debug(`Streaming batch ${streamPage} with ${result.docs.length} docs`);
@@ -169,9 +207,11 @@ export const createExport = async (args)=>{
169
207
  this.push(encoder.encode(',' + batchJSON));
170
208
  }
171
209
  }
210
+ fetched += result.docs.length;
172
211
  isFirstBatch = false;
173
- streamPage += 1;
174
- if (!result.hasNextPage) {
212
+ streamPage += 1 // Increment stream page for the next batch
213
+ ;
214
+ if (!result.hasNextPage || fetched >= maxDocs) {
175
215
  if (debug) {
176
216
  req.payload.logger.debug('Stream complete - no more pages');
177
217
  }
@@ -198,15 +238,23 @@ export const createExport = async (args)=>{
198
238
  const rows = [];
199
239
  const columnsSet = new Set();
200
240
  const columns = [];
201
- let page = 1;
241
+ // Start from the incoming page value, defaulting to 1 if undefined
242
+ let currentPage = adjustedPage;
243
+ let fetched = 0;
202
244
  let hasNextPage = true;
245
+ const maxDocs = typeof hardLimit === 'number' ? hardLimit : Number.POSITIVE_INFINITY;
203
246
  while(hasNextPage){
247
+ const remaining = Math.max(0, maxDocs - fetched);
248
+ if (remaining === 0) {
249
+ break;
250
+ }
204
251
  const result = await payload.find({
205
252
  ...findArgs,
206
- page
253
+ page: currentPage,
254
+ limit: Math.min(batchSize, remaining)
207
255
  });
208
256
  if (debug) {
209
- req.payload.logger.debug(`Processing batch ${findArgs.page} with ${result.docs.length} documents`);
257
+ req.payload.logger.debug(`Processing batch ${currentPage} with ${result.docs.length} documents`);
210
258
  }
211
259
  if (isCSV) {
212
260
  const batchRows = result.docs.map((doc)=>filterDisabledCSV(flattenObject({
@@ -228,9 +276,12 @@ export const createExport = async (args)=>{
228
276
  const batchRows = result.docs.map((doc)=>filterDisabledJSON(doc));
229
277
  outputData.push(batchRows.map((doc)=>JSON.stringify(doc)).join(',\n'));
230
278
  }
231
- hasNextPage = result.hasNextPage;
232
- page += 1;
279
+ fetched += result.docs.length;
280
+ hasNextPage = result.hasNextPage && fetched < maxDocs;
281
+ currentPage += 1 // Increment page for next batch
282
+ ;
233
283
  }
284
+ // Prepare final output
234
285
  if (isCSV) {
235
286
  const paddedRows = rows.map((row)=>{
236
287
  const fullRow = {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, TypedUser, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { flattenObject } from './flattenObject.js'\nimport { getCustomFieldFunctions } from './getCustomFieldFunctions.js'\nimport { getFilename } from './getFilename.js'\nimport { getSelect } from './getSelect.js'\n\nexport type Export = {\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportsCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n locale?: string\n name: string\n slug: string\n sort: Sort\n user: string\n userCollection: string\n where?: Where\n}\n\nexport type CreateExportArgs = {\n /**\n * If true, stream the file instead of saving it\n */\n download?: boolean\n input: Export\n req: PayloadRequest\n user?: TypedUser\n}\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n download,\n input: {\n id,\n name: nameArg,\n collectionSlug,\n debug = false,\n drafts,\n exportsCollection,\n fields,\n format,\n locale: localeInput,\n sort,\n user,\n where,\n },\n req: { locale: localeArg, payload },\n req,\n } = args\n\n if (debug) {\n req.payload.logger.debug({\n message: 'Starting export process with args:',\n collectionSlug,\n drafts,\n fields,\n format,\n })\n }\n\n const locale = localeInput ?? localeArg\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found`)\n }\n\n const name = `${nameArg ?? `${getFilename()}-${collectionSlug}`}.${format}`\n const isCSV = format === 'csv'\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n if (debug) {\n req.payload.logger.debug({ message: 'Export configuration:', name, isCSV, locale })\n }\n\n const findArgs = {\n collection: collectionSlug,\n depth: 1,\n draft: drafts === 'yes',\n limit: 100,\n locale,\n overrideAccess: false,\n page: 0,\n select,\n sort,\n user,\n where,\n }\n\n if (debug) {\n req.payload.logger.debug({ message: 'Find arguments:', findArgs })\n }\n\n const toCSVFunctions = getCustomFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledRegexes: RegExp[] = disabledFields.map(buildDisabledFieldRegex)\n\n const filterDisabledCSV = (row: Record<string, unknown>): Record<string, unknown> => {\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n const isDisabled = disabledRegexes.some((regex) => regex.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n const filterDisabledJSON = (doc: any, parentPath = ''): any => {\n if (Array.isArray(doc)) {\n return doc.map((item) => filterDisabledJSON(item, parentPath))\n }\n\n if (typeof doc !== 'object' || doc === null) {\n return doc\n }\n\n const filtered: Record<string, any> = {}\n for (const [key, value] of Object.entries(doc)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key\n\n // Only remove if this exact path is disabled\n const isDisabled = disabledFields.includes(currentPath)\n\n if (!isDisabled) {\n filtered[key] = filterDisabledJSON(value, currentPath)\n }\n }\n\n return filtered\n }\n\n if (download) {\n if (debug) {\n req.payload.logger.debug('Pre-scanning all columns before streaming')\n }\n\n const allColumns: string[] = []\n\n if (isCSV) {\n const allColumnsSet = new Set<string>()\n let scanPage = 1\n let hasMore = true\n\n while (hasMore) {\n const result = await payload.find({ ...findArgs, page: scanPage })\n\n result.docs.forEach((doc) => {\n const flat = filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions }))\n Object.keys(flat).forEach((key) => {\n if (!allColumnsSet.has(key)) {\n allColumnsSet.add(key)\n allColumns.push(key)\n }\n })\n })\n\n hasMore = result.hasNextPage\n scanPage += 1\n }\n\n if (debug) {\n req.payload.logger.debug(`Discovered ${allColumns.length} columns`)\n }\n }\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let streamPage = 1\n\n const stream = new Readable({\n async read() {\n const result = await payload.find({ ...findArgs, page: streamPage })\n\n if (debug) {\n req.payload.logger.debug(`Streaming batch ${streamPage} with ${result.docs.length} docs`)\n }\n\n if (result.docs.length === 0) {\n // Close JSON array properly if JSON\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null)\n return\n }\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n const paddedRows = batchRows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of allColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n const csvString = stringify(paddedRows, {\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRows.map((row) => JSON.stringify(row)).join(',')\n\n if (isFirstBatch) {\n this.push(encoder.encode('[' + batchJSON))\n } else {\n this.push(encoder.encode(',' + batchJSON))\n }\n }\n\n isFirstBatch = false\n streamPage += 1\n\n if (!result.hasNextPage) {\n if (debug) {\n req.payload.logger.debug('Stream complete - no more pages')\n }\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null) // End the stream\n }\n },\n })\n\n return new Response(stream as any, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv' : 'application/json',\n },\n })\n }\n\n // Non-download path (buffered export)\n if (debug) {\n req.payload.logger.debug('Starting file generation')\n }\n\n const outputData: string[] = []\n const rows: Record<string, unknown>[] = []\n const columnsSet = new Set<string>()\n const columns: string[] = []\n let page = 1\n let hasNextPage = true\n\n while (hasNextPage) {\n const result = await payload.find({\n ...findArgs,\n page,\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Processing batch ${findArgs.page} with ${result.docs.length} documents`,\n )\n }\n\n if (isCSV) {\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n // Track discovered column keys\n batchRows.forEach((row) => {\n Object.keys(row).forEach((key) => {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n })\n })\n\n rows.push(...batchRows)\n } else {\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n outputData.push(batchRows.map((doc) => JSON.stringify(doc)).join(',\\n'))\n }\n\n hasNextPage = result.hasNextPage\n page += 1\n }\n\n if (isCSV) {\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of columns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n outputData.push(\n stringify(paddedRows, {\n header: true,\n columns,\n }),\n )\n }\n\n const buffer = Buffer.from(format === 'json' ? `[${outputData.join(',')}]` : outputData.join(''))\n if (debug) {\n req.payload.logger.debug(`${format} file generation complete`)\n }\n\n if (!id) {\n if (debug) {\n req.payload.logger.debug('Creating new export file')\n }\n req.file = {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug(`Updating existing export with id: ${id}`)\n }\n await req.payload.update({\n id,\n collection: exportsCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n },\n user,\n })\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","buildDisabledFieldRegex","flattenObject","getCustomFieldFunctions","getFilename","getSelect","createExport","args","download","input","id","name","nameArg","collectionSlug","debug","drafts","exportsCollection","fields","format","locale","localeInput","sort","user","where","req","localeArg","payload","logger","message","collectionConfig","config","collections","find","slug","isCSV","select","Array","isArray","length","undefined","findArgs","collection","depth","draft","limit","overrideAccess","page","toCSVFunctions","flattenedFields","disabledFields","admin","custom","disabledRegexes","map","filterDisabledCSV","row","filtered","key","value","Object","entries","isDisabled","some","regex","test","filterDisabledJSON","doc","parentPath","item","currentPath","includes","allColumns","allColumnsSet","Set","scanPage","hasMore","result","docs","forEach","flat","keys","has","add","push","hasNextPage","encoder","TextEncoder","isFirstBatch","streamPage","stream","read","encode","batchRows","paddedRows","fullRow","col","csvString","header","columns","batchJSON","JSON","join","Response","headers","outputData","rows","columnsSet","buffer","Buffer","from","file","data","mimetype","size","update"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/createExport.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\nimport type { PayloadRequest, Sort, TypedUser, Where } from 'payload'\n\nimport { stringify } from 'csv-stringify/sync'\nimport { APIError } from 'payload'\nimport { Readable } from 'stream'\n\nimport { buildDisabledFieldRegex } from '../utilities/buildDisabledFieldRegex.js'\nimport { validateLimitValue } from '../utilities/validateLimitValue.js'\nimport { flattenObject } from './flattenObject.js'\nimport { getCustomFieldFunctions } from './getCustomFieldFunctions.js'\nimport { getFilename } from './getFilename.js'\nimport { getSelect } from './getSelect.js'\n\nexport type Export = {\n collectionSlug: string\n /**\n * If true, enables debug logging\n */\n debug?: boolean\n drafts?: 'no' | 'yes'\n exportsCollection: string\n fields?: string[]\n format: 'csv' | 'json'\n globals?: string[]\n id: number | string\n limit?: number\n locale?: string\n name: string\n page?: number\n slug: string\n sort: Sort\n user: string\n userCollection: string\n where?: Where\n}\n\nexport type CreateExportArgs = {\n /**\n * If true, stream the file instead of saving it\n */\n download?: boolean\n input: Export\n req: PayloadRequest\n user?: TypedUser\n}\n\nexport const createExport = async (args: CreateExportArgs) => {\n const {\n download,\n input: {\n id,\n name: nameArg,\n collectionSlug,\n debug = false,\n drafts,\n exportsCollection,\n fields,\n format,\n locale: localeInput,\n sort,\n user,\n page,\n limit: incomingLimit,\n where,\n },\n req: { locale: localeArg, payload },\n req,\n } = args\n\n if (debug) {\n req.payload.logger.debug({\n message: 'Starting export process with args:',\n collectionSlug,\n drafts,\n fields,\n format,\n })\n }\n\n const locale = localeInput ?? localeArg\n const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug)\n if (!collectionConfig) {\n throw new APIError(`Collection with slug ${collectionSlug} not found`)\n }\n\n const name = `${nameArg ?? `${getFilename()}-${collectionSlug}`}.${format}`\n const isCSV = format === 'csv'\n const select = Array.isArray(fields) && fields.length > 0 ? getSelect(fields) : undefined\n\n if (debug) {\n req.payload.logger.debug({ message: 'Export configuration:', name, isCSV, locale })\n }\n\n const batchSize = 100 // fixed per request\n\n const hardLimit =\n typeof incomingLimit === 'number' && incomingLimit > 0 ? incomingLimit : undefined\n\n const { totalDocs } = await payload.count({\n collection: collectionSlug,\n user,\n locale,\n overrideAccess: false,\n })\n\n const totalPages = Math.max(1, Math.ceil(totalDocs / batchSize))\n const requestedPage = page || 1\n const adjustedPage = requestedPage > totalPages ? 1 : requestedPage\n\n const findArgs = {\n collection: collectionSlug,\n depth: 1,\n draft: drafts === 'yes',\n limit: batchSize,\n locale,\n overrideAccess: false,\n page: 0, // The page will be incremented manually in the loop\n select,\n sort,\n user,\n where,\n }\n\n if (debug) {\n req.payload.logger.debug({ message: 'Find arguments:', findArgs })\n }\n\n const toCSVFunctions = getCustomFieldFunctions({\n fields: collectionConfig.flattenedFields,\n })\n\n const disabledFields =\n collectionConfig.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const disabledRegexes: RegExp[] = disabledFields.map(buildDisabledFieldRegex)\n\n const filterDisabledCSV = (row: Record<string, unknown>): Record<string, unknown> => {\n const filtered: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n const isDisabled = disabledRegexes.some((regex) => regex.test(key))\n if (!isDisabled) {\n filtered[key] = value\n }\n }\n\n return filtered\n }\n\n const filterDisabledJSON = (doc: any, parentPath = ''): any => {\n if (Array.isArray(doc)) {\n return doc.map((item) => filterDisabledJSON(item, parentPath))\n }\n\n if (typeof doc !== 'object' || doc === null) {\n return doc\n }\n\n const filtered: Record<string, any> = {}\n for (const [key, value] of Object.entries(doc)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key\n\n // Only remove if this exact path is disabled\n const isDisabled = disabledFields.includes(currentPath)\n\n if (!isDisabled) {\n filtered[key] = filterDisabledJSON(value, currentPath)\n }\n }\n\n return filtered\n }\n\n if (download) {\n if (debug) {\n req.payload.logger.debug('Pre-scanning all columns before streaming')\n }\n\n const limitErrorMsg = validateLimitValue(\n incomingLimit,\n req.t,\n batchSize, // step i.e. 100\n )\n if (limitErrorMsg) {\n throw new APIError(limitErrorMsg)\n }\n\n const allColumns: string[] = []\n\n if (isCSV) {\n const allColumnsSet = new Set<string>()\n\n // Use the incoming page value here, defaulting to 1 if undefined\n let scanPage = adjustedPage\n let hasMore = true\n let fetched = 0\n const maxDocs = typeof hardLimit === 'number' ? hardLimit : Number.POSITIVE_INFINITY\n\n while (hasMore) {\n const remaining = Math.max(0, maxDocs - fetched)\n if (remaining === 0) {\n break\n }\n\n const result = await payload.find({\n ...findArgs,\n page: scanPage,\n limit: Math.min(batchSize, remaining),\n })\n\n result.docs.forEach((doc) => {\n const flat = filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions }))\n Object.keys(flat).forEach((key) => {\n if (!allColumnsSet.has(key)) {\n allColumnsSet.add(key)\n allColumns.push(key)\n }\n })\n })\n\n fetched += result.docs.length\n scanPage += 1 // Increment page for next batch\n hasMore = result.hasNextPage && fetched < maxDocs\n }\n\n if (debug) {\n req.payload.logger.debug(`Discovered ${allColumns.length} columns`)\n }\n }\n\n const encoder = new TextEncoder()\n let isFirstBatch = true\n let streamPage = adjustedPage\n let fetched = 0\n const maxDocs = typeof hardLimit === 'number' ? hardLimit : Number.POSITIVE_INFINITY\n\n const stream = new Readable({\n async read() {\n const remaining = Math.max(0, maxDocs - fetched)\n\n if (remaining === 0) {\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null)\n return\n }\n\n const result = await payload.find({\n ...findArgs,\n page: streamPage,\n limit: Math.min(batchSize, remaining),\n })\n\n if (debug) {\n req.payload.logger.debug(`Streaming batch ${streamPage} with ${result.docs.length} docs`)\n }\n\n if (result.docs.length === 0) {\n // Close JSON array properly if JSON\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null)\n return\n }\n\n if (isCSV) {\n // --- CSV Streaming ---\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n const paddedRows = batchRows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of allColumns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n const csvString = stringify(paddedRows, {\n header: isFirstBatch,\n columns: allColumns,\n })\n\n this.push(encoder.encode(csvString))\n } else {\n // --- JSON Streaming ---\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n\n // Convert each filtered/flattened row into JSON string\n const batchJSON = batchRows.map((row) => JSON.stringify(row)).join(',')\n\n if (isFirstBatch) {\n this.push(encoder.encode('[' + batchJSON))\n } else {\n this.push(encoder.encode(',' + batchJSON))\n }\n }\n\n fetched += result.docs.length\n isFirstBatch = false\n streamPage += 1 // Increment stream page for the next batch\n\n if (!result.hasNextPage || fetched >= maxDocs) {\n if (debug) {\n req.payload.logger.debug('Stream complete - no more pages')\n }\n if (!isCSV) {\n this.push(encoder.encode(']'))\n }\n this.push(null) // End the stream\n }\n },\n })\n\n return new Response(stream as any, {\n headers: {\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'Content-Type': isCSV ? 'text/csv' : 'application/json',\n },\n })\n }\n\n // Non-download path (buffered export)\n if (debug) {\n req.payload.logger.debug('Starting file generation')\n }\n\n const outputData: string[] = []\n const rows: Record<string, unknown>[] = []\n const columnsSet = new Set<string>()\n const columns: string[] = []\n\n // Start from the incoming page value, defaulting to 1 if undefined\n let currentPage = adjustedPage\n let fetched = 0\n let hasNextPage = true\n const maxDocs = typeof hardLimit === 'number' ? hardLimit : Number.POSITIVE_INFINITY\n\n while (hasNextPage) {\n const remaining = Math.max(0, maxDocs - fetched)\n\n if (remaining === 0) {\n break\n }\n\n const result = await payload.find({\n ...findArgs,\n page: currentPage,\n limit: Math.min(batchSize, remaining),\n })\n\n if (debug) {\n req.payload.logger.debug(\n `Processing batch ${currentPage} with ${result.docs.length} documents`,\n )\n }\n\n if (isCSV) {\n const batchRows = result.docs.map((doc) =>\n filterDisabledCSV(flattenObject({ doc, fields, toCSVFunctions })),\n )\n\n // Track discovered column keys\n batchRows.forEach((row) => {\n Object.keys(row).forEach((key) => {\n if (!columnsSet.has(key)) {\n columnsSet.add(key)\n columns.push(key)\n }\n })\n })\n\n rows.push(...batchRows)\n } else {\n const batchRows = result.docs.map((doc) => filterDisabledJSON(doc))\n outputData.push(batchRows.map((doc) => JSON.stringify(doc)).join(',\\n'))\n }\n\n fetched += result.docs.length\n hasNextPage = result.hasNextPage && fetched < maxDocs\n currentPage += 1 // Increment page for next batch\n }\n\n // Prepare final output\n if (isCSV) {\n const paddedRows = rows.map((row) => {\n const fullRow: Record<string, unknown> = {}\n for (const col of columns) {\n fullRow[col] = row[col] ?? ''\n }\n return fullRow\n })\n\n outputData.push(\n stringify(paddedRows, {\n header: true,\n columns,\n }),\n )\n }\n\n const buffer = Buffer.from(format === 'json' ? `[${outputData.join(',')}]` : outputData.join(''))\n if (debug) {\n req.payload.logger.debug(`${format} file generation complete`)\n }\n\n if (!id) {\n if (debug) {\n req.payload.logger.debug('Creating new export file')\n }\n req.file = {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n }\n } else {\n if (debug) {\n req.payload.logger.debug(`Updating existing export with id: ${id}`)\n }\n await req.payload.update({\n id,\n collection: exportsCollection,\n data: {},\n file: {\n name,\n data: buffer,\n mimetype: isCSV ? 'text/csv' : 'application/json',\n size: buffer.length,\n },\n user,\n })\n }\n if (debug) {\n req.payload.logger.debug('Export process completed successfully')\n }\n}\n"],"names":["stringify","APIError","Readable","buildDisabledFieldRegex","validateLimitValue","flattenObject","getCustomFieldFunctions","getFilename","getSelect","createExport","args","download","input","id","name","nameArg","collectionSlug","debug","drafts","exportsCollection","fields","format","locale","localeInput","sort","user","page","limit","incomingLimit","where","req","localeArg","payload","logger","message","collectionConfig","config","collections","find","slug","isCSV","select","Array","isArray","length","undefined","batchSize","hardLimit","totalDocs","count","collection","overrideAccess","totalPages","Math","max","ceil","requestedPage","adjustedPage","findArgs","depth","draft","toCSVFunctions","flattenedFields","disabledFields","admin","custom","disabledRegexes","map","filterDisabledCSV","row","filtered","key","value","Object","entries","isDisabled","some","regex","test","filterDisabledJSON","doc","parentPath","item","currentPath","includes","limitErrorMsg","t","allColumns","allColumnsSet","Set","scanPage","hasMore","fetched","maxDocs","Number","POSITIVE_INFINITY","remaining","result","min","docs","forEach","flat","keys","has","add","push","hasNextPage","encoder","TextEncoder","isFirstBatch","streamPage","stream","read","encode","batchRows","paddedRows","fullRow","col","csvString","header","columns","batchJSON","JSON","join","Response","headers","outputData","rows","columnsSet","currentPage","buffer","Buffer","from","file","data","mimetype","size","update"],"mappings":"AAAA,6CAA6C,GAG7C,SAASA,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,QAAQ,QAAQ,UAAS;AAClC,SAASC,QAAQ,QAAQ,SAAQ;AAEjC,SAASC,uBAAuB,QAAQ,0CAAyC;AACjF,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,WAAW,QAAQ,mBAAkB;AAC9C,SAASC,SAAS,QAAQ,iBAAgB;AAmC1C,OAAO,MAAMC,eAAe,OAAOC;IACjC,MAAM,EACJC,QAAQ,EACRC,OAAO,EACLC,EAAE,EACFC,MAAMC,OAAO,EACbC,cAAc,EACdC,QAAQ,KAAK,EACbC,MAAM,EACNC,iBAAiB,EACjBC,MAAM,EACNC,MAAM,EACNC,QAAQC,WAAW,EACnBC,IAAI,EACJC,IAAI,EACJC,IAAI,EACJC,OAAOC,aAAa,EACpBC,KAAK,EACN,EACDC,KAAK,EAAER,QAAQS,SAAS,EAAEC,OAAO,EAAE,EACnCF,GAAG,EACJ,GAAGpB;IAEJ,IAAIO,OAAO;QACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;YACvBiB,SAAS;YACTlB;YACAE;YACAE;YACAC;QACF;IACF;IAEA,MAAMC,SAASC,eAAeQ;IAC9B,MAAMI,mBAAmBH,QAAQI,MAAM,CAACC,WAAW,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAASvB;IAChF,IAAI,CAACmB,kBAAkB;QACrB,MAAM,IAAIlC,SAAS,CAAC,qBAAqB,EAAEe,eAAe,UAAU,CAAC;IACvE;IAEA,MAAMF,OAAO,GAAGC,WAAW,GAAGR,cAAc,CAAC,EAAES,gBAAgB,CAAC,CAAC,EAAEK,QAAQ;IAC3E,MAAMmB,QAAQnB,WAAW;IACzB,MAAMoB,SAASC,MAAMC,OAAO,CAACvB,WAAWA,OAAOwB,MAAM,GAAG,IAAIpC,UAAUY,UAAUyB;IAEhF,IAAI5B,OAAO;QACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;YAAEiB,SAAS;YAAyBpB;YAAM0B;YAAOlB;QAAO;IACnF;IAEA,MAAMwB,YAAY,IAAI,oBAAoB;;IAE1C,MAAMC,YACJ,OAAOnB,kBAAkB,YAAYA,gBAAgB,IAAIA,gBAAgBiB;IAE3E,MAAM,EAAEG,SAAS,EAAE,GAAG,MAAMhB,QAAQiB,KAAK,CAAC;QACxCC,YAAYlC;QACZS;QACAH;QACA6B,gBAAgB;IAClB;IAEA,MAAMC,aAAaC,KAAKC,GAAG,CAAC,GAAGD,KAAKE,IAAI,CAACP,YAAYF;IACrD,MAAMU,gBAAgB9B,QAAQ;IAC9B,MAAM+B,eAAeD,gBAAgBJ,aAAa,IAAII;IAEtD,MAAME,WAAW;QACfR,YAAYlC;QACZ2C,OAAO;QACPC,OAAO1C,WAAW;QAClBS,OAAOmB;QACPxB;QACA6B,gBAAgB;QAChBzB,MAAM;QACNe;QACAjB;QACAC;QACAI;IACF;IAEA,IAAIZ,OAAO;QACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;YAAEiB,SAAS;YAAmBwB;QAAS;IAClE;IAEA,MAAMG,iBAAiBvD,wBAAwB;QAC7Cc,QAAQe,iBAAiB2B,eAAe;IAC1C;IAEA,MAAMC,iBACJ5B,iBAAiB6B,KAAK,EAAEC,QAAQ,CAAC,uBAAuB,EAAEF,kBAAkB,EAAE;IAEhF,MAAMG,kBAA4BH,eAAeI,GAAG,CAAChE;IAErD,MAAMiE,oBAAoB,CAACC;QACzB,MAAMC,WAAoC,CAAC;QAE3C,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACL,KAAM;YAC9C,MAAMM,aAAaT,gBAAgBU,IAAI,CAAC,CAACC,QAAUA,MAAMC,IAAI,CAACP;YAC9D,IAAI,CAACI,YAAY;gBACfL,QAAQ,CAACC,IAAI,GAAGC;YAClB;QACF;QAEA,OAAOF;IACT;IAEA,MAAMS,qBAAqB,CAACC,KAAUC,aAAa,EAAE;QACnD,IAAIvC,MAAMC,OAAO,CAACqC,MAAM;YACtB,OAAOA,IAAIb,GAAG,CAAC,CAACe,OAASH,mBAAmBG,MAAMD;QACpD;QAEA,IAAI,OAAOD,QAAQ,YAAYA,QAAQ,MAAM;YAC3C,OAAOA;QACT;QAEA,MAAMV,WAAgC,CAAC;QACvC,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACM,KAAM;YAC9C,MAAMG,cAAcF,aAAa,GAAGA,WAAW,CAAC,EAAEV,KAAK,GAAGA;YAE1D,6CAA6C;YAC7C,MAAMI,aAAaZ,eAAeqB,QAAQ,CAACD;YAE3C,IAAI,CAACR,YAAY;gBACfL,QAAQ,CAACC,IAAI,GAAGQ,mBAAmBP,OAAOW;YAC5C;QACF;QAEA,OAAOb;IACT;IAEA,IAAI3D,UAAU;QACZ,IAAIM,OAAO;YACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;QAC3B;QAEA,MAAMoE,gBAAgBjF,mBACpBwB,eACAE,IAAIwD,CAAC,EACLxC;QAEF,IAAIuC,eAAe;YACjB,MAAM,IAAIpF,SAASoF;QACrB;QAEA,MAAME,aAAuB,EAAE;QAE/B,IAAI/C,OAAO;YACT,MAAMgD,gBAAgB,IAAIC;YAE1B,iEAAiE;YACjE,IAAIC,WAAWjC;YACf,IAAIkC,UAAU;YACd,IAAIC,UAAU;YACd,MAAMC,UAAU,OAAO9C,cAAc,WAAWA,YAAY+C,OAAOC,iBAAiB;YAEpF,MAAOJ,QAAS;gBACd,MAAMK,YAAY3C,KAAKC,GAAG,CAAC,GAAGuC,UAAUD;gBACxC,IAAII,cAAc,GAAG;oBACnB;gBACF;gBAEA,MAAMC,SAAS,MAAMjE,QAAQM,IAAI,CAAC;oBAChC,GAAGoB,QAAQ;oBACXhC,MAAMgE;oBACN/D,OAAO0B,KAAK6C,GAAG,CAACpD,WAAWkD;gBAC7B;gBAEAC,OAAOE,IAAI,CAACC,OAAO,CAAC,CAACpB;oBACnB,MAAMqB,OAAOjC,kBAAkB/D,cAAc;wBAAE2E;wBAAK5D;wBAAQyC;oBAAe;oBAC3EY,OAAO6B,IAAI,CAACD,MAAMD,OAAO,CAAC,CAAC7B;wBACzB,IAAI,CAACiB,cAAce,GAAG,CAAChC,MAAM;4BAC3BiB,cAAcgB,GAAG,CAACjC;4BAClBgB,WAAWkB,IAAI,CAAClC;wBAClB;oBACF;gBACF;gBAEAqB,WAAWK,OAAOE,IAAI,CAACvD,MAAM;gBAC7B8C,YAAY,EAAE,gCAAgC;;gBAC9CC,UAAUM,OAAOS,WAAW,IAAId,UAAUC;YAC5C;YAEA,IAAI5E,OAAO;gBACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC,CAAC,WAAW,EAAEsE,WAAW3C,MAAM,CAAC,QAAQ,CAAC;YACpE;QACF;QAEA,MAAM+D,UAAU,IAAIC;QACpB,IAAIC,eAAe;QACnB,IAAIC,aAAarD;QACjB,IAAImC,UAAU;QACd,MAAMC,UAAU,OAAO9C,cAAc,WAAWA,YAAY+C,OAAOC,iBAAiB;QAEpF,MAAMgB,SAAS,IAAI7G,SAAS;YAC1B,MAAM8G;gBACJ,MAAMhB,YAAY3C,KAAKC,GAAG,CAAC,GAAGuC,UAAUD;gBAExC,IAAII,cAAc,GAAG;oBACnB,IAAI,CAACxD,OAAO;wBACV,IAAI,CAACiE,IAAI,CAACE,QAAQM,MAAM,CAAC;oBAC3B;oBACA,IAAI,CAACR,IAAI,CAAC;oBACV;gBACF;gBAEA,MAAMR,SAAS,MAAMjE,QAAQM,IAAI,CAAC;oBAChC,GAAGoB,QAAQ;oBACXhC,MAAMoF;oBACNnF,OAAO0B,KAAK6C,GAAG,CAACpD,WAAWkD;gBAC7B;gBAEA,IAAI/E,OAAO;oBACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC,CAAC,gBAAgB,EAAE6F,WAAW,MAAM,EAAEb,OAAOE,IAAI,CAACvD,MAAM,CAAC,KAAK,CAAC;gBAC1F;gBAEA,IAAIqD,OAAOE,IAAI,CAACvD,MAAM,KAAK,GAAG;oBAC5B,oCAAoC;oBACpC,IAAI,CAACJ,OAAO;wBACV,IAAI,CAACiE,IAAI,CAACE,QAAQM,MAAM,CAAC;oBAC3B;oBACA,IAAI,CAACR,IAAI,CAAC;oBACV;gBACF;gBAEA,IAAIjE,OAAO;oBACT,wBAAwB;oBACxB,MAAM0E,YAAYjB,OAAOE,IAAI,CAAChC,GAAG,CAAC,CAACa,MACjCZ,kBAAkB/D,cAAc;4BAAE2E;4BAAK5D;4BAAQyC;wBAAe;oBAGhE,MAAMsD,aAAaD,UAAU/C,GAAG,CAAC,CAACE;wBAChC,MAAM+C,UAAmC,CAAC;wBAC1C,KAAK,MAAMC,OAAO9B,WAAY;4BAC5B6B,OAAO,CAACC,IAAI,GAAGhD,GAAG,CAACgD,IAAI,IAAI;wBAC7B;wBACA,OAAOD;oBACT;oBAEA,MAAME,YAAYtH,UAAUmH,YAAY;wBACtCI,QAAQV;wBACRW,SAASjC;oBACX;oBAEA,IAAI,CAACkB,IAAI,CAACE,QAAQM,MAAM,CAACK;gBAC3B,OAAO;oBACL,yBAAyB;oBACzB,MAAMJ,YAAYjB,OAAOE,IAAI,CAAChC,GAAG,CAAC,CAACa,MAAQD,mBAAmBC;oBAE9D,uDAAuD;oBACvD,MAAMyC,YAAYP,UAAU/C,GAAG,CAAC,CAACE,MAAQqD,KAAK1H,SAAS,CAACqE,MAAMsD,IAAI,CAAC;oBAEnE,IAAId,cAAc;wBAChB,IAAI,CAACJ,IAAI,CAACE,QAAQM,MAAM,CAAC,MAAMQ;oBACjC,OAAO;wBACL,IAAI,CAAChB,IAAI,CAACE,QAAQM,MAAM,CAAC,MAAMQ;oBACjC;gBACF;gBAEA7B,WAAWK,OAAOE,IAAI,CAACvD,MAAM;gBAC7BiE,eAAe;gBACfC,cAAc,EAAE,2CAA2C;;gBAE3D,IAAI,CAACb,OAAOS,WAAW,IAAId,WAAWC,SAAS;oBAC7C,IAAI5E,OAAO;wBACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;oBAC3B;oBACA,IAAI,CAACuB,OAAO;wBACV,IAAI,CAACiE,IAAI,CAACE,QAAQM,MAAM,CAAC;oBAC3B;oBACA,IAAI,CAACR,IAAI,CAAC,MAAM,iBAAiB;;gBACnC;YACF;QACF;QAEA,OAAO,IAAImB,SAASb,QAAe;YACjCc,SAAS;gBACP,uBAAuB,CAAC,sBAAsB,EAAE/G,KAAK,CAAC,CAAC;gBACvD,gBAAgB0B,QAAQ,aAAa;YACvC;QACF;IACF;IAEA,sCAAsC;IACtC,IAAIvB,OAAO;QACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;IAC3B;IAEA,MAAM6G,aAAuB,EAAE;IAC/B,MAAMC,OAAkC,EAAE;IAC1C,MAAMC,aAAa,IAAIvC;IACvB,MAAM+B,UAAoB,EAAE;IAE5B,mEAAmE;IACnE,IAAIS,cAAcxE;IAClB,IAAImC,UAAU;IACd,IAAIc,cAAc;IAClB,MAAMb,UAAU,OAAO9C,cAAc,WAAWA,YAAY+C,OAAOC,iBAAiB;IAEpF,MAAOW,YAAa;QAClB,MAAMV,YAAY3C,KAAKC,GAAG,CAAC,GAAGuC,UAAUD;QAExC,IAAII,cAAc,GAAG;YACnB;QACF;QAEA,MAAMC,SAAS,MAAMjE,QAAQM,IAAI,CAAC;YAChC,GAAGoB,QAAQ;YACXhC,MAAMuG;YACNtG,OAAO0B,KAAK6C,GAAG,CAACpD,WAAWkD;QAC7B;QAEA,IAAI/E,OAAO;YACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CACtB,CAAC,iBAAiB,EAAEgH,YAAY,MAAM,EAAEhC,OAAOE,IAAI,CAACvD,MAAM,CAAC,UAAU,CAAC;QAE1E;QAEA,IAAIJ,OAAO;YACT,MAAM0E,YAAYjB,OAAOE,IAAI,CAAChC,GAAG,CAAC,CAACa,MACjCZ,kBAAkB/D,cAAc;oBAAE2E;oBAAK5D;oBAAQyC;gBAAe;YAGhE,+BAA+B;YAC/BqD,UAAUd,OAAO,CAAC,CAAC/B;gBACjBI,OAAO6B,IAAI,CAACjC,KAAK+B,OAAO,CAAC,CAAC7B;oBACxB,IAAI,CAACyD,WAAWzB,GAAG,CAAChC,MAAM;wBACxByD,WAAWxB,GAAG,CAACjC;wBACfiD,QAAQf,IAAI,CAAClC;oBACf;gBACF;YACF;YAEAwD,KAAKtB,IAAI,IAAIS;QACf,OAAO;YACL,MAAMA,YAAYjB,OAAOE,IAAI,CAAChC,GAAG,CAAC,CAACa,MAAQD,mBAAmBC;YAC9D8C,WAAWrB,IAAI,CAACS,UAAU/C,GAAG,CAAC,CAACa,MAAQ0C,KAAK1H,SAAS,CAACgF,MAAM2C,IAAI,CAAC;QACnE;QAEA/B,WAAWK,OAAOE,IAAI,CAACvD,MAAM;QAC7B8D,cAAcT,OAAOS,WAAW,IAAId,UAAUC;QAC9CoC,eAAe,EAAE,gCAAgC;;IACnD;IAEA,uBAAuB;IACvB,IAAIzF,OAAO;QACT,MAAM2E,aAAaY,KAAK5D,GAAG,CAAC,CAACE;YAC3B,MAAM+C,UAAmC,CAAC;YAC1C,KAAK,MAAMC,OAAOG,QAAS;gBACzBJ,OAAO,CAACC,IAAI,GAAGhD,GAAG,CAACgD,IAAI,IAAI;YAC7B;YACA,OAAOD;QACT;QAEAU,WAAWrB,IAAI,CACbzG,UAAUmH,YAAY;YACpBI,QAAQ;YACRC;QACF;IAEJ;IAEA,MAAMU,SAASC,OAAOC,IAAI,CAAC/G,WAAW,SAAS,CAAC,CAAC,EAAEyG,WAAWH,IAAI,CAAC,KAAK,CAAC,CAAC,GAAGG,WAAWH,IAAI,CAAC;IAC7F,IAAI1G,OAAO;QACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC,GAAGI,OAAO,yBAAyB,CAAC;IAC/D;IAEA,IAAI,CAACR,IAAI;QACP,IAAII,OAAO;YACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;QAC3B;QACAa,IAAIuG,IAAI,GAAG;YACTvH;YACAwH,MAAMJ;YACNK,UAAU/F,QAAQ,aAAa;YAC/BgG,MAAMN,OAAOtF,MAAM;QACrB;IACF,OAAO;QACL,IAAI3B,OAAO;YACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC,CAAC,kCAAkC,EAAEJ,IAAI;QACpE;QACA,MAAMiB,IAAIE,OAAO,CAACyG,MAAM,CAAC;YACvB5H;YACAqC,YAAY/B;YACZmH,MAAM,CAAC;YACPD,MAAM;gBACJvH;gBACAwH,MAAMJ;gBACNK,UAAU/F,QAAQ,aAAa;gBAC/BgG,MAAMN,OAAOtF,MAAM;YACrB;YACAnB;QACF;IACF;IACA,IAAIR,OAAO;QACTa,IAAIE,OAAO,CAACC,MAAM,CAAChB,KAAK,CAAC;IAC3B;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/export/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,QAAQ,QAAe,cAAc,uCAmBjD,CAAA"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/export/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,QAAQ,QAAe,cAAc,uCA8BjD,CAAA"}
@@ -1,23 +1,41 @@
1
1
  import { APIError } from 'payload';
2
2
  import { createExport } from './createExport.js';
3
3
  export const download = async (req, debug = false)=>{
4
- let body;
5
- if (typeof req?.json === 'function') {
6
- body = await req.json();
4
+ try {
5
+ let body;
6
+ if (typeof req?.json === 'function') {
7
+ body = await req.json();
8
+ }
9
+ if (!body || !body.data) {
10
+ throw new APIError('Request data is required.');
11
+ }
12
+ const { collectionSlug } = body.data || {};
13
+ req.payload.logger.info(`Download request received ${collectionSlug}`);
14
+ body.data.user = req.user;
15
+ const res = await createExport({
16
+ download: true,
17
+ input: {
18
+ ...body.data,
19
+ debug
20
+ },
21
+ req
22
+ });
23
+ return res;
24
+ } catch (err) {
25
+ // Return JSON for front-end toast
26
+ return new Response(JSON.stringify({
27
+ errors: [
28
+ {
29
+ message: err.message || 'Something went wrong'
30
+ }
31
+ ]
32
+ }), {
33
+ headers: {
34
+ 'Content-Type': 'application/json'
35
+ },
36
+ status: 400
37
+ });
7
38
  }
8
- if (!body || !body.data) {
9
- throw new APIError('Request data is required.');
10
- }
11
- req.payload.logger.info(`Download request received ${body.data.collectionSlug}`);
12
- body.data.user = req.user;
13
- return createExport({
14
- download: true,
15
- input: {
16
- ...body.data,
17
- debug
18
- },
19
- req
20
- });
21
39
  };
22
40
 
23
41
  //# sourceMappingURL=download.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/download.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { createExport } from './createExport.js'\n\nexport const download = async (req: PayloadRequest, debug = false) => {\n let body\n if (typeof req?.json === 'function') {\n body = await req.json()\n }\n\n if (!body || !body.data) {\n throw new APIError('Request data is required.')\n }\n\n req.payload.logger.info(`Download request received ${body.data.collectionSlug}`)\n\n body.data.user = req.user\n\n return createExport({\n download: true,\n input: { ...body.data, debug },\n req,\n }) as Promise<Response>\n}\n"],"names":["APIError","createExport","download","req","debug","body","json","data","payload","logger","info","collectionSlug","user","input"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,OAAO,MAAMC,WAAW,OAAOC,KAAqBC,QAAQ,KAAK;IAC/D,IAAIC;IACJ,IAAI,OAAOF,KAAKG,SAAS,YAAY;QACnCD,OAAO,MAAMF,IAAIG,IAAI;IACvB;IAEA,IAAI,CAACD,QAAQ,CAACA,KAAKE,IAAI,EAAE;QACvB,MAAM,IAAIP,SAAS;IACrB;IAEAG,IAAIK,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,0BAA0B,EAAEL,KAAKE,IAAI,CAACI,cAAc,EAAE;IAE/EN,KAAKE,IAAI,CAACK,IAAI,GAAGT,IAAIS,IAAI;IAEzB,OAAOX,aAAa;QAClBC,UAAU;QACVW,OAAO;YAAE,GAAGR,KAAKE,IAAI;YAAEH;QAAM;QAC7BD;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/export/download.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { createExport } from './createExport.js'\n\nexport const download = async (req: PayloadRequest, debug = false) => {\n try {\n let body\n if (typeof req?.json === 'function') {\n body = await req.json()\n }\n\n if (!body || !body.data) {\n throw new APIError('Request data is required.')\n }\n\n const { collectionSlug } = body.data || {}\n\n req.payload.logger.info(`Download request received ${collectionSlug}`)\n body.data.user = req.user\n\n const res = await createExport({\n download: true,\n input: { ...body.data, debug },\n req,\n })\n\n return res as Response\n } catch (err) {\n // Return JSON for front-end toast\n return new Response(\n JSON.stringify({ errors: [{ message: (err as Error).message || 'Something went wrong' }] }),\n { headers: { 'Content-Type': 'application/json' }, status: 400 },\n )\n }\n}\n"],"names":["APIError","createExport","download","req","debug","body","json","data","collectionSlug","payload","logger","info","user","res","input","err","Response","JSON","stringify","errors","message","headers","status"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,OAAO,MAAMC,WAAW,OAAOC,KAAqBC,QAAQ,KAAK;IAC/D,IAAI;QACF,IAAIC;QACJ,IAAI,OAAOF,KAAKG,SAAS,YAAY;YACnCD,OAAO,MAAMF,IAAIG,IAAI;QACvB;QAEA,IAAI,CAACD,QAAQ,CAACA,KAAKE,IAAI,EAAE;YACvB,MAAM,IAAIP,SAAS;QACrB;QAEA,MAAM,EAAEQ,cAAc,EAAE,GAAGH,KAAKE,IAAI,IAAI,CAAC;QAEzCJ,IAAIM,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,0BAA0B,EAAEH,gBAAgB;QACrEH,KAAKE,IAAI,CAACK,IAAI,GAAGT,IAAIS,IAAI;QAEzB,MAAMC,MAAM,MAAMZ,aAAa;YAC7BC,UAAU;YACVY,OAAO;gBAAE,GAAGT,KAAKE,IAAI;gBAAEH;YAAM;YAC7BD;QACF;QAEA,OAAOU;IACT,EAAE,OAAOE,KAAK;QACZ,kCAAkC;QAClC,OAAO,IAAIC,SACTC,KAAKC,SAAS,CAAC;YAAEC,QAAQ;gBAAC;oBAAEC,SAAS,AAACL,IAAcK,OAAO,IAAI;gBAAuB;aAAE;QAAC,IACzF;YAAEC,SAAS;gBAAE,gBAAgB;YAAmB;YAAGC,QAAQ;QAAI;IAEnE;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"flattenObject.d.ts","sourceRoot":"","sources":["../../src/export/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,CAmI/B,CAAA"}
1
+ {"version":3,"file":"flattenObject.d.ts","sourceRoot":"","sources":["../../src/export/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,CAqJ/B,CAAA"}
@@ -4,6 +4,34 @@ export const flattenObject = ({ doc, fields, prefix, toCSVFunctions })=>{
4
4
  Object.entries(siblingDoc).forEach(([key, value])=>{
5
5
  const newKey = prefix ? `${prefix}_${key}` : key;
6
6
  if (Array.isArray(value)) {
7
+ // If a custom toCSV function exists for this array field, run it first.
8
+ // If it produces output, skip per-item handling; otherwise, fall back.
9
+ if (toCSVFunctions?.[newKey]) {
10
+ try {
11
+ const result = toCSVFunctions[newKey]({
12
+ columnName: newKey,
13
+ data: row,
14
+ doc,
15
+ row,
16
+ siblingDoc,
17
+ value
18
+ });
19
+ if (typeof result !== 'undefined') {
20
+ // Custom function returned a single value for this array field.
21
+ row[newKey] = result;
22
+ return;
23
+ }
24
+ // If the custom function wrote any keys for this field, consider it handled.
25
+ for(const k in row){
26
+ if (k === newKey || k.startsWith(`${newKey}_`)) {
27
+ return;
28
+ }
29
+ }
30
+ // Otherwise, fall through to per-item handling.
31
+ } catch (error) {
32
+ throw new Error(`Error in toCSVFunction for array "${newKey}": ${JSON.stringify(value)}\n${error.message}`);
33
+ }
34
+ }
7
35
  value.forEach((item, index)=>{
8
36
  if (typeof item === 'object' && item !== null) {
9
37
  const blockType = typeof item.blockType === 'string' ? item.blockType : undefined;
@@ -14,31 +42,15 @@ export const flattenObject = ({ doc, fields, prefix, toCSVFunctions })=>{
14
42
  row[`${itemPrefix}_id`] = item.value.id;
15
43
  return;
16
44
  }
45
+ // Fallback: deep-flatten nested objects
17
46
  flatten(item, itemPrefix);
18
47
  } else {
19
- if (toCSVFunctions?.[newKey]) {
20
- const columnName = `${newKey}_${index}`;
21
- try {
22
- const result = toCSVFunctions[newKey]({
23
- columnName,
24
- data: row,
25
- doc,
26
- row,
27
- siblingDoc,
28
- value: item
29
- });
30
- if (typeof result !== 'undefined') {
31
- row[columnName] = result;
32
- }
33
- } catch (error) {
34
- throw new Error(`Error in toCSVFunction for array item "${columnName}": ${JSON.stringify(item)}\n${error.message}`);
35
- }
36
- } else {
37
- row[`${newKey}_${index}`] = item;
38
- }
48
+ // Primitive array item.
49
+ row[`${newKey}_${index}`] = item;
39
50
  }
40
51
  });
41
52
  } else if (typeof value === 'object' && value !== null) {
53
+ // Object field: use custom toCSV if present, else recurse.
42
54
  if (!toCSVFunctions?.[newKey]) {
43
55
  flatten(value, newKey);
44
56
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/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 const flatten = (siblingDoc: Document, prefix?: string) => {\n Object.entries(siblingDoc).forEach(([key, value]) => {\n const newKey = prefix ? `${prefix}_${key}` : key\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (typeof item === 'object' && item !== null) {\n const blockType = typeof item.blockType === 'string' ? item.blockType : undefined\n\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 flatten(item, itemPrefix)\n } else {\n if (toCSVFunctions?.[newKey]) {\n const columnName = `${newKey}_${index}`\n try {\n const result = toCSVFunctions[newKey]({\n columnName,\n data: row,\n doc,\n row,\n siblingDoc,\n value: item,\n })\n if (typeof result !== 'undefined') {\n row[columnName] = result\n }\n } catch (error) {\n throw new Error(\n `Error in toCSVFunction for array item \"${columnName}\": ${JSON.stringify(item)}\\n${\n (error as Error).message\n }`,\n )\n }\n } else {\n row[`${newKey}_${index}`] = item\n }\n }\n })\n } else if (typeof value === 'object' && value !== null) {\n if (!toCSVFunctions?.[newKey]) {\n flatten(value, newKey)\n } else {\n try {\n const result = toCSVFunctions[newKey]({\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${(error as Error).message}`,\n )\n }\n }\n } else {\n if (toCSVFunctions?.[newKey]) {\n try {\n const result = toCSVFunctions[newKey]({\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${(error as Error).message}`,\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","flatten","siblingDoc","Object","entries","forEach","key","value","newKey","Array","isArray","item","index","blockType","undefined","itemPrefix","relationTo","id","columnName","result","data","error","Error","JSON","stringify","message","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/export/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 const flatten = (siblingDoc: Document, prefix?: string) => {\n Object.entries(siblingDoc).forEach(([key, value]) => {\n const newKey = prefix ? `${prefix}_${key}` : 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 (toCSVFunctions?.[newKey]) {\n try {\n const result = toCSVFunctions[newKey]({\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 (!toCSVFunctions?.[newKey]) {\n flatten(value, newKey)\n } else {\n try {\n const result = toCSVFunctions[newKey]({\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 (toCSVFunctions?.[newKey]) {\n try {\n const result = toCSVFunctions[newKey]({\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","flatten","siblingDoc","Object","entries","forEach","key","value","newKey","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 +1 @@
1
- {"version":3,"file":"getCustomFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/export/getCustomFieldFunctions.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,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAwFtF,CAAA"}
1
+ {"version":3,"file":"getCustomFieldFunctions.d.ts","sourceRoot":"","sources":["../../src/export/getCustomFieldFunctions.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,eAAO,MAAM,uBAAuB,eAAgB,IAAI,KAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAgGtF,CAAA"}
@@ -41,7 +41,17 @@ export const getCustomFieldFunctions = ({ fields })=>{
41
41
  if (!Array.isArray(field.relationTo)) {
42
42
  // monomorphic many
43
43
  // @ts-expect-error ref is untyped
44
- result[`${ref.prefix}${field.name}`] = ({ value })=>value.map((val)=>typeof val === 'object' ? val.id : val);
44
+ result[`${ref.prefix}${field.name}`] = ({ data, value })=>{
45
+ if (Array.isArray(value)) {
46
+ value.forEach((val, i)=>{
47
+ const id = typeof val === 'object' && val ? val.id : val;
48
+ // @ts-expect-error ref is untyped
49
+ data[`${ref.prefix}${field.name}_${i}_id`] = id;
50
+ });
51
+ }
52
+ return undefined // prevents further flattening
53
+ ;
54
+ };
45
55
  } else {
46
56
  // polymorphic many
47
57
  // @ts-expect-error ref is untyped
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/getCustomFieldFunctions.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\nexport const getCustomFieldFunctions = ({ 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 === '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 value,\n }: {\n value: Record<string, unknown>[]\n }) =>\n value.map((val: number | Record<string, unknown> | string) =>\n typeof val === 'object' ? val.id : val,\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","getCustomFieldFunctions","fields","result","buildCustomFunctions","field","parentRef","ref","prefix","type","parentPrefix","name","custom","toCSV","hasMany","Array","isArray","relationTo","value","id","data","relatedDoc","undefined","map","val","forEach","i","callback"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/getCustomFieldFunctions.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\nexport const getCustomFieldFunctions = ({ 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 === '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","getCustomFieldFunctions","fields","result","buildCustomFunctions","field","parentRef","ref","prefix","type","parentPrefix","name","custom","toCSV","hasMany","Array","isArray","relationTo","value","id","data","relatedDoc","undefined","forEach","val","i","callback"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/export/getFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,SAAS,CAAA;AAEzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAI3D,eAAO,MAAM,SAAS,WAAY,MAAM,iBAAiB,wBAAwB,KAAG,KAAK,EAoNxF,CAAA"}
1
+ {"version":3,"file":"getFields.d.ts","sourceRoot":"","sources":["../../src/export/getFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,SAAS,CAAA;AAEzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAK3D,eAAO,MAAM,SAAS,WAAY,MAAM,iBAAiB,wBAAwB,KAAG,KAAK,EA2PxF,CAAA"}