@payloadcms/plugin-import-export 3.51.0-internal.62eeed3 → 3.52.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1 -3
- package/dist/components/SortBy/index.js.map +1 -1
- package/dist/components/SortBy/index.scss +1 -2
- 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 +33 -10
- package/dist/export/getFields.js.map +1 -1
- package/dist/exports/rsc.d.ts +1 -0
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -0
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +1 -0
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -0
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/translation-schema.json +3 -0
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +1 -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 +1 -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 +1 -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 +1 -0
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/translations/types.d.ts +1 -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/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 +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportSaveButton/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportSaveButton/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EA0GpC,CAAA"}
|
|
@@ -43,7 +43,17 @@ export const ExportSaveButton = ()=>{
|
|
|
43
43
|
toast.dismiss(toastID);
|
|
44
44
|
}
|
|
45
45
|
if (!response.ok) {
|
|
46
|
-
|
|
46
|
+
// Try to parse the error message from the JSON response
|
|
47
|
+
let errorMsg = 'Failed to download file';
|
|
48
|
+
try {
|
|
49
|
+
const errorJson = await response.json();
|
|
50
|
+
if (errorJson?.errors?.[0]?.message) {
|
|
51
|
+
errorMsg = errorJson.errors[0].message;
|
|
52
|
+
}
|
|
53
|
+
} catch {
|
|
54
|
+
// Ignore JSON parse errors, fallback to generic message
|
|
55
|
+
}
|
|
56
|
+
throw new Error(errorMsg);
|
|
47
57
|
}
|
|
48
58
|
const fileStream = response.body;
|
|
49
59
|
const reader = fileStream?.getReader();
|
|
@@ -72,8 +82,7 @@ export const ExportSaveButton = ()=>{
|
|
|
72
82
|
document.body.removeChild(a);
|
|
73
83
|
URL.revokeObjectURL(url);
|
|
74
84
|
} catch (error) {
|
|
75
|
-
|
|
76
|
-
toast.error('Error downloading file');
|
|
85
|
+
toast.error(error.message || 'Error downloading file');
|
|
77
86
|
}
|
|
78
87
|
};
|
|
79
88
|
return /*#__PURE__*/ _jsxs(React.Fragment, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ExportSaveButton/index.tsx"],"sourcesContent":["'use client'\n\nimport {\n Button,\n SaveButton,\n toast,\n Translation,\n useConfig,\n useForm,\n useFormModified,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nexport const ExportSaveButton: React.FC = () => {\n const { t } = useTranslation<PluginImportExportTranslations, PluginImportExportTranslationKeys>()\n const {\n config: {\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const { getData, setModified } = useForm()\n const modified = useFormModified()\n\n const exportsCollectionConfig = getEntityConfig({ collectionSlug: 'exports' })\n\n const disableSave = exportsCollectionConfig?.admin?.custom?.disableSave === true\n\n const disableDownload = exportsCollectionConfig?.admin?.custom?.disableDownload === true\n\n const label = t('general:save')\n\n const handleDownload = async () => {\n let timeoutID: null | ReturnType<typeof setTimeout> = null\n let toastID: null | number | string = null\n\n try {\n setModified(false) // Reset modified state\n const data = getData()\n\n // Set a timeout to show toast if the request takes longer than 200ms\n timeoutID = setTimeout(() => {\n toastID = toast.success('Your export is being processed...')\n }, 200)\n\n const response = await fetch(`${serverURL}${api}/exports/download`, {\n body: JSON.stringify({\n data,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n // Clear the timeout if fetch completes quickly\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n\n // Dismiss the toast if it was shown\n if (toastID) {\n toast.dismiss(toastID)\n }\n\n if (!response.ok) {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ExportSaveButton/index.tsx"],"sourcesContent":["'use client'\n\nimport {\n Button,\n SaveButton,\n toast,\n Translation,\n useConfig,\n useForm,\n useFormModified,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nexport const ExportSaveButton: React.FC = () => {\n const { t } = useTranslation<PluginImportExportTranslations, PluginImportExportTranslationKeys>()\n const {\n config: {\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const { getData, setModified } = useForm()\n const modified = useFormModified()\n\n const exportsCollectionConfig = getEntityConfig({ collectionSlug: 'exports' })\n\n const disableSave = exportsCollectionConfig?.admin?.custom?.disableSave === true\n\n const disableDownload = exportsCollectionConfig?.admin?.custom?.disableDownload === true\n\n const label = t('general:save')\n\n const handleDownload = async () => {\n let timeoutID: null | ReturnType<typeof setTimeout> = null\n let toastID: null | number | string = null\n\n try {\n setModified(false) // Reset modified state\n const data = getData()\n\n // Set a timeout to show toast if the request takes longer than 200ms\n timeoutID = setTimeout(() => {\n toastID = toast.success('Your export is being processed...')\n }, 200)\n\n const response = await fetch(`${serverURL}${api}/exports/download`, {\n body: JSON.stringify({\n data,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n // Clear the timeout if fetch completes quickly\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n\n // Dismiss the toast if it was shown\n if (toastID) {\n toast.dismiss(toastID)\n }\n\n if (!response.ok) {\n // Try to parse the error message from the JSON response\n let errorMsg = 'Failed to download file'\n try {\n const errorJson = await response.json()\n if (errorJson?.errors?.[0]?.message) {\n errorMsg = errorJson.errors[0].message\n }\n } catch {\n // Ignore JSON parse errors, fallback to generic message\n }\n throw new Error(errorMsg)\n }\n\n const fileStream = response.body\n const reader = fileStream?.getReader()\n const decoder = new TextDecoder()\n let result = ''\n\n while (reader) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n result += decoder.decode(value, { stream: true })\n }\n\n const blob = new Blob([result], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${data.name}.${data.format}`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n } catch (error: any) {\n toast.error(error.message || 'Error downloading file')\n }\n }\n\n return (\n <React.Fragment>\n {!disableSave && <SaveButton label={label} />}\n {!disableDownload && (\n <Button disabled={!modified} onClick={handleDownload} size=\"medium\" type=\"button\">\n <Translation i18nKey=\"upload:download\" t={t} />\n </Button>\n )}\n </React.Fragment>\n )\n}\n"],"names":["Button","SaveButton","toast","Translation","useConfig","useForm","useFormModified","useTranslation","React","ExportSaveButton","t","config","routes","api","serverURL","getEntityConfig","getData","setModified","modified","exportsCollectionConfig","collectionSlug","disableSave","admin","custom","disableDownload","label","handleDownload","timeoutID","toastID","data","setTimeout","success","response","fetch","body","JSON","stringify","credentials","headers","method","clearTimeout","dismiss","ok","errorMsg","errorJson","json","errors","message","Error","fileStream","reader","getReader","decoder","TextDecoder","result","done","value","read","decode","stream","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","name","format","appendChild","click","removeChild","revokeObjectURL","error","Fragment","disabled","onClick","size","i18nKey"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Page/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAKzD,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,IAAI,EAAE,0BA6BlB,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { NumberField, useField } from '@payloadcms/ui';
|
|
4
|
+
import React, { useEffect } from 'react';
|
|
5
|
+
import './index.scss';
|
|
6
|
+
const baseClass = 'page-field';
|
|
7
|
+
export const Page = (props)=>{
|
|
8
|
+
const { setValue } = useField();
|
|
9
|
+
const { value: limitValue } = useField({
|
|
10
|
+
path: 'limit'
|
|
11
|
+
});
|
|
12
|
+
// Effect to reset page to 1 if limit is removed
|
|
13
|
+
useEffect(()=>{
|
|
14
|
+
if (!limitValue) {
|
|
15
|
+
setValue(1) // Reset page to 1
|
|
16
|
+
;
|
|
17
|
+
}
|
|
18
|
+
}, [
|
|
19
|
+
limitValue,
|
|
20
|
+
setValue
|
|
21
|
+
]);
|
|
22
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
23
|
+
className: baseClass,
|
|
24
|
+
children: /*#__PURE__*/ _jsx(NumberField, {
|
|
25
|
+
field: {
|
|
26
|
+
name: props.field.name,
|
|
27
|
+
admin: {
|
|
28
|
+
autoComplete: undefined,
|
|
29
|
+
placeholder: undefined,
|
|
30
|
+
step: 1
|
|
31
|
+
},
|
|
32
|
+
label: props.field.label,
|
|
33
|
+
min: 1
|
|
34
|
+
},
|
|
35
|
+
onChange: (value)=>setValue(value ?? 1),
|
|
36
|
+
path: props.path
|
|
37
|
+
})
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Page/index.tsx"],"sourcesContent":["'use client'\n\nimport type { NumberFieldClientComponent } from 'payload'\n\nimport { NumberField, useField } from '@payloadcms/ui'\nimport React, { useEffect } from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'page-field'\n\nexport const Page: NumberFieldClientComponent = (props) => {\n const { setValue } = useField<number>()\n const { value: limitValue } = useField<number>({ path: 'limit' })\n\n // Effect to reset page to 1 if limit is removed\n useEffect(() => {\n if (!limitValue) {\n setValue(1) // Reset page to 1\n }\n }, [limitValue, setValue])\n\n return (\n <div className={baseClass}>\n <NumberField\n field={{\n name: props.field.name,\n admin: {\n autoComplete: undefined,\n placeholder: undefined,\n step: 1,\n },\n label: props.field.label,\n min: 1,\n }}\n onChange={(value) => setValue(value ?? 1)} // Update the page value on change\n path={props.path}\n />\n </div>\n )\n}\n"],"names":["NumberField","useField","React","useEffect","baseClass","Page","props","setValue","value","limitValue","path","div","className","field","name","admin","autoComplete","undefined","placeholder","step","label","min","onChange"],"mappings":"AAAA;;AAIA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,SAAS,QAAQ,QAAO;AAExC,OAAO,eAAc;AAErB,MAAMC,YAAY;AAElB,OAAO,MAAMC,OAAmC,CAACC;IAC/C,MAAM,EAAEC,QAAQ,EAAE,GAAGN;IACrB,MAAM,EAAEO,OAAOC,UAAU,EAAE,GAAGR,SAAiB;QAAES,MAAM;IAAQ;IAE/D,gDAAgD;IAChDP,UAAU;QACR,IAAI,CAACM,YAAY;YACfF,SAAS,GAAG,kBAAkB;;QAChC;IACF,GAAG;QAACE;QAAYF;KAAS;IAEzB,qBACE,KAACI;QAAIC,WAAWR;kBACd,cAAA,KAACJ;YACCa,OAAO;gBACLC,MAAMR,MAAMO,KAAK,CAACC,IAAI;gBACtBC,OAAO;oBACLC,cAAcC;oBACdC,aAAaD;oBACbE,MAAM;gBACR;gBACAC,OAAOd,MAAMO,KAAK,CAACO,KAAK;gBACxBC,KAAK;YACP;YACAC,UAAU,CAACd,QAAUD,SAASC,SAAS;YACvCE,MAAMJ,MAAMI,IAAI;;;AAIxB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,yBAiLnB,CAAA"}
|
|
@@ -13,6 +13,9 @@ export const Preview = ()=>{
|
|
|
13
13
|
const { value: where } = useField({
|
|
14
14
|
path: 'where'
|
|
15
15
|
});
|
|
16
|
+
const { value: page } = useField({
|
|
17
|
+
path: 'page'
|
|
18
|
+
});
|
|
16
19
|
const { value: limit } = useField({
|
|
17
20
|
path: 'limit'
|
|
18
21
|
});
|
|
@@ -58,6 +61,7 @@ export const Preview = ()=>{
|
|
|
58
61
|
format,
|
|
59
62
|
limit,
|
|
60
63
|
locale,
|
|
64
|
+
page,
|
|
61
65
|
sort,
|
|
62
66
|
where
|
|
63
67
|
}),
|
|
@@ -134,6 +138,7 @@ export const Preview = ()=>{
|
|
|
134
138
|
i18n,
|
|
135
139
|
limit,
|
|
136
140
|
locale,
|
|
141
|
+
page,
|
|
137
142
|
sort,
|
|
138
143
|
where
|
|
139
144
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/Preview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Table,\n Translation,\n useConfig,\n useField,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nimport { buildDisabledFieldRegex } from '../../utilities/buildDisabledFieldRegex.js'\nimport './index.scss'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'preview'\n\nexport const Preview = () => {\n const { collection } = useImportExport()\n const { config } = useConfig()\n const { value: where } = useField({ path: 'where' })\n const { value: limit } = useField<number>({ path: 'limit' })\n const { value: fields } = useField<string[]>({ path: 'fields' })\n const { value: sort } = useField({ path: 'sort' })\n const { value: draft } = useField({ path: 'drafts' })\n const { value: locale } = useField({ path: 'locale' })\n const { value: format } = useField({ path: 'format' })\n const [dataToRender, setDataToRender] = React.useState<any[]>([])\n const [resultCount, setResultCount] = React.useState<any>('')\n const [columns, setColumns] = React.useState<Column[]>([])\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const collectionSlug = typeof collection === 'string' && collection\n const collectionConfig = config.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n\n const disabledFieldRegexes: RegExp[] = React.useMemo(() => {\n const disabledFieldPaths =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n return disabledFieldPaths.map(buildDisabledFieldRegex)\n }, [collectionConfig])\n\n const isCSV = format === 'csv'\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!collectionSlug || !collectionConfig) {\n return\n }\n\n try {\n const res = await fetch('/api/preview-data', {\n body: JSON.stringify({\n collectionSlug,\n draft,\n fields,\n format,\n limit,\n locale,\n sort,\n where,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n\n if (!res.ok) {\n return\n }\n\n const { docs, totalDocs }: { docs: Record<string, unknown>[]; totalDocs: number } =\n await res.json()\n\n setResultCount(limit && limit < totalDocs ? limit : totalDocs)\n\n const allKeys = Array.from(new Set(docs.flatMap((doc) => Object.keys(doc))))\n const defaultMetaFields = ['createdAt', 'updatedAt', '_status', 'id']\n\n // Match CSV column ordering by building keys based on fields and regex\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n return new RegExp(`^${parts.join('_')}`)\n }\n\n // Construct final list of field keys to match field order + meta order\n const selectedKeys =\n Array.isArray(fields) && fields.length > 0\n ? fields.flatMap((field) => {\n const regex = fieldToRegex(field)\n return allKeys.filter(\n (key) =>\n regex.test(key) &&\n !disabledFieldRegexes.some((disabledRegex) => disabledRegex.test(key)),\n )\n })\n : allKeys.filter(\n (key) =>\n !defaultMetaFields.includes(key) &&\n !disabledFieldRegexes.some((regex) => regex.test(key)),\n )\n\n const fieldKeys =\n Array.isArray(fields) && fields.length > 0\n ? selectedKeys // strictly use selected fields only\n : [\n ...selectedKeys,\n ...defaultMetaFields.filter(\n (key) => allKeys.includes(key) && !selectedKeys.includes(key),\n ),\n ]\n\n // Build columns based on flattened keys\n const newColumns: Column[] = fieldKeys.map((key) => ({\n accessor: key,\n active: true,\n field: { name: key } as ClientField,\n Heading: getTranslation(key, i18n),\n renderedCells: docs.map((doc: Record<string, unknown>) => {\n const val = doc[key]\n\n if (val === undefined || val === null) {\n return null\n }\n\n // Avoid ESLint warning by type-checking before calling String()\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\n return String(val)\n }\n\n if (Array.isArray(val)) {\n return val.map(String).join(', ')\n }\n\n return JSON.stringify(val)\n }),\n }))\n\n setColumns(newColumns)\n setDataToRender(docs)\n } catch (error) {\n console.error('Error fetching preview data:', error)\n }\n }\n\n void fetchData()\n }, [\n collectionConfig,\n collectionSlug,\n disabledFieldRegexes,\n draft,\n fields,\n format,\n i18n,\n limit,\n locale,\n sort,\n where,\n ])\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n <Translation i18nKey=\"version:preview\" t={t} />\n </h3>\n {resultCount && (\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:totalDocumentsCount\"\n t={t}\n variables={{\n count: resultCount,\n }}\n />\n )}\n </div>\n {dataToRender &&\n (isCSV ? (\n <Table columns={columns} data={dataToRender} />\n ) : (\n <CodeEditorLazy language=\"json\" readOnly value={JSON.stringify(dataToRender, null, 2)} />\n ))}\n </div>\n )\n}\n"],"names":["getTranslation","CodeEditorLazy","Table","Translation","useConfig","useField","useTranslation","React","buildDisabledFieldRegex","useImportExport","baseClass","Preview","collection","config","value","where","path","limit","fields","sort","draft","locale","format","dataToRender","setDataToRender","useState","resultCount","setResultCount","columns","setColumns","i18n","t","collectionSlug","collectionConfig","collections","find","slug","disabledFieldRegexes","useMemo","disabledFieldPaths","admin","custom","disabledFields","map","isCSV","useEffect","fetchData","res","fetch","body","JSON","stringify","credentials","headers","method","ok","docs","totalDocs","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","defaultMetaFields","fieldToRegex","field","parts","split","part","RegExp","join","selectedKeys","isArray","length","regex","filter","key","test","some","disabledRegex","includes","fieldKeys","newColumns","accessor","active","name","Heading","renderedCells","val","undefined","String","error","console","div","className","h3","i18nKey","variables","count","data","language","readOnly"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Preview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Table,\n Translation,\n useConfig,\n useField,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nimport { buildDisabledFieldRegex } from '../../utilities/buildDisabledFieldRegex.js'\nimport './index.scss'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'preview'\n\nexport const Preview = () => {\n const { collection } = useImportExport()\n const { config } = useConfig()\n const { value: where } = useField({ path: 'where' })\n const { value: page } = useField({ path: 'page' })\n const { value: limit } = useField<number>({ path: 'limit' })\n const { value: fields } = useField<string[]>({ path: 'fields' })\n const { value: sort } = useField({ path: 'sort' })\n const { value: draft } = useField({ path: 'drafts' })\n const { value: locale } = useField({ path: 'locale' })\n const { value: format } = useField({ path: 'format' })\n const [dataToRender, setDataToRender] = React.useState<any[]>([])\n const [resultCount, setResultCount] = React.useState<any>('')\n const [columns, setColumns] = React.useState<Column[]>([])\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const collectionSlug = typeof collection === 'string' && collection\n const collectionConfig = config.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n\n const disabledFieldRegexes: RegExp[] = React.useMemo(() => {\n const disabledFieldPaths =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n return disabledFieldPaths.map(buildDisabledFieldRegex)\n }, [collectionConfig])\n\n const isCSV = format === 'csv'\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!collectionSlug || !collectionConfig) {\n return\n }\n\n try {\n const res = await fetch('/api/preview-data', {\n body: JSON.stringify({\n collectionSlug,\n draft,\n fields,\n format,\n limit,\n locale,\n page,\n sort,\n where,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n\n if (!res.ok) {\n return\n }\n\n const { docs, totalDocs }: { docs: Record<string, unknown>[]; totalDocs: number } =\n await res.json()\n\n setResultCount(limit && limit < totalDocs ? limit : totalDocs)\n\n const allKeys = Array.from(new Set(docs.flatMap((doc) => Object.keys(doc))))\n const defaultMetaFields = ['createdAt', 'updatedAt', '_status', 'id']\n\n // Match CSV column ordering by building keys based on fields and regex\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n return new RegExp(`^${parts.join('_')}`)\n }\n\n // Construct final list of field keys to match field order + meta order\n const selectedKeys =\n Array.isArray(fields) && fields.length > 0\n ? fields.flatMap((field) => {\n const regex = fieldToRegex(field)\n return allKeys.filter(\n (key) =>\n regex.test(key) &&\n !disabledFieldRegexes.some((disabledRegex) => disabledRegex.test(key)),\n )\n })\n : allKeys.filter(\n (key) =>\n !defaultMetaFields.includes(key) &&\n !disabledFieldRegexes.some((regex) => regex.test(key)),\n )\n\n const fieldKeys =\n Array.isArray(fields) && fields.length > 0\n ? selectedKeys // strictly use selected fields only\n : [\n ...selectedKeys,\n ...defaultMetaFields.filter(\n (key) => allKeys.includes(key) && !selectedKeys.includes(key),\n ),\n ]\n\n // Build columns based on flattened keys\n const newColumns: Column[] = fieldKeys.map((key) => ({\n accessor: key,\n active: true,\n field: { name: key } as ClientField,\n Heading: getTranslation(key, i18n),\n renderedCells: docs.map((doc: Record<string, unknown>) => {\n const val = doc[key]\n\n if (val === undefined || val === null) {\n return null\n }\n\n // Avoid ESLint warning by type-checking before calling String()\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\n return String(val)\n }\n\n if (Array.isArray(val)) {\n return val.map(String).join(', ')\n }\n\n return JSON.stringify(val)\n }),\n }))\n\n setColumns(newColumns)\n setDataToRender(docs)\n } catch (error) {\n console.error('Error fetching preview data:', error)\n }\n }\n\n void fetchData()\n }, [\n collectionConfig,\n collectionSlug,\n disabledFieldRegexes,\n draft,\n fields,\n format,\n i18n,\n limit,\n locale,\n page,\n sort,\n where,\n ])\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n <Translation i18nKey=\"version:preview\" t={t} />\n </h3>\n {resultCount && (\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:totalDocumentsCount\"\n t={t}\n variables={{\n count: resultCount,\n }}\n />\n )}\n </div>\n {dataToRender &&\n (isCSV ? (\n <Table columns={columns} data={dataToRender} />\n ) : (\n <CodeEditorLazy language=\"json\" readOnly value={JSON.stringify(dataToRender, null, 2)} />\n ))}\n </div>\n )\n}\n"],"names":["getTranslation","CodeEditorLazy","Table","Translation","useConfig","useField","useTranslation","React","buildDisabledFieldRegex","useImportExport","baseClass","Preview","collection","config","value","where","path","page","limit","fields","sort","draft","locale","format","dataToRender","setDataToRender","useState","resultCount","setResultCount","columns","setColumns","i18n","t","collectionSlug","collectionConfig","collections","find","slug","disabledFieldRegexes","useMemo","disabledFieldPaths","admin","custom","disabledFields","map","isCSV","useEffect","fetchData","res","fetch","body","JSON","stringify","credentials","headers","method","ok","docs","totalDocs","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","defaultMetaFields","fieldToRegex","field","parts","split","part","RegExp","join","selectedKeys","isArray","length","regex","filter","key","test","some","disabledRegex","includes","fieldKeys","newColumns","accessor","active","name","Heading","renderedCells","val","undefined","String","error","console","div","className","h3","i18nKey","variables","count","data","language","readOnly"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortBy/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortBy/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAezD,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,MAAM,EAAE,0BAsEpB,CAAA"}
|
|
@@ -4,6 +4,7 @@ import { FieldLabel, ReactSelect, useConfig, useDocumentInfo, useField, useListQ
|
|
|
4
4
|
import React, { useEffect, useState } from 'react';
|
|
5
5
|
import { reduceFields } from '../FieldsToExport/reduceFields.js';
|
|
6
6
|
import { useImportExport } from '../ImportExportProvider/index.js';
|
|
7
|
+
import './index.scss';
|
|
7
8
|
const baseClass = 'sort-by-fields';
|
|
8
9
|
export const SortBy = (props)=>{
|
|
9
10
|
const { id } = useDocumentInfo();
|
|
@@ -63,9 +64,6 @@ export const SortBy = (props)=>{
|
|
|
63
64
|
};
|
|
64
65
|
return /*#__PURE__*/ _jsxs("div", {
|
|
65
66
|
className: baseClass,
|
|
66
|
-
style: {
|
|
67
|
-
'--field-width': '33%'
|
|
68
|
-
},
|
|
69
67
|
children: [
|
|
70
68
|
/*#__PURE__*/ _jsx(FieldLabel, {
|
|
71
69
|
label: props.field.label,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/SortBy/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientComponent } from 'payload'\nimport type { ReactNode } from 'react'\n\nimport {\n FieldLabel,\n ReactSelect,\n useConfig,\n useDocumentInfo,\n useField,\n useListQuery,\n} from '@payloadcms/ui'\nimport React, { useEffect, useState } from 'react'\n\nimport { reduceFields } from '../FieldsToExport/reduceFields.js'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'sort-by-fields'\n\nexport const SortBy: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n const { setValue, value } = useField<string>()\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { query } = useListQuery()\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n\n const [displayedValue, setDisplayedValue] = useState<{\n id: string\n label: ReactNode\n value: string\n } | null>(null)\n\n const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection })\n const fieldOptions = reduceFields({ fields: collectionConfig?.fields })\n\n // Sync displayedValue with value from useField\n useEffect(() => {\n if (!value) {\n setDisplayedValue(null)\n return\n }\n\n const option = fieldOptions.find((field) => field.value === value)\n if (option && (!displayedValue || displayedValue.value !== value)) {\n setDisplayedValue(option)\n }\n }, [displayedValue, fieldOptions, value])\n\n useEffect(() => {\n if (id || !query?.sort || value) {\n return\n }\n\n const option = fieldOptions.find((field) => field.value === query.sort)\n if (option) {\n setValue(option.value)\n setDisplayedValue(option)\n }\n }, [fieldOptions, id, query?.sort, value, setValue])\n\n const onChange = (option: { id: string; label: ReactNode; value: string } | null) => {\n if (!option) {\n setValue('')\n setDisplayedValue(null)\n } else {\n setValue(option.value)\n setDisplayedValue(option)\n }\n }\n\n return (\n <div className={baseClass}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/SortBy/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientComponent } from 'payload'\nimport type { ReactNode } from 'react'\n\nimport {\n FieldLabel,\n ReactSelect,\n useConfig,\n useDocumentInfo,\n useField,\n useListQuery,\n} from '@payloadcms/ui'\nimport React, { useEffect, useState } from 'react'\n\nimport { reduceFields } from '../FieldsToExport/reduceFields.js'\nimport { useImportExport } from '../ImportExportProvider/index.js'\nimport './index.scss'\n\nconst baseClass = 'sort-by-fields'\n\nexport const SortBy: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n const { setValue, value } = useField<string>()\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { query } = useListQuery()\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n\n const [displayedValue, setDisplayedValue] = useState<{\n id: string\n label: ReactNode\n value: string\n } | null>(null)\n\n const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection })\n const fieldOptions = reduceFields({ fields: collectionConfig?.fields })\n\n // Sync displayedValue with value from useField\n useEffect(() => {\n if (!value) {\n setDisplayedValue(null)\n return\n }\n\n const option = fieldOptions.find((field) => field.value === value)\n if (option && (!displayedValue || displayedValue.value !== value)) {\n setDisplayedValue(option)\n }\n }, [displayedValue, fieldOptions, value])\n\n useEffect(() => {\n if (id || !query?.sort || value) {\n return\n }\n\n const option = fieldOptions.find((field) => field.value === query.sort)\n if (option) {\n setValue(option.value)\n setDisplayedValue(option)\n }\n }, [fieldOptions, id, query?.sort, value, setValue])\n\n const onChange = (option: { id: string; label: ReactNode; value: string } | null) => {\n if (!option) {\n setValue('')\n setDisplayedValue(null)\n } else {\n setValue(option.value)\n setDisplayedValue(option)\n }\n }\n\n return (\n <div className={baseClass}>\n <FieldLabel label={props.field.label} path={props.path} />\n <ReactSelect\n className={baseClass}\n disabled={props.readOnly}\n getOptionValue={(option) => String(option.value)}\n inputId={`field-${props.path.replace(/\\./g, '__')}`}\n isClearable={true}\n isSortable={true}\n // @ts-expect-error react select option\n onChange={onChange}\n options={fieldOptions}\n // @ts-expect-error react select\n value={displayedValue}\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useConfig","useDocumentInfo","useField","useListQuery","React","useEffect","useState","reduceFields","useImportExport","baseClass","SortBy","props","id","setValue","value","collectionSlug","path","query","getEntityConfig","collection","displayedValue","setDisplayedValue","collectionConfig","fieldOptions","fields","option","find","field","sort","onChange","div","className","label","disabled","readOnly","getOptionValue","String","inputId","replace","isClearable","isSortable","options"],"mappings":"AAAA;;AAKA,SACEA,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,QAAQ,EACRC,YAAY,QACP,iBAAgB;AACvB,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,SAASC,YAAY,QAAQ,oCAAmC;AAChE,SAASC,eAAe,QAAQ,mCAAkC;AAClE,OAAO,eAAc;AAErB,MAAMC,YAAY;AAElB,OAAO,MAAMC,SAAqC,CAACC;IACjD,MAAM,EAAEC,EAAE,EAAE,GAAGX;IACf,MAAM,EAAEY,QAAQ,EAAEC,KAAK,EAAE,GAAGZ;IAC5B,MAAM,EAAEY,OAAOC,cAAc,EAAE,GAAGb,SAAiB;QAAEc,MAAM;IAAiB;IAC5E,MAAM,EAAEC,KAAK,EAAE,GAAGd;IAClB,MAAM,EAAEe,eAAe,EAAE,GAAGlB;IAC5B,MAAM,EAAEmB,UAAU,EAAE,GAAGX;IAEvB,MAAM,CAACY,gBAAgBC,kBAAkB,GAAGf,SAIlC;IAEV,MAAMgB,mBAAmBJ,gBAAgB;QAAEH,gBAAgBA,kBAAkBI;IAAW;IACxF,MAAMI,eAAehB,aAAa;QAAEiB,QAAQF,kBAAkBE;IAAO;IAErE,+CAA+C;IAC/CnB,UAAU;QACR,IAAI,CAACS,OAAO;YACVO,kBAAkB;YAClB;QACF;QAEA,MAAMI,SAASF,aAAaG,IAAI,CAAC,CAACC,QAAUA,MAAMb,KAAK,KAAKA;QAC5D,IAAIW,UAAW,CAAA,CAACL,kBAAkBA,eAAeN,KAAK,KAAKA,KAAI,GAAI;YACjEO,kBAAkBI;QACpB;IACF,GAAG;QAACL;QAAgBG;QAAcT;KAAM;IAExCT,UAAU;QACR,IAAIO,MAAM,CAACK,OAAOW,QAAQd,OAAO;YAC/B;QACF;QAEA,MAAMW,SAASF,aAAaG,IAAI,CAAC,CAACC,QAAUA,MAAMb,KAAK,KAAKG,MAAMW,IAAI;QACtE,IAAIH,QAAQ;YACVZ,SAASY,OAAOX,KAAK;YACrBO,kBAAkBI;QACpB;IACF,GAAG;QAACF;QAAcX;QAAIK,OAAOW;QAAMd;QAAOD;KAAS;IAEnD,MAAMgB,WAAW,CAACJ;QAChB,IAAI,CAACA,QAAQ;YACXZ,SAAS;YACTQ,kBAAkB;QACpB,OAAO;YACLR,SAASY,OAAOX,KAAK;YACrBO,kBAAkBI;QACpB;IACF;IAEA,qBACE,MAACK;QAAIC,WAAWtB;;0BACd,KAACX;gBAAWkC,OAAOrB,MAAMgB,KAAK,CAACK,KAAK;gBAAEhB,MAAML,MAAMK,IAAI;;0BACtD,KAACjB;gBACCgC,WAAWtB;gBACXwB,UAAUtB,MAAMuB,QAAQ;gBACxBC,gBAAgB,CAACV,SAAWW,OAAOX,OAAOX,KAAK;gBAC/CuB,SAAS,CAAC,MAAM,EAAE1B,MAAMK,IAAI,CAACsB,OAAO,CAAC,OAAO,OAAO;gBACnDC,aAAa;gBACbC,YAAY;gBACZ,uCAAuC;gBACvCX,UAAUA;gBACVY,SAASlB;gBACT,gCAAgC;gBAChCT,OAAOM;;;;AAIf,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAarE,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,YAAY,SAAgB,gBAAgB,kCAyYxD,CAAA"}
|
|
@@ -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"}
|