@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.
- package/dist/components/ExportSaveButton/index.d.ts.map +1 -1
- package/dist/components/ExportSaveButton/index.js +12 -3
- package/dist/components/ExportSaveButton/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +4 -0
- package/dist/components/Page/index.d.ts.map +1 -0
- package/dist/components/Page/index.js +41 -0
- package/dist/components/Page/index.js.map +1 -0
- package/dist/components/Page/index.scss +3 -0
- package/dist/components/Preview/index.d.ts.map +1 -1
- package/dist/components/Preview/index.js +5 -0
- package/dist/components/Preview/index.js.map +1 -1
- package/dist/components/SortBy/index.d.ts +1 -0
- package/dist/components/SortBy/index.d.ts.map +1 -1
- package/dist/components/SortBy/index.js +64 -22
- package/dist/components/SortBy/index.js.map +1 -1
- package/dist/components/SortBy/index.scss +1 -2
- package/dist/components/SortOrder/index.d.ts +4 -0
- package/dist/components/SortOrder/index.d.ts.map +1 -0
- package/dist/components/SortOrder/index.js +123 -0
- package/dist/components/SortOrder/index.js.map +1 -0
- package/dist/components/SortOrder/index.scss +3 -0
- package/dist/export/createExport.d.ts +2 -0
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +66 -15
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/download.d.ts.map +1 -1
- package/dist/export/download.js +34 -16
- package/dist/export/download.js.map +1 -1
- package/dist/export/flattenObject.d.ts.map +1 -1
- package/dist/export/flattenObject.js +32 -20
- package/dist/export/flattenObject.js.map +1 -1
- package/dist/export/getCustomFieldFunctions.d.ts.map +1 -1
- package/dist/export/getCustomFieldFunctions.js +11 -1
- package/dist/export/getCustomFieldFunctions.js.map +1 -1
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +56 -10
- package/dist/export/getFields.js.map +1 -1
- package/dist/exports/rsc.d.ts +2 -0
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +2 -0
- package/dist/exports/rsc.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/ar.js +2 -0
- package/dist/translations/languages/ar.js.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/az.js +2 -0
- package/dist/translations/languages/az.js.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/bg.js +2 -0
- package/dist/translations/languages/bg.js.map +1 -1
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/ca.js +2 -0
- package/dist/translations/languages/ca.js.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/cs.js +2 -0
- package/dist/translations/languages/cs.js.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/da.js +2 -0
- package/dist/translations/languages/da.js.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/de.js +2 -0
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +2 -0
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +2 -0
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/es.js +2 -0
- package/dist/translations/languages/es.js.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/et.js +2 -0
- package/dist/translations/languages/et.js.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fa.js +2 -0
- package/dist/translations/languages/fa.js.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/fr.js +2 -0
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/he.js +2 -0
- package/dist/translations/languages/he.js.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hr.js +2 -0
- package/dist/translations/languages/hr.js.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hu.js +2 -0
- package/dist/translations/languages/hu.js.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/hy.js +2 -0
- package/dist/translations/languages/hy.js.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/it.js +2 -0
- package/dist/translations/languages/it.js.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ja.js +2 -0
- package/dist/translations/languages/ja.js.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/ko.js +2 -0
- package/dist/translations/languages/ko.js.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/lt.js +2 -0
- package/dist/translations/languages/lt.js.map +1 -1
- package/dist/translations/languages/lv.d.ts.map +1 -1
- package/dist/translations/languages/lv.js +2 -0
- package/dist/translations/languages/lv.js.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/my.js +2 -0
- package/dist/translations/languages/my.js.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nb.js +2 -0
- package/dist/translations/languages/nb.js.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/nl.js +2 -0
- package/dist/translations/languages/nl.js.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pl.js +2 -0
- package/dist/translations/languages/pl.js.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/pt.js +2 -0
- package/dist/translations/languages/pt.js.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/ro.js +2 -0
- package/dist/translations/languages/ro.js.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rs.js +2 -0
- package/dist/translations/languages/rs.js.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.js +2 -0
- package/dist/translations/languages/rsLatin.js.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/ru.js +2 -0
- package/dist/translations/languages/ru.js.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sk.js +2 -0
- package/dist/translations/languages/sk.js.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sl.js +2 -0
- package/dist/translations/languages/sl.js.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/sv.js +2 -0
- package/dist/translations/languages/sv.js.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/th.js +2 -0
- package/dist/translations/languages/th.js.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/tr.js +2 -0
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/translation-schema.json +7 -0
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +2 -0
- package/dist/translations/languages/uk.js.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/vi.js +2 -0
- package/dist/translations/languages/vi.js.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zh.js +2 -0
- package/dist/translations/languages/zh.js.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.js +2 -0
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/translations/types.d.ts +2 -0
- package/dist/translations/types.d.ts.map +1 -1
- package/dist/translations/types.js.map +1 -1
- package/dist/utilities/getFlattenedFieldKeys.js +1 -1
- package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
- package/dist/utilities/sortHelpers.d.ts +6 -0
- package/dist/utilities/sortHelpers.d.ts.map +1 -0
- package/dist/utilities/sortHelpers.js +14 -0
- package/dist/utilities/sortHelpers.js.map +1 -0
- package/dist/utilities/validateLimitValue.d.ts +3 -0
- package/dist/utilities/validateLimitValue.d.ts.map +1 -0
- package/dist/utilities/validateLimitValue.js +15 -0
- package/dist/utilities/validateLimitValue.js.map +1 -0
- 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:
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 ${
|
|
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
|
-
|
|
232
|
-
|
|
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":"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"}
|
|
@@ -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,
|
|
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"}
|
package/dist/export/download.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
20
|
-
|
|
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
|
|
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,
|
|
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 })=>
|
|
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
|
|
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":"
|
|
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"}
|